From f41dd22bae1ece71efef34a2b0d7eae1c70a866f Mon Sep 17 00:00:00 2001 From: Sheng Chen Date: Fri, 29 Jan 2021 09:37:17 +0800 Subject: [PATCH 001/352] fix: Cannot list multi-module projects properly (#450) --- jdtls.ext/com.microsoft.jdtls.ext.core/.classpath | 2 +- .../src/com/microsoft/jdtls/ext/core/PackageCommand.java | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/jdtls.ext/com.microsoft.jdtls.ext.core/.classpath b/jdtls.ext/com.microsoft.jdtls.ext.core/.classpath index c664027f..67efab8e 100644 --- a/jdtls.ext/com.microsoft.jdtls.ext.core/.classpath +++ b/jdtls.ext/com.microsoft.jdtls.ext.core/.classpath @@ -1,6 +1,6 @@ - + diff --git a/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/PackageCommand.java b/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/PackageCommand.java index 1e5be9f1..b5de200d 100644 --- a/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/PackageCommand.java +++ b/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/PackageCommand.java @@ -610,7 +610,8 @@ public static IJavaProject getJavaProject(String projectUri) { } // For multi-module scenario, findContainersForLocationURI API may return a container array, - // need put the result from the nearest project in front. + // need filter out non-Java project and put the result from the nearest project in front. + containers = Arrays.stream(containers).filter(c -> ProjectUtils.isJavaProject(c.getProject())).toArray(IContainer[]::new); Arrays.sort(containers, (Comparator) (IContainer a, IContainer b) -> { return a.getFullPath().toPortableString().length() - b.getFullPath().toPortableString().length(); }); From 2f49ab947972083b10116edd0345cc60b0da6715 Mon Sep 17 00:00:00 2001 From: Sheng Chen Date: Mon, 1 Feb 2021 12:52:06 +0800 Subject: [PATCH 002/352] chore: Add configuration file for No Response bot (#451) --- .github/no-response.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 .github/no-response.yml diff --git a/.github/no-response.yml b/.github/no-response.yml new file mode 100644 index 00000000..14bbe279 --- /dev/null +++ b/.github/no-response.yml @@ -0,0 +1,4 @@ +daysUntilClose: 14 +responseRequiredLabel: need more info +closeComment: > + This issue has been closed automatically because it needs more information and has not had recent activity. Please reach out if you have or find the answers we need so that we can investigate further. From 30fc493a637036930f42f60534d7a96bc6f4f31a Mon Sep 17 00:00:00 2001 From: Sheng Chen Date: Fri, 5 Feb 2021 13:05:21 +0800 Subject: [PATCH 003/352] chore: Adopt GitHub Actions for CI (#454) --- .github/workflows/build.yml | 150 ++++++++++++++++++++++++++++++++++++ .travis.yml | 41 ---------- .vscodeignore | 1 + 3 files changed, 151 insertions(+), 41 deletions(-) create mode 100644 .github/workflows/build.yml delete mode 100644 .travis.yml diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml new file mode 100644 index 00000000..f0907b41 --- /dev/null +++ b/.github/workflows/build.yml @@ -0,0 +1,150 @@ +name: CI + +on: + push: + branches: [ master ] + pull_request: + branches: [ master ] + +jobs: + linux: + name: Linux + runs-on: ubuntu-latest + timeout-minutes: 30 + steps: + - uses: actions/checkout@v2 + + - name: Setup Build Environment + run: | + sudo apt-get update + sudo apt-get install -y libxkbfile-dev pkg-config libsecret-1-dev libxss1 dbus xvfb libgtk-3-0 libgbm1 + sudo /usr/bin/Xvfb :99 -screen 0 1024x768x24 > /dev/null 2>&1 & + sleep 3 + + - name: Set up JDK 11 + uses: actions/setup-java@v1 + with: + java-version: '11' + + - name: Setup Node.js environment + uses: actions/setup-node@v2 + with: + node-version: 12 + + - name: Install Node.js modules + run: npm install + + - name: Install Gulp + run: npm install -g gulp + + - name: Install VSCE + run: npm install -g vsce + + - name: Lint + run: gulp tslint + + - name: Checkstyle + run: gulp checkstyle + + - name: Build OSGi bundle + run: npm run build-server + + - name: Build VSIX file + run: vsce package + + - name: Test extension + run: DISPLAY=:99 npm test + + - name: Print language server Log if job failed + if: ${{ failure() }} + run: find $HOME/.config/Code/User/workspaceStorage/*/redhat.java/jdt_ws/.metadata/.log -print -exec cat '{}' \;; + + windows: + name: Windows + runs-on: windows-latest + timeout-minutes: 30 + steps: + - uses: actions/checkout@v2 + + - name: Set up JDK 11 + uses: actions/setup-java@v1 + with: + java-version: '11' + + - name: Setup Node.js environment + uses: actions/setup-node@v2 + with: + node-version: 12 + + - name: Install Node.js modules + run: npm install + + - name: Install Gulp + run: npm install -g gulp --force + + - name: Install VSCE + run: npm install -g vsce + + - name: Lint + run: gulp tslint + + - name: Checkstyle + run: gulp checkstyle + + - name: Build OSGi bundle + run: npm run build-server + + - name: Build VSIX file + run: vsce package + + - name: Test extension + run: npm test + + - name: Print language server Log if job failed + if: ${{ failure() }} + run: Get-ChildItem -Path $env:APPDATA/Code/User/workspaceStorage/*/redhat.java/jdt_ws/.metadata/.log | cat + + darwin: + name: macOS + runs-on: macos-latest + timeout-minutes: 30 + steps: + - uses: actions/checkout@v2 + + - name: Set up JDK 11 + uses: actions/setup-java@v1 + with: + java-version: '11' + + - name: Setup Node.js environment + uses: actions/setup-node@v2 + with: + node-version: 12 + + - name: Install Node.js modules + run: npm install + + - name: Install Gulp + run: npm install -g gulp + + - name: Install VSCE + run: npm install -g vsce + + - name: Lint + run: gulp tslint + + - name: Checkstyle + run: gulp checkstyle + + - name: Build OSGi bundle + run: npm run build-server + + - name: Build VSIX file + run: vsce package + + - name: Test extension + run: npm test + + - name: Print language server Log if job failed + if: ${{ failure() }} + run: find $HOME/Library/Application\ Support/Code/User/workspaceStorage/*/redhat.java/jdt_ws/.metadata/.log -print -exec cat '{}' \;; \ No newline at end of file diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index 754ecc3f..00000000 --- a/.travis.yml +++ /dev/null @@ -1,41 +0,0 @@ -language: java - -matrix: - include: - - os: linux - dist: trusty - jdk: openjdk11 - env: - - JDK_HOME=~/openjdk11 # force launching JLS using JDK11 - - os: osx - osx_image: xcode10.1 - jdk: oraclejdk11 - -addons: - apt: - packages: - - libsecret-1-dev - -before_install: - - | - if [ $TRAVIS_OS_NAME == "linux" ]; then - export CXX="g++-4.9" CC="gcc-4.9" - export DISPLAY=':99.0' - /usr/bin/Xvfb :99 -screen 0 1024x768x24 > /dev/null 2>&1 & - sleep 3 - fi - - nvm install 12 - - nvm use 12 - -install: -- npm install -g vsce -- npm install -g typescript -- npm install -g gulp -- npm install - -script: -- gulp tslint -- gulp checkstyle -- gulp build_server -- vsce package -- npm test diff --git a/.vscodeignore b/.vscodeignore index 18599adb..7887b29a 100644 --- a/.vscodeignore +++ b/.vscodeignore @@ -16,6 +16,7 @@ node_modules scripts extension.bundle.ts javaConfig.json +.github/** # Ignore output of code sign server/*.md From dd40a305632cc56e896afce167182c0e5e3dd181 Mon Sep 17 00:00:00 2001 From: Sheng Chen Date: Fri, 5 Feb 2021 14:11:23 +0800 Subject: [PATCH 004/352] feat: Adopt resourceUri API to the Java Project explorer (#453) --- package-lock.json | 28 ++++++++++++++-------------- package.json | 4 ++-- src/views/dataNode.ts | 14 +++++++++++++- 3 files changed, 29 insertions(+), 17 deletions(-) diff --git a/package-lock.json b/package-lock.json index d6b8f689..162125fb 100644 --- a/package-lock.json +++ b/package-lock.json @@ -176,9 +176,9 @@ "dev": true }, "@types/vscode": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.52.0.tgz", - "integrity": "sha512-Kt3bvWzAvvF/WH9YEcrCICDp0Z7aHhJGhLJ1BxeyNP6yRjonWqWnAIh35/pXAjswAnWOABrYlF7SwXR9+1nnLA==", + "version": "1.53.0", + "resolved": "https://devdiv.pkgs.visualstudio.com/_packaging/CloudKernel/npm/registry/@types/vscode/-/vscode-1.53.0.tgz", + "integrity": "sha1-R7U3F69lYvKtBRcbychQCCSjkFw=", "dev": true }, "@ungap/promise-all-settled": { @@ -425,7 +425,7 @@ }, "ansi-colors": { "version": "1.1.0", - "resolved": "http://registry.npmjs.org/ansi-colors/-/ansi-colors-1.1.0.tgz", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-1.1.0.tgz", "integrity": "sha512-SFKX67auSNoVR38N3L+nvsPjOE0bybKTYbkf5tRvushrAPQ9V75huw0ZxBkKVeRU9kqH3d6HA4xTckbwZ4ixmA==", "dev": true, "requires": { @@ -796,7 +796,7 @@ }, "util": { "version": "0.10.3", - "resolved": "http://registry.npmjs.org/util/-/util-0.10.3.tgz", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", "dev": true, "requires": { @@ -1017,7 +1017,7 @@ }, "browserify-aes": { "version": "1.2.0", - "resolved": "http://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", + "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", "dev": true, "requires": { @@ -1640,7 +1640,7 @@ }, "create-hash": { "version": "1.2.0", - "resolved": "http://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", + "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", "dev": true, "requires": { @@ -1653,7 +1653,7 @@ }, "create-hmac": { "version": "1.1.7", - "resolved": "http://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", + "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", "dev": true, "requires": { @@ -1844,7 +1844,7 @@ }, "diffie-hellman": { "version": "5.0.3", - "resolved": "http://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", + "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", "dev": true, "requires": { @@ -3481,7 +3481,7 @@ }, "load-json-file": { "version": "1.1.0", - "resolved": "http://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", "dev": true, "requires": { @@ -4538,7 +4538,7 @@ }, "os-locale": { "version": "1.4.0", - "resolved": "http://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", "dev": true, "requires": { @@ -5396,7 +5396,7 @@ }, "sha.js": { "version": "2.4.11", - "resolved": "http://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", "dev": true, "requires": { @@ -6441,7 +6441,7 @@ }, "tty-browserify": { "version": "0.0.0", - "resolved": "http://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", + "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=", "dev": true }, @@ -7406,7 +7406,7 @@ }, "wrap-ansi": { "version": "2.1.0", - "resolved": "http://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", "dev": true, "requires": { diff --git a/package.json b/package.json index 9cd7daba..c56c695e 100644 --- a/package.json +++ b/package.json @@ -12,7 +12,7 @@ "explorer" ], "engines": { - "vscode": "^1.52.0" + "vscode": "^1.53.0" }, "repository": { "type": "git", @@ -582,7 +582,7 @@ "@types/minimatch": "^3.0.3", "@types/mocha": "^8.0.4", "@types/node": "^8.10.66", - "@types/vscode": "1.52.0", + "@types/vscode": "1.53.0", "copy-webpack-plugin": "^6.3.2", "glob": "^7.1.6", "gulp": "^4.0.2", diff --git a/src/views/dataNode.ts b/src/views/dataNode.ts index 36bd7f89..54dbd5ef 100644 --- a/src/views/dataNode.ts +++ b/src/views/dataNode.ts @@ -3,7 +3,7 @@ import * as _ from "lodash"; import { ThemeIcon, TreeItem, TreeItemCollapsibleState, Uri } from "vscode"; -import { INodeData } from "../java/nodeData"; +import { INodeData, NodeKind } from "../java/nodeData"; import { Lock } from "../utils/Lock"; import { ExplorerNode } from "./explorerNode"; @@ -26,6 +26,18 @@ export abstract class DataNode extends ExplorerNode { item.iconPath = this.iconPath; item.command = this.command; item.contextValue = this.computeContextValue(); + if (this.uri) { + switch (this._nodeData.kind) { + case NodeKind.PackageRoot: + case NodeKind.Package: + case NodeKind.PrimaryType: + case NodeKind.Folder: + case NodeKind.File: + item.resourceUri = Uri.parse(this.uri); + break; + } + } + return item; } From 8dbf3b83f560c6c2fdd24cb33a3236f1aaab763a Mon Sep 17 00:00:00 2001 From: Sheng Chen Date: Sun, 7 Feb 2021 09:27:34 +0800 Subject: [PATCH 005/352] chore: Prepare for 0.18.0 (#456) --- CHANGELOG.md | 7 +++++++ README.md | 2 +- .../com.microsoft.jdtls.ext.activator/META-INF/MANIFEST.MF | 2 +- jdtls.ext/com.microsoft.jdtls.ext.activator/pom.xml | 2 +- .../com.microsoft.jdtls.ext.core/META-INF/MANIFEST.MF | 2 +- jdtls.ext/com.microsoft.jdtls.ext.core/pom.xml | 2 +- jdtls.ext/pom.xml | 2 +- package-lock.json | 2 +- package.json | 4 ++-- 9 files changed, 16 insertions(+), 9 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f944003b..503e41ce 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,13 @@ All notable changes to the "vscode-java-dependency" extension will be documented The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/) and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html). +## 0.18.0 +### Added +- Adopt the resource URI API to the Java Project explorer. [PR#453](https://github.com/microsoft/vscode-java-dependency/pull/453) + +### Fixed +- [Bugs fixed](https://github.com/microsoft/vscode-java-dependency/issues?q=is%3Aissue+label%3Abug+milestone%3A0.18.0+is%3Aclosed) + ## 0.17.0 ### Added - Add contextual title and icon for `Java Project` explorer. [#396](https://github.com/microsoft/vscode-java-dependency/issues/396) diff --git a/README.md b/README.md index 0e60a38e..ca9c4219 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ > Manage Java projects in Visual Studio Code -[![Travis CI](https://travis-ci.org/Microsoft/vscode-java-dependency.svg?branch=master)](https://travis-ci.org/Microsoft/vscode-java-dependency) +[![GitHub Actions](https://img.shields.io/github/workflow/status/microsoft/vscode-java-dependency/CI/master?style=flat-square)](https://github.com/microsoft/vscode-java-dependency/actions?query=workflow%3ACI+branch%3Amaster) ## Overview diff --git a/jdtls.ext/com.microsoft.jdtls.ext.activator/META-INF/MANIFEST.MF b/jdtls.ext/com.microsoft.jdtls.ext.activator/META-INF/MANIFEST.MF index 7c687f60..2e1d873f 100644 --- a/jdtls.ext/com.microsoft.jdtls.ext.activator/META-INF/MANIFEST.MF +++ b/jdtls.ext/com.microsoft.jdtls.ext.activator/META-INF/MANIFEST.MF @@ -2,7 +2,7 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: JDTLS EXT Activator Bundle-SymbolicName: com.microsoft.jdtls.ext.activator;singleton:=true -Bundle-Version: 0.17.0 +Bundle-Version: 0.18.0 Bundle-Activator: com.microsoft.jdtls.ext.activator.JdtlsExtActivator Bundle-RequiredExecutionEnvironment: JavaSE-1.8 Import-Package: org.eclipse.jdt.core, diff --git a/jdtls.ext/com.microsoft.jdtls.ext.activator/pom.xml b/jdtls.ext/com.microsoft.jdtls.ext.activator/pom.xml index fd23b09e..2ebfaf9d 100644 --- a/jdtls.ext/com.microsoft.jdtls.ext.activator/pom.xml +++ b/jdtls.ext/com.microsoft.jdtls.ext.activator/pom.xml @@ -5,7 +5,7 @@ com.microsoft.jdtls.ext jdtls-ext-parent - 0.17.0 + 0.18.0 com.microsoft.jdtls.ext.activator eclipse-plugin diff --git a/jdtls.ext/com.microsoft.jdtls.ext.core/META-INF/MANIFEST.MF b/jdtls.ext/com.microsoft.jdtls.ext.core/META-INF/MANIFEST.MF index 611f1849..0f4e2e85 100644 --- a/jdtls.ext/com.microsoft.jdtls.ext.core/META-INF/MANIFEST.MF +++ b/jdtls.ext/com.microsoft.jdtls.ext.core/META-INF/MANIFEST.MF @@ -2,7 +2,7 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: JDTLS EXT Core Bundle-SymbolicName: com.microsoft.jdtls.ext.core;singleton:=true -Bundle-Version: 0.17.0 +Bundle-Version: 0.18.0 Bundle-Activator: com.microsoft.jdtls.ext.core.JdtlsExtActivator Bundle-RequiredExecutionEnvironment: JavaSE-1.8 Bundle-ActivationPolicy: lazy diff --git a/jdtls.ext/com.microsoft.jdtls.ext.core/pom.xml b/jdtls.ext/com.microsoft.jdtls.ext.core/pom.xml index add92078..9884e183 100644 --- a/jdtls.ext/com.microsoft.jdtls.ext.core/pom.xml +++ b/jdtls.ext/com.microsoft.jdtls.ext.core/pom.xml @@ -5,7 +5,7 @@ com.microsoft.jdtls.ext jdtls-ext-parent - 0.17.0 + 0.18.0 com.microsoft.jdtls.ext.core eclipse-plugin diff --git a/jdtls.ext/pom.xml b/jdtls.ext/pom.xml index 56899bfc..17939e9a 100644 --- a/jdtls.ext/pom.xml +++ b/jdtls.ext/pom.xml @@ -4,7 +4,7 @@ com.microsoft.jdtls.ext jdtls-ext-parent ${base.name} :: Parent - 0.17.0 + 0.18.0 pom Java Project Manager diff --git a/package-lock.json b/package-lock.json index 162125fb..3a079424 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "vscode-java-dependency", - "version": "0.17.0", + "version": "0.18.0", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index c56c695e..8753484f 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "vscode-java-dependency", "displayName": "Project Manager for Java", "description": "%description%", - "version": "0.17.0", + "version": "0.18.0", "publisher": "vscjava", "preview": true, "aiKey": "5c642b22-e845-4400-badb-3f8509a70777", @@ -31,7 +31,7 @@ "main": "./main.js", "contributes": { "javaExtensions": [ - "./server/com.microsoft.jdtls.ext.core-0.17.0.jar" + "./server/com.microsoft.jdtls.ext.core-0.18.0.jar" ], "commands": [ { From 54911c34dd08ca258bfa6e72f2563dd01293b315 Mon Sep 17 00:00:00 2001 From: Sheng Chen Date: Tue, 9 Feb 2021 09:31:55 +0800 Subject: [PATCH 006/352] fix: Cannot reveal the explorer when 'java.dependency.syncWithFolderExplorer' is off (#460) --- src/utility.ts | 3 +-- src/views/dependencyExplorer.ts | 9 +++++++-- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/src/utility.ts b/src/utility.ts index 6d0b5df5..e3202ab3 100644 --- a/src/utility.ts +++ b/src/utility.ts @@ -5,7 +5,6 @@ import { Uri, window, workspace, WorkspaceFolder } from "vscode"; import { setUserError } from "vscode-extension-telemetry-wrapper"; import { INodeData } from "./java/nodeData"; import { languageServerApiManager } from "./languageServerApi/languageServerApiManager"; -import { Settings } from "./settings"; export class Utility { @@ -31,7 +30,7 @@ export class Utility { if (uri.scheme === "file" && !workspace.getWorkspaceFolder(uri)) { return false; } - if (!Settings.syncWithFolderExplorer() || !await languageServerApiManager.isStandardServerReady()) { + if (!await languageServerApiManager.isStandardServerReady()) { return false; } return true; diff --git a/src/views/dependencyExplorer.ts b/src/views/dependencyExplorer.ts index c88cf6b2..0c160dfc 100644 --- a/src/views/dependencyExplorer.ts +++ b/src/views/dependencyExplorer.ts @@ -14,6 +14,7 @@ import { renameFile } from "../explorerCommands/rename"; import { getCmdNode } from "../explorerCommands/utility"; import { Jdtls } from "../java/jdtls"; import { INodeData } from "../java/nodeData"; +import { Settings } from "../settings"; import { EventCounter, Utility } from "../utility"; import { Lock } from "../utils/Lock"; import { DataNode } from "./dataNode"; @@ -76,7 +77,7 @@ export class DependencyExplorer implements Disposable { await commands.executeCommand(Commands.VSCODE_OPEN, uri, { preserveFocus: true }); } - this.reveal(uri); + this.reveal(uri, false /*force to reveal even the sync setting is turned off*/); }), ); @@ -128,10 +129,14 @@ export class DependencyExplorer implements Disposable { } } - public async reveal(uri: Uri): Promise { + public async reveal(uri: Uri, needCheckSyncSetting: boolean = true): Promise { try { await this._lock.acquire(); + if (needCheckSyncSetting && !Settings.syncWithFolderExplorer()) { + return; + } + if (!await Utility.isRevealable(uri)) { return; } From f780af865eb2dce9d60adb60626b4e1f7c3ffd74 Mon Sep 17 00:00:00 2001 From: Sheng Chen Date: Fri, 26 Feb 2021 08:45:28 +0800 Subject: [PATCH 007/352] fix: Show welcome view when no Java projects in workspace (#461) --- package.json | 13 +++++++++---- package.nls.json | 3 ++- package.nls.zh.json | 1 + src/constants.ts | 1 + src/views/dependencyDataProvider.ts | 8 ++++---- 5 files changed, 17 insertions(+), 9 deletions(-) diff --git a/package.json b/package.json index 8753484f..0c059b56 100644 --- a/package.json +++ b/package.json @@ -369,12 +369,12 @@ }, { "command": "java.view.package.exportJar", - "when": "view == javaProjectExplorer && java:serverMode == Standard && workspaceFolderCount != 0", + "when": "view == javaProjectExplorer && java:serverMode == Standard && !java:noJavaProjects", "group": "navigation@20" }, { "command": "java.view.package.refresh", - "when": "view == javaProjectExplorer && java:serverMode == Standard", + "when": "view == javaProjectExplorer && java:serverMode == Standard && !java:noJavaProjects", "group": "navigation@30" }, { @@ -399,12 +399,12 @@ }, { "command": "java.project.build.workspace", - "when": "view == javaProjectExplorer && java:serverMode == Standard && workspaceFolderCount != 0", + "when": "view == javaProjectExplorer && java:serverMode == Standard && !java:noJavaProjects", "group": "overflow_20@10" }, { "command": "java.project.clean.workspace", - "when": "view == javaProjectExplorer && java:serverMode == Standard && workspaceFolderCount != 0", + "when": "view == javaProjectExplorer && java:serverMode == Standard && !java:noJavaProjects", "group": "overflow_20@20" } ], @@ -519,6 +519,11 @@ "contents": "%viewsWelcome.workbench.createNewJavaProject%", "when": "workspaceFolderCount == 0" }, + { + "view": "javaProjectExplorer", + "contents": "%viewsWelcome.workbench.noJavaProject%", + "when": "java:noJavaProjects" + }, { "view": "javaProjectExplorer", "contents": "%viewsWelcome.workbench.inLightWeightMode%", diff --git a/package.nls.json b/package.nls.json index 55a540c9..44fe7bfe 100644 --- a/package.nls.json +++ b/package.nls.json @@ -37,6 +37,7 @@ "taskDefinitions.java.project.exportJar.testCompileOutput": "The folders containing output class files in the test scope.", "taskDefinitions.java.project.exportJar.dependencies": "The artifact dependencies in the runtime scope.", "taskDefinitions.java.project.exportJar.testDependencies": "The artifact dependencies in the test scope.", - "viewsWelcome.workbench.createNewJavaProject": "You can also [open a Java project](command:_java.project.open), or create a new Java project by clicking the below button.\n[Create Java Project](command:java.project.create)", + "viewsWelcome.workbench.createNewJavaProject": "You can also [open a Java project](command:_java.project.open), or create a new Java project by clicking the button below.\n[Create Java Project](command:java.project.create)", + "viewsWelcome.workbench.noJavaProject": "No Java projects found in the current workspace. You can [open a Java project](command:_java.project.open), or create a new Java project by clicking the button below.\n[Create Java Project](command:java.project.create)", "viewsWelcome.workbench.inLightWeightMode": "No projects are listed because the Java Language Server is currently running in [LightWeight Mode](https://aka.ms/vscode-java-lightweight). To show projects, click on the button to switch to Standard Mode.\n[Switch to Standard Mode](command:java.server.mode.switch?%5B%22Standard%22,true%5D)" } diff --git a/package.nls.zh.json b/package.nls.zh.json index ef65f631..3314e85b 100644 --- a/package.nls.zh.json +++ b/package.nls.zh.json @@ -38,5 +38,6 @@ "taskDefinitions.java.project.exportJar.dependencies": "在 runtime scope 内的依赖。", "taskDefinitions.java.project.exportJar.testDependencies": "在 test scope 内的依赖。", "viewsWelcome.workbench.createNewJavaProject": "您也可以[打开一个 Java 项目](command:_java.project.open),或点击下方按钮创建一个新的 Java 项目。\n[创建 Java 项目](command:java.project.create)", + "viewsWelcome.workbench.noJavaProject": "当前工作空间未发现 Java 项目,您可以[打开一个 Java 项目](command:_java.project.open),或点击下方按钮创建一个新的 Java 项目。\n[创建 Java 项目](command:java.project.create)", "viewsWelcome.workbench.inLightWeightMode": "由于 Java 语言服务正运行在 [LightWeight 模式](https://aka.ms/vscode-java-lightweight)下,因此项目将不会展示在该视图中。如果您需要展示项目信息,可以点击下方按钮将 Java 语言服务切换至 Standard 模式。\n[切换至 Standard 模式](command:java.server.mode.switch?%5B%22Standard%22,true%5D)" } diff --git a/src/constants.ts b/src/constants.ts index 0cd11895..2670b591 100644 --- a/src/constants.ts +++ b/src/constants.ts @@ -4,6 +4,7 @@ export namespace Context { export const EXTENSION_ACTIVATED: string = "java:projectManagerActivated"; export const SUPPORTED_BUILD_FILES: string = "java:supportedBuildFiles"; + export const NO_JAVA_PEOJECT: string = "java:noJavaProjects"; } export namespace Explorer { diff --git a/src/views/dependencyDataProvider.ts b/src/views/dependencyDataProvider.ts index 2e482fa3..e28f39c2 100644 --- a/src/views/dependencyDataProvider.ts +++ b/src/views/dependencyDataProvider.ts @@ -7,7 +7,9 @@ import { RelativePattern, TreeDataProvider, TreeItem, Uri, window, workspace, } from "vscode"; import { instrumentOperation, instrumentOperationAsVsCodeCommand } from "vscode-extension-telemetry-wrapper"; +import { contextManager } from "../../extension.bundle"; import { Commands } from "../commands"; +import { Context } from "../constants"; import { newJavaClass, newPackage } from "../explorerCommands/new"; import { executeExportJarTask } from "../exportJarSteps/ExportJarTaskProvider"; import { Jdtls } from "../java/jdtls"; @@ -168,18 +170,16 @@ export class DependencyDataProvider implements TreeDataProvider { kind: NodeKind.Workspace, }, undefined))); this._rootItems = rootItems; - return rootItems; } else { const result: INodeData[] = await Jdtls.getProjects(folders[0].uri.toString()); result.forEach((project) => { rootItems.push(new ProjectNode(project, undefined)); }); this._rootItems = rootItems; - return rootItems; } - } else { - throw new Error("No workspace folder found, please open a folder into the workspace first."); } + contextManager.setContextValue(Context.NO_JAVA_PEOJECT, _.isEmpty(rootItems)); + return rootItems; } finally { this._lock.release(); } From 671c65c10cac793a8cec2b033fe8bf463d5396d8 Mon Sep 17 00:00:00 2001 From: Shi Chen Date: Mon, 1 Mar 2021 13:47:30 +0800 Subject: [PATCH 008/352] chore: Apply new logo (#462) --- logo.png | Bin 29471 -> 3011 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/logo.png b/logo.png index d9d99443ca99b100efb51ab4ce8391efbf7bf51d..aa737b3a65b21a21a86f2bb1734bf293121af438 100644 GIT binary patch literal 3011 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 FV1mA8qv!wt literal 29471 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 N=TEg&%am;+{|D0!Sn2=( From 23c89a92f116c22c5632e503d9f6a10e8d30dd3b Mon Sep 17 00:00:00 2001 From: Sheng Chen Date: Mon, 1 Mar 2021 14:54:10 +0800 Subject: [PATCH 009/352] chore: Prepare for 0.18.1 (#463) --- CHANGELOG.md | 10 ++++++++++ .../META-INF/MANIFEST.MF | 2 +- jdtls.ext/com.microsoft.jdtls.ext.activator/pom.xml | 2 +- .../com.microsoft.jdtls.ext.core/META-INF/MANIFEST.MF | 2 +- jdtls.ext/com.microsoft.jdtls.ext.core/pom.xml | 2 +- jdtls.ext/pom.xml | 2 +- package-lock.json | 2 +- package.json | 4 ++-- 8 files changed, 18 insertions(+), 8 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 503e41ce..99070c0e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,16 @@ All notable changes to the "vscode-java-dependency" extension will be documented The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/) and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html). +### 0.18.1 +### Added +- Add welcome view in Java Proejct explorer when there is no Java projects in the workspace. [PR#461](https://github.com/microsoft/vscode-java-dependency/pull/461) + +### Changed +- Apply the new extension icon. [PR#462](https://github.com/microsoft/vscode-java-dependency/pull/462) + +### Fixed +- [Bugs fixed](https://github.com/microsoft/vscode-java-dependency/issues?q=is%3Aissue+label%3Abug+milestone%3A0.18.1+is%3Aclosed) + ## 0.18.0 ### Added - Adopt the resource URI API to the Java Project explorer. [PR#453](https://github.com/microsoft/vscode-java-dependency/pull/453) diff --git a/jdtls.ext/com.microsoft.jdtls.ext.activator/META-INF/MANIFEST.MF b/jdtls.ext/com.microsoft.jdtls.ext.activator/META-INF/MANIFEST.MF index 2e1d873f..b5646099 100644 --- a/jdtls.ext/com.microsoft.jdtls.ext.activator/META-INF/MANIFEST.MF +++ b/jdtls.ext/com.microsoft.jdtls.ext.activator/META-INF/MANIFEST.MF @@ -2,7 +2,7 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: JDTLS EXT Activator Bundle-SymbolicName: com.microsoft.jdtls.ext.activator;singleton:=true -Bundle-Version: 0.18.0 +Bundle-Version: 0.18.1 Bundle-Activator: com.microsoft.jdtls.ext.activator.JdtlsExtActivator Bundle-RequiredExecutionEnvironment: JavaSE-1.8 Import-Package: org.eclipse.jdt.core, diff --git a/jdtls.ext/com.microsoft.jdtls.ext.activator/pom.xml b/jdtls.ext/com.microsoft.jdtls.ext.activator/pom.xml index 2ebfaf9d..9486e0e8 100644 --- a/jdtls.ext/com.microsoft.jdtls.ext.activator/pom.xml +++ b/jdtls.ext/com.microsoft.jdtls.ext.activator/pom.xml @@ -5,7 +5,7 @@ com.microsoft.jdtls.ext jdtls-ext-parent - 0.18.0 + 0.18.1 com.microsoft.jdtls.ext.activator eclipse-plugin diff --git a/jdtls.ext/com.microsoft.jdtls.ext.core/META-INF/MANIFEST.MF b/jdtls.ext/com.microsoft.jdtls.ext.core/META-INF/MANIFEST.MF index 0f4e2e85..bd23e641 100644 --- a/jdtls.ext/com.microsoft.jdtls.ext.core/META-INF/MANIFEST.MF +++ b/jdtls.ext/com.microsoft.jdtls.ext.core/META-INF/MANIFEST.MF @@ -2,7 +2,7 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: JDTLS EXT Core Bundle-SymbolicName: com.microsoft.jdtls.ext.core;singleton:=true -Bundle-Version: 0.18.0 +Bundle-Version: 0.18.1 Bundle-Activator: com.microsoft.jdtls.ext.core.JdtlsExtActivator Bundle-RequiredExecutionEnvironment: JavaSE-1.8 Bundle-ActivationPolicy: lazy diff --git a/jdtls.ext/com.microsoft.jdtls.ext.core/pom.xml b/jdtls.ext/com.microsoft.jdtls.ext.core/pom.xml index 9884e183..ab5479df 100644 --- a/jdtls.ext/com.microsoft.jdtls.ext.core/pom.xml +++ b/jdtls.ext/com.microsoft.jdtls.ext.core/pom.xml @@ -5,7 +5,7 @@ com.microsoft.jdtls.ext jdtls-ext-parent - 0.18.0 + 0.18.1 com.microsoft.jdtls.ext.core eclipse-plugin diff --git a/jdtls.ext/pom.xml b/jdtls.ext/pom.xml index 17939e9a..8d533936 100644 --- a/jdtls.ext/pom.xml +++ b/jdtls.ext/pom.xml @@ -4,7 +4,7 @@ com.microsoft.jdtls.ext jdtls-ext-parent ${base.name} :: Parent - 0.18.0 + 0.18.1 pom Java Project Manager diff --git a/package-lock.json b/package-lock.json index 3a079424..4a2795ee 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "vscode-java-dependency", - "version": "0.18.0", + "version": "0.18.1", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 0c059b56..1dde26a4 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "vscode-java-dependency", "displayName": "Project Manager for Java", "description": "%description%", - "version": "0.18.0", + "version": "0.18.1", "publisher": "vscjava", "preview": true, "aiKey": "5c642b22-e845-4400-badb-3f8509a70777", @@ -31,7 +31,7 @@ "main": "./main.js", "contributes": { "javaExtensions": [ - "./server/com.microsoft.jdtls.ext.core-0.18.0.jar" + "./server/com.microsoft.jdtls.ext.core-0.18.1.jar" ], "commands": [ { From 7dbfef8c4b93346c203aa3831485f6d2b4c30e60 Mon Sep 17 00:00:00 2001 From: Shi Chen Date: Wed, 3 Mar 2021 10:18:04 +0800 Subject: [PATCH 010/352] chore: Update logo to 256*256 (#466) --- logo.png | Bin 3011 -> 5818 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/logo.png b/logo.png index aa737b3a65b21a21a86f2bb1734bf293121af438..daba66cdd4bb4efec832f94ca20cf06a9e2ad4f0 100644 GIT binary patch literal 5818 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 From 32ed4731bdd91bbeac280d29feb45941b9c0a200 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 9 Mar 2021 09:51:38 +0800 Subject: [PATCH 011/352] chore(deps): Bump elliptic from 6.5.3 to 6.5.4 (#469) Bumps [elliptic](https://github.com/indutny/elliptic) from 6.5.3 to 6.5.4. - [Release notes](https://github.com/indutny/elliptic/releases) - [Commits](https://github.com/indutny/elliptic/compare/v6.5.3...v6.5.4) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/package-lock.json b/package-lock.json index 4a2795ee..39978790 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1898,24 +1898,24 @@ } }, "elliptic": { - "version": "6.5.3", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.3.tgz", - "integrity": "sha512-IMqzv5wNQf+E6aHeIqATs0tOLeOTwj1QKbRcS3jBbYkl5oLAserA8yJTT7/VyHUYG91PRmPyeQDObKLPpeS4dw==", + "version": "6.5.4", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", + "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", "dev": true, "requires": { - "bn.js": "^4.4.0", - "brorand": "^1.0.1", + "bn.js": "^4.11.9", + "brorand": "^1.1.0", "hash.js": "^1.0.0", - "hmac-drbg": "^1.0.0", - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.0" + "hmac-drbg": "^1.0.1", + "inherits": "^2.0.4", + "minimalistic-assert": "^1.0.1", + "minimalistic-crypto-utils": "^1.0.1" }, "dependencies": { "bn.js": { - "version": "4.11.9", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", - "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", "dev": true } } From 2162e7aaa80b1b9296577f204ffb777bbde1dae8 Mon Sep 17 00:00:00 2001 From: Shi Chen Date: Tue, 9 Mar 2021 11:10:01 +0800 Subject: [PATCH 012/352] fix: export jar doesn't report error when grammatical error exists (#468) --- src/build.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/build.ts b/src/build.ts index 29f08518..d0542c56 100644 --- a/src/build.ts +++ b/src/build.ts @@ -36,7 +36,10 @@ async function handleBuildFailure(operationId: string, err: any): Promise Date: Tue, 9 Mar 2021 12:23:32 +0800 Subject: [PATCH 013/352] chore: Update dependencies (#470) --- package-lock.json | 695 +++++++++++++++++++++++++--------------------- package.json | 18 +- 2 files changed, 394 insertions(+), 319 deletions(-) diff --git a/package-lock.json b/package-lock.json index 39978790..15408af1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -112,14 +112,21 @@ } }, "@npmcli/move-file": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-1.0.1.tgz", - "integrity": "sha512-Uv6h1sT+0DrblvIrolFtbvM1FgWm+/sy4B3pvLp67Zys+thcukzS5ekn7HsZFGpWP4Q3fYJCljbWQE/XivMRLw==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-1.1.2.tgz", + "integrity": "sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg==", "dev": true, "requires": { - "mkdirp": "^1.0.4" + "mkdirp": "^1.0.4", + "rimraf": "^3.0.2" } }, + "@tootallnate/once": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", + "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", + "dev": true + }, "@types/fancy-log": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/@types/fancy-log/-/fancy-log-1.3.0.tgz", @@ -146,15 +153,15 @@ } }, "@types/json-schema": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.6.tgz", - "integrity": "sha512-3c+yGKvVP5Y9TYBEibGNR+kLtijnj7mYrXRg+WpFb2X9xm04g/DXYkfg4hmzJQosc9snFNUPkbYIhu+KAm6jJw==", + "version": "7.0.7", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.7.tgz", + "integrity": "sha512-cxWFQVseBm6O9Gbw1IWb8r6OS4OhSt3hPZLkFApLjM8TEXROBuQGLAH2i2gZpcXdLBIrpXuTDhH7Vbm1iXmNGA==", "dev": true }, "@types/lodash": { - "version": "4.14.165", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.165.tgz", - "integrity": "sha512-tjSSOTHhI5mCHTy/OOXYIhi2Wt1qcbHmuXD1Ha7q70CgI/I71afO4XtLb/cVexki1oVYchpul/TOuu3Arcdxrg==", + "version": "4.14.168", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.168.tgz", + "integrity": "sha512-oVfRvqHV/V6D1yifJbVRU3TMp8OT6o6BG+U9MkwuJ3U8/CsDHvalRpsxBqivn71ztOFZBTfJMvETbqHiaNSj7Q==", "dev": true }, "@types/minimatch": { @@ -164,9 +171,9 @@ "dev": true }, "@types/mocha": { - "version": "8.0.4", - "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-8.0.4.tgz", - "integrity": "sha512-M4BwiTJjHmLq6kjON7ZoI2JMlBvpY3BYSdiP6s/qCT3jb1s9/DeJF0JELpAxiVSIxXDzfNKe+r7yedMIoLbknQ==", + "version": "8.2.1", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-8.2.1.tgz", + "integrity": "sha512-NysN+bNqj6E0Hv4CTGWSlPzMW6vTKjDpOteycDkV4IWBsO+PU48JonrPzV9ODjiI2XrjmA05KInLgF5ivZ/YGQ==", "dev": true }, "@types/node": { @@ -381,12 +388,12 @@ "dev": true }, "agent-base": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.3.0.tgz", - "integrity": "sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", "dev": true, "requires": { - "es6-promisify": "^5.0.0" + "debug": "4" } }, "aggregate-error": { @@ -771,9 +778,9 @@ }, "dependencies": { "bn.js": { - "version": "4.11.9", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", - "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", "dev": true } } @@ -952,12 +959,28 @@ "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", "dev": true }, + "big-integer": { + "version": "1.6.48", + "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.48.tgz", + "integrity": "sha512-j51egjPa7/i+RdiRuJbPdJ2FIUYYPhvYLjzoYbcMMm62ooO6F94fETG4MTs46zPAF9Brs04OajboA/qTGuz78w==", + "dev": true + }, "big.js": { "version": "5.2.2", "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", "dev": true }, + "binary": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/binary/-/binary-0.3.0.tgz", + "integrity": "sha1-n2BVO8XOjDOG87VTz/R0Yq3sqnk=", + "dev": true, + "requires": { + "buffers": "~0.1.1", + "chainsaw": "~0.1.0" + } + }, "binary-extensions": { "version": "1.13.1", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", @@ -975,15 +998,15 @@ } }, "bluebird": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", - "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", + "version": "3.4.7", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.4.7.tgz", + "integrity": "sha1-9y12C+Cbf3bQjtj66Ysomo0F+rM=", "dev": true }, "bn.js": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.1.3.tgz", - "integrity": "sha512-GkTiFpjFtUzU9CbMeJ5iazkCzGL3jrhzerzZIuqLABjbwRaFt33I9tUdSNryIptM+RxDet6OKm2WnLXzW51KsQ==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.0.tgz", + "integrity": "sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw==", "dev": true }, "brace-expansion": { @@ -1124,12 +1147,24 @@ "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", "dev": true }, + "buffer-indexof-polyfill": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/buffer-indexof-polyfill/-/buffer-indexof-polyfill-1.0.2.tgz", + "integrity": "sha512-I7wzHwA3t1/lwXQh+A5PbNvJxgfo5r3xulgpYDB5zckTu/Z9oUK9biouBKQUjEqzaz3HnAT6TYoovmE+GqSf7A==", + "dev": true + }, "buffer-xor": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", "dev": true }, + "buffers": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/buffers/-/buffers-0.1.1.tgz", + "integrity": "sha1-skV5w77U1tOWru5tmorn9Ugqt7s=", + "dev": true + }, "builtin-modules": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", @@ -1200,6 +1235,15 @@ "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=", "dev": true }, + "chainsaw": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/chainsaw/-/chainsaw-0.1.0.tgz", + "integrity": "sha1-XqtQsor+WAdNDVgpE4iCi15fvJg=", + "dev": true, + "requires": { + "traverse": ">=0.3.0 <0.4" + } + }, "chalk": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", @@ -1208,6 +1252,17 @@ "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" + }, + "dependencies": { + "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, + "requires": { + "has-flag": "^4.0.0" + } + } } }, "chokidar": { @@ -1596,9 +1651,9 @@ } }, "copy-webpack-plugin": { - "version": "6.3.2", - "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-6.3.2.tgz", - "integrity": "sha512-MgJ1uouLIbDg4ST1GzqrGQyKoXY5iPqi6fghFqarijam7FQcBa/r6Rg0VkoIuzx75Xq8iAMghyOueMkWUQ5OaA==", + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-6.4.1.tgz", + "integrity": "sha512-MXyPCjdPVx5iiWyl40Va3JGh27bKzOTNY3NjUTrosD2q7dR/cLD0013uqJ3BpFbUjyONINjb6qI7nDIJujrMbA==", "dev": true, "requires": { "cacache": "^15.0.5", @@ -1631,9 +1686,9 @@ }, "dependencies": { "bn.js": { - "version": "4.11.9", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", - "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", "dev": true } } @@ -1714,12 +1769,20 @@ } }, "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", "dev": true, "requires": { - "ms": "2.0.0" + "ms": "2.1.2" + }, + "dependencies": { + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } } }, "decamelize": { @@ -1854,9 +1917,9 @@ }, "dependencies": { "bn.js": { - "version": "4.11.9", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", - "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", "dev": true } } @@ -1875,6 +1938,15 @@ "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", "dev": true }, + "duplexer2": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", + "integrity": "sha1-ixLauHjA1p4+eJEFFmKjL8a93ME=", + "dev": true, + "requires": { + "readable-stream": "^2.0.2" + } + }, "duplexify": { "version": "3.7.1", "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", @@ -2000,21 +2072,6 @@ "es6-symbol": "^3.1.1" } }, - "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==", - "dev": true - }, - "es6-promisify": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", - "integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=", - "dev": true, - "requires": { - "es6-promise": "^4.0.3" - } - }, "es6-symbol": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz", @@ -2037,6 +2094,12 @@ "es6-symbol": "^3.1.1" } }, + "escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true + }, "escape-string-regexp": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", @@ -2083,9 +2146,9 @@ "dev": true }, "events": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.2.0.tgz", - "integrity": "sha512-/46HWwbfCX2xTawVfkKLGxMifJYQBWMwY1mjywRtb4c9x8l5NP3KoJtnIOiL1hfdRkIuYhETxQlo62IF8tcnlg==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", "dev": true }, "evp_bytestokey": { @@ -2602,6 +2665,38 @@ "nan": "^2.12.1" } }, + "fstream": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.12.tgz", + "integrity": "sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "inherits": "~2.0.0", + "mkdirp": ">=0.5 0", + "rimraf": "2" + }, + "dependencies": { + "mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + }, + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + } + } + }, "function-bind": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", @@ -2992,13 +3087,14 @@ "dev": true }, "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==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", + "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", "dev": true, "requires": { - "agent-base": "4", - "debug": "3.1.0" + "@tootallnate/once": "1", + "agent-base": "6", + "debug": "4" } }, "https-browserify": { @@ -3008,13 +3104,13 @@ "dev": true }, "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==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", + "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", "dev": true, "requires": { - "agent-base": "^4.3.0", - "debug": "^3.1.0" + "agent-base": "6", + "debug": "4" } }, "ieee754": { @@ -3398,9 +3494,9 @@ "dev": true }, "json5": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz", - "integrity": "sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", + "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", "dev": true, "requires": { "minimist": "^1.2.5" @@ -3479,6 +3575,12 @@ "resolve": "^1.1.7" } }, + "listenercount": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/listenercount/-/listenercount-1.0.1.tgz", + "integrity": "sha1-hMinKrWcRyUyFIDJdeZQg0LnCTc=", + "dev": true + }, "load-json-file": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", @@ -3519,9 +3621,9 @@ } }, "lodash": { - "version": "4.17.20", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", - "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==" + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" }, "log-symbols": { "version": "4.0.0", @@ -3772,9 +3874,9 @@ }, "dependencies": { "bn.js": { - "version": "4.11.9", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", - "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", "dev": true } } @@ -3909,35 +4011,35 @@ "dev": true }, "mocha": { - "version": "8.2.1", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-8.2.1.tgz", - "integrity": "sha512-cuLBVfyFfFqbNR0uUKbDGXKGk+UDFe6aR4os78XIrMQpZl/nv7JYHcvP5MFIAb374b2zFXsdgEGwmzMtP0Xg8w==", + "version": "8.3.1", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-8.3.1.tgz", + "integrity": "sha512-5SBMxANWqOv5bw3Hx+HVgaWlcWcFEQDUdaUAr1AUU+qwtx6cowhn7gEDT/DwQP7uYxnvShdUOVLbTYAHOEGfDQ==", "dev": true, "requires": { "@ungap/promise-all-settled": "1.1.2", "ansi-colors": "4.1.1", "browser-stdout": "1.3.1", - "chokidar": "3.4.3", - "debug": "4.2.0", - "diff": "4.0.2", + "chokidar": "3.5.1", + "debug": "4.3.1", + "diff": "5.0.0", "escape-string-regexp": "4.0.0", "find-up": "5.0.0", "glob": "7.1.6", "growl": "1.10.5", "he": "1.2.0", - "js-yaml": "3.14.0", + "js-yaml": "4.0.0", "log-symbols": "4.0.0", "minimatch": "3.0.4", - "ms": "2.1.2", - "nanoid": "3.1.12", + "ms": "2.1.3", + "nanoid": "3.1.20", "serialize-javascript": "5.0.1", "strip-json-comments": "3.1.1", - "supports-color": "7.2.0", + "supports-color": "8.1.1", "which": "2.0.2", "wide-align": "1.1.3", - "workerpool": "6.0.2", - "yargs": "13.3.2", - "yargs-parser": "13.1.2", + "workerpool": "6.1.0", + "yargs": "16.2.0", + "yargs-parser": "20.2.4", "yargs-unparser": "2.0.0" }, "dependencies": { @@ -3948,20 +4050,11 @@ "dev": true }, "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", "dev": true }, - "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, - "requires": { - "color-convert": "^1.9.0" - } - }, "anymatch": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", @@ -3972,27 +4065,27 @@ "picomatch": "^2.0.4" } }, - "binary-extensions": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.1.0.tgz", - "integrity": "sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ==", + "argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", "dev": true }, - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", "dev": true }, "chokidar": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.3.tgz", - "integrity": "sha512-DtM3g7juCXQxFVSNPNByEC2+NImtBuxQQvWlHunpJIS5Ocr0lG306cC7FCi7cEA0fzmybPUIl4txBIobk1gGOQ==", + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.1.tgz", + "integrity": "sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw==", "dev": true, "requires": { "anymatch": "~3.1.1", "braces": "~3.0.2", - "fsevents": "~2.1.2", + "fsevents": "~2.3.1", "glob-parent": "~5.1.0", "is-binary-path": "~2.1.0", "is-glob": "~4.0.1", @@ -4001,39 +4094,27 @@ } }, "cliui": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", - "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", - "dev": true, - "requires": { - "string-width": "^3.1.0", - "strip-ansi": "^5.2.0", - "wrap-ansi": "^5.1.0" - } - }, - "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==", + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", "dev": true, "requires": { - "color-name": "1.1.3" + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" } }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "diff": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", + "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", "dev": true }, - "debug": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz", - "integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==", - "dev": true, - "requires": { - "ms": "2.1.2" - } + "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 }, "find-up": { "version": "5.0.0", @@ -4046,9 +4127,9 @@ } }, "fsevents": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", - "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", "dev": true, "optional": true }, @@ -4068,11 +4149,20 @@ } }, "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "dev": true }, + "js-yaml": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.0.0.tgz", + "integrity": "sha512-pqon0s+4ScYUvX30wxQi3PogGFAlUyH0awepWvwkj4jD4v+ova3RiYw8bmA6x2rDrEaj8i/oWKoRxpVNW+Re8Q==", + "dev": true, + "requires": { + "argparse": "^2.0.1" + } + }, "locate-path": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", @@ -4083,9 +4173,9 @@ } }, "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "dev": true }, "p-locate": { @@ -4106,30 +4196,24 @@ "picomatch": "^2.2.1" } }, - "require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", - "dev": true - }, "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", + "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", "dev": true, "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" } }, "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", "dev": true, "requires": { - "ansi-regex": "^4.1.0" + "ansi-regex": "^5.0.0" } }, "which": { @@ -4141,101 +4225,43 @@ "isexe": "^2.0.0" } }, - "which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", - "dev": true - }, "wrap-ansi": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", - "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "dev": true, "requires": { - "ansi-styles": "^3.2.0", - "string-width": "^3.0.0", - "strip-ansi": "^5.0.0" + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" } }, "y18n": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", - "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.5.tgz", + "integrity": "sha512-hsRUr4FFrvhhRH12wOdfs38Gy7k2FFzB9qgN9v3aLykRq0dRcdcpz5C9FxdS2NuhOrI/628b/KSTJ3rwHysYSg==", "dev": true }, "yargs": { - "version": "13.3.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", - "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", "dev": true, "requires": { - "cliui": "^5.0.0", - "find-up": "^3.0.0", - "get-caller-file": "^2.0.1", + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^3.0.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^13.1.2" - }, - "dependencies": { - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, - "requires": { - "locate-path": "^3.0.0" - } - }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dev": true, - "requires": { - "p-limit": "^2.0.0" - } - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true - } + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" } }, "yargs-parser": { - "version": "13.1.2", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", - "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } + "version": "20.2.4", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", + "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", + "dev": true } } }, @@ -4293,9 +4319,9 @@ "optional": true }, "nanoid": { - "version": "3.1.12", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.12.tgz", - "integrity": "sha512-1qstj9z5+x491jfiC4Nelk+f8XBad7LN20PmyWINJEMRSf3wcAjAWysw1qaA8z6NSKe2sjq1hRSDpBH5paCb6A==", + "version": "3.1.20", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.20.tgz", + "integrity": "sha512-a1cQNyczgKbLX9jwbS/+d7W8fX/RfgYR7lVWwWOGIPNgK2m0MWvrGF6/m4kk6U3QcFMnZf3RIhL0v2Jgh/0Uxw==", "dev": true }, "nanomatch": { @@ -4546,12 +4572,12 @@ } }, "p-limit": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.0.2.tgz", - "integrity": "sha512-iwqZSOoWIW+Ew4kAGUlN16J4M7OB3ysMLSZtnhmqx7njIHFPlxWBX8xo3lVTyFVq6mI/lL9qt2IsN1sHwaxJkg==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "dev": true, "requires": { - "p-try": "^2.0.0" + "yocto-queue": "^0.1.0" } }, "p-locate": { @@ -4864,9 +4890,9 @@ }, "dependencies": { "bn.js": { - "version": "4.11.9", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", - "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", "dev": true } } @@ -5646,9 +5672,9 @@ "dev": true }, "ssri": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.0.tgz", - "integrity": "sha512-aq/pz989nxVYwn16Tsbj1TqFpD5LLrQxHf5zaHuieFV+R0Bbr4y8qUsOA45hXT/N4/9UNXTarBjnjVmjSOVaAA==", + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.1.tgz", + "integrity": "sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==", "dev": true, "requires": { "minipass": "^3.1.1" @@ -5784,9 +5810,9 @@ "dev": true }, "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": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", "dev": true, "requires": { "has-flag": "^4.0.0" @@ -5809,9 +5835,9 @@ "dev": true }, "tar": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.0.5.tgz", - "integrity": "sha512-0b4HOimQHj9nXNEAA7zWwMM91Zhhba3pspja6sQbgTpynOJf+bkjBnfybNYzbpLbnwXnbyB4LOREvlyXLkCHSg==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.0.tgz", + "integrity": "sha512-DUCttfhsnLCjwoDoFcI+B2iJgYa93vBnDUATYEeRx6sntCTdN01VnqsIuTlALXla/LWooNg0yEGeB+Y8WdFxGA==", "dev": true, "requires": { "chownr": "^2.0.0", @@ -5858,6 +5884,12 @@ "worker-farm": "^1.7.0" }, "dependencies": { + "bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", + "dev": true + }, "cacache": { "version": "12.0.4", "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.4.tgz", @@ -6023,9 +6055,9 @@ } }, "y18n": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", - "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.1.tgz", + "integrity": "sha512-wNcy4NvjMYL8gogWWYAO7ZFWFfHcbdbE57tZO8e4cbpj8tfUcwrwqSl3ad8HxpYWCdXcJUCeKKZS62Av1affwQ==", "dev": true }, "yallist": { @@ -6142,6 +6174,12 @@ "through2": "^2.0.3" } }, + "traverse": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.3.9.tgz", + "integrity": "sha1-cXuPIgzAu3tE5AUUwisui7xw2Lk=", + "dev": true + }, "ts-loader": { "version": "5.4.5", "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-5.4.5.tgz", @@ -6458,9 +6496,9 @@ "dev": true }, "typescript": { - "version": "3.9.7", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.9.7.tgz", - "integrity": "sha512-BLbiRkiBzAwsjut4x/dsibSTB6yWpwT5qWmC2OfuCg3GgVQCSgMs4vEctYPhsaGtd0AeuuHMkjZ2h2WG8MSzRw==", + "version": "3.9.9", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.9.9.tgz", + "integrity": "sha512-kdMjTiekY+z/ubJCATUPlRDl39vXYiMV9iyeMuEuXZh2we6zz80uovNN2WlAxmmdE/Z/YQe+EbOEXB5RHEED3w==", "dev": true }, "unc-path-regex": { @@ -6578,6 +6616,24 @@ } } }, + "unzipper": { + "version": "0.10.11", + "resolved": "https://registry.npmjs.org/unzipper/-/unzipper-0.10.11.tgz", + "integrity": "sha512-+BrAq2oFqWod5IESRjL3S8baohbevGcVA+teAIOYWM3pDVdseogqbzhhvvmiyQrUNKFUnDMtELW3X8ykbyDCJw==", + "dev": true, + "requires": { + "big-integer": "^1.6.17", + "binary": "~0.3.0", + "bluebird": "~3.4.1", + "buffer-indexof-polyfill": "~1.0.0", + "duplexer2": "~0.1.4", + "fstream": "^1.0.12", + "graceful-fs": "^4.2.2", + "listenercount": "~1.0.1", + "readable-stream": "~2.3.6", + "setimmediate": "~1.0.4" + } + }, "upath": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", @@ -6585,9 +6641,9 @@ "dev": true }, "uri-js": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.0.tgz", - "integrity": "sha512-B0yRTzYdUCCn9n+F4+Gh4yIDtMQcaJsmYBDsTSG8g/OejKBodLQ2IHfN3bM7jUsRXndopT7OIXWdYqc1fjmV6g==", + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", "dev": true, "requires": { "punycode": "^2.1.0" @@ -6762,9 +6818,9 @@ } }, "vscode-extension-telemetry-wrapper": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/vscode-extension-telemetry-wrapper/-/vscode-extension-telemetry-wrapper-0.8.0.tgz", - "integrity": "sha512-z+PAc7QAMeTZU0Kq0oBn7DVinJDLtyK5DNZV0dSkclXPYlIVAalE5iEWBChXgANxaMWCyJQqCEI60zlZ7r7C/A==", + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/vscode-extension-telemetry-wrapper/-/vscode-extension-telemetry-wrapper-0.9.0.tgz", + "integrity": "sha512-QQvCn40hryS1U0Vob/fxqDX+kc7oYn+viiYpq0QOMp7q6aNaFFmjL9Wv5QfBIC/h2Jb083LFF0Xz38hhX8nCVQ==", "requires": { "uuid": "^3.4.0", "vscode-extension-telemetry": "^0.1.6" @@ -6779,25 +6835,15 @@ } }, "vscode-test": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/vscode-test/-/vscode-test-1.4.1.tgz", - "integrity": "sha512-Ls7+JyC06cUCuomlTYk4aNJI00Rri09hgtkNl3zfQ1bj6meXglpSPpuzJ/RPNetlUHFMm4eGs0Xr/H5pFPVwfQ==", + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/vscode-test/-/vscode-test-1.5.1.tgz", + "integrity": "sha512-tDloz6euDne+GeUSglhufL0c2xhuYAPAT74hjsuGxfflALfXF9bYnJ7ehZEeVkr/ZnQEh/T8EBrfPL+m0h5qEQ==", "dev": true, "requires": { - "http-proxy-agent": "^2.1.0", - "https-proxy-agent": "^2.2.4", - "rimraf": "^2.6.3" - }, - "dependencies": { - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - } + "http-proxy-agent": "^4.0.1", + "https-proxy-agent": "^5.0.0", + "rimraf": "^3.0.2", + "unzipper": "^0.10.11" } }, "watchpack": { @@ -6824,22 +6870,22 @@ } }, "binary-extensions": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.1.0.tgz", - "integrity": "sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", "dev": true, "optional": true }, "chokidar": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.3.tgz", - "integrity": "sha512-DtM3g7juCXQxFVSNPNByEC2+NImtBuxQQvWlHunpJIS5Ocr0lG306cC7FCi7cEA0fzmybPUIl4txBIobk1gGOQ==", + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.1.tgz", + "integrity": "sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw==", "dev": true, "optional": true, "requires": { "anymatch": "~3.1.1", "braces": "~3.0.2", - "fsevents": "~2.1.2", + "fsevents": "~2.3.1", "glob-parent": "~5.1.0", "is-binary-path": "~2.1.0", "is-glob": "~4.0.1", @@ -6848,9 +6894,9 @@ } }, "fsevents": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", - "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", "dev": true, "optional": true }, @@ -6887,9 +6933,9 @@ } }, "webpack": { - "version": "4.44.2", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.44.2.tgz", - "integrity": "sha512-6KJVGlCxYdISyurpQ0IPTklv+DULv05rs2hseIXer6D7KrUicRDLFb4IUM1S6LUAKypPM/nSiVSuv8jHu1m3/Q==", + "version": "4.46.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.46.0.tgz", + "integrity": "sha512-6jJuJjg8znb/xRItk7bkT0+Q7AHCYjjFnvKIWQPkNIOyRqoCGvkOs0ipeQzrqz4l5FtN5ZI/ukEHroeX/o1/5Q==", "dev": true, "requires": { "@webassemblyjs/ast": "1.9.0", @@ -6900,7 +6946,7 @@ "ajv": "^6.10.2", "ajv-keywords": "^3.4.1", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^4.3.0", + "enhanced-resolve": "^4.5.0", "eslint-scope": "^4.0.3", "json-parse-better-errors": "^1.0.2", "loader-runner": "^2.4.0", @@ -6946,6 +6992,29 @@ } } }, + "enhanced-resolve": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.5.0.tgz", + "integrity": "sha512-Nv9m36S/vxpsI+Hc4/ZGRs0n9mXqSWGGq49zxb/cJfPAQMbUtttJAlNPS4AQzaBdw/pKskw5bMbekT/Y7W/Wlg==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "memory-fs": "^0.5.0", + "tapable": "^1.0.0" + }, + "dependencies": { + "memory-fs": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.5.0.tgz", + "integrity": "sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==", + "dev": true, + "requires": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + } + } + } + }, "fill-range": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", @@ -7399,9 +7468,9 @@ } }, "workerpool": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.0.2.tgz", - "integrity": "sha512-DSNyvOpFKrNusaaUwk+ej6cBj1bmhLcBfj80elGk+ZIo5JSkq+unB1dLKEOcNfJDZgjGICfhQ0Q5TbP0PvF4+Q==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.1.0.tgz", + "integrity": "sha512-toV7q9rWNYha963Pl/qyeZ6wG+3nnsyvolaNUS8+R5Wtw6qJPTxIlOP1ZSvcGhEJw+l3HMMmtiNo9Gl61G4GVg==", "dev": true }, "wrap-ansi": { @@ -7494,6 +7563,12 @@ "dev": true } } + }, + "yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true } } } diff --git a/package.json b/package.json index 1dde26a4..4605cf39 100644 --- a/package.json +++ b/package.json @@ -583,30 +583,30 @@ "devDependencies": { "@types/fs-extra": "^5.1.0", "@types/glob": "^7.1.3", - "@types/lodash": "^4.14.165", + "@types/lodash": "^4.14.168", "@types/minimatch": "^3.0.3", - "@types/mocha": "^8.0.4", + "@types/mocha": "^8.2.1", "@types/node": "^8.10.66", "@types/vscode": "1.53.0", - "copy-webpack-plugin": "^6.3.2", + "copy-webpack-plugin": "^6.4.1", "glob": "^7.1.6", "gulp": "^4.0.2", "gulp-copy": "^4.0.1", "gulp-tslint": "^8.1.4", - "mocha": "^8.2.1", + "mocha": "^8.3.1", "ts-loader": "^5.4.5", "tslint": "^5.20.1", - "typescript": "^3.9.7", - "vscode-test": "^1.4.1", - "webpack": "^4.44.2", + "typescript": "^3.9.9", + "vscode-test": "^1.5.1", + "webpack": "^4.46.0", "webpack-cli": "^3.3.12" }, "dependencies": { "fs-extra": "^7.0.1", "globby": "11.0.1", - "lodash": "^4.17.20", + "lodash": "^4.17.21", "minimatch": "^3.0.4", - "vscode-extension-telemetry-wrapper": "0.8.0", + "vscode-extension-telemetry-wrapper": "0.9.0", "vscode-tas-client": "^0.1.17" } } From 292ee9fc8ee11de3fd00ae2bd612d0a5c838bce8 Mon Sep 17 00:00:00 2001 From: Sheng Chen Date: Tue, 9 Mar 2021 17:13:38 +0800 Subject: [PATCH 014/352] fix: Create new packages or classes does not work via hotkeys (#467) --- src/explorerCommands/delete.ts | 4 +- src/explorerCommands/new.ts | 33 ++++++++++++++-- src/explorerCommands/rename.ts | 4 +- src/explorerCommands/utility.ts | 12 +++++- src/views/dependencyDataProvider.ts | 21 +++++----- src/views/dependencyExplorer.ts | 60 ++++++++++++++++++++++++----- 6 files changed, 104 insertions(+), 30 deletions(-) diff --git a/src/explorerCommands/delete.ts b/src/explorerCommands/delete.ts index 036c8c96..3a6d626b 100644 --- a/src/explorerCommands/delete.ts +++ b/src/explorerCommands/delete.ts @@ -7,8 +7,8 @@ import { isMutable } from "./utility"; const confirmMessage = "Move to Recycle Bin"; -export async function deleteFiles(node: DataNode): Promise { - if (!isMutable(node) || !node.uri) { +export async function deleteFiles(node?: DataNode): Promise { + if (!node?.uri || !isMutable(node)) { return; } diff --git a/src/explorerCommands/new.ts b/src/explorerCommands/new.ts index c387e3ef..7d15b9c1 100644 --- a/src/explorerCommands/new.ts +++ b/src/explorerCommands/new.ts @@ -8,7 +8,11 @@ import { NodeKind } from "../java/nodeData"; import { DataNode } from "../views/dataNode"; import { checkJavaQualifiedName } from "./utility"; -export async function newJavaClass(node: DataNode): Promise { +export async function newJavaClass(node?: DataNode): Promise { + if (!node?.uri || !canCreateClass(node)) { + return; + } + const packageFsPath: string = await getPackageFsPath(node); if (!packageFsPath) { return; @@ -43,6 +47,17 @@ export async function newJavaClass(node: DataNode): Promise { workspace.applyEdit(workspaceEdit); } +function canCreateClass(node: DataNode): boolean { + if (node.nodeData.kind === NodeKind.Project || + node.nodeData.kind === NodeKind.PackageRoot || + node.nodeData.kind === NodeKind.Package || + node.nodeData.kind === NodeKind.PrimaryType) { + return true; + } + + return false; +} + async function getPackageFsPath(node: DataNode): Promise { if (node.nodeData.kind === NodeKind.Project) { const childrenNodes: DataNode[] = await node.getChildren() as DataNode[]; @@ -77,6 +92,8 @@ async function getPackageFsPath(node: DataNode): Promise { ); return choice ? choice.fsPath : ""; } + } else if (node.nodeData.kind === NodeKind.PrimaryType) { + return node.uri ? path.dirname(Uri.parse(node.uri).fsPath) : ""; } return node.uri ? Uri.parse(node.uri).fsPath : ""; @@ -89,8 +106,8 @@ function getNewFilePath(basePath: string, className: string): string { return path.join(basePath, ...className.split(".")) + ".java"; } -export async function newPackage(node: DataNode): Promise { - if (!node.uri) { +export async function newPackage(node?: DataNode): Promise { + if (!node?.uri || !canCreatePackage(node)) { return; } @@ -136,6 +153,16 @@ export async function newPackage(node: DataNode): Promise { await fse.ensureDir(getNewPackagePath(packageRootPath, packageName)); } +function canCreatePackage(node: DataNode): boolean { + if (node.nodeData.kind === NodeKind.Project || + node.nodeData.kind === NodeKind.PackageRoot || + node.nodeData.kind === NodeKind.Package) { + return true; + } + + return false; +} + function getPackageRootPath(packageFsPath: string, packageName: string): string { const numberOfSegment: number = packageName.split(".").length; return path.join(packageFsPath, ...Array(numberOfSegment).fill("..")); diff --git a/src/explorerCommands/rename.ts b/src/explorerCommands/rename.ts index d5433042..5d4af1b3 100644 --- a/src/explorerCommands/rename.ts +++ b/src/explorerCommands/rename.ts @@ -8,8 +8,8 @@ import { NodeKind } from "../java/nodeData"; import { DataNode } from "../views/dataNode"; import { checkJavaQualifiedName, isMutable } from "./utility"; -export async function renameFile(node: DataNode): Promise { - if (!isMutable(node) || !node.uri) { +export async function renameFile(node?: DataNode): Promise { + if (!node?.uri || !isMutable(node)) { return; } diff --git a/src/explorerCommands/utility.ts b/src/explorerCommands/utility.ts index ec8f4d54..22e26968 100644 --- a/src/explorerCommands/utility.ts +++ b/src/explorerCommands/utility.ts @@ -35,7 +35,15 @@ export function checkJavaQualifiedName(value: string): string { return ""; } -export function getCmdNode(selectedNode: ExplorerNode, node?: DataNode): DataNode { +export function getCmdNode(selectedNodes: ExplorerNode[], node?: DataNode): DataNode | undefined { // if command not invoked by context menu, use selected node in explorer - return node ? node : selectedNode as DataNode; + if (node) { + return node; + } + + if (selectedNodes.length > 0) { + return selectedNodes[0] as DataNode; + } + + return undefined; } diff --git a/src/views/dependencyDataProvider.ts b/src/views/dependencyDataProvider.ts index e28f39c2..aebc3c27 100644 --- a/src/views/dependencyDataProvider.ts +++ b/src/views/dependencyDataProvider.ts @@ -10,7 +10,6 @@ import { instrumentOperation, instrumentOperationAsVsCodeCommand } from "vscode- import { contextManager } from "../../extension.bundle"; import { Commands } from "../commands"; import { Context } from "../constants"; -import { newJavaClass, newPackage } from "../explorerCommands/new"; import { executeExportJarTask } from "../exportJarSteps/ExportJarTaskProvider"; import { Jdtls } from "../java/jdtls"; import { INodeData, NodeKind } from "../java/nodeData"; @@ -41,8 +40,6 @@ export class DependencyDataProvider implements TreeDataProvider { context.subscriptions.push(instrumentOperationAsVsCodeCommand(Commands.VIEW_PACKAGE_EXPORT_JAR, async (node: INodeData) => { executeExportJarTask(node); })); - context.subscriptions.push(instrumentOperationAsVsCodeCommand(Commands.VIEW_PACKAGE_NEW_JAVA_CLASS, (node: DataNode) => newJavaClass(node))); - context.subscriptions.push(instrumentOperationAsVsCodeCommand(Commands.VIEW_PACKAGE_NEW_JAVA_PACKAGE, (node: DataNode) => newPackage(node))); context.subscriptions.push(instrumentOperationAsVsCodeCommand(Commands.VIEW_PACKAGE_OUTLINE, (uri, range) => window.showTextDocument(Uri.parse(uri), { selection: range }))); context.subscriptions.push(instrumentOperationAsVsCodeCommand(Commands.JAVA_PROJECT_BUILD_WORKSPACE, () => @@ -128,15 +125,7 @@ export class DependencyDataProvider implements TreeDataProvider { return project?.revealPaths(paths); } - private doRefresh(element?: ExplorerNode): void { - if (!element) { - this._rootItems = undefined; - } - explorerNodeCache.removeNodeChildren(element); - this._onDidChangeTreeData.fire(element); - } - - private async getRootProjects(): Promise { + public async getRootProjects(): Promise { const rootElements = await this.getRootNodes(); if (rootElements[0] instanceof ProjectNode) { return rootElements; @@ -152,6 +141,14 @@ export class DependencyDataProvider implements TreeDataProvider { } } + private doRefresh(element?: ExplorerNode): void { + if (!element) { + this._rootItems = undefined; + } + explorerNodeCache.removeNodeChildren(element); + this._onDidChangeTreeData.fire(element); + } + private async getRootNodes(): Promise { try { await this._lock.acquire(); diff --git a/src/views/dependencyExplorer.ts b/src/views/dependencyExplorer.ts index 0c160dfc..1adc5107 100644 --- a/src/views/dependencyExplorer.ts +++ b/src/views/dependencyExplorer.ts @@ -4,12 +4,13 @@ import * as fse from "fs-extra"; import * as _ from "lodash"; import * as path from "path"; -import { commands, Disposable, ExtensionContext, TextEditor, TreeView, +import { commands, Disposable, ExtensionContext, QuickPickItem, TextEditor, TreeView, TreeViewExpansionEvent, TreeViewSelectionChangeEvent, TreeViewVisibilityChangeEvent, Uri, window } from "vscode"; import { instrumentOperationAsVsCodeCommand, sendInfo } from "vscode-extension-telemetry-wrapper"; import { Commands } from "../commands"; import { Build } from "../constants"; import { deleteFiles } from "../explorerCommands/delete"; +import { newJavaClass, newPackage } from "../explorerCommands/new"; import { renameFile } from "../explorerCommands/rename"; import { getCmdNode } from "../explorerCommands/utility"; import { Jdtls } from "../java/jdtls"; @@ -96,29 +97,43 @@ export class DependencyExplorer implements Disposable { // register keybinding commands context.subscriptions.push( + instrumentOperationAsVsCodeCommand(Commands.VIEW_PACKAGE_NEW_JAVA_CLASS, async (node?: DataNode) => { + let cmdNode = getCmdNode(this._dependencyViewer.selection, node); + if (!cmdNode) { + cmdNode = await this.promptForProjectNode(); + } + newJavaClass(cmdNode); + }), + instrumentOperationAsVsCodeCommand(Commands.VIEW_PACKAGE_NEW_JAVA_PACKAGE, async (node?: DataNode) => { + let cmdNode = getCmdNode(this._dependencyViewer.selection, node); + if (!cmdNode) { + cmdNode = await this.promptForProjectNode(); + } + newPackage(cmdNode); + }), instrumentOperationAsVsCodeCommand(Commands.VIEW_PACKAGE_REVEAL_FILE_OS, (node?: DataNode) => { - const cmdNode = getCmdNode(this._dependencyViewer.selection[0], node); - if (cmdNode.uri) { + const cmdNode = getCmdNode(this._dependencyViewer.selection, node); + if (cmdNode?.uri) { commands.executeCommand("revealFileInOS", Uri.parse(cmdNode.uri)); } }), instrumentOperationAsVsCodeCommand(Commands.VIEW_PACKAGE_COPY_FILE_PATH, (node?: DataNode) => { - const cmdNode = getCmdNode(this._dependencyViewer.selection[0], node); - if (cmdNode.uri) { + const cmdNode = getCmdNode(this._dependencyViewer.selection, node); + if (cmdNode?.uri) { commands.executeCommand("copyFilePath", Uri.parse(cmdNode.uri)); } }), instrumentOperationAsVsCodeCommand(Commands.VIEW_PACKAGE_COPY_RELATIVE_FILE_PATH, (node?: DataNode) => { - const cmdNode = getCmdNode(this._dependencyViewer.selection[0], node); - if (cmdNode.uri) { + const cmdNode = getCmdNode(this._dependencyViewer.selection, node); + if (cmdNode?.uri) { commands.executeCommand("copyRelativeFilePath", Uri.parse(cmdNode.uri)); } }), instrumentOperationAsVsCodeCommand(Commands.VIEW_PACKAGE_RENAME_FILE, (node?: DataNode) => { - renameFile(getCmdNode(this._dependencyViewer.selection[0], node)); + renameFile(getCmdNode(this._dependencyViewer.selection, node)); }), instrumentOperationAsVsCodeCommand(Commands.VIEW_PACKAGE_MOVE_FILE_TO_TRASH, (node?: DataNode) => { - deleteFiles(getCmdNode(this._dependencyViewer.selection[0], node)); + deleteFiles(getCmdNode(this._dependencyViewer.selection, node)); }), ); } @@ -162,4 +177,31 @@ export class DependencyExplorer implements Disposable { public get dataProvider(): DependencyDataProvider { return this._dataProvider; } + + private async promptForProjectNode(): Promise { + const projects = await this._dataProvider.getRootProjects(); + if (projects.length === 0) { + window.showInformationMessage("There is no Java projects in current workspace."); + return undefined; + } else if (projects.length === 1) { + return projects[0] as DataNode; + } else { + const options: IProjectPickItem[] = projects.map((p: DataNode) => { + return { + label: p.name, + node: p, + }; + }); + const choice: IProjectPickItem | undefined = await window.showQuickPick(options, { + placeHolder: "Choose a project", + ignoreFocusOut: true, + }); + + return choice?.node as DataNode; + } + } +} + +interface IProjectPickItem extends QuickPickItem { + node: ExplorerNode; } From 38a40b2d3e3e1b20fa5fd32202cb8cde37d8fdeb Mon Sep 17 00:00:00 2001 From: Sheng Chen Date: Sun, 21 Mar 2021 21:44:54 -0700 Subject: [PATCH 015/352] chore: Prepare for 0.18.2 (#473) --- CHANGELOG.md | 12 ++++++++++-- .../META-INF/MANIFEST.MF | 2 +- jdtls.ext/com.microsoft.jdtls.ext.activator/pom.xml | 2 +- .../META-INF/MANIFEST.MF | 2 +- jdtls.ext/com.microsoft.jdtls.ext.core/pom.xml | 2 +- jdtls.ext/pom.xml | 2 +- package-lock.json | 2 +- package.json | 4 ++-- 8 files changed, 18 insertions(+), 10 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 99070c0e..bf74e5a2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,9 +4,17 @@ All notable changes to the "vscode-java-dependency" extension will be documented The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/) and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html). -### 0.18.1 +## 0.18.2 + +### Changed +- Update dependencies. [PR#470](https://github.com/microsoft/vscode-java-dependency/pull/470) + +### Fixed +- [Bugs fixed](https://github.com/microsoft/vscode-java-dependency/issues?q=is%3Aissue+label%3Abug+milestone%3A0.18.2+is%3Aclosed) + +## 0.18.1 ### Added -- Add welcome view in Java Proejct explorer when there is no Java projects in the workspace. [PR#461](https://github.com/microsoft/vscode-java-dependency/pull/461) +- Add welcome view in Java Project explorer when there is no Java projects in the workspace. [PR#461](https://github.com/microsoft/vscode-java-dependency/pull/461) ### Changed - Apply the new extension icon. [PR#462](https://github.com/microsoft/vscode-java-dependency/pull/462) diff --git a/jdtls.ext/com.microsoft.jdtls.ext.activator/META-INF/MANIFEST.MF b/jdtls.ext/com.microsoft.jdtls.ext.activator/META-INF/MANIFEST.MF index b5646099..9fe8f0f5 100644 --- a/jdtls.ext/com.microsoft.jdtls.ext.activator/META-INF/MANIFEST.MF +++ b/jdtls.ext/com.microsoft.jdtls.ext.activator/META-INF/MANIFEST.MF @@ -2,7 +2,7 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: JDTLS EXT Activator Bundle-SymbolicName: com.microsoft.jdtls.ext.activator;singleton:=true -Bundle-Version: 0.18.1 +Bundle-Version: 0.18.2 Bundle-Activator: com.microsoft.jdtls.ext.activator.JdtlsExtActivator Bundle-RequiredExecutionEnvironment: JavaSE-1.8 Import-Package: org.eclipse.jdt.core, diff --git a/jdtls.ext/com.microsoft.jdtls.ext.activator/pom.xml b/jdtls.ext/com.microsoft.jdtls.ext.activator/pom.xml index 9486e0e8..8f253549 100644 --- a/jdtls.ext/com.microsoft.jdtls.ext.activator/pom.xml +++ b/jdtls.ext/com.microsoft.jdtls.ext.activator/pom.xml @@ -5,7 +5,7 @@ com.microsoft.jdtls.ext jdtls-ext-parent - 0.18.1 + 0.18.2 com.microsoft.jdtls.ext.activator eclipse-plugin diff --git a/jdtls.ext/com.microsoft.jdtls.ext.core/META-INF/MANIFEST.MF b/jdtls.ext/com.microsoft.jdtls.ext.core/META-INF/MANIFEST.MF index bd23e641..2a432fd4 100644 --- a/jdtls.ext/com.microsoft.jdtls.ext.core/META-INF/MANIFEST.MF +++ b/jdtls.ext/com.microsoft.jdtls.ext.core/META-INF/MANIFEST.MF @@ -2,7 +2,7 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: JDTLS EXT Core Bundle-SymbolicName: com.microsoft.jdtls.ext.core;singleton:=true -Bundle-Version: 0.18.1 +Bundle-Version: 0.18.2 Bundle-Activator: com.microsoft.jdtls.ext.core.JdtlsExtActivator Bundle-RequiredExecutionEnvironment: JavaSE-1.8 Bundle-ActivationPolicy: lazy diff --git a/jdtls.ext/com.microsoft.jdtls.ext.core/pom.xml b/jdtls.ext/com.microsoft.jdtls.ext.core/pom.xml index ab5479df..2225049d 100644 --- a/jdtls.ext/com.microsoft.jdtls.ext.core/pom.xml +++ b/jdtls.ext/com.microsoft.jdtls.ext.core/pom.xml @@ -5,7 +5,7 @@ com.microsoft.jdtls.ext jdtls-ext-parent - 0.18.1 + 0.18.2 com.microsoft.jdtls.ext.core eclipse-plugin diff --git a/jdtls.ext/pom.xml b/jdtls.ext/pom.xml index 8d533936..eea07a19 100644 --- a/jdtls.ext/pom.xml +++ b/jdtls.ext/pom.xml @@ -4,7 +4,7 @@ com.microsoft.jdtls.ext jdtls-ext-parent ${base.name} :: Parent - 0.18.1 + 0.18.2 pom Java Project Manager diff --git a/package-lock.json b/package-lock.json index 15408af1..5c6ad121 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "vscode-java-dependency", - "version": "0.18.1", + "version": "0.18.2", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 4605cf39..7ccc8509 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "vscode-java-dependency", "displayName": "Project Manager for Java", "description": "%description%", - "version": "0.18.1", + "version": "0.18.2", "publisher": "vscjava", "preview": true, "aiKey": "5c642b22-e845-4400-badb-3f8509a70777", @@ -31,7 +31,7 @@ "main": "./main.js", "contributes": { "javaExtensions": [ - "./server/com.microsoft.jdtls.ext.core-0.18.1.jar" + "./server/com.microsoft.jdtls.ext.core-0.18.2.jar" ], "commands": [ { From 403f78fbb5e3d489499a01299b3b6ebbfe9ccaad Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 31 Mar 2021 09:39:29 +0800 Subject: [PATCH 016/352] chore(deps): Bump y18n from 3.2.1 to 3.2.2 (#474) Bumps [y18n](https://github.com/yargs/y18n) from 3.2.1 to 3.2.2. - [Release notes](https://github.com/yargs/y18n/releases) - [Changelog](https://github.com/yargs/y18n/blob/master/CHANGELOG.md) - [Commits](https://github.com/yargs/y18n/commits) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index 5c6ad121..cc54db33 100644 --- a/package-lock.json +++ b/package-lock.json @@ -7389,9 +7389,9 @@ } }, "y18n": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", - "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.1.tgz", + "integrity": "sha512-wNcy4NvjMYL8gogWWYAO7ZFWFfHcbdbE57tZO8e4cbpj8tfUcwrwqSl3ad8HxpYWCdXcJUCeKKZS62Av1affwQ==", "dev": true }, "yargs": { @@ -7496,9 +7496,9 @@ "dev": true }, "y18n": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", - "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.2.tgz", + "integrity": "sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ==", "dev": true }, "yallist": { From 4d1554882861a112d52c89bf1534817361d1626a Mon Sep 17 00:00:00 2001 From: Sheng Chen Date: Tue, 6 Apr 2021 10:13:03 +0800 Subject: [PATCH 017/352] Adopt new APIs from vscode-tas-client (#477) --- package-lock.json | 20 ++++++++++---------- package.json | 2 +- src/ExperimentationService.ts | 6 +++--- src/extension.ts | 2 +- 4 files changed, 15 insertions(+), 15 deletions(-) diff --git a/package-lock.json b/package-lock.json index cc54db33..84ad32c0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2569,9 +2569,9 @@ } }, "follow-redirects": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.13.1.tgz", - "integrity": "sha512-SSG5xmZh1mkPGyKzjZP8zLjltIfpW32Y5QpdNJyjcfGxK3qo3NDDkZOZSFiGn1A6SclQxY9GzEwAHQ3dmYRWpg==" + "version": "1.13.3", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.13.3.tgz", + "integrity": "sha512-DUgl6+HDzB0iEptNQEXLx/KhTmDb8tZUHSeLqpnjpknR70H0nC2t9N73BK6fN4hOvJ84pKlIQVQ4k5FFlBedKA==" }, "for-in": { "version": "1.0.2", @@ -5849,9 +5849,9 @@ } }, "tas-client": { - "version": "0.1.16", - "resolved": "https://registry.npmjs.org/tas-client/-/tas-client-0.1.16.tgz", - "integrity": "sha512-ZMGg7dGXiYVJHYusDpUb/Ilg+iPNYZdKJSIA2ADn0f2RovHWM0TpNVe2YHPEc0hdFMsUwWKS5pCRzLnlUqcqGg==", + "version": "0.1.21", + "resolved": "https://registry.npmjs.org/tas-client/-/tas-client-0.1.21.tgz", + "integrity": "sha512-7UuIwOXarCYoCTrQHY5n7M+63XuwMC0sVUdbPQzxqDB9wMjIW0JF39dnp3yoJnxr4jJUVhPtvkkXZbAD0BxCcA==", "requires": { "axios": "^0.21.1" } @@ -6827,11 +6827,11 @@ } }, "vscode-tas-client": { - "version": "0.1.17", - "resolved": "https://registry.npmjs.org/vscode-tas-client/-/vscode-tas-client-0.1.17.tgz", - "integrity": "sha512-5uqMeg7sjsu1/QkmuRtBOXtZnnrCXAMEihbOSxan3bk2NdA/nZvhfhfLh8gd9FlBBL56QH69I8Zn25B2yGPRng==", + "version": "0.1.22", + "resolved": "https://registry.npmjs.org/vscode-tas-client/-/vscode-tas-client-0.1.22.tgz", + "integrity": "sha512-1sYH73nhiSRVQgfZkLQNJW7VzhKM9qNbCe8QyXgiKkLhH4GflDXRPAK4yy4P41jUgula+Fc9G7i5imj1dlKfaw==", "requires": { - "tas-client": "0.1.16" + "tas-client": "0.1.21" } }, "vscode-test": { diff --git a/package.json b/package.json index 7ccc8509..41de08b5 100644 --- a/package.json +++ b/package.json @@ -607,6 +607,6 @@ "lodash": "^4.17.21", "minimatch": "^3.0.4", "vscode-extension-telemetry-wrapper": "0.9.0", - "vscode-tas-client": "^0.1.17" + "vscode-tas-client": "^0.1.22" } } diff --git a/src/ExperimentationService.ts b/src/ExperimentationService.ts index f9fd280b..a76741ea 100644 --- a/src/ExperimentationService.ts +++ b/src/ExperimentationService.ts @@ -3,7 +3,7 @@ import * as vscode from "vscode"; import { addContextProperty, sendInfo } from "vscode-extension-telemetry-wrapper"; -import { getExperimentationService, IExperimentationService, IExperimentationTelemetry, TargetPopulation } from "vscode-tas-client"; +import { getExperimentationServiceAsync, IExperimentationService, IExperimentationTelemetry, TargetPopulation } from "vscode-tas-client"; class ExperimentationTelemetry implements IExperimentationTelemetry { @@ -27,12 +27,12 @@ export function getExpService() { return expService; } -export function init(context: vscode.ExtensionContext): void { +export async function init(context: vscode.ExtensionContext): Promise { const packageJson: {[key: string]: any} = require("../package.json"); // tslint:disable: no-string-literal const extensionName = `${packageJson["publisher"]}.${packageJson["name"]}`; const extensionVersion = packageJson["version"]; // tslint:enable: no-string-literal - expService = getExperimentationService(extensionName, extensionVersion, + expService = await getExperimentationServiceAsync(extensionName, extensionVersion, TargetPopulation.Public, new ExperimentationTelemetry(), context.globalState); } diff --git a/src/extension.ts b/src/extension.ts index ceb4349b..678597bb 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -15,6 +15,7 @@ import { EventCounter } from "./utility"; import { DependencyExplorer } from "./views/dependencyExplorer"; export async function activate(context: ExtensionContext): Promise { + await initExpService(context); contextManager.initialize(context); await initializeFromJsonFile(context.asAbsolutePath("./package.json"), { firstParty: true }); await instrumentOperation("activation", activateExtension)(context); @@ -30,7 +31,6 @@ async function activateExtension(_operationId: string, context: ExtensionContext context.subscriptions.push(contextManager); context.subscriptions.push(syncHandler); context.subscriptions.push(tasks.registerTaskProvider(ExportJarTaskProvider.exportJarType, new ExportJarTaskProvider())); - initExpService(context); } // this method is called when your extension is deactivated From 9d3e62dc3f11093da65396774c814adce56a8973 Mon Sep 17 00:00:00 2001 From: Sheng Chen Date: Wed, 7 Apr 2021 13:12:40 +0800 Subject: [PATCH 018/352] chore: Rename group 9_sync to 9_configuration (#480) --- package.json | 2 +- src/extension.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 41de08b5..b25b1b4e 100644 --- a/package.json +++ b/package.json @@ -498,7 +498,7 @@ { "command": "java.project.update", "when": "view == javaProjectExplorer && viewItem =~ /java:project(?=.*?\\b\\+uri\\b)(?=.*?\\b\\+(maven|gradle)\\b)/", - "group": "9_sync@10" + "group": "9_configuration@10" } ] }, diff --git a/src/extension.ts b/src/extension.ts index 678597bb..adfc5557 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -15,9 +15,9 @@ import { EventCounter } from "./utility"; import { DependencyExplorer } from "./views/dependencyExplorer"; export async function activate(context: ExtensionContext): Promise { - await initExpService(context); contextManager.initialize(context); await initializeFromJsonFile(context.asAbsolutePath("./package.json"), { firstParty: true }); + await initExpService(context); await instrumentOperation("activation", activateExtension)(context); contextManager.setContextValue(Context.EXTENSION_ACTIVATED, true); contextManager.setContextValue(Context.SUPPORTED_BUILD_FILES, Build.FILE_NAMES); From 214680c999b207a57ec4b6d6746a4a7aef31c22f Mon Sep 17 00:00:00 2001 From: Sheng Chen Date: Wed, 7 Apr 2021 14:16:42 +0800 Subject: [PATCH 019/352] feat: Add metadata for unmanaged folder (#479) --- .../jdtls/ext/core/ProjectCommand.java | 2 +- .../jdtls/ext/core/model/PackageNode.java | 28 ++++++++++++------- src/views/projectNode.ts | 4 +++ test/suite/contextValue.test.ts | 16 ++++++++++- 4 files changed, 38 insertions(+), 12 deletions(-) diff --git a/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/ProjectCommand.java b/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/ProjectCommand.java index cc2a7b94..12c2899d 100644 --- a/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/ProjectCommand.java +++ b/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/ProjectCommand.java @@ -199,7 +199,7 @@ public static List getMainClasses(List arguments, IProgre } } } - IJavaSearchScope scope = SearchEngine.createJavaSearchScope(searchRoots.toArray(IJavaElement[]::new)); + IJavaSearchScope scope = SearchEngine.createJavaSearchScope(searchRoots.toArray(new IJavaElement[0])); SearchPattern pattern = SearchPattern.createPattern("main(String[]) void", IJavaSearchConstants.METHOD, IJavaSearchConstants.DECLARATIONS, SearchPattern.R_EXACT_MATCH | SearchPattern.R_CASE_SENSITIVE); SearchRequestor requestor = new SearchRequestor() { diff --git a/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/model/PackageNode.java b/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/model/PackageNode.java index 5797d9ae..9dbab874 100644 --- a/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/model/PackageNode.java +++ b/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/model/PackageNode.java @@ -12,6 +12,8 @@ package com.microsoft.jdtls.ext.core.model; import java.net.URI; +import java.util.ArrayList; +import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -43,13 +45,6 @@ */ public class PackageNode { - /** - * Nature Id for the IProject. - */ - private static final String NATURE_ID = "NatureId"; - - private static final String UNMANAGED_FOLDER_INNER_PATH = "UnmanagedFolderInnerPath"; - public static final String K_TYPE_KIND = "TypeKind"; /** @@ -67,15 +62,26 @@ public class PackageNode { */ public static final int K_ENUM = 3; + public static final String REFERENCED_LIBRARIES_PATH = "REFERENCED_LIBRARIES_PATH"; private static final String REFERENCED_LIBRARIES_CONTAINER_NAME = "Referenced Libraries"; private static final String IMMUTABLE_REFERENCED_LIBRARIES_CONTAINER_NAME = "Referenced Libraries (Read-only)"; - - public static final String REFERENCED_LIBRARIES_PATH = "REFERENCED_LIBRARIES_PATH"; public static final ContainerNode REFERENCED_LIBRARIES_CONTAINER = new ContainerNode(REFERENCED_LIBRARIES_CONTAINER_NAME, REFERENCED_LIBRARIES_PATH, NodeKind.CONTAINER, IClasspathEntry.CPE_CONTAINER); public static final ContainerNode IMMUTABLE_REFERENCED_LIBRARIES_CONTAINER = new ContainerNode(IMMUTABLE_REFERENCED_LIBRARIES_CONTAINER_NAME, REFERENCED_LIBRARIES_PATH, NodeKind.CONTAINER, IClasspathEntry.CPE_CONTAINER); + /** + * Nature Id for the IProject. + */ + private static final String NATURE_ID = "NatureId"; + + private static final String UNMANAGED_FOLDER_INNER_PATH = "UnmanagedFolderInnerPath"; + + /** + * Nature Id for the unmanaged folder. + */ + private static final String UNMANAGED_FOLDER_NATURE_ID = "org.eclipse.jdt.ls.core.unmanagedFolder"; + /** * The name of the PackageNode. */ @@ -158,10 +164,12 @@ public static PackageNode createNodeForProject(IJavaElement javaElement) { PackageNode projectNode = new PackageNode(proj.getName(), proj.getFullPath().toPortableString(), NodeKind.PROJECT); projectNode.setUri(ProjectUtils.getProjectRealFolder(proj).toFile().toURI().toString()); try { - projectNode.setMetaDataValue(NATURE_ID, proj.getDescription().getNatureIds()); + List natureIds = new ArrayList<>(Arrays.asList(proj.getDescription().getNatureIds())); if (!ProjectUtils.isVisibleProject(proj)) { + natureIds.add(UNMANAGED_FOLDER_NATURE_ID); projectNode.setMetaDataValue(UNMANAGED_FOLDER_INNER_PATH, proj.getLocationURI().toString()); } + projectNode.setMetaDataValue(NATURE_ID, natureIds); } catch (CoreException e) { // do nothing } diff --git a/src/views/projectNode.ts b/src/views/projectNode.ts index 703b00f3..52fd5b2c 100644 --- a/src/views/projectNode.ts +++ b/src/views/projectNode.ts @@ -152,6 +152,8 @@ function getProjectType(natureId: string): string { return ReadableNature.Maven; case NatureId.Gradle: return ReadableNature.Gradle; + case NatureId.UnmanagedFolder: + return ReadableNature.UnmanagedFolder; default: return ""; } @@ -160,12 +162,14 @@ function getProjectType(natureId: string): string { enum NatureId { Maven = "org.eclipse.m2e.core.maven2Nature", Gradle = "org.eclipse.buildship.core.gradleprojectnature", + UnmanagedFolder = "org.eclipse.jdt.ls.core.unmanagedFolder", Java = "org.eclipse.jdt.core.javanature", } enum ReadableNature { Maven = "maven", Gradle = "gradle", + UnmanagedFolder = "unmanagedFolder", Java = "java", } diff --git a/test/suite/contextValue.test.ts b/test/suite/contextValue.test.ts index 4befcc60..9fa1e1d5 100644 --- a/test/suite/contextValue.test.ts +++ b/test/suite/contextValue.test.ts @@ -28,6 +28,11 @@ suite("Context Value Tests", () => { assert.ok(/java:project(?=.*?\b\+java\b)(?=.*?\b\+gradle\b)(?=.*?\b\+uri\b)/.test((await gradleProject.getTreeItem()).contextValue || "")); }); + test("test unmanaged folder node", async function() { + assert.ok(/java:project(?=.*?\b\+java\b)(?=.*?\b\+unmanagedFolder\b)(?=.*?\b\+uri\b)/ + .test((await unmanagedFolder.getTreeItem()).contextValue || "")); + }); + test("test JRE container node", async function() { assert.ok(/java:container(?=.*?\b\+jre\b)(?=.*?\b\+uri\b)/.test((await jreContainer.getTreeItem()).contextValue || "")); }); @@ -70,7 +75,7 @@ suite("Context Value Tests", () => { assert.ok(/java:package(?=.*?\b\+source\b)(?=.*?\b\+uri\b)/.test((await sourcePackage.getTreeItem()).contextValue || "")); }); - test("test source package node", async function() { + test("test source(test) package node", async function() { assert.ok(/java:package(?=.*?\b\+source\b)(?=.*?\b\+test\b)(?=.*?\b\+uri\b)/ .test((await testSourcePackage.getTreeItem()).contextValue || "")); }); @@ -129,6 +134,15 @@ const gradleProject: ProjectNode = new ProjectNode({ }, }, workspace); +const unmanagedFolder: ProjectNode = new ProjectNode({ + name: "unmanagedFolder", + uri: Uri.file(__dirname).toString(), + kind: NodeKind.Project, + metaData: { + NatureId: ["org.eclipse.jdt.core.javanature", "org.eclipse.jdt.ls.core.unmanagedFolder"], + }, +}, workspace); + const jreContainer: ContainerNode = new ContainerNode({ name: "jreContainer", uri: Uri.file(__dirname).toString(), From 95dd25286260f6e87a79ce41579fb60ba11ba70d Mon Sep 17 00:00:00 2001 From: Sheng Chen Date: Thu, 8 Apr 2021 00:39:15 -0700 Subject: [PATCH 020/352] chore: Prepare for 0.18.3 (#482) --- CHANGELOG.md | 6 ++++++ .../com.microsoft.jdtls.ext.activator/META-INF/MANIFEST.MF | 2 +- jdtls.ext/com.microsoft.jdtls.ext.activator/pom.xml | 2 +- jdtls.ext/com.microsoft.jdtls.ext.core/META-INF/MANIFEST.MF | 2 +- jdtls.ext/com.microsoft.jdtls.ext.core/pom.xml | 2 +- jdtls.ext/pom.xml | 2 +- package-lock.json | 2 +- package.json | 4 ++-- webpack.config.js | 1 + 9 files changed, 15 insertions(+), 8 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index bf74e5a2..a9c54d48 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,12 @@ All notable changes to the "vscode-java-dependency" extension will be documented The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/) and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html). +## 0.18.3 +### Added +- Add new unmanaged folder metadata for the project node. [PR#479](https://github.com/microsoft/vscode-java-dependency/pull/479) +### Changed +- Rename sorting group `9_sync` to `9_configuration`. [PR#480](https://github.com/microsoft/vscode-java-dependency/pull/480) + ## 0.18.2 ### Changed diff --git a/jdtls.ext/com.microsoft.jdtls.ext.activator/META-INF/MANIFEST.MF b/jdtls.ext/com.microsoft.jdtls.ext.activator/META-INF/MANIFEST.MF index 9fe8f0f5..d35e3e4c 100644 --- a/jdtls.ext/com.microsoft.jdtls.ext.activator/META-INF/MANIFEST.MF +++ b/jdtls.ext/com.microsoft.jdtls.ext.activator/META-INF/MANIFEST.MF @@ -2,7 +2,7 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: JDTLS EXT Activator Bundle-SymbolicName: com.microsoft.jdtls.ext.activator;singleton:=true -Bundle-Version: 0.18.2 +Bundle-Version: 0.18.3 Bundle-Activator: com.microsoft.jdtls.ext.activator.JdtlsExtActivator Bundle-RequiredExecutionEnvironment: JavaSE-1.8 Import-Package: org.eclipse.jdt.core, diff --git a/jdtls.ext/com.microsoft.jdtls.ext.activator/pom.xml b/jdtls.ext/com.microsoft.jdtls.ext.activator/pom.xml index 8f253549..3bcf524a 100644 --- a/jdtls.ext/com.microsoft.jdtls.ext.activator/pom.xml +++ b/jdtls.ext/com.microsoft.jdtls.ext.activator/pom.xml @@ -5,7 +5,7 @@ com.microsoft.jdtls.ext jdtls-ext-parent - 0.18.2 + 0.18.3 com.microsoft.jdtls.ext.activator eclipse-plugin diff --git a/jdtls.ext/com.microsoft.jdtls.ext.core/META-INF/MANIFEST.MF b/jdtls.ext/com.microsoft.jdtls.ext.core/META-INF/MANIFEST.MF index 2a432fd4..3e389be2 100644 --- a/jdtls.ext/com.microsoft.jdtls.ext.core/META-INF/MANIFEST.MF +++ b/jdtls.ext/com.microsoft.jdtls.ext.core/META-INF/MANIFEST.MF @@ -2,7 +2,7 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: JDTLS EXT Core Bundle-SymbolicName: com.microsoft.jdtls.ext.core;singleton:=true -Bundle-Version: 0.18.2 +Bundle-Version: 0.18.3 Bundle-Activator: com.microsoft.jdtls.ext.core.JdtlsExtActivator Bundle-RequiredExecutionEnvironment: JavaSE-1.8 Bundle-ActivationPolicy: lazy diff --git a/jdtls.ext/com.microsoft.jdtls.ext.core/pom.xml b/jdtls.ext/com.microsoft.jdtls.ext.core/pom.xml index 2225049d..17b26881 100644 --- a/jdtls.ext/com.microsoft.jdtls.ext.core/pom.xml +++ b/jdtls.ext/com.microsoft.jdtls.ext.core/pom.xml @@ -5,7 +5,7 @@ com.microsoft.jdtls.ext jdtls-ext-parent - 0.18.2 + 0.18.3 com.microsoft.jdtls.ext.core eclipse-plugin diff --git a/jdtls.ext/pom.xml b/jdtls.ext/pom.xml index eea07a19..790d02a9 100644 --- a/jdtls.ext/pom.xml +++ b/jdtls.ext/pom.xml @@ -4,7 +4,7 @@ com.microsoft.jdtls.ext jdtls-ext-parent ${base.name} :: Parent - 0.18.2 + 0.18.3 pom Java Project Manager diff --git a/package-lock.json b/package-lock.json index 84ad32c0..b6bc1d1d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "vscode-java-dependency", - "version": "0.18.2", + "version": "0.18.3", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index b25b1b4e..7683e430 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "vscode-java-dependency", "displayName": "Project Manager for Java", "description": "%description%", - "version": "0.18.2", + "version": "0.18.3", "publisher": "vscjava", "preview": true, "aiKey": "5c642b22-e845-4400-badb-3f8509a70777", @@ -31,7 +31,7 @@ "main": "./main.js", "contributes": { "javaExtensions": [ - "./server/com.microsoft.jdtls.ext.core-0.18.2.jar" + "./server/com.microsoft.jdtls.ext.core-0.18.3.jar" ], "commands": [ { diff --git a/webpack.config.js b/webpack.config.js index 906445e3..8c079ea0 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -25,6 +25,7 @@ const config = { }, plugins: [ // Copy files to dist folder where the runtime can find them + // @ts-ignore new CopyWebpackPlugin({ patterns: [ { From 9fc5bf3e0a690789b16f720b1b93c44c3cd1a78a Mon Sep 17 00:00:00 2001 From: Sheng Chen Date: Thu, 15 Apr 2021 20:01:33 -0700 Subject: [PATCH 021/352] fix: Save the workspace before exporting jar (#483) --- src/exportJarSteps/ExportJarTaskProvider.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/exportJarSteps/ExportJarTaskProvider.ts b/src/exportJarSteps/ExportJarTaskProvider.ts index 4bd8708a..1074535e 100644 --- a/src/exportJarSteps/ExportJarTaskProvider.ts +++ b/src/exportJarSteps/ExportJarTaskProvider.ts @@ -35,6 +35,9 @@ interface IExportJarTaskDefinition extends TaskDefinition { let isExportingJar: boolean = false; export async function executeExportJarTask(node?: INodeData): Promise { + // save the workspace first + await workspace.saveAll(false /*includeUntitled*/); + if (!await languageServerApiManager.isStandardServerReady() || isExportingJar || await buildWorkspace() === false) { return; } From 341ac5ba6c83da5288973ec63acc74cee678c18d Mon Sep 17 00:00:00 2001 From: Sheng Chen Date: Fri, 23 Apr 2021 02:18:47 -0700 Subject: [PATCH 022/352] bugfix: Data tree node not found (#484) --- package-lock.json | 5 ++ package.json | 1 + .../languageServerApiManager.ts | 21 ++++++-- src/utility.ts | 2 + src/utils/Lock.ts | 35 +------------ src/views/dataNode.ts | 8 ++- src/views/dependencyDataProvider.ts | 16 ++---- src/views/dependencyExplorer.ts | 49 ++++++++----------- src/views/hierarchicalPackageNode.ts | 5 +- 9 files changed, 59 insertions(+), 83 deletions(-) diff --git a/package-lock.json b/package-lock.json index b6bc1d1d..b6952dc9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -868,6 +868,11 @@ "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", "dev": true }, + "await-lock": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/await-lock/-/await-lock-2.1.0.tgz", + "integrity": "sha512-t7Zm5YGgEEc/3eYAicF32m/TNvL+XOeYZy9CvBUeJY/szM7frLolFylhrlZNWV/ohWhcUXygrBGjYmoQdxF4CQ==" + }, "axios": { "version": "0.21.1", "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.1.tgz", diff --git a/package.json b/package.json index 7683e430..5d98fc08 100644 --- a/package.json +++ b/package.json @@ -602,6 +602,7 @@ "webpack-cli": "^3.3.12" }, "dependencies": { + "await-lock": "^2.1.0", "fs-extra": "^7.0.1", "globby": "11.0.1", "lodash": "^4.17.21", diff --git a/src/languageServerApi/languageServerApiManager.ts b/src/languageServerApi/languageServerApiManager.ts index 90bc2fe5..8837a22f 100644 --- a/src/languageServerApi/languageServerApiManager.ts +++ b/src/languageServerApi/languageServerApiManager.ts @@ -28,9 +28,13 @@ class LanguageServerApiManager { return this.serverMode === LanguageServerMode.LightWeight; } - public async isSwitchingServer(): Promise { + public async awaitSwitchingServerFinished(): Promise { await this.checkServerMode(); - return this.serverMode === LanguageServerMode.Hybrid; + if (this.serverMode === LanguageServerMode.Hybrid) { + await new Promise((resolve: () => void): void => { + extensions.getExtension("redhat.java")!.exports.onDidServerModeChange(resolve); + }); + } } private async checkServerMode(): Promise { @@ -63,8 +67,17 @@ class LanguageServerApiManager { if (extensionApi.onDidServerModeChange) { const onDidServerModeChange: Event = extensionApi.onDidServerModeChange; contextManager.context.subscriptions.push(onDidServerModeChange(async (mode: LanguageServerMode) => { - this.serverMode = mode; - commands.executeCommand(Commands.VIEW_PACKAGE_REFRESH, /* debounce = */false); + if (this.serverMode !== mode) { + let needRefresh: boolean = true; + if (this.serverMode === "Hybrid") { + // Explorer will await when JLS is in Hybrid mode (activating), + needRefresh = false; + } + this.serverMode = mode; + if (needRefresh) { + commands.executeCommand(Commands.VIEW_PACKAGE_REFRESH, /* debounce = */false); + } + } })); } diff --git a/src/utility.ts b/src/utility.ts index e3202ab3..b0e368ff 100644 --- a/src/utility.ts +++ b/src/utility.ts @@ -30,6 +30,8 @@ export class Utility { if (uri.scheme === "file" && !workspace.getWorkspaceFolder(uri)) { return false; } + + await languageServerApiManager.awaitSwitchingServerFinished(); if (!await languageServerApiManager.isStandardServerReady()) { return false; } diff --git a/src/utils/Lock.ts b/src/utils/Lock.ts index 62c1691a..9869fa98 100644 --- a/src/utils/Lock.ts +++ b/src/utils/Lock.ts @@ -1,37 +1,6 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT license. -import { EventEmitter } from "events"; +import AwaitLock from "await-lock"; -export class Lock { - private _locked: boolean; - private _eventEmitter: EventEmitter; - - constructor() { - this._locked = false; - this._eventEmitter = new EventEmitter(); - } - - public async acquire(): Promise { - return new Promise((resolve) => { - if (!this._locked) { - this._locked = true; - return resolve(); - } - - const tryAcquire = () => { - if (!this._locked) { - this._locked = true; - this._eventEmitter.removeListener("release", tryAcquire); - return resolve(); - } - }; - this._eventEmitter.on("release", tryAcquire); - }); - } - - public release(): void { - this._locked = false; - setImmediate(() => this._eventEmitter.emit("release")); - } -} +export const explorerLock: AwaitLock = new AwaitLock(); diff --git a/src/views/dataNode.ts b/src/views/dataNode.ts index 54dbd5ef..699d7352 100644 --- a/src/views/dataNode.ts +++ b/src/views/dataNode.ts @@ -4,15 +4,13 @@ import * as _ from "lodash"; import { ThemeIcon, TreeItem, TreeItemCollapsibleState, Uri } from "vscode"; import { INodeData, NodeKind } from "../java/nodeData"; -import { Lock } from "../utils/Lock"; +import { explorerLock } from "../utils/Lock"; import { ExplorerNode } from "./explorerNode"; export abstract class DataNode extends ExplorerNode { protected _childrenNodes: ExplorerNode[]; - protected _lock: Lock = new Lock(); - constructor(protected _nodeData: INodeData, parent?: DataNode) { super(parent); } @@ -74,7 +72,7 @@ export abstract class DataNode extends ExplorerNode { public async getChildren(): Promise { try { - await this._lock.acquire(); + await explorerLock.acquireAsync(); if (!this._nodeData.children) { const data = await this.loadData(); this._nodeData.children = data; @@ -83,7 +81,7 @@ export abstract class DataNode extends ExplorerNode { } return this._childrenNodes; } finally { - this._lock.release(); + explorerLock.release(); } } diff --git a/src/views/dependencyDataProvider.ts b/src/views/dependencyDataProvider.ts index aebc3c27..1afd19db 100644 --- a/src/views/dependencyDataProvider.ts +++ b/src/views/dependencyDataProvider.ts @@ -3,7 +3,7 @@ import * as _ from "lodash"; import { - commands, Event, EventEmitter, ExtensionContext, extensions, ProviderResult, + commands, Event, EventEmitter, ExtensionContext, ProviderResult, RelativePattern, TreeDataProvider, TreeItem, Uri, window, workspace, } from "vscode"; import { instrumentOperation, instrumentOperationAsVsCodeCommand } from "vscode-extension-telemetry-wrapper"; @@ -15,7 +15,7 @@ import { Jdtls } from "../java/jdtls"; import { INodeData, NodeKind } from "../java/nodeData"; import { languageServerApiManager } from "../languageServerApi/languageServerApiManager"; import { Settings } from "../settings"; -import { Lock } from "../utils/Lock"; +import { explorerLock } from "../utils/Lock"; import { DataNode } from "./dataNode"; import { ExplorerNode } from "./explorerNode"; import { explorerNodeCache } from "./nodeCache/explorerNodeCache"; @@ -26,8 +26,6 @@ export class DependencyDataProvider implements TreeDataProvider { private _onDidChangeTreeData: EventEmitter = new EventEmitter(); - private _lock: Lock = new Lock(); - // tslint:disable-next-line:member-ordering public onDidChangeTreeData: Event = this._onDidChangeTreeData.event; @@ -100,11 +98,7 @@ export class DependencyDataProvider implements TreeDataProvider { return []; } - if (await languageServerApiManager.isSwitchingServer()) { - await new Promise((resolve: () => void): void => { - extensions.getExtension("redhat.java")!.exports.onDidServerModeChange(resolve); - }); - } + await languageServerApiManager.awaitSwitchingServerFinished(); const children = (!this._rootItems || !element) ? await this.getRootNodes() : await element.getChildren(); @@ -151,7 +145,7 @@ export class DependencyDataProvider implements TreeDataProvider { private async getRootNodes(): Promise { try { - await this._lock.acquire(); + await explorerLock.acquireAsync(); if (this._rootItems) { return this._rootItems; @@ -178,7 +172,7 @@ export class DependencyDataProvider implements TreeDataProvider { contextManager.setContextValue(Context.NO_JAVA_PEOJECT, _.isEmpty(rootItems)); return rootItems; } finally { - this._lock.release(); + explorerLock.release(); } } } diff --git a/src/views/dependencyExplorer.ts b/src/views/dependencyExplorer.ts index 1adc5107..e28e4576 100644 --- a/src/views/dependencyExplorer.ts +++ b/src/views/dependencyExplorer.ts @@ -4,8 +4,10 @@ import * as fse from "fs-extra"; import * as _ from "lodash"; import * as path from "path"; -import { commands, Disposable, ExtensionContext, QuickPickItem, TextEditor, TreeView, - TreeViewExpansionEvent, TreeViewSelectionChangeEvent, TreeViewVisibilityChangeEvent, Uri, window } from "vscode"; +import { + commands, Disposable, ExtensionContext, QuickPickItem, TextEditor, TreeView, + TreeViewExpansionEvent, TreeViewSelectionChangeEvent, TreeViewVisibilityChangeEvent, Uri, window, +} from "vscode"; import { instrumentOperationAsVsCodeCommand, sendInfo } from "vscode-extension-telemetry-wrapper"; import { Commands } from "../commands"; import { Build } from "../constants"; @@ -17,7 +19,6 @@ import { Jdtls } from "../java/jdtls"; import { INodeData } from "../java/nodeData"; import { Settings } from "../settings"; import { EventCounter, Utility } from "../utility"; -import { Lock } from "../utils/Lock"; import { DataNode } from "./dataNode"; import { DependencyDataProvider } from "./dependencyDataProvider"; import { ExplorerNode } from "./explorerNode"; @@ -34,8 +35,6 @@ export class DependencyExplorer implements Disposable { private static _instance: DependencyExplorer; - private _lock: Lock = new Lock(); - private _dependencyViewer: TreeView; private _dataProvider: DependencyDataProvider; @@ -54,7 +53,7 @@ export class DependencyExplorer implements Disposable { }), this._dependencyViewer.onDidChangeVisibility((e: TreeViewVisibilityChangeEvent) => { if (e.visible) { - sendInfo("", {projectManagerVisible: 1}); + sendInfo("", { projectManagerVisible: 1 }); if (window.activeTextEditor) { this.reveal(window.activeTextEditor.document.uri); } @@ -145,33 +144,27 @@ export class DependencyExplorer implements Disposable { } public async reveal(uri: Uri, needCheckSyncSetting: boolean = true): Promise { - try { - await this._lock.acquire(); - - if (needCheckSyncSetting && !Settings.syncWithFolderExplorer()) { - return; - } - - if (!await Utility.isRevealable(uri)) { - return; - } + if (needCheckSyncSetting && !Settings.syncWithFolderExplorer()) { + return; + } - let node: DataNode | undefined = explorerNodeCache.getDataNode(uri); - if (!node) { - const paths: INodeData[] = await Jdtls.resolvePath(uri.toString()); - if (!_.isEmpty(paths)) { - node = await this._dataProvider.revealPaths(paths); - } - } + if (!await Utility.isRevealable(uri)) { + return; + } - if (!node) { - return; + let node: DataNode | undefined = explorerNodeCache.getDataNode(uri); + if (!node) { + const paths: INodeData[] = await Jdtls.resolvePath(uri.toString()); + if (!_.isEmpty(paths)) { + node = await this._dataProvider.revealPaths(paths); } + } - await this._dependencyViewer.reveal(node); - } finally { - this._lock.release(); + if (!node) { + return; } + + await this._dependencyViewer.reveal(node); } public get dataProvider(): DependencyDataProvider { diff --git a/src/views/hierarchicalPackageNode.ts b/src/views/hierarchicalPackageNode.ts index e187999c..3364f7ff 100644 --- a/src/views/hierarchicalPackageNode.ts +++ b/src/views/hierarchicalPackageNode.ts @@ -5,6 +5,7 @@ import * as _ from "lodash"; import { TreeItem, TreeItemCollapsibleState } from "vscode"; import { HierarchicalPackageNodeData } from "../java/hierarchicalPackageNodeData"; import { INodeData, NodeKind } from "../java/nodeData"; +import { explorerLock } from "../utils/Lock"; import { DataNode } from "./dataNode"; import { ExplorerNode } from "./explorerNode"; import { FileNode } from "./fileNode"; @@ -26,7 +27,7 @@ export class HierarchicalPackageNode extends PackageNode { public async getChildren(): Promise { try { - await this._lock.acquire(); + await explorerLock.acquireAsync(); const data = await this.loadData(); if (data) { if (this.nodeData?.children) { @@ -38,7 +39,7 @@ export class HierarchicalPackageNode extends PackageNode { } return this.createChildNodeList(); } finally { - this._lock.release(); + explorerLock.release(); } } From 27c306b770c23b1eba1f9a7c3e70d2793baced68 Mon Sep 17 00:00:00 2001 From: Sheng Chen Date: Sun, 25 Apr 2021 21:40:13 -0700 Subject: [PATCH 023/352] test: Add unit tests for exporting jar (#485) --- test/gradle/.vscode/settings.json | 3 +- test/maven-suite/exportJar.test.ts | 53 ++++++++++++++++++++++++++++++ test/maven/.vscode/tasks.json | 16 +++++++++ 3 files changed, 71 insertions(+), 1 deletion(-) create mode 100644 test/maven-suite/exportJar.test.ts create mode 100644 test/maven/.vscode/tasks.json diff --git a/test/gradle/.vscode/settings.json b/test/gradle/.vscode/settings.json index 66e66c61..7766fde9 100644 --- a/test/gradle/.vscode/settings.json +++ b/test/gradle/.vscode/settings.json @@ -1,3 +1,4 @@ { - "java.server.launchMode": "Standard" + "java.server.launchMode": "Standard", + "java.import.gradle.version": "6.8" } diff --git a/test/maven-suite/exportJar.test.ts b/test/maven-suite/exportJar.test.ts new file mode 100644 index 00000000..b81b4df2 --- /dev/null +++ b/test/maven-suite/exportJar.test.ts @@ -0,0 +1,53 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT license. + +import * as assert from "assert"; +import * as cp from "child_process"; +import * as fse from "fs-extra"; +import { suiteTeardown } from "mocha"; +import * as path from "path"; +import { Task, TaskEndEvent, tasks, workspace } from "vscode"; +import { setupTestEnv } from "../shared"; + +// tslint:disable: only-arrow-functions +const folderPath: string = workspace.workspaceFolders![0].uri.fsPath; +const jarFileName: string = "maven.jar"; +const testFolder: string = path.join(folderPath, "test"); + +suite("Export Jar Tests", () => { + + suiteSetup(setupTestEnv); + + test("Can export jar correctly", async function() { + const vscodeTasks: Task[] = await tasks.fetchTasks(); + const exportJarTask: Task | undefined = vscodeTasks.find((t: Task) => t.name === "java: exportjar:maven"); + assert.ok(exportJarTask !== undefined); + + await new Promise(async (resolve) => { + tasks.onDidEndTask((e: TaskEndEvent) => { + if (e.execution.task.name === exportJarTask?.name) { + return resolve(); + } + }); + await tasks.executeTask(exportJarTask!); + }); + + const isFileExist: boolean = await fse.pathExists(path.join(folderPath, jarFileName)); + assert.ok(isFileExist); + + await fse.ensureDir(testFolder); + cp.execSync("jar -xvf ../maven.jar", { + cwd: testFolder, + }); + + const isManifestExist: boolean = await fse.pathExists(path.join(testFolder, "META-INF", "MANIFEST.MF")); + assert.ok(isManifestExist); + const isClassFileExist: boolean = await fse.pathExists(path.join(testFolder, "com", "mycompany", "app", "App.class")); + assert.ok(isClassFileExist); + }); + + suiteTeardown(async function() { + await fse.remove(path.join(folderPath, jarFileName)); + await fse.remove(testFolder); + }); +}); diff --git a/test/maven/.vscode/tasks.json b/test/maven/.vscode/tasks.json new file mode 100644 index 00000000..a26671f3 --- /dev/null +++ b/test/maven/.vscode/tasks.json @@ -0,0 +1,16 @@ +{ + "version": "2.0.0", + "tasks": [ + { + "type": "java", + "label": "java: exportjar:maven", + "mainClass": "com.mycompany.app.App", + "targetPath": "${workspaceFolder}/${workspaceFolderBasename}.jar", + "elements": [ + "${compileOutput}", + "${dependencies}" + ], + "problemMatcher": [] + } + ] +} From f39c6913367860a89c61dbe9c35014f4e43fe8b9 Mon Sep 17 00:00:00 2001 From: Yan Zhang Date: Thu, 29 Apr 2021 16:06:53 +0800 Subject: [PATCH 024/352] adopt workspaceTrust in package.json (#486) --- package.json | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/package.json b/package.json index 5d98fc08..e1fd95f6 100644 --- a/package.json +++ b/package.json @@ -20,6 +20,10 @@ }, "homepage": "https://github.com/Microsoft/vscode-java-dependency/blob/master/README.md", "icon": "logo.png", + "workspaceTrust": { + "request": "onDemand", + "description": "Extension may require your trust on workspace for code execution." + }, "activationEvents": [ "onCommand:_java.project.open", "onCommand:java.project.create", From 23e2b31b70b45c4494ece69efbc20cfc5cb338e6 Mon Sep 17 00:00:00 2001 From: Sheng Chen Date: Thu, 29 Apr 2021 01:41:40 -0700 Subject: [PATCH 025/352] chore: Rename branch to main in CI pipeline (#488) --- .github/workflows/build.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index f0907b41..ca46a8dc 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -2,9 +2,9 @@ name: CI on: push: - branches: [ master ] + branches: [ main ] pull_request: - branches: [ master ] + branches: [ main ] jobs: linux: From c2a1a74fe245daefb25815196dfeb1cc39184c25 Mon Sep 17 00:00:00 2001 From: Yan Zhang Date: Wed, 12 May 2021 14:27:13 +0800 Subject: [PATCH 026/352] disable extension in virtual workspaces (#492) --- package.json | 3 +++ 1 file changed, 3 insertions(+) diff --git a/package.json b/package.json index e1fd95f6..a6dff76a 100644 --- a/package.json +++ b/package.json @@ -24,6 +24,9 @@ "request": "onDemand", "description": "Extension may require your trust on workspace for code execution." }, + "capabilities": { + "virtualWorkspaces": false + }, "activationEvents": [ "onCommand:_java.project.open", "onCommand:java.project.create", From ca75d1161e4c667624f16eb2ef9d6a9527511248 Mon Sep 17 00:00:00 2001 From: Shi Chen Date: Wed, 19 May 2021 09:39:01 +0800 Subject: [PATCH 027/352] fix: "Cancel" of generating jar takes no effect (#497) --- .../src/com/microsoft/jdtls/ext/core/ProjectCommand.java | 6 ++++++ src/exportJarSteps/GenerateJarExecutor.ts | 2 +- src/java/jdtls.ts | 7 ++++--- 3 files changed, 11 insertions(+), 4 deletions(-) diff --git a/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/ProjectCommand.java b/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/ProjectCommand.java index 12c2899d..f510d290 100644 --- a/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/ProjectCommand.java +++ b/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/ProjectCommand.java @@ -155,6 +155,9 @@ public static ExportResult exportJar(List arguments, IProgressMonitor mo if (arguments.size() < 3) { return new ExportResult(false, "Invalid export Arguments"); } + if (monitor.isCanceled()) { + return new ExportResult(false, "User cancelled"); + } String mainClass = gson.fromJson(gson.toJson(arguments.get(0)), String.class); Classpath[] classpaths = gson.fromJson(gson.toJson(arguments.get(1)), Classpath[].class); String destination = gson.fromJson(gson.toJson(arguments.get(2)), String.class); @@ -166,6 +169,9 @@ public static ExportResult exportJar(List arguments, IProgressMonitor mo try (JarOutputStream target = new JarOutputStream(new FileOutputStream(destination), manifest)) { Set directories = new HashSet<>(); for (Classpath classpath : classpaths) { + if (monitor.isCanceled()) { + return new ExportResult(false, "User cancelled"); + } if (classpath.isArtifact) { writeArchive(new ZipFile(classpath.source), /* areDirectoryEntriesIncluded = */true, /* isCompressed = */true, target, directories, monitor); diff --git a/src/exportJarSteps/GenerateJarExecutor.ts b/src/exportJarSteps/GenerateJarExecutor.ts index 078fd495..09d5d8e4 100644 --- a/src/exportJarSteps/GenerateJarExecutor.ts +++ b/src/exportJarSteps/GenerateJarExecutor.ts @@ -82,7 +82,7 @@ export class GenerateJarExecutor implements IExportJarStepExecutor { if (_.isEmpty(classpaths)) { return reject(new Error(ExportJarMessages.CLASSPATHS_EMPTY)); } - const exportResult: IExportResult | undefined = await Jdtls.exportJar(basename(mainClass), classpaths, destPath); + const exportResult: IExportResult | undefined = await Jdtls.exportJar(basename(mainClass), classpaths, destPath, token); if (exportResult?.result === true) { stepMetadata.outputPath = destPath; return resolve(true); diff --git a/src/java/jdtls.ts b/src/java/jdtls.ts index 37e4b9d4..ada3b6fb 100644 --- a/src/java/jdtls.ts +++ b/src/java/jdtls.ts @@ -1,7 +1,7 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT license. -import { commands } from "vscode"; +import { CancellationToken, commands } from "vscode"; import { Commands, executeJavaLanguageServerCommand } from "../commands"; import { IExportResult } from "../exportJarSteps/GenerateJarExecutor"; import { IClasspath } from "../exportJarSteps/IStepMetadata"; @@ -29,9 +29,10 @@ export namespace Jdtls { return await commands.executeCommand(Commands.EXECUTE_WORKSPACE_COMMAND, Commands.JAVA_PROJECT_GETMAINCLASSES, params) || []; } - export async function exportJar(mainClass: string, classpaths: IClasspath[], destination: string): Promise { + export async function exportJar(mainClass: string, classpaths: IClasspath[], + destination: string, token: CancellationToken): Promise { return commands.executeCommand(Commands.EXECUTE_WORKSPACE_COMMAND, Commands.JAVA_PROJECT_GENERATEJAR, - mainClass, classpaths, destination); + mainClass, classpaths, destination, token); } export enum CompileWorkspaceStatus { From 508b9a54f2bbdc2e4ae5c46d763618bdecd05094 Mon Sep 17 00:00:00 2001 From: Shi Chen Date: Fri, 21 May 2021 09:32:02 +0800 Subject: [PATCH 028/352] feat: Report messages when exporting jar (#499) * report message --- .../jdtls/ext/core/ProjectCommand.java | 83 ++++++++++++------- src/commands.ts | 2 + src/exportJarSteps/ExportJarTaskProvider.ts | 23 +++-- src/exportJarSteps/GenerateJarExecutor.ts | 16 ++-- src/exportJarSteps/IStepMetadata.ts | 1 + src/exportJarSteps/utility.ts | 16 ++++ src/java/jdtls.ts | 7 +- src/views/dependencyDataProvider.ts | 4 + 8 files changed, 101 insertions(+), 51 deletions(-) diff --git a/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/ProjectCommand.java b/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/ProjectCommand.java index f510d290..cb3fcdda 100644 --- a/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/ProjectCommand.java +++ b/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/ProjectCommand.java @@ -29,6 +29,7 @@ import java.util.zip.ZipFile; import org.apache.commons.io.FilenameUtils; +import org.apache.commons.lang3.StringUtils; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IWorkspaceRoot; @@ -36,6 +37,8 @@ import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.core.runtime.IStatus; +import org.eclipse.core.runtime.MultiStatus; import org.eclipse.core.runtime.NullProgressMonitor; import org.eclipse.core.runtime.Path; import org.eclipse.jdt.core.IJavaElement; @@ -67,6 +70,8 @@ public final class ProjectCommand { + private static String COMMAND_EXPORT_JAR_REPORT = "java.view.package.exportJarReport"; + private static class MainClassInfo { public String name; public String path; @@ -83,23 +88,6 @@ private static class Classpath { public boolean isArtifact; } - private static class ExportResult { - public boolean result; - public String message; - public String log; - - ExportResult(boolean result) { - this.result = result; - this.log = ""; - } - - ExportResult(boolean result, String message) { - this.result = result; - this.message = message; - this.log = ""; - } - } - private static final Gson gson = new GsonBuilder().registerTypeAdapterFactory(new CollectionTypeAdapter.Factory()) .registerTypeAdapterFactory(new EnumTypeAdapter.Factory()).create(); @@ -151,16 +139,14 @@ private static IWorkspaceRoot getWorkspaceRoot() { return ResourcesPlugin.getWorkspace().getRoot(); } - public static ExportResult exportJar(List arguments, IProgressMonitor monitor) { - if (arguments.size() < 3) { - return new ExportResult(false, "Invalid export Arguments"); - } - if (monitor.isCanceled()) { - return new ExportResult(false, "User cancelled"); + public static boolean exportJar(List arguments, IProgressMonitor monitor) { + if (arguments.size() < 4) { + return false; } String mainClass = gson.fromJson(gson.toJson(arguments.get(0)), String.class); Classpath[] classpaths = gson.fromJson(gson.toJson(arguments.get(1)), Classpath[].class); String destination = gson.fromJson(gson.toJson(arguments.get(2)), String.class); + String taskLabel = gson.fromJson(gson.toJson(arguments.get(3)), String.class); Manifest manifest = new Manifest(); manifest.getMainAttributes().put(Attributes.Name.MANIFEST_VERSION, "1.0"); if (mainClass.length() > 0) { @@ -170,24 +156,39 @@ public static ExportResult exportJar(List arguments, IProgressMonitor mo Set directories = new HashSet<>(); for (Classpath classpath : classpaths) { if (monitor.isCanceled()) { - return new ExportResult(false, "User cancelled"); + return false; } if (classpath.isArtifact) { - writeArchive(new ZipFile(classpath.source), /* areDirectoryEntriesIncluded = */true, - /* isCompressed = */true, target, directories, monitor); + MultiStatus resultStatus = writeArchive(new ZipFile(classpath.source), + /* areDirectoryEntriesIncluded = */true, /* isCompressed = */true, target, directories, monitor); + int severity = resultStatus.getSeverity(); + if (severity == IStatus.OK) { + java.nio.file.Path path = java.nio.file.Paths.get(classpath.source); + reportExportJarMessage(taskLabel, IStatus.OK, "Successfully added the file to the exported jar: " + path.getFileName().toString()); + continue; + } + if (resultStatus.isMultiStatus()) { + for (IStatus childStatus : resultStatus.getChildren()) { + reportExportJarMessage(taskLabel, severity, childStatus.getMessage()); + } + } else { + reportExportJarMessage(taskLabel, severity, resultStatus.getMessage()); + } } else { try { writeFile(new File(classpath.source), new Path(classpath.destination), /* areDirectoryEntriesIncluded = */true, /* isCompressed = */true, target, directories); + reportExportJarMessage(taskLabel, IStatus.OK, "Successfully added the file to the exported jar: " + classpath.destination); } catch (CoreException e) { - // TODO: Collect reports + reportExportJarMessage(taskLabel, IStatus.ERROR, e.getMessage()); } } } } catch (IOException e) { - return new ExportResult(false, e.getMessage()); + reportExportJarMessage(taskLabel, IStatus.ERROR, e.getMessage()); + return false; } - return new ExportResult(true); + return true; } public static List getMainClasses(List arguments, IProgressMonitor monitor) throws Exception { @@ -253,4 +254,28 @@ public static String getModuleName(IJavaProject project) { } } + private static void reportExportJarMessage(String taskLabel, int severity, String message) { + if (StringUtils.isNotBlank(message) && StringUtils.isNotBlank(taskLabel)) { + String readableSeverity = getSeverityString(severity); + JavaLanguageServerPlugin.getInstance().getClientConnection().executeClientCommand(COMMAND_EXPORT_JAR_REPORT, + taskLabel, "[" + readableSeverity + "] " + message); + } + } + + private static String getSeverityString(int severity) { + switch (severity) { + case IStatus.INFO: + return "INFO"; + case IStatus.WARNING: + return "WARNING"; + case IStatus.ERROR: + return "ERROR"; + case IStatus.CANCEL: + return "CANCEL"; + case IStatus.OK: + return "OK"; + default: + return "UNKNOWN STATUS"; + } + } } diff --git a/src/commands.ts b/src/commands.ts index 6f2c7fe4..d9ccbc17 100644 --- a/src/commands.ts +++ b/src/commands.ts @@ -30,6 +30,8 @@ export namespace Commands { export const VIEW_PACKAGE_EXPORT_JAR = "java.view.package.exportJar"; + export const EXPORT_JAR_REPORT = "java.view.package.exportJarReport"; + export const VIEW_PACKAGE_NEW_JAVA_CLASS = "java.view.package.newJavaClass"; export const VIEW_PACKAGE_NEW_JAVA_PACKAGE = "java.view.package.newPackage"; diff --git a/src/exportJarSteps/ExportJarTaskProvider.ts b/src/exportJarSteps/ExportJarTaskProvider.ts index 1074535e..669fdc92 100644 --- a/src/exportJarSteps/ExportJarTaskProvider.ts +++ b/src/exportJarSteps/ExportJarTaskProvider.ts @@ -4,7 +4,7 @@ import { lstat } from "fs-extra"; import * as globby from "globby"; import * as _ from "lodash"; -import { platform } from "os"; +import { EOL, platform } from "os"; import { dirname, extname, isAbsolute, join, relative } from "path"; import { CustomExecution, Event, EventEmitter, Pseudoterminal, Task, TaskDefinition, @@ -44,6 +44,7 @@ export async function executeExportJarTask(node?: INodeData): Promise { isExportingJar = true; const stepMetadata: IStepMetadata = { entry: node, + taskLabel: "exportjar:default", steps: [], projectList: [], elements: [], @@ -55,7 +56,7 @@ export async function executeExportJarTask(node?: INodeData): Promise { throw new Error(ExportJarMessages.stepErrorMessage(ExportJarMessages.StepAction.FINDEXECUTOR, ExportJarStep.ResolveJavaProject)); } await resolveJavaProjectExecutor.execute(stepMetadata); - tasks.executeTask(ExportJarTaskProvider.getTask(stepMetadata)); + tasks.executeTask(ExportJarTaskProvider.getDefaultTask(stepMetadata)); } catch (err) { if (err) { failMessage(`${err}`); @@ -68,13 +69,13 @@ export class ExportJarTaskProvider implements TaskProvider { public static exportJarType: string = "java"; - public static getTask(stepMetadata: IStepMetadata): Task { + public static getDefaultTask(stepMetadata: IStepMetadata): Task { if (!stepMetadata.workspaceFolder) { throw new Error(ExportJarMessages.fieldUndefinedMessage(ExportJarMessages.Field.WORKSPACEFOLDER, ExportJarStep.ResolveTask)); } const defaultDefinition: IExportJarTaskDefinition = { type: ExportJarTaskProvider.exportJarType, - label: `${ExportJarTaskProvider.exportJarType}: exportjar:default`, + label: "exportjar:default", targetPath: Settings.getExportJarTargetPath(), elements: [], mainClass: undefined, @@ -93,9 +94,10 @@ export class ExportJarTaskProvider implements TaskProvider { const definition: IExportJarTaskDefinition = task.definition; const folder: WorkspaceFolder = task.scope; const resolvedTask: Task = new Task(definition, folder, task.name, ExportJarTaskProvider.exportJarType, - new CustomExecution(async (resolvedDefinition: TaskDefinition): Promise => { + new CustomExecution(async (resolvedDefinition: IExportJarTaskDefinition): Promise => { const stepMetadata: IStepMetadata = { entry: undefined, + taskLabel: resolvedDefinition.label || `exportjar:${folder.name}`, workspaceFolder: folder, projectList: await Jdtls.getProjects(folder.uri.toString()), steps: [], @@ -134,15 +136,15 @@ export class ExportJarTaskProvider implements TaskProvider { const mainClasses: IMainClassInfo[] = await Jdtls.getMainClasses(folder.uri.toString()); const defaultDefinition: IExportJarTaskDefinition = { type: ExportJarTaskProvider.exportJarType, - label: `${ExportJarTaskProvider.exportJarType}: exportjar:${folder.name}`, mainClass: (mainClasses.length === 1) ? mainClasses[0].name : undefined, targetPath: Settings.getExportJarTargetPath(), elements: elementList, }; - const defaultTask: Task = new Task(defaultDefinition, folder, `exportjar:${folder.name}`, - ExportJarTaskProvider.exportJarType, new CustomExecution(async (resolvedDefinition: TaskDefinition): Promise => { + const defaultTask: Task = new Task(defaultDefinition, folder, `exportjar:${folder.name}`, ExportJarTaskProvider.exportJarType, + new CustomExecution(async (resolvedDefinition: IExportJarTaskDefinition): Promise => { const stepMetadata: IStepMetadata = { entry: undefined, + taskLabel: resolvedDefinition.label || `exportjar:${folder.name}`, workspaceFolder: folder, projectList: await Jdtls.getProjects(folder.uri.toString()), steps: [], @@ -170,11 +172,16 @@ class ExportJarTaskTerminal implements Pseudoterminal { constructor(exportJarTaskDefinition: IExportJarTaskDefinition, stepMetadata: IStepMetadata) { this.stepMetadata = stepMetadata; + this.stepMetadata.taskLabel = exportJarTaskDefinition.label || ""; this.stepMetadata.mainClass = exportJarTaskDefinition.mainClass; this.stepMetadata.outputPath = exportJarTaskDefinition.targetPath; this.stepMetadata.elements = exportJarTaskDefinition.elements || []; } + public handleInput(data: string): void { + this.writeEmitter.fire(data + EOL); + } + public async open(_initialDimensions: TerminalDimensions | undefined): Promise { let exportResult: boolean | undefined; try { diff --git a/src/exportJarSteps/GenerateJarExecutor.ts b/src/exportJarSteps/GenerateJarExecutor.ts index 09d5d8e4..3bd44b36 100644 --- a/src/exportJarSteps/GenerateJarExecutor.ts +++ b/src/exportJarSteps/GenerateJarExecutor.ts @@ -11,7 +11,7 @@ import { Jdtls } from "../java/jdtls"; import { INodeData } from "../java/nodeData"; import { IExportJarStepExecutor } from "./IExportJarStepExecutor"; import { IClasspath, IStepMetadata } from "./IStepMetadata"; -import { createPickBox, ExportJarMessages, ExportJarStep, ExportJarTargets, getExtensionApi, toPosixPath } from "./utility"; +import { createPickBox, ExportJarMessages, ExportJarStep, ExportJarTargets, getExtensionApi, revealTerminal, toPosixPath } from "./utility"; export class GenerateJarExecutor implements IExportJarStepExecutor { @@ -82,12 +82,14 @@ export class GenerateJarExecutor implements IExportJarStepExecutor { if (_.isEmpty(classpaths)) { return reject(new Error(ExportJarMessages.CLASSPATHS_EMPTY)); } - const exportResult: IExportResult | undefined = await Jdtls.exportJar(basename(mainClass), classpaths, destPath, token); - if (exportResult?.result === true) { + revealTerminal(stepMetadata.taskLabel); + const exportResult: boolean | undefined = await Jdtls.exportJar(basename(mainClass), + classpaths, destPath, stepMetadata.taskLabel, token); + if (exportResult === true) { stepMetadata.outputPath = destPath; return resolve(true); } else { - return reject(new Error("Export jar failed." + exportResult?.message)); + return reject(new Error("Export jar failed.")); } }); }); @@ -249,9 +251,3 @@ interface IJarQuickPickItem extends QuickPickItem { path: string; type: string; } - -export interface IExportResult { - result: boolean; - message: string; - log?: string; -} diff --git a/src/exportJarSteps/IStepMetadata.ts b/src/exportJarSteps/IStepMetadata.ts index d4afda56..5e67d29d 100644 --- a/src/exportJarSteps/IStepMetadata.ts +++ b/src/exportJarSteps/IStepMetadata.ts @@ -7,6 +7,7 @@ import { ExportJarStep } from "./utility"; export interface IStepMetadata { entry?: INodeData; + taskLabel: string; workspaceFolder?: WorkspaceFolder; mainClass?: string; outputPath?: string; diff --git a/src/exportJarSteps/utility.ts b/src/exportJarSteps/utility.ts index 9ce26d9d..4ffba226 100644 --- a/src/exportJarSteps/utility.ts +++ b/src/exportJarSteps/utility.ts @@ -153,3 +153,19 @@ export async function getExtensionApi(): Promise { } return extensionApi; } + +export function showExportJarReport(taskLabel: string, message: string) { + const terminals = window.terminals; + const presenterTerminals = terminals.filter((terminal) => terminal.name.indexOf(taskLabel) >= 0); + if (presenterTerminals.length > 0) { + presenterTerminals[presenterTerminals.length - 1].sendText(message); + } +} + +export function revealTerminal(terminalName: string) { + const terminals = window.terminals; + const presenterTerminals = terminals.filter((terminal) => terminal.name.indexOf(terminalName) >= 0); + if (presenterTerminals.length > 0) { + presenterTerminals[presenterTerminals.length - 1].show(); + } +} diff --git a/src/java/jdtls.ts b/src/java/jdtls.ts index ada3b6fb..1c94beff 100644 --- a/src/java/jdtls.ts +++ b/src/java/jdtls.ts @@ -3,7 +3,6 @@ import { CancellationToken, commands } from "vscode"; import { Commands, executeJavaLanguageServerCommand } from "../commands"; -import { IExportResult } from "../exportJarSteps/GenerateJarExecutor"; import { IClasspath } from "../exportJarSteps/IStepMetadata"; import { IMainClassInfo } from "../exportJarSteps/ResolveMainClassExecutor"; import { INodeData } from "./nodeData"; @@ -17,7 +16,7 @@ export namespace Jdtls { return commands.executeCommand(Commands.EXECUTE_WORKSPACE_COMMAND, Commands.JAVA_PROJECT_REFRESH_LIB_SERVER, params); } - export async function getPackageData(params: {[key: string]: any}): Promise { + export async function getPackageData(params: { [key: string]: any }): Promise { return await commands.executeCommand(Commands.EXECUTE_WORKSPACE_COMMAND, Commands.JAVA_GETPACKAGEDATA, params) || []; } @@ -30,9 +29,9 @@ export namespace Jdtls { } export async function exportJar(mainClass: string, classpaths: IClasspath[], - destination: string, token: CancellationToken): Promise { + destination: string, taskLabel: string, token: CancellationToken): Promise { return commands.executeCommand(Commands.EXECUTE_WORKSPACE_COMMAND, Commands.JAVA_PROJECT_GENERATEJAR, - mainClass, classpaths, destination, token); + mainClass, classpaths, destination, taskLabel, token); } export enum CompileWorkspaceStatus { diff --git a/src/views/dependencyDataProvider.ts b/src/views/dependencyDataProvider.ts index 1afd19db..df2b1cc0 100644 --- a/src/views/dependencyDataProvider.ts +++ b/src/views/dependencyDataProvider.ts @@ -11,6 +11,7 @@ import { contextManager } from "../../extension.bundle"; import { Commands } from "../commands"; import { Context } from "../constants"; import { executeExportJarTask } from "../exportJarSteps/ExportJarTaskProvider"; +import { showExportJarReport } from "../exportJarSteps/utility"; import { Jdtls } from "../java/jdtls"; import { INodeData, NodeKind } from "../java/nodeData"; import { languageServerApiManager } from "../languageServerApi/languageServerApiManager"; @@ -35,6 +36,9 @@ export class DependencyDataProvider implements TreeDataProvider { constructor(public readonly context: ExtensionContext) { context.subscriptions.push(commands.registerCommand(Commands.VIEW_PACKAGE_REFRESH, (debounce?: boolean, element?: ExplorerNode) => this.refreshWithLog(debounce, element))); + context.subscriptions.push(commands.registerCommand(Commands.EXPORT_JAR_REPORT, (taskLabel: string, message: string) => { + showExportJarReport(taskLabel, message); + })); context.subscriptions.push(instrumentOperationAsVsCodeCommand(Commands.VIEW_PACKAGE_EXPORT_JAR, async (node: INodeData) => { executeExportJarTask(node); })); From 6db0d53af6f52ce95b8af32ec4ee5bd3c406ee36 Mon Sep 17 00:00:00 2001 From: Yan Zhang Date: Fri, 21 May 2021 11:18:48 +0800 Subject: [PATCH 029/352] chore: disable untrustedWorkspaces support (#501) --- package.json | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index a6dff76a..2d0fe73e 100644 --- a/package.json +++ b/package.json @@ -20,12 +20,11 @@ }, "homepage": "https://github.com/Microsoft/vscode-java-dependency/blob/master/README.md", "icon": "logo.png", - "workspaceTrust": { - "request": "onDemand", - "description": "Extension may require your trust on workspace for code execution." - }, "capabilities": { - "virtualWorkspaces": false + "virtualWorkspaces": false, + "untrustedWorkspaces": { + "supported": false + } }, "activationEvents": [ "onCommand:_java.project.open", From ff157cf91f8e2172a22288ead1aff5b4373f18f2 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 21 May 2021 13:20:02 +0800 Subject: [PATCH 030/352] chore(deps): Bump hosted-git-info from 2.8.8 to 2.8.9 (#491) Bumps [hosted-git-info](https://github.com/npm/hosted-git-info) from 2.8.8 to 2.8.9. - [Release notes](https://github.com/npm/hosted-git-info/releases) - [Changelog](https://github.com/npm/hosted-git-info/blob/v2.8.9/CHANGELOG.md) - [Commits](https://github.com/npm/hosted-git-info/compare/v2.8.8...v2.8.9) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index b6952dc9..ab280ae6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -3086,9 +3086,9 @@ } }, "hosted-git-info": { - "version": "2.8.8", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz", - "integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==", + "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 }, "http-proxy-agent": { From a262a645deeb1bb083507ad8de47f655aa30769c Mon Sep 17 00:00:00 2001 From: Shi Chen Date: Fri, 21 May 2021 14:10:27 +0800 Subject: [PATCH 031/352] chore: Prepare for 0.18.4 (#500) --- CHANGELOG.md | 6 ++++++ .../com.microsoft.jdtls.ext.activator/META-INF/MANIFEST.MF | 2 +- jdtls.ext/com.microsoft.jdtls.ext.activator/pom.xml | 2 +- jdtls.ext/com.microsoft.jdtls.ext.core/META-INF/MANIFEST.MF | 2 +- jdtls.ext/com.microsoft.jdtls.ext.core/pom.xml | 2 +- jdtls.ext/pom.xml | 2 +- package-lock.json | 2 +- package.json | 4 ++-- 8 files changed, 14 insertions(+), 8 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a9c54d48..0e3e0046 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,12 @@ All notable changes to the "vscode-java-dependency" extension will be documented The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/) and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html). +## 0.18.4 +### Added +- Show reports when exporting jar. [#374](https://github.com/microsoft/vscode-java-dependency/issues/374) +### Fixed +- [Bugs fixed](https://github.com/microsoft/vscode-java-dependency/issues?q=is%3Aissue+label%3Abug+milestone%3A0.18.4+is%3Aclosed) + ## 0.18.3 ### Added - Add new unmanaged folder metadata for the project node. [PR#479](https://github.com/microsoft/vscode-java-dependency/pull/479) diff --git a/jdtls.ext/com.microsoft.jdtls.ext.activator/META-INF/MANIFEST.MF b/jdtls.ext/com.microsoft.jdtls.ext.activator/META-INF/MANIFEST.MF index d35e3e4c..5942a28a 100644 --- a/jdtls.ext/com.microsoft.jdtls.ext.activator/META-INF/MANIFEST.MF +++ b/jdtls.ext/com.microsoft.jdtls.ext.activator/META-INF/MANIFEST.MF @@ -2,7 +2,7 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: JDTLS EXT Activator Bundle-SymbolicName: com.microsoft.jdtls.ext.activator;singleton:=true -Bundle-Version: 0.18.3 +Bundle-Version: 0.18.4 Bundle-Activator: com.microsoft.jdtls.ext.activator.JdtlsExtActivator Bundle-RequiredExecutionEnvironment: JavaSE-1.8 Import-Package: org.eclipse.jdt.core, diff --git a/jdtls.ext/com.microsoft.jdtls.ext.activator/pom.xml b/jdtls.ext/com.microsoft.jdtls.ext.activator/pom.xml index 3bcf524a..74836918 100644 --- a/jdtls.ext/com.microsoft.jdtls.ext.activator/pom.xml +++ b/jdtls.ext/com.microsoft.jdtls.ext.activator/pom.xml @@ -5,7 +5,7 @@ com.microsoft.jdtls.ext jdtls-ext-parent - 0.18.3 + 0.18.4 com.microsoft.jdtls.ext.activator eclipse-plugin diff --git a/jdtls.ext/com.microsoft.jdtls.ext.core/META-INF/MANIFEST.MF b/jdtls.ext/com.microsoft.jdtls.ext.core/META-INF/MANIFEST.MF index 3e389be2..8e34df52 100644 --- a/jdtls.ext/com.microsoft.jdtls.ext.core/META-INF/MANIFEST.MF +++ b/jdtls.ext/com.microsoft.jdtls.ext.core/META-INF/MANIFEST.MF @@ -2,7 +2,7 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: JDTLS EXT Core Bundle-SymbolicName: com.microsoft.jdtls.ext.core;singleton:=true -Bundle-Version: 0.18.3 +Bundle-Version: 0.18.4 Bundle-Activator: com.microsoft.jdtls.ext.core.JdtlsExtActivator Bundle-RequiredExecutionEnvironment: JavaSE-1.8 Bundle-ActivationPolicy: lazy diff --git a/jdtls.ext/com.microsoft.jdtls.ext.core/pom.xml b/jdtls.ext/com.microsoft.jdtls.ext.core/pom.xml index 17b26881..b87e655f 100644 --- a/jdtls.ext/com.microsoft.jdtls.ext.core/pom.xml +++ b/jdtls.ext/com.microsoft.jdtls.ext.core/pom.xml @@ -5,7 +5,7 @@ com.microsoft.jdtls.ext jdtls-ext-parent - 0.18.3 + 0.18.4 com.microsoft.jdtls.ext.core eclipse-plugin diff --git a/jdtls.ext/pom.xml b/jdtls.ext/pom.xml index 790d02a9..ee1ec681 100644 --- a/jdtls.ext/pom.xml +++ b/jdtls.ext/pom.xml @@ -4,7 +4,7 @@ com.microsoft.jdtls.ext jdtls-ext-parent ${base.name} :: Parent - 0.18.3 + 0.18.4 pom Java Project Manager diff --git a/package-lock.json b/package-lock.json index ab280ae6..272a467b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "vscode-java-dependency", - "version": "0.18.3", + "version": "0.18.4", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 2d0fe73e..c8ab1086 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "vscode-java-dependency", "displayName": "Project Manager for Java", "description": "%description%", - "version": "0.18.3", + "version": "0.18.4", "publisher": "vscjava", "preview": true, "aiKey": "5c642b22-e845-4400-badb-3f8509a70777", @@ -37,7 +37,7 @@ "main": "./main.js", "contributes": { "javaExtensions": [ - "./server/com.microsoft.jdtls.ext.core-0.18.3.jar" + "./server/com.microsoft.jdtls.ext.core-0.18.4.jar" ], "commands": [ { From 10475dc3d733ffb4d3902c5b479c824573381391 Mon Sep 17 00:00:00 2001 From: Shi Chen Date: Tue, 25 May 2021 10:15:54 +0800 Subject: [PATCH 032/352] chore: Remove "done" from the message of export jar (#508) --- src/exportJarSteps/utility.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/exportJarSteps/utility.ts b/src/exportJarSteps/utility.ts index 4ffba226..481e5e77 100644 --- a/src/exportJarSteps/utility.ts +++ b/src/exportJarSteps/utility.ts @@ -127,7 +127,7 @@ export function successMessage(outputFileName: string | undefined): void { openInExplorer = "Open Containing Folder"; } window.showInformationMessage("Successfully exported jar to" + EOL + outputFileName, - openInExplorer, "Done").then((messageResult) => { + openInExplorer).then((messageResult) => { if (messageResult === openInExplorer) { commands.executeCommand("revealFileInOS", Uri.file(outputFileName)); } From 176c31cbdd27e47a16a6f0a5bbd9a9a16cff5f3b Mon Sep 17 00:00:00 2001 From: Shi Chen Date: Wed, 26 May 2021 11:00:41 +0800 Subject: [PATCH 033/352] fix: Close terminal after receiving messages completely (#510) --- .../jdtls/ext/core/ProjectCommand.java | 20 +++++------ src/exportJarSteps/ExportJarTaskProvider.ts | 33 ++++++++++++++++--- src/exportJarSteps/GenerateJarExecutor.ts | 8 +++-- src/exportJarSteps/IStepMetadata.ts | 1 + src/exportJarSteps/utility.ts | 8 ----- src/java/jdtls.ts | 4 +-- src/views/dependencyDataProvider.ts | 7 ++-- 7 files changed, 50 insertions(+), 31 deletions(-) diff --git a/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/ProjectCommand.java b/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/ProjectCommand.java index cb3fcdda..5d3b4f94 100644 --- a/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/ProjectCommand.java +++ b/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/ProjectCommand.java @@ -146,7 +146,7 @@ public static boolean exportJar(List arguments, IProgressMonitor monitor String mainClass = gson.fromJson(gson.toJson(arguments.get(0)), String.class); Classpath[] classpaths = gson.fromJson(gson.toJson(arguments.get(1)), Classpath[].class); String destination = gson.fromJson(gson.toJson(arguments.get(2)), String.class); - String taskLabel = gson.fromJson(gson.toJson(arguments.get(3)), String.class); + String terminalId = gson.fromJson(gson.toJson(arguments.get(3)), String.class); Manifest manifest = new Manifest(); manifest.getMainAttributes().put(Attributes.Name.MANIFEST_VERSION, "1.0"); if (mainClass.length() > 0) { @@ -164,28 +164,28 @@ public static boolean exportJar(List arguments, IProgressMonitor monitor int severity = resultStatus.getSeverity(); if (severity == IStatus.OK) { java.nio.file.Path path = java.nio.file.Paths.get(classpath.source); - reportExportJarMessage(taskLabel, IStatus.OK, "Successfully added the file to the exported jar: " + path.getFileName().toString()); + reportExportJarMessage(terminalId, IStatus.OK, "Successfully extracted the file to the exported jar: " + path.getFileName().toString()); continue; } if (resultStatus.isMultiStatus()) { for (IStatus childStatus : resultStatus.getChildren()) { - reportExportJarMessage(taskLabel, severity, childStatus.getMessage()); + reportExportJarMessage(terminalId, severity, childStatus.getMessage()); } } else { - reportExportJarMessage(taskLabel, severity, resultStatus.getMessage()); + reportExportJarMessage(terminalId, severity, resultStatus.getMessage()); } } else { try { writeFile(new File(classpath.source), new Path(classpath.destination), /* areDirectoryEntriesIncluded = */true, /* isCompressed = */true, target, directories); - reportExportJarMessage(taskLabel, IStatus.OK, "Successfully added the file to the exported jar: " + classpath.destination); + reportExportJarMessage(terminalId, IStatus.OK, "Successfully added the file to the exported jar: " + classpath.destination); } catch (CoreException e) { - reportExportJarMessage(taskLabel, IStatus.ERROR, e.getMessage()); + reportExportJarMessage(terminalId, IStatus.ERROR, e.getMessage()); } } } } catch (IOException e) { - reportExportJarMessage(taskLabel, IStatus.ERROR, e.getMessage()); + reportExportJarMessage(terminalId, IStatus.ERROR, e.getMessage()); return false; } return true; @@ -254,11 +254,11 @@ public static String getModuleName(IJavaProject project) { } } - private static void reportExportJarMessage(String taskLabel, int severity, String message) { - if (StringUtils.isNotBlank(message) && StringUtils.isNotBlank(taskLabel)) { + private static void reportExportJarMessage(String terminalId, int severity, String message) { + if (StringUtils.isNotBlank(message) && StringUtils.isNotBlank(terminalId)) { String readableSeverity = getSeverityString(severity); JavaLanguageServerPlugin.getInstance().getClientConnection().executeClientCommand(COMMAND_EXPORT_JAR_REPORT, - taskLabel, "[" + readableSeverity + "] " + message); + terminalId, "[" + readableSeverity + "] " + message); } } diff --git a/src/exportJarSteps/ExportJarTaskProvider.ts b/src/exportJarSteps/ExportJarTaskProvider.ts index 669fdc92..d8be067a 100644 --- a/src/exportJarSteps/ExportJarTaskProvider.ts +++ b/src/exportJarSteps/ExportJarTaskProvider.ts @@ -22,7 +22,7 @@ import { IClasspath, IStepMetadata } from "./IStepMetadata"; import { IMainClassInfo } from "./ResolveMainClassExecutor"; import { ExportJarConstants, ExportJarMessages, ExportJarStep, failMessage, getExtensionApi, - resetStepMetadata, stepMap, successMessage, toPosixPath, toWinPath, + resetStepMetadata, revealTerminal, stepMap, successMessage, toPosixPath, toWinPath, } from "./utility"; interface IExportJarTaskDefinition extends TaskDefinition { @@ -33,6 +33,8 @@ interface IExportJarTaskDefinition extends TaskDefinition { } let isExportingJar: boolean = false; +// key: terminalId, value: ExportJarTaskTerminal +const activeTerminalMap: Map = new Map(); export async function executeExportJarTask(node?: INodeData): Promise { // save the workspace first @@ -168,21 +170,32 @@ class ExportJarTaskTerminal implements Pseudoterminal { public onDidWrite: Event = this.writeEmitter.event; public onDidClose?: Event = this.closeEmitter.event; + public terminalId: string; private stepMetadata: IStepMetadata; constructor(exportJarTaskDefinition: IExportJarTaskDefinition, stepMetadata: IStepMetadata) { this.stepMetadata = stepMetadata; this.stepMetadata.taskLabel = exportJarTaskDefinition.label || ""; + this.stepMetadata.terminalId = Math.floor(Math.random() * Number.MAX_SAFE_INTEGER).toString(); this.stepMetadata.mainClass = exportJarTaskDefinition.mainClass; this.stepMetadata.outputPath = exportJarTaskDefinition.targetPath; this.stepMetadata.elements = exportJarTaskDefinition.elements || []; + this.terminalId = this.stepMetadata.terminalId; } - public handleInput(data: string): void { - this.writeEmitter.fire(data + EOL); + public exit(message?: string) { + if (message) { + this.writeEmitter.fire(message); + } + if (activeTerminalMap.has(this.terminalId)) { + activeTerminalMap.delete(this.terminalId); + this.closeEmitter.fire(); + } } public async open(_initialDimensions: TerminalDimensions | undefined): Promise { + activeTerminalMap.set(this.terminalId, this); + revealTerminal(this.stepMetadata.taskLabel); let exportResult: boolean | undefined; try { if (!this.stepMetadata.workspaceFolder) { @@ -210,17 +223,21 @@ class ExportJarTaskTerminal implements Pseudoterminal { } catch (err) { if (err) { failMessage(`${err}`); + this.exit("[ERROR] An error occurs during export Jar process"); + } else { + this.exit("[CANCEL] Export Jar process is cancelled by user"); } } finally { isExportingJar = false; if (exportResult === true) { successMessage(this.stepMetadata.outputPath); + this.exit("[SUCCESS] Export Jar process is finished successfully"); } else if (exportResult === false) { // We call `executeExportJarTask()` with the same entry here // to help the user reselect the Java project. executeExportJarTask(this.stepMetadata.entry); } - this.closeEmitter.fire(); + this.exit(); } } @@ -406,3 +423,11 @@ class ExportJarTaskTerminal implements Pseudoterminal { return negative ? "!" + positivePath : positivePath; } } + +export function appendOutput(terminalId: string, message: string): void { + const terminal = activeTerminalMap.get(terminalId); + if (!terminal) { + return; + } + terminal.writeEmitter.fire(message + EOL); +} diff --git a/src/exportJarSteps/GenerateJarExecutor.ts b/src/exportJarSteps/GenerateJarExecutor.ts index 3bd44b36..c87d79d4 100644 --- a/src/exportJarSteps/GenerateJarExecutor.ts +++ b/src/exportJarSteps/GenerateJarExecutor.ts @@ -11,7 +11,7 @@ import { Jdtls } from "../java/jdtls"; import { INodeData } from "../java/nodeData"; import { IExportJarStepExecutor } from "./IExportJarStepExecutor"; import { IClasspath, IStepMetadata } from "./IStepMetadata"; -import { createPickBox, ExportJarMessages, ExportJarStep, ExportJarTargets, getExtensionApi, revealTerminal, toPosixPath } from "./utility"; +import { createPickBox, ExportJarMessages, ExportJarStep, ExportJarTargets, getExtensionApi, toPosixPath } from "./utility"; export class GenerateJarExecutor implements IExportJarStepExecutor { @@ -82,9 +82,11 @@ export class GenerateJarExecutor implements IExportJarStepExecutor { if (_.isEmpty(classpaths)) { return reject(new Error(ExportJarMessages.CLASSPATHS_EMPTY)); } - revealTerminal(stepMetadata.taskLabel); + if (!stepMetadata.terminalId) { + return reject(new Error("Can't find related terminal.")); + } const exportResult: boolean | undefined = await Jdtls.exportJar(basename(mainClass), - classpaths, destPath, stepMetadata.taskLabel, token); + classpaths, destPath, stepMetadata.terminalId, token); if (exportResult === true) { stepMetadata.outputPath = destPath; return resolve(true); diff --git a/src/exportJarSteps/IStepMetadata.ts b/src/exportJarSteps/IStepMetadata.ts index 5e67d29d..de582e2d 100644 --- a/src/exportJarSteps/IStepMetadata.ts +++ b/src/exportJarSteps/IStepMetadata.ts @@ -8,6 +8,7 @@ import { ExportJarStep } from "./utility"; export interface IStepMetadata { entry?: INodeData; taskLabel: string; + terminalId?: string; workspaceFolder?: WorkspaceFolder; mainClass?: string; outputPath?: string; diff --git a/src/exportJarSteps/utility.ts b/src/exportJarSteps/utility.ts index 481e5e77..6184fa89 100644 --- a/src/exportJarSteps/utility.ts +++ b/src/exportJarSteps/utility.ts @@ -154,14 +154,6 @@ export async function getExtensionApi(): Promise { return extensionApi; } -export function showExportJarReport(taskLabel: string, message: string) { - const terminals = window.terminals; - const presenterTerminals = terminals.filter((terminal) => terminal.name.indexOf(taskLabel) >= 0); - if (presenterTerminals.length > 0) { - presenterTerminals[presenterTerminals.length - 1].sendText(message); - } -} - export function revealTerminal(terminalName: string) { const terminals = window.terminals; const presenterTerminals = terminals.filter((terminal) => terminal.name.indexOf(terminalName) >= 0); diff --git a/src/java/jdtls.ts b/src/java/jdtls.ts index 1c94beff..01751f31 100644 --- a/src/java/jdtls.ts +++ b/src/java/jdtls.ts @@ -29,9 +29,9 @@ export namespace Jdtls { } export async function exportJar(mainClass: string, classpaths: IClasspath[], - destination: string, taskLabel: string, token: CancellationToken): Promise { + destination: string, terminalId: string, token: CancellationToken): Promise { return commands.executeCommand(Commands.EXECUTE_WORKSPACE_COMMAND, Commands.JAVA_PROJECT_GENERATEJAR, - mainClass, classpaths, destination, taskLabel, token); + mainClass, classpaths, destination, terminalId, token); } export enum CompileWorkspaceStatus { diff --git a/src/views/dependencyDataProvider.ts b/src/views/dependencyDataProvider.ts index df2b1cc0..d0891f0f 100644 --- a/src/views/dependencyDataProvider.ts +++ b/src/views/dependencyDataProvider.ts @@ -10,8 +10,7 @@ import { instrumentOperation, instrumentOperationAsVsCodeCommand } from "vscode- import { contextManager } from "../../extension.bundle"; import { Commands } from "../commands"; import { Context } from "../constants"; -import { executeExportJarTask } from "../exportJarSteps/ExportJarTaskProvider"; -import { showExportJarReport } from "../exportJarSteps/utility"; +import { appendOutput, executeExportJarTask } from "../exportJarSteps/ExportJarTaskProvider"; import { Jdtls } from "../java/jdtls"; import { INodeData, NodeKind } from "../java/nodeData"; import { languageServerApiManager } from "../languageServerApi/languageServerApiManager"; @@ -36,8 +35,8 @@ export class DependencyDataProvider implements TreeDataProvider { constructor(public readonly context: ExtensionContext) { context.subscriptions.push(commands.registerCommand(Commands.VIEW_PACKAGE_REFRESH, (debounce?: boolean, element?: ExplorerNode) => this.refreshWithLog(debounce, element))); - context.subscriptions.push(commands.registerCommand(Commands.EXPORT_JAR_REPORT, (taskLabel: string, message: string) => { - showExportJarReport(taskLabel, message); + context.subscriptions.push(commands.registerCommand(Commands.EXPORT_JAR_REPORT, (terminalId: string, message: string) => { + appendOutput(terminalId, message); })); context.subscriptions.push(instrumentOperationAsVsCodeCommand(Commands.VIEW_PACKAGE_EXPORT_JAR, async (node: INodeData) => { executeExportJarTask(node); From 90cc9aabdacf6c1d06b1b8738fd63c4134054e54 Mon Sep 17 00:00:00 2001 From: Shi Chen Date: Wed, 26 May 2021 14:29:35 +0800 Subject: [PATCH 034/352] fix: Misleading behavior after cancelling exporting jar (#511) --- .../microsoft/jdtls/ext/core/ProjectCommand.java | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/ProjectCommand.java b/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/ProjectCommand.java index 5d3b4f94..38acc6b2 100644 --- a/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/ProjectCommand.java +++ b/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/ProjectCommand.java @@ -40,6 +40,7 @@ import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.MultiStatus; import org.eclipse.core.runtime.NullProgressMonitor; +import org.eclipse.core.runtime.OperationCanceledException; import org.eclipse.core.runtime.Path; import org.eclipse.jdt.core.IJavaElement; import org.eclipse.jdt.core.IJavaProject; @@ -147,6 +148,19 @@ public static boolean exportJar(List arguments, IProgressMonitor monitor Classpath[] classpaths = gson.fromJson(gson.toJson(arguments.get(1)), Classpath[].class); String destination = gson.fromJson(gson.toJson(arguments.get(2)), String.class); String terminalId = gson.fromJson(gson.toJson(arguments.get(3)), String.class); + try { + return exportJarExecution(mainClass, classpaths, destination, terminalId, monitor); + } catch (OperationCanceledException e) { + File jarFile = new File(destination); + if (jarFile.exists()) { + jarFile.delete(); + } + } + return false; + } + + private static boolean exportJarExecution(String mainClass, Classpath[] classpaths, String destination, + String terminalId, IProgressMonitor monitor) throws OperationCanceledException { Manifest manifest = new Manifest(); manifest.getMainAttributes().put(Attributes.Name.MANIFEST_VERSION, "1.0"); if (mainClass.length() > 0) { From 713a0b90990fb17c88121c3f9366d005199c053d Mon Sep 17 00:00:00 2001 From: Shi Chen Date: Mon, 31 May 2021 16:37:52 +0800 Subject: [PATCH 035/352] chore: Refine document (#513) * fix document --- README.md | 46 ++++++++++++++++++++++---- images/create-project.png | Bin 51188 -> 63821 bytes images/export-jar.png | Bin 61464 -> 90269 bytes images/manage-dependencies.gif | Bin 0 -> 1236926 bytes package.json | 2 +- templates/invisible-project/README.md | 2 +- 6 files changed, 41 insertions(+), 9 deletions(-) create mode 100644 images/manage-dependencies.gif diff --git a/README.md b/README.md index ca9c4219..f02ff2e7 100644 --- a/README.md +++ b/README.md @@ -2,24 +2,56 @@ > Manage Java projects in Visual Studio Code -[![GitHub Actions](https://img.shields.io/github/workflow/status/microsoft/vscode-java-dependency/CI/master?style=flat-square)](https://github.com/microsoft/vscode-java-dependency/actions?query=workflow%3ACI+branch%3Amaster) +[![GitHub Actions](https://img.shields.io/github/workflow/status/microsoft/vscode-java-dependency/CI/main?style=flat-square)](https://github.com/microsoft/vscode-java-dependency/actions?query=workflow%3ACI+branch%3Amain) ## Overview A lightweight extension to provide additional Java project explorer features. It works with [Language Support for Java by Red Hat](https://marketplace.visualstudio.com/items?itemName=redhat.java) to provide the following features: -* Project View +### Project View -![project-view](https://raw.githubusercontent.com/Microsoft/vscode-java-dependency/master/images/project-explorer.png) +![project-view](https://raw.githubusercontent.com/Microsoft/vscode-java-dependency/main/images/project-explorer.png) -* Create Java Projects +### Create Java Projects -![create project](https://raw.githubusercontent.com/Microsoft/vscode-java-dependency/master/images/create-project.png) +![create project](https://raw.githubusercontent.com/Microsoft/vscode-java-dependency/main/images/create-project.png) -* Export Jar +### Export Jar > Note: For Spring Boot projects, please use the build tool to build the executable jar, for example: `mvn package`. -![export jar](https://raw.githubusercontent.com/Microsoft/vscode-java-dependency/master/images/export-jar.png) +![export jar](https://raw.githubusercontent.com/Microsoft/vscode-java-dependency/main/images/export-jar.png) + +### Manage Dependencies + +You can work with JAR files directly without any build tools. Go to `JAVA PROJECTS` view, find the `Referenced Libraries` node and click the `+` icon: + +![Reference JAR Files](https://raw.githubusercontent.com/Microsoft/vscode-java-dependency/main/images/manage-dependencies.gif) + +If you want to fine-tune this, go to `settings.json` and look for the `java.project.referencedLibraries` entry. + +```json +"java.project.referencedLibraries": [ + "library/**/*.jar", + "/home/username/lib/foo.jar" +] +``` + +You can tell that the glob pattern is supported. And here's more - you can include/exclude certain files, and attach source JARs: + +```json +"java.project.referencedLibraries": { + "include": [ + "library/**/*.jar", + "/home/username/lib/foo.jar" + ], + "exclude": [ + "library/sources/**" + ], + "sources": { + "library/bar.jar": "library/sources/bar-src.jar" + } +} +``` ## Requirements diff --git a/images/create-project.png b/images/create-project.png index 28ce87b3ab04dc712a46b664235d59cdbcf82122..e1e5096b3e069b792c49b3e8f1e707eaf5a34a4f 100644 GIT binary patch literal 63821 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

IFHH6$#>rDXQkBJjV+jUE<%lQ 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≻=V`VLQlk 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�iz&W+~BU86mRMq--6XmgDKUv|OQ z51pItX2LU?cb#pFHYXi&UTzMb9Sbu~ZOzU}v?2`)qq9Bhcp+_<{V0ofpz3mZ2>(zQPJd%yU($tr zq4cj=xTmE~^Ni6+kAbMwf%VRGPZV5wpBayMV~P59(=BN_+yVE{$tEws_SX4GrC!O$*&^3TW9^j~XqnY&SpIwP`Y*o^{dB z>ac0D64 z^W;!|>$@ulYGdk-utU{Xqz+WrPIC7cAEpjI8PsCBJs^ZBC3nz_xR>7 zl0Bl<$=;!7L7*(ptY~9w<|d{5bM)`;_htVLTPKn@2!D2;(1ct9t@8m@`u{q4av-P} W>sDT#_u?(}H@ez}S{0WaWBv~%_Zxu# literal 51188 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 H`J?{@6KhD> diff --git a/images/export-jar.png b/images/export-jar.png index fc97f66bab6a67d2dacc85866037233fa3b154c0..19a4394b01075230cfbbfb671089b6be97c682a4 100644 GIT binary patch literal 90269 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%0D$S+_iHI>2efb^oi@> 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 diff --git a/images/manage-dependencies.gif b/images/manage-dependencies.gif new file mode 100644 index 0000000000000000000000000000000000000000..cf4cf9687b972aae31e3debf6dc4e1acd6f10e2d GIT binary patch literal 1236926 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%0Dk7r3j_Z&iMRX=h@vr{>nTnD*)B38Kmb$hKikC* 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

    le>o>!z2#dgG^U#*?2A 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 -Dh%S-Gt7Gi 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

    p%hre&Z_l@uy*scI5a6tR5 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

    nfVh8Tr#5FXlo1*L5)a9bi_IRX@-9 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

      d&1B=tvxUl!dIS$10 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 V1H2^dJ^VdAcR2W(dv8JL{0APNJ)Hmm literal 0 HcmV?d00001 diff --git a/package.json b/package.json index c8ab1086..9634f9db 100644 --- a/package.json +++ b/package.json @@ -18,7 +18,7 @@ "type": "git", "url": "https://github.com/Microsoft/vscode-java-dependency.git" }, - "homepage": "https://github.com/Microsoft/vscode-java-dependency/blob/master/README.md", + "homepage": "https://github.com/Microsoft/vscode-java-dependency/blob/main/README.md", "icon": "logo.png", "capabilities": { "virtualWorkspaces": false, diff --git a/templates/invisible-project/README.md b/templates/invisible-project/README.md index d8b8a20b..35589f2a 100644 --- a/templates/invisible-project/README.md +++ b/templates/invisible-project/README.md @@ -11,4 +11,4 @@ The workspace contains two folders by default, where: ## Dependency Management -The `JAVA DEPENDENCIES` view allows you to manage your dependencies. More details can be found [here](https://github.com/microsoft/vscode-java-pack/blob/master/release-notes/v0.9.0.md#work-with-jar-files-directly). +The `JAVA PROJECTS` view allows you to manage your dependencies. More details can be found [here](https://github.com/microsoft/vscode-java-dependency#manage-dependencies). From ee179c2a3327fd3ffc58a5cdfe43af538d2a75ac Mon Sep 17 00:00:00 2001 From: Shi Chen Date: Tue, 15 Jun 2021 11:02:22 +0800 Subject: [PATCH 036/352] fix: Export jar reports have wrong format in macOS (#515) --- src/exportJarSteps/ExportJarTaskProvider.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/exportJarSteps/ExportJarTaskProvider.ts b/src/exportJarSteps/ExportJarTaskProvider.ts index d8be067a..b837eedc 100644 --- a/src/exportJarSteps/ExportJarTaskProvider.ts +++ b/src/exportJarSteps/ExportJarTaskProvider.ts @@ -4,7 +4,7 @@ import { lstat } from "fs-extra"; import * as globby from "globby"; import * as _ from "lodash"; -import { EOL, platform } from "os"; +import { platform } from "os"; import { dirname, extname, isAbsolute, join, relative } from "path"; import { CustomExecution, Event, EventEmitter, Pseudoterminal, Task, TaskDefinition, @@ -429,5 +429,5 @@ export function appendOutput(terminalId: string, message: string): void { if (!terminal) { return; } - terminal.writeEmitter.fire(message + EOL); + terminal.writeEmitter.fire(message + "\r\n"); } From 3ea71e2492234441bbfe67ec710519cfc91fc806 Mon Sep 17 00:00:00 2001 From: Shi Chen Date: Tue, 15 Jun 2021 11:12:10 +0800 Subject: [PATCH 037/352] fix: Export jar task finishes with error (#517) --- src/exportJarSteps/ExportJarTaskProvider.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/exportJarSteps/ExportJarTaskProvider.ts b/src/exportJarSteps/ExportJarTaskProvider.ts index b837eedc..0c078b0e 100644 --- a/src/exportJarSteps/ExportJarTaskProvider.ts +++ b/src/exportJarSteps/ExportJarTaskProvider.ts @@ -165,10 +165,10 @@ export class ExportJarTaskProvider implements TaskProvider { class ExportJarTaskTerminal implements Pseudoterminal { public writeEmitter = new EventEmitter(); - public closeEmitter = new EventEmitter(); + public closeEmitter = new EventEmitter(); public onDidWrite: Event = this.writeEmitter.event; - public onDidClose?: Event = this.closeEmitter.event; + public onDidClose?: Event = this.closeEmitter.event; public terminalId: string; private stepMetadata: IStepMetadata; @@ -189,7 +189,7 @@ class ExportJarTaskTerminal implements Pseudoterminal { } if (activeTerminalMap.has(this.terminalId)) { activeTerminalMap.delete(this.terminalId); - this.closeEmitter.fire(); + this.closeEmitter.fire(0); } } From 9e11713383a7331fb6c86efe2908bc88c0bf567e Mon Sep 17 00:00:00 2001 From: Shi Chen Date: Fri, 25 Jun 2021 09:48:01 +0800 Subject: [PATCH 038/352] chore: Prepare for 0.18.5 (#520) --- CHANGELOG.md | 4 ++++ .../com.microsoft.jdtls.ext.activator/META-INF/MANIFEST.MF | 2 +- jdtls.ext/com.microsoft.jdtls.ext.activator/pom.xml | 2 +- jdtls.ext/com.microsoft.jdtls.ext.core/META-INF/MANIFEST.MF | 2 +- jdtls.ext/com.microsoft.jdtls.ext.core/pom.xml | 2 +- jdtls.ext/pom.xml | 2 +- package-lock.json | 2 +- package.json | 4 ++-- 8 files changed, 12 insertions(+), 8 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0e3e0046..be196efe 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,10 @@ All notable changes to the "vscode-java-dependency" extension will be documented The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/) and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html). +## 0.18.5 +### Fixed +- [Bugs fixed](https://github.com/microsoft/vscode-java-dependency/issues?q=is%3Aissue+label%3Abug+milestone%3A0.18.5+is%3Aclosed) + ## 0.18.4 ### Added - Show reports when exporting jar. [#374](https://github.com/microsoft/vscode-java-dependency/issues/374) diff --git a/jdtls.ext/com.microsoft.jdtls.ext.activator/META-INF/MANIFEST.MF b/jdtls.ext/com.microsoft.jdtls.ext.activator/META-INF/MANIFEST.MF index 5942a28a..5ff58c15 100644 --- a/jdtls.ext/com.microsoft.jdtls.ext.activator/META-INF/MANIFEST.MF +++ b/jdtls.ext/com.microsoft.jdtls.ext.activator/META-INF/MANIFEST.MF @@ -2,7 +2,7 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: JDTLS EXT Activator Bundle-SymbolicName: com.microsoft.jdtls.ext.activator;singleton:=true -Bundle-Version: 0.18.4 +Bundle-Version: 0.18.5 Bundle-Activator: com.microsoft.jdtls.ext.activator.JdtlsExtActivator Bundle-RequiredExecutionEnvironment: JavaSE-1.8 Import-Package: org.eclipse.jdt.core, diff --git a/jdtls.ext/com.microsoft.jdtls.ext.activator/pom.xml b/jdtls.ext/com.microsoft.jdtls.ext.activator/pom.xml index 74836918..bfee3299 100644 --- a/jdtls.ext/com.microsoft.jdtls.ext.activator/pom.xml +++ b/jdtls.ext/com.microsoft.jdtls.ext.activator/pom.xml @@ -5,7 +5,7 @@ com.microsoft.jdtls.ext jdtls-ext-parent - 0.18.4 + 0.18.5 com.microsoft.jdtls.ext.activator eclipse-plugin diff --git a/jdtls.ext/com.microsoft.jdtls.ext.core/META-INF/MANIFEST.MF b/jdtls.ext/com.microsoft.jdtls.ext.core/META-INF/MANIFEST.MF index 8e34df52..4f59de4e 100644 --- a/jdtls.ext/com.microsoft.jdtls.ext.core/META-INF/MANIFEST.MF +++ b/jdtls.ext/com.microsoft.jdtls.ext.core/META-INF/MANIFEST.MF @@ -2,7 +2,7 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: JDTLS EXT Core Bundle-SymbolicName: com.microsoft.jdtls.ext.core;singleton:=true -Bundle-Version: 0.18.4 +Bundle-Version: 0.18.5 Bundle-Activator: com.microsoft.jdtls.ext.core.JdtlsExtActivator Bundle-RequiredExecutionEnvironment: JavaSE-1.8 Bundle-ActivationPolicy: lazy diff --git a/jdtls.ext/com.microsoft.jdtls.ext.core/pom.xml b/jdtls.ext/com.microsoft.jdtls.ext.core/pom.xml index b87e655f..ca34cae0 100644 --- a/jdtls.ext/com.microsoft.jdtls.ext.core/pom.xml +++ b/jdtls.ext/com.microsoft.jdtls.ext.core/pom.xml @@ -5,7 +5,7 @@ com.microsoft.jdtls.ext jdtls-ext-parent - 0.18.4 + 0.18.5 com.microsoft.jdtls.ext.core eclipse-plugin diff --git a/jdtls.ext/pom.xml b/jdtls.ext/pom.xml index ee1ec681..6af3bb30 100644 --- a/jdtls.ext/pom.xml +++ b/jdtls.ext/pom.xml @@ -4,7 +4,7 @@ com.microsoft.jdtls.ext jdtls-ext-parent ${base.name} :: Parent - 0.18.4 + 0.18.5 pom Java Project Manager diff --git a/package-lock.json b/package-lock.json index 272a467b..2ef9608c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "vscode-java-dependency", - "version": "0.18.4", + "version": "0.18.5", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 9634f9db..c4e826fb 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "vscode-java-dependency", "displayName": "Project Manager for Java", "description": "%description%", - "version": "0.18.4", + "version": "0.18.5", "publisher": "vscjava", "preview": true, "aiKey": "5c642b22-e845-4400-badb-3f8509a70777", @@ -37,7 +37,7 @@ "main": "./main.js", "contributes": { "javaExtensions": [ - "./server/com.microsoft.jdtls.ext.core-0.18.4.jar" + "./server/com.microsoft.jdtls.ext.core-0.18.5.jar" ], "commands": [ { From 097817928f4f5627ee525ff945869c3e53eae937 Mon Sep 17 00:00:00 2001 From: Shi Chen Date: Mon, 28 Jun 2021 10:31:44 +0800 Subject: [PATCH 039/352] fix: Security warning from glob-parent in pipelines (#521) --- package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index 2ef9608c..b0d44330 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2746,9 +2746,9 @@ } }, "glob-parent": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", - "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "requires": { "is-glob": "^4.0.1" } @@ -6051,9 +6051,9 @@ } }, "ssri": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.1.tgz", - "integrity": "sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.2.tgz", + "integrity": "sha512-cepbSq/neFK7xB6A50KHN0xHDotYzq58wWCa5LeWqnPrHG8GzfEjO/4O8kpmcGW+oaxkvhEJCWgbgNk4/ZV93Q==", "dev": true, "requires": { "figgy-pudding": "^3.5.1" From 941c33659e47537ec5edf2070051b0ca7b2822ef Mon Sep 17 00:00:00 2001 From: Shi Chen Date: Mon, 28 Jun 2021 15:23:42 +0800 Subject: [PATCH 040/352] chore: Reduce package size (#522) --- .vscodeignore | 1 + {images => icons}/dark/icon-link.svg | 0 {images => icons}/dark/icon-unlink.svg | 0 {images => icons}/light/icon-link.svg | 0 {images => icons}/light/icon-unlink.svg | 0 package.json | 8 ++++---- 6 files changed, 5 insertions(+), 4 deletions(-) rename {images => icons}/dark/icon-link.svg (100%) rename {images => icons}/dark/icon-unlink.svg (100%) rename {images => icons}/light/icon-link.svg (100%) rename {images => icons}/light/icon-unlink.svg (100%) diff --git a/.vscodeignore b/.vscodeignore index 7887b29a..62e26ac5 100644 --- a/.vscodeignore +++ b/.vscodeignore @@ -17,6 +17,7 @@ scripts extension.bundle.ts javaConfig.json .github/** +images # Ignore output of code sign server/*.md diff --git a/images/dark/icon-link.svg b/icons/dark/icon-link.svg similarity index 100% rename from images/dark/icon-link.svg rename to icons/dark/icon-link.svg diff --git a/images/dark/icon-unlink.svg b/icons/dark/icon-unlink.svg similarity index 100% rename from images/dark/icon-unlink.svg rename to icons/dark/icon-unlink.svg diff --git a/images/light/icon-link.svg b/icons/light/icon-link.svg similarity index 100% rename from images/light/icon-link.svg rename to icons/light/icon-link.svg diff --git a/images/light/icon-unlink.svg b/icons/light/icon-unlink.svg similarity index 100% rename from images/light/icon-unlink.svg rename to icons/light/icon-unlink.svg diff --git a/package.json b/package.json index c4e826fb..93685341 100644 --- a/package.json +++ b/package.json @@ -110,8 +110,8 @@ "title": "%contributes.commands.java.view.package.linkWithFolderExplorer%", "category": "Java", "icon": { - "dark": "images/dark/icon-unlink.svg", - "light": "images/light/icon-unlink.svg" + "dark": "icons/dark/icon-unlink.svg", + "light": "icons/light/icon-unlink.svg" } }, { @@ -119,8 +119,8 @@ "title": "%contributes.commands.java.view.package.unlinkWithFolderExplorer%", "category": "Java", "icon": { - "dark": "images/dark/icon-link.svg", - "light": "images/light/icon-link.svg" + "dark": "icons/dark/icon-link.svg", + "light": "icons/light/icon-link.svg" } }, { From 031fa22d09cb180784efbfb8ef32a5e53f1f038d Mon Sep 17 00:00:00 2001 From: Sheng Chen Date: Tue, 29 Jun 2021 11:37:48 +0800 Subject: [PATCH 041/352] feat: Set the output path explicitly by default when creating project without build tools (#524) Co-authored-by: Shi Chen --- templates/invisible-project/.vscode/settings.json | 4 ++++ templates/invisible-project/README.md | 4 ++++ 2 files changed, 8 insertions(+) create mode 100644 templates/invisible-project/.vscode/settings.json diff --git a/templates/invisible-project/.vscode/settings.json b/templates/invisible-project/.vscode/settings.json new file mode 100644 index 00000000..96ee3d15 --- /dev/null +++ b/templates/invisible-project/.vscode/settings.json @@ -0,0 +1,4 @@ +{ + "java.project.sourcePaths": ["src"], + "java.project.outputPath": "bin" +} diff --git a/templates/invisible-project/README.md b/templates/invisible-project/README.md index 35589f2a..7c03a532 100644 --- a/templates/invisible-project/README.md +++ b/templates/invisible-project/README.md @@ -9,6 +9,10 @@ The workspace contains two folders by default, where: - `src`: the folder to maintain sources - `lib`: the folder to maintain dependencies +Meanwhile, the compiled output files will be generated in the `bin` folder by default. + +> If you want to customize the folder structure, open `.vscode/settings.json` and update the related settings there. + ## Dependency Management The `JAVA PROJECTS` view allows you to manage your dependencies. More details can be found [here](https://github.com/microsoft/vscode-java-dependency#manage-dependencies). From a7e265b41a60a56b31c6314fd8b30d6af72ee294 Mon Sep 17 00:00:00 2001 From: Sheng Chen Date: Wed, 30 Jun 2021 14:45:38 +0800 Subject: [PATCH 042/352] fix: Project explorer grab the focus unexpectedly (#525) --- src/commands.ts | 2 ++ src/constants.ts | 4 ++++ src/extension.ts | 29 ++++++++++++++++++++++-- src/syncHandler.ts | 40 ++++++++++++++++++++++++++++----- src/views/dependencyExplorer.ts | 2 +- 5 files changed, 69 insertions(+), 8 deletions(-) diff --git a/src/commands.ts b/src/commands.ts index d9ccbc17..ba6bbb1b 100644 --- a/src/commands.ts +++ b/src/commands.ts @@ -82,6 +82,8 @@ export namespace Commands { export const JAVA_RESOLVE_BUILD_FILES = "vscode.java.resolveBuildFiles"; + export const JAVA_PROJECT_LIST_SOURCE_PATHS = "java.project.listSourcePaths"; + /** * Commands from Visual Studio Code */ diff --git a/src/constants.ts b/src/constants.ts index 2670b591..87eaca8e 100644 --- a/src/constants.ts +++ b/src/constants.ts @@ -24,3 +24,7 @@ export namespace Explorer { export namespace Build { export const FILE_NAMES: string[] = ["pom.xml", "build.gradle"]; } + +export namespace ExtensionName { + export const JAVA_LANGUAGE_SUPPORT: string = "redhat.java"; +} diff --git a/src/extension.ts b/src/extension.ts index adfc5557..0a1618ff 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -1,10 +1,10 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT license. -import { ExtensionContext, tasks } from "vscode"; +import { Event, Extension, ExtensionContext, extensions, tasks, Uri } from "vscode"; import { dispose as disposeTelemetryWrapper, initializeFromJsonFile, instrumentOperation, sendInfo } from "vscode-extension-telemetry-wrapper"; import { contextManager } from "../extension.bundle"; -import { Build, Context } from "./constants"; +import { Build, Context, ExtensionName } from "./constants"; import { LibraryController } from "./controllers/libraryController"; import { ProjectController } from "./controllers/projectController"; import { init as initExpService } from "./ExperimentationService"; @@ -31,6 +31,31 @@ async function activateExtension(_operationId: string, context: ExtensionContext context.subscriptions.push(contextManager); context.subscriptions.push(syncHandler); context.subscriptions.push(tasks.registerTaskProvider(ExportJarTaskProvider.exportJarType, new ExportJarTaskProvider())); + + const javaLanguageSupport: Extension | undefined = extensions.getExtension(ExtensionName.JAVA_LANGUAGE_SUPPORT); + if (!javaLanguageSupport) { + return; + } + javaLanguageSupport.activate().then(() => { + const extensionApi: any = javaLanguageSupport.exports; + if (!extensionApi) { + return; + } + + if (extensionApi.onDidClasspathUpdate) { + const onDidClasspathUpdate: Event = extensionApi.onDidClasspathUpdate; + context.subscriptions.push(onDidClasspathUpdate(async () => { + syncHandler.updateFileWatcher(Settings.autoRefresh()); + })); + } + + if (extensionApi.onDidServerModeChange) { + const onDidServerModeChange: Event = extensionApi.onDidServerModeChange; + context.subscriptions.push(onDidServerModeChange(async () => { + syncHandler.updateFileWatcher(Settings.autoRefresh()); + })); + } + }); } // this method is called when your extension is deactivated diff --git a/src/syncHandler.ts b/src/syncHandler.ts index 9c115752..dcfe0498 100644 --- a/src/syncHandler.ts +++ b/src/syncHandler.ts @@ -2,7 +2,7 @@ // Licensed under the MIT license. import * as path from "path"; -import { commands, Disposable, FileSystemWatcher, Uri, workspace } from "vscode"; +import { commands, Disposable, FileSystemWatcher, RelativePattern, Uri, workspace } from "vscode"; import { instrumentOperation } from "vscode-extension-telemetry-wrapper"; import { Commands } from "./commands"; import { NodeKind } from "./java/nodeData"; @@ -19,10 +19,11 @@ class SyncHandler implements Disposable { private disposables: Disposable[] = []; public updateFileWatcher(autoRefresh?: boolean): void { + this.dispose(); if (autoRefresh) { instrumentOperation(ENABLE_AUTO_REFRESH, () => this.enableAutoRefresh())(); } else { - instrumentOperation(DISABLE_AUTO_REFRESH, () => this.dispose())(); + instrumentOperation(DISABLE_AUTO_REFRESH, () => {})(); } } @@ -40,9 +41,25 @@ class SyncHandler implements Disposable { this.refresh(); })); - const fileSystemWatcher: FileSystemWatcher = workspace.createFileSystemWatcher("**/{*.java,src/**}"); - this.setupWatchers(fileSystemWatcher); - this.disposables.push(fileSystemWatcher); + try { + const result: IListCommandResult | undefined = await commands.executeCommand(Commands.EXECUTE_WORKSPACE_COMMAND, + Commands.JAVA_PROJECT_LIST_SOURCE_PATHS); + if (!result || !result.status || !result.data || result.data.length === 0) { + throw new Error("Failed to list the source paths"); + } + + for (const sourcePathData of result.data) { + const normalizedPath: string = Uri.file(sourcePathData.path).fsPath; + const pattern: RelativePattern = new RelativePattern(normalizedPath, "**/*"); + const watcher: FileSystemWatcher = workspace.createFileSystemWatcher(pattern); + this.disposables.push(watcher); + this.setupWatchers(watcher); + } + } catch (e) { + const fileSystemWatcher: FileSystemWatcher = workspace.createFileSystemWatcher("**/{*.java,src/**}"); + this.disposables.push(fileSystemWatcher); + this.setupWatchers(fileSystemWatcher); + } } private setupWatchers(watcher: FileSystemWatcher): void { @@ -100,4 +117,17 @@ class SyncHandler implements Disposable { } } +interface ISourcePath { + path: string; + displayPath: string; + projectName: string; + projectType: string; +} + +interface IListCommandResult { + status: boolean; + message: string; + data?: ISourcePath[]; +} + export const syncHandler: SyncHandler = new SyncHandler(); diff --git a/src/views/dependencyExplorer.ts b/src/views/dependencyExplorer.ts index e28e4576..fcafeb8c 100644 --- a/src/views/dependencyExplorer.ts +++ b/src/views/dependencyExplorer.ts @@ -60,7 +60,7 @@ export class DependencyExplorer implements Disposable { } }), this._dataProvider.onDidChangeTreeData(() => { - if (window.activeTextEditor) { + if (this._dependencyViewer.visible && window.activeTextEditor) { this.reveal(window.activeTextEditor.document.uri); } }), From 8bb3ad63c1fee581f894b11b29226099782b6abf Mon Sep 17 00:00:00 2001 From: Sheng Chen Date: Wed, 7 Jul 2021 17:04:09 +0800 Subject: [PATCH 043/352] fix: Exceptions when opening a file which is not on the build path (#527) --- .../src/com/microsoft/jdtls/ext/core/PackageCommand.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/PackageCommand.java b/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/PackageCommand.java index b5de200d..02538119 100644 --- a/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/PackageCommand.java +++ b/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/PackageCommand.java @@ -129,6 +129,9 @@ public static List resolvePath(List arguments, IProgressMon // Add project node: result.add(PackageNode.createNodeForProject(typeRoot)); IPackageFragment packageFragment = (IPackageFragment) typeRoot.getAncestor(IJavaElement.PACKAGE_FRAGMENT); + if (!packageFragment.exists()) { + return Collections.emptyList(); + } IPackageFragmentRoot pkgRoot = (IPackageFragmentRoot) packageFragment.getAncestor(IJavaElement.PACKAGE_FRAGMENT_ROOT); // TODO: Let the client handle the display instead. Server side should always // provide the container node. From 706c085c2f8b0e45c217bd89b5771590b33a907e Mon Sep 17 00:00:00 2001 From: Sheng Chen Date: Fri, 23 Jul 2021 10:27:53 +0800 Subject: [PATCH 044/352] chore: Prepare for 0.18.6 (#530) --- CHANGELOG.md | 8 ++++++++ .../META-INF/MANIFEST.MF | 2 +- jdtls.ext/com.microsoft.jdtls.ext.activator/pom.xml | 2 +- .../com.microsoft.jdtls.ext.core/META-INF/MANIFEST.MF | 2 +- jdtls.ext/com.microsoft.jdtls.ext.core/pom.xml | 2 +- jdtls.ext/pom.xml | 2 +- package-lock.json | 2 +- package.json | 4 ++-- test/index.ts | 4 ++++ 9 files changed, 20 insertions(+), 8 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index be196efe..d9f69ec9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,14 @@ All notable changes to the "vscode-java-dependency" extension will be documented The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/) and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html). +## 0.18.6 + +### Changed +- Set the output path to `bin` by default when creating projects without build tools. [#523](https://github.com/microsoft/vscode-java-dependency/issues/523) + +### Fixed +- [Bugs fixed](https://github.com/microsoft/vscode-java-dependency/issues?q=is%3Aissue+label%3Abug+milestone%3A0.18.6+is%3Aclosed) + ## 0.18.5 ### Fixed - [Bugs fixed](https://github.com/microsoft/vscode-java-dependency/issues?q=is%3Aissue+label%3Abug+milestone%3A0.18.5+is%3Aclosed) diff --git a/jdtls.ext/com.microsoft.jdtls.ext.activator/META-INF/MANIFEST.MF b/jdtls.ext/com.microsoft.jdtls.ext.activator/META-INF/MANIFEST.MF index 5ff58c15..2fa25d69 100644 --- a/jdtls.ext/com.microsoft.jdtls.ext.activator/META-INF/MANIFEST.MF +++ b/jdtls.ext/com.microsoft.jdtls.ext.activator/META-INF/MANIFEST.MF @@ -2,7 +2,7 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: JDTLS EXT Activator Bundle-SymbolicName: com.microsoft.jdtls.ext.activator;singleton:=true -Bundle-Version: 0.18.5 +Bundle-Version: 0.18.6 Bundle-Activator: com.microsoft.jdtls.ext.activator.JdtlsExtActivator Bundle-RequiredExecutionEnvironment: JavaSE-1.8 Import-Package: org.eclipse.jdt.core, diff --git a/jdtls.ext/com.microsoft.jdtls.ext.activator/pom.xml b/jdtls.ext/com.microsoft.jdtls.ext.activator/pom.xml index bfee3299..bb32ceba 100644 --- a/jdtls.ext/com.microsoft.jdtls.ext.activator/pom.xml +++ b/jdtls.ext/com.microsoft.jdtls.ext.activator/pom.xml @@ -5,7 +5,7 @@ com.microsoft.jdtls.ext jdtls-ext-parent - 0.18.5 + 0.18.6 com.microsoft.jdtls.ext.activator eclipse-plugin diff --git a/jdtls.ext/com.microsoft.jdtls.ext.core/META-INF/MANIFEST.MF b/jdtls.ext/com.microsoft.jdtls.ext.core/META-INF/MANIFEST.MF index 4f59de4e..8748bb26 100644 --- a/jdtls.ext/com.microsoft.jdtls.ext.core/META-INF/MANIFEST.MF +++ b/jdtls.ext/com.microsoft.jdtls.ext.core/META-INF/MANIFEST.MF @@ -2,7 +2,7 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: JDTLS EXT Core Bundle-SymbolicName: com.microsoft.jdtls.ext.core;singleton:=true -Bundle-Version: 0.18.5 +Bundle-Version: 0.18.6 Bundle-Activator: com.microsoft.jdtls.ext.core.JdtlsExtActivator Bundle-RequiredExecutionEnvironment: JavaSE-1.8 Bundle-ActivationPolicy: lazy diff --git a/jdtls.ext/com.microsoft.jdtls.ext.core/pom.xml b/jdtls.ext/com.microsoft.jdtls.ext.core/pom.xml index ca34cae0..ac5b4dc6 100644 --- a/jdtls.ext/com.microsoft.jdtls.ext.core/pom.xml +++ b/jdtls.ext/com.microsoft.jdtls.ext.core/pom.xml @@ -5,7 +5,7 @@ com.microsoft.jdtls.ext jdtls-ext-parent - 0.18.5 + 0.18.6 com.microsoft.jdtls.ext.core eclipse-plugin diff --git a/jdtls.ext/pom.xml b/jdtls.ext/pom.xml index 6af3bb30..441b672e 100644 --- a/jdtls.ext/pom.xml +++ b/jdtls.ext/pom.xml @@ -4,7 +4,7 @@ com.microsoft.jdtls.ext jdtls-ext-parent ${base.name} :: Parent - 0.18.5 + 0.18.6 pom Java Project Manager diff --git a/package-lock.json b/package-lock.json index b0d44330..c1476385 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "vscode-java-dependency", - "version": "0.18.5", + "version": "0.18.6", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 93685341..87be2b10 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "vscode-java-dependency", "displayName": "Project Manager for Java", "description": "%description%", - "version": "0.18.5", + "version": "0.18.6", "publisher": "vscjava", "preview": true, "aiKey": "5c642b22-e845-4400-badb-3f8509a70777", @@ -37,7 +37,7 @@ "main": "./main.js", "contributes": { "javaExtensions": [ - "./server/com.microsoft.jdtls.ext.core-0.18.5.jar" + "./server/com.microsoft.jdtls.ext.core-0.18.6.jar" ], "commands": [ { diff --git a/test/index.ts b/test/index.ts index 0b25fa11..bf3a9417 100644 --- a/test/index.ts +++ b/test/index.ts @@ -29,6 +29,7 @@ async function main(): Promise { extensionTestsPath: path.resolve(__dirname, "./suite"), launchArgs: [ path.join(__dirname, "..", "..", "test", "java9"), + "--disable-workspace-trust", ], }); @@ -39,6 +40,7 @@ async function main(): Promise { extensionTestsPath: path.resolve(__dirname, "./simple-suite"), launchArgs: [ path.join(__dirname, "..", "..", "test", "simple"), + "--disable-workspace-trust", ], }); @@ -49,6 +51,7 @@ async function main(): Promise { extensionTestsPath: path.resolve(__dirname, "./maven-suite"), launchArgs: [ path.join(__dirname, "..", "..", "test", "maven"), + "--disable-workspace-trust", ], }); @@ -59,6 +62,7 @@ async function main(): Promise { extensionTestsPath: path.resolve(__dirname, "./gradle-suite"), launchArgs: [ path.join(__dirname, "..", "..", "test", "gradle"), + "--disable-workspace-trust", ], }); From 1c727b0510e3679a1270b93e0c4e8c4876823fa9 Mon Sep 17 00:00:00 2001 From: Shi Chen Date: Wed, 28 Jul 2021 15:09:35 +0800 Subject: [PATCH 045/352] chore: Support command tests (#519) * Support command tests --- .github/workflows/build.yml | 150 -- .github/workflows/linux.yml | 54 + .github/workflows/linuxUI.yml | 54 + .github/workflows/macOS.yml | 47 + .github/workflows/macOSUI.yml | 47 + .github/workflows/windows.yml | 47 + .github/workflows/windowsUI.yml | 53 + .gitignore | 1 + .vscode/launch.json | 30 +- .vscodeignore | 1 + extension.bundle.ts | 1 + package-lock.json | 2034 ++++++++++++++++- package.json | 3 + test/index.ts | 13 + test/invisible-suite/index.ts | 41 + test/invisible-suite/projectView.test.ts | 59 + test/invisible.code-workspace | 10 + test/invisible/.vscode/settings.json | 5 + test/invisible/libSource/simple.jar | Bin 0 -> 901 bytes test/invisible/src/App.java | 5 + test/maven-suite/projectView.test.ts | 167 +- test/maven.code-workspace | 10 + .../java/com/mycompany/app/AppToDelete.java | 5 + .../java/com/mycompany/app/AppToRename.java | 5 + .../main/java/com/mycompany/app1/App1.java | 5 + test/ui/command.test.ts | 316 +++ test/ui/index.ts | 26 + test/util.ts | 6 + tsconfig.json | 3 +- 29 files changed, 3019 insertions(+), 179 deletions(-) delete mode 100644 .github/workflows/build.yml create mode 100644 .github/workflows/linux.yml create mode 100644 .github/workflows/linuxUI.yml create mode 100644 .github/workflows/macOS.yml create mode 100644 .github/workflows/macOSUI.yml create mode 100644 .github/workflows/windows.yml create mode 100644 .github/workflows/windowsUI.yml create mode 100644 test/invisible-suite/index.ts create mode 100644 test/invisible-suite/projectView.test.ts create mode 100644 test/invisible.code-workspace create mode 100644 test/invisible/.vscode/settings.json create mode 100644 test/invisible/libSource/simple.jar create mode 100644 test/invisible/src/App.java create mode 100644 test/maven.code-workspace create mode 100644 test/maven/src/main/java/com/mycompany/app/AppToDelete.java create mode 100644 test/maven/src/main/java/com/mycompany/app/AppToRename.java create mode 100644 test/maven/src/main/java/com/mycompany/app1/App1.java create mode 100644 test/ui/command.test.ts create mode 100644 test/ui/index.ts create mode 100644 test/util.ts diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml deleted file mode 100644 index ca46a8dc..00000000 --- a/.github/workflows/build.yml +++ /dev/null @@ -1,150 +0,0 @@ -name: CI - -on: - push: - branches: [ main ] - pull_request: - branches: [ main ] - -jobs: - linux: - name: Linux - runs-on: ubuntu-latest - timeout-minutes: 30 - steps: - - uses: actions/checkout@v2 - - - name: Setup Build Environment - run: | - sudo apt-get update - sudo apt-get install -y libxkbfile-dev pkg-config libsecret-1-dev libxss1 dbus xvfb libgtk-3-0 libgbm1 - sudo /usr/bin/Xvfb :99 -screen 0 1024x768x24 > /dev/null 2>&1 & - sleep 3 - - - name: Set up JDK 11 - uses: actions/setup-java@v1 - with: - java-version: '11' - - - name: Setup Node.js environment - uses: actions/setup-node@v2 - with: - node-version: 12 - - - name: Install Node.js modules - run: npm install - - - name: Install Gulp - run: npm install -g gulp - - - name: Install VSCE - run: npm install -g vsce - - - name: Lint - run: gulp tslint - - - name: Checkstyle - run: gulp checkstyle - - - name: Build OSGi bundle - run: npm run build-server - - - name: Build VSIX file - run: vsce package - - - name: Test extension - run: DISPLAY=:99 npm test - - - name: Print language server Log if job failed - if: ${{ failure() }} - run: find $HOME/.config/Code/User/workspaceStorage/*/redhat.java/jdt_ws/.metadata/.log -print -exec cat '{}' \;; - - windows: - name: Windows - runs-on: windows-latest - timeout-minutes: 30 - steps: - - uses: actions/checkout@v2 - - - name: Set up JDK 11 - uses: actions/setup-java@v1 - with: - java-version: '11' - - - name: Setup Node.js environment - uses: actions/setup-node@v2 - with: - node-version: 12 - - - name: Install Node.js modules - run: npm install - - - name: Install Gulp - run: npm install -g gulp --force - - - name: Install VSCE - run: npm install -g vsce - - - name: Lint - run: gulp tslint - - - name: Checkstyle - run: gulp checkstyle - - - name: Build OSGi bundle - run: npm run build-server - - - name: Build VSIX file - run: vsce package - - - name: Test extension - run: npm test - - - name: Print language server Log if job failed - if: ${{ failure() }} - run: Get-ChildItem -Path $env:APPDATA/Code/User/workspaceStorage/*/redhat.java/jdt_ws/.metadata/.log | cat - - darwin: - name: macOS - runs-on: macos-latest - timeout-minutes: 30 - steps: - - uses: actions/checkout@v2 - - - name: Set up JDK 11 - uses: actions/setup-java@v1 - with: - java-version: '11' - - - name: Setup Node.js environment - uses: actions/setup-node@v2 - with: - node-version: 12 - - - name: Install Node.js modules - run: npm install - - - name: Install Gulp - run: npm install -g gulp - - - name: Install VSCE - run: npm install -g vsce - - - name: Lint - run: gulp tslint - - - name: Checkstyle - run: gulp checkstyle - - - name: Build OSGi bundle - run: npm run build-server - - - name: Build VSIX file - run: vsce package - - - name: Test extension - run: npm test - - - name: Print language server Log if job failed - if: ${{ failure() }} - run: find $HOME/Library/Application\ Support/Code/User/workspaceStorage/*/redhat.java/jdt_ws/.metadata/.log -print -exec cat '{}' \;; \ No newline at end of file diff --git a/.github/workflows/linux.yml b/.github/workflows/linux.yml new file mode 100644 index 00000000..411038e5 --- /dev/null +++ b/.github/workflows/linux.yml @@ -0,0 +1,54 @@ +name: CI + +on: + push: + branches: [ main ] + pull_request: + branches: [ main ] + +jobs: + linux: + name: Linux + runs-on: ubuntu-latest + timeout-minutes: 30 + steps: + - uses: actions/checkout@v2 + + - name: Setup Build Environment + run: | + sudo apt-get update + sudo apt-get install -y libxkbfile-dev pkg-config libsecret-1-dev libxss1 dbus xvfb libgtk-3-0 libgbm1 + sudo /usr/bin/Xvfb :99 -screen 0 1024x768x24 > /dev/null 2>&1 & + sleep 3 + + - name: Set up JDK 11 + uses: actions/setup-java@v1 + with: + java-version: '11' + + - name: Setup Node.js environment + uses: actions/setup-node@v2 + with: + node-version: 12 + + - name: Install Node.js modules + run: npm install + + - name: Install Gulp + run: npm install -g gulp + + - name: Install VSCE + run: npm install -g vsce + + - name: Build OSGi bundle + run: npm run build-server + + - name: Build VSIX file + run: vsce package + + - name: Test extension + run: DISPLAY=:99 npm test + + - name: Print language server Log if job failed + if: ${{ failure() }} + run: find $HOME/.config/Code/User/workspaceStorage/*/redhat.java/jdt_ws/.metadata/.log -print -exec cat '{}' \;; \ No newline at end of file diff --git a/.github/workflows/linuxUI.yml b/.github/workflows/linuxUI.yml new file mode 100644 index 00000000..fc95efae --- /dev/null +++ b/.github/workflows/linuxUI.yml @@ -0,0 +1,54 @@ +name: CI + +on: + push: + branches: [ main ] + pull_request: + branches: [ main ] + +jobs: + linuxUI: + name: Linux-UI + runs-on: ubuntu-latest + timeout-minutes: 30 + steps: + - uses: actions/checkout@v2 + + - name: Setup Build Environment + run: | + sudo apt-get update + sudo apt-get install -y libxkbfile-dev pkg-config libsecret-1-dev libxss1 dbus xvfb libgtk-3-0 libgbm1 + sudo /usr/bin/Xvfb :99 -screen 0 1024x768x24 > /dev/null 2>&1 & + sleep 3 + + - name: Set up JDK 11 + uses: actions/setup-java@v1 + with: + java-version: '11' + + - name: Setup Node.js environment + uses: actions/setup-node@v2 + with: + node-version: 12 + + - name: Install Node.js modules + run: npm install + + - name: Install Gulp + run: npm install -g gulp + + - name: Install VSCE + run: npm install -g vsce + + - name: Build OSGi bundle + run: npm run build-server + + - name: Build VSIX file + run: vsce package + + - name: Test extension + run: DISPLAY=:99 npm run test-ui + + - name: Print language server Log + if: ${{ failure() }} + run: find ./test-resources/settings/User/workspaceStorage/*/redhat.java/jdt_ws/.metadata/.log -print -exec cat '{}' \;; diff --git a/.github/workflows/macOS.yml b/.github/workflows/macOS.yml new file mode 100644 index 00000000..20500227 --- /dev/null +++ b/.github/workflows/macOS.yml @@ -0,0 +1,47 @@ +name: CI + +on: + push: + branches: [ main ] + pull_request: + branches: [ main ] + +jobs: + darwin: + name: macOS + runs-on: macos-latest + timeout-minutes: 30 + steps: + - uses: actions/checkout@v2 + + - name: Set up JDK 11 + uses: actions/setup-java@v1 + with: + java-version: '11' + + - name: Setup Node.js environment + uses: actions/setup-node@v2 + with: + node-version: 12 + + - name: Install Node.js modules + run: npm install + + - name: Install Gulp + run: npm install -g gulp + + - name: Install VSCE + run: npm install -g vsce + + - name: Build OSGi bundle + run: npm run build-server + + - name: Build VSIX file + run: vsce package + + - name: Test extension + run: npm test + + - name: Print language server Log if job failed + if: ${{ failure() }} + run: find $HOME/Library/Application\ Support/Code/User/workspaceStorage/*/redhat.java/jdt_ws/.metadata/.log -print -exec cat '{}' \;; diff --git a/.github/workflows/macOSUI.yml b/.github/workflows/macOSUI.yml new file mode 100644 index 00000000..ba46b085 --- /dev/null +++ b/.github/workflows/macOSUI.yml @@ -0,0 +1,47 @@ +name: CI + +on: + push: + branches: [ main ] + pull_request: + branches: [ main ] + +jobs: + darwinUI: + name: macOS-UI + runs-on: macos-latest + timeout-minutes: 30 + steps: + - uses: actions/checkout@v2 + + - name: Set up JDK 11 + uses: actions/setup-java@v1 + with: + java-version: '11' + + - name: Setup Node.js environment + uses: actions/setup-node@v2 + with: + node-version: 12 + + - name: Install Node.js modules + run: npm install + + - name: Install Gulp + run: npm install -g gulp + + - name: Install VSCE + run: npm install -g vsce + + - name: Build OSGi bundle + run: npm run build-server + + - name: Build VSIX file + run: vsce package + + - name: Test extension + run: npm run test-ui + + - name: Print language server Log if job failed + if: ${{ failure() }} + run: find ./test-resources/settings/User/workspaceStorage/*/redhat.java/jdt_ws/.metadata/.log -print -exec cat '{}' \;; diff --git a/.github/workflows/windows.yml b/.github/workflows/windows.yml new file mode 100644 index 00000000..1182b3ea --- /dev/null +++ b/.github/workflows/windows.yml @@ -0,0 +1,47 @@ +name: CI + +on: + push: + branches: [ main ] + pull_request: + branches: [ main ] + +jobs: + windows: + name: Windows + runs-on: windows-latest + timeout-minutes: 30 + steps: + - uses: actions/checkout@v2 + + - name: Set up JDK 11 + uses: actions/setup-java@v1 + with: + java-version: '11' + + - name: Setup Node.js environment + uses: actions/setup-node@v2 + with: + node-version: 12 + + - name: Install Node.js modules + run: npm install + + - name: Install Gulp + run: npm install -g gulp --force + + - name: Install VSCE + run: npm install -g vsce + + - name: Build OSGi bundle + run: npm run build-server + + - name: Build VSIX file + run: vsce package + + - name: Test extension + run: npm test + + - name: Print language server Log if job failed + if: ${{ failure() }} + run: Get-ChildItem -Path $env:APPDATA/Code/User/workspaceStorage/*/redhat.java/jdt_ws/.metadata/.log | cat diff --git a/.github/workflows/windowsUI.yml b/.github/workflows/windowsUI.yml new file mode 100644 index 00000000..67189c30 --- /dev/null +++ b/.github/workflows/windowsUI.yml @@ -0,0 +1,53 @@ +name: CI + +on: + push: + branches: [ main ] + pull_request: + branches: [ main ] + +jobs: + windowsUI: + name: Windows-UI + runs-on: windows-latest + timeout-minutes: 30 + steps: + - uses: actions/checkout@v2 + + - name: Set up JDK 11 + uses: actions/setup-java@v1 + with: + java-version: '11' + + - name: Setup Node.js environment + uses: actions/setup-node@v2 + with: + node-version: 12 + + - name: Install Node.js modules + run: npm install + + - name: Install Gulp + run: npm install -g gulp --force + + - name: Install VSCE + run: npm install -g vsce + + - name: Lint + run: gulp tslint + + - name: Checkstyle + run: gulp checkstyle + + - name: Build OSGi bundle + run: npm run build-server + + - name: Build VSIX file + run: vsce package + + - name: Test extension + run: npm run test-ui + + - name: Print language server Log if job failed + if: ${{ failure() }} + run: Get-ChildItem -Path ./test-resources/settings/User/workspaceStorage/*/redhat.java/jdt_ws/.metadata/.log | cat diff --git a/.gitignore b/.gitignore index c20bd1b2..f2f12ec9 100644 --- a/.gitignore +++ b/.gitignore @@ -12,3 +12,4 @@ packages/ dist **/.settings **/.checkstyle +test-resources/ diff --git a/.vscode/launch.json b/.vscode/launch.json index 826b5bd9..0b1d4cb8 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -82,6 +82,34 @@ "sourceMaps": true, "outFiles": [ "${workspaceFolder}/dist/**/*.js" ], "preLaunchTask": "npm: compile" - } + }, + { + "name": "Extension Tests - Invisible Project", + "type": "extensionHost", + "request": "launch", + "runtimeExecutable": "${execPath}", + "args": [ + "${workspaceFolder}/test/invisible/", + "--extensionDevelopmentPath=${workspaceFolder}", + "--extensionTestsPath=${workspaceFolder}/dist/test/invisible-suite/index" + ], + "stopOnEntry": false, + "sourceMaps": true, + "outFiles": [ "${workspaceFolder}/dist/**/*.js" ], + "preLaunchTask": "npm: compile" + }, + { + "name": "Debug UI Command Tests", + "type": "node", + "request": "launch", + "program": "${workspaceFolder}/node_modules/vscode-extension-tester/out/cli.js", + "args": [ + "setup-and-run", + "${workspaceFolder}/dist/test/ui/command.test.js", + ], + "console": "integratedTerminal", + "internalConsoleOptions": "neverOpen", + "preLaunchTask": "npm: compile" + }, ] } diff --git a/.vscodeignore b/.vscodeignore index 62e26ac5..0c1dd8f2 100644 --- a/.vscodeignore +++ b/.vscodeignore @@ -18,6 +18,7 @@ extension.bundle.ts javaConfig.json .github/** images +test-resources # Ignore output of code sign server/*.md diff --git a/extension.bundle.ts b/extension.bundle.ts index c7b02d99..168f3e38 100644 --- a/extension.bundle.ts +++ b/extension.bundle.ts @@ -15,6 +15,7 @@ export { PackageRootNode } from "./src/views/packageRootNode"; export { PrimaryTypeNode } from "./src/views/PrimaryTypeNode"; export { ProjectNode } from "./src/views/projectNode"; export { WorkspaceNode } from "./src/views/workspaceNode"; +export { IMainClassInfo } from "./src/exportJarSteps/ResolveMainClassExecutor"; // project view test export { contextManager } from "./src/contextManager"; diff --git a/package-lock.json b/package-lock.json index c1476385..6ef66075 100644 --- a/package-lock.json +++ b/package-lock.json @@ -121,6 +121,73 @@ "rimraf": "^3.0.2" } }, + "@nut-tree/libnut": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@nut-tree/libnut/-/libnut-2.1.0.tgz", + "integrity": "sha512-aCSbURPPYC6hwJG9lT9JsjWwC8jj4Hpv2CoGIIDh+l4oPvIPTLvGTabOkcmEgz5zIxmUWAJ8kCZsnxsGE4B/EA==", + "dev": true, + "requires": { + "@nut-tree/libnut-darwin": "2.1.0", + "@nut-tree/libnut-linux": "2.1.0", + "@nut-tree/libnut-win32": "2.1.0" + } + }, + "@nut-tree/libnut-darwin": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@nut-tree/libnut-darwin/-/libnut-darwin-2.1.0.tgz", + "integrity": "sha512-gqDrieSng6wKuotx7R7SYa3Eq08+j4GNlV/4EJc+m08x2lGTUO2oyYyr30sYqGp2A+Fx8MBAZjHxJOxd9KnwkQ==", + "dev": true, + "requires": { + "bindings": "1.5.0", + "cmake-js": "6.1.0", + "node-addon-api": "3.0.0" + } + }, + "@nut-tree/libnut-linux": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@nut-tree/libnut-linux/-/libnut-linux-2.1.0.tgz", + "integrity": "sha512-g6UoVtoR6F0aN1BcWgkX40lEZzqU06/GpT2fT5i9b4kWfgcVafnrvqrd+RhG4TPfhAB7LgypNcyEWad49R/j7g==", + "dev": true, + "requires": { + "bindings": "1.5.0", + "cmake-js": "6.1.0", + "node-addon-api": "3.0.0" + } + }, + "@nut-tree/libnut-win32": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@nut-tree/libnut-win32/-/libnut-win32-2.1.0.tgz", + "integrity": "sha512-LsEmC5Jx1Oe3tJ4SrB2yUSd+tI2vIl5DQV8FjscwUZYIAauWX+cMMq6gPui8BSVJbXj+ACWYnORW2O3o7dxKqA==", + "dev": true, + "requires": { + "bindings": "1.5.0", + "cmake-js": "6.1.0", + "node-addon-api": "3.0.0" + } + }, + "@nut-tree/nut-js": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@nut-tree/nut-js/-/nut-js-1.5.0.tgz", + "integrity": "sha512-4RC9daQkn4L49BqzlfY3qpt/HM87FhF7LXqKhQ/8g1LNvIONdlaJoZOxNvw0mJO0zQt1zsZ5bIrxhjwUGlwJGg==", + "dev": true, + "requires": { + "@nut-tree/libnut": "2.1.0", + "clipboardy": "2.0.0", + "opencv4nodejs-prebuilt": "5.3.0-2" + }, + "dependencies": { + "clipboardy": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/clipboardy/-/clipboardy-2.0.0.tgz", + "integrity": "sha512-XbVjHMsss0giNUkp/tV/3eEAZe8i1fZTLzmPKqjE1RGIAWOTiF5D014f6R+g53ZAq0IK3cPrJXFvqE8eQjhFYQ==", + "dev": true, + "requires": { + "arch": "^2.1.1", + "execa": "^1.0.0" + } + } + } + }, "@tootallnate/once": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", @@ -182,6 +249,12 @@ "integrity": "sha512-tktOkFUA4kXx2hhhrB8bIFb5TbwzS4uOhKEmwiD+NoiL0qtP2OQ9mFldbgD4dV1djrlBYP6eBuQZiWjuHUpqFw==", "dev": true }, + "@types/selenium-webdriver": { + "version": "3.0.19", + "resolved": "https://registry.npmjs.org/@types/selenium-webdriver/-/selenium-webdriver-3.0.19.tgz", + "integrity": "sha512-OFUilxQg+rWL2FMxtmIgCkUDlJB6pskkpvmew7yeXfzzsOBb5rc+y2+DjHm+r3r1ZPPcJefK3DveNSYWGiy68g==", + "dev": true + }, "@types/vscode": { "version": "1.53.0", "resolved": "https://devdiv.pkgs.visualstudio.com/_packaging/CloudKernel/npm/registry/@types/vscode/-/vscode-1.53.0.tgz", @@ -430,9 +503,15 @@ "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", "dev": true }, + "ansi": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/ansi/-/ansi-0.3.1.tgz", + "integrity": "sha1-DELU+xcWDVqa8eSEus4cZpIsGyE=", + "dev": true + }, "ansi-colors": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-1.1.0.tgz", + "resolved": "http://registry.npmjs.org/ansi-colors/-/ansi-colors-1.1.0.tgz", "integrity": "sha512-SFKX67auSNoVR38N3L+nvsPjOE0bybKTYbkf5tRvushrAPQ9V75huw0ZxBkKVeRU9kqH3d6HA4xTckbwZ4ixmA==", "dev": true, "requires": { @@ -637,12 +716,28 @@ "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", "dev": true }, + "arch": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/arch/-/arch-2.2.0.tgz", + "integrity": "sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==", + "dev": true + }, "archy": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=", "dev": true }, + "are-we-there-yet": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.0.6.tgz", + "integrity": "sha1-otKMkxAqpsyWJFomy5VN4G7FPww=", + "dev": true, + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.0 || ^1.1.13" + } + }, "argparse": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", @@ -765,6 +860,15 @@ "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", "dev": true }, + "asn1": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", + "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", + "dev": true, + "requires": { + "safer-buffer": "~2.1.0" + } + }, "asn1.js": { "version": "5.4.1", "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz", @@ -803,7 +907,7 @@ }, "util": { "version": "0.10.3", - "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", + "resolved": "http://registry.npmjs.org/util/-/util-0.10.3.tgz", "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", "dev": true, "requires": { @@ -812,6 +916,12 @@ } } }, + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true + }, "assign-symbols": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", @@ -862,6 +972,18 @@ "async-done": "^1.2.2" } }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", + "dev": true + }, + "at-least-node": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", + "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", + "dev": true + }, "atob": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", @@ -873,6 +995,18 @@ "resolved": "https://registry.npmjs.org/await-lock/-/await-lock-2.1.0.tgz", "integrity": "sha512-t7Zm5YGgEEc/3eYAicF32m/TNvL+XOeYZy9CvBUeJY/szM7frLolFylhrlZNWV/ohWhcUXygrBGjYmoQdxF4CQ==" }, + "aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", + "dev": true + }, + "aws4": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", + "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==", + "dev": true + }, "axios": { "version": "0.21.1", "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.1.tgz", @@ -881,6 +1015,16 @@ "follow-redirects": "^1.10.0" } }, + "azure-devops-node-api": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/azure-devops-node-api/-/azure-devops-node-api-11.0.1.tgz", + "integrity": "sha512-YMdjAw9l5p/6leiyIloxj3k7VIvYThKjvqgiQn88r3nhT93ENwsoDS3A83CyJ4uTWzCZ5f5jCi6c27rTU5Pz+A==", + "dev": true, + "requires": { + "tunnel": "0.0.6", + "typed-rest-client": "^1.8.4" + } + }, "bach": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/bach/-/bach-1.2.0.tgz", @@ -964,6 +1108,15 @@ "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", "dev": true }, + "bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", + "dev": true, + "requires": { + "tweetnacl": "^0.14.3" + } + }, "big-integer": { "version": "1.6.48", "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.48.tgz", @@ -997,11 +1150,20 @@ "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", "dev": true, - "optional": true, "requires": { "file-uri-to-path": "1.0.0" } }, + "bl": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.3.tgz", + "integrity": "sha512-pvcNpa0UU69UT341rO6AYy4FVAIkUHuZXRIWbq+zHnsVcRzDDjIAhGuuYoi0d//cwIwtt4pkpKycWEfjdV+vww==", + "dev": true, + "requires": { + "readable-stream": "^2.3.5", + "safe-buffer": "^5.1.1" + } + }, "bluebird": { "version": "3.4.7", "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.4.7.tgz", @@ -1014,6 +1176,12 @@ "integrity": "sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw==", "dev": true }, + "boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=", + "dev": true + }, "brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -1045,7 +1213,7 @@ }, "browserify-aes": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", + "resolved": "http://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", "dev": true, "requires": { @@ -1140,12 +1308,40 @@ "isarray": "^1.0.0" } }, + "buffer-alloc": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz", + "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==", + "dev": true, + "requires": { + "buffer-alloc-unsafe": "^1.1.0", + "buffer-fill": "^1.0.0" + } + }, + "buffer-alloc-unsafe": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz", + "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==", + "dev": true + }, + "buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=", + "dev": true + }, "buffer-equal": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/buffer-equal/-/buffer-equal-1.0.0.tgz", "integrity": "sha1-WWFrSYME1Var1GaWayLu2j7KX74=", "dev": true }, + "buffer-fill": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz", + "integrity": "sha1-+PeLdniYiO858gXNY39o5wISKyw=", + "dev": true + }, "buffer-from": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", @@ -1158,6 +1354,12 @@ "integrity": "sha512-I7wzHwA3t1/lwXQh+A5PbNvJxgfo5r3xulgpYDB5zckTu/Z9oUK9biouBKQUjEqzaz3HnAT6TYoovmE+GqSf7A==", "dev": true }, + "buffer-shims": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-shims/-/buffer-shims-1.0.0.tgz", + "integrity": "sha1-mXjOMXOIxkmth5MCjDR37wRKi1E=", + "dev": true + }, "buffer-xor": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", @@ -1240,6 +1442,12 @@ "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=", "dev": true }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", + "dev": true + }, "chainsaw": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/chainsaw/-/chainsaw-0.1.0.tgz", @@ -1270,6 +1478,42 @@ } } }, + "cheerio": { + "version": "1.0.0-rc.10", + "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.10.tgz", + "integrity": "sha512-g0J0q/O6mW8z5zxQ3A8E8J1hUgp4SMOvEoW/x84OwyHKe/Zccz83PVT4y5Crcr530FV6NgmKI1qvGTKVl9XXVw==", + "dev": true, + "requires": { + "cheerio-select": "^1.5.0", + "dom-serializer": "^1.3.2", + "domhandler": "^4.2.0", + "htmlparser2": "^6.1.0", + "parse5": "^6.0.1", + "parse5-htmlparser2-tree-adapter": "^6.0.1", + "tslib": "^2.2.0" + }, + "dependencies": { + "tslib": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.0.tgz", + "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==", + "dev": true + } + } + }, + "cheerio-select": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-1.5.0.tgz", + "integrity": "sha512-qocaHPv5ypefh6YNxvnbABM07KMxExbtbfuJoIie3iZXX1ERwYmJcIiRrr9H05ucQP1k28dav8rpdDgjQd8drg==", + "dev": true, + "requires": { + "css-select": "^4.1.3", + "css-what": "^5.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0", + "domutils": "^2.7.0" + } + }, "chokidar": { "version": "2.1.8", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", @@ -1434,6 +1678,28 @@ "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", "dev": true }, + "clipboardy": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/clipboardy/-/clipboardy-2.3.0.tgz", + "integrity": "sha512-mKhiIL2DrQIsuXMgBgnfEHOZOryC7kY7YO//TN6c63wlEm3NG5tz+YgY5rVi29KCmq/QQjKYvM7a19+MDOTHOQ==", + "dev": true, + "requires": { + "arch": "^2.1.1", + "execa": "^1.0.0", + "is-wsl": "^2.1.1" + }, + "dependencies": { + "is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "dev": true, + "requires": { + "is-docker": "^2.0.0" + } + } + } + }, "cliui": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", @@ -1457,6 +1723,17 @@ "integrity": "sha1-4+JbIHrE5wGvch4staFnksrD3Fg=", "dev": true }, + "clone-deep": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", + "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" + } + }, "clone-stats": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz", @@ -1484,6 +1761,177 @@ "semver": "^5.4.1" } }, + "cmake-js": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/cmake-js/-/cmake-js-6.1.0.tgz", + "integrity": "sha512-utmukLQftpgrCpGRCaHnkv4K27HZNNFqmBl4vnvccy0xp4c1erxjFU/Lq4wn5ngAhFZmpwBPQfoKWKThjSBiwg==", + "dev": true, + "requires": { + "debug": "^4", + "fs-extra": "^5.0.0", + "is-iojs": "^1.0.1", + "lodash": "^4", + "memory-stream": "0", + "npmlog": "^1.2.0", + "rc": "^1.2.7", + "request": "^2.54.0", + "semver": "^5.0.3", + "splitargs": "0", + "tar": "^4", + "unzipper": "^0.8.13", + "url-join": "0", + "which": "^1.0.9", + "yargs": "^3.6.0" + }, + "dependencies": { + "camelcase": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", + "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=", + "dev": true + }, + "chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", + "dev": true + }, + "fs-extra": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-5.0.0.tgz", + "integrity": "sha512-66Pm4RYbjzdyeuqudYqhFiNBbCIuI9kgRqLPSHIlXHidW8NIQtVdkM1yeZ4lXwuhbTETv3EUGMNHAAw6hiundQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "fs-minipass": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.7.tgz", + "integrity": "sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==", + "dev": true, + "requires": { + "minipass": "^2.6.0" + } + }, + "minipass": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz", + "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==", + "dev": true, + "requires": { + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" + } + }, + "minizlib": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.3.3.tgz", + "integrity": "sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==", + "dev": true, + "requires": { + "minipass": "^2.9.0" + } + }, + "mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + }, + "process-nextick-args": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", + "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=", + "dev": true + }, + "readable-stream": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.1.5.tgz", + "integrity": "sha1-ZvqLcg4UOLNkaB8q0aY8YYRIydA=", + "dev": true, + "requires": { + "buffer-shims": "^1.0.0", + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "~1.0.0", + "process-nextick-args": "~1.0.6", + "string_decoder": "~0.10.x", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true + }, + "tar": { + "version": "4.4.13", + "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.13.tgz", + "integrity": "sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA==", + "dev": true, + "requires": { + "chownr": "^1.1.1", + "fs-minipass": "^1.2.5", + "minipass": "^2.8.6", + "minizlib": "^1.2.1", + "mkdirp": "^0.5.0", + "safe-buffer": "^5.1.2", + "yallist": "^3.0.3" + } + }, + "unzipper": { + "version": "0.8.14", + "resolved": "https://registry.npmjs.org/unzipper/-/unzipper-0.8.14.tgz", + "integrity": "sha512-8rFtE7EP5ssOwGpN2dt1Q4njl0N1hUXJ7sSPz0leU2hRdq6+pra57z4YPBlVqm40vcgv6ooKZEAx48fMTv9x4w==", + "dev": true, + "requires": { + "big-integer": "^1.6.17", + "binary": "~0.3.0", + "bluebird": "~3.4.1", + "buffer-indexof-polyfill": "~1.0.0", + "duplexer2": "~0.1.4", + "fstream": "~1.0.10", + "listenercount": "~1.0.1", + "readable-stream": "~2.1.5", + "setimmediate": "~1.0.4" + } + }, + "url-join": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/url-join/-/url-join-0.0.1.tgz", + "integrity": "sha1-HbSK1CLTQCRpqH99l73r/k+x48g=", + "dev": true + }, + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + }, + "yargs": { + "version": "3.32.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.32.0.tgz", + "integrity": "sha1-AwiOnr+edWtpdRYR0qXvWRSCyZU=", + "dev": true, + "requires": { + "camelcase": "^2.0.1", + "cliui": "^3.0.3", + "decamelize": "^1.1.1", + "os-locale": "^1.4.0", + "string-width": "^1.0.1", + "window-size": "^0.1.4", + "y18n": "^3.2.0" + } + } + } + }, "code-point-at": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", @@ -1532,6 +1980,15 @@ "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", "dev": true }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "requires": { + "delayed-stream": "~1.0.0" + } + }, "commander": { "version": "2.20.3", "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", @@ -1544,6 +2001,12 @@ "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", "dev": true }, + "compare-versions": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-3.6.0.tgz", + "integrity": "sha512-W6Af2Iw1z4CB7q4uU4hv646dW9GQuBM+YpC0UvUCWSD8w90SJjp+ujJuXaEMtAXBtSqGfMPuFOVn4/+FlaqfBA==", + "dev": true + }, "component-emitter": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", @@ -1573,6 +2036,12 @@ "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==", "dev": true }, + "console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", + "dev": true + }, "constants-browserify": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", @@ -1700,7 +2169,7 @@ }, "create-hash": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", + "resolved": "http://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", "dev": true, "requires": { @@ -1713,7 +2182,7 @@ }, "create-hmac": { "version": "1.1.7", - "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", + "resolved": "http://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", "dev": true, "requires": { @@ -1757,6 +2226,25 @@ "randomfill": "^1.0.3" } }, + "css-select": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.1.3.tgz", + "integrity": "sha512-gT3wBNd9Nj49rAbmtFHj1cljIAOLYSX1nZ8CB7TBO3INYckygm5B7LISU/szY//YmdiSLbJvDLOx9VnMVpMBxA==", + "dev": true, + "requires": { + "boolbase": "^1.0.0", + "css-what": "^5.0.0", + "domhandler": "^4.2.0", + "domutils": "^2.6.0", + "nth-check": "^2.0.0" + } + }, + "css-what": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-5.0.1.tgz", + "integrity": "sha512-FYDTSHb/7KXsWICVsxdmiExPjCfRC4qRFBdVwv7Ax9hMnvMmEjP9RfxTEZ3qPZGmADDn2vAKSo9UcN1jKVYscg==", + "dev": true + }, "cyclist": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-1.0.1.tgz", @@ -1773,6 +2261,15 @@ "type": "^1.0.1" } }, + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0" + } + }, "debug": { "version": "4.3.1", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", @@ -1802,6 +2299,21 @@ "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", "dev": true }, + "decompress-response": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-4.2.1.tgz", + "integrity": "sha512-jOSne2qbyE+/r8G1VU+G/82LBs2Fs4LAsTiLSHOCOMZQl2OKZ6i8i4IyHemTe+/yIXOtTcRQMzPcgyhoFlqPkw==", + "dev": true, + "requires": { + "mimic-response": "^2.0.0" + } + }, + "deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "dev": true + }, "default-compare": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/default-compare/-/default-compare-1.0.0.tgz", @@ -1875,6 +2387,24 @@ } } }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "dev": true + }, + "delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", + "dev": true + }, + "denodeify": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/denodeify/-/denodeify-1.2.1.tgz", + "integrity": "sha1-OjYof1A05pnnV3kBBSwubJQlFjE=", + "dev": true + }, "des.js": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz", @@ -1891,6 +2421,12 @@ "integrity": "sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=", "dev": true }, + "detect-libc": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", + "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=", + "dev": true + }, "diagnostic-channel": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/diagnostic-channel/-/diagnostic-channel-0.2.0.tgz", @@ -1912,7 +2448,7 @@ }, "diffie-hellman": { "version": "5.0.3", - "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", + "resolved": "http://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", "dev": true, "requires": { @@ -1937,12 +2473,49 @@ "path-type": "^4.0.0" } }, + "dom-serializer": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.3.2.tgz", + "integrity": "sha512-5c54Bk5Dw4qAxNOI1pFEizPSjVsx5+bpJKmL2kPn8JhBUq2q09tTCa3mjijun2NfK78NMouDYNMBkOrPZiS+ig==", + "dev": true, + "requires": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + } + }, "domain-browser": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", "dev": true }, + "domelementtype": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz", + "integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==", + "dev": true + }, + "domhandler": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.2.0.tgz", + "integrity": "sha512-zk7sgt970kzPks2Bf+dwT/PLzghLnsivb9CcxkvR8Mzr66Olr0Ofd8neSbglHJHaHa2MadfoSdNlKYAaafmWfA==", + "dev": true, + "requires": { + "domelementtype": "^2.2.0" + } + }, + "domutils": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.7.0.tgz", + "integrity": "sha512-8eaHa17IwJUPAiB+SoTYBo5mCdeMgdcAoXJ59m6DT1vw+5iLS3gNoqYaRowaBKtGVrOF1Jz4yDTgYKLK2kvfJg==", + "dev": true, + "requires": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + } + }, "duplexer2": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", @@ -1974,6 +2547,16 @@ "object.defaults": "^1.1.0" } }, + "ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", + "dev": true, + "requires": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, "elliptic": { "version": "6.5.4", "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", @@ -2037,6 +2620,12 @@ "tapable": "^1.0.0" } }, + "entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "dev": true + }, "errno": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz", @@ -2166,6 +2755,21 @@ "safe-buffer": "^5.1.1" } }, + "execa": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "dev": true, + "requires": { + "cross-spawn": "^6.0.0", + "get-stream": "^4.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + } + }, "expand-brackets": { "version": "2.1.4", "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", @@ -2210,6 +2814,12 @@ } } }, + "expand-template": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", + "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==", + "dev": true + }, "expand-tilde": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", @@ -2328,6 +2938,12 @@ } } }, + "extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", + "dev": true + }, "fancy-log": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/fancy-log/-/fancy-log-1.3.3.tgz", @@ -2379,6 +2995,15 @@ "reusify": "^1.0.4" } }, + "fd-slicer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", + "integrity": "sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4=", + "dev": true, + "requires": { + "pend": "~1.2.0" + } + }, "figgy-pudding": { "version": "3.5.2", "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.2.tgz", @@ -2389,8 +3014,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", - "dev": true, - "optional": true + "dev": true }, "fill-range": { "version": "7.0.1", @@ -2593,6 +3217,23 @@ "for-in": "^1.0.1" } }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "dev": true + }, + "form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "dev": true, + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + }, "fragment-cache": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", @@ -2612,6 +3253,12 @@ "readable-stream": "^2.0.0" } }, + "fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", + "dev": true + }, "fs-extra": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", @@ -2708,6 +3355,19 @@ "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", "dev": true }, + "gauge": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-1.2.7.tgz", + "integrity": "sha1-6c7FSD09TuDvRLYKfZnkk14TbZM=", + "dev": true, + "requires": { + "ansi": "^0.3.0", + "has-unicode": "^2.0.0", + "lodash.pad": "^4.1.0", + "lodash.padend": "^4.1.0", + "lodash.padstart": "^4.1.0" + } + }, "get-caller-file": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", @@ -2725,12 +3385,48 @@ "has-symbols": "^1.0.1" } }, + "get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "dev": true, + "requires": { + "pump": "^3.0.0" + }, + "dependencies": { + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + } + } + }, "get-value": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", "dev": true }, + "getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0" + } + }, + "github-from-package": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", + "integrity": "sha1-l/tdlr/eiXMxPyDoKI75oWf6ZM4=", + "dev": true + }, "glob": { "version": "7.1.6", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", @@ -2952,6 +3648,22 @@ "glogg": "^1.0.0" } }, + "har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", + "dev": true + }, + "har-validator": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", + "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", + "dev": true, + "requires": { + "ajv": "^6.12.3", + "har-schema": "^2.0.0" + } + }, "has": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", @@ -2973,6 +3685,12 @@ "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", "dev": true }, + "has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", + "dev": true + }, "has-value": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", @@ -3091,6 +3809,18 @@ "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", "dev": true }, + "htmlparser2": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", + "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", + "dev": true, + "requires": { + "domelementtype": "^2.0.1", + "domhandler": "^4.0.0", + "domutils": "^2.5.2", + "entities": "^2.0.0" + } + }, "http-proxy-agent": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", @@ -3102,6 +3832,17 @@ "debug": "4" } }, + "http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + } + }, "https-browserify": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", @@ -3135,6 +3876,12 @@ "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==" }, + "immediate": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", + "integrity": "sha1-nbHb0Pr43m++D13V5Wu2BigN5ps=", + "dev": true + }, "import-local": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz", @@ -3350,6 +4097,12 @@ } } }, + "is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "dev": true + }, "is-extendable": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", @@ -3378,6 +4131,12 @@ "is-extglob": "^2.1.1" } }, + "is-iojs": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-iojs/-/is-iojs-1.1.0.tgz", + "integrity": "sha1-TBEDO11dlNbqs3dd7cm+fQCDJfE=", + "dev": true + }, "is-negated-glob": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-negated-glob/-/is-negated-glob-1.0.0.tgz", @@ -3413,6 +4172,18 @@ "is-unc-path": "^1.0.0" } }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "dev": true + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "dev": true + }, "is-unc-path": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz", @@ -3464,6 +4235,12 @@ "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", "dev": true }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", + "dev": true + }, "js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -3480,12 +4257,24 @@ "esprima": "^4.0.0" } }, + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", + "dev": true + }, "json-parse-better-errors": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", "dev": true }, + "json-schema": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", + "dev": true + }, "json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", @@ -3498,6 +4287,12 @@ "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", "dev": true }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", + "dev": true + }, "json5": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", @@ -3515,6 +4310,30 @@ "graceful-fs": "^4.1.6" } }, + "jsprim": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "dev": true, + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" + } + }, + "jszip": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.6.0.tgz", + "integrity": "sha512-jgnQoG9LKnWO3mnVNBnfhkh0QknICd1FGSrXcgrl67zioyJ4wgx25o9ZqwNtrROSflGBCGYnJfjrIyRIby1OoQ==", + "dev": true, + "requires": { + "lie": "~3.3.0", + "pako": "~1.0.2", + "readable-stream": "~2.3.6", + "set-immediate-shim": "~1.0.1" + } + }, "just-debounce": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/just-debounce/-/just-debounce-1.0.0.tgz", @@ -3564,6 +4383,21 @@ "flush-write-stream": "^1.0.2" } }, + "leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "dev": true + }, + "lie": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", + "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", + "dev": true, + "requires": { + "immediate": "~3.0.5" + } + }, "liftoff": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/liftoff/-/liftoff-3.1.0.tgz", @@ -3580,6 +4414,15 @@ "resolve": "^1.1.7" } }, + "linkify-it": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-2.2.0.tgz", + "integrity": "sha512-GnAl/knGn+i1U/wjBz3akz2stz+HrHLsxMwHQGofCDfPvlf+gDKN58UtfmUquTY4/MXeE2x7k19KQmeoZi94Iw==", + "dev": true, + "requires": { + "uc.micro": "^1.0.1" + } + }, "listenercount": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/listenercount/-/listenercount-1.0.1.tgz", @@ -3588,7 +4431,7 @@ }, "load-json-file": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "resolved": "http://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", "dev": true, "requires": { @@ -3630,6 +4473,24 @@ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" }, + "lodash.pad": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/lodash.pad/-/lodash.pad-4.5.1.tgz", + "integrity": "sha1-QzCUmoM6fI2iLMIPaibE1Z3runA=", + "dev": true + }, + "lodash.padend": { + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/lodash.padend/-/lodash.padend-4.6.1.tgz", + "integrity": "sha1-U8y6BH0G4VjTEfRdpiX05J5vFm4=", + "dev": true + }, + "lodash.padstart": { + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/lodash.padstart/-/lodash.padstart-4.6.1.tgz", + "integrity": "sha1-0uPuv/DZ05rVD1y9G1KnvOa7YRs=", + "dev": true + }, "log-symbols": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.0.0.tgz", @@ -3695,6 +4556,27 @@ "object-visit": "^1.0.0" } }, + "markdown-it": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-10.0.0.tgz", + "integrity": "sha512-YWOP1j7UbDNz+TumYP1kpwnP0aEa711cJjrAQrzd0UXlbJfc5aAq0F/PZHjiioqDC1NKgvIMX+o+9Bk7yuM2dg==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "entities": "~2.0.0", + "linkify-it": "^2.0.0", + "mdurl": "^1.0.1", + "uc.micro": "^1.0.5" + }, + "dependencies": { + "entities": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.0.3.tgz", + "integrity": "sha512-MyoZ0jgnLvB2X3Lg5HqpFmn1kybDiIfEQmKzTb5apr51Rb+T3KdmMiqa70T+bhGnyv7bQ6WMj2QMHpGMmlrUYQ==", + "dev": true + } + } + }, "matchdep": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/matchdep/-/matchdep-2.0.0.tgz", @@ -3844,6 +4726,12 @@ "safe-buffer": "^5.1.2" } }, + "mdurl": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", + "integrity": "sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4=", + "dev": true + }, "memory-fs": { "version": "0.5.0", "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.5.0.tgz", @@ -3854,6 +4742,41 @@ "readable-stream": "^2.0.1" } }, + "memory-stream": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/memory-stream/-/memory-stream-0.0.3.tgz", + "integrity": "sha1-6+jdHDuLw4wOeUHp3dWuvmtN6D8=", + "dev": true, + "requires": { + "readable-stream": "~1.0.26-2" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + }, + "readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true + } + } + }, "merge2": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", @@ -3886,6 +4809,33 @@ } } }, + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true + }, + "mime-db": { + "version": "1.47.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.47.0.tgz", + "integrity": "sha512-QBmA/G2y+IfeS4oktet3qRZ+P5kPhCKRXxXnQEudYqUaEioAU1/Lq2us3D/t1Jfo4hE9REQPrbB7K5sOczJVIw==", + "dev": true + }, + "mime-types": { + "version": "2.1.30", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.30.tgz", + "integrity": "sha512-crmjA4bLtR8m9qLpHvgxSChT+XoSlZi8J4n/aIdn3z92e/U47Z0V/yl+Wh9W046GgFVAmoNR/fmdbZYcSSIUeg==", + "dev": true, + "requires": { + "mime-db": "1.47.0" + } + }, + "mimic-response": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-2.1.0.tgz", + "integrity": "sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA==", + "dev": true + }, "minimalistic-assert": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", @@ -4015,6 +4965,12 @@ "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", "dev": true }, + "mkdirp-classic": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", + "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", + "dev": true + }, "mocha": { "version": "8.3.1", "resolved": "https://registry.npmjs.org/mocha/-/mocha-8.3.1.tgz", @@ -4270,6 +5226,49 @@ } } }, + "monaco-page-objects": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/monaco-page-objects/-/monaco-page-objects-1.6.2.tgz", + "integrity": "sha512-RALRVtMrEi0Ax1tNxtOWhqREKm/eaQGT1kf+N+wKkvoKynL/lIeNDY67UX9K3iAKVB5ed1LvqUWqnbRpR1khYw==", + "dev": true, + "requires": { + "clipboardy": "^2.0.0", + "clone-deep": "^4.0.1", + "compare-versions": "^3.5.1", + "fs-extra": "^9.0.1", + "ts-essentials": "^7.0.0" + }, + "dependencies": { + "fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dev": true, + "requires": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + } + }, + "jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6", + "universalify": "^2.0.0" + } + }, + "universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "dev": true + } + } + }, "move-concurrently": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", @@ -4316,12 +5315,17 @@ "integrity": "sha512-kDcwXR4PS7caBpuRYYBUz9iVixUk3anO3f5OYFiIPwK/20vCzKCHyKoulbiDY1S53zD2bxUpxN/IJ+TnXjfvxg==", "dev": true }, + "mute-stream": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", + "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", + "dev": true + }, "nan": { "version": "2.14.2", "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.2.tgz", "integrity": "sha512-M2ufzIiINKCuDfBSAUr1vWQ+vuVcA9kqx8JJUsbQi6yf1uGRyb7HfpdfUr5qLXf3B/t8dPvcjhKMmlfnP47EzQ==", - "dev": true, - "optional": true + "dev": true }, "nanoid": { "version": "3.1.20", @@ -4348,6 +5352,21 @@ "to-regex": "^3.0.1" } }, + "napi-build-utils": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz", + "integrity": "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==", + "dev": true + }, + "native-node-utils": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/native-node-utils/-/native-node-utils-0.2.7.tgz", + "integrity": "sha512-61v0G3uVxWlXHppSZGwZi+ZEIgGUKI8QvEkEJLb1GVePI7P8SBe+G747z+QMXSt4TxfgbVZP0DyobbRKYVIjdw==", + "dev": true, + "requires": { + "nan": "^2.13.2" + } + }, "neo-async": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", @@ -4366,6 +5385,21 @@ "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", "dev": true }, + "node-abi": { + "version": "2.30.0", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-2.30.0.tgz", + "integrity": "sha512-g6bZh3YCKQRdwuO/tSZZYJAw622SjsRfJ2X0Iy4sSOHZ34/sPPdVBn8fev2tj7njzLwuqPw9uMtGsGkO5kIQvg==", + "dev": true, + "requires": { + "semver": "^5.4.1" + } + }, + "node-addon-api": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-3.0.0.tgz", + "integrity": "sha512-sSHCgWfJ+Lui/u+0msF3oyCgvdkhxDbkCS6Q8uiJquzOimkJBvX6hl5aSSA7DR1XbMpdM8r7phjcF63sF4rkKg==", + "dev": true + }, "node-libs-browser": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.1.tgz", @@ -4405,6 +5439,12 @@ } } }, + "noop-logger": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/noop-logger/-/noop-logger-0.1.1.tgz", + "integrity": "sha1-lKKxYzxPExdVMAfYlm/Q6EG2pMI=", + "dev": true + }, "normalize-package-data": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", @@ -4432,12 +5472,47 @@ "once": "^1.3.2" } }, + "npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "dev": true, + "requires": { + "path-key": "^2.0.0" + } + }, + "npmlog": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-1.2.1.tgz", + "integrity": "sha1-KOe+YZYJtT960d0wChDWTXFiaLY=", + "dev": true, + "requires": { + "ansi": "~0.3.0", + "are-we-there-yet": "~1.0.0", + "gauge": "~1.2.0" + } + }, + "nth-check": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.0.0.tgz", + "integrity": "sha512-i4sc/Kj8htBrAiH1viZ0TgU8Y5XqCaV/FziYK6TBczxmeKm3AEFWqqF3195yKudrarqy7Zu80Ra5dobFjn9X/Q==", + "dev": true, + "requires": { + "boolbase": "^1.0.0" + } + }, "number-is-nan": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", "dev": true }, + "oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", + "dev": true + }, "object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", @@ -4475,6 +5550,12 @@ } } }, + "object-inspect": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.11.0.tgz", + "integrity": "sha512-jp7ikS6Sd3GxQfZJPyH3cjcbJF6GZPClgdV+EFygjFLQ5FmW/dRUnTd9PQ9k0JhoNDabWFbpF1yCdSWCC6gexg==", + "dev": true + }, "object-keys": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", @@ -4552,6 +5633,59 @@ "wrappy": "1" } }, + "opencv4nodejs-prebuilt": { + "version": "5.3.0-2", + "resolved": "https://registry.npmjs.org/opencv4nodejs-prebuilt/-/opencv4nodejs-prebuilt-5.3.0-2.tgz", + "integrity": "sha512-l0JealJQRgSnvQHMFDP2mM/hFn8o9zOqPjljGyAzSFXzJZkR0KgXbm66Ezwjsk+IcaSo90+OUMz3D645lNUdVw==", + "dev": true, + "requires": { + "@types/node": ">6", + "nan": "^2.14.0", + "native-node-utils": "^0.2.7", + "npmlog": "^4.1.2", + "prebuild-install": "^5.3.3" + }, + "dependencies": { + "are-we-there-yet": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", + "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", + "dev": true, + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + } + }, + "gauge": { + "version": "2.7.4", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", + "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", + "dev": true, + "requires": { + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" + } + }, + "npmlog": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", + "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", + "dev": true, + "requires": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" + } + } + } + }, "ordered-read-streams": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/ordered-read-streams/-/ordered-read-streams-1.0.1.tgz", @@ -4567,15 +5701,43 @@ "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=", "dev": true }, + "os-homedir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", + "dev": true + }, "os-locale": { "version": "1.4.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", + "resolved": "http://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", "dev": true, "requires": { "lcid": "^1.0.0" } }, + "os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", + "dev": true + }, + "osenv": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", + "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", + "dev": true, + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, + "p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", + "dev": true + }, "p-limit": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", @@ -4682,6 +5844,30 @@ "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=", "dev": true }, + "parse-semver": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/parse-semver/-/parse-semver-1.1.1.tgz", + "integrity": "sha1-mkr9bfBj3Egm+T+6SpnPIj9mbLg=", + "dev": true, + "requires": { + "semver": "^5.1.0" + } + }, + "parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", + "dev": true + }, + "parse5-htmlparser2-tree-adapter": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-6.0.1.tgz", + "integrity": "sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA==", + "dev": true, + "requires": { + "parse5": "^6.0.1" + } + }, "pascalcase": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", @@ -4757,6 +5943,18 @@ "sha.js": "^2.4.8" } }, + "pend": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=", + "dev": true + }, + "performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", + "dev": true + }, "picomatch": { "version": "2.2.2", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", @@ -4850,6 +6048,157 @@ "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", "dev": true }, + "prebuild-install": { + "version": "5.3.6", + "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-5.3.6.tgz", + "integrity": "sha512-s8Aai8++QQGi4sSbs/M1Qku62PFK49Jm1CbgXklGz4nmHveDq0wzJkg7Na5QbnO1uNH8K7iqx2EQ/mV0MZEmOg==", + "dev": true, + "requires": { + "detect-libc": "^1.0.3", + "expand-template": "^2.0.3", + "github-from-package": "0.0.0", + "minimist": "^1.2.3", + "mkdirp-classic": "^0.5.3", + "napi-build-utils": "^1.0.1", + "node-abi": "^2.7.0", + "noop-logger": "^0.1.1", + "npmlog": "^4.0.1", + "pump": "^3.0.0", + "rc": "^1.2.7", + "simple-get": "^3.0.3", + "tar-fs": "^2.0.0", + "tunnel-agent": "^0.6.0", + "which-pm-runs": "^1.0.0" + }, + "dependencies": { + "are-we-there-yet": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", + "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", + "dev": true, + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + } + }, + "bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "dev": true, + "requires": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } + } + }, + "buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "dev": true, + "requires": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", + "dev": true + }, + "gauge": { + "version": "2.7.4", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", + "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", + "dev": true, + "requires": { + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" + } + }, + "npmlog": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", + "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", + "dev": true, + "requires": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" + } + }, + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "tar-fs": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", + "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==", + "dev": true, + "requires": { + "chownr": "^1.1.1", + "mkdirp-classic": "^0.5.2", + "pump": "^3.0.0", + "tar-stream": "^2.1.4" + } + }, + "tar-stream": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", + "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", + "dev": true, + "requires": { + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } + } + } + } + }, "pretty-hrtime": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz", @@ -4880,6 +6229,12 @@ "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=", "dev": true }, + "psl": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", + "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==", + "dev": true + }, "public-encrypt": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", @@ -4929,6 +6284,12 @@ "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", "dev": true }, + "qs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", + "dev": true + }, "querystring": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", @@ -4960,6 +6321,35 @@ "safe-buffer": "^5.1.0" } }, + "rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "dev": true, + "requires": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "dependencies": { + "strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", + "dev": true + } + } + }, + "read": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/read/-/read-1.0.7.tgz", + "integrity": "sha1-s9oZvQUkMal2cdRKQmNK33ELQMQ=", + "dev": true, + "requires": { + "mute-stream": "~0.0.4" + } + }, "read-pkg": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", @@ -5229,6 +6619,34 @@ "remove-trailing-separator": "^1.1.0" } }, + "request": { + "version": "2.88.2", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", + "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", + "dev": true, + "requires": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.3", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.5.0", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + } + }, "require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -5356,6 +6774,21 @@ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", "dev": true }, + "sanitize-filename": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/sanitize-filename/-/sanitize-filename-1.6.3.tgz", + "integrity": "sha512-y/52Mcy7aw3gRm7IrcGDFx/bCk4AhRh2eI9luHOQM86nZsqwiRkkq2GekHXBBD+SmPidc8i2PqtYZl+pWJ8Oeg==", + "dev": true, + "requires": { + "truncate-utf8-bytes": "^1.0.0" + } + }, + "sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", + "dev": true + }, "schema-utils": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz", @@ -5367,6 +6800,29 @@ "ajv-keywords": "^3.5.2" } }, + "selenium-webdriver": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/selenium-webdriver/-/selenium-webdriver-3.6.0.tgz", + "integrity": "sha512-WH7Aldse+2P5bbFBO4Gle/nuQOdVwpHMTL6raL3uuBj/vPG07k6uzt3aiahu352ONBr5xXh0hDlM3LhtXPOC4Q==", + "dev": true, + "requires": { + "jszip": "^3.1.3", + "rimraf": "^2.5.4", + "tmp": "0.0.30", + "xml2js": "^0.4.17" + }, + "dependencies": { + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + } + } + }, "semver": { "version": "5.7.1", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", @@ -5396,6 +6852,12 @@ "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", "dev": true }, + "set-immediate-shim": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz", + "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=", + "dev": true + }, "set-value": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", @@ -5427,7 +6889,7 @@ }, "sha.js": { "version": "2.4.11", - "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "resolved": "http://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", "dev": true, "requires": { @@ -5435,6 +6897,15 @@ "safe-buffer": "^5.0.1" } }, + "shallow-clone": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", + "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", + "dev": true, + "requires": { + "kind-of": "^6.0.2" + } + }, "shebang-command": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", @@ -5455,6 +6926,53 @@ "resolved": "https://registry.npmjs.org/shimmer/-/shimmer-1.2.1.tgz", "integrity": "sha512-sQTKC1Re/rM6XyFM6fIAGHRPVGvyXfgzIDvzoq608vM+jeyVD0Tu1E6Np0Kc2zAIFWIj963V2800iF/9LPieQw==" }, + "side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + }, + "dependencies": { + "get-intrinsic": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", + "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1" + } + } + } + }, + "signal-exit": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", + "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", + "dev": true + }, + "simple-concat": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", + "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", + "dev": true + }, + "simple-get": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-3.1.0.tgz", + "integrity": "sha512-bCR6cP+aTdScaQCnQKbPKtJOKDp/hj9EDLJo3Nw4y1QksqaovlW/bnptB6/c1e+qmNIDHRK+oXFDdEqBT8WzUA==", + "dev": true, + "requires": { + "decompress-response": "^4.2.0", + "once": "^1.3.1", + "simple-concat": "^1.0.0" + } + }, "slash": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", @@ -5670,12 +7188,35 @@ "extend-shallow": "^3.0.0" } }, + "splitargs": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/splitargs/-/splitargs-0.0.7.tgz", + "integrity": "sha1-/p965lc3GzOxDLgNoUPPgknPazs=", + "dev": true + }, "sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", "dev": true }, + "sshpk": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", + "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", + "dev": true, + "requires": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + } + }, "ssri": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.1.tgz", @@ -5808,6 +7349,12 @@ "is-utf8": "^0.2.0" } }, + "strip-eof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", + "dev": true + }, "strip-json-comments": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", @@ -5853,6 +7400,69 @@ "yallist": "^4.0.0" } }, + "tar-fs": { + "version": "1.16.3", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-1.16.3.tgz", + "integrity": "sha512-NvCeXpYx7OsmOh8zIOP/ebG55zZmxLE0etfWRbWok+q2Qo8x/vOR/IJT1taADXPe+jsiu9axDb3X4B+iIgNlKw==", + "dev": true, + "requires": { + "chownr": "^1.0.1", + "mkdirp": "^0.5.1", + "pump": "^1.0.0", + "tar-stream": "^1.1.2" + }, + "dependencies": { + "chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", + "dev": true + }, + "mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + }, + "pump": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/pump/-/pump-1.0.3.tgz", + "integrity": "sha512-8k0JupWme55+9tCVE+FS5ULT3K6AbgqrGa58lTT49RpyfwwcGedHqaC5LlQNdEAumn/wFsu6aPwkuPMioy8kqw==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + } + } + }, + "tar-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.6.2.tgz", + "integrity": "sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A==", + "dev": true, + "requires": { + "bl": "^1.0.0", + "buffer-alloc": "^1.2.0", + "end-of-stream": "^1.0.0", + "fs-constants": "^1.0.0", + "readable-stream": "^2.3.0", + "to-buffer": "^1.1.1", + "xtend": "^4.0.0" + } + }, + "targz": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/targz/-/targz-1.0.1.tgz", + "integrity": "sha1-j3alI2lM3t+7XWCkB2/27uzFOY8=", + "dev": true, + "requires": { + "tar-fs": "^1.8.1" + } + }, "tas-client": { "version": "0.1.21", "resolved": "https://registry.npmjs.org/tas-client/-/tas-client-0.1.21.tgz", @@ -6114,6 +7724,15 @@ "setimmediate": "^1.0.4" } }, + "tmp": { + "version": "0.0.30", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.30.tgz", + "integrity": "sha1-ckGdSovn1s51FI/YsyTlk6cRwu0=", + "dev": true, + "requires": { + "os-tmpdir": "~1.0.1" + } + }, "to-absolute-glob": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/to-absolute-glob/-/to-absolute-glob-2.0.2.tgz", @@ -6130,6 +7749,12 @@ "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=", "dev": true }, + "to-buffer": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/to-buffer/-/to-buffer-1.1.1.tgz", + "integrity": "sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg==", + "dev": true + }, "to-object-path": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", @@ -6179,12 +7804,37 @@ "through2": "^2.0.3" } }, + "tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "dev": true, + "requires": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + } + }, "traverse": { "version": "0.3.9", "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.3.9.tgz", "integrity": "sha1-cXuPIgzAu3tE5AUUwisui7xw2Lk=", "dev": true }, + "truncate-utf8-bytes": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/truncate-utf8-bytes/-/truncate-utf8-bytes-1.0.2.tgz", + "integrity": "sha1-QFkjkJWS1W94pYGENLC3hInKXys=", + "dev": true, + "requires": { + "utf8-byte-length": "^1.0.1" + } + }, + "ts-essentials": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/ts-essentials/-/ts-essentials-7.0.2.tgz", + "integrity": "sha512-qWPVC1xZGdefbsgFP7tPo+bsgSA2ZIXL1XeEe5M2WoMZxIOr/HbsHxP/Iv75IFhiMHMDGL7cOOwi5SXcgx9mHw==", + "dev": true + }, "ts-loader": { "version": "5.4.5", "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-5.4.5.tgz", @@ -6484,16 +8134,59 @@ }, "tty-browserify": { "version": "0.0.0", - "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", + "resolved": "http://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=", "dev": true }, + "tunnel": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/tunnel/-/tunnel-0.0.6.tgz", + "integrity": "sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==", + "dev": true + }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "dev": true, + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", + "dev": true + }, "type": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==", "dev": true }, + "typed-rest-client": { + "version": "1.8.4", + "resolved": "https://registry.npmjs.org/typed-rest-client/-/typed-rest-client-1.8.4.tgz", + "integrity": "sha512-MyfKKYzk3I6/QQp6e1T50py4qg+c+9BzOEl2rBmQIpStwNUoqQ73An+Tkfy9YuV7O+o2mpVVJpe+fH//POZkbg==", + "dev": true, + "requires": { + "qs": "^6.9.1", + "tunnel": "0.0.6", + "underscore": "^1.12.1" + }, + "dependencies": { + "qs": { + "version": "6.10.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.1.tgz", + "integrity": "sha512-M528Hph6wsSVOBiYUnGf+K/7w0hNshs/duGsNXPUCLH5XAqjEtiPGwNONLV0tBH8NoGb0mvD5JubnUTrujKDTg==", + "dev": true, + "requires": { + "side-channel": "^1.0.4" + } + } + } + }, "typedarray": { "version": "0.0.6", "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", @@ -6506,12 +8199,24 @@ "integrity": "sha512-kdMjTiekY+z/ubJCATUPlRDl39vXYiMV9iyeMuEuXZh2we6zz80uovNN2WlAxmmdE/Z/YQe+EbOEXB5RHEED3w==", "dev": true }, + "uc.micro": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz", + "integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==", + "dev": true + }, "unc-path-regex": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", "integrity": "sha1-5z3T17DXxe2G+6xrCufYxqadUPo=", "dev": true }, + "underscore": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.1.tgz", + "integrity": "sha512-hzSoAVtJF+3ZtiFX0VgfFPHEDRm7Y/QPjGyNo4TVdnDTdft3tr8hEkD25a1jC+TjTuE7tkHGKkhwCgs9dgBB2g==", + "dev": true + }, "undertaker": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/undertaker/-/undertaker-1.3.0.tgz", @@ -6621,6 +8326,27 @@ } } }, + "unzip-stream": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/unzip-stream/-/unzip-stream-0.3.1.tgz", + "integrity": "sha512-RzaGXLNt+CW+T41h1zl6pGz3EaeVhYlK+rdAap+7DxW5kqsqePO8kRtWPaCiVqdhZc86EctSPVYNix30YOMzmw==", + "dev": true, + "requires": { + "binary": "^0.3.0", + "mkdirp": "^0.5.1" + }, + "dependencies": { + "mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + } + } + }, "unzipper": { "version": "0.10.11", "resolved": "https://registry.npmjs.org/unzipper/-/unzipper-0.10.11.tgz", @@ -6678,12 +8404,24 @@ } } }, + "url-join": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/url-join/-/url-join-1.1.0.tgz", + "integrity": "sha1-dBxsL0WWxIMNZxhGCSDQySIC3Hg=", + "dev": true + }, "use": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", "dev": true }, + "utf8-byte-length": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/utf8-byte-length/-/utf8-byte-length-1.0.4.tgz", + "integrity": "sha1-9F8VDExm7uloGGUFq5P8u4rWv2E=", + "dev": true + }, "util": { "version": "0.11.1", "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz", @@ -6743,6 +8481,17 @@ "integrity": "sha1-HCQ6ULWVwb5Up1S/7OhWO5/42BM=", "dev": true }, + "verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, "vinyl": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.2.1.tgz", @@ -6814,6 +8563,107 @@ "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==", "dev": true }, + "vsce": { + "version": "1.95.1", + "resolved": "https://registry.npmjs.org/vsce/-/vsce-1.95.1.tgz", + "integrity": "sha512-2v8g3ZtZkaOTscRjjCAtM3Au6YYWJtg9UNt1iyyWko7ZHejbt5raClcNzQ7/WYVLYhYHc+otHQifV0gCBREgNg==", + "dev": true, + "requires": { + "azure-devops-node-api": "^11.0.1", + "chalk": "^2.4.2", + "cheerio": "^1.0.0-rc.9", + "commander": "^6.1.0", + "denodeify": "^1.2.1", + "glob": "^7.0.6", + "leven": "^3.1.0", + "lodash": "^4.17.15", + "markdown-it": "^10.0.0", + "mime": "^1.3.4", + "minimatch": "^3.0.3", + "osenv": "^0.1.3", + "parse-semver": "^1.1.1", + "read": "^1.0.7", + "semver": "^5.1.0", + "tmp": "^0.2.1", + "typed-rest-client": "^1.8.4", + "url-join": "^1.1.0", + "yauzl": "^2.3.1", + "yazl": "^2.2.2" + }, + "dependencies": { + "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, + "requires": { + "color-convert": "^1.9.0" + } + }, + "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, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "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, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "commander": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz", + "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==", + "dev": true + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "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, + "requires": { + "has-flag": "^3.0.0" + } + }, + "tmp": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", + "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", + "dev": true, + "requires": { + "rimraf": "^3.0.0" + } + } + } + }, "vscode-extension-telemetry": { "version": "0.1.6", "resolved": "https://registry.npmjs.org/vscode-extension-telemetry/-/vscode-extension-telemetry-0.1.6.tgz", @@ -6831,6 +8681,111 @@ "vscode-extension-telemetry": "^0.1.6" } }, + "vscode-extension-tester": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/vscode-extension-tester/-/vscode-extension-tester-4.1.1.tgz", + "integrity": "sha512-toKO1cfwOORwc++5v4SE0Y/ouLINWPqGVkV88JGWvY9sdYN8W+2uUkgZ/Zfw5Vq8bDaP/Aqt7Yf1jZ0xOADh7g==", + "dev": true, + "requires": { + "@types/selenium-webdriver": "^3.0.15", + "commander": "^6.1.0", + "compare-versions": "^3.6.0", + "fs-extra": "^9.0.1", + "glob": "^7.1.6", + "js-yaml": "^3.13.1", + "monaco-page-objects": "^1.6.2", + "request": "^2.88.0", + "sanitize-filename": "^1.6.3", + "selenium-webdriver": "^3.0.0", + "targz": "^1.0.1", + "unzip-stream": "^0.3.0", + "vsce": "^1.81.0", + "vscode-extension-tester-locators": "^1.58.0" + }, + "dependencies": { + "commander": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz", + "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==", + "dev": true + }, + "fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dev": true, + "requires": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + } + }, + "jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6", + "universalify": "^2.0.0" + } + }, + "universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "dev": true + } + } + }, + "vscode-extension-tester-locators": { + "version": "1.58.0", + "resolved": "https://registry.npmjs.org/vscode-extension-tester-locators/-/vscode-extension-tester-locators-1.58.0.tgz", + "integrity": "sha512-fX7CW+q/s35YCmGCUWddkYxLJfy7w8hYc7wSOtvt1jQKwijg5ffsf8c7reMLWw+ZBSMaHpMsO63ot/FrNtF3cA==", + "dev": true + }, + "vscode-extension-tester-native": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/vscode-extension-tester-native/-/vscode-extension-tester-native-3.0.2.tgz", + "integrity": "sha512-jWtSU9b8mxJOWHhzF18Qc4uzNvE3+2Ilw7aZ9PQzfJA9zh8C2PUYjKwhCmGaMSGJXFHuVrrRVUZ9inh03QxW/w==", + "dev": true, + "requires": { + "@nut-tree/nut-js": "1.5.0", + "clipboardy": "^2.0.0", + "fs-extra": "^9.0.1" + }, + "dependencies": { + "fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dev": true, + "requires": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + } + }, + "jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6", + "universalify": "^2.0.0" + } + }, + "universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "dev": true + } + } + }, "vscode-tas-client": { "version": "0.1.22", "resolved": "https://registry.npmjs.org/vscode-tas-client/-/vscode-tas-client-0.1.22.tgz", @@ -7454,6 +9409,12 @@ "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=", "dev": true }, + "which-pm-runs": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/which-pm-runs/-/which-pm-runs-1.0.0.tgz", + "integrity": "sha1-Zws6+8VS4LVd9rd4DKdGFfI60cs=", + "dev": true + }, "wide-align": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", @@ -7463,6 +9424,12 @@ "string-width": "^1.0.2 || 2" } }, + "window-size": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.4.tgz", + "integrity": "sha1-+OGqHuWlPsW/FR/6CXQqatdpeHY=", + "dev": true + }, "worker-farm": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.7.0.tgz", @@ -7480,7 +9447,7 @@ }, "wrap-ansi": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "resolved": "http://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", "dev": true, "requires": { @@ -7494,6 +9461,22 @@ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", "dev": true }, + "xml2js": { + "version": "0.4.23", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz", + "integrity": "sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==", + "dev": true, + "requires": { + "sax": ">=0.6.0", + "xmlbuilder": "~11.0.0" + } + }, + "xmlbuilder": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", + "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", + "dev": true + }, "xtend": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", @@ -7569,6 +9552,25 @@ } } }, + "yauzl": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk=", + "dev": true, + "requires": { + "buffer-crc32": "~0.2.3", + "fd-slicer": "~1.1.0" + } + }, + "yazl": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/yazl/-/yazl-2.5.1.tgz", + "integrity": "sha512-phENi2PLiHnHb6QBVot+dJnaAZ0xosj7p3fWl+znIjBDlnMI2PsZCJZ306BPTFOaHf5qdDEI8x5qFrSOBN5vrw==", + "dev": true, + "requires": { + "buffer-crc32": "~0.2.3" + } + }, "yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", diff --git a/package.json b/package.json index 87be2b10..b4279ce2 100644 --- a/package.json +++ b/package.json @@ -583,6 +583,7 @@ "compile": "tsc -p . && webpack --config webpack.config.js", "watch": "webpack --mode development --watch --info-verbosity verbose", "test": "tsc -p . && node ./dist/test/index.js", + "test-ui": "tsc -p . && node ./dist/test/ui/index.js", "build-server": "./node_modules/.bin/gulp build_server", "vscode:prepublish": "tsc -p ./ && webpack --mode production" }, @@ -604,6 +605,8 @@ "tslint": "^5.20.1", "typescript": "^3.9.9", "vscode-test": "^1.5.1", + "vscode-extension-tester": "^4.1.1", + "vscode-extension-tester-native": "^3.0.2", "webpack": "^4.46.0", "webpack-cli": "^3.3.12" }, diff --git a/test/index.ts b/test/index.ts index bf3a9417..d844bc55 100644 --- a/test/index.ts +++ b/test/index.ts @@ -2,6 +2,7 @@ // Licensed under the MIT license. import * as cp from "child_process"; +import * as os from "os"; import * as path from "path"; import { downloadAndUnzipVSCode, resolveCliPathFromVSCodeExecutablePath, runTests } from "vscode-test"; @@ -66,9 +67,21 @@ async function main(): Promise { ], }); + // Run test for invisible project + await runTests({ + vscodeExecutablePath, + extensionDevelopmentPath, + extensionTestsPath: path.resolve(__dirname, "./invisible-suite"), + launchArgs: [ + path.join(__dirname, "..", "..", "test", "invisible"), + "--disable-workspace-trust", + ], + }); + process.exit(0); } catch (err) { + process.stdout.write(`${err}${os.EOL}`); process.exit(1); } } diff --git a/test/invisible-suite/index.ts b/test/invisible-suite/index.ts new file mode 100644 index 00000000..3e503ad8 --- /dev/null +++ b/test/invisible-suite/index.ts @@ -0,0 +1,41 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT license. + +import * as glob from "glob"; +import * as Mocha from "mocha"; +import * as path from "path"; + +export function run(): Promise { + // Create the mocha test + const mocha = new Mocha({ + ui: "tdd", + color: true, + timeout: 1 * 60 * 1000, + }); + + const testsRoot = __dirname; + + return new Promise((c, e) => { + glob("**/**.test.js", { cwd: testsRoot }, (err, files) => { + if (err) { + return e(err); + } + + // Add files to the test suite + files.forEach((f) => mocha.addFile(path.resolve(testsRoot, f))); + + try { + // Run the mocha test + mocha.run((failures) => { + if (failures > 0) { + e(new Error(`${failures} tests failed.`)); + } else { + c(); + } + }); + } catch (err) { + e(err); + } + }); + }); +} diff --git a/test/invisible-suite/projectView.test.ts b/test/invisible-suite/projectView.test.ts new file mode 100644 index 00000000..c1488ce7 --- /dev/null +++ b/test/invisible-suite/projectView.test.ts @@ -0,0 +1,59 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT license. + +import * as assert from "assert"; +import * as fse from "fs-extra"; +import { platform } from "os"; +import * as path from "path"; +import * as vscode from "vscode"; +import { Commands, contextManager, DependencyExplorer, PackageNode, PackageRootNode, ProjectNode } from "../../extension.bundle"; +import { setupTestEnv } from "../shared"; +import { sleep } from "../util"; + +// tslint:disable: only-arrow-functions +suite("Invisible Project View Tests", () => { + + suiteSetup(setupTestEnv); + + test("Can execute command java.project.refreshLibraries correctly", async function() { + if (platform() === "darwin") { + this.skip(); + } + const explorer = DependencyExplorer.getInstance(contextManager.context); + + let projectNode = (await explorer.dataProvider.getChildren())![0] as ProjectNode; + const projectUri = projectNode.nodeData.uri; + assert.ok(projectUri, "project node doesn't have correct uri"); + const expectedUri = vscode.Uri.parse(projectUri!); + await fse.copy(path.join(expectedUri.fsPath, "libSource", "simple.jar"), path.join(expectedUri.fsPath, "lib", "simple.jar")); + await vscode.commands.executeCommand(Commands.JAVA_PROJECT_REFRESH_LIBRARIES); + await sleep(5000); + projectNode = (await explorer.dataProvider.getChildren())![0] as ProjectNode; + const packageRoots = await projectNode.getChildren(); + assert.equal(packageRoots.length, 3, "length of package nodes should be 3"); + const mainPackage = packageRoots[2] as PackageRootNode; + const libraryNode = (await mainPackage.getChildren())[0] as PackageNode; + assert.equal(libraryNode.nodeData.name, "simple.jar", "library name should be simple.jar"); + }); + + test("Can execute command java.project.removeLibrary correctly", async function() { + if (platform() === "darwin") { + this.skip(); + } + const explorer = DependencyExplorer.getInstance(contextManager.context); + + let projectNode = (await explorer.dataProvider.getChildren())![0] as ProjectNode; + let packageRoots = await projectNode.getChildren(); + assert.equal(packageRoots.length, 3, "length of package nodes should be 3"); + let mainPackage = packageRoots[2] as PackageRootNode; + const libraryNode = (await mainPackage.getChildren())[0] as PackageNode; + await vscode.commands.executeCommand(Commands.JAVA_PROJECT_REMOVE_LIBRARY, libraryNode); + await sleep(5000); + projectNode = (await explorer.dataProvider.getChildren())![0] as ProjectNode; + packageRoots = await projectNode.getChildren(); + assert.equal(packageRoots.length, 3, "length of package nodes should be 3"); + mainPackage = packageRoots[2] as PackageRootNode; + assert.equal((await mainPackage.getChildren()).length, 0, "libraries' length should be 0"); + }); + +}); diff --git a/test/invisible.code-workspace b/test/invisible.code-workspace new file mode 100644 index 00000000..d99f1e3e --- /dev/null +++ b/test/invisible.code-workspace @@ -0,0 +1,10 @@ +{ + "folders": [ + { + "path": "invisible" + } + ], + "settings": { + "java.server.launchMode": "Standard" + } +} \ No newline at end of file diff --git a/test/invisible/.vscode/settings.json b/test/invisible/.vscode/settings.json new file mode 100644 index 00000000..8c0a899d --- /dev/null +++ b/test/invisible/.vscode/settings.json @@ -0,0 +1,5 @@ +{ + "java.project.referencedLibraries": [ + "lib/**/*.jar" + ] +} \ No newline at end of file diff --git a/test/invisible/libSource/simple.jar b/test/invisible/libSource/simple.jar new file mode 100644 index 0000000000000000000000000000000000000000..d8cc4e6f4c1e70f26f29749bda44b67b6c644ce6 GIT binary patch literal 901 zcmWIWW@Zs#;Nak3n4R}0hye+RFt9NAx`sIFdiuHP`#So0y1532==r++JH^28+4sz8 zA8%c~i@e^tTIbH3-yCFc#rVO~Prhf)TrNH5siU_o=!3`ElPCGl>!0#``1H|JCWZiS zc8(*LzepJatuO@Q0Jz07(JU4K%6g>c$Cd^0s&DOS!vU z7Ur-s$h~}9@Wb;@rHoHEUN%ztpu9%0VS&SztXs!E$1P9XvHnY2D#wvke!<&c?aDs& z{m6=n_GcR#!sdppxp3>EZ?wY1>fpIy>nhh}ZrA=O3ss-}W$-sO0>e%rne8Yr^fnf?WD8(@{i7+4%J926SC3aMRE9oPf0!q2aHh@wt0#pK- X=;=7Xo0Scuf(Zy)fb?si+ZY%C!fI$z literal 0 HcmV?d00001 diff --git a/test/invisible/src/App.java b/test/invisible/src/App.java new file mode 100644 index 00000000..0a839f9b --- /dev/null +++ b/test/invisible/src/App.java @@ -0,0 +1,5 @@ +public class App { + public static void main(String[] args) throws Exception { + System.out.println("Hello, World!"); + } +} diff --git a/test/maven-suite/projectView.test.ts b/test/maven-suite/projectView.test.ts index 9aecac1f..4228aa5f 100644 --- a/test/maven-suite/projectView.test.ts +++ b/test/maven-suite/projectView.test.ts @@ -2,16 +2,62 @@ // Licensed under the MIT license. import * as assert from "assert"; -import { ContainerNode, contextManager, DependencyExplorer, - PackageNode, PackageRootNode, PrimaryTypeNode, ProjectNode } from "../../extension.bundle"; +import * as clipboardy from "clipboardy"; +import * as path from "path"; +import * as vscode from "vscode"; +import { Commands, ContainerNode, contextManager, DependencyExplorer, IMainClassInfo, + INodeData, NodeKind, PackageNode, PackageRootNode, PrimaryTypeNode, ProjectNode } from "../../extension.bundle"; import { fsPath, setupTestEnv, Uris } from "../shared"; +import { sleep } from "../util"; // tslint:disable: only-arrow-functions suite("Maven Project View Tests", () => { suiteSetup(setupTestEnv); - test("Can node render correctly", async function() { + test("Can node render correctly in hierarchical view", async function() { + await vscode.workspace.getConfiguration("java.dependency").update("packagePresentation", "hierarchical"); + await vscode.commands.executeCommand(Commands.VIEW_PACKAGE_CHANGETOHIERARCHICALPACKAGEVIEW); + await vscode.commands.executeCommand(Commands.VIEW_PACKAGE_REFRESH); + const explorer = DependencyExplorer.getInstance(contextManager.context); + + const roots = await explorer.dataProvider.getChildren(); + assert.equal(roots?.length, 1, "Number of root node should be 1"); + const projectNode = roots![0] as ProjectNode; + assert.equal(projectNode.name, "my-app", "Project name should be \"my-app\""); + + const packageRoots = await projectNode.getChildren(); + assert.equal(packageRoots.length, 4, "Number of root packages should be 4"); + const mainPackage = packageRoots[0] as PackageRootNode; + assert.equal(mainPackage.name, "src/main/java", "Package name should be \"src/main/java\""); + + const primarySubPackages = await mainPackage.getChildren(); + assert.equal(primarySubPackages.length, 1, "Number of primary subpackages should be 1"); + const primarySubPackage = primarySubPackages[0] as PackageNode; + assert.equal(primarySubPackage.name, "com.mycompany", "Name of primary subpackage should be \"com.mycompany\""); + + const secondarySubPackages = await primarySubPackage.getChildren(); + assert.equal(secondarySubPackages.length, 2, "Number of secondary subpackages should be 1"); + const firstSecondarySubPackage = secondarySubPackages[0] as PackageNode; + const secondSecondarySubPackage = secondarySubPackages[1] as PackageNode; + assert.equal(firstSecondarySubPackage.nodeData.displayName, "app", "Name of first secondary subpackage should be \"app\""); + assert.equal(secondSecondarySubPackage.nodeData.displayName, "app1", "Name of first secondary subpackage should be \"app1\""); + + // validate innermost layer nodes + const classes = await firstSecondarySubPackage.getChildren(); + assert.equal(classes.length, 3, "Number of main classes of first package should be 3"); + const firstClass = classes[0] as PrimaryTypeNode; + const secondClass = classes[1] as PrimaryTypeNode; + const thirdClass = classes[2] as PrimaryTypeNode; + assert.equal(firstClass.name, "App", "Name of first class should be \"App\""); + assert.equal(secondClass.name, "AppToDelete", "Name of second class should be \"AppToDelete\""); + assert.equal(thirdClass.name, "AppToRename", "Name of third class should be \"AppToRename\""); + }); + + test("Can node render correctly in flat view", async function() { + await vscode.workspace.getConfiguration("java.dependency").update("packagePresentation", "flat"); + await vscode.commands.executeCommand(Commands.VIEW_PACKAGE_CHANGETOFLATPACKAGEVIEW); + await vscode.commands.executeCommand(Commands.VIEW_PACKAGE_REFRESH); const explorer = DependencyExplorer.getInstance(contextManager.context); // validate root nodes @@ -36,21 +82,27 @@ suite("Maven Project View Tests", () => { // validate package nodes const mainSubPackages = await mainPackage.getChildren(); const testSubPackages = await testPackage.getChildren(); - assert.equal(mainSubPackages.length, 1, "Number of main sub packages should be 1"); + assert.equal(mainSubPackages.length, 2, "Number of main sub packages should be 2"); assert.equal(testSubPackages.length, 1, "Number of test sub packages should be 1"); - const mainSubPackage = mainSubPackages[0] as PackageNode; + const firstMainSubPackage = mainSubPackages[0] as PackageNode; + const secondMainSubPackage = mainSubPackages[1] as PackageNode; const testSubPackage = testSubPackages[0] as PackageNode; - assert.equal(mainSubPackage.name, "com.mycompany.app", "Name of subpackage should be \"com.mycompany.app\""); - assert.equal(testSubPackage.name, "com.mycompany.app", "Name of subpackage should be \"com.mycompany.app\""); + assert.equal(firstMainSubPackage.name, "com.mycompany.app", "Name of first main subpackage should be \"com.mycompany.app\""); + assert.equal(secondMainSubPackage.name, "com.mycompany.app1", "Name of second main subpackage should be \"com.mycompany.app1\""); + assert.equal(testSubPackage.name, "com.mycompany.app", "Name of test subpackage should be \"com.mycompany.app\""); // validate innermost layer nodes - const mainClasses = await mainSubPackage.getChildren(); + const mainClasses = await firstMainSubPackage.getChildren(); const testClasses = await testSubPackage.getChildren(); - assert.equal(mainClasses.length, 1, "Number of main classes should be 1"); + assert.equal(mainClasses.length, 3, "Number of main classes of first package should be 3"); assert.equal(testClasses.length, 1, "Number of test classes should be 1"); - const mainClass = mainClasses[0] as PrimaryTypeNode; + const firstMainClass = mainClasses[0] as PrimaryTypeNode; + const secondMainClass = mainClasses[1] as PrimaryTypeNode; + const thirdMainClass = mainClasses[2] as PrimaryTypeNode; const testClass = testClasses[0] as PrimaryTypeNode; - assert.equal(mainClass.name, "App", "Name of main class should be \"App\""); + assert.equal(firstMainClass.name, "App", "Name of first class should be \"App\""); + assert.equal(secondMainClass.name, "AppToDelete", "Name of second class should be \"AppToDelete\""); + assert.equal(thirdMainClass.name, "AppToRename", "Name of third class should be \"AppToRename\""); assert.equal(testClass.name, "AppTest", "Name of test class should be \"AppTest\""); }); @@ -74,4 +126,97 @@ suite("Maven Project View Tests", () => { assert.equal(fsPath(mainClass), Uris.MAVEN_MAIN_CLASS, "Main class uri incorrect"); assert.equal(fsPath(testClass), Uris.MAVEN_TEST_CLASS, "Test class uri incorrect"); }); + + test("Can execute command java.view.package.copyFilePath correctly", async function() { + const explorer = DependencyExplorer.getInstance(contextManager.context); + + const projectNode = (await explorer.dataProvider.getChildren())![0] as ProjectNode; + const packageRoots = await projectNode.getChildren(); + const mainPackage = packageRoots[0] as PackageRootNode; + const mainSubPackage = (await mainPackage.getChildren())[0] as PackageNode; + const mainClass = (await mainSubPackage.getChildren())[0] as PrimaryTypeNode; + + await vscode.commands.executeCommand(Commands.VIEW_PACKAGE_COPY_FILE_PATH, mainClass); + await sleep(1000); + const content = await clipboardy.read(); + const contentUri = vscode.Uri.file(content); + const dataUri = mainClass.nodeData.uri; + assert.ok(dataUri, `Class node should have correct uri`); + const expectedUri = vscode.Uri.parse(dataUri!); + assert.equal(contentUri.fsPath, expectedUri.fsPath, `File path should be copied correctly`); + }); + + test("Can execute command java.view.package.copyRelativeFilePath correctly", async function() { + const explorer = DependencyExplorer.getInstance(contextManager.context); + + const projectNode = (await explorer.dataProvider.getChildren())![0] as ProjectNode; + const packageRoots = await projectNode.getChildren(); + const mainPackage = packageRoots[0] as PackageRootNode; + const mainSubPackage = (await mainPackage.getChildren())[0] as PackageNode; + const mainClass = (await mainSubPackage.getChildren())[0] as PrimaryTypeNode; + + await vscode.commands.executeCommand(Commands.VIEW_PACKAGE_COPY_RELATIVE_FILE_PATH, mainClass); + await sleep(1000); + const content = await clipboardy.read(); + const dataUri = mainClass.nodeData.uri; + assert.ok(dataUri, `Class node should have correct uri`); + const expectedUri = vscode.Uri.parse(dataUri!); + const workspaceFolders = vscode.workspace.workspaceFolders; + assert.ok(workspaceFolders, `There should be valid workspace folders`); + const relativePath = path.relative(workspaceFolders![0].uri.fsPath, expectedUri.fsPath); + assert.equal(content, relativePath, `Relative file path should be copied correctly`); + }); + + test("Can execute command java.project.list correctly", async function() { + const workspaceFolders = vscode.workspace.workspaceFolders; + assert.ok(workspaceFolders, `There should be valid workspace folders`); + const projects = await vscode.commands.executeCommand(Commands.EXECUTE_WORKSPACE_COMMAND, + Commands.JAVA_PROJECT_LIST, workspaceFolders![0].uri.toString()); + assert.equal(projects?.length, 1, "project's length should be 1"); + assert.equal(projects![0].name, "my-app", "project should be my-app"); + }); + + test("Can execute command java.getPackageData correctly", async function() { + const explorer = DependencyExplorer.getInstance(contextManager.context); + + const projectNode = (await explorer.dataProvider.getChildren())![0] as ProjectNode; + const packageRoots = await projectNode.getChildren(); + const mainPackage = packageRoots[0] as PackageRootNode; + const workspaceFolders = vscode.workspace.workspaceFolders; + assert.ok(workspaceFolders, `There should be valid workspace folders`); + const packages = await vscode.commands.executeCommand(Commands.EXECUTE_WORKSPACE_COMMAND, + Commands.JAVA_GETPACKAGEDATA, { + kind: NodeKind.PackageRoot, + projectUri: workspaceFolders![0].uri.toString(), + path: mainPackage.nodeData.name, + handlerIdentifier: mainPackage.nodeData.handlerIdentifier, + }); + assert.equal(packages?.length, 2, "packages' length should be 2"); + assert.equal(packages![0].name, "com.mycompany.app", "package[0]'s name should be com.mycompany.app"); + assert.equal(packages![1].name, "com.mycompany.app1", "package[1]'s name should be com.mycompany.app1"); + }); + + test("Can execute command java.resolvePath correctly", async function() { + const explorer = DependencyExplorer.getInstance(contextManager.context); + + const projectNode = (await explorer.dataProvider.getChildren())![0] as ProjectNode; + const packageRoots = await projectNode.getChildren(); + const mainPackage = packageRoots[0] as PackageRootNode; + const paths = await vscode.commands.executeCommand(Commands.EXECUTE_WORKSPACE_COMMAND, + Commands.JAVA_RESOLVEPATH, mainPackage.nodeData.uri); + assert.equal(paths?.length, 3, "paths' length should be 3"); + assert.equal(paths![0].name, "src", "path[0]'s name should be src"); + assert.equal(paths![1].name, "main", "path[1]'s name should be main"); + assert.equal(paths![2].name, "java", "path[2]'s name should be java"); + }); + + test("Can execute command java.project.getMainClasses correctly", async function() { + const workspaceFolders = vscode.workspace.workspaceFolders; + assert.ok(workspaceFolders, `There should be valid workspace folders`); + const mainClasses = await vscode.commands.executeCommand(Commands.EXECUTE_WORKSPACE_COMMAND, + Commands.JAVA_PROJECT_GETMAINCLASSES, workspaceFolders![0].uri.toString()); + assert.equal(mainClasses?.length, 1, "mainClasses' length should be 1"); + assert.equal(mainClasses![0].name, "com.mycompany.app.App", "mainClasses[0]'s name should be com.mycompany.app.App"); + }); + }); diff --git a/test/maven.code-workspace b/test/maven.code-workspace new file mode 100644 index 00000000..73c1b25d --- /dev/null +++ b/test/maven.code-workspace @@ -0,0 +1,10 @@ +{ + "folders": [ + { + "path": "maven" + } + ], + "settings": { + "java.server.launchMode": "Standard" + } +} \ No newline at end of file diff --git a/test/maven/src/main/java/com/mycompany/app/AppToDelete.java b/test/maven/src/main/java/com/mycompany/app/AppToDelete.java new file mode 100644 index 00000000..22a4011f --- /dev/null +++ b/test/maven/src/main/java/com/mycompany/app/AppToDelete.java @@ -0,0 +1,5 @@ +package com.mycompany.app; + +public class AppToDelete { + +} diff --git a/test/maven/src/main/java/com/mycompany/app/AppToRename.java b/test/maven/src/main/java/com/mycompany/app/AppToRename.java new file mode 100644 index 00000000..34dc78cc --- /dev/null +++ b/test/maven/src/main/java/com/mycompany/app/AppToRename.java @@ -0,0 +1,5 @@ +package com.mycompany.app; + +public class AppToRename { + +} diff --git a/test/maven/src/main/java/com/mycompany/app1/App1.java b/test/maven/src/main/java/com/mycompany/app1/App1.java new file mode 100644 index 00000000..48909426 --- /dev/null +++ b/test/maven/src/main/java/com/mycompany/app1/App1.java @@ -0,0 +1,5 @@ +package com.mycompany.app1; + +public class App1 { + +} diff --git a/test/ui/command.test.ts b/test/ui/command.test.ts new file mode 100644 index 00000000..d9772be0 --- /dev/null +++ b/test/ui/command.test.ts @@ -0,0 +1,316 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT license. + +import * as assert from "assert"; +import * as fse from "fs-extra"; +import { platform } from "os"; +import * as path from "path"; +import * as seleniumWebdriver from "selenium-webdriver"; +import { EditorView, InputBox, ModalDialog, SideBarView, StatusBar, TextEditor, TreeItem, Workbench } from "vscode-extension-tester"; +import { DialogHandler, OpenDialog } from "vscode-extension-tester-native"; +import { sleep } from "../util"; + +// tslint:disable: only-arrow-functions +const newProjectName = "helloworld"; +const mavenProjectPath = path.join(__dirname, "..", "..", "..", "test", "maven"); +const mavenWorkspacePath = path.join(__dirname, "..", "..", "..", "test", "maven.code-workspace"); +const invisibleProjectPath = path.join(__dirname, "..", "..", "..", "test", "invisible"); +const invisibleWorkspacePath = path.join(__dirname, "..", "..", "..", "test", "invisible.code-workspace"); +const targetPath = path.join(__dirname, "..", "..", "..", "test", "newProject"); + +describe("Command Tests", function() { + + this.timeout(60000); + + before(async function() { + sleep(5000); + }); + + beforeEach(async function() { + await sleep(5000); + }); + + it("Test open maven project", async function() { + await new Workbench().executeCommand("Workspaces: Open Workspace..."); + const dialog: OpenDialog = await DialogHandler.getOpenDialog(); + await dialog.selectPath(mavenWorkspacePath); + await dialog.confirm(); + // Close welcome editors + let editorView = new EditorView(); + let editorGroups = await editorView.getEditorGroups(); + for (const editorGroup of editorGroups) { + await editorGroup.closeAllEditors(); + } + const settingsEditor = await new Workbench().openSettings(); + const setting = await settingsEditor.findSetting("Dialog Style", "Window"); + await setting.setValue("custom"); + const refreshSetting = await settingsEditor.findSetting("Auto Refresh", "Java", "Dependency"); + await refreshSetting.setValue(true); + const viewSetting = await settingsEditor.findSetting("Package Presentation", "Java", "Dependency"); + await viewSetting.setValue("flat"); + // Close setting editor + editorView = new EditorView(); + editorGroups = await editorView.getEditorGroups(); + for (const editorGroup of editorGroups) { + await editorGroup.closeAllEditors(); + } + await sleep(1000); + const fileSections = await new SideBarView().getContent().getSections(); + await fileSections[0].collapse(); + await waitForImporting(1000); + }); + + it("Test javaProjectExplorer.focus", async function() { + await new Workbench().executeCommand("javaProjectExplorer.focus"); + const section = await new SideBarView().getContent().getSection("Java Projects"); + assert.ok(section.isExpanded(), `Section "Java Projects" should be expanded`); + }); + + (platform() === "darwin" ? it.skip : it)("Test java.view.package.linkWithFolderExplorer", async function() { + const fileSections = await new SideBarView().getContent().getSections(); + await fileSections[0].expand(); + const srcNode = await fileSections[0].findItem("src") as TreeItem; + await srcNode.expand(); + const folderNode = await fileSections[0].findItem("main") as TreeItem; + await folderNode.expand(); + const subFolderNode = await fileSections[0].findItem("app") as TreeItem; + await subFolderNode.expand(); + const fileNode = await fileSections[0].findItem("App.java") as TreeItem; + await fileNode.click(); + await sleep(1000); + await fileSections[0].collapse(); + const section = await new SideBarView().getContent().getSection("Java Projects"); + await section.expand(); + const packageNode = await section.findItem("com.mycompany.app") as TreeItem; + assert.ok(await packageNode.isExpanded(), `Package node "com.mycompany.app" should be expanded`); + const classNode = await section.findItem("App") as TreeItem; + assert.ok(await classNode.isDisplayed(), `Class node "App" should be revealed`); + await packageNode.collapse(); + }); + + (platform() === "darwin" ? it.skip : it)("Test java.view.package.unLinkWithFolderExplorer", async function() { + const section = await new SideBarView().getContent().getSection("Java Projects"); + const moreActions = await section.moreActions(); + const desynchronize = await moreActions?.getItem("Desynchronize with Editor"); + await desynchronize?.click(); + const fileSections = await new SideBarView().getContent().getSections(); + await fileSections[0].expand(); + const fileNode = await fileSections[0].findItem("App.java") as TreeItem; + await fileNode.click(); + await sleep(1000); + await fileSections[0].collapse(); + await section.expand(); + const packageNode = await section.findItem("com.mycompany.app") as TreeItem; + assert.ok(!await packageNode.isExpanded(), `Package "com.mycompany.app" should not be expanded`); + }); + + it("Test java.view.package.newJavaClass", async function() { + const section = await new SideBarView().getContent().getSection("Java Projects"); + const item = await section.findItem("my-app") as TreeItem; + assert.ok(item, `Project "my-app" should be found`); + await item.click(); + const button = await item.getActionButton("New Java Class"); + assert.ok(button, `Button "New Java Class" should be found`); + await button!.click(); + let inputBox = await InputBox.create(); + assert.ok(await inputBox.getPlaceHolder() === "Choose a source folder", `InputBox "Choose a source folder" should appear`); + const quickPick = await inputBox.findQuickPick("src/main/java"); + assert.ok(quickPick, `Quickpick item "src/main/java" should be found`); + await quickPick!.click(); + inputBox = await InputBox.create(); + assert.ok(await inputBox.getPlaceHolder() === "Input the class name", `InputBox "Input the class name" should appear`); + await inputBox.setText("App2"); + await inputBox.confirm(); + await sleep(1000); + const editor = new TextEditor(); + await editor.save(); + assert.ok(await editor.getTitle() === "App2.java", `Editor's title should be "App2.java"`); + assert.ok(await fse.pathExists(path.join(mavenProjectPath, "src", "main", "java", "App2.java")), `"App2.java" should be created in correct path`); + await fse.remove(path.join(mavenProjectPath, "src", "main", "java", "App2.java")); + }); + + (platform() === "darwin" ? it.skip : it)("Test java.view.package.newPackage", async function() { + // The current UI test framework doesn't support mac title bar and context menus. + // See: https://github.com/redhat-developer/vscode-extension-tester#requirements + // So we dismiss some UI tests on mac. + const section = await new SideBarView().getContent().getSection("Java Projects"); + const item = await section.findItem("my-app") as TreeItem; + await item.click(); + const contextMenu = await item.openContextMenu(); + const newPackageItem = await contextMenu.getItem("New Package"); + assert.ok(newPackageItem, `"New Package" should be found in context menu`); + await newPackageItem!.click(); + let inputBox = await InputBox.create(); + const quickPick = await inputBox.findQuickPick("src/main/java"); + assert.ok(quickPick, `"src/main/java" should be found in quickpick items`); + await quickPick!.click(); + inputBox = await InputBox.create(); + await inputBox.setText("com.mycompany.app2"); + await inputBox.confirm(); + await sleep(1000); + assert.ok(await fse.pathExists(path.join(mavenProjectPath, "src", "main", "java", "com", "mycompany", "app2")), `New package should be created in correct path`); + await fse.remove(path.join(mavenProjectPath, "src", "main", "java", "com", "mycompany", "app2")); + }); + + (platform() === "darwin" ? it.skip : it)("Test java.view.package.revealInProjectExplorer", async function() { + const fileExplorerSections = await new SideBarView().getContent().getSections(); + await fileExplorerSections[0].expand(); + const section = await new SideBarView().getContent().getSection("Java Projects"); + const packageNode = await section.findItem("com.mycompany.app") as TreeItem; + await packageNode.click(); + await packageNode.collapse(); + const srcNode = await fileExplorerSections[0].findItem("src") as TreeItem; + await srcNode.expand(); + const folderNode = await fileExplorerSections[0].findItem("main") as TreeItem; + await folderNode.expand(); + const fileNode = await fileExplorerSections[0].findItem("App.java") as TreeItem; + const menu = await fileNode.openContextMenu(); + const revealItem = await menu.getItem("Reveal in Java Project Explorer"); + assert.ok(revealItem, `Item "Reveal in Java Project Explorer" should be found in context menu`); + await revealItem!.click(); + const classNode = await section.findItem("App") as TreeItem; + assert.ok(await classNode.isDisplayed(), `Class Node "App" should be revealed`); + await fileExplorerSections[0].collapse(); + }); + + (platform() === "darwin" ? it.skip : it)("Test java.view.package.renameFile", async function() { + const section = await new SideBarView().getContent().getSection("Java Projects"); + await section.click(); + const classNode = await section.findItem("AppToRename") as TreeItem; + await classNode.click(); + const menu = await classNode.openContextMenu(); + const renameItem = await menu.getItem("Rename"); + assert.ok(renameItem, `"Rename" item should be found`); + await renameItem!.click(); + const inputBox = await InputBox.create(); + await inputBox.setText("AppRenamed"); + await inputBox.confirm(); + await sleep(1000); + const dialog = new ModalDialog(); + const buttons = await dialog.getButtons(); + for (const button of buttons) { + if (await button.getText() === "OK") { + await button.click(); + break; + } + } + await sleep(5000); + const editor = new TextEditor(); + await editor.save(); + assert.ok(await editor.getTitle() === "AppRenamed.java", `Editor's title should be "AppRenamed.java"`); + assert.ok(await section.findItem("AppRenamed"), `Item in Java Project section should be "AppRenamed"`); + }); + + (platform() === "darwin" ? it.skip : it)("Test java.view.package.moveFileToTrash", async function() { + const section = await new SideBarView().getContent().getSection("Java Projects"); + const classNode = await section.findItem("AppToDelete") as TreeItem; + await classNode.click(); + const menu = await classNode.openContextMenu(); + const deleteItem = await menu.getItem("Delete"); + assert.ok(deleteItem, `"Delete" item should be found`); + await deleteItem!.click(); + const dialog = new ModalDialog(); + const buttons = await dialog.getButtons(); + for (const button of buttons) { + if (await button.getText() === "Move to Recycle Bin") { + await button.click(); + break; + } + } + await sleep(1000); + assert.ok(!await fse.pathExists(path.join(mavenProjectPath, "src", "main", "java", "AppToDelete.java")), `The source file "AppToDelete.java" should be deleted`); + }); + + it("Test change to invisible project", async function() { + await new Workbench().executeCommand("Workspaces: Open Workspace..."); + const dialog: OpenDialog = await DialogHandler.getOpenDialog(); + await dialog.selectPath(invisibleWorkspacePath); + await dialog.confirm(); + await sleep(1000); + const fileExplorerSections = await new SideBarView().getContent().getSections(); + const folderNode = await fileExplorerSections[0].findItem("src") as TreeItem; + await folderNode.expand(); + const fileNode = await fileExplorerSections[0].findItem("App.java") as TreeItem; + await fileNode.click(); + await waitForImporting(1000); + const fileSections = await new SideBarView().getContent().getSections(); + await fileSections[0].collapse(); + await new Workbench().executeCommand("javaProjectExplorer.focus"); + }); + + it("Test java.project.addLibraries", async function() { + const section = await new SideBarView().getContent().getSection("Java Projects"); + const projectItem = await section.findItem("invisible") as TreeItem; + await projectItem.expand(); + await sleep(1000); + const referencedItem = await section.findItem("Referenced Libraries") as TreeItem; + await referencedItem.click(); + const buttons = await referencedItem.getActionButtons(); + await buttons[0].click(); + const dialog: OpenDialog = await DialogHandler.getOpenDialog(); + await dialog.selectPath(path.join(invisibleProjectPath, "libSource", "simple.jar")); + await dialog.confirm(); + const simpleItem = await section.findItem("simple.jar") as TreeItem; + assert.ok(simpleItem, `Library "simple.jar" should be found`); + await simpleItem!.click(); + const libraryButtons = await simpleItem!.getActionButtons(); + await libraryButtons[0].click(); + }); + + it("Test java.project.addLibraryFolders", async function() { + const section = await new SideBarView().getContent().getSection("Java Projects"); + const projectItem = await section.findItem("invisible") as TreeItem; + await projectItem.expand(); + await sleep(1000); + let referencedItem = await section.findItem("Referenced Libraries") as TreeItem; + await referencedItem.click(); + const buttons = await referencedItem.getActionButtons(); + await buttons[0].getDriver().actions() + .mouseMove(buttons[0]) + .keyDown(seleniumWebdriver.Key.ALT) + .click(buttons[0]) + .keyUp(seleniumWebdriver.Key.ALT) + .perform(); + const dialog: OpenDialog = await DialogHandler.getOpenDialog(); + await dialog.selectPath(path.join(invisibleProjectPath, "libSource")); + await dialog.confirm(); + await sleep(3000); + referencedItem = await section.findItem("Referenced Libraries") as TreeItem; + await referencedItem.expand(); + assert.ok(await section.findItem("simple.jar"), `Library "simple.jar" should be found`); + }); + + it("Test java.project.create", async function() { + await fse.remove(targetPath); + await fse.ensureDir(targetPath); + await new Workbench().executeCommand("java.project.create"); + let inputBox = await InputBox.create(); + const picks = await inputBox.getQuickPicks(); + for (const quickPick of picks) { + if (await quickPick.getLabel() === "No build tools") { + await quickPick.click(); + } + } + const dialog: OpenDialog = await DialogHandler.getOpenDialog(); + await dialog.selectPath(targetPath); + await dialog.confirm(); + inputBox = await InputBox.create(); + await inputBox.setText(newProjectName); + await inputBox.confirm(); + await sleep(5000); + assert.ok(await fse.pathExists(path.join(targetPath, newProjectName, "src", "App.java")), `The template source file should be created`); + assert.ok(await fse.pathExists(path.join(targetPath, newProjectName, "README.md")), `The template README file should be created`); + }); +}); + +async function waitForImporting(time: number) { + await new Promise(async (resolve) => { + const interval = setInterval(async () => { + const item = await new StatusBar().getItem("ServiceReady"); + if (item) { + clearInterval(interval); + resolve(); + } + }, time); + }); +} diff --git a/test/ui/index.ts b/test/ui/index.ts new file mode 100644 index 00000000..15cf2d3a --- /dev/null +++ b/test/ui/index.ts @@ -0,0 +1,26 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT license. + +import * as os from "os"; +import * as path from "path"; +import { ExTester } from "vscode-extension-tester"; + +async function main(): Promise { + try { + // Run UI command tests + const testPath = path.join(__dirname, "command.test.js"); + const exTester = new ExTester(); + // The current version (4.1.1) of vscode-extension-tester doesn't support the newest VSCode version (^1.58.0) + await exTester.downloadCode("1.57.0"); + await exTester.installVsix(); + await exTester.installFromMarketplace("redhat.java"); + await exTester.downloadChromeDriver("1.57.0"); + await exTester.setupRequirements({vscodeVersion: "1.57.0"}); + process.exit(await exTester.runTests(testPath, {vscodeVersion: "1.57.0"})); + } catch (err) { + process.stdout.write(`${err}${os.EOL}`); + process.exit(1); + } +} + +main(); diff --git a/test/util.ts b/test/util.ts new file mode 100644 index 00000000..ca082f32 --- /dev/null +++ b/test/util.ts @@ -0,0 +1,6 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT license. + +export async function sleep(time: number) { + await new Promise((resolve) => setTimeout(resolve, time)); +} diff --git a/tsconfig.json b/tsconfig.json index 05cfe9b8..c789462a 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -18,6 +18,7 @@ }, "exclude": [ "node_modules", - ".vscode-test" + ".vscode-test", + "test-resources" ] } From 6363dafb932ca7a9c21ff7e3f7e203ddd1611ebb Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 4 Aug 2021 09:26:14 +0800 Subject: [PATCH 046/352] chore(deps): Bump tar from 4.4.13 to 4.4.15 (#531) Bumps [tar](https://github.com/npm/node-tar) from 4.4.13 to 4.4.15. - [Release notes](https://github.com/npm/node-tar/releases) - [Changelog](https://github.com/npm/node-tar/blob/main/CHANGELOG.md) - [Commits](https://github.com/npm/node-tar/compare/v4.4.13...v4.4.15) --- updated-dependencies: - dependency-name: tar dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/package-lock.json b/package-lock.json index 6ef66075..1bbdb5f6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -511,7 +511,7 @@ }, "ansi-colors": { "version": "1.1.0", - "resolved": "http://registry.npmjs.org/ansi-colors/-/ansi-colors-1.1.0.tgz", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-1.1.0.tgz", "integrity": "sha512-SFKX67auSNoVR38N3L+nvsPjOE0bybKTYbkf5tRvushrAPQ9V75huw0ZxBkKVeRU9kqH3d6HA4xTckbwZ4ixmA==", "dev": true, "requires": { @@ -907,7 +907,7 @@ }, "util": { "version": "0.10.3", - "resolved": "http://registry.npmjs.org/util/-/util-0.10.3.tgz", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", "dev": true, "requires": { @@ -1872,9 +1872,9 @@ "dev": true }, "tar": { - "version": "4.4.13", - "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.13.tgz", - "integrity": "sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA==", + "version": "4.4.15", + "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.15.tgz", + "integrity": "sha512-ItbufpujXkry7bHH9NpQyTXPbJ72iTlXgkBAYsAjDXk3Ds8t/3NfO5P4xZGy7u+sYuQUbimgzswX4uQIEeNVOA==", "dev": true, "requires": { "chownr": "^1.1.1", @@ -7387,9 +7387,9 @@ "dev": true }, "tar": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.0.tgz", - "integrity": "sha512-DUCttfhsnLCjwoDoFcI+B2iJgYa93vBnDUATYEeRx6sntCTdN01VnqsIuTlALXla/LWooNg0yEGeB+Y8WdFxGA==", + "version": "6.1.3", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.3.tgz", + "integrity": "sha512-3rUqwucgVZXTeyJyL2jqtUau8/8r54SioM1xj3AmTX3HnWQdj2AydfJ2qYYayPyIIznSplcvU9mhBb7dR2XF3w==", "dev": true, "requires": { "chownr": "^2.0.0", @@ -9447,7 +9447,7 @@ }, "wrap-ansi": { "version": "2.1.0", - "resolved": "http://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", "dev": true, "requires": { From fe5ef2ed75270c72904b7e961420fbbcf516494d Mon Sep 17 00:00:00 2001 From: Sheng Chen Date: Wed, 11 Aug 2021 10:08:39 +0800 Subject: [PATCH 047/352] fix: Do not activate the Java Language Server (#535) --- src/extension.ts | 46 ++++++++++++++++++++++++++++------------------ 1 file changed, 28 insertions(+), 18 deletions(-) diff --git a/src/extension.ts b/src/extension.ts index 0a1618ff..99043868 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -32,30 +32,40 @@ async function activateExtension(_operationId: string, context: ExtensionContext context.subscriptions.push(syncHandler); context.subscriptions.push(tasks.registerTaskProvider(ExportJarTaskProvider.exportJarType, new ExportJarTaskProvider())); - const javaLanguageSupport: Extension | undefined = extensions.getExtension(ExtensionName.JAVA_LANGUAGE_SUPPORT); - if (!javaLanguageSupport) { - return; - } - javaLanguageSupport.activate().then(() => { - const extensionApi: any = javaLanguageSupport.exports; - if (!extensionApi) { + const pollingJLS = () => { + const javaLanguageSupport: Extension | undefined = extensions.getExtension(ExtensionName.JAVA_LANGUAGE_SUPPORT); + if (!javaLanguageSupport) { return; } - if (extensionApi.onDidClasspathUpdate) { - const onDidClasspathUpdate: Event = extensionApi.onDidClasspathUpdate; - context.subscriptions.push(onDidClasspathUpdate(async () => { - syncHandler.updateFileWatcher(Settings.autoRefresh()); - })); - } + if (javaLanguageSupport.isActive) { + const extensionApi: any = javaLanguageSupport.exports; + if (!extensionApi) { + return; + } + + if (extensionApi.onDidClasspathUpdate) { + const onDidClasspathUpdate: Event = extensionApi.onDidClasspathUpdate; + context.subscriptions.push(onDidClasspathUpdate(async () => { + syncHandler.updateFileWatcher(Settings.autoRefresh()); + })); + } - if (extensionApi.onDidServerModeChange) { - const onDidServerModeChange: Event = extensionApi.onDidServerModeChange; - context.subscriptions.push(onDidServerModeChange(async () => { + if (extensionApi.serverMode === "Standard") { syncHandler.updateFileWatcher(Settings.autoRefresh()); - })); + } else { + if (extensionApi.onDidServerModeChange) { + const onDidServerModeChange: Event = extensionApi.onDidServerModeChange; + context.subscriptions.push(onDidServerModeChange(async () => { + syncHandler.updateFileWatcher(Settings.autoRefresh()); + })); + } + } + } else { + setTimeout(pollingJLS, 3 * 1000 /*ms*/); } - }); + }; + pollingJLS(); } // this method is called when your extension is deactivated From 4256fa6adcaff5ec24dbdbb8d9a516fad21431c5 Mon Sep 17 00:00:00 2001 From: Shi Chen Date: Wed, 11 Aug 2021 10:23:31 +0800 Subject: [PATCH 048/352] chore: Support tests in VSCode 1.59 (#534) --- package-lock.json | 212 +++++++++++++++++++++++++++++++--------- package.json | 6 +- test/ui/command.test.ts | 20 +--- test/ui/index.ts | 24 +++-- 4 files changed, 192 insertions(+), 70 deletions(-) diff --git a/package-lock.json b/package-lock.json index 1bbdb5f6..f50e6670 100644 --- a/package-lock.json +++ b/package-lock.json @@ -255,6 +255,12 @@ "integrity": "sha512-OFUilxQg+rWL2FMxtmIgCkUDlJB6pskkpvmew7yeXfzzsOBb5rc+y2+DjHm+r3r1ZPPcJefK3DveNSYWGiy68g==", "dev": true }, + "@types/semver": { + "version": "7.3.8", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.3.8.tgz", + "integrity": "sha512-D/2EJvAlCEtYFEYmmlGwbGXuK886HzyCc3nZX/tkFTQdEU8jZDAgiv08P162yB17y4ZXZoq7yFAnW4GDBb9Now==", + "dev": true + }, "@types/vscode": { "version": "1.53.0", "resolved": "https://devdiv.pkgs.visualstudio.com/_packaging/CloudKernel/npm/registry/@types/vscode/-/vscode-1.53.0.tgz", @@ -511,7 +517,7 @@ }, "ansi-colors": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-1.1.0.tgz", + "resolved": "http://registry.npmjs.org/ansi-colors/-/ansi-colors-1.1.0.tgz", "integrity": "sha512-SFKX67auSNoVR38N3L+nvsPjOE0bybKTYbkf5tRvushrAPQ9V75huw0ZxBkKVeRU9kqH3d6HA4xTckbwZ4ixmA==", "dev": true, "requires": { @@ -907,7 +913,7 @@ }, "util": { "version": "0.10.3", - "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", + "resolved": "http://registry.npmjs.org/util/-/util-0.10.3.tgz", "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", "dev": true, "requires": { @@ -961,6 +967,13 @@ "requires": { "semver": "^5.3.0", "shimmer": "^1.1.0" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + } } }, "async-settle": { @@ -1759,6 +1772,13 @@ "async-hook-jl": "^1.7.6", "emitter-listener": "^1.0.1", "semver": "^5.4.1" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + } } }, "cmake-js": { @@ -1865,6 +1885,12 @@ "util-deprecate": "~1.0.1" } }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + }, "string_decoder": { "version": "0.10.31", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", @@ -2205,6 +2231,14 @@ "semver": "^5.5.0", "shebang-command": "^1.2.0", "which": "^1.2.9" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } } }, "crypto-browserify": { @@ -2433,6 +2467,13 @@ "integrity": "sha1-zJmvlhLCP7H/8TYSxy8sv6qNWhc=", "requires": { "semver": "^5.3.0" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + } } }, "diagnostic-channel-publishers": { @@ -4323,9 +4364,9 @@ } }, "jszip": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.6.0.tgz", - "integrity": "sha512-jgnQoG9LKnWO3mnVNBnfhkh0QknICd1FGSrXcgrl67zioyJ4wgx25o9ZqwNtrROSflGBCGYnJfjrIyRIby1OoQ==", + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.7.1.tgz", + "integrity": "sha512-ghL0tz1XG9ZEmRMcEN2vt7xabrDdqHHeykgARpmZ0BiIctWxM47Vt63ZO2dnp4QYt/xJVLLy5Zv1l/xRdh2byg==", "dev": true, "requires": { "lie": "~3.3.0", @@ -5227,25 +5268,24 @@ } }, "monaco-page-objects": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/monaco-page-objects/-/monaco-page-objects-1.6.2.tgz", - "integrity": "sha512-RALRVtMrEi0Ax1tNxtOWhqREKm/eaQGT1kf+N+wKkvoKynL/lIeNDY67UX9K3iAKVB5ed1LvqUWqnbRpR1khYw==", + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/monaco-page-objects/-/monaco-page-objects-1.6.3.tgz", + "integrity": "sha512-vMFBgsY3+MkrG0ATMtWisND9OT1MLERmjbDkkGDbGMTyC/RdrFOQMr7NfXNI/vbSmXsZOj9CmC6hYOVFnKlkyg==", "dev": true, "requires": { - "clipboardy": "^2.0.0", + "clipboardy": "^2.3.0", "clone-deep": "^4.0.1", "compare-versions": "^3.5.1", - "fs-extra": "^9.0.1", - "ts-essentials": "^7.0.0" + "fs-extra": "^10.0.0", + "ts-essentials": "^7.0.2" }, "dependencies": { "fs-extra": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.0.0.tgz", + "integrity": "sha512-C5owb14u9eJwizKGdchcDUQeFtlSHHthBk8pbX9Vc1PFZrLombudjDnNns88aYslCyF6IY5SUw3Roz6xShcEIQ==", "dev": true, "requires": { - "at-least-node": "^1.0.0", "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", "universalify": "^2.0.0" @@ -5392,6 +5432,14 @@ "dev": true, "requires": { "semver": "^5.4.1" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } } }, "node-addon-api": { @@ -5455,6 +5503,14 @@ "resolve": "^1.10.0", "semver": "2 || 3 || 4 || 5", "validate-npm-package-license": "^3.0.1" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } } }, "normalize-path": { @@ -5851,6 +5907,14 @@ "dev": true, "requires": { "semver": "^5.1.0" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } } }, "parse5": { @@ -6824,9 +6888,13 @@ } }, "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } }, "semver-greatest-satisfied-range": { "version": "1.1.0", @@ -7581,6 +7649,14 @@ "requires": { "pify": "^4.0.1", "semver": "^5.6.0" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } } }, "mkdirp": { @@ -7830,9 +7906,9 @@ } }, "ts-essentials": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/ts-essentials/-/ts-essentials-7.0.2.tgz", - "integrity": "sha512-qWPVC1xZGdefbsgFP7tPo+bsgSA2ZIXL1XeEe5M2WoMZxIOr/HbsHxP/Iv75IFhiMHMDGL7cOOwi5SXcgx9mHw==", + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/ts-essentials/-/ts-essentials-7.0.3.tgz", + "integrity": "sha512-8+gr5+lqO3G84KdiTSMRLtuyJ+nTBVRKuCrK4lidMPdVeEp0uqC875uE5NMcaA7YYMN7XsNiFQuMvasF8HT/xQ==", "dev": true }, "ts-loader": { @@ -8008,6 +8084,12 @@ "to-regex": "^3.0.2" } }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + }, "supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", @@ -8112,6 +8194,12 @@ "minimist": "^1.2.5" } }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + }, "supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", @@ -8564,9 +8652,9 @@ "dev": true }, "vsce": { - "version": "1.95.1", - "resolved": "https://registry.npmjs.org/vsce/-/vsce-1.95.1.tgz", - "integrity": "sha512-2v8g3ZtZkaOTscRjjCAtM3Au6YYWJtg9UNt1iyyWko7ZHejbt5raClcNzQ7/WYVLYhYHc+otHQifV0gCBREgNg==", + "version": "1.96.1", + "resolved": "https://registry.npmjs.org/vsce/-/vsce-1.96.1.tgz", + "integrity": "sha512-KnEVqjfc1dXrpZsbJ8J7B9VQ7GAAx8o5RqBNk42Srv1KF9+e2/aXchQHe9QZxeUs/FiliHoMGpGvnHTXwKIT2A==", "dev": true, "requires": { "azure-devops-node-api": "^11.0.1", @@ -8644,6 +8732,12 @@ "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", "dev": true }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + }, "supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", @@ -8682,45 +8776,73 @@ } }, "vscode-extension-tester": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/vscode-extension-tester/-/vscode-extension-tester-4.1.1.tgz", - "integrity": "sha512-toKO1cfwOORwc++5v4SE0Y/ouLINWPqGVkV88JGWvY9sdYN8W+2uUkgZ/Zfw5Vq8bDaP/Aqt7Yf1jZ0xOADh7g==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/vscode-extension-tester/-/vscode-extension-tester-4.1.2.tgz", + "integrity": "sha512-QWy7BBS8zdsWMj7/okpb8aJ/+16BelZzqLrJd2zYZJbzepxxrXZhpE034HmLlMdEnvTqN9yM94uVLz1CcZS6KA==", "dev": true, "requires": { "@types/selenium-webdriver": "^3.0.15", - "commander": "^6.1.0", + "commander": "^8.0.0", "compare-versions": "^3.6.0", - "fs-extra": "^9.0.1", - "glob": "^7.1.6", - "js-yaml": "^3.13.1", - "monaco-page-objects": "^1.6.2", + "fs-extra": "^10.0.0", + "glob": "^7.1.7", + "js-yaml": "^4.1.0", + "monaco-page-objects": "^1.6.3", "request": "^2.88.0", "sanitize-filename": "^1.6.3", "selenium-webdriver": "^3.0.0", "targz": "^1.0.1", "unzip-stream": "^0.3.0", - "vsce": "^1.81.0", - "vscode-extension-tester-locators": "^1.58.0" + "vsce": "^1.96.0", + "vscode-extension-tester-locators": "^1.59.0" }, "dependencies": { + "argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, "commander": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz", - "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-8.1.0.tgz", + "integrity": "sha512-mf45ldcuHSYShkplHHGKWb4TrmwQadxOn7v4WuhDJy0ZVoY5JFajaRDKD0PNe5qXzBX0rhovjTnP6Kz9LETcuA==", "dev": true }, "fs-extra": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.0.0.tgz", + "integrity": "sha512-C5owb14u9eJwizKGdchcDUQeFtlSHHthBk8pbX9Vc1PFZrLombudjDnNns88aYslCyF6IY5SUw3Roz6xShcEIQ==", "dev": true, "requires": { - "at-least-node": "^1.0.0", "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", "universalify": "^2.0.0" } }, + "glob": { + "version": "7.1.7", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", + "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", + "dev": true, + "requires": { + "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" + } + }, + "js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "requires": { + "argparse": "^2.0.1" + } + }, "jsonfile": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", @@ -8740,9 +8862,9 @@ } }, "vscode-extension-tester-locators": { - "version": "1.58.0", - "resolved": "https://registry.npmjs.org/vscode-extension-tester-locators/-/vscode-extension-tester-locators-1.58.0.tgz", - "integrity": "sha512-fX7CW+q/s35YCmGCUWddkYxLJfy7w8hYc7wSOtvt1jQKwijg5ffsf8c7reMLWw+ZBSMaHpMsO63ot/FrNtF3cA==", + "version": "1.59.0", + "resolved": "https://registry.npmjs.org/vscode-extension-tester-locators/-/vscode-extension-tester-locators-1.59.0.tgz", + "integrity": "sha512-P2nW8PXZjsV1lJzkVQbRV9TvXk0jkc1dDSSzaYkKLksyejgljFwCbgUbC3VxyQZHTH8kQtLxj8HNIM6QAGM9vA==", "dev": true }, "vscode-extension-tester-native": { @@ -9447,7 +9569,7 @@ }, "wrap-ansi": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "resolved": "http://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", "dev": true, "requires": { diff --git a/package.json b/package.json index b4279ce2..4f5841e0 100644 --- a/package.json +++ b/package.json @@ -594,6 +594,7 @@ "@types/minimatch": "^3.0.3", "@types/mocha": "^8.2.1", "@types/node": "^8.10.66", + "@types/semver": "^7.3.8", "@types/vscode": "1.53.0", "copy-webpack-plugin": "^6.4.1", "glob": "^7.1.6", @@ -601,12 +602,13 @@ "gulp-copy": "^4.0.1", "gulp-tslint": "^8.1.4", "mocha": "^8.3.1", + "semver": "^7.3.5", "ts-loader": "^5.4.5", "tslint": "^5.20.1", "typescript": "^3.9.9", - "vscode-test": "^1.5.1", - "vscode-extension-tester": "^4.1.1", + "vscode-extension-tester": "^4.1.2", "vscode-extension-tester-native": "^3.0.2", + "vscode-test": "^1.5.1", "webpack": "^4.46.0", "webpack-cli": "^3.3.12" }, diff --git a/test/ui/command.test.ts b/test/ui/command.test.ts index d9772be0..c86da7f6 100644 --- a/test/ui/command.test.ts +++ b/test/ui/command.test.ts @@ -6,7 +6,7 @@ import * as fse from "fs-extra"; import { platform } from "os"; import * as path from "path"; import * as seleniumWebdriver from "selenium-webdriver"; -import { EditorView, InputBox, ModalDialog, SideBarView, StatusBar, TextEditor, TreeItem, Workbench } from "vscode-extension-tester"; +import { EditorView, InputBox, ModalDialog, SideBarView, TextEditor, TreeItem, Workbench } from "vscode-extension-tester"; import { DialogHandler, OpenDialog } from "vscode-extension-tester-native"; import { sleep } from "../util"; @@ -20,7 +20,7 @@ const targetPath = path.join(__dirname, "..", "..", "..", "test", "newProject"); describe("Command Tests", function() { - this.timeout(60000); + this.timeout(2 * 60 * 1000 /*ms*/); before(async function() { sleep(5000); @@ -57,7 +57,7 @@ describe("Command Tests", function() { await sleep(1000); const fileSections = await new SideBarView().getContent().getSections(); await fileSections[0].collapse(); - await waitForImporting(1000); + await sleep(60 * 1000 /*ms*/); }); it("Test javaProjectExplorer.focus", async function() { @@ -232,7 +232,7 @@ describe("Command Tests", function() { await folderNode.expand(); const fileNode = await fileExplorerSections[0].findItem("App.java") as TreeItem; await fileNode.click(); - await waitForImporting(1000); + await sleep(60 * 1000 /*ms*/); const fileSections = await new SideBarView().getContent().getSections(); await fileSections[0].collapse(); await new Workbench().executeCommand("javaProjectExplorer.focus"); @@ -302,15 +302,3 @@ describe("Command Tests", function() { assert.ok(await fse.pathExists(path.join(targetPath, newProjectName, "README.md")), `The template README file should be created`); }); }); - -async function waitForImporting(time: number) { - await new Promise(async (resolve) => { - const interval = setInterval(async () => { - const item = await new StatusBar().getItem("ServiceReady"); - if (item) { - clearInterval(interval); - resolve(); - } - }, time); - }); -} diff --git a/test/ui/index.ts b/test/ui/index.ts index 15cf2d3a..9c3f6500 100644 --- a/test/ui/index.ts +++ b/test/ui/index.ts @@ -1,24 +1,34 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT license. -import * as os from "os"; +import * as fse from "fs-extra"; import * as path from "path"; +import * as semver from "semver"; import { ExTester } from "vscode-extension-tester"; +/* tslint:disable:no-console */ async function main(): Promise { try { // Run UI command tests + const packageContent = await fse.readFile(path.join(__dirname, "..", "..", "..", "package.json")); + const packageJSON = JSON.parse(packageContent.toString()); + let vscodeVersion = packageJSON.engines.vscode; + if (!vscodeVersion) { + console.log("No valid version of VSCode engine was found in package.json"); + process.exit(1); + } + vscodeVersion = semver.minVersion(vscodeVersion); + const version = vscodeVersion.version; const testPath = path.join(__dirname, "command.test.js"); const exTester = new ExTester(); - // The current version (4.1.1) of vscode-extension-tester doesn't support the newest VSCode version (^1.58.0) - await exTester.downloadCode("1.57.0"); + await exTester.downloadCode(version); await exTester.installVsix(); await exTester.installFromMarketplace("redhat.java"); - await exTester.downloadChromeDriver("1.57.0"); - await exTester.setupRequirements({vscodeVersion: "1.57.0"}); - process.exit(await exTester.runTests(testPath, {vscodeVersion: "1.57.0"})); + await exTester.downloadChromeDriver(version); + await exTester.setupRequirements({vscodeVersion: version}); + process.exit(await exTester.runTests(testPath, {vscodeVersion: version})); } catch (err) { - process.stdout.write(`${err}${os.EOL}`); + console.log(err); process.exit(1); } } From 3bc57b4a55ffb7414ca77010e9a7971d0359c595 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 11 Aug 2021 11:02:27 +0800 Subject: [PATCH 049/352] chore(deps): Bump path-parse from 1.0.6 to 1.0.7 (#536) Bumps [path-parse](https://github.com/jbgutierrez/path-parse) from 1.0.6 to 1.0.7. - [Release notes](https://github.com/jbgutierrez/path-parse/releases) - [Commits](https://github.com/jbgutierrez/path-parse/commits/v1.0.7) --- updated-dependencies: - dependency-name: path-parse dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index f50e6670..23761dba 100644 --- a/package-lock.json +++ b/package-lock.json @@ -517,7 +517,7 @@ }, "ansi-colors": { "version": "1.1.0", - "resolved": "http://registry.npmjs.org/ansi-colors/-/ansi-colors-1.1.0.tgz", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-1.1.0.tgz", "integrity": "sha512-SFKX67auSNoVR38N3L+nvsPjOE0bybKTYbkf5tRvushrAPQ9V75huw0ZxBkKVeRU9kqH3d6HA4xTckbwZ4ixmA==", "dev": true, "requires": { @@ -913,7 +913,7 @@ }, "util": { "version": "0.10.3", - "resolved": "http://registry.npmjs.org/util/-/util-0.10.3.tgz", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", "dev": true, "requires": { @@ -5969,9 +5969,9 @@ "dev": true }, "path-parse": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", - "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", "dev": true }, "path-root": { @@ -9569,7 +9569,7 @@ }, "wrap-ansi": { "version": "2.1.0", - "resolved": "http://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", "dev": true, "requires": { From f25fdfe06fddfe6b79f6f13a478db36d695c395a Mon Sep 17 00:00:00 2001 From: Sheng Chen Date: Fri, 20 Aug 2021 10:58:55 +0800 Subject: [PATCH 050/352] feat: Support new file contribution (#533) --- package-lock.json | 22 ++++---- package.json | 14 ++--- src/commands.ts | 5 ++ src/explorerCommands/new.ts | 92 +++++++++++++++++++++++++++++---- src/views/dependencyExplorer.ts | 6 +-- 5 files changed, 108 insertions(+), 31 deletions(-) diff --git a/package-lock.json b/package-lock.json index 23761dba..f22cb461 100644 --- a/package-lock.json +++ b/package-lock.json @@ -262,9 +262,9 @@ "dev": true }, "@types/vscode": { - "version": "1.53.0", - "resolved": "https://devdiv.pkgs.visualstudio.com/_packaging/CloudKernel/npm/registry/@types/vscode/-/vscode-1.53.0.tgz", - "integrity": "sha1-R7U3F69lYvKtBRcbychQCCSjkFw=", + "version": "1.59.0", + "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.59.0.tgz", + "integrity": "sha512-Zg38rusx2nU6gy6QdF7v4iqgxNfxzlBlDhrRCjOiPQp+sfaNrp3f9J6OHIhpGNN1oOAca4+9Hq0+8u3jwzPMlQ==", "dev": true }, "@ungap/promise-all-settled": { @@ -1226,7 +1226,7 @@ }, "browserify-aes": { "version": "1.2.0", - "resolved": "http://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", + "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", "dev": true, "requires": { @@ -2195,7 +2195,7 @@ }, "create-hash": { "version": "1.2.0", - "resolved": "http://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", + "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", "dev": true, "requires": { @@ -2208,7 +2208,7 @@ }, "create-hmac": { "version": "1.1.7", - "resolved": "http://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", + "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", "dev": true, "requires": { @@ -2489,7 +2489,7 @@ }, "diffie-hellman": { "version": "5.0.3", - "resolved": "http://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", + "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", "dev": true, "requires": { @@ -4472,7 +4472,7 @@ }, "load-json-file": { "version": "1.1.0", - "resolved": "http://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", "dev": true, "requires": { @@ -5765,7 +5765,7 @@ }, "os-locale": { "version": "1.4.0", - "resolved": "http://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", "dev": true, "requires": { @@ -6957,7 +6957,7 @@ }, "sha.js": { "version": "2.4.11", - "resolved": "http://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", "dev": true, "requires": { @@ -8222,7 +8222,7 @@ }, "tty-browserify": { "version": "0.0.0", - "resolved": "http://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", + "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=", "dev": true }, diff --git a/package.json b/package.json index 4f5841e0..fd7e44fc 100644 --- a/package.json +++ b/package.json @@ -12,7 +12,7 @@ "explorer" ], "engines": { - "vscode": "^1.53.0" + "vscode": "^1.59.0" }, "repository": { "type": "git", @@ -31,6 +31,7 @@ "onCommand:java.project.create", "onCommand:java.view.package.exportJar", "onCommand:java.view.package.revealInProjectExplorer", + "onCommand:java.view.package.newJavaClass", "onView:javaProjectExplorer" ], "license": "MIT", @@ -257,6 +258,11 @@ } ], "menus": { + "file/newFile": [ + { + "command": "java.view.package.newJavaClass" + } + ], "commandPalette": [ { "command": "java.view.package.exportJar", @@ -310,10 +316,6 @@ "command": "java.project.refreshLibraries", "when": "false" }, - { - "command": "java.view.package.newJavaClass", - "when": "false" - }, { "command": "java.view.package.newPackage", "when": "false" @@ -595,7 +597,7 @@ "@types/mocha": "^8.2.1", "@types/node": "^8.10.66", "@types/semver": "^7.3.8", - "@types/vscode": "1.53.0", + "@types/vscode": "1.59.0", "copy-webpack-plugin": "^6.4.1", "glob": "^7.1.6", "gulp": "^4.0.2", diff --git a/src/commands.ts b/src/commands.ts index ba6bbb1b..276c08f2 100644 --- a/src/commands.ts +++ b/src/commands.ts @@ -94,6 +94,11 @@ export namespace Commands { export const WORKBENCH_ACTION_FILES_OPENFOLDER = "workbench.action.files.openFolder"; export const WORKBENCH_ACTION_FILES_OPENFILEFOLDER = "workbench.action.files.openFileFolder"; + + /** + * Commands from JLS + */ + export const LIST_SOURCEPATHS = "java.project.listSourcePaths"; } export function executeJavaLanguageServerCommand(...rest: any[]) { diff --git a/src/explorerCommands/new.ts b/src/explorerCommands/new.ts index 7d15b9c1..b8ca4303 100644 --- a/src/explorerCommands/new.ts +++ b/src/explorerCommands/new.ts @@ -3,19 +3,29 @@ import * as fse from "fs-extra"; import * as path from "path"; -import { QuickPickItem, Uri, window, workspace, WorkspaceEdit } from "vscode"; +import { commands, languages, QuickPickItem, SnippetString, TextEditor, Uri, window, workspace, WorkspaceEdit, WorkspaceFolder } from "vscode"; +import { Commands } from "../../extension.bundle"; import { NodeKind } from "../java/nodeData"; import { DataNode } from "../views/dataNode"; import { checkJavaQualifiedName } from "./utility"; export async function newJavaClass(node?: DataNode): Promise { - if (!node?.uri || !canCreateClass(node)) { - return; + let packageFsPath: string | undefined; + if (!node) { + packageFsPath = await inferPackageFsPath(); + } else { + if (!node?.uri || !canCreateClass(node)) { + return; + } + + packageFsPath = await getPackageFsPath(node); } - const packageFsPath: string = await getPackageFsPath(node); - if (!packageFsPath) { + if (packageFsPath === undefined) { + // User canceled return; + } else if (packageFsPath.length === 0) { + return newUntiledJavaFile(); } const className: string | undefined = await window.showInputBox({ @@ -27,7 +37,7 @@ export async function newJavaClass(node?: DataNode): Promise { return checkMessage; } - if (await fse.pathExists(getNewFilePath(packageFsPath, value))) { + if (await fse.pathExists(getNewFilePath(packageFsPath!, value))) { return "Class already exists."; } @@ -47,6 +57,57 @@ export async function newJavaClass(node?: DataNode): Promise { workspace.applyEdit(workspaceEdit); } +async function newUntiledJavaFile(): Promise { + await commands.executeCommand("workbench.action.files.newUntitledFile"); + const textEditor: TextEditor | undefined = window.activeTextEditor; + if (!textEditor) { + return; + } + await languages.setTextDocumentLanguage(textEditor.document, "java"); + const snippets: string[] = []; + snippets.push(`public \${1|class,interface,enum,abstract class,@interface|} \${2:Main} {`); + snippets.push(`\t\${0}`); + snippets.push("}"); + snippets.push(""); + textEditor.insertSnippet(new SnippetString(snippets.join("\n"))); +} + +async function inferPackageFsPath(): Promise { + let sourcePaths: string[] | undefined; + try { + const result = await commands.executeCommand(Commands.EXECUTE_WORKSPACE_COMMAND, Commands.LIST_SOURCEPATHS); + if (result && result.data && result.data.length) { + sourcePaths = result.data.map((entry) => entry.path); + } + } catch (e) { + // do nothing + } + + if (!window.activeTextEditor) { + if (sourcePaths?.length === 1) { + return sourcePaths[0]; + } + return ""; + } + + const fileUri: Uri = window.activeTextEditor.document.uri; + const workspaceFolder: WorkspaceFolder | undefined = workspace.getWorkspaceFolder(fileUri); + if (!workspaceFolder) { + return ""; + } + + const filePath: string = window.activeTextEditor.document.uri.fsPath; + if (sourcePaths) { + for (const sourcePath of sourcePaths) { + if (!path.relative(sourcePath, filePath).startsWith("..")) { + return path.dirname(window.activeTextEditor.document.uri.fsPath); + } + } + } + + return ""; +} + function canCreateClass(node: DataNode): boolean { if (node.nodeData.kind === NodeKind.Project || node.nodeData.kind === NodeKind.PackageRoot || @@ -58,7 +119,7 @@ function canCreateClass(node: DataNode): boolean { return false; } -async function getPackageFsPath(node: DataNode): Promise { +async function getPackageFsPath(node: DataNode): Promise { if (node.nodeData.kind === NodeKind.Project) { const childrenNodes: DataNode[] = await node.getChildren() as DataNode[]; const packageRoots: any[] = childrenNodes.filter((child) => { @@ -90,7 +151,7 @@ async function getPackageFsPath(node: DataNode): Promise { ignoreFocusOut: true, }, ); - return choice ? choice.fsPath : ""; + return choice?.fsPath; } } else if (node.nodeData.kind === NodeKind.PrimaryType) { return node.uri ? path.dirname(Uri.parse(node.uri).fsPath) : ""; @@ -116,7 +177,7 @@ export async function newPackage(node?: DataNode): Promise { const nodeKind = node.nodeData.kind; if (nodeKind === NodeKind.Project) { defaultValue = ""; - packageRootPath = await getPackageFsPath(node); + packageRootPath = await getPackageFsPath(node) || ""; } else if (nodeKind === NodeKind.PackageRoot) { defaultValue = ""; packageRootPath = Uri.parse(node.uri).fsPath; @@ -175,3 +236,16 @@ function getNewPackagePath(packageRootPath: string, packageName: string): string interface ISourceRootPickItem extends QuickPickItem { fsPath: string; } + +interface IListCommandResult { + status: boolean; + message: string; + data?: ISourcePath[]; +} + +interface ISourcePath { + path: string; + displayPath: string; + projectName: string; + projectType: string; +} diff --git a/src/views/dependencyExplorer.ts b/src/views/dependencyExplorer.ts index fcafeb8c..f9c1f155 100644 --- a/src/views/dependencyExplorer.ts +++ b/src/views/dependencyExplorer.ts @@ -97,11 +97,7 @@ export class DependencyExplorer implements Disposable { // register keybinding commands context.subscriptions.push( instrumentOperationAsVsCodeCommand(Commands.VIEW_PACKAGE_NEW_JAVA_CLASS, async (node?: DataNode) => { - let cmdNode = getCmdNode(this._dependencyViewer.selection, node); - if (!cmdNode) { - cmdNode = await this.promptForProjectNode(); - } - newJavaClass(cmdNode); + newJavaClass(node); }), instrumentOperationAsVsCodeCommand(Commands.VIEW_PACKAGE_NEW_JAVA_PACKAGE, async (node?: DataNode) => { let cmdNode = getCmdNode(this._dependencyViewer.selection, node); From 95498095a59a43777ca0f58399fd4736f1ab2c70 Mon Sep 17 00:00:00 2001 From: Sheng Chen Date: Fri, 20 Aug 2021 13:19:32 +0800 Subject: [PATCH 051/352] chore: Prepare 0.18.7 (#538) --- CHANGELOG.md | 4 ++++ .../com.microsoft.jdtls.ext.activator/META-INF/MANIFEST.MF | 2 +- jdtls.ext/com.microsoft.jdtls.ext.activator/pom.xml | 2 +- jdtls.ext/com.microsoft.jdtls.ext.core/META-INF/MANIFEST.MF | 2 +- jdtls.ext/com.microsoft.jdtls.ext.core/pom.xml | 2 +- jdtls.ext/pom.xml | 2 +- package-lock.json | 2 +- package.json | 4 ++-- 8 files changed, 12 insertions(+), 8 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d9f69ec9..e8f38153 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,10 @@ All notable changes to the "vscode-java-dependency" extension will be documented The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/) and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html). +## 0.18.7 +### Added +- Support creating new Java class from `File` > `New File...`. [PR#533](https://github.com/microsoft/vscode-java-dependency/pull/533) + ## 0.18.6 ### Changed diff --git a/jdtls.ext/com.microsoft.jdtls.ext.activator/META-INF/MANIFEST.MF b/jdtls.ext/com.microsoft.jdtls.ext.activator/META-INF/MANIFEST.MF index 2fa25d69..547f2160 100644 --- a/jdtls.ext/com.microsoft.jdtls.ext.activator/META-INF/MANIFEST.MF +++ b/jdtls.ext/com.microsoft.jdtls.ext.activator/META-INF/MANIFEST.MF @@ -2,7 +2,7 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: JDTLS EXT Activator Bundle-SymbolicName: com.microsoft.jdtls.ext.activator;singleton:=true -Bundle-Version: 0.18.6 +Bundle-Version: 0.18.7 Bundle-Activator: com.microsoft.jdtls.ext.activator.JdtlsExtActivator Bundle-RequiredExecutionEnvironment: JavaSE-1.8 Import-Package: org.eclipse.jdt.core, diff --git a/jdtls.ext/com.microsoft.jdtls.ext.activator/pom.xml b/jdtls.ext/com.microsoft.jdtls.ext.activator/pom.xml index bb32ceba..d7528440 100644 --- a/jdtls.ext/com.microsoft.jdtls.ext.activator/pom.xml +++ b/jdtls.ext/com.microsoft.jdtls.ext.activator/pom.xml @@ -5,7 +5,7 @@ com.microsoft.jdtls.ext jdtls-ext-parent - 0.18.6 + 0.18.7 com.microsoft.jdtls.ext.activator eclipse-plugin diff --git a/jdtls.ext/com.microsoft.jdtls.ext.core/META-INF/MANIFEST.MF b/jdtls.ext/com.microsoft.jdtls.ext.core/META-INF/MANIFEST.MF index 8748bb26..c19f319a 100644 --- a/jdtls.ext/com.microsoft.jdtls.ext.core/META-INF/MANIFEST.MF +++ b/jdtls.ext/com.microsoft.jdtls.ext.core/META-INF/MANIFEST.MF @@ -2,7 +2,7 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: JDTLS EXT Core Bundle-SymbolicName: com.microsoft.jdtls.ext.core;singleton:=true -Bundle-Version: 0.18.6 +Bundle-Version: 0.18.7 Bundle-Activator: com.microsoft.jdtls.ext.core.JdtlsExtActivator Bundle-RequiredExecutionEnvironment: JavaSE-1.8 Bundle-ActivationPolicy: lazy diff --git a/jdtls.ext/com.microsoft.jdtls.ext.core/pom.xml b/jdtls.ext/com.microsoft.jdtls.ext.core/pom.xml index ac5b4dc6..fe229ed8 100644 --- a/jdtls.ext/com.microsoft.jdtls.ext.core/pom.xml +++ b/jdtls.ext/com.microsoft.jdtls.ext.core/pom.xml @@ -5,7 +5,7 @@ com.microsoft.jdtls.ext jdtls-ext-parent - 0.18.6 + 0.18.7 com.microsoft.jdtls.ext.core eclipse-plugin diff --git a/jdtls.ext/pom.xml b/jdtls.ext/pom.xml index 441b672e..afbd2365 100644 --- a/jdtls.ext/pom.xml +++ b/jdtls.ext/pom.xml @@ -4,7 +4,7 @@ com.microsoft.jdtls.ext jdtls-ext-parent ${base.name} :: Parent - 0.18.6 + 0.18.7 pom Java Project Manager diff --git a/package-lock.json b/package-lock.json index f22cb461..6c20d787 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "vscode-java-dependency", - "version": "0.18.6", + "version": "0.18.7", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index fd7e44fc..c4d2519b 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "vscode-java-dependency", "displayName": "Project Manager for Java", "description": "%description%", - "version": "0.18.6", + "version": "0.18.7", "publisher": "vscjava", "preview": true, "aiKey": "5c642b22-e845-4400-badb-3f8509a70777", @@ -38,7 +38,7 @@ "main": "./main.js", "contributes": { "javaExtensions": [ - "./server/com.microsoft.jdtls.ext.core-0.18.6.jar" + "./server/com.microsoft.jdtls.ext.core-0.18.7.jar" ], "commands": [ { From e7b4f72eacd0da2364976da6905c14fbf06b7928 Mon Sep 17 00:00:00 2001 From: Sheng Chen Date: Mon, 23 Aug 2021 13:56:57 +0800 Subject: [PATCH 052/352] fix: Create untitled new file when JLS is not ready (#540) --- src/explorerCommands/new.ts | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/src/explorerCommands/new.ts b/src/explorerCommands/new.ts index b8ca4303..0ef5a82e 100644 --- a/src/explorerCommands/new.ts +++ b/src/explorerCommands/new.ts @@ -3,8 +3,10 @@ import * as fse from "fs-extra"; import * as path from "path"; -import { commands, languages, QuickPickItem, SnippetString, TextEditor, Uri, window, workspace, WorkspaceEdit, WorkspaceFolder } from "vscode"; +import { commands, Extension, extensions, languages, QuickPickItem, SnippetString, TextEditor, Uri, + window, workspace, WorkspaceEdit, WorkspaceFolder } from "vscode"; import { Commands } from "../../extension.bundle"; +import { ExtensionName } from "../constants"; import { NodeKind } from "../java/nodeData"; import { DataNode } from "../views/dataNode"; import { checkJavaQualifiedName } from "./utility"; @@ -12,6 +14,7 @@ import { checkJavaQualifiedName } from "./utility"; export async function newJavaClass(node?: DataNode): Promise { let packageFsPath: string | undefined; if (!node) { + // from the new file menu entry packageFsPath = await inferPackageFsPath(); } else { if (!node?.uri || !canCreateClass(node)) { @@ -73,6 +76,20 @@ async function newUntiledJavaFile(): Promise { } async function inferPackageFsPath(): Promise { + const javaLanguageSupport: Extension | undefined = extensions.getExtension(ExtensionName.JAVA_LANGUAGE_SUPPORT); + if (!javaLanguageSupport || !javaLanguageSupport.isActive) { + return ""; + } + + const extensionApi: any = javaLanguageSupport.exports; + if (!extensionApi) { + return ""; + } + + if (extensionApi.serverMode !== "Standard" || extensionApi.status !== "Started") { + return ""; + } + let sourcePaths: string[] | undefined; try { const result = await commands.executeCommand(Commands.EXECUTE_WORKSPACE_COMMAND, Commands.LIST_SOURCEPATHS); From 0aa321992acd2f7df0317867c06e1895095993ba Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 1 Sep 2021 10:02:41 +0800 Subject: [PATCH 053/352] chore(deps): Bump tar from 4.4.15 to 4.4.19 (#544) Bumps [tar](https://github.com/npm/node-tar) from 4.4.15 to 4.4.19. - [Release notes](https://github.com/npm/node-tar/releases) - [Changelog](https://github.com/npm/node-tar/blob/main/CHANGELOG.md) - [Commits](https://github.com/npm/node-tar/compare/v4.4.15...v4.4.19) --- updated-dependencies: - dependency-name: tar dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/package-lock.json b/package-lock.json index 6c20d787..4d2be6e0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1898,18 +1898,18 @@ "dev": true }, "tar": { - "version": "4.4.15", - "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.15.tgz", - "integrity": "sha512-ItbufpujXkry7bHH9NpQyTXPbJ72iTlXgkBAYsAjDXk3Ds8t/3NfO5P4xZGy7u+sYuQUbimgzswX4uQIEeNVOA==", + "version": "4.4.19", + "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.19.tgz", + "integrity": "sha512-a20gEsvHnWe0ygBY8JbxoM4w3SJdhc7ZAuxkLqh+nvNQN2IOt0B5lLgM490X5Hl8FF0dl0tOf2ewFYAlIFgzVA==", "dev": true, "requires": { - "chownr": "^1.1.1", - "fs-minipass": "^1.2.5", - "minipass": "^2.8.6", - "minizlib": "^1.2.1", - "mkdirp": "^0.5.0", - "safe-buffer": "^5.1.2", - "yallist": "^3.0.3" + "chownr": "^1.1.4", + "fs-minipass": "^1.2.7", + "minipass": "^2.9.0", + "minizlib": "^1.3.3", + "mkdirp": "^0.5.5", + "safe-buffer": "^5.2.1", + "yallist": "^3.1.1" } }, "unzipper": { @@ -7455,9 +7455,9 @@ "dev": true }, "tar": { - "version": "6.1.3", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.3.tgz", - "integrity": "sha512-3rUqwucgVZXTeyJyL2jqtUau8/8r54SioM1xj3AmTX3HnWQdj2AydfJ2qYYayPyIIznSplcvU9mhBb7dR2XF3w==", + "version": "6.1.11", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.11.tgz", + "integrity": "sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA==", "dev": true, "requires": { "chownr": "^2.0.0", From f3446c073273bcc4a4e7e8fe47a5fb19c8dfb1ef Mon Sep 17 00:00:00 2001 From: Sheng Chen Date: Thu, 9 Sep 2021 13:09:18 +0800 Subject: [PATCH 054/352] chore: Record the information of new Java class command (#541) --- src/explorerCommands/new.ts | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/explorerCommands/new.ts b/src/explorerCommands/new.ts index 0ef5a82e..36a3d470 100644 --- a/src/explorerCommands/new.ts +++ b/src/explorerCommands/new.ts @@ -5,6 +5,7 @@ import * as fse from "fs-extra"; import * as path from "path"; import { commands, Extension, extensions, languages, QuickPickItem, SnippetString, TextEditor, Uri, window, workspace, WorkspaceEdit, WorkspaceFolder } from "vscode"; +import { sendInfo } from "vscode-extension-telemetry-wrapper"; import { Commands } from "../../extension.bundle"; import { ExtensionName } from "../constants"; import { NodeKind } from "../java/nodeData"; @@ -15,8 +16,14 @@ export async function newJavaClass(node?: DataNode): Promise { let packageFsPath: string | undefined; if (!node) { // from the new file menu entry + sendInfo("", { + triggerNewFileFrom: "menuBar", + }); packageFsPath = await inferPackageFsPath(); } else { + sendInfo("", { + triggerNewFileFrom: "projectExplorer", + }); if (!node?.uri || !canCreateClass(node)) { return; } From ffa908362541e44e0c07133b8f4e0fb0221bd802 Mon Sep 17 00:00:00 2001 From: Sheng Chen Date: Thu, 9 Sep 2021 14:09:29 +0800 Subject: [PATCH 055/352] ui: Adopt new folder-library icon (#545) --- package-lock.json | 6 +++--- package.json | 4 ++-- src/views/containerNode.ts | 2 +- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index 4d2be6e0..3938255e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -262,9 +262,9 @@ "dev": true }, "@types/vscode": { - "version": "1.59.0", - "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.59.0.tgz", - "integrity": "sha512-Zg38rusx2nU6gy6QdF7v4iqgxNfxzlBlDhrRCjOiPQp+sfaNrp3f9J6OHIhpGNN1oOAca4+9Hq0+8u3jwzPMlQ==", + "version": "1.60.0", + "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.60.0.tgz", + "integrity": "sha512-wZt3VTmzYrgZ0l/3QmEbCq4KAJ71K3/hmMQ/nfpv84oH8e81KKwPEoQ5v8dNCxfHFVJ1JabHKmCvqdYOoVm1Ow==", "dev": true }, "@ungap/promise-all-settled": { diff --git a/package.json b/package.json index c4d2519b..246184a0 100644 --- a/package.json +++ b/package.json @@ -12,7 +12,7 @@ "explorer" ], "engines": { - "vscode": "^1.59.0" + "vscode": "^1.60.0" }, "repository": { "type": "git", @@ -597,7 +597,7 @@ "@types/mocha": "^8.2.1", "@types/node": "^8.10.66", "@types/semver": "^7.3.8", - "@types/vscode": "1.59.0", + "@types/vscode": "1.60.0", "copy-webpack-plugin": "^6.4.1", "glob": "^7.1.6", "gulp": "^4.0.2", diff --git a/src/views/containerNode.ts b/src/views/containerNode.ts index d4808017..664feb7b 100644 --- a/src/views/containerNode.ts +++ b/src/views/containerNode.ts @@ -44,7 +44,7 @@ export class ContainerNode extends DataNode { } protected get iconPath(): ThemeIcon { - return new ThemeIcon("library"); + return new ThemeIcon("folder-library"); } } From ed3f4780efcb35b7ac8bce562ee36239b5aa0d83 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 9 Sep 2021 14:23:11 +0800 Subject: [PATCH 056/352] chore(deps): Bump axios from 0.21.1 to 0.21.4 (#546) Bumps [axios](https://github.com/axios/axios) from 0.21.1 to 0.21.4. - [Release notes](https://github.com/axios/axios/releases) - [Changelog](https://github.com/axios/axios/blob/master/CHANGELOG.md) - [Commits](https://github.com/axios/axios/compare/v0.21.1...v0.21.4) --- updated-dependencies: - dependency-name: axios dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/package-lock.json b/package-lock.json index 3938255e..cbcb8366 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1021,11 +1021,18 @@ "dev": true }, "axios": { - "version": "0.21.1", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.1.tgz", - "integrity": "sha512-dKQiRHxGD9PPRIUNIWvZhPTPpl1rf/OxTYKsqKUDjBwYylTvV7SjSHJb9ratfyzM6wCdLCOYLzs73qpg5c4iGA==", + "version": "0.21.4", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz", + "integrity": "sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==", "requires": { - "follow-redirects": "^1.10.0" + "follow-redirects": "^1.14.0" + }, + "dependencies": { + "follow-redirects": { + "version": "1.14.3", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.3.tgz", + "integrity": "sha512-3MkHxknWMUtb23apkgz/83fDoe+y+qr0TdgacGIA7bew+QLBo3vdgEN2xEsuXNivpFy4CyDhBBZnNZOtalmenw==" + } } }, "azure-devops-node-api": { @@ -3238,11 +3245,6 @@ "readable-stream": "^2.3.6" } }, - "follow-redirects": { - "version": "1.13.3", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.13.3.tgz", - "integrity": "sha512-DUgl6+HDzB0iEptNQEXLx/KhTmDb8tZUHSeLqpnjpknR70H0nC2t9N73BK6fN4hOvJ84pKlIQVQ4k5FFlBedKA==" - }, "for-in": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", From e1fe563722778bac0643c8853a919e8c844a2788 Mon Sep 17 00:00:00 2001 From: Sheng Chen Date: Thu, 16 Sep 2021 16:23:32 +0800 Subject: [PATCH 057/352] fix: Show the hints in Java Projects explorer properly (#547) --- package.json | 29 ++++-- package.nls.json | 5 +- package.nls.zh.json | 5 +- src/constants.ts | 9 +- src/exportJarSteps/ExportJarTaskProvider.ts | 2 +- src/extension.ts | 50 +++------- .../languageServerApiManager.ts | 94 +++++++++++-------- src/utility.ts | 7 +- src/views/dependencyDataProvider.ts | 6 +- src/views/dependencyExplorer.ts | 4 +- 10 files changed, 102 insertions(+), 109 deletions(-) diff --git a/package.json b/package.json index 246184a0..0c69ef0b 100644 --- a/package.json +++ b/package.json @@ -27,12 +27,16 @@ } }, "activationEvents": [ + "onLanguage:java", + "workspaceContains:pom.xml", + "workspaceContains:build.gradle", + "workspaceContains:settings.gradle", + "workspaceContains:build.gradle.kts", + "workspaceContains:settings.gradle.kts", + "workspaceContains:.classpath", "onCommand:_java.project.open", "onCommand:java.project.create", - "onCommand:java.view.package.exportJar", - "onCommand:java.view.package.revealInProjectExplorer", - "onCommand:java.view.package.newJavaClass", - "onView:javaProjectExplorer" + "onCommand:java.view.package.newJavaClass" ], "license": "MIT", "main": "./main.js", @@ -266,7 +270,7 @@ "commandPalette": [ { "command": "java.view.package.exportJar", - "when": "java:serverMode == Standard" + "when": "java:serverMode == Standard && !java:noJavaProjects" }, { "command": "java.view.package.refresh", @@ -348,7 +352,7 @@ "explorer/context": [ { "command": "java.view.package.revealInProjectExplorer", - "when": "resourceFilename in java:supportedBuildFiles && java:serverMode == Standard", + "when": "resourceFilename =~ /(.*\\.gradle)|(.*\\.gradle\\.kts)|(pom\\.xml)$/ && java:serverMode == Standard", "group": "navigation@100" }, { @@ -360,7 +364,7 @@ "editor/title/context": [ { "command": "java.view.package.revealInProjectExplorer", - "when": "resourceFilename in java:supportedBuildFiles && java:serverMode == Standard", + "when": "resourceFilename =~ /(.*\\.gradle)|(.*\\.gradle\\.kts)|(pom\\.xml)$/ && java:serverMode == Standard", "group": "2_files@100" }, { @@ -372,7 +376,7 @@ "view/title": [ { "command": "java.project.create", - "when": "view == javaProjectExplorer && java:serverMode == Standard", + "when": "view == javaProjectExplorer", "group": "navigation@10" }, { @@ -515,9 +519,9 @@ { "id": "javaProjectExplorer", "name": "Java Projects", - "when": "java:serverMode", "contextualTitle": "Java Projects", - "icon": "$(project)" + "icon": "$(project)", + "when": "resourceLangId == java || java:workspaceContainsBuildFiles || java:serverMode" } ] }, @@ -536,6 +540,11 @@ "view": "javaProjectExplorer", "contents": "%viewsWelcome.workbench.inLightWeightMode%", "when": "java:serverMode == LightWeight" + }, + { + "view": "javaProjectExplorer", + "contents": "%viewsWelcome.workbench.installLanguageSupport%", + "when": "java:projectManagerActivated && !java:languageSupportInstalled" } ], "taskDefinitions": [ diff --git a/package.nls.json b/package.nls.json index 44fe7bfe..5331478e 100644 --- a/package.nls.json +++ b/package.nls.json @@ -38,6 +38,7 @@ "taskDefinitions.java.project.exportJar.dependencies": "The artifact dependencies in the runtime scope.", "taskDefinitions.java.project.exportJar.testDependencies": "The artifact dependencies in the test scope.", "viewsWelcome.workbench.createNewJavaProject": "You can also [open a Java project](command:_java.project.open), or create a new Java project by clicking the button below.\n[Create Java Project](command:java.project.create)", - "viewsWelcome.workbench.noJavaProject": "No Java projects found in the current workspace. You can [open a Java project](command:_java.project.open), or create a new Java project by clicking the button below.\n[Create Java Project](command:java.project.create)", - "viewsWelcome.workbench.inLightWeightMode": "No projects are listed because the Java Language Server is currently running in [LightWeight Mode](https://aka.ms/vscode-java-lightweight). To show projects, click on the button to switch to Standard Mode.\n[Switch to Standard Mode](command:java.server.mode.switch?%5B%22Standard%22,true%5D)" + "viewsWelcome.workbench.noJavaProject": "No Java projects found in the current workspace. You can [open a Java project folder](command:_java.project.open), or create a new Java project by clicking the button below.\n[Create Java Project](command:java.project.create)", + "viewsWelcome.workbench.inLightWeightMode": "To view the projects, you can import the projects into workspace.\n[Import Projects](command:java.server.mode.switch?%5B%22Standard%22,true%5D)", + "viewsWelcome.workbench.installLanguageSupport": "The Java Projects explorer requires [Language Support for Java(TM) by Red Hat](command:extension.open?%5B%22redhat.java%22%5D) to provide full features.\n[Install](command:workbench.extensions.installExtension?%5B%22redhat.java%22%5D)" } diff --git a/package.nls.zh.json b/package.nls.zh.json index 3314e85b..054d88d5 100644 --- a/package.nls.zh.json +++ b/package.nls.zh.json @@ -38,6 +38,7 @@ "taskDefinitions.java.project.exportJar.dependencies": "在 runtime scope 内的依赖。", "taskDefinitions.java.project.exportJar.testDependencies": "在 test scope 内的依赖。", "viewsWelcome.workbench.createNewJavaProject": "您也可以[打开一个 Java 项目](command:_java.project.open),或点击下方按钮创建一个新的 Java 项目。\n[创建 Java 项目](command:java.project.create)", - "viewsWelcome.workbench.noJavaProject": "当前工作空间未发现 Java 项目,您可以[打开一个 Java 项目](command:_java.project.open),或点击下方按钮创建一个新的 Java 项目。\n[创建 Java 项目](command:java.project.create)", - "viewsWelcome.workbench.inLightWeightMode": "由于 Java 语言服务正运行在 [LightWeight 模式](https://aka.ms/vscode-java-lightweight)下,因此项目将不会展示在该视图中。如果您需要展示项目信息,可以点击下方按钮将 Java 语言服务切换至 Standard 模式。\n[切换至 Standard 模式](command:java.server.mode.switch?%5B%22Standard%22,true%5D)" + "viewsWelcome.workbench.noJavaProject": "当前工作空间未发现 Java 项目,您可以[打开一个 Java 项目目录](command:_java.project.open),或点击下方按钮创建一个新的 Java 项目。\n[创建 Java 项目](command:java.project.create)", + "viewsWelcome.workbench.inLightWeightMode": "要浏览项目信息,你可以将项目导入到工作空间中。\n[导入项目](command:java.server.mode.switch?%5B%22Standard%22,true%5D)", + "viewsWelcome.workbench.installLanguageSupport": "Java 项目视图需要安装并激活 [Language Support for Java(TM) by Red Hat](command:extension.open?%5B%22redhat.java%22%5D) 以提供完整的功能。\n[安装](command:workbench.extensions.installExtension?%5B%22redhat.java%22%5D)" } diff --git a/src/constants.ts b/src/constants.ts index 87eaca8e..e71cad32 100644 --- a/src/constants.ts +++ b/src/constants.ts @@ -3,8 +3,9 @@ export namespace Context { export const EXTENSION_ACTIVATED: string = "java:projectManagerActivated"; - export const SUPPORTED_BUILD_FILES: string = "java:supportedBuildFiles"; - export const NO_JAVA_PEOJECT: string = "java:noJavaProjects"; + export const LANGUAGE_SUPPORT_INSTALLED: string = "java:languageSupportInstalled"; + export const NO_JAVA_PROJECT: string = "java:noJavaProjects"; + export const WORKSPACE_CONTAINS_BUILD_FILES: string = "java:workspaceContainsBuildFiles"; } export namespace Explorer { @@ -21,10 +22,6 @@ export namespace Explorer { } } -export namespace Build { - export const FILE_NAMES: string[] = ["pom.xml", "build.gradle"]; -} - export namespace ExtensionName { export const JAVA_LANGUAGE_SUPPORT: string = "redhat.java"; } diff --git a/src/exportJarSteps/ExportJarTaskProvider.ts b/src/exportJarSteps/ExportJarTaskProvider.ts index 0c078b0e..6d3aadf6 100644 --- a/src/exportJarSteps/ExportJarTaskProvider.ts +++ b/src/exportJarSteps/ExportJarTaskProvider.ts @@ -40,7 +40,7 @@ export async function executeExportJarTask(node?: INodeData): Promise { // save the workspace first await workspace.saveAll(false /*includeUntitled*/); - if (!await languageServerApiManager.isStandardServerReady() || isExportingJar || await buildWorkspace() === false) { + if (!await languageServerApiManager.ready() || isExportingJar || await buildWorkspace() === false) { return; } isExportingJar = true; diff --git a/src/extension.ts b/src/extension.ts index 99043868..e4fad0cb 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -1,14 +1,15 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT license. -import { Event, Extension, ExtensionContext, extensions, tasks, Uri } from "vscode"; +import { ExtensionContext, tasks, Uri, workspace } from "vscode"; import { dispose as disposeTelemetryWrapper, initializeFromJsonFile, instrumentOperation, sendInfo } from "vscode-extension-telemetry-wrapper"; import { contextManager } from "../extension.bundle"; -import { Build, Context, ExtensionName } from "./constants"; +import { Context } from "./constants"; import { LibraryController } from "./controllers/libraryController"; import { ProjectController } from "./controllers/projectController"; import { init as initExpService } from "./ExperimentationService"; import { ExportJarTaskProvider } from "./exportJarSteps/ExportJarTaskProvider"; +import { languageServerApiManager } from "./languageServerApi/languageServerApiManager"; import { Settings } from "./settings"; import { syncHandler } from "./syncHandler"; import { EventCounter } from "./utility"; @@ -19,11 +20,19 @@ export async function activate(context: ExtensionContext): Promise { await initializeFromJsonFile(context.asAbsolutePath("./package.json"), { firstParty: true }); await initExpService(context); await instrumentOperation("activation", activateExtension)(context); + languageServerApiManager.initializeJavaLanguageServerApi(false); + // the when clause does not support 'workspaceContains' we used for activation event, + // so we manually find the target files and set it to a context value. + workspace.findFiles("{*.gradle,*.gradle.kts,pom.xml,.classpath}", undefined, 1).then((uris: Uri[]) => { + if (uris && uris.length) { + contextManager.setContextValue(Context.WORKSPACE_CONTAINS_BUILD_FILES, true); + } + }); contextManager.setContextValue(Context.EXTENSION_ACTIVATED, true); - contextManager.setContextValue(Context.SUPPORTED_BUILD_FILES, Build.FILE_NAMES); } async function activateExtension(_operationId: string, context: ExtensionContext): Promise { + context.subscriptions.push(languageServerApiManager); context.subscriptions.push(new ProjectController(context)); Settings.initialize(context); context.subscriptions.push(new LibraryController(context)); @@ -31,41 +40,6 @@ async function activateExtension(_operationId: string, context: ExtensionContext context.subscriptions.push(contextManager); context.subscriptions.push(syncHandler); context.subscriptions.push(tasks.registerTaskProvider(ExportJarTaskProvider.exportJarType, new ExportJarTaskProvider())); - - const pollingJLS = () => { - const javaLanguageSupport: Extension | undefined = extensions.getExtension(ExtensionName.JAVA_LANGUAGE_SUPPORT); - if (!javaLanguageSupport) { - return; - } - - if (javaLanguageSupport.isActive) { - const extensionApi: any = javaLanguageSupport.exports; - if (!extensionApi) { - return; - } - - if (extensionApi.onDidClasspathUpdate) { - const onDidClasspathUpdate: Event = extensionApi.onDidClasspathUpdate; - context.subscriptions.push(onDidClasspathUpdate(async () => { - syncHandler.updateFileWatcher(Settings.autoRefresh()); - })); - } - - if (extensionApi.serverMode === "Standard") { - syncHandler.updateFileWatcher(Settings.autoRefresh()); - } else { - if (extensionApi.onDidServerModeChange) { - const onDidServerModeChange: Event = extensionApi.onDidServerModeChange; - context.subscriptions.push(onDidServerModeChange(async () => { - syncHandler.updateFileWatcher(Settings.autoRefresh()); - })); - } - } - } else { - setTimeout(pollingJLS, 3 * 1000 /*ms*/); - } - }; - pollingJLS(); } // this method is called when your extension is deactivated diff --git a/src/languageServerApi/languageServerApiManager.ts b/src/languageServerApi/languageServerApiManager.ts index 8837a22f..3f207848 100644 --- a/src/languageServerApi/languageServerApiManager.ts +++ b/src/languageServerApi/languageServerApiManager.ts @@ -1,54 +1,58 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT license. -import { commands, Event, Extension, extensions, Uri } from "vscode"; +import { commands, Disposable, Event, Extension, extensions, Uri } from "vscode"; import { Commands } from "../commands"; +import { Context, ExtensionName } from "../constants"; import { contextManager } from "../contextManager"; +import { Settings } from "../settings"; +import { syncHandler } from "../syncHandler"; import { LanguageServerMode } from "./LanguageServerMode"; -class LanguageServerApiManager { +class LanguageServerApiManager implements Disposable { + /** + * undefined means a legacy version language server + * null means the JDT.LS is not activated + */ private serverMode: LanguageServerMode | null | undefined = null; - public async isStandardServerReady(): Promise { + private extensionChangeListener: Disposable; + + public async ready(): Promise { await this.checkServerMode(); - // undefined serverMode indicates an older version language server - if (this.serverMode === undefined) { - return true; - } - if (this.serverMode !== LanguageServerMode.Standard) { + if (this.serverMode === null || this.serverMode === LanguageServerMode.LightWeight) { return false; } - return true; - } - - public async isLightWeightMode(): Promise { - await this.checkServerMode(); - return this.serverMode === LanguageServerMode.LightWeight; - } - - public async awaitSwitchingServerFinished(): Promise { - await this.checkServerMode(); if (this.serverMode === LanguageServerMode.Hybrid) { await new Promise((resolve: () => void): void => { extensions.getExtension("redhat.java")!.exports.onDidServerModeChange(resolve); }); } - } - private async checkServerMode(): Promise { - if (this.serverMode === null) { - await this.initializeJavaLanguageServerApi(); - } + return true; } - private async initializeJavaLanguageServerApi(): Promise { - if (this.serverMode !== null) { + public async initializeJavaLanguageServerApi(forceActivate: boolean = true): Promise { + if (this.isLanguageServerActivated()) { return; } - const extension: Extension | undefined = extensions.getExtension("redhat.java"); + + if (!this.extensionChangeListener) { + this.extensionChangeListener = extensions.onDidChange(() => { + if (this.serverMode === null) { + commands.executeCommand(Commands.VIEW_PACKAGE_REFRESH, /* debounce = */false); + } + }); + } + + const extension: Extension | undefined = extensions.getExtension(ExtensionName.JAVA_LANGUAGE_SUPPORT); if (extension) { + contextManager.setContextValue(Context.LANGUAGE_SUPPORT_INSTALLED, true); + if (!forceActivate) { + return; + } await extension.activate(); const extensionApi: any = extension.exports; if (!extensionApi) { @@ -56,39 +60,55 @@ class LanguageServerApiManager { } this.serverMode = extensionApi.serverMode; + if (this.serverMode === LanguageServerMode.Standard) { + syncHandler.updateFileWatcher(Settings.autoRefresh()); + } if (extensionApi.onDidClasspathUpdate) { const onDidClasspathUpdate: Event = extensionApi.onDidClasspathUpdate; - contextManager.context.subscriptions.push(onDidClasspathUpdate(async () => { - await commands.executeCommand(Commands.VIEW_PACKAGE_REFRESH, /* debounce = */true); + contextManager.context.subscriptions.push(onDidClasspathUpdate(() => { + commands.executeCommand(Commands.VIEW_PACKAGE_REFRESH, /* debounce = */true); + syncHandler.updateFileWatcher(Settings.autoRefresh()); })); } if (extensionApi.onDidServerModeChange) { const onDidServerModeChange: Event = extensionApi.onDidServerModeChange; - contextManager.context.subscriptions.push(onDidServerModeChange(async (mode: LanguageServerMode) => { + contextManager.context.subscriptions.push(onDidServerModeChange((mode: LanguageServerMode) => { if (this.serverMode !== mode) { - let needRefresh: boolean = true; - if (this.serverMode === "Hybrid") { - // Explorer will await when JLS is in Hybrid mode (activating), - needRefresh = false; - } - this.serverMode = mode; - if (needRefresh) { + if (mode === LanguageServerMode.Hybrid) { commands.executeCommand(Commands.VIEW_PACKAGE_REFRESH, /* debounce = */false); + } else if (mode === LanguageServerMode.Standard) { + syncHandler.updateFileWatcher(Settings.autoRefresh()); } + this.serverMode = mode; } })); } if (extensionApi.onDidProjectsImport) { const onDidProjectsImport: Event = extensionApi.onDidProjectsImport; - contextManager.context.subscriptions.push(onDidProjectsImport(async () => { + contextManager.context.subscriptions.push(onDidProjectsImport(() => { commands.executeCommand(Commands.VIEW_PACKAGE_REFRESH, /* debounce = */true); + syncHandler.updateFileWatcher(Settings.autoRefresh()); })); } } } + + public dispose() { + this.extensionChangeListener.dispose(); + } + + private isLanguageServerActivated(): boolean { + return this.serverMode !== null; + } + + private async checkServerMode(): Promise { + if (!this.isLanguageServerActivated()) { + await this.initializeJavaLanguageServerApi(); + } + } } export const languageServerApiManager: LanguageServerApiManager = new LanguageServerApiManager(); diff --git a/src/utility.ts b/src/utility.ts index b0e368ff..ee647dca 100644 --- a/src/utility.ts +++ b/src/utility.ts @@ -31,13 +31,8 @@ export class Utility { return false; } - await languageServerApiManager.awaitSwitchingServerFinished(); - if (!await languageServerApiManager.isStandardServerReady()) { - return false; - } - return true; + return languageServerApiManager.ready(); } - } export class EventCounter { diff --git a/src/views/dependencyDataProvider.ts b/src/views/dependencyDataProvider.ts index d0891f0f..7901497c 100644 --- a/src/views/dependencyDataProvider.ts +++ b/src/views/dependencyDataProvider.ts @@ -97,12 +97,10 @@ export class DependencyDataProvider implements TreeDataProvider { } public async getChildren(element?: ExplorerNode): Promise { - if (await languageServerApiManager.isLightWeightMode()) { + if (!await languageServerApiManager.ready()) { return []; } - await languageServerApiManager.awaitSwitchingServerFinished(); - const children = (!this._rootItems || !element) ? await this.getRootNodes() : await element.getChildren(); @@ -172,7 +170,7 @@ export class DependencyDataProvider implements TreeDataProvider { this._rootItems = rootItems; } } - contextManager.setContextValue(Context.NO_JAVA_PEOJECT, _.isEmpty(rootItems)); + contextManager.setContextValue(Context.NO_JAVA_PROJECT, _.isEmpty(rootItems)); return rootItems; } finally { explorerLock.release(); diff --git a/src/views/dependencyExplorer.ts b/src/views/dependencyExplorer.ts index f9c1f155..d5f99d12 100644 --- a/src/views/dependencyExplorer.ts +++ b/src/views/dependencyExplorer.ts @@ -10,7 +10,6 @@ import { } from "vscode"; import { instrumentOperationAsVsCodeCommand, sendInfo } from "vscode-extension-telemetry-wrapper"; import { Commands } from "../commands"; -import { Build } from "../constants"; import { deleteFiles } from "../explorerCommands/delete"; import { newJavaClass, newPackage } from "../explorerCommands/new"; import { renameFile } from "../explorerCommands/rename"; @@ -68,10 +67,9 @@ export class DependencyExplorer implements Disposable { await commands.executeCommand(Commands.JAVA_PROJECT_EXPLORER_FOCUS); let fsPath: string = uri.fsPath; const fileName: string = path.basename(fsPath); - if (Build.FILE_NAMES.includes(fileName)) { + if (/(.*\.gradle)|(.*\.gradle\.kts)|(pom\.xml)$/.test(fileName)) { fsPath = path.dirname(fsPath); } - uri = Uri.file(fsPath); if ((await fse.stat(fsPath)).isFile()) { await commands.executeCommand(Commands.VSCODE_OPEN, uri, { preserveFocus: true }); From fce6ebeb124ddee0bdf2d2eb168c31030de8a5ce Mon Sep 17 00:00:00 2001 From: Shi Chen Date: Wed, 22 Sep 2021 17:13:14 +0800 Subject: [PATCH 058/352] chore: Fix webpack related vulnerabilities (#550) --- .vscode/tasks.json | 4 +- package-lock.json | 3394 +++++++++++++------------------------------- package.json | 10 +- 3 files changed, 985 insertions(+), 2423 deletions(-) diff --git a/.vscode/tasks.json b/.vscode/tasks.json index cff0e786..9dd9b04e 100644 --- a/.vscode/tasks.json +++ b/.vscode/tasks.json @@ -18,8 +18,8 @@ ], "background": { "activeOnStart": true, - "beginsPattern": "Compilation \\w+ starting", - "endsPattern": "Compilation\\s+finished" + "beginsPattern": "\\w+", + "endsPattern": "webpack .* compiled" } }, "isBackground": true, diff --git a/package-lock.json b/package-lock.json index cbcb8366..ffdb93dd 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5,27 +5,27 @@ "requires": true, "dependencies": { "@babel/code-frame": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", - "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.14.5.tgz", + "integrity": "sha512-9pzDqyc6OLDaqe+zbACgFkb6fKMNG6CObKpnYXChRsvYGyEdc7CA2BaqeOM+vOtCS5ndmJicPJhKAwYRI6UfFw==", "dev": true, "requires": { - "@babel/highlight": "^7.10.4" + "@babel/highlight": "^7.14.5" } }, "@babel/helper-validator-identifier": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", - "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==", + "version": "7.15.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.15.7.tgz", + "integrity": "sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w==", "dev": true }, "@babel/highlight": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", - "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.5.tgz", + "integrity": "sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg==", "dev": true, "requires": { - "@babel/helper-validator-identifier": "^7.10.4", + "@babel/helper-validator-identifier": "^7.14.5", "chalk": "^2.0.0", "js-tokens": "^4.0.0" }, @@ -88,29 +88,51 @@ } } }, + "@discoveryjs/json-ext": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.5.tgz", + "integrity": "sha512-6nFkfkmSeV/rqSaS4oWHgmpnYw194f6hmWF5is6b0J1naJZoiD0NTc9AiUwPHvWsowkjuHErCZT1wa0jg+BLIA==", + "dev": true + }, + "@gar/promisify": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.2.tgz", + "integrity": "sha512-82cpyJyKRoQoRi+14ibCeGPu0CwypgtBAdBhq1WfvagpCZNKqwXbKwXllYSMG91DhmG4jt9gN8eP6lGOtozuaw==", + "dev": true + }, "@nodelib/fs.scandir": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.3.tgz", - "integrity": "sha512-eGmwYQn3gxo4r7jdQnkrrN6bY478C3P+a/y72IJukF8LjB6ZHeB3c+Ehacj3sYeSmUXGlnA67/PmbM9CVwL7Dw==", + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", "requires": { - "@nodelib/fs.stat": "2.0.3", + "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" } }, "@nodelib/fs.stat": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.3.tgz", - "integrity": "sha512-bQBFruR2TAwoevBEd/NWMoAAtNGzTRgdrqnYCc7dhzfoNvqPzLyqlEQnzZ3kVnNrSp25iyxE00/3h2fqGAGArA==" + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==" }, "@nodelib/fs.walk": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.4.tgz", - "integrity": "sha512-1V9XOY4rDW0rehzbrcqAmHnz8e7SKvX27gh8Gt2WgB0+pdzdiLV83p72kZPU+jvMbS1qU5mauP2iOvO8rhmurQ==", + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", "requires": { - "@nodelib/fs.scandir": "2.1.3", + "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" } }, + "@npmcli/fs": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-1.0.0.tgz", + "integrity": "sha512-8ltnOpRR/oJbOp8vaGUnipOi3bqkcW+sLHFlyXIr08OGHmVJLB1Hn7QtGXbYcpVtH1gAYZTlmDXtE4YV0+AMMQ==", + "dev": true, + "requires": { + "@gar/promisify": "^1.0.1", + "semver": "^7.3.5" + } + }, "@npmcli/move-file": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-1.1.2.tgz", @@ -194,6 +216,32 @@ "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", "dev": true }, + "@types/eslint": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-7.28.0.tgz", + "integrity": "sha512-07XlgzX0YJUn4iG1ocY4IX9DzKSmMGUs6ESKlxWhZRaa0fatIWaHWUVapcuGa8r5HFnTqzj+4OCjd5f7EZ/i/A==", + "dev": true, + "requires": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "@types/eslint-scope": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.1.tgz", + "integrity": "sha512-SCFeogqiptms4Fg29WpOTk5nHIzfpKCemSN63ksBQYKTcXoJEmJagV+DhVmbapZzY4/5YaOV1nZwrsU79fFm1g==", + "dev": true, + "requires": { + "@types/eslint": "*", + "@types/estree": "*" + } + }, + "@types/estree": { + "version": "0.0.50", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.50.tgz", + "integrity": "sha512-C6N5s2ZFtuZRj54k2/zyRhNDjJwwcViAM3Nbm8zjBpbqAdZ00mr0CFxvSKeO8Y/e03WVFLpQMdHYVfUd6SB+Hw==", + "dev": true + }, "@types/fancy-log": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/@types/fancy-log/-/fancy-log-1.3.0.tgz", @@ -210,9 +258,9 @@ } }, "@types/glob": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.3.tgz", - "integrity": "sha512-SEYeGAIQIQX8NN6LDKprLjbrd5dARM5EXsd8GI/A5l0apYI1fGMWgPHSe4ZKL4eozlAyI+doUE9XbYS4xCkQ1w==", + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.4.tgz", + "integrity": "sha512-w+LsMxKyYQm347Otw+IfBXOv9UWVjpHpCDdbBMt8Kz/xbvCYNjP+0qPh91Km3iKfSRLBB0P7fAMf0KHrPu+MyA==", "dev": true, "requires": { "@types/minimatch": "*", @@ -220,27 +268,27 @@ } }, "@types/json-schema": { - "version": "7.0.7", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.7.tgz", - "integrity": "sha512-cxWFQVseBm6O9Gbw1IWb8r6OS4OhSt3hPZLkFApLjM8TEXROBuQGLAH2i2gZpcXdLBIrpXuTDhH7Vbm1iXmNGA==", + "version": "7.0.9", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz", + "integrity": "sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==", "dev": true }, "@types/lodash": { - "version": "4.14.168", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.168.tgz", - "integrity": "sha512-oVfRvqHV/V6D1yifJbVRU3TMp8OT6o6BG+U9MkwuJ3U8/CsDHvalRpsxBqivn71ztOFZBTfJMvETbqHiaNSj7Q==", + "version": "4.14.173", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.173.tgz", + "integrity": "sha512-vv0CAYoaEjCw/mLy96GBTnRoZrSxkGE0BKzKimdR8P3OzrNYNvBgtW7p055A+E8C31vXNUhWKoFCbhq7gbyhFg==", "dev": true }, "@types/minimatch": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz", - "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==", + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.5.tgz", + "integrity": "sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==", "dev": true }, "@types/mocha": { - "version": "8.2.1", - "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-8.2.1.tgz", - "integrity": "sha512-NysN+bNqj6E0Hv4CTGWSlPzMW6vTKjDpOteycDkV4IWBsO+PU48JonrPzV9ODjiI2XrjmA05KInLgF5ivZ/YGQ==", + "version": "8.2.3", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-8.2.3.tgz", + "integrity": "sha512-ekGvFhFgrc2zYQoX4JeZPmVzZxw6Dtllga7iGHzfbYIYkAMUx/sAFP2GdFpLff+vdHXu5fl7WX9AT+TtqYcsyw==", "dev": true }, "@types/node": { @@ -274,180 +322,172 @@ "dev": true }, "@webassemblyjs/ast": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.9.0.tgz", - "integrity": "sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz", + "integrity": "sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==", "dev": true, "requires": { - "@webassemblyjs/helper-module-context": "1.9.0", - "@webassemblyjs/helper-wasm-bytecode": "1.9.0", - "@webassemblyjs/wast-parser": "1.9.0" + "@webassemblyjs/helper-numbers": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1" } }, "@webassemblyjs/floating-point-hex-parser": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.9.0.tgz", - "integrity": "sha512-TG5qcFsS8QB4g4MhrxK5TqfdNe7Ey/7YL/xN+36rRjl/BlGE/NcBvJcqsRgCP6Z92mRE+7N50pRIi8SmKUbcQA==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz", + "integrity": "sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ==", "dev": true }, "@webassemblyjs/helper-api-error": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.9.0.tgz", - "integrity": "sha512-NcMLjoFMXpsASZFxJ5h2HZRcEhDkvnNFOAKneP5RbKRzaWJN36NC4jqQHKwStIhGXu5mUWlUUk7ygdtrO8lbmw==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz", + "integrity": "sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg==", "dev": true }, "@webassemblyjs/helper-buffer": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.9.0.tgz", - "integrity": "sha512-qZol43oqhq6yBPx7YM3m9Bv7WMV9Eevj6kMi6InKOuZxhw+q9hOkvq5e/PpKSiLfyetpaBnogSbNCfBwyB00CA==", - "dev": true - }, - "@webassemblyjs/helper-code-frame": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.9.0.tgz", - "integrity": "sha512-ERCYdJBkD9Vu4vtjUYe8LZruWuNIToYq/ME22igL+2vj2dQ2OOujIZr3MEFvfEaqKoVqpsFKAGsRdBSBjrIvZA==", - "dev": true, - "requires": { - "@webassemblyjs/wast-printer": "1.9.0" - } - }, - "@webassemblyjs/helper-fsm": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.9.0.tgz", - "integrity": "sha512-OPRowhGbshCb5PxJ8LocpdX9Kl0uB4XsAjl6jH/dWKlk/mzsANvhwbiULsaiqT5GZGT9qinTICdj6PLuM5gslw==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz", + "integrity": "sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA==", "dev": true }, - "@webassemblyjs/helper-module-context": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.9.0.tgz", - "integrity": "sha512-MJCW8iGC08tMk2enck1aPW+BE5Cw8/7ph/VGZxwyvGbJwjktKkDK7vy7gAmMDx88D7mhDTCNKAW5tED+gZ0W8g==", + "@webassemblyjs/helper-numbers": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz", + "integrity": "sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.9.0" + "@webassemblyjs/floating-point-hex-parser": "1.11.1", + "@webassemblyjs/helper-api-error": "1.11.1", + "@xtuc/long": "4.2.2" } }, "@webassemblyjs/helper-wasm-bytecode": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.9.0.tgz", - "integrity": "sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz", + "integrity": "sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q==", "dev": true }, "@webassemblyjs/helper-wasm-section": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.9.0.tgz", - "integrity": "sha512-XnMB8l3ek4tvrKUUku+IVaXNHz2YsJyOOmz+MMkZvh8h1uSJpSen6vYnw3IoQ7WwEuAhL8Efjms1ZWjqh2agvw==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz", + "integrity": "sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/helper-buffer": "1.9.0", - "@webassemblyjs/helper-wasm-bytecode": "1.9.0", - "@webassemblyjs/wasm-gen": "1.9.0" + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-buffer": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/wasm-gen": "1.11.1" } }, "@webassemblyjs/ieee754": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.9.0.tgz", - "integrity": "sha512-dcX8JuYU/gvymzIHc9DgxTzUUTLexWwt8uCTWP3otys596io0L5aW02Gb1RjYpx2+0Jus1h4ZFqjla7umFniTg==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz", + "integrity": "sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ==", "dev": true, "requires": { "@xtuc/ieee754": "^1.2.0" } }, "@webassemblyjs/leb128": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.9.0.tgz", - "integrity": "sha512-ENVzM5VwV1ojs9jam6vPys97B/S65YQtv/aanqnU7D8aSoHFX8GyhGg0CMfyKNIHBuAVjy3tlzd5QMMINa7wpw==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.1.tgz", + "integrity": "sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw==", "dev": true, "requires": { "@xtuc/long": "4.2.2" } }, "@webassemblyjs/utf8": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.9.0.tgz", - "integrity": "sha512-GZbQlWtopBTP0u7cHrEx+73yZKrQoBMpwkGEIqlacljhXCkVM1kMQge/Mf+csMJAjEdSwhOyLAS0AoR3AG5P8w==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.1.tgz", + "integrity": "sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ==", "dev": true }, "@webassemblyjs/wasm-edit": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.9.0.tgz", - "integrity": "sha512-FgHzBm80uwz5M8WKnMTn6j/sVbqilPdQXTWraSjBwFXSYGirpkSWE2R9Qvz9tNiTKQvoKILpCuTjBKzOIm0nxw==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz", + "integrity": "sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/helper-buffer": "1.9.0", - "@webassemblyjs/helper-wasm-bytecode": "1.9.0", - "@webassemblyjs/helper-wasm-section": "1.9.0", - "@webassemblyjs/wasm-gen": "1.9.0", - "@webassemblyjs/wasm-opt": "1.9.0", - "@webassemblyjs/wasm-parser": "1.9.0", - "@webassemblyjs/wast-printer": "1.9.0" + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-buffer": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/helper-wasm-section": "1.11.1", + "@webassemblyjs/wasm-gen": "1.11.1", + "@webassemblyjs/wasm-opt": "1.11.1", + "@webassemblyjs/wasm-parser": "1.11.1", + "@webassemblyjs/wast-printer": "1.11.1" } }, "@webassemblyjs/wasm-gen": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.9.0.tgz", - "integrity": "sha512-cPE3o44YzOOHvlsb4+E9qSqjc9Qf9Na1OO/BHFy4OI91XDE14MjFN4lTMezzaIWdPqHnsTodGGNP+iRSYfGkjA==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz", + "integrity": "sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/helper-wasm-bytecode": "1.9.0", - "@webassemblyjs/ieee754": "1.9.0", - "@webassemblyjs/leb128": "1.9.0", - "@webassemblyjs/utf8": "1.9.0" + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/ieee754": "1.11.1", + "@webassemblyjs/leb128": "1.11.1", + "@webassemblyjs/utf8": "1.11.1" } }, "@webassemblyjs/wasm-opt": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.9.0.tgz", - "integrity": "sha512-Qkjgm6Anhm+OMbIL0iokO7meajkzQD71ioelnfPEj6r4eOFuqm4YC3VBPqXjFyyNwowzbMD+hizmprP/Fwkl2A==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz", + "integrity": "sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/helper-buffer": "1.9.0", - "@webassemblyjs/wasm-gen": "1.9.0", - "@webassemblyjs/wasm-parser": "1.9.0" + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-buffer": "1.11.1", + "@webassemblyjs/wasm-gen": "1.11.1", + "@webassemblyjs/wasm-parser": "1.11.1" } }, "@webassemblyjs/wasm-parser": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.9.0.tgz", - "integrity": "sha512-9+wkMowR2AmdSWQzsPEjFU7njh8HTO5MqO8vjwEHuM+AMHioNqSBONRdr0NQQ3dVQrzp0s8lTcYqzUdb7YgELA==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz", + "integrity": "sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/helper-api-error": "1.9.0", - "@webassemblyjs/helper-wasm-bytecode": "1.9.0", - "@webassemblyjs/ieee754": "1.9.0", - "@webassemblyjs/leb128": "1.9.0", - "@webassemblyjs/utf8": "1.9.0" + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-api-error": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/ieee754": "1.11.1", + "@webassemblyjs/leb128": "1.11.1", + "@webassemblyjs/utf8": "1.11.1" } }, - "@webassemblyjs/wast-parser": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.9.0.tgz", - "integrity": "sha512-qsqSAP3QQ3LyZjNC/0jBJ/ToSxfYJ8kYyuiGvtn/8MK89VrNEfwj7BPQzJVHi0jGTRK2dGdJ5PRqhtjzoww+bw==", + "@webassemblyjs/wast-printer": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz", + "integrity": "sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/floating-point-hex-parser": "1.9.0", - "@webassemblyjs/helper-api-error": "1.9.0", - "@webassemblyjs/helper-code-frame": "1.9.0", - "@webassemblyjs/helper-fsm": "1.9.0", + "@webassemblyjs/ast": "1.11.1", "@xtuc/long": "4.2.2" } }, - "@webassemblyjs/wast-printer": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.9.0.tgz", - "integrity": "sha512-2J0nE95rHXHyQ24cWjMKJ1tqB/ds8z/cyeOZxJhcb+rW+SQASVjuznUSmdz5GpVJTzU8JkhYut0D3siFDD6wsA==", + "@webpack-cli/configtest": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-1.0.4.tgz", + "integrity": "sha512-cs3XLy+UcxiP6bj0A6u7MLLuwdXJ1c3Dtc0RkKg+wiI1g/Ti1om8+/2hc2A2B60NbBNAbMgyBMHvyymWm/j4wQ==", + "dev": true + }, + "@webpack-cli/info": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-1.3.0.tgz", + "integrity": "sha512-ASiVB3t9LOKHs5DyVUcxpraBXDOKubYu/ihHhU+t1UPpxsivg6Od2E2qU4gJCekfEddzRBzHhzA/Acyw/mlK/w==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/wast-parser": "1.9.0", - "@xtuc/long": "4.2.2" + "envinfo": "^7.7.3" } }, + "@webpack-cli/serve": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-1.5.2.tgz", + "integrity": "sha512-vgJ5OLWadI8aKjDlOH3rb+dYyPd2GTZuQC/Tihjct6F9GpXGZINo3Y/IVuZVTM1eDQB+/AOsjPUWH/WySDaXvw==", + "dev": true + }, "@xtuc/ieee754": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", @@ -461,9 +501,15 @@ "dev": true }, "acorn": { - "version": "6.4.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.2.tgz", - "integrity": "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==", + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.5.0.tgz", + "integrity": "sha512-yXbYeFy+jUuYd3/CDcg2NkIYE991XYX/bje7LmjJigUciaeO1JR4XxXgCIV1/Zc/dRuFEyw1L0pbA+qynJkW5Q==", + "dev": true + }, + "acorn-import-assertions": { + "version": "1.7.6", + "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.7.6.tgz", + "integrity": "sha512-FlVvVFA1TX6l3lp8VjDnYYq7R1nyW6x3svAt4nDgrWQ9SBaSh9CnbwgSUTasgfNfOG5HlM1ehugCvM+hjo56LA==", "dev": true }, "agent-base": { @@ -473,6 +519,23 @@ "dev": true, "requires": { "debug": "4" + }, + "dependencies": { + "debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } } }, "aggregate-error": { @@ -497,12 +560,6 @@ "uri-js": "^4.2.2" } }, - "ajv-errors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.1.tgz", - "integrity": "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==", - "dev": true - }, "ajv-keywords": { "version": "3.5.2", "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", @@ -745,13 +802,10 @@ } }, "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "requires": { - "sprintf-js": "~1.0.2" - } + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true }, "arr-diff": { "version": "4.0.0", @@ -875,53 +929,6 @@ "safer-buffer": "~2.1.0" } }, - "asn1.js": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz", - "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==", - "dev": true, - "requires": { - "bn.js": "^4.0.0", - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0", - "safer-buffer": "^2.1.0" - }, - "dependencies": { - "bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true - } - } - }, - "assert": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz", - "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==", - "dev": true, - "requires": { - "object-assign": "^4.1.1", - "util": "0.10.3" - }, - "dependencies": { - "inherits": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", - "dev": true - }, - "util": { - "version": "0.10.3", - "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", - "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", - "dev": true, - "requires": { - "inherits": "2.0.1" - } - } - } - }, "assert-plus": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", @@ -1026,13 +1033,6 @@ "integrity": "sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==", "requires": { "follow-redirects": "^1.14.0" - }, - "dependencies": { - "follow-redirects": { - "version": "1.14.3", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.3.tgz", - "integrity": "sha512-3MkHxknWMUtb23apkgz/83fDoe+y+qr0TdgacGIA7bew+QLBo3vdgEN2xEsuXNivpFy4CyDhBBZnNZOtalmenw==" - } } }, "azure-devops-node-api": { @@ -1063,9 +1063,9 @@ } }, "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" }, "base": { "version": "0.11.2", @@ -1138,9 +1138,9 @@ } }, "big-integer": { - "version": "1.6.48", - "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.48.tgz", - "integrity": "sha512-j51egjPa7/i+RdiRuJbPdJ2FIUYYPhvYLjzoYbcMMm62ooO6F94fETG4MTs46zPAF9Brs04OajboA/qTGuz78w==", + "version": "1.6.49", + "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.49.tgz", + "integrity": "sha512-KJ7VhqH+f/BOt9a3yMwJNmcZjG53ijWMTjSAGMveQWyLwqIiwkjNP5PFgDob3Snnx86SjDj6I89fIbv0dkQeNw==", "dev": true }, "big.js": { @@ -1190,12 +1190,6 @@ "integrity": "sha1-9y12C+Cbf3bQjtj66Ysomo0F+rM=", "dev": true }, - "bn.js": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.0.tgz", - "integrity": "sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw==", - "dev": true - }, "boolbase": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", @@ -1219,113 +1213,33 @@ "fill-range": "^7.0.1" } }, - "brorand": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", - "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", - "dev": true - }, "browser-stdout": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", "dev": true }, - "browserify-aes": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", - "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", - "dev": true, - "requires": { - "buffer-xor": "^1.0.3", - "cipher-base": "^1.0.0", - "create-hash": "^1.1.0", - "evp_bytestokey": "^1.0.3", - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "browserify-cipher": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", - "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", - "dev": true, - "requires": { - "browserify-aes": "^1.0.4", - "browserify-des": "^1.0.0", - "evp_bytestokey": "^1.0.0" - } - }, - "browserify-des": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", - "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", - "dev": true, - "requires": { - "cipher-base": "^1.0.1", - "des.js": "^1.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "browserify-rsa": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.1.0.tgz", - "integrity": "sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==", - "dev": true, - "requires": { - "bn.js": "^5.0.0", - "randombytes": "^2.0.1" - } - }, - "browserify-sign": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.1.tgz", - "integrity": "sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==", - "dev": true, - "requires": { - "bn.js": "^5.1.1", - "browserify-rsa": "^4.0.1", - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "elliptic": "^6.5.3", - "inherits": "^2.0.4", - "parse-asn1": "^5.1.5", - "readable-stream": "^3.6.0", - "safe-buffer": "^5.2.0" - }, - "dependencies": { - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - } - } - }, - "browserify-zlib": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", - "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", + "browserslist": { + "version": "4.17.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.17.1.tgz", + "integrity": "sha512-aLD0ZMDSnF4lUt4ZDNgqi5BUn9BZ7YdQdI/cYlILrhdSSZJLU9aNZoD5/NBmM4SK34APB2e83MOsRt1EnkuyaQ==", "dev": true, "requires": { - "pako": "~1.0.5" + "caniuse-lite": "^1.0.30001259", + "electron-to-chromium": "^1.3.846", + "escalade": "^3.1.1", + "nanocolors": "^0.1.5", + "node-releases": "^1.1.76" } }, "buffer": { - "version": "4.9.2", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", - "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", "dev": true, "requires": { - "base64-js": "^1.0.2", - "ieee754": "^1.1.4", - "isarray": "^1.0.0" + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" } }, "buffer-alloc": { @@ -1363,9 +1277,9 @@ "dev": true }, "buffer-from": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", - "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", "dev": true }, "buffer-indexof-polyfill": { @@ -1380,12 +1294,6 @@ "integrity": "sha1-mXjOMXOIxkmth5MCjDR37wRKi1E=", "dev": true }, - "buffer-xor": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", - "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", - "dev": true - }, "buffers": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/buffers/-/buffers-0.1.1.tgz", @@ -1398,18 +1306,13 @@ "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", "dev": true }, - "builtin-status-codes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", - "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=", - "dev": true - }, "cacache": { - "version": "15.0.5", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.0.5.tgz", - "integrity": "sha512-lloiL22n7sOjEEXdL8NAjTgv9a1u43xICE9/203qonkZUCj5X1UEWIdf2/Y0d6QcCtMzbKQyhrcDbdvlZTs/+A==", + "version": "15.3.0", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.3.0.tgz", + "integrity": "sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ==", "dev": true, "requires": { + "@npmcli/fs": "^1.0.0", "@npmcli/move-file": "^1.0.1", "chownr": "^2.0.0", "fs-minipass": "^2.0.0", @@ -1424,7 +1327,7 @@ "p-map": "^4.0.0", "promise-inflight": "^1.0.1", "rimraf": "^3.0.2", - "ssri": "^8.0.0", + "ssri": "^8.0.1", "tar": "^6.0.2", "unique-filename": "^1.1.1" } @@ -1447,13 +1350,13 @@ } }, "call-bind": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.0.tgz", - "integrity": "sha512-AEXsYIyyDY3MCzbwdhzG3Jx1R0J2wetQyUynn6dYHAO+bg8l1k7jwZtRv4ryryFs7EP+NDlikJlVe59jr0cM2w==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", "dev": true, "requires": { "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.0" + "get-intrinsic": "^1.0.2" } }, "camelcase": { @@ -1462,6 +1365,12 @@ "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=", "dev": true }, + "caniuse-lite": { + "version": "1.0.30001259", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001259.tgz", + "integrity": "sha512-V7mQTFhjITxuk9zBpI6nYsiTXhcPe05l+364nZjK7MFK/E7ibvYBSAXr4YcA6oPR8j3ZLM/LN+lUqUVAQEUZFg==", + "dev": true + }, "caseless": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", @@ -1478,9 +1387,9 @@ } }, "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "requires": { "ansi-styles": "^4.1.0", @@ -1514,9 +1423,9 @@ }, "dependencies": { "tslib": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.0.tgz", - "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", + "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==", "dev": true } } @@ -1651,23 +1560,10 @@ "dev": true }, "chrome-trace-event": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz", - "integrity": "sha512-9e/zx1jw7B4CO+c/RXoCsfg/x1AfUBioy4owYH0bJprEYAx5hRFLRhWBqHAG57D0ZM4H7vxbP7bPe0VwhQRYDQ==", - "dev": true, - "requires": { - "tslib": "^1.9.0" - } - }, - "cipher-base": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", - "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", + "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", + "dev": true }, "class-utils": { "version": "0.3.6", @@ -1707,17 +1603,6 @@ "arch": "^2.1.1", "execa": "^1.0.0", "is-wsl": "^2.1.1" - }, - "dependencies": { - "is-wsl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", - "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", - "dev": true, - "requires": { - "is-docker": "^2.0.0" - } - } } }, "cliui": { @@ -1823,6 +1708,15 @@ "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", "dev": true }, + "debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, "fs-extra": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-5.0.0.tgz", @@ -1871,39 +1765,18 @@ "minimist": "^1.2.5" } }, - "process-nextick-args": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", - "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=", + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true }, - "readable-stream": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.1.5.tgz", - "integrity": "sha1-ZvqLcg4UOLNkaB8q0aY8YYRIydA=", - "dev": true, - "requires": { - "buffer-shims": "^1.0.0", - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "~1.0.0", - "process-nextick-args": "~1.0.6", - "string_decoder": "~0.10.x", - "util-deprecate": "~1.0.1" - } - }, "semver": { "version": "5.7.1", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", "dev": true }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", - "dev": true - }, "tar": { "version": "4.4.19", "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.19.tgz", @@ -1919,23 +1792,6 @@ "yallist": "^3.1.1" } }, - "unzipper": { - "version": "0.8.14", - "resolved": "https://registry.npmjs.org/unzipper/-/unzipper-0.8.14.tgz", - "integrity": "sha512-8rFtE7EP5ssOwGpN2dt1Q4njl0N1hUXJ7sSPz0leU2hRdq6+pra57z4YPBlVqm40vcgv6ooKZEAx48fMTv9x4w==", - "dev": true, - "requires": { - "big-integer": "^1.6.17", - "binary": "~0.3.0", - "bluebird": "~3.4.1", - "buffer-indexof-polyfill": "~1.0.0", - "duplexer2": "~0.1.4", - "fstream": "~1.0.10", - "listenercount": "~1.0.1", - "readable-stream": "~2.1.5", - "setimmediate": "~1.0.4" - } - }, "url-join": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/url-join/-/url-join-0.0.1.tgz", @@ -2013,6 +1869,12 @@ "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", "dev": true }, + "colorette": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.4.0.tgz", + "integrity": "sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g==", + "dev": true + }, "combined-stream": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", @@ -2063,24 +1925,12 @@ "typedarray": "^0.0.6" } }, - "console-browserify": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz", - "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==", - "dev": true - }, "console-control-strings": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", "dev": true }, - "constants-browserify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", - "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=", - "dev": true - }, "continuation-local-storage": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/continuation-local-storage/-/continuation-local-storage-3.2.1.tgz", @@ -2091,9 +1941,9 @@ } }, "convert-source-map": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", - "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", + "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==", "dev": true, "requires": { "safe-buffer": "~5.1.1" @@ -2107,40 +1957,6 @@ } } }, - "copy-concurrently": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", - "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==", - "dev": true, - "requires": { - "aproba": "^1.1.1", - "fs-write-stream-atomic": "^1.0.8", - "iferr": "^0.1.5", - "mkdirp": "^0.5.1", - "rimraf": "^2.5.4", - "run-queue": "^1.0.0" - }, - "dependencies": { - "mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "dev": true, - "requires": { - "minimist": "^1.2.5" - } - }, - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - } - } - }, "copy-descriptor": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", @@ -2148,14 +1964,22 @@ "dev": true }, "copy-props": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/copy-props/-/copy-props-2.0.4.tgz", - "integrity": "sha512-7cjuUME+p+S3HZlbllgsn2CDwS+5eCCX16qBgNC4jgSTf49qR1VKy/Zhl400m0IQXl/bPGEVqncgUUMjrr4s8A==", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/copy-props/-/copy-props-2.0.5.tgz", + "integrity": "sha512-XBlx8HSqrT0ObQwmSzM7WE5k8FxTV75h1DX1Z3n6NhQ/UYYAvInWYmG06vFt7hQZArE2fuO62aihiWIVQwh1sw==", "dev": true, "requires": { - "each-props": "^1.3.0", - "is-plain-object": "^2.0.1" - } + "each-props": "^1.3.2", + "is-plain-object": "^5.0.0" + }, + "dependencies": { + "is-plain-object": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", + "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", + "dev": true + } + } }, "copy-webpack-plugin": { "version": "6.4.1", @@ -2177,56 +2001,11 @@ } }, "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", "dev": true }, - "create-ecdh": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz", - "integrity": "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==", - "dev": true, - "requires": { - "bn.js": "^4.1.0", - "elliptic": "^6.5.3" - }, - "dependencies": { - "bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true - } - } - }, - "create-hash": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", - "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", - "dev": true, - "requires": { - "cipher-base": "^1.0.1", - "inherits": "^2.0.1", - "md5.js": "^1.3.4", - "ripemd160": "^2.0.1", - "sha.js": "^2.4.0" - } - }, - "create-hmac": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", - "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", - "dev": true, - "requires": { - "cipher-base": "^1.0.3", - "create-hash": "^1.1.0", - "inherits": "^2.0.1", - "ripemd160": "^2.0.0", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" - } - }, "cross-spawn": { "version": "6.0.5", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", @@ -2248,25 +2027,6 @@ } } }, - "crypto-browserify": { - "version": "3.12.0", - "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", - "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", - "dev": true, - "requires": { - "browserify-cipher": "^1.0.0", - "browserify-sign": "^4.0.0", - "create-ecdh": "^4.0.0", - "create-hash": "^1.1.0", - "create-hmac": "^1.1.0", - "diffie-hellman": "^5.0.0", - "inherits": "^2.0.1", - "pbkdf2": "^3.0.3", - "public-encrypt": "^4.0.0", - "randombytes": "^2.0.0", - "randomfill": "^1.0.3" - } - }, "css-select": { "version": "4.1.3", "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.1.3.tgz", @@ -2286,12 +2046,6 @@ "integrity": "sha512-FYDTSHb/7KXsWICVsxdmiExPjCfRC4qRFBdVwv7Ax9hMnvMmEjP9RfxTEZ3qPZGmADDn2vAKSo9UcN1jKVYscg==", "dev": true }, - "cyclist": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-1.0.1.tgz", - "integrity": "sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=", - "dev": true - }, "d": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", @@ -2312,20 +2066,12 @@ } }, "debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, "requires": { - "ms": "2.1.2" - }, - "dependencies": { - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - } + "ms": "2.0.0" } }, "decamelize": { @@ -2446,16 +2192,6 @@ "integrity": "sha1-OjYof1A05pnnV3kBBSwubJQlFjE=", "dev": true }, - "des.js": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz", - "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0" - } - }, "detect-file": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", @@ -2489,30 +2225,11 @@ "integrity": "sha512-AOIjw4T7Nxl0G2BoBPhkQ6i7T4bUd9+xvdYizwvG7vVAM1dvr+SDrcUudlmzwH0kbEwdR2V1EcnKT0wAeYLQNQ==" }, "diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", + "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", "dev": true }, - "diffie-hellman": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", - "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", - "dev": true, - "requires": { - "bn.js": "^4.1.0", - "miller-rabin": "^4.0.0", - "randombytes": "^2.0.0" - }, - "dependencies": { - "bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true - } - } - }, "dir-glob": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", @@ -2532,12 +2249,6 @@ "entities": "^2.0.0" } }, - "domain-browser": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", - "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", - "dev": true - }, "domelementtype": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz", @@ -2545,18 +2256,18 @@ "dev": true }, "domhandler": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.2.0.tgz", - "integrity": "sha512-zk7sgt970kzPks2Bf+dwT/PLzghLnsivb9CcxkvR8Mzr66Olr0Ofd8neSbglHJHaHa2MadfoSdNlKYAaafmWfA==", + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.2.2.tgz", + "integrity": "sha512-PzE9aBMsdZO8TK4BnuJwH0QT41wgMbRzuZrHUcpYncEjmQazq8QEaBWgLG7ZyC/DAZKEgglpIA6j4Qn/HmxS3w==", "dev": true, "requires": { "domelementtype": "^2.2.0" } }, "domutils": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.7.0.tgz", - "integrity": "sha512-8eaHa17IwJUPAiB+SoTYBo5mCdeMgdcAoXJ59m6DT1vw+5iLS3gNoqYaRowaBKtGVrOF1Jz4yDTgYKLK2kvfJg==", + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", "dev": true, "requires": { "dom-serializer": "^1.0.1", @@ -2605,28 +2316,11 @@ "safer-buffer": "^2.1.0" } }, - "elliptic": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", - "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", - "dev": true, - "requires": { - "bn.js": "^4.11.9", - "brorand": "^1.1.0", - "hash.js": "^1.0.0", - "hmac-drbg": "^1.0.1", - "inherits": "^2.0.4", - "minimalistic-assert": "^1.0.1", - "minimalistic-crypto-utils": "^1.0.1" - }, - "dependencies": { - "bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true - } - } + "electron-to-chromium": { + "version": "1.3.846", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.846.tgz", + "integrity": "sha512-2jtSwgyiRzybHRxrc2nKI+39wH3AwQgn+sogQ+q814gv8hIFwrcZbV07Ea9f8AmK0ufPVZUvvAG1uZJ+obV4Jw==", + "dev": true }, "emitter-listener": { "version": "1.1.2", @@ -2637,9 +2331,9 @@ } }, "emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "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 }, "emojis-list": { @@ -2658,14 +2352,13 @@ } }, "enhanced-resolve": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.3.0.tgz", - "integrity": "sha512-3e87LvavsdxyoCfGusJnrZ5G8SLPOFeHSNpZI/ATL9a5leXo2k0w6MKnbqhdBad9qTobSfB20Ld7UmgoNbAZkQ==", + "version": "5.8.3", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.8.3.tgz", + "integrity": "sha512-EGAbGvH7j7Xt2nc0E7D99La1OiEs8LnyimkRgwExpUMScN6O+3x9tIWs7PLQZVNx4YD+00skHXPXi1yQHpAmZA==", "dev": true, "requires": { - "graceful-fs": "^4.1.2", - "memory-fs": "^0.5.0", - "tapable": "^1.0.0" + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" } }, "entities": { @@ -2674,14 +2367,11 @@ "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", "dev": true }, - "errno": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz", - "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==", - "dev": true, - "requires": { - "prr": "~1.0.1" - } + "envinfo": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.8.1.tgz", + "integrity": "sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw==", + "dev": true }, "error-ex": { "version": "1.3.2", @@ -2692,6 +2382,12 @@ "is-arrayish": "^0.2.1" } }, + "es-module-lexer": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.7.1.tgz", + "integrity": "sha512-MgtWFl5No+4S3TmhDmCz2ObFGm6lEpTnzbQi+Dd+pw4mlTIZTmM2iAs5gRlmx5zS9luzobCSBSI90JM/1/JgOw==", + "dev": true + }, "es5-ext": { "version": "0.10.53", "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.53.tgz", @@ -2749,12 +2445,12 @@ "dev": true }, "eslint-scope": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", - "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", "dev": true, "requires": { - "esrecurse": "^4.1.0", + "esrecurse": "^4.3.0", "estraverse": "^4.1.1" } }, @@ -2793,16 +2489,6 @@ "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", "dev": true }, - "evp_bytestokey": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", - "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", - "dev": true, - "requires": { - "md5.js": "^1.3.4", - "safe-buffer": "^5.1.1" - } - }, "execa": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", @@ -2833,15 +2519,6 @@ "to-regex": "^3.0.1" }, "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, "define-property": { "version": "0.2.5", "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", @@ -2878,18 +2555,18 @@ } }, "ext": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/ext/-/ext-1.4.0.tgz", - "integrity": "sha512-Key5NIsUxdqKg3vIsdw9dSuXpPCQ297y6wBjL30edxwPgt2E44WcWBZey/ZvUc6sERLTxKdyCu4gZFmUbk1Q7A==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/ext/-/ext-1.5.0.tgz", + "integrity": "sha512-+ONcYoWj/SoQwUofMr94aGu05Ou4FepKi7N7b+O8T4jVfyIsZQV1/xeS8jpaBzF0csAk0KLXoHCxU7cKYZjo1Q==", "dev": true, "requires": { - "type": "^2.0.0" + "type": "^2.5.0" }, "dependencies": { "type": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/type/-/type-2.1.0.tgz", - "integrity": "sha512-G9absDWvhAWCV2gmF1zKud3OyC61nZDwWvBL2DApaVFogI07CprggiQAOOjvp2NRjYWFzPyu7vwtDrQFq8jeSA==", + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/type/-/type-2.5.0.tgz", + "integrity": "sha512-180WMDQaIMm3+7hGXWf12GtdniDEy7nYcyFMKJn/eZz/6tSLXrUN9V0wKSbMjej0I1WHWbpREDEKHtqPQa9NNw==", "dev": true } } @@ -3011,16 +2688,15 @@ "dev": true }, "fast-glob": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.4.tgz", - "integrity": "sha512-kr/Oo6PX51265qeuCYsyGypiO5uJFgBS0jksyG7FUeCyQzNwYnzrNIMR1NXfkZXsMYXYLRAHgISHBz8gQcxKHQ==", + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.7.tgz", + "integrity": "sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q==", "requires": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.0", + "glob-parent": "^5.1.2", "merge2": "^1.3.0", - "micromatch": "^4.0.2", - "picomatch": "^2.2.1" + "micromatch": "^4.0.4" } }, "fast-json-stable-stringify": { @@ -3035,10 +2711,16 @@ "integrity": "sha1-5qdUzI8V5YmHqpy9J69m/W9OWvk=", "dev": true }, + "fastest-levenshtein": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.12.tgz", + "integrity": "sha512-On2N+BpYJ15xIC974QNVuYGMOlEVt4s0EOI3wwMqOmK1fdDY+FN/zltPV8vosq4ad4c/gJ1KHScUn/6AWIgiow==", + "dev": true + }, "fastq": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.9.0.tgz", - "integrity": "sha512-i7FVWL8HhVY+CTkwFxkN2mk3h+787ixS5S63eb78diVRc1MCssarHq3W5cj0av7YDSwmaV928RNag+U1etRQ7w==", + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", + "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", "requires": { "reusify": "^1.0.4" } @@ -3052,12 +2734,6 @@ "pend": "~1.2.0" } }, - "figgy-pudding": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.2.tgz", - "integrity": "sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw==", - "dev": true - }, "file-uri-to-path": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", @@ -3073,9 +2749,9 @@ } }, "find-cache-dir": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.1.tgz", - "integrity": "sha512-t2GDMt3oGC/v+BMwzmllWDuJF/xcDtE5j/fCGbqDD7OLuJkj0cfh1YSA5VKPvwMeLFLNDBkwOKZ2X85jGLVftQ==", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", + "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", "dev": true, "requires": { "commondir": "^1.0.1", @@ -3245,6 +2921,11 @@ "readable-stream": "^2.3.6" } }, + "follow-redirects": { + "version": "1.14.4", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.4.tgz", + "integrity": "sha512-zwGkiSXC1MUJG/qmeIFH2HBJx9u0V46QGUe3YR1fXG8bXQxq7fLj0RjLZQ5nubr9qNJUZrH+xUcwXEoXNpfS+g==" + }, "for-in": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", @@ -3286,16 +2967,6 @@ "map-cache": "^0.2.2" } }, - "from2": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", - "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "readable-stream": "^2.0.0" - } - }, "fs-constants": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", @@ -3331,18 +3002,6 @@ "through2": "^2.0.3" } }, - "fs-write-stream-atomic": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz", - "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "iferr": "^0.1.5", - "imurmurhash": "^0.1.4", - "readable-stream": "1 || 2" - } - }, "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", @@ -3418,9 +3077,9 @@ "dev": true }, "get-intrinsic": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.0.1.tgz", - "integrity": "sha512-ZnWP+AmS1VUaLgTRy47+zKtjTxz+0xMpx3I52i+aalBK1QP19ggLF3Db89KJX7kjfOfP2eoa01qc++GwPgufPg==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", + "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", "dev": true, "requires": { "function-bind": "^1.1.1", @@ -3471,9 +3130,9 @@ "dev": true }, "glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "version": "7.1.7", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", + "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", "dev": true, "requires": { "fs.realpath": "^1.0.0", @@ -3531,6 +3190,12 @@ } } }, + "glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", + "dev": true + }, "glob-watcher": { "version": "5.0.5", "resolved": "https://registry.npmjs.org/glob-watcher/-/glob-watcher-5.0.5.tgz", @@ -3593,9 +3258,9 @@ } }, "graceful-fs": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", - "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==" + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz", + "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==" }, "growl": { "version": "1.10.5", @@ -3723,9 +3388,9 @@ "dev": true }, "has-symbols": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", - "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", + "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==", "dev": true }, "has-unicode": { @@ -3786,57 +3451,12 @@ } } }, - "hash-base": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", - "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", - "dev": true, - "requires": { - "inherits": "^2.0.4", - "readable-stream": "^3.6.0", - "safe-buffer": "^5.2.0" - }, - "dependencies": { - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - } - } - }, - "hash.js": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", - "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "minimalistic-assert": "^1.0.1" - } - }, "he": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", "dev": true }, - "hmac-drbg": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", - "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", - "dev": true, - "requires": { - "hash.js": "^1.0.3", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.1" - } - }, "homedir-polyfill": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", @@ -3873,6 +3493,23 @@ "@tootallnate/once": "1", "agent-base": "6", "debug": "4" + }, + "dependencies": { + "debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } } }, "http-signature": { @@ -3886,12 +3523,6 @@ "sshpk": "^1.7.0" } }, - "https-browserify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", - "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=", - "dev": true - }, "https-proxy-agent": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", @@ -3900,20 +3531,37 @@ "requires": { "agent-base": "6", "debug": "4" + }, + "dependencies": { + "debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } } }, + "human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true + }, "ieee754": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", "dev": true }, - "iferr": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", - "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=", - "dev": true - }, "ignore": { "version": "5.1.8", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", @@ -3926,67 +3574,13 @@ "dev": true }, "import-local": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz", - "integrity": "sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.0.2.tgz", + "integrity": "sha512-vjL3+w0oulAVZ0hBHnxa/Nm5TAurf9YLQJDhqRZyqb+VKGOB6LU8t9H1Nr5CIo16vh9XfJTOoHwU0B71S557gA==", "dev": true, "requires": { - "pkg-dir": "^3.0.0", - "resolve-cwd": "^2.0.0" - }, - "dependencies": { - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, - "requires": { - "locate-path": "^3.0.0" - } - }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dev": true, - "requires": { - "p-limit": "^2.0.0" - } - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true - }, - "pkg-dir": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", - "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", - "dev": true, - "requires": { - "find-up": "^3.0.0" - } - } + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" } }, "imurmurhash": { @@ -4024,9 +3618,9 @@ "dev": true }, "ini": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.7.tgz", - "integrity": "sha512-iKpRpXP+CrP2jyrxvg1kMUpXDyRUFDWurxbnVT1vQPx+Wz9uCYsMIqYuSBLV+PAaZG/d7kRLKRFc9oDMsH+mFQ==", + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", "dev": true }, "interpret": { @@ -4093,9 +3687,9 @@ "dev": true }, "is-core-module": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.1.0.tgz", - "integrity": "sha512-YcV7BgVMRFRua2FqQzKtTDMz8iCuLEyGKjr70q8Zm1yy2qKcurbFEd79PAdHV77oL3NrAaOVQIbMmiHQCHB7ZA==", + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.6.0.tgz", + "integrity": "sha512-wShG8vs60jKfPWpF2KZRaAtvt3a20OAn7+IJ6hLPECpSABLcKtFKTTI4ZtH5QcBruBHlq+WsdHWyz0BCZW7svQ==", "dev": true, "requires": { "has": "^1.0.3" @@ -4255,10 +3849,13 @@ "dev": true }, "is-wsl": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", - "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", - "dev": true + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "dev": true, + "requires": { + "is-docker": "^2.0.0" + } }, "isarray": { "version": "1.0.0", @@ -4284,6 +3881,17 @@ "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", "dev": true }, + "jest-worker": { + "version": "27.2.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.2.0.tgz", + "integrity": "sha512-laB0ZVIBz+voh/QQy9dmUuuDsadixeerrKqyVpgPz+CCWiOYjOBabUXHIXZhsdvkWbLqSHbgkAHWl5cg24Q6RA==", + "dev": true, + "requires": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + } + }, "js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -4291,13 +3899,12 @@ "dev": true }, "js-yaml": { - "version": "3.14.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.0.tgz", - "integrity": "sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.0.0.tgz", + "integrity": "sha512-pqon0s+4ScYUvX30wxQi3PogGFAlUyH0awepWvwkj4jD4v+ova3RiYw8bmA6x2rDrEaj8i/oWKoRxpVNW+Re8Q==", "dev": true, "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" + "argparse": "^2.0.1" } }, "jsbn": { @@ -4378,9 +3985,9 @@ } }, "just-debounce": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/just-debounce/-/just-debounce-1.0.0.tgz", - "integrity": "sha1-h/zPrv/AtozRnVX2cilD+SnqNeo=", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/just-debounce/-/just-debounce-1.1.0.tgz", + "integrity": "sha512-qpcRocdkUmf+UTNBYx5w6dexX5J31AKK1OmPwH630a83DdVVUIngk55RSAiIGpQyoH0dlr872VHfPjnQnK1qDQ==", "dev": true }, "kind-of": { @@ -4486,9 +4093,9 @@ } }, "loader-runner": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz", - "integrity": "sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.2.0.tgz", + "integrity": "sha512-92+huvxMvYlMzMt0iIOukcwYBFpkYJdpl2xsZ7LrlayO7E8SOv+JJUEK17B/dJIHAOLMfh2dZZ/Y18WgmGtYNw==", "dev": true }, "loader-utils": { @@ -4612,6 +4219,15 @@ "uc.micro": "^1.0.5" }, "dependencies": { + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "requires": { + "sprintf-js": "~1.0.2" + } + }, "entities": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/entities/-/entities-2.0.3.tgz", @@ -4758,33 +4374,12 @@ } } }, - "md5.js": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", - "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", - "dev": true, - "requires": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, "mdurl": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", "integrity": "sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4=", "dev": true }, - "memory-fs": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.5.0.tgz", - "integrity": "sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==", - "dev": true, - "requires": { - "errno": "^0.1.3", - "readable-stream": "^2.0.1" - } - }, "memory-stream": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/memory-stream/-/memory-stream-0.0.3.tgz", @@ -4820,36 +4415,24 @@ } } }, + "merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, "merge2": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==" }, "micromatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", - "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", + "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", "requires": { "braces": "^3.0.1", - "picomatch": "^2.0.5" - } - }, - "miller-rabin": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", - "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", - "dev": true, - "requires": { - "bn.js": "^4.0.0", - "brorand": "^1.0.1" - }, - "dependencies": { - "bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true - } + "picomatch": "^2.2.3" } }, "mime": { @@ -4859,38 +4442,32 @@ "dev": true }, "mime-db": { - "version": "1.47.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.47.0.tgz", - "integrity": "sha512-QBmA/G2y+IfeS4oktet3qRZ+P5kPhCKRXxXnQEudYqUaEioAU1/Lq2us3D/t1Jfo4hE9REQPrbB7K5sOczJVIw==", + "version": "1.49.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.49.0.tgz", + "integrity": "sha512-CIc8j9URtOVApSFCQIF+VBkX1RwXp/oMMOrqdyXSBXq5RWNEsRfyj1kiRnQgmNXmHxPoFIxOroKA3zcU9P+nAA==", "dev": true }, "mime-types": { - "version": "2.1.30", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.30.tgz", - "integrity": "sha512-crmjA4bLtR8m9qLpHvgxSChT+XoSlZi8J4n/aIdn3z92e/U47Z0V/yl+Wh9W046GgFVAmoNR/fmdbZYcSSIUeg==", + "version": "2.1.32", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.32.tgz", + "integrity": "sha512-hJGaVS4G4c9TSMYh2n6SQAGrC4RnfU+daP8G7cSCmaqNjiOoUY0VHCMS42pxnQmVF1GWwFhbHWn3RIxCqTmZ9A==", "dev": true, "requires": { - "mime-db": "1.47.0" + "mime-db": "1.49.0" } }, + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true + }, "mimic-response": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-2.1.0.tgz", "integrity": "sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA==", "dev": true }, - "minimalistic-assert": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", - "dev": true - }, - "minimalistic-crypto-utils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", - "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=", - "dev": true - }, "minimatch": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", @@ -4906,9 +4483,9 @@ "dev": true }, "minipass": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.3.tgz", - "integrity": "sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg==", + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.5.tgz", + "integrity": "sha512-+8NzxD82XQoNKNrl1d/FSi+X8wAEWR+sbYAfIvub4Nz0d22plFG72CEVVaufV8PNf4qSslFTD8VMOxNVhHCjTw==", "dev": true, "requires": { "yallist": "^4.0.0" @@ -4951,36 +4528,6 @@ "yallist": "^4.0.0" } }, - "mississippi": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz", - "integrity": "sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==", - "dev": true, - "requires": { - "concat-stream": "^1.5.0", - "duplexify": "^3.4.2", - "end-of-stream": "^1.1.0", - "flush-write-stream": "^1.0.0", - "from2": "^2.1.0", - "parallel-transform": "^1.1.0", - "pump": "^3.0.0", - "pumpify": "^1.3.3", - "stream-each": "^1.1.0", - "through2": "^2.0.0" - }, - "dependencies": { - "pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - } - } - }, "mixin-deep": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", @@ -5015,9 +4562,9 @@ "dev": true }, "mocha": { - "version": "8.3.1", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-8.3.1.tgz", - "integrity": "sha512-5SBMxANWqOv5bw3Hx+HVgaWlcWcFEQDUdaUAr1AUU+qwtx6cowhn7gEDT/DwQP7uYxnvShdUOVLbTYAHOEGfDQ==", + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-8.4.0.tgz", + "integrity": "sha512-hJaO0mwDXmZS4ghXsvPVriOhsxQ7ofcpQdm8dE+jISUOKopitvnXFQmpRR7jd2K6VBG6E26gU3IAbXXGIbu4sQ==", "dev": true, "requires": { "@ungap/promise-all-settled": "1.1.2", @@ -5054,27 +4601,21 @@ "dev": true }, "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true }, "anymatch": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", - "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", + "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", "dev": true, "requires": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" } }, - "argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, "binary-extensions": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", @@ -5108,17 +4649,22 @@ "wrap-ansi": "^7.0.0" } }, - "diff": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", - "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", - "dev": true - }, - "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 + "debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + }, + "dependencies": { + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } + } }, "find-up": { "version": "5.0.0", @@ -5143,6 +4689,20 @@ "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", "dev": true }, + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dev": true, + "requires": { + "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" + } + }, "is-binary-path": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", @@ -5158,15 +4718,6 @@ "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "dev": true }, - "js-yaml": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.0.0.tgz", - "integrity": "sha512-pqon0s+4ScYUvX30wxQi3PogGFAlUyH0awepWvwkj4jD4v+ova3RiYw8bmA6x2rDrEaj8i/oWKoRxpVNW+Re8Q==", - "dev": true, - "requires": { - "argparse": "^2.0.1" - } - }, "locate-path": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", @@ -5241,9 +4792,9 @@ } }, "y18n": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.5.tgz", - "integrity": "sha512-hsRUr4FFrvhhRH12wOdfs38Gy7k2FFzB9qgN9v3aLykRq0dRcdcpz5C9FxdS2NuhOrI/628b/KSTJ3rwHysYSg==", + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", "dev": true }, "yargs": { @@ -5270,16 +4821,16 @@ } }, "monaco-page-objects": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/monaco-page-objects/-/monaco-page-objects-1.6.3.tgz", - "integrity": "sha512-vMFBgsY3+MkrG0ATMtWisND9OT1MLERmjbDkkGDbGMTyC/RdrFOQMr7NfXNI/vbSmXsZOj9CmC6hYOVFnKlkyg==", + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/monaco-page-objects/-/monaco-page-objects-1.7.1.tgz", + "integrity": "sha512-O/Nhx6idt6H6bJE5qQgoTjDBeaCEnoDTYYQEf605EhI1dxq5AcEEyoFR3Jb21KATEe7paBDGnjFXSedubIS3ww==", "dev": true, "requires": { "clipboardy": "^2.3.0", "clone-deep": "^4.0.1", "compare-versions": "^3.5.1", "fs-extra": "^10.0.0", - "ts-essentials": "^7.0.2" + "ts-essentials": "^8.0.0" }, "dependencies": { "fs-extra": { @@ -5311,40 +4862,6 @@ } } }, - "move-concurrently": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", - "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=", - "dev": true, - "requires": { - "aproba": "^1.1.1", - "copy-concurrently": "^1.0.0", - "fs-write-stream-atomic": "^1.0.8", - "mkdirp": "^0.5.1", - "rimraf": "^2.5.4", - "run-queue": "^1.0.3" - }, - "dependencies": { - "mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "dev": true, - "requires": { - "minimist": "^1.2.5" - } - }, - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - } - } - }, "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", @@ -5364,9 +4881,15 @@ "dev": true }, "nan": { - "version": "2.14.2", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.2.tgz", - "integrity": "sha512-M2ufzIiINKCuDfBSAUr1vWQ+vuVcA9kqx8JJUsbQi6yf1uGRyb7HfpdfUr5qLXf3B/t8dPvcjhKMmlfnP47EzQ==", + "version": "2.15.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.15.0.tgz", + "integrity": "sha512-8ZtvEnA2c5aYCZYd1cvgdnU6cqwixRoYg70xPLWUws5ORTa/lnw+u4amixRS/Ac5U5mQVgp9pnlSUnbNWFaWZQ==", + "dev": true + }, + "nanocolors": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/nanocolors/-/nanocolors-0.1.5.tgz", + "integrity": "sha512-8qaMI2gVxDmSUgoSXwWwkDDKxVePjhYaPIoy0e1xRMP52EAQINxGJ04GfyUPs+Z2g83RPwuHx+mBiaUFJGfTCA==", "dev": true }, "nanoid": { @@ -5428,9 +4951,9 @@ "dev": true }, "node-abi": { - "version": "2.30.0", - "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-2.30.0.tgz", - "integrity": "sha512-g6bZh3YCKQRdwuO/tSZZYJAw622SjsRfJ2X0Iy4sSOHZ34/sPPdVBn8fev2tj7njzLwuqPw9uMtGsGkO5kIQvg==", + "version": "2.30.1", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-2.30.1.tgz", + "integrity": "sha512-/2D0wOQPgaUWzVSVgRMx+trKJRC2UG4SUc4oCJoXx9Uxjtp0Vy3/kt7zcbxHF8+Z/pK3UloLWzBISg72brfy1w==", "dev": true, "requires": { "semver": "^5.4.1" @@ -5450,44 +4973,11 @@ "integrity": "sha512-sSHCgWfJ+Lui/u+0msF3oyCgvdkhxDbkCS6Q8uiJquzOimkJBvX6hl5aSSA7DR1XbMpdM8r7phjcF63sF4rkKg==", "dev": true }, - "node-libs-browser": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.1.tgz", - "integrity": "sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==", - "dev": true, - "requires": { - "assert": "^1.1.1", - "browserify-zlib": "^0.2.0", - "buffer": "^4.3.0", - "console-browserify": "^1.1.0", - "constants-browserify": "^1.0.0", - "crypto-browserify": "^3.11.0", - "domain-browser": "^1.1.1", - "events": "^3.0.0", - "https-browserify": "^1.0.0", - "os-browserify": "^0.3.0", - "path-browserify": "0.0.1", - "process": "^0.11.10", - "punycode": "^1.2.4", - "querystring-es3": "^0.2.0", - "readable-stream": "^2.3.3", - "stream-browserify": "^2.0.1", - "stream-http": "^2.7.2", - "string_decoder": "^1.0.0", - "timers-browserify": "^2.0.4", - "tty-browserify": "0.0.0", - "url": "^0.11.0", - "util": "^0.11.0", - "vm-browserify": "^1.0.1" - }, - "dependencies": { - "punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", - "dev": true - } - } + "node-releases": { + "version": "1.1.76", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.76.tgz", + "integrity": "sha512-9/IECtNr8dXNmPWmFXepT0/7o5eolGesHUa3mtr0KlgnCvnZxwh2qensKL42JJY2vQKC3nIBXetFAqR+PW1CmA==", + "dev": true }, "noop-logger": { "version": "0.1.1", @@ -5551,9 +5041,9 @@ } }, "nth-check": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.0.0.tgz", - "integrity": "sha512-i4sc/Kj8htBrAiH1viZ0TgU8Y5XqCaV/FziYK6TBczxmeKm3AEFWqqF3195yKudrarqy7Zu80Ra5dobFjn9X/Q==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.0.1.tgz", + "integrity": "sha512-it1vE95zF6dTT9lBsYbxvqh0Soy4SPowchj0UBGj/V6cTPnXXtQOPUbhZ6CmGzAD/rW22LQK6E96pcdJXk4A4w==", "dev": true, "requires": { "boolbase": "^1.0.0" @@ -5691,6 +5181,15 @@ "wrappy": "1" } }, + "onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "requires": { + "mimic-fn": "^2.1.0" + } + }, "opencv4nodejs-prebuilt": { "version": "5.3.0-2", "resolved": "https://registry.npmjs.org/opencv4nodejs-prebuilt/-/opencv4nodejs-prebuilt-5.3.0-2.tgz", @@ -5705,9 +5204,9 @@ }, "dependencies": { "are-we-there-yet": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", - "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.7.tgz", + "integrity": "sha512-nxwy40TuMiUGqMyRHgCSWZ9FM4VAoRP4xUYSTv5ImRog+h9yISPbVH7H8fASCIzYn9wlEv4zvFL7uKDMCFQm3g==", "dev": true, "requires": { "delegates": "^1.0.0", @@ -5753,12 +5252,6 @@ "readable-stream": "^2.0.1" } }, - "os-browserify": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", - "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=", - "dev": true - }, "os-homedir": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", @@ -5846,30 +5339,6 @@ "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", "dev": true }, - "parallel-transform": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.2.0.tgz", - "integrity": "sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg==", - "dev": true, - "requires": { - "cyclist": "^1.0.1", - "inherits": "^2.0.3", - "readable-stream": "^2.1.5" - } - }, - "parse-asn1": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.6.tgz", - "integrity": "sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==", - "dev": true, - "requires": { - "asn1.js": "^5.2.0", - "browserify-aes": "^1.0.0", - "evp_bytestokey": "^1.0.0", - "pbkdf2": "^3.0.3", - "safe-buffer": "^5.1.1" - } - }, "parse-filepath": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/parse-filepath/-/parse-filepath-1.0.2.tgz", @@ -5940,12 +5409,6 @@ "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", "dev": true }, - "path-browserify": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz", - "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==", - "dev": true - }, "path-dirname": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", @@ -5996,19 +5459,6 @@ "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==" }, - "pbkdf2": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.1.tgz", - "integrity": "sha512-4Ejy1OPxi9f2tt1rRV7Go7zmfDQ+ZectEQz3VGUQhgq62HtIRPDyG/JtnwIxs6x3uNMwo2V7q1fMvKjb+Tnpqg==", - "dev": true, - "requires": { - "create-hash": "^1.1.2", - "create-hmac": "^1.1.4", - "ripemd160": "^2.0.1", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" - } - }, "pend": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", @@ -6022,9 +5472,9 @@ "dev": true }, "picomatch": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", - "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==" + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz", + "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==" }, "pify": { "version": "2.3.0", @@ -6138,9 +5588,9 @@ }, "dependencies": { "are-we-there-yet": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", - "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.7.tgz", + "integrity": "sha512-nxwy40TuMiUGqMyRHgCSWZ9FM4VAoRP4xUYSTv5ImRog+h9yISPbVH7H8fASCIzYn9wlEv4zvFL7uKDMCFQm3g==", "dev": true, "requires": { "delegates": "^1.0.0", @@ -6171,16 +5621,6 @@ } } }, - "buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "dev": true, - "requires": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - }, "chownr": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", @@ -6271,12 +5711,6 @@ "integrity": "sha1-t+PqQkNaTJsnWdmeDyAesZWALuE=", "dev": true }, - "process": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", - "dev": true - }, "process-nextick-args": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", @@ -6289,40 +5723,12 @@ "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=", "dev": true }, - "prr": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", - "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=", - "dev": true - }, "psl": { "version": "1.8.0", "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==", "dev": true }, - "public-encrypt": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", - "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", - "dev": true, - "requires": { - "bn.js": "^4.1.0", - "browserify-rsa": "^4.0.0", - "create-hash": "^1.1.0", - "parse-asn1": "^5.0.0", - "randombytes": "^2.0.1", - "safe-buffer": "^5.1.2" - }, - "dependencies": { - "bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true - } - } - }, "pump": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", @@ -6356,17 +5762,10 @@ "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", "dev": true }, - "querystring": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", - "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", - "dev": true - }, - "querystring-es3": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", - "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", - "dev": true + "queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==" }, "randombytes": { "version": "2.1.0", @@ -6377,16 +5776,6 @@ "safe-buffer": "^5.1.0" } }, - "randomfill": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", - "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", - "dev": true, - "requires": { - "randombytes": "^2.0.5", - "safe-buffer": "^5.1.0" - } - }, "rc": { "version": "1.2.8", "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", @@ -6657,9 +6046,9 @@ "dev": true }, "repeat-element": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", - "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.4.tgz", + "integrity": "sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==", "dev": true }, "repeat-string": { @@ -6726,22 +6115,22 @@ "dev": true }, "resolve": { - "version": "1.19.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.19.0.tgz", - "integrity": "sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg==", + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", + "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", "dev": true, "requires": { - "is-core-module": "^2.1.0", + "is-core-module": "^2.2.0", "path-parse": "^1.0.6" } }, "resolve-cwd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", - "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", "dev": true, "requires": { - "resolve-from": "^3.0.0" + "resolve-from": "^5.0.0" } }, "resolve-dir": { @@ -6755,9 +6144,9 @@ } }, "resolve-from": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", - "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", "dev": true }, "resolve-options": { @@ -6795,28 +6184,12 @@ "glob": "^7.1.3" } }, - "ripemd160": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", - "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", - "dev": true, - "requires": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1" - } - }, "run-parallel": { - "version": "1.1.10", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.1.10.tgz", - "integrity": "sha512-zb/1OuZ6flOlH6tQyMPUrE3x3Ulxjlo9WIVXR4yVYi4H9UXQaeIsPbLn2R3O3vQCnDKkAl2qHiuocKKX4Tz/Sw==" - }, - "run-queue": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz", - "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=", - "dev": true, + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", "requires": { - "aproba": "^1.1.1" + "queue-microtask": "^1.2.2" } }, "safe-buffer": { @@ -6856,12 +6229,12 @@ "dev": true }, "schema-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz", - "integrity": "sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", "dev": true, "requires": { - "@types/json-schema": "^7.0.6", + "@types/json-schema": "^7.0.8", "ajv": "^6.12.5", "ajv-keywords": "^3.5.2" } @@ -6957,16 +6330,6 @@ "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=", "dev": true }, - "sha.js": { - "version": "2.4.11", - "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", - "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, "shallow-clone": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", @@ -7005,25 +6368,12 @@ "call-bind": "^1.0.0", "get-intrinsic": "^1.0.2", "object-inspect": "^1.9.0" - }, - "dependencies": { - "get-intrinsic": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", - "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", - "dev": true, - "requires": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1" - } - } } }, "signal-exit": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", - "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.4.tgz", + "integrity": "sha512-rqYhcAnZ6d/vTPGghdrw7iumdcbXpsk1b8IG/rz+VWV51DM0p7XCtMoJ3qhPLIbp3tvyt3pKRbaaEMZYpHto8Q==", "dev": true }, "simple-concat": { @@ -7064,15 +6414,6 @@ "use": "^3.1.0" }, "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, "define-property": { "version": "0.2.5", "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", @@ -7196,9 +6537,9 @@ } }, "source-map-support": { - "version": "0.5.19", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", - "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", + "version": "0.5.20", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.20.tgz", + "integrity": "sha512-n1lZZ8Ve4ksRqizaBQgxXDgKwttHDhyfQjA6YZZn8+AroHbsIz+JjwxQDxbp+7y5OYCI8t1Yk7etjD9CRd2hIw==", "dev": true, "requires": { "buffer-from": "^1.0.0", @@ -7206,9 +6547,9 @@ } }, "source-map-url": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", - "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.1.tgz", + "integrity": "sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==", "dev": true }, "sparkles": { @@ -7244,9 +6585,9 @@ } }, "spdx-license-ids": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.6.tgz", - "integrity": "sha512-+orQK83kyMva3WyPf59k1+Y525csj5JejicWut55zeTWANuN17qSiSLUXWtzHeNWORSvT7GLDJ/E/XiIWoXBTw==", + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.10.tgz", + "integrity": "sha512-oie3/+gKf7QtpitB0LYLETe+k8SifzsX4KixvpOsbI6S0kRiRQ5MKOio8eMSAKQ17N06+wdEOXRiId+zOxo0hA==", "dev": true }, "split-string": { @@ -7328,45 +6669,12 @@ } } }, - "stream-browserify": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz", - "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==", - "dev": true, - "requires": { - "inherits": "~2.0.1", - "readable-stream": "^2.0.2" - } - }, - "stream-each": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz", - "integrity": "sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==", - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "stream-shift": "^1.0.0" - } - }, "stream-exhaust": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/stream-exhaust/-/stream-exhaust-1.0.2.tgz", "integrity": "sha512-b/qaq/GlBK5xaq1yrK9/zFcyRSTNxmcZwFLGSTG0mXgZl/4Z6GgiyYOXOvY7N3eEvFRAG1bkDRz5EPGSvPYQlw==", "dev": true }, - "stream-http": { - "version": "2.8.3", - "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz", - "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==", - "dev": true, - "requires": { - "builtin-status-codes": "^3.0.0", - "inherits": "^2.0.1", - "readable-stream": "^2.3.6", - "to-arraybuffer": "^1.0.0", - "xtend": "^4.0.0" - } - }, "stream-shift": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz", @@ -7425,6 +6733,12 @@ "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", "dev": true }, + "strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true + }, "strip-json-comments": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", @@ -7451,9 +6765,9 @@ } }, "tapable": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", - "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", + "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", "dev": true }, "tar": { @@ -7542,222 +6856,46 @@ } }, "terser": { - "version": "4.8.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-4.8.0.tgz", - "integrity": "sha512-EAPipTNeWsb/3wLPeup1tVPaXfIaU68xMnVdPafIL1TV05OhASArYyIfFvnvJCNrR2NIOvDVNNTFRa+Re2MWyw==", + "version": "5.9.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.9.0.tgz", + "integrity": "sha512-h5hxa23sCdpzcye/7b8YqbE5OwKca/ni0RQz1uRX3tGh8haaGHqcuSqbGRybuAKNdntZ0mDgFNXPJ48xQ2RXKQ==", "dev": true, "requires": { "commander": "^2.20.0", - "source-map": "~0.6.1", - "source-map-support": "~0.5.12" + "source-map": "~0.7.2", + "source-map-support": "~0.5.20" + }, + "dependencies": { + "source-map": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", + "dev": true + } } }, "terser-webpack-plugin": { - "version": "1.4.5", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.4.5.tgz", - "integrity": "sha512-04Rfe496lN8EYruwi6oPQkG0vo8C+HT49X687FZnpPF0qMAIHONI6HEXYPKDOE8e5HjXTyKfqRd/agHtH0kOtw==", + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.2.4.tgz", + "integrity": "sha512-E2CkNMN+1cho04YpdANyRrn8CyN4yMy+WdFKZIySFZrGXZxJwJP6PMNGGc/Mcr6qygQHUUqRxnAPmi0M9f00XA==", "dev": true, "requires": { - "cacache": "^12.0.2", - "find-cache-dir": "^2.1.0", - "is-wsl": "^1.1.0", - "schema-utils": "^1.0.0", - "serialize-javascript": "^4.0.0", + "jest-worker": "^27.0.6", + "p-limit": "^3.1.0", + "schema-utils": "^3.1.1", + "serialize-javascript": "^6.0.0", "source-map": "^0.6.1", - "terser": "^4.1.2", - "webpack-sources": "^1.4.0", - "worker-farm": "^1.7.0" + "terser": "^5.7.2" }, "dependencies": { - "bluebird": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", - "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", - "dev": true - }, - "cacache": { - "version": "12.0.4", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.4.tgz", - "integrity": "sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ==", + "serialize-javascript": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", + "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", "dev": true, "requires": { - "bluebird": "^3.5.5", - "chownr": "^1.1.1", - "figgy-pudding": "^3.5.1", - "glob": "^7.1.4", - "graceful-fs": "^4.1.15", - "infer-owner": "^1.0.3", - "lru-cache": "^5.1.1", - "mississippi": "^3.0.0", - "mkdirp": "^0.5.1", - "move-concurrently": "^1.0.1", - "promise-inflight": "^1.0.1", - "rimraf": "^2.6.3", - "ssri": "^6.0.1", - "unique-filename": "^1.1.1", - "y18n": "^4.0.0" + "randombytes": "^2.1.0" } - }, - "chownr": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", - "dev": true - }, - "find-cache-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", - "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", - "dev": true, - "requires": { - "commondir": "^1.0.1", - "make-dir": "^2.0.0", - "pkg-dir": "^3.0.0" - } - }, - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, - "requires": { - "locate-path": "^3.0.0" - } - }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } - }, - "lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, - "requires": { - "yallist": "^3.0.2" - } - }, - "make-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", - "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", - "dev": true, - "requires": { - "pify": "^4.0.1", - "semver": "^5.6.0" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - } - } - }, - "mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "dev": true, - "requires": { - "minimist": "^1.2.5" - } - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dev": true, - "requires": { - "p-limit": "^2.0.0" - } - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true - }, - "pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", - "dev": true - }, - "pkg-dir": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", - "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", - "dev": true, - "requires": { - "find-up": "^3.0.0" - } - }, - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "schema-utils": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", - "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", - "dev": true, - "requires": { - "ajv": "^6.1.0", - "ajv-errors": "^1.0.0", - "ajv-keywords": "^3.1.0" - } - }, - "serialize-javascript": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", - "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", - "dev": true, - "requires": { - "randombytes": "^2.1.0" - } - }, - "ssri": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.2.tgz", - "integrity": "sha512-cepbSq/neFK7xB6A50KHN0xHDotYzq58wWCa5LeWqnPrHG8GzfEjO/4O8kpmcGW+oaxkvhEJCWgbgNk4/ZV93Q==", - "dev": true, - "requires": { - "figgy-pudding": "^3.5.1" - } - }, - "y18n": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.1.tgz", - "integrity": "sha512-wNcy4NvjMYL8gogWWYAO7ZFWFfHcbdbE57tZO8e4cbpj8tfUcwrwqSl3ad8HxpYWCdXcJUCeKKZS62Av1affwQ==", - "dev": true - }, - "yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true } } }, @@ -7793,15 +6931,6 @@ "integrity": "sha1-dkpaEa9QVhkhsTPztE5hhofg9cM=", "dev": true }, - "timers-browserify": { - "version": "2.0.12", - "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.12.tgz", - "integrity": "sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ==", - "dev": true, - "requires": { - "setimmediate": "^1.0.4" - } - }, "tmp": { "version": "0.0.30", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.30.tgz", @@ -7821,12 +6950,6 @@ "is-negated-glob": "^1.0.0" } }, - "to-arraybuffer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", - "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=", - "dev": true - }, "to-buffer": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/to-buffer/-/to-buffer-1.1.1.tgz", @@ -7908,22 +7031,48 @@ } }, "ts-essentials": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/ts-essentials/-/ts-essentials-7.0.3.tgz", - "integrity": "sha512-8+gr5+lqO3G84KdiTSMRLtuyJ+nTBVRKuCrK4lidMPdVeEp0uqC875uE5NMcaA7YYMN7XsNiFQuMvasF8HT/xQ==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/ts-essentials/-/ts-essentials-8.1.0.tgz", + "integrity": "sha512-34xALeQADWRYq9kbtprP4KdpTQ3v3BBIs/U4SpaP+C4++B8ijXY5NnILRJLchQVMzw7YBzKuGMUMrI9uT+ALVw==", "dev": true }, "ts-loader": { - "version": "5.4.5", - "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-5.4.5.tgz", - "integrity": "sha512-XYsjfnRQCBum9AMRZpk2rTYSVpdZBpZK+kDh0TeT3kxmQNBDVIeUjdPjY5RZry4eIAb8XHc4gYSUiUWPYvzSRw==", + "version": "9.2.6", + "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.2.6.tgz", + "integrity": "sha512-QMTC4UFzHmu9wU2VHZEmWWE9cUajjfcdcws+Gh7FhiO+Dy0RnR1bNz0YCHqhI0yRowCE9arVnNxYHqELOy9Hjw==", + "dev": true, + "requires": { + "chalk": "^4.1.0", + "enhanced-resolve": "^5.0.0", + "micromatch": "^4.0.0", + "semver": "^7.3.4" + } + }, + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + }, + "tslint": { + "version": "5.20.1", + "resolved": "https://registry.npmjs.org/tslint/-/tslint-5.20.1.tgz", + "integrity": "sha512-EcMxhzCFt8k+/UP5r8waCf/lzmeSyVlqxqMEDQE7rWYiQky8KpIBz1JAoYXfROHrPZ1XXd43q8yQnULOLiBRQg==", "dev": true, "requires": { + "@babel/code-frame": "^7.0.0", + "builtin-modules": "^1.1.1", "chalk": "^2.3.0", - "enhanced-resolve": "^4.0.0", - "loader-utils": "^1.0.2", - "micromatch": "^3.1.4", - "semver": "^5.0.1" + "commander": "^2.12.1", + "diff": "^4.0.1", + "glob": "^7.1.1", + "js-yaml": "^3.13.1", + "minimatch": "^3.0.4", + "mkdirp": "^0.5.1", + "resolve": "^1.3.2", + "semver": "^5.3.0", + "tslib": "^1.8.0", + "tsutils": "^2.29.0" }, "dependencies": { "ansi-styles": { @@ -7935,33 +7084,13 @@ "color-convert": "^1.9.0" } }, - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "dev": true, "requires": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } + "sprintf-js": "~1.0.2" } }, "chalk": { @@ -7990,210 +7119,41 @@ "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", "dev": true }, + "diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true + }, "escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", "dev": true }, - "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, "has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", "dev": true }, - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", - "dev": true, - "requires": { - "minimist": "^1.2.0" - } - }, - "loader-utils": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", - "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", "dev": true, "requires": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^1.0.1" + "argparse": "^1.0.7", + "esprima": "^4.0.0" } }, - "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", "dev": true, "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - } - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - }, - "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, - "requires": { - "has-flag": "^3.0.0" - } - }, - "to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", - "dev": true, - "requires": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - } - } - } - }, - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - }, - "tslint": { - "version": "5.20.1", - "resolved": "https://registry.npmjs.org/tslint/-/tslint-5.20.1.tgz", - "integrity": "sha512-EcMxhzCFt8k+/UP5r8waCf/lzmeSyVlqxqMEDQE7rWYiQky8KpIBz1JAoYXfROHrPZ1XXd43q8yQnULOLiBRQg==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "builtin-modules": "^1.1.1", - "chalk": "^2.3.0", - "commander": "^2.12.1", - "diff": "^4.0.1", - "glob": "^7.1.1", - "js-yaml": "^3.13.1", - "minimatch": "^3.0.4", - "mkdirp": "^0.5.1", - "resolve": "^1.3.2", - "semver": "^5.3.0", - "tslib": "^1.8.0", - "tsutils": "^2.29.0" - }, - "dependencies": { - "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, - "requires": { - "color-convert": "^1.9.0" - } - }, - "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, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "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, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "dev": true, - "requires": { - "minimist": "^1.2.5" + "minimist": "^1.2.5" } }, "semver": { @@ -8222,12 +7182,6 @@ "tslib": "^1.8.1" } }, - "tty-browserify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", - "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=", - "dev": true - }, "tunnel": { "version": "0.0.6", "resolved": "https://registry.npmjs.org/tunnel/-/tunnel-0.0.6.tgz", @@ -8256,9 +7210,9 @@ "dev": true }, "typed-rest-client": { - "version": "1.8.4", - "resolved": "https://registry.npmjs.org/typed-rest-client/-/typed-rest-client-1.8.4.tgz", - "integrity": "sha512-MyfKKYzk3I6/QQp6e1T50py4qg+c+9BzOEl2rBmQIpStwNUoqQ73An+Tkfy9YuV7O+o2mpVVJpe+fH//POZkbg==", + "version": "1.8.6", + "resolved": "https://registry.npmjs.org/typed-rest-client/-/typed-rest-client-1.8.6.tgz", + "integrity": "sha512-xcQpTEAJw2DP7GqVNECh4dD+riS+C1qndXLfBCJ3xk0kqprtGN491P5KlmrDbKdtuW8NEcP/5ChxiJI3S9WYTA==", "dev": true, "requires": { "qs": "^6.9.1", @@ -8284,9 +7238,9 @@ "dev": true }, "typescript": { - "version": "3.9.9", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.9.9.tgz", - "integrity": "sha512-kdMjTiekY+z/ubJCATUPlRDl39vXYiMV9iyeMuEuXZh2we6zz80uovNN2WlAxmmdE/Z/YQe+EbOEXB5RHEED3w==", + "version": "3.9.10", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.9.10.tgz", + "integrity": "sha512-w6fIxVE/H1PkLKcCPsFqKE7Kv7QUwhU8qQY2MueZXWx5cPZdwFupLgKK3vntcK98BtNHZtAF4LA/yl2a7k8R6Q==", "dev": true }, "uc.micro": { @@ -8438,9 +7392,9 @@ } }, "unzipper": { - "version": "0.10.11", - "resolved": "https://registry.npmjs.org/unzipper/-/unzipper-0.10.11.tgz", - "integrity": "sha512-+BrAq2oFqWod5IESRjL3S8baohbevGcVA+teAIOYWM3pDVdseogqbzhhvvmiyQrUNKFUnDMtELW3X8ykbyDCJw==", + "version": "0.8.14", + "resolved": "https://registry.npmjs.org/unzipper/-/unzipper-0.8.14.tgz", + "integrity": "sha512-8rFtE7EP5ssOwGpN2dt1Q4njl0N1hUXJ7sSPz0leU2hRdq6+pra57z4YPBlVqm40vcgv6ooKZEAx48fMTv9x4w==", "dev": true, "requires": { "big-integer": "^1.6.17", @@ -8448,11 +7402,39 @@ "bluebird": "~3.4.1", "buffer-indexof-polyfill": "~1.0.0", "duplexer2": "~0.1.4", - "fstream": "^1.0.12", - "graceful-fs": "^4.2.2", + "fstream": "~1.0.10", "listenercount": "~1.0.1", - "readable-stream": "~2.3.6", + "readable-stream": "~2.1.5", "setimmediate": "~1.0.4" + }, + "dependencies": { + "process-nextick-args": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", + "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=", + "dev": true + }, + "readable-stream": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.1.5.tgz", + "integrity": "sha1-ZvqLcg4UOLNkaB8q0aY8YYRIydA=", + "dev": true, + "requires": { + "buffer-shims": "^1.0.0", + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "~1.0.0", + "process-nextick-args": "~1.0.6", + "string_decoder": "~0.10.x", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true + } } }, "upath": { @@ -8476,24 +7458,6 @@ "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", "dev": true }, - "url": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", - "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", - "dev": true, - "requires": { - "punycode": "1.3.2", - "querystring": "0.2.0" - }, - "dependencies": { - "punycode": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", - "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", - "dev": true - } - } - }, "url-join": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/url-join/-/url-join-1.1.0.tgz", @@ -8512,23 +7476,6 @@ "integrity": "sha1-9F8VDExm7uloGGUFq5P8u4rWv2E=", "dev": true }, - "util": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz", - "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==", - "dev": true, - "requires": { - "inherits": "2.0.3" - }, - "dependencies": { - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true - } - } - }, "util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", @@ -8541,9 +7488,9 @@ "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" }, "v8-compile-cache": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.2.0.tgz", - "integrity": "sha512-gTpR5XQNKFwOd4clxfnhaqvfqMpqEwr4tOtCyz4MtYZX2JYhfr1JvBFKdS+7K/9rfpZR3VLX+YWBbKoxCgS43Q==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", + "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", "dev": true }, "v8flags": { @@ -8580,6 +7527,14 @@ "assert-plus": "^1.0.0", "core-util-is": "1.0.2", "extsprintf": "^1.2.0" + }, + "dependencies": { + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "dev": true + } } }, "vinyl": { @@ -8647,16 +7602,10 @@ } } }, - "vm-browserify": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", - "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==", - "dev": true - }, "vsce": { - "version": "1.96.1", - "resolved": "https://registry.npmjs.org/vsce/-/vsce-1.96.1.tgz", - "integrity": "sha512-KnEVqjfc1dXrpZsbJ8J7B9VQ7GAAx8o5RqBNk42Srv1KF9+e2/aXchQHe9QZxeUs/FiliHoMGpGvnHTXwKIT2A==", + "version": "1.99.0", + "resolved": "https://registry.npmjs.org/vsce/-/vsce-1.99.0.tgz", + "integrity": "sha512-fyzOLcmcgBmA+CYg0NyYU3JMmcOBcf94ZzZZYi83mIoXBRU391mYByoJEPnkl8xZGa3/OW5lH438/JOThlYPNA==", "dev": true, "requires": { "azure-devops-node-api": "^11.0.1", @@ -8665,6 +7614,7 @@ "commander": "^6.1.0", "denodeify": "^1.2.1", "glob": "^7.0.6", + "hosted-git-info": "^4.0.2", "leven": "^3.1.0", "lodash": "^4.17.15", "markdown-it": "^10.0.0", @@ -8677,6 +7627,7 @@ "tmp": "^0.2.1", "typed-rest-client": "^1.8.4", "url-join": "^1.1.0", + "xml2js": "^0.4.23", "yauzl": "^2.3.1", "yazl": "^2.2.2" }, @@ -8734,6 +7685,15 @@ "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", "dev": true }, + "hosted-git-info": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.0.2.tgz", + "integrity": "sha512-c9OGXbZ3guC/xOlCg1Ci/VgWlwsqDv1yMQL1CWqXDL0hDjXuNcq0zuR4xqPSuasI3kqFDhqSyTjREz5gzq0fXg==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, "semver": { "version": "5.7.1", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", @@ -8761,9 +7721,9 @@ } }, "vscode-extension-telemetry": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/vscode-extension-telemetry/-/vscode-extension-telemetry-0.1.6.tgz", - "integrity": "sha512-rbzSg7k4NnsCdF4Lz0gI4jl3JLXR0hnlmfFgsY8CSDYhXgdoIxcre8jw5rjkobY0xhSDhbG7xCjP8zxskySJ/g==", + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/vscode-extension-telemetry/-/vscode-extension-telemetry-0.1.7.tgz", + "integrity": "sha512-pZuZTHO9OpsrwlerOKotWBRLRYJ53DobYb7aWiRAXjlqkuqE+YJJaP+2WEy8GrLIF1EnitXTDMaTAKsmLQ5ORQ==", "requires": { "applicationinsights": "1.7.4" } @@ -8778,9 +7738,9 @@ } }, "vscode-extension-tester": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/vscode-extension-tester/-/vscode-extension-tester-4.1.2.tgz", - "integrity": "sha512-QWy7BBS8zdsWMj7/okpb8aJ/+16BelZzqLrJd2zYZJbzepxxrXZhpE034HmLlMdEnvTqN9yM94uVLz1CcZS6KA==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/vscode-extension-tester/-/vscode-extension-tester-4.2.0.tgz", + "integrity": "sha512-9ypQM+4VI1aDoCXhVORJ4tot+PyPukYf7U4xvN5vPZSXywIOuHfknoyjIz9uTyx7hdCSfDhytTFBoGa8nkFtlg==", "dev": true, "requires": { "@types/selenium-webdriver": "^3.0.15", @@ -8789,26 +7749,20 @@ "fs-extra": "^10.0.0", "glob": "^7.1.7", "js-yaml": "^4.1.0", - "monaco-page-objects": "^1.6.3", + "monaco-page-objects": "^1.7.0", "request": "^2.88.0", "sanitize-filename": "^1.6.3", "selenium-webdriver": "^3.0.0", "targz": "^1.0.1", "unzip-stream": "^0.3.0", "vsce": "^1.96.0", - "vscode-extension-tester-locators": "^1.59.0" + "vscode-extension-tester-locators": "^1.60.0" }, "dependencies": { - "argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, "commander": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-8.1.0.tgz", - "integrity": "sha512-mf45ldcuHSYShkplHHGKWb4TrmwQadxOn7v4WuhDJy0ZVoY5JFajaRDKD0PNe5qXzBX0rhovjTnP6Kz9LETcuA==", + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-8.2.0.tgz", + "integrity": "sha512-LLKxDvHeL91/8MIyTAD5BFMNtoIwztGPMiM/7Bl8rIPmHCZXRxmSWr91h57dpOpnQ6jIUqEWdXE/uBYMfiVZDA==", "dev": true }, "fs-extra": { @@ -8822,20 +7776,6 @@ "universalify": "^2.0.0" } }, - "glob": { - "version": "7.1.7", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", - "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", - "dev": true, - "requires": { - "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" - } - }, "js-yaml": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", @@ -8864,9 +7804,9 @@ } }, "vscode-extension-tester-locators": { - "version": "1.59.0", - "resolved": "https://registry.npmjs.org/vscode-extension-tester-locators/-/vscode-extension-tester-locators-1.59.0.tgz", - "integrity": "sha512-P2nW8PXZjsV1lJzkVQbRV9TvXk0jkc1dDSSzaYkKLksyejgljFwCbgUbC3VxyQZHTH8kQtLxj8HNIM6QAGM9vA==", + "version": "1.60.1", + "resolved": "https://registry.npmjs.org/vscode-extension-tester-locators/-/vscode-extension-tester-locators-1.60.1.tgz", + "integrity": "sha512-87MZai9RM9aM4MBuQjzcDEg1MDlNkvSeF1FnnD4x/3usQfCUXrcptyR2N0BsFbWIRyxV8HZ+qbWVhvrtxm4Pew==", "dev": true }, "vscode-extension-tester-native": { @@ -8919,593 +7859,218 @@ } }, "vscode-test": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/vscode-test/-/vscode-test-1.5.1.tgz", - "integrity": "sha512-tDloz6euDne+GeUSglhufL0c2xhuYAPAT74hjsuGxfflALfXF9bYnJ7ehZEeVkr/ZnQEh/T8EBrfPL+m0h5qEQ==", + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/vscode-test/-/vscode-test-1.6.1.tgz", + "integrity": "sha512-086q88T2ca1k95mUzffvbzb7esqQNvJgiwY4h29ukPhFo8u+vXOOmelUoU5EQUHs3Of8+JuQ3oGdbVCqaxuTXA==", "dev": true, "requires": { "http-proxy-agent": "^4.0.1", "https-proxy-agent": "^5.0.0", "rimraf": "^3.0.2", "unzipper": "^0.10.11" + }, + "dependencies": { + "unzipper": { + "version": "0.10.11", + "resolved": "https://registry.npmjs.org/unzipper/-/unzipper-0.10.11.tgz", + "integrity": "sha512-+BrAq2oFqWod5IESRjL3S8baohbevGcVA+teAIOYWM3pDVdseogqbzhhvvmiyQrUNKFUnDMtELW3X8ykbyDCJw==", + "dev": true, + "requires": { + "big-integer": "^1.6.17", + "binary": "~0.3.0", + "bluebird": "~3.4.1", + "buffer-indexof-polyfill": "~1.0.0", + "duplexer2": "~0.1.4", + "fstream": "^1.0.12", + "graceful-fs": "^4.2.2", + "listenercount": "~1.0.1", + "readable-stream": "~2.3.6", + "setimmediate": "~1.0.4" + } + } } }, "watchpack": { - "version": "1.7.5", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.7.5.tgz", - "integrity": "sha512-9P3MWk6SrKjHsGkLT2KHXdQ/9SNkyoJbabxnKOoJepsvJjJG8uYTR3yTPxPQvNDI3w4Nz1xnE0TLHK4RIVe/MQ==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.2.0.tgz", + "integrity": "sha512-up4YAn/XHgZHIxFBVCdlMiWDj6WaLKpwVeGQk2I5thdYxF/KmF0aaz6TfJZ/hfl1h/XlcDr7k1KH7ThDagpFaA==", "dev": true, "requires": { - "chokidar": "^3.4.1", - "graceful-fs": "^4.1.2", - "neo-async": "^2.5.0", - "watchpack-chokidar2": "^2.0.1" + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + } + }, + "webpack": { + "version": "5.53.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.53.0.tgz", + "integrity": "sha512-RZ1Z3z3ni44snoWjfWeHFyzvd9HMVYDYC5VXmlYUT6NWgEOWdCNpad5Fve2CzzHoRED7WtsKe+FCyP5Vk4pWiQ==", + "dev": true, + "requires": { + "@types/eslint-scope": "^3.7.0", + "@types/estree": "^0.0.50", + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/wasm-edit": "1.11.1", + "@webassemblyjs/wasm-parser": "1.11.1", + "acorn": "^8.4.1", + "acorn-import-assertions": "^1.7.6", + "browserslist": "^4.14.5", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.8.0", + "es-module-lexer": "^0.7.1", + "eslint-scope": "5.1.1", + "events": "^3.2.0", + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.2.4", + "json-parse-better-errors": "^1.0.2", + "loader-runner": "^4.2.0", + "mime-types": "^2.1.27", + "neo-async": "^2.6.2", + "schema-utils": "^3.1.0", + "tapable": "^2.1.1", + "terser-webpack-plugin": "^5.1.3", + "watchpack": "^2.2.0", + "webpack-sources": "^3.2.0" }, "dependencies": { - "anymatch": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", - "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", + "webpack-sources": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.1.tgz", + "integrity": "sha512-t6BMVLQ0AkjBOoRTZgqrWm7xbXMBzD+XDq2EZ96+vMfn3qKgsvdXZhbPZ4ElUOpdv4u+iiGe+w3+J75iy/bYGA==", + "dev": true + } + } + }, + "webpack-cli": { + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-4.8.0.tgz", + "integrity": "sha512-+iBSWsX16uVna5aAYN6/wjhJy1q/GKk4KjKvfg90/6hykCTSgozbfz5iRgDTSJt/LgSbYxdBX3KBHeobIs+ZEw==", + "dev": true, + "requires": { + "@discoveryjs/json-ext": "^0.5.0", + "@webpack-cli/configtest": "^1.0.4", + "@webpack-cli/info": "^1.3.0", + "@webpack-cli/serve": "^1.5.2", + "colorette": "^1.2.1", + "commander": "^7.0.0", + "execa": "^5.0.0", + "fastest-levenshtein": "^1.0.12", + "import-local": "^3.0.2", + "interpret": "^2.2.0", + "rechoir": "^0.7.0", + "v8-compile-cache": "^2.2.0", + "webpack-merge": "^5.7.3" + }, + "dependencies": { + "commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "dev": true + }, + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", "dev": true, - "optional": true, "requires": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" } }, - "binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", "dev": true, - "optional": true + "requires": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + } }, - "chokidar": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.1.tgz", - "integrity": "sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw==", + "get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true + }, + "interpret": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-2.2.0.tgz", + "integrity": "sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==", + "dev": true + }, + "is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true + }, + "npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", "dev": true, - "optional": true, "requires": { - "anymatch": "~3.1.1", - "braces": "~3.0.2", - "fsevents": "~2.3.1", - "glob-parent": "~5.1.0", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.5.0" + "path-key": "^3.0.0" } }, - "fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, - "optional": true + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true }, - "is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "rechoir": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.7.1.tgz", + "integrity": "sha512-/njmZ8s1wVeR6pjTZ+0nCnv8SpZNRMT2D1RLOJQESlYFDBvwpTA4KWJpZ+sBJ4+vhjILRcK7JIFdGCdxEAAitg==", "dev": true, - "optional": true, "requires": { - "binary-extensions": "^2.0.0" + "resolve": "^1.9.0" } }, - "readdirp": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz", - "integrity": "sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==", - "dev": true, - "optional": true, - "requires": { - "picomatch": "^2.2.1" - } - } - } - }, - "watchpack-chokidar2": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/watchpack-chokidar2/-/watchpack-chokidar2-2.0.1.tgz", - "integrity": "sha512-nCFfBIPKr5Sh61s4LPpy1Wtfi0HE8isJ3d2Yb5/Ppw2P2B/3eVSEBjKfN0fmHJSK14+31KwMKmcrzs2GM4P0Ww==", - "dev": true, - "optional": true, - "requires": { - "chokidar": "^2.1.8" - } - }, - "webpack": { - "version": "4.46.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.46.0.tgz", - "integrity": "sha512-6jJuJjg8znb/xRItk7bkT0+Q7AHCYjjFnvKIWQPkNIOyRqoCGvkOs0ipeQzrqz4l5FtN5ZI/ukEHroeX/o1/5Q==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/helper-module-context": "1.9.0", - "@webassemblyjs/wasm-edit": "1.9.0", - "@webassemblyjs/wasm-parser": "1.9.0", - "acorn": "^6.4.1", - "ajv": "^6.10.2", - "ajv-keywords": "^3.4.1", - "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^4.5.0", - "eslint-scope": "^4.0.3", - "json-parse-better-errors": "^1.0.2", - "loader-runner": "^2.4.0", - "loader-utils": "^1.2.3", - "memory-fs": "^0.4.1", - "micromatch": "^3.1.10", - "mkdirp": "^0.5.3", - "neo-async": "^2.6.1", - "node-libs-browser": "^2.2.1", - "schema-utils": "^1.0.0", - "tapable": "^1.1.3", - "terser-webpack-plugin": "^1.4.3", - "watchpack": "^1.7.4", - "webpack-sources": "^1.4.1" - }, - "dependencies": { - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dev": true, - "requires": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "enhanced-resolve": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.5.0.tgz", - "integrity": "sha512-Nv9m36S/vxpsI+Hc4/ZGRs0n9mXqSWGGq49zxb/cJfPAQMbUtttJAlNPS4AQzaBdw/pKskw5bMbekT/Y7W/Wlg==", + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "dev": true, "requires": { - "graceful-fs": "^4.1.2", - "memory-fs": "^0.5.0", - "tapable": "^1.0.0" - }, - "dependencies": { - "memory-fs": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.5.0.tgz", - "integrity": "sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==", - "dev": true, - "requires": { - "errno": "^0.1.3", - "readable-stream": "^2.0.1" - } - } + "shebang-regex": "^3.0.0" } }, - "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "is-number": { + "shebang-regex": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", - "dev": true, - "requires": { - "minimist": "^1.2.0" - } - }, - "loader-utils": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", - "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", - "dev": true, - "requires": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^1.0.1" - } - }, - "memory-fs": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", - "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", - "dev": true, - "requires": { - "errno": "^0.1.3", - "readable-stream": "^2.0.1" - } - }, - "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "dev": true, - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - } - }, - "mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "dev": true, - "requires": { - "minimist": "^1.2.5" - } - }, - "schema-utils": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", - "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", - "dev": true, - "requires": { - "ajv": "^6.1.0", - "ajv-errors": "^1.0.0", - "ajv-keywords": "^3.1.0" - } + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true }, - "to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dev": true, "requires": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" + "isexe": "^2.0.0" } } } }, - "webpack-cli": { - "version": "3.3.12", - "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-3.3.12.tgz", - "integrity": "sha512-NVWBaz9k839ZH/sinurM+HcDvJOTXwSjYp1ku+5XKeOC03z8v5QitnK/x+lAxGXFyhdayoIf/GOpv85z3/xPag==", + "webpack-merge": { + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.8.0.tgz", + "integrity": "sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q==", "dev": true, "requires": { - "chalk": "^2.4.2", - "cross-spawn": "^6.0.5", - "enhanced-resolve": "^4.1.1", - "findup-sync": "^3.0.0", - "global-modules": "^2.0.0", - "import-local": "^2.0.0", - "interpret": "^1.4.0", - "loader-utils": "^1.4.0", - "supports-color": "^6.1.0", - "v8-compile-cache": "^2.1.1", - "yargs": "^13.3.2" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true - }, - "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, - "requires": { - "color-convert": "^1.9.0" - } - }, - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true - }, - "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, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "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, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "cliui": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", - "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", - "dev": true, - "requires": { - "string-width": "^3.1.0", - "strip-ansi": "^5.2.0", - "wrap-ansi": "^5.1.0" - } - }, - "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, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true - }, - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, - "requires": { - "locate-path": "^3.0.0" - } - }, - "get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true - }, - "global-modules": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", - "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", - "dev": true, - "requires": { - "global-prefix": "^3.0.0" - } - }, - "global-prefix": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", - "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", - "dev": true, - "requires": { - "ini": "^1.3.5", - "kind-of": "^6.0.2", - "which": "^1.3.1" - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true - }, - "json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", - "dev": true, - "requires": { - "minimist": "^1.2.0" - } - }, - "loader-utils": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", - "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", - "dev": true, - "requires": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^1.0.1" - } - }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dev": true, - "requires": { - "p-limit": "^2.0.0" - } - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true - }, - "require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", - "dev": true - }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - }, - "which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", - "dev": true - }, - "wrap-ansi": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", - "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.0", - "string-width": "^3.0.0", - "strip-ansi": "^5.0.0" - } - }, - "y18n": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.1.tgz", - "integrity": "sha512-wNcy4NvjMYL8gogWWYAO7ZFWFfHcbdbE57tZO8e4cbpj8tfUcwrwqSl3ad8HxpYWCdXcJUCeKKZS62Av1affwQ==", - "dev": true - }, - "yargs": { - "version": "13.3.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", - "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", - "dev": true, - "requires": { - "cliui": "^5.0.0", - "find-up": "^3.0.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^3.0.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^13.1.2" - } - }, - "yargs-parser": { - "version": "13.1.2", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", - "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - } + "clone-deep": "^4.0.1", + "wildcard": "^2.0.0" } }, "webpack-sources": { @@ -9548,21 +8113,18 @@ "string-width": "^1.0.2 || 2" } }, + "wildcard": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.0.tgz", + "integrity": "sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw==", + "dev": true + }, "window-size": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.4.tgz", "integrity": "sha1-+OGqHuWlPsW/FR/6CXQqatdpeHY=", "dev": true }, - "worker-farm": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.7.0.tgz", - "integrity": "sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw==", - "dev": true, - "requires": { - "errno": "~0.1.7" - } - }, "workerpool": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.1.0.tgz", @@ -9620,9 +8182,9 @@ "dev": true }, "yargs": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-7.1.1.tgz", - "integrity": "sha512-huO4Fr1f9PmiJJdll5kwoS2e4GqzGSsMT3PPMpOwoVkOK8ckqAewMTZyA6LXVQWflleb/Z8oPBEvNsMft0XE+g==", + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-7.1.2.tgz", + "integrity": "sha512-ZEjj/dQYQy0Zx0lgLMLR8QuaqTihnxirir7EwUHp1Axq4e3+k8jXU5K0VLbNvedv1f4EWtBonDIZm0NUr+jCcA==", "dev": true, "requires": { "camelcase": "^3.0.0", @@ -9637,13 +8199,13 @@ "string-width": "^1.0.2", "which-module": "^1.0.0", "y18n": "^3.2.1", - "yargs-parser": "5.0.0-security.0" + "yargs-parser": "^5.0.1" } }, "yargs-parser": { - "version": "5.0.0-security.0", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-5.0.0-security.0.tgz", - "integrity": "sha512-T69y4Ps64LNesYxeYGYPvfoMTt/7y1XtfpIslUeK4um+9Hu7hlGoRtaDLvdXb7+/tfq4opVa2HRY5xGip022rQ==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-5.0.1.tgz", + "integrity": "sha512-wpav5XYiddjXxirPoCTUPbqM0PXvJ9hiBMvuJgInvo4/lAOTZzUprArw17q2O1P2+GHhbBr18/iQwjL5Z9BqfA==", "dev": true, "requires": { "camelcase": "^3.0.0", diff --git a/package.json b/package.json index 0c69ef0b..de847c9c 100644 --- a/package.json +++ b/package.json @@ -592,7 +592,7 @@ }, "scripts": { "compile": "tsc -p . && webpack --config webpack.config.js", - "watch": "webpack --mode development --watch --info-verbosity verbose", + "watch": "webpack --mode development --watch", "test": "tsc -p . && node ./dist/test/index.js", "test-ui": "tsc -p . && node ./dist/test/ui/index.js", "build-server": "./node_modules/.bin/gulp build_server", @@ -614,14 +614,14 @@ "gulp-tslint": "^8.1.4", "mocha": "^8.3.1", "semver": "^7.3.5", - "ts-loader": "^5.4.5", + "ts-loader": "^9.2.6", "tslint": "^5.20.1", - "typescript": "^3.9.9", + "typescript": "^4.4.3", "vscode-extension-tester": "^4.1.2", "vscode-extension-tester-native": "^3.0.2", "vscode-test": "^1.5.1", - "webpack": "^4.46.0", - "webpack-cli": "^3.3.12" + "webpack": "^5.53.0", + "webpack-cli": "^4.8.0" }, "dependencies": { "await-lock": "^2.1.0", From f10fca0f255dd0b563242909550c3de79c80530e Mon Sep 17 00:00:00 2001 From: Sheng Chen Date: Thu, 23 Sep 2021 14:35:01 +0800 Subject: [PATCH 059/352] chore: Prepare for 0.18.8 (#552) --- CHANGELOG.md | 7 +++++++ .../com.microsoft.jdtls.ext.activator/META-INF/MANIFEST.MF | 2 +- jdtls.ext/com.microsoft.jdtls.ext.activator/pom.xml | 2 +- .../com.microsoft.jdtls.ext.core/META-INF/MANIFEST.MF | 2 +- jdtls.ext/com.microsoft.jdtls.ext.core/pom.xml | 2 +- jdtls.ext/pom.xml | 2 +- package-lock.json | 2 +- package.json | 4 ++-- 8 files changed, 15 insertions(+), 8 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e8f38153..47f42bfe 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,13 @@ All notable changes to the "vscode-java-dependency" extension will be documented The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/) and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html). +## 0.18.8 +### Changed +- Adopt the new `folder-library` icon. [PR#545](https://github.com/microsoft/vscode-java-dependency/pull/545) + +### Fixed +- [Bugs fixed](https://github.com/microsoft/vscode-java-dependency/issues?q=is%3Aissue+label%3Abug+milestone%3A0.18.8+is%3Aclosed) + ## 0.18.7 ### Added - Support creating new Java class from `File` > `New File...`. [PR#533](https://github.com/microsoft/vscode-java-dependency/pull/533) diff --git a/jdtls.ext/com.microsoft.jdtls.ext.activator/META-INF/MANIFEST.MF b/jdtls.ext/com.microsoft.jdtls.ext.activator/META-INF/MANIFEST.MF index 547f2160..46ce7544 100644 --- a/jdtls.ext/com.microsoft.jdtls.ext.activator/META-INF/MANIFEST.MF +++ b/jdtls.ext/com.microsoft.jdtls.ext.activator/META-INF/MANIFEST.MF @@ -2,7 +2,7 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: JDTLS EXT Activator Bundle-SymbolicName: com.microsoft.jdtls.ext.activator;singleton:=true -Bundle-Version: 0.18.7 +Bundle-Version: 0.18.8 Bundle-Activator: com.microsoft.jdtls.ext.activator.JdtlsExtActivator Bundle-RequiredExecutionEnvironment: JavaSE-1.8 Import-Package: org.eclipse.jdt.core, diff --git a/jdtls.ext/com.microsoft.jdtls.ext.activator/pom.xml b/jdtls.ext/com.microsoft.jdtls.ext.activator/pom.xml index d7528440..79f9f749 100644 --- a/jdtls.ext/com.microsoft.jdtls.ext.activator/pom.xml +++ b/jdtls.ext/com.microsoft.jdtls.ext.activator/pom.xml @@ -5,7 +5,7 @@ com.microsoft.jdtls.ext jdtls-ext-parent - 0.18.7 + 0.18.8 com.microsoft.jdtls.ext.activator eclipse-plugin diff --git a/jdtls.ext/com.microsoft.jdtls.ext.core/META-INF/MANIFEST.MF b/jdtls.ext/com.microsoft.jdtls.ext.core/META-INF/MANIFEST.MF index c19f319a..c2e5c78a 100644 --- a/jdtls.ext/com.microsoft.jdtls.ext.core/META-INF/MANIFEST.MF +++ b/jdtls.ext/com.microsoft.jdtls.ext.core/META-INF/MANIFEST.MF @@ -2,7 +2,7 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: JDTLS EXT Core Bundle-SymbolicName: com.microsoft.jdtls.ext.core;singleton:=true -Bundle-Version: 0.18.7 +Bundle-Version: 0.18.8 Bundle-Activator: com.microsoft.jdtls.ext.core.JdtlsExtActivator Bundle-RequiredExecutionEnvironment: JavaSE-1.8 Bundle-ActivationPolicy: lazy diff --git a/jdtls.ext/com.microsoft.jdtls.ext.core/pom.xml b/jdtls.ext/com.microsoft.jdtls.ext.core/pom.xml index fe229ed8..ea55cbcb 100644 --- a/jdtls.ext/com.microsoft.jdtls.ext.core/pom.xml +++ b/jdtls.ext/com.microsoft.jdtls.ext.core/pom.xml @@ -5,7 +5,7 @@ com.microsoft.jdtls.ext jdtls-ext-parent - 0.18.7 + 0.18.8 com.microsoft.jdtls.ext.core eclipse-plugin diff --git a/jdtls.ext/pom.xml b/jdtls.ext/pom.xml index afbd2365..aa23eb53 100644 --- a/jdtls.ext/pom.xml +++ b/jdtls.ext/pom.xml @@ -4,7 +4,7 @@ com.microsoft.jdtls.ext jdtls-ext-parent ${base.name} :: Parent - 0.18.7 + 0.18.8 pom Java Project Manager diff --git a/package-lock.json b/package-lock.json index ffdb93dd..0fd521c4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "vscode-java-dependency", - "version": "0.18.7", + "version": "0.18.8", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index de847c9c..ae173ebb 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "vscode-java-dependency", "displayName": "Project Manager for Java", "description": "%description%", - "version": "0.18.7", + "version": "0.18.8", "publisher": "vscjava", "preview": true, "aiKey": "5c642b22-e845-4400-badb-3f8509a70777", @@ -42,7 +42,7 @@ "main": "./main.js", "contributes": { "javaExtensions": [ - "./server/com.microsoft.jdtls.ext.core-0.18.7.jar" + "./server/com.microsoft.jdtls.ext.core-0.18.8.jar" ], "commands": [ { From 2d5daa4b2672fd56a6070267210f759f623f2f6f Mon Sep 17 00:00:00 2001 From: Sheng Chen Date: Fri, 24 Sep 2021 14:47:49 +0800 Subject: [PATCH 060/352] fix: Improve the hint in the welcome view (#555) --- package.json | 2 +- package.nls.json | 4 ++-- package.nls.zh.json | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index ae173ebb..b2f209b7 100644 --- a/package.json +++ b/package.json @@ -521,7 +521,7 @@ "name": "Java Projects", "contextualTitle": "Java Projects", "icon": "$(project)", - "when": "resourceLangId == java || java:workspaceContainsBuildFiles || java:serverMode" + "when": "java:projectManagerActivated" } ] }, diff --git a/package.nls.json b/package.nls.json index 5331478e..f2092cca 100644 --- a/package.nls.json +++ b/package.nls.json @@ -37,8 +37,8 @@ "taskDefinitions.java.project.exportJar.testCompileOutput": "The folders containing output class files in the test scope.", "taskDefinitions.java.project.exportJar.dependencies": "The artifact dependencies in the runtime scope.", "taskDefinitions.java.project.exportJar.testDependencies": "The artifact dependencies in the test scope.", - "viewsWelcome.workbench.createNewJavaProject": "You can also [open a Java project](command:_java.project.open), or create a new Java project by clicking the button below.\n[Create Java Project](command:java.project.create)", + "viewsWelcome.workbench.createNewJavaProject": "You can also [open a Java project folder](command:_java.project.open), or create a new Java project by clicking the button below.\n[Create Java Project](command:java.project.create)", "viewsWelcome.workbench.noJavaProject": "No Java projects found in the current workspace. You can [open a Java project folder](command:_java.project.open), or create a new Java project by clicking the button below.\n[Create Java Project](command:java.project.create)", "viewsWelcome.workbench.inLightWeightMode": "To view the projects, you can import the projects into workspace.\n[Import Projects](command:java.server.mode.switch?%5B%22Standard%22,true%5D)", - "viewsWelcome.workbench.installLanguageSupport": "The Java Projects explorer requires [Language Support for Java(TM) by Red Hat](command:extension.open?%5B%22redhat.java%22%5D) to provide full features.\n[Install](command:workbench.extensions.installExtension?%5B%22redhat.java%22%5D)" + "viewsWelcome.workbench.installLanguageSupport": "The Java Projects explorer requires [Extension Pack for Java](command:extension.open?%5B%22vscjava.vscode-java-pack%22%5D) to provide full features.\n[Install](command:workbench.extensions.installExtension?%5B%22vscjava.vscode-java-pack%22%5D)" } diff --git a/package.nls.zh.json b/package.nls.zh.json index 054d88d5..d0da4f57 100644 --- a/package.nls.zh.json +++ b/package.nls.zh.json @@ -37,8 +37,8 @@ "taskDefinitions.java.project.exportJar.testCompileOutput": "在 test scope 内包含输出的 class 文件的文件夹。", "taskDefinitions.java.project.exportJar.dependencies": "在 runtime scope 内的依赖。", "taskDefinitions.java.project.exportJar.testDependencies": "在 test scope 内的依赖。", - "viewsWelcome.workbench.createNewJavaProject": "您也可以[打开一个 Java 项目](command:_java.project.open),或点击下方按钮创建一个新的 Java 项目。\n[创建 Java 项目](command:java.project.create)", + "viewsWelcome.workbench.createNewJavaProject": "您也可以[打开一个 Java 项目目录](command:_java.project.open),或点击下方按钮创建一个新的 Java 项目。\n[创建 Java 项目](command:java.project.create)", "viewsWelcome.workbench.noJavaProject": "当前工作空间未发现 Java 项目,您可以[打开一个 Java 项目目录](command:_java.project.open),或点击下方按钮创建一个新的 Java 项目。\n[创建 Java 项目](command:java.project.create)", "viewsWelcome.workbench.inLightWeightMode": "要浏览项目信息,你可以将项目导入到工作空间中。\n[导入项目](command:java.server.mode.switch?%5B%22Standard%22,true%5D)", - "viewsWelcome.workbench.installLanguageSupport": "Java 项目视图需要安装并激活 [Language Support for Java(TM) by Red Hat](command:extension.open?%5B%22redhat.java%22%5D) 以提供完整的功能。\n[安装](command:workbench.extensions.installExtension?%5B%22redhat.java%22%5D)" + "viewsWelcome.workbench.installLanguageSupport": "Java 项目视图需要安装并激活 [Extension Pack for Java](command:extension.open?%5B%22vscjava.vscode-java-pack%22%5D) 以提供完整的功能。\n[安装](command:workbench.extensions.installExtension?%5B%22vscjava.vscode-java-pack%22%5D)" } From f6af59e7606a129140689e77cbffb2e21d2e09fc Mon Sep 17 00:00:00 2001 From: Sheng Chen Date: Fri, 24 Sep 2021 16:05:56 +0800 Subject: [PATCH 061/352] fix: Open the extension page on installation (#556) --- package.nls.json | 2 +- package.nls.zh.json | 2 +- src/commands.ts | 2 ++ src/controllers/projectController.ts | 13 ++++++++----- 4 files changed, 12 insertions(+), 7 deletions(-) diff --git a/package.nls.json b/package.nls.json index f2092cca..b7534d58 100644 --- a/package.nls.json +++ b/package.nls.json @@ -40,5 +40,5 @@ "viewsWelcome.workbench.createNewJavaProject": "You can also [open a Java project folder](command:_java.project.open), or create a new Java project by clicking the button below.\n[Create Java Project](command:java.project.create)", "viewsWelcome.workbench.noJavaProject": "No Java projects found in the current workspace. You can [open a Java project folder](command:_java.project.open), or create a new Java project by clicking the button below.\n[Create Java Project](command:java.project.create)", "viewsWelcome.workbench.inLightWeightMode": "To view the projects, you can import the projects into workspace.\n[Import Projects](command:java.server.mode.switch?%5B%22Standard%22,true%5D)", - "viewsWelcome.workbench.installLanguageSupport": "The Java Projects explorer requires [Extension Pack for Java](command:extension.open?%5B%22vscjava.vscode-java-pack%22%5D) to provide full features.\n[Install](command:workbench.extensions.installExtension?%5B%22vscjava.vscode-java-pack%22%5D)" + "viewsWelcome.workbench.installLanguageSupport": "The Java Projects explorer requires [Extension Pack for Java](command:extension.open?%5B%22vscjava.vscode-java-pack%22%5D) to provide full features.\n[Install](command:java.project.installExtension?%5B%22vscjava.vscode-java-pack%22%5D)" } diff --git a/package.nls.zh.json b/package.nls.zh.json index d0da4f57..a24c56cb 100644 --- a/package.nls.zh.json +++ b/package.nls.zh.json @@ -40,5 +40,5 @@ "viewsWelcome.workbench.createNewJavaProject": "您也可以[打开一个 Java 项目目录](command:_java.project.open),或点击下方按钮创建一个新的 Java 项目。\n[创建 Java 项目](command:java.project.create)", "viewsWelcome.workbench.noJavaProject": "当前工作空间未发现 Java 项目,您可以[打开一个 Java 项目目录](command:_java.project.open),或点击下方按钮创建一个新的 Java 项目。\n[创建 Java 项目](command:java.project.create)", "viewsWelcome.workbench.inLightWeightMode": "要浏览项目信息,你可以将项目导入到工作空间中。\n[导入项目](command:java.server.mode.switch?%5B%22Standard%22,true%5D)", - "viewsWelcome.workbench.installLanguageSupport": "Java 项目视图需要安装并激活 [Extension Pack for Java](command:extension.open?%5B%22vscjava.vscode-java-pack%22%5D) 以提供完整的功能。\n[安装](command:workbench.extensions.installExtension?%5B%22vscjava.vscode-java-pack%22%5D)" + "viewsWelcome.workbench.installLanguageSupport": "Java 项目视图需要安装并激活 [Extension Pack for Java](command:extension.open?%5B%22vscjava.vscode-java-pack%22%5D) 以提供完整的功能。\n[安装](command:java.project.installExtension?%5B%22vscjava.vscode-java-pack%22%5D)" } diff --git a/src/commands.ts b/src/commands.ts index 276c08f2..11ffc606 100644 --- a/src/commands.ts +++ b/src/commands.ts @@ -84,6 +84,8 @@ export namespace Commands { export const JAVA_PROJECT_LIST_SOURCE_PATHS = "java.project.listSourcePaths"; + export const INSTALL_EXTENSION = "java.project.installExtension"; + /** * Commands from Visual Studio Code */ diff --git a/src/controllers/projectController.ts b/src/controllers/projectController.ts index fc25104f..355f69c6 100644 --- a/src/controllers/projectController.ts +++ b/src/controllers/projectController.ts @@ -17,6 +17,13 @@ export class ProjectController implements Disposable { this.disposable = Disposable.from( instrumentOperationAsVsCodeCommand(Commands.JAVA_PROJECT_CREATE, () => this.createJavaProject()), instrumentOperationAsVsCodeCommand(Commands.JAVA_PROJECT_OPEN, () => this.openJavaProject()), + instrumentOperationAsVsCodeCommand(Commands.INSTALL_EXTENSION, (extensionId: string) => { + commands.executeCommand("workbench.extensions.installExtension", extensionId); + // So far there is no API to query the extension's state, so we open the extension's homepage + // here, where users can check the state: installing, disabled, installed, etc... + // See: https://github.com/microsoft/vscode/issues/14444 + commands.executeCommand("extension.open", extensionId); + }), ); } @@ -101,11 +108,7 @@ async function ensureExtension(typeName: string, metaData: IProjectTypeMetadata) async function promptInstallExtension(projectType: string, metaData: IProjectTypeMetadata): Promise { const choice: string | undefined = await window.showInformationMessage(`${metaData.extensionName} is required to create ${projectType} projects. Please re-run the command 'Java: Create Java Project...' after the extension is installed.`, "Install"); if (choice === "Install") { - commands.executeCommand("workbench.extensions.installExtension", metaData.extensionId); - // So far there is no API to query the extension's state, so we open the extension's homepage - // here, where users can check the state: installing, disabled, installed, etc... - // See: https://github.com/microsoft/vscode/issues/14444 - commands.executeCommand("extension.open", metaData.extensionId); + commands.executeCommand(Commands.INSTALL_EXTENSION, metaData.extensionId); } } From 7dd7132cfba4a44e93f93000fb39f81d1e624638 Mon Sep 17 00:00:00 2001 From: Shi Chen Date: Sun, 26 Sep 2021 16:35:35 +0800 Subject: [PATCH 062/352] fix: UI test fails since 1.60.0 (#554) * upgrade to test framework 4.2.0 * remove test in mac for temporary --- .github/workflows/linuxUI.yml | 28 +- .github/workflows/macOSUI.yml | 47 -- .github/workflows/windowsUI.yml | 28 +- package-lock.json | 816 +------------------------------- package.json | 3 +- test/invisible.code-workspace | 10 - test/maven.code-workspace | 10 - test/ui/command.test.ts | 60 ++- 8 files changed, 92 insertions(+), 910 deletions(-) delete mode 100644 .github/workflows/macOSUI.yml delete mode 100644 test/invisible.code-workspace delete mode 100644 test/maven.code-workspace diff --git a/.github/workflows/linuxUI.yml b/.github/workflows/linuxUI.yml index fc95efae..b1af59a7 100644 --- a/.github/workflows/linuxUI.yml +++ b/.github/workflows/linuxUI.yml @@ -46,9 +46,35 @@ jobs: - name: Build VSIX file run: vsce package - - name: Test extension + - name: UI Test + continue-on-error: true + id: test run: DISPLAY=:99 npm run test-ui + - name: Retry UI Test 1 + continue-on-error: true + if: steps.test.outcome=='failure' + id: retry1 + run: | + git reset --hard + git clean -fd + DISPLAY=:99 npm run test-ui + + - name: Retry UI Test 2 + continue-on-error: true + if: steps.retry1.outcome=='failure' + id: retry2 + run: | + git reset --hard + git clean -fd + DISPLAY=:99 npm run test-ui + + - name: Set test status + if: ${{ steps.test.outcome=='failure' && steps.retry1.outcome=='failure' && steps.retry2.outcome=='failure' }} + run: | + echo "Tests failed" + exit 1 + - name: Print language server Log if: ${{ failure() }} run: find ./test-resources/settings/User/workspaceStorage/*/redhat.java/jdt_ws/.metadata/.log -print -exec cat '{}' \;; diff --git a/.github/workflows/macOSUI.yml b/.github/workflows/macOSUI.yml deleted file mode 100644 index ba46b085..00000000 --- a/.github/workflows/macOSUI.yml +++ /dev/null @@ -1,47 +0,0 @@ -name: CI - -on: - push: - branches: [ main ] - pull_request: - branches: [ main ] - -jobs: - darwinUI: - name: macOS-UI - runs-on: macos-latest - timeout-minutes: 30 - steps: - - uses: actions/checkout@v2 - - - name: Set up JDK 11 - uses: actions/setup-java@v1 - with: - java-version: '11' - - - name: Setup Node.js environment - uses: actions/setup-node@v2 - with: - node-version: 12 - - - name: Install Node.js modules - run: npm install - - - name: Install Gulp - run: npm install -g gulp - - - name: Install VSCE - run: npm install -g vsce - - - name: Build OSGi bundle - run: npm run build-server - - - name: Build VSIX file - run: vsce package - - - name: Test extension - run: npm run test-ui - - - name: Print language server Log if job failed - if: ${{ failure() }} - run: find ./test-resources/settings/User/workspaceStorage/*/redhat.java/jdt_ws/.metadata/.log -print -exec cat '{}' \;; diff --git a/.github/workflows/windowsUI.yml b/.github/workflows/windowsUI.yml index 67189c30..9c516e0c 100644 --- a/.github/workflows/windowsUI.yml +++ b/.github/workflows/windowsUI.yml @@ -45,9 +45,35 @@ jobs: - name: Build VSIX file run: vsce package - - name: Test extension + - name: UI Test + continue-on-error: true + id: test run: npm run test-ui + - name: Retry UI Test 1 + continue-on-error: true + if: steps.test.outcome=='failure' + id: retry1 + run: | + git reset --hard + git clean -fd + npm run test-ui + + - name: Retry UI Test 2 + continue-on-error: true + if: steps.retry1.outcome=='failure' + id: retry2 + run: | + git reset --hard + git clean -fd + npm run test-ui + + - name: Set test status + if: ${{ steps.test.outcome=='failure' && steps.retry1.outcome=='failure' && steps.retry2.outcome=='failure' }} + run: | + echo "Tests failed" + exit 1 + - name: Print language server Log if job failed if: ${{ failure() }} run: Get-ChildItem -Path ./test-resources/settings/User/workspaceStorage/*/redhat.java/jdt_ws/.metadata/.log | cat diff --git a/package-lock.json b/package-lock.json index 0fd521c4..b1078a83 100644 --- a/package-lock.json +++ b/package-lock.json @@ -143,73 +143,6 @@ "rimraf": "^3.0.2" } }, - "@nut-tree/libnut": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@nut-tree/libnut/-/libnut-2.1.0.tgz", - "integrity": "sha512-aCSbURPPYC6hwJG9lT9JsjWwC8jj4Hpv2CoGIIDh+l4oPvIPTLvGTabOkcmEgz5zIxmUWAJ8kCZsnxsGE4B/EA==", - "dev": true, - "requires": { - "@nut-tree/libnut-darwin": "2.1.0", - "@nut-tree/libnut-linux": "2.1.0", - "@nut-tree/libnut-win32": "2.1.0" - } - }, - "@nut-tree/libnut-darwin": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@nut-tree/libnut-darwin/-/libnut-darwin-2.1.0.tgz", - "integrity": "sha512-gqDrieSng6wKuotx7R7SYa3Eq08+j4GNlV/4EJc+m08x2lGTUO2oyYyr30sYqGp2A+Fx8MBAZjHxJOxd9KnwkQ==", - "dev": true, - "requires": { - "bindings": "1.5.0", - "cmake-js": "6.1.0", - "node-addon-api": "3.0.0" - } - }, - "@nut-tree/libnut-linux": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@nut-tree/libnut-linux/-/libnut-linux-2.1.0.tgz", - "integrity": "sha512-g6UoVtoR6F0aN1BcWgkX40lEZzqU06/GpT2fT5i9b4kWfgcVafnrvqrd+RhG4TPfhAB7LgypNcyEWad49R/j7g==", - "dev": true, - "requires": { - "bindings": "1.5.0", - "cmake-js": "6.1.0", - "node-addon-api": "3.0.0" - } - }, - "@nut-tree/libnut-win32": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@nut-tree/libnut-win32/-/libnut-win32-2.1.0.tgz", - "integrity": "sha512-LsEmC5Jx1Oe3tJ4SrB2yUSd+tI2vIl5DQV8FjscwUZYIAauWX+cMMq6gPui8BSVJbXj+ACWYnORW2O3o7dxKqA==", - "dev": true, - "requires": { - "bindings": "1.5.0", - "cmake-js": "6.1.0", - "node-addon-api": "3.0.0" - } - }, - "@nut-tree/nut-js": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@nut-tree/nut-js/-/nut-js-1.5.0.tgz", - "integrity": "sha512-4RC9daQkn4L49BqzlfY3qpt/HM87FhF7LXqKhQ/8g1LNvIONdlaJoZOxNvw0mJO0zQt1zsZ5bIrxhjwUGlwJGg==", - "dev": true, - "requires": { - "@nut-tree/libnut": "2.1.0", - "clipboardy": "2.0.0", - "opencv4nodejs-prebuilt": "5.3.0-2" - }, - "dependencies": { - "clipboardy": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/clipboardy/-/clipboardy-2.0.0.tgz", - "integrity": "sha512-XbVjHMsss0giNUkp/tV/3eEAZe8i1fZTLzmPKqjE1RGIAWOTiF5D014f6R+g53ZAq0IK3cPrJXFvqE8eQjhFYQ==", - "dev": true, - "requires": { - "arch": "^2.1.1", - "execa": "^1.0.0" - } - } - } - }, "@tootallnate/once": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", @@ -566,12 +499,6 @@ "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", "dev": true }, - "ansi": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/ansi/-/ansi-0.3.1.tgz", - "integrity": "sha1-DELU+xcWDVqa8eSEus4cZpIsGyE=", - "dev": true - }, "ansi-colors": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-1.1.0.tgz", @@ -773,12 +700,6 @@ "diagnostic-channel-publishers": "^0.3.3" } }, - "aproba": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", - "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", - "dev": true - }, "arch": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/arch/-/arch-2.2.0.tgz", @@ -791,16 +712,6 @@ "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=", "dev": true }, - "are-we-there-yet": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.0.6.tgz", - "integrity": "sha1-otKMkxAqpsyWJFomy5VN4G7FPww=", - "dev": true, - "requires": { - "delegates": "^1.0.0", - "readable-stream": "^2.0.0 || ^1.1.13" - } - }, "argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", @@ -998,12 +909,6 @@ "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", "dev": true }, - "at-least-node": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", - "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", - "dev": true - }, "atob": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", @@ -1122,12 +1027,6 @@ } } }, - "base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "dev": true - }, "bcrypt-pbkdf": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", @@ -1170,6 +1069,7 @@ "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", "dev": true, + "optional": true, "requires": { "file-uri-to-path": "1.0.0" } @@ -1232,16 +1132,6 @@ "node-releases": "^1.1.76" } }, - "buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "dev": true, - "requires": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - }, "buffer-alloc": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz", @@ -1288,12 +1178,6 @@ "integrity": "sha512-I7wzHwA3t1/lwXQh+A5PbNvJxgfo5r3xulgpYDB5zckTu/Z9oUK9biouBKQUjEqzaz3HnAT6TYoovmE+GqSf7A==", "dev": true }, - "buffer-shims": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/buffer-shims/-/buffer-shims-1.0.0.tgz", - "integrity": "sha1-mXjOMXOIxkmth5MCjDR37wRKi1E=", - "dev": true - }, "buffers": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/buffers/-/buffers-0.1.1.tgz", @@ -1673,154 +1557,6 @@ } } }, - "cmake-js": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/cmake-js/-/cmake-js-6.1.0.tgz", - "integrity": "sha512-utmukLQftpgrCpGRCaHnkv4K27HZNNFqmBl4vnvccy0xp4c1erxjFU/Lq4wn5ngAhFZmpwBPQfoKWKThjSBiwg==", - "dev": true, - "requires": { - "debug": "^4", - "fs-extra": "^5.0.0", - "is-iojs": "^1.0.1", - "lodash": "^4", - "memory-stream": "0", - "npmlog": "^1.2.0", - "rc": "^1.2.7", - "request": "^2.54.0", - "semver": "^5.0.3", - "splitargs": "0", - "tar": "^4", - "unzipper": "^0.8.13", - "url-join": "0", - "which": "^1.0.9", - "yargs": "^3.6.0" - }, - "dependencies": { - "camelcase": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", - "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=", - "dev": true - }, - "chownr": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", - "dev": true - }, - "debug": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", - "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "fs-extra": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-5.0.0.tgz", - "integrity": "sha512-66Pm4RYbjzdyeuqudYqhFiNBbCIuI9kgRqLPSHIlXHidW8NIQtVdkM1yeZ4lXwuhbTETv3EUGMNHAAw6hiundQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - } - }, - "fs-minipass": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.7.tgz", - "integrity": "sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==", - "dev": true, - "requires": { - "minipass": "^2.6.0" - } - }, - "minipass": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz", - "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==", - "dev": true, - "requires": { - "safe-buffer": "^5.1.2", - "yallist": "^3.0.0" - } - }, - "minizlib": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.3.3.tgz", - "integrity": "sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==", - "dev": true, - "requires": { - "minipass": "^2.9.0" - } - }, - "mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "dev": true, - "requires": { - "minimist": "^1.2.5" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - }, - "tar": { - "version": "4.4.19", - "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.19.tgz", - "integrity": "sha512-a20gEsvHnWe0ygBY8JbxoM4w3SJdhc7ZAuxkLqh+nvNQN2IOt0B5lLgM490X5Hl8FF0dl0tOf2ewFYAlIFgzVA==", - "dev": true, - "requires": { - "chownr": "^1.1.4", - "fs-minipass": "^1.2.7", - "minipass": "^2.9.0", - "minizlib": "^1.3.3", - "mkdirp": "^0.5.5", - "safe-buffer": "^5.2.1", - "yallist": "^3.1.1" - } - }, - "url-join": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/url-join/-/url-join-0.0.1.tgz", - "integrity": "sha1-HbSK1CLTQCRpqH99l73r/k+x48g=", - "dev": true - }, - "yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true - }, - "yargs": { - "version": "3.32.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.32.0.tgz", - "integrity": "sha1-AwiOnr+edWtpdRYR0qXvWRSCyZU=", - "dev": true, - "requires": { - "camelcase": "^2.0.1", - "cliui": "^3.0.3", - "decamelize": "^1.1.1", - "os-locale": "^1.4.0", - "string-width": "^1.0.1", - "window-size": "^0.1.4", - "y18n": "^3.2.0" - } - } - } - }, "code-point-at": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", @@ -1925,12 +1661,6 @@ "typedarray": "^0.0.6" } }, - "console-control-strings": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", - "dev": true - }, "continuation-local-storage": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/continuation-local-storage/-/continuation-local-storage-3.2.1.tgz", @@ -2086,21 +1816,6 @@ "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", "dev": true }, - "decompress-response": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-4.2.1.tgz", - "integrity": "sha512-jOSne2qbyE+/r8G1VU+G/82LBs2Fs4LAsTiLSHOCOMZQl2OKZ6i8i4IyHemTe+/yIXOtTcRQMzPcgyhoFlqPkw==", - "dev": true, - "requires": { - "mimic-response": "^2.0.0" - } - }, - "deep-extend": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", - "dev": true - }, "default-compare": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/default-compare/-/default-compare-1.0.0.tgz", @@ -2180,12 +1895,6 @@ "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", "dev": true }, - "delegates": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", - "dev": true - }, "denodeify": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/denodeify/-/denodeify-1.2.1.tgz", @@ -2198,12 +1907,6 @@ "integrity": "sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=", "dev": true }, - "detect-libc": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", - "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=", - "dev": true - }, "diagnostic-channel": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/diagnostic-channel/-/diagnostic-channel-0.2.0.tgz", @@ -2539,12 +2242,6 @@ } } }, - "expand-template": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", - "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==", - "dev": true - }, "expand-tilde": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", @@ -2738,7 +2435,8 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", - "dev": true + "dev": true, + "optional": true }, "fill-range": { "version": "7.0.1", @@ -3057,19 +2755,6 @@ "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", "dev": true }, - "gauge": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-1.2.7.tgz", - "integrity": "sha1-6c7FSD09TuDvRLYKfZnkk14TbZM=", - "dev": true, - "requires": { - "ansi": "^0.3.0", - "has-unicode": "^2.0.0", - "lodash.pad": "^4.1.0", - "lodash.padend": "^4.1.0", - "lodash.padstart": "^4.1.0" - } - }, "get-caller-file": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", @@ -3123,12 +2808,6 @@ "assert-plus": "^1.0.0" } }, - "github-from-package": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", - "integrity": "sha1-l/tdlr/eiXMxPyDoKI75oWf6ZM4=", - "dev": true - }, "glob": { "version": "7.1.7", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", @@ -3393,12 +3072,6 @@ "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==", "dev": true }, - "has-unicode": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", - "dev": true - }, "has-value": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", @@ -3556,12 +3229,6 @@ "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", "dev": true }, - "ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "dev": true - }, "ignore": { "version": "5.1.8", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", @@ -3768,12 +3435,6 @@ "is-extglob": "^2.1.1" } }, - "is-iojs": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-iojs/-/is-iojs-1.1.0.tgz", - "integrity": "sha1-TBEDO11dlNbqs3dd7cm+fQCDJfE=", - "dev": true - }, "is-negated-glob": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-negated-glob/-/is-negated-glob-1.0.0.tgz", @@ -4123,24 +3784,6 @@ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" }, - "lodash.pad": { - "version": "4.5.1", - "resolved": "https://registry.npmjs.org/lodash.pad/-/lodash.pad-4.5.1.tgz", - "integrity": "sha1-QzCUmoM6fI2iLMIPaibE1Z3runA=", - "dev": true - }, - "lodash.padend": { - "version": "4.6.1", - "resolved": "https://registry.npmjs.org/lodash.padend/-/lodash.padend-4.6.1.tgz", - "integrity": "sha1-U8y6BH0G4VjTEfRdpiX05J5vFm4=", - "dev": true - }, - "lodash.padstart": { - "version": "4.6.1", - "resolved": "https://registry.npmjs.org/lodash.padstart/-/lodash.padstart-4.6.1.tgz", - "integrity": "sha1-0uPuv/DZ05rVD1y9G1KnvOa7YRs=", - "dev": true - }, "log-symbols": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.0.0.tgz", @@ -4380,41 +4023,6 @@ "integrity": "sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4=", "dev": true }, - "memory-stream": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/memory-stream/-/memory-stream-0.0.3.tgz", - "integrity": "sha1-6+jdHDuLw4wOeUHp3dWuvmtN6D8=", - "dev": true, - "requires": { - "readable-stream": "~1.0.26-2" - }, - "dependencies": { - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true - }, - "readable-stream": { - "version": "1.0.34", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", - "dev": true - } - } - }, "merge-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", @@ -4462,12 +4070,6 @@ "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", "dev": true }, - "mimic-response": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-2.1.0.tgz", - "integrity": "sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA==", - "dev": true - }, "minimatch": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", @@ -4555,12 +4157,6 @@ "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", "dev": true }, - "mkdirp-classic": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", - "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", - "dev": true - }, "mocha": { "version": "8.4.0", "resolved": "https://registry.npmjs.org/mocha/-/mocha-8.4.0.tgz", @@ -4884,7 +4480,8 @@ "version": "2.15.0", "resolved": "https://registry.npmjs.org/nan/-/nan-2.15.0.tgz", "integrity": "sha512-8ZtvEnA2c5aYCZYd1cvgdnU6cqwixRoYg70xPLWUws5ORTa/lnw+u4amixRS/Ac5U5mQVgp9pnlSUnbNWFaWZQ==", - "dev": true + "dev": true, + "optional": true }, "nanocolors": { "version": "0.1.5", @@ -4917,21 +4514,6 @@ "to-regex": "^3.0.1" } }, - "napi-build-utils": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz", - "integrity": "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==", - "dev": true - }, - "native-node-utils": { - "version": "0.2.7", - "resolved": "https://registry.npmjs.org/native-node-utils/-/native-node-utils-0.2.7.tgz", - "integrity": "sha512-61v0G3uVxWlXHppSZGwZi+ZEIgGUKI8QvEkEJLb1GVePI7P8SBe+G747z+QMXSt4TxfgbVZP0DyobbRKYVIjdw==", - "dev": true, - "requires": { - "nan": "^2.13.2" - } - }, "neo-async": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", @@ -4950,41 +4532,12 @@ "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", "dev": true }, - "node-abi": { - "version": "2.30.1", - "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-2.30.1.tgz", - "integrity": "sha512-/2D0wOQPgaUWzVSVgRMx+trKJRC2UG4SUc4oCJoXx9Uxjtp0Vy3/kt7zcbxHF8+Z/pK3UloLWzBISg72brfy1w==", - "dev": true, - "requires": { - "semver": "^5.4.1" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - } - } - }, - "node-addon-api": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-3.0.0.tgz", - "integrity": "sha512-sSHCgWfJ+Lui/u+0msF3oyCgvdkhxDbkCS6Q8uiJquzOimkJBvX6hl5aSSA7DR1XbMpdM8r7phjcF63sF4rkKg==", - "dev": true - }, "node-releases": { "version": "1.1.76", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.76.tgz", "integrity": "sha512-9/IECtNr8dXNmPWmFXepT0/7o5eolGesHUa3mtr0KlgnCvnZxwh2qensKL42JJY2vQKC3nIBXetFAqR+PW1CmA==", "dev": true }, - "noop-logger": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/noop-logger/-/noop-logger-0.1.1.tgz", - "integrity": "sha1-lKKxYzxPExdVMAfYlm/Q6EG2pMI=", - "dev": true - }, "normalize-package-data": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", @@ -5029,17 +4582,6 @@ "path-key": "^2.0.0" } }, - "npmlog": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-1.2.1.tgz", - "integrity": "sha1-KOe+YZYJtT960d0wChDWTXFiaLY=", - "dev": true, - "requires": { - "ansi": "~0.3.0", - "are-we-there-yet": "~1.0.0", - "gauge": "~1.2.0" - } - }, "nth-check": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.0.1.tgz", @@ -5061,12 +4603,6 @@ "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", "dev": true }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", - "dev": true - }, "object-copy": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", @@ -5190,59 +4726,6 @@ "mimic-fn": "^2.1.0" } }, - "opencv4nodejs-prebuilt": { - "version": "5.3.0-2", - "resolved": "https://registry.npmjs.org/opencv4nodejs-prebuilt/-/opencv4nodejs-prebuilt-5.3.0-2.tgz", - "integrity": "sha512-l0JealJQRgSnvQHMFDP2mM/hFn8o9zOqPjljGyAzSFXzJZkR0KgXbm66Ezwjsk+IcaSo90+OUMz3D645lNUdVw==", - "dev": true, - "requires": { - "@types/node": ">6", - "nan": "^2.14.0", - "native-node-utils": "^0.2.7", - "npmlog": "^4.1.2", - "prebuild-install": "^5.3.3" - }, - "dependencies": { - "are-we-there-yet": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.7.tgz", - "integrity": "sha512-nxwy40TuMiUGqMyRHgCSWZ9FM4VAoRP4xUYSTv5ImRog+h9yISPbVH7H8fASCIzYn9wlEv4zvFL7uKDMCFQm3g==", - "dev": true, - "requires": { - "delegates": "^1.0.0", - "readable-stream": "^2.0.6" - } - }, - "gauge": { - "version": "2.7.4", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", - "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", - "dev": true, - "requires": { - "aproba": "^1.0.3", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.0", - "object-assign": "^4.1.0", - "signal-exit": "^3.0.0", - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wide-align": "^1.1.0" - } - }, - "npmlog": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", - "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", - "dev": true, - "requires": { - "are-we-there-yet": "~1.1.2", - "console-control-strings": "~1.1.0", - "gauge": "~2.7.3", - "set-blocking": "~2.0.0" - } - } - } - }, "ordered-read-streams": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/ordered-read-streams/-/ordered-read-streams-1.0.1.tgz", @@ -5564,147 +5047,6 @@ "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", "dev": true }, - "prebuild-install": { - "version": "5.3.6", - "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-5.3.6.tgz", - "integrity": "sha512-s8Aai8++QQGi4sSbs/M1Qku62PFK49Jm1CbgXklGz4nmHveDq0wzJkg7Na5QbnO1uNH8K7iqx2EQ/mV0MZEmOg==", - "dev": true, - "requires": { - "detect-libc": "^1.0.3", - "expand-template": "^2.0.3", - "github-from-package": "0.0.0", - "minimist": "^1.2.3", - "mkdirp-classic": "^0.5.3", - "napi-build-utils": "^1.0.1", - "node-abi": "^2.7.0", - "noop-logger": "^0.1.1", - "npmlog": "^4.0.1", - "pump": "^3.0.0", - "rc": "^1.2.7", - "simple-get": "^3.0.3", - "tar-fs": "^2.0.0", - "tunnel-agent": "^0.6.0", - "which-pm-runs": "^1.0.0" - }, - "dependencies": { - "are-we-there-yet": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.7.tgz", - "integrity": "sha512-nxwy40TuMiUGqMyRHgCSWZ9FM4VAoRP4xUYSTv5ImRog+h9yISPbVH7H8fASCIzYn9wlEv4zvFL7uKDMCFQm3g==", - "dev": true, - "requires": { - "delegates": "^1.0.0", - "readable-stream": "^2.0.6" - } - }, - "bl": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", - "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", - "dev": true, - "requires": { - "buffer": "^5.5.0", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" - }, - "dependencies": { - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - } - } - }, - "chownr": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", - "dev": true - }, - "gauge": { - "version": "2.7.4", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", - "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", - "dev": true, - "requires": { - "aproba": "^1.0.3", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.0", - "object-assign": "^4.1.0", - "signal-exit": "^3.0.0", - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wide-align": "^1.1.0" - } - }, - "npmlog": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", - "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", - "dev": true, - "requires": { - "are-we-there-yet": "~1.1.2", - "console-control-strings": "~1.1.0", - "gauge": "~2.7.3", - "set-blocking": "~2.0.0" - } - }, - "pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "tar-fs": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", - "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==", - "dev": true, - "requires": { - "chownr": "^1.1.1", - "mkdirp-classic": "^0.5.2", - "pump": "^3.0.0", - "tar-stream": "^2.1.4" - } - }, - "tar-stream": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", - "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", - "dev": true, - "requires": { - "bl": "^4.0.3", - "end-of-stream": "^1.4.1", - "fs-constants": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^3.1.1" - }, - "dependencies": { - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - } - } - } - } - }, "pretty-hrtime": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz", @@ -5776,26 +5118,6 @@ "safe-buffer": "^5.1.0" } }, - "rc": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "dev": true, - "requires": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - }, - "dependencies": { - "strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", - "dev": true - } - } - }, "read": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/read/-/read-1.0.7.tgz", @@ -6376,23 +5698,6 @@ "integrity": "sha512-rqYhcAnZ6d/vTPGghdrw7iumdcbXpsk1b8IG/rz+VWV51DM0p7XCtMoJ3qhPLIbp3tvyt3pKRbaaEMZYpHto8Q==", "dev": true }, - "simple-concat": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", - "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", - "dev": true - }, - "simple-get": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-3.1.0.tgz", - "integrity": "sha512-bCR6cP+aTdScaQCnQKbPKtJOKDp/hj9EDLJo3Nw4y1QksqaovlW/bnptB6/c1e+qmNIDHRK+oXFDdEqBT8WzUA==", - "dev": true, - "requires": { - "decompress-response": "^4.2.0", - "once": "^1.3.1", - "simple-concat": "^1.0.0" - } - }, "slash": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", @@ -6599,12 +5904,6 @@ "extend-shallow": "^3.0.0" } }, - "splitargs": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/splitargs/-/splitargs-0.0.7.tgz", - "integrity": "sha1-/p965lc3GzOxDLgNoUPPgknPazs=", - "dev": true - }, "sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", @@ -7238,9 +6537,9 @@ "dev": true }, "typescript": { - "version": "3.9.10", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.9.10.tgz", - "integrity": "sha512-w6fIxVE/H1PkLKcCPsFqKE7Kv7QUwhU8qQY2MueZXWx5cPZdwFupLgKK3vntcK98BtNHZtAF4LA/yl2a7k8R6Q==", + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.4.3.tgz", + "integrity": "sha512-4xfscpisVgqqDfPaJo5vkd+Qd/ItkoagnHpufr+i2QCHBsNYp+G7UAoyFl8aPtx879u38wPV65rZ8qbGZijalA==", "dev": true }, "uc.micro": { @@ -7391,52 +6690,6 @@ } } }, - "unzipper": { - "version": "0.8.14", - "resolved": "https://registry.npmjs.org/unzipper/-/unzipper-0.8.14.tgz", - "integrity": "sha512-8rFtE7EP5ssOwGpN2dt1Q4njl0N1hUXJ7sSPz0leU2hRdq6+pra57z4YPBlVqm40vcgv6ooKZEAx48fMTv9x4w==", - "dev": true, - "requires": { - "big-integer": "^1.6.17", - "binary": "~0.3.0", - "bluebird": "~3.4.1", - "buffer-indexof-polyfill": "~1.0.0", - "duplexer2": "~0.1.4", - "fstream": "~1.0.10", - "listenercount": "~1.0.1", - "readable-stream": "~2.1.5", - "setimmediate": "~1.0.4" - }, - "dependencies": { - "process-nextick-args": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", - "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=", - "dev": true - }, - "readable-stream": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.1.5.tgz", - "integrity": "sha1-ZvqLcg4UOLNkaB8q0aY8YYRIydA=", - "dev": true, - "requires": { - "buffer-shims": "^1.0.0", - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "~1.0.0", - "process-nextick-args": "~1.0.6", - "string_decoder": "~0.10.x", - "util-deprecate": "~1.0.1" - } - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", - "dev": true - } - } - }, "upath": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", @@ -7809,47 +7062,6 @@ "integrity": "sha512-87MZai9RM9aM4MBuQjzcDEg1MDlNkvSeF1FnnD4x/3usQfCUXrcptyR2N0BsFbWIRyxV8HZ+qbWVhvrtxm4Pew==", "dev": true }, - "vscode-extension-tester-native": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/vscode-extension-tester-native/-/vscode-extension-tester-native-3.0.2.tgz", - "integrity": "sha512-jWtSU9b8mxJOWHhzF18Qc4uzNvE3+2Ilw7aZ9PQzfJA9zh8C2PUYjKwhCmGaMSGJXFHuVrrRVUZ9inh03QxW/w==", - "dev": true, - "requires": { - "@nut-tree/nut-js": "1.5.0", - "clipboardy": "^2.0.0", - "fs-extra": "^9.0.1" - }, - "dependencies": { - "fs-extra": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", - "dev": true, - "requires": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - } - }, - "jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.6", - "universalify": "^2.0.0" - } - }, - "universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", - "dev": true - } - } - }, "vscode-tas-client": { "version": "0.1.22", "resolved": "https://registry.npmjs.org/vscode-tas-client/-/vscode-tas-client-0.1.22.tgz", @@ -8098,12 +7310,6 @@ "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=", "dev": true }, - "which-pm-runs": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/which-pm-runs/-/which-pm-runs-1.0.0.tgz", - "integrity": "sha1-Zws6+8VS4LVd9rd4DKdGFfI60cs=", - "dev": true - }, "wide-align": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", @@ -8119,12 +7325,6 @@ "integrity": "sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw==", "dev": true }, - "window-size": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.4.tgz", - "integrity": "sha1-+OGqHuWlPsW/FR/6CXQqatdpeHY=", - "dev": true - }, "workerpool": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.1.0.tgz", diff --git a/package.json b/package.json index b2f209b7..0baafd3b 100644 --- a/package.json +++ b/package.json @@ -617,8 +617,7 @@ "ts-loader": "^9.2.6", "tslint": "^5.20.1", "typescript": "^4.4.3", - "vscode-extension-tester": "^4.1.2", - "vscode-extension-tester-native": "^3.0.2", + "vscode-extension-tester": "^4.2.0", "vscode-test": "^1.5.1", "webpack": "^5.53.0", "webpack-cli": "^4.8.0" diff --git a/test/invisible.code-workspace b/test/invisible.code-workspace deleted file mode 100644 index d99f1e3e..00000000 --- a/test/invisible.code-workspace +++ /dev/null @@ -1,10 +0,0 @@ -{ - "folders": [ - { - "path": "invisible" - } - ], - "settings": { - "java.server.launchMode": "Standard" - } -} \ No newline at end of file diff --git a/test/maven.code-workspace b/test/maven.code-workspace deleted file mode 100644 index 73c1b25d..00000000 --- a/test/maven.code-workspace +++ /dev/null @@ -1,10 +0,0 @@ -{ - "folders": [ - { - "path": "maven" - } - ], - "settings": { - "java.server.launchMode": "Standard" - } -} \ No newline at end of file diff --git a/test/ui/command.test.ts b/test/ui/command.test.ts index c86da7f6..e0af096b 100644 --- a/test/ui/command.test.ts +++ b/test/ui/command.test.ts @@ -6,23 +6,23 @@ import * as fse from "fs-extra"; import { platform } from "os"; import * as path from "path"; import * as seleniumWebdriver from "selenium-webdriver"; -import { EditorView, InputBox, ModalDialog, SideBarView, TextEditor, TreeItem, Workbench } from "vscode-extension-tester"; -import { DialogHandler, OpenDialog } from "vscode-extension-tester-native"; +import { EditorView, InputBox, ModalDialog, SideBarView, TextEditor, TreeItem, VSBrowser, Workbench } from "vscode-extension-tester"; import { sleep } from "../util"; // tslint:disable: only-arrow-functions const newProjectName = "helloworld"; -const mavenProjectPath = path.join(__dirname, "..", "..", "..", "test", "maven"); -const mavenWorkspacePath = path.join(__dirname, "..", "..", "..", "test", "maven.code-workspace"); -const invisibleProjectPath = path.join(__dirname, "..", "..", "..", "test", "invisible"); -const invisibleWorkspacePath = path.join(__dirname, "..", "..", "..", "test", "invisible.code-workspace"); -const targetPath = path.join(__dirname, "..", "..", "..", "test", "newProject"); +const testFolder = path.join(__dirname, "..", "..", "..", "test"); +const mavenProjectPath = path.join(testFolder, "maven"); +const invisibleProjectPath = path.join(testFolder, "invisible"); +const targetPath = path.join(testFolder, "newProject"); describe("Command Tests", function() { + let browser: VSBrowser; this.timeout(2 * 60 * 1000 /*ms*/); before(async function() { + browser = VSBrowser.instance; sleep(5000); }); @@ -31,10 +31,7 @@ describe("Command Tests", function() { }); it("Test open maven project", async function() { - await new Workbench().executeCommand("Workspaces: Open Workspace..."); - const dialog: OpenDialog = await DialogHandler.getOpenDialog(); - await dialog.selectPath(mavenWorkspacePath); - await dialog.confirm(); + await browser.openResources(mavenProjectPath); // Close welcome editors let editorView = new EditorView(); let editorGroups = await editorView.getEditorGroups(); @@ -42,8 +39,6 @@ describe("Command Tests", function() { await editorGroup.closeAllEditors(); } const settingsEditor = await new Workbench().openSettings(); - const setting = await settingsEditor.findSetting("Dialog Style", "Window"); - await setting.setValue("custom"); const refreshSetting = await settingsEditor.findSetting("Auto Refresh", "Java", "Dependency"); await refreshSetting.setValue(true); const viewSetting = await settingsEditor.findSetting("Package Presentation", "Java", "Dependency"); @@ -222,10 +217,7 @@ describe("Command Tests", function() { }); it("Test change to invisible project", async function() { - await new Workbench().executeCommand("Workspaces: Open Workspace..."); - const dialog: OpenDialog = await DialogHandler.getOpenDialog(); - await dialog.selectPath(invisibleWorkspacePath); - await dialog.confirm(); + await browser.openResources(invisibleProjectPath); await sleep(1000); const fileExplorerSections = await new SideBarView().getContent().getSections(); const folderNode = await fileExplorerSections[0].findItem("src") as TreeItem; @@ -243,18 +235,22 @@ describe("Command Tests", function() { const projectItem = await section.findItem("invisible") as TreeItem; await projectItem.expand(); await sleep(1000); - const referencedItem = await section.findItem("Referenced Libraries") as TreeItem; + let referencedItem = await section.findItem("Referenced Libraries") as TreeItem; await referencedItem.click(); const buttons = await referencedItem.getActionButtons(); await buttons[0].click(); - const dialog: OpenDialog = await DialogHandler.getOpenDialog(); - await dialog.selectPath(path.join(invisibleProjectPath, "libSource", "simple.jar")); - await dialog.confirm(); + const input = await InputBox.create(); + await input.setText(path.join(invisibleProjectPath, "libSource", "simple.jar")); + await input.confirm(); + await sleep(5000); + referencedItem = await section.findItem("Referenced Libraries") as TreeItem; + await referencedItem.expand(); const simpleItem = await section.findItem("simple.jar") as TreeItem; assert.ok(simpleItem, `Library "simple.jar" should be found`); - await simpleItem!.click(); - const libraryButtons = await simpleItem!.getActionButtons(); + await simpleItem.click(); + const libraryButtons = await simpleItem.getActionButtons(); await libraryButtons[0].click(); + await sleep(5000); }); it("Test java.project.addLibraryFolders", async function() { @@ -271,17 +267,17 @@ describe("Command Tests", function() { .click(buttons[0]) .keyUp(seleniumWebdriver.Key.ALT) .perform(); - const dialog: OpenDialog = await DialogHandler.getOpenDialog(); - await dialog.selectPath(path.join(invisibleProjectPath, "libSource")); - await dialog.confirm(); - await sleep(3000); + await sleep(5000); + const input = await InputBox.create(); + await input.setText(path.join(invisibleProjectPath, "libSource")); + await input.confirm(); + await sleep(5000); referencedItem = await section.findItem("Referenced Libraries") as TreeItem; await referencedItem.expand(); assert.ok(await section.findItem("simple.jar"), `Library "simple.jar" should be found`); }); it("Test java.project.create", async function() { - await fse.remove(targetPath); await fse.ensureDir(targetPath); await new Workbench().executeCommand("java.project.create"); let inputBox = await InputBox.create(); @@ -291,9 +287,11 @@ describe("Command Tests", function() { await quickPick.click(); } } - const dialog: OpenDialog = await DialogHandler.getOpenDialog(); - await dialog.selectPath(targetPath); - await dialog.confirm(); + await sleep(3000); + inputBox = await InputBox.create(); + await inputBox.setText(targetPath); + await inputBox.confirm(); + await sleep(3000); inputBox = await InputBox.create(); await inputBox.setText(newProjectName); await inputBox.confirm(); From 8ebcf9e85736b5db372af859199585aa04dd3051 Mon Sep 17 00:00:00 2001 From: Sheng Chen Date: Mon, 27 Sep 2021 14:23:02 +0800 Subject: [PATCH 063/352] chore: Remove gulp dependencies (#557) --- .github/workflows/linux.yml | 3 - .github/workflows/linuxUI.yml | 3 - .github/workflows/macOS.yml | 3 - .github/workflows/windows.yml | 3 - .github/workflows/windowsUI.yml | 8 +- .vscodeignore | 2 +- README.md | 3 +- gulpfile.js | 43 - package-lock.json | 3261 +------------------------------ package.json | 8 +- scripts/buildJdtlsExt.js | 29 + 11 files changed, 65 insertions(+), 3301 deletions(-) delete mode 100644 gulpfile.js create mode 100644 scripts/buildJdtlsExt.js diff --git a/.github/workflows/linux.yml b/.github/workflows/linux.yml index 411038e5..9a0f2e5c 100644 --- a/.github/workflows/linux.yml +++ b/.github/workflows/linux.yml @@ -34,9 +34,6 @@ jobs: - name: Install Node.js modules run: npm install - - name: Install Gulp - run: npm install -g gulp - - name: Install VSCE run: npm install -g vsce diff --git a/.github/workflows/linuxUI.yml b/.github/workflows/linuxUI.yml index b1af59a7..5b43c542 100644 --- a/.github/workflows/linuxUI.yml +++ b/.github/workflows/linuxUI.yml @@ -34,9 +34,6 @@ jobs: - name: Install Node.js modules run: npm install - - name: Install Gulp - run: npm install -g gulp - - name: Install VSCE run: npm install -g vsce diff --git a/.github/workflows/macOS.yml b/.github/workflows/macOS.yml index 20500227..74adb14a 100644 --- a/.github/workflows/macOS.yml +++ b/.github/workflows/macOS.yml @@ -27,9 +27,6 @@ jobs: - name: Install Node.js modules run: npm install - - name: Install Gulp - run: npm install -g gulp - - name: Install VSCE run: npm install -g vsce diff --git a/.github/workflows/windows.yml b/.github/workflows/windows.yml index 1182b3ea..31b5cf14 100644 --- a/.github/workflows/windows.yml +++ b/.github/workflows/windows.yml @@ -27,9 +27,6 @@ jobs: - name: Install Node.js modules run: npm install - - name: Install Gulp - run: npm install -g gulp --force - - name: Install VSCE run: npm install -g vsce diff --git a/.github/workflows/windowsUI.yml b/.github/workflows/windowsUI.yml index 9c516e0c..368a894f 100644 --- a/.github/workflows/windowsUI.yml +++ b/.github/workflows/windowsUI.yml @@ -27,17 +27,15 @@ jobs: - name: Install Node.js modules run: npm install - - name: Install Gulp - run: npm install -g gulp --force - - name: Install VSCE run: npm install -g vsce - name: Lint - run: gulp tslint + run: npm run tslint - name: Checkstyle - run: gulp checkstyle + working-directory: .\jdtls.ext + run: .\mvnw.cmd checkstyle:check - name: Build OSGi bundle run: npm run build-server diff --git a/.vscodeignore b/.vscodeignore index 0c1dd8f2..ef0d51ac 100644 --- a/.vscodeignore +++ b/.vscodeignore @@ -7,7 +7,7 @@ src/** jdtls.ext/** vscode/** tsconfig.json -gulpfile.js +scripts/build/** .gitignore dist/**/test webpack.*.js diff --git a/README.md b/README.md index f02ff2e7..7c6970cd 100644 --- a/README.md +++ b/README.md @@ -80,9 +80,8 @@ You can tell that the glob pattern is supported. And here's more - you can incl * Go to root folder: ``` -npm install -g gulp npm install -gulp build_server +npm run build-server ``` ## Telemetry diff --git a/gulpfile.js b/gulpfile.js deleted file mode 100644 index 679e1f31..00000000 --- a/gulpfile.js +++ /dev/null @@ -1,43 +0,0 @@ -'use strict'; -const gulp = require('gulp'); -const gulp_tslint = require('gulp-tslint'); -const cp = require('child_process'); - -const server_dir = './jdtls.ext'; - -gulp.task('tslint', () => { - return gulp.src(['**/*.ts', '!**/*.d.ts', '!node_modules/**']) - .pipe(gulp_tslint()) - .pipe(gulp_tslint.report()); -}); - -gulp.task('build_server', () => { - cp.execSync(mvnw()+ ' clean package', {cwd:server_dir, stdio:[0,1,2]} ); - - return gulp.src([ - server_dir + '/com.microsoft.jdtls.ext.core/target/com.microsoft.jdtls.ext.core*.jar', - ]) - .pipe(gulp.dest('./server')) -}); - - -gulp.task('checkstyle', (cb) => { - cp.execSync(mvnw()+ ' checkstyle:check', {cwd:server_dir, stdio:[0,1,2]} ); - cb(); -}); - -function isWin() { - return /^win/.test(process.platform); -} - -function isMac() { - return /^darwin/.test(process.platform); -} - -function isLinux() { - return /^linux/.test(process.platform); -} - -function mvnw() { - return isWin()?"mvnw.cmd":"./mvnw"; -} diff --git a/package-lock.json b/package-lock.json index b1078a83..430b7312 100644 --- a/package-lock.json +++ b/package-lock.json @@ -175,12 +175,6 @@ "integrity": "sha512-C6N5s2ZFtuZRj54k2/zyRhNDjJwwcViAM3Nbm8zjBpbqAdZ00mr0CFxvSKeO8Y/e03WVFLpQMdHYVfUd6SB+Hw==", "dev": true }, - "@types/fancy-log": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@types/fancy-log/-/fancy-log-1.3.0.tgz", - "integrity": "sha512-mQjDxyOM1Cpocd+vm1kZBP7smwKZ4TNokFeds9LV7OZibmPJFEzY3+xZMrKfUdNT71lv8GoCPD6upKwHxubClw==", - "dev": true - }, "@types/fs-extra": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-5.1.0.tgz", @@ -499,42 +493,6 @@ "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", "dev": true }, - "ansi-colors": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-1.1.0.tgz", - "integrity": "sha512-SFKX67auSNoVR38N3L+nvsPjOE0bybKTYbkf5tRvushrAPQ9V75huw0ZxBkKVeRU9kqH3d6HA4xTckbwZ4ixmA==", - "dev": true, - "requires": { - "ansi-wrap": "^0.1.0" - } - }, - "ansi-cyan": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ansi-cyan/-/ansi-cyan-0.1.1.tgz", - "integrity": "sha1-U4rlKK+JgvKK4w2G8vF0VtJgmHM=", - "dev": true, - "requires": { - "ansi-wrap": "0.1.0" - } - }, - "ansi-gray": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ansi-gray/-/ansi-gray-0.1.1.tgz", - "integrity": "sha1-KWLPVOyXksSFEKPetSRDaGHvclE=", - "dev": true, - "requires": { - "ansi-wrap": "0.1.0" - } - }, - "ansi-red": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ansi-red/-/ansi-red-0.1.1.tgz", - "integrity": "sha1-jGOPnRCAgAo1PJwoyKgcpHBdlGw=", - "dev": true, - "requires": { - "ansi-wrap": "0.1.0" - } - }, "ansi-regex": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", @@ -550,145 +508,6 @@ "color-convert": "^2.0.1" } }, - "ansi-wrap": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/ansi-wrap/-/ansi-wrap-0.1.0.tgz", - "integrity": "sha1-qCJQ3bABXponyoLoLqYDu/pF768=", - "dev": true - }, - "anymatch": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", - "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", - "dev": true, - "requires": { - "micromatch": "^3.1.4", - "normalize-path": "^2.1.1" - }, - "dependencies": { - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dev": true, - "requires": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "dev": true, - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - } - }, - "normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", - "dev": true, - "requires": { - "remove-trailing-separator": "^1.0.1" - } - }, - "to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", - "dev": true, - "requires": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - } - } - } - }, - "append-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/append-buffer/-/append-buffer-1.0.2.tgz", - "integrity": "sha1-2CIM9GYIFSXv6lBhTz3mUU36WPE=", - "dev": true, - "requires": { - "buffer-equal": "^1.0.0" - } - }, "applicationinsights": { "version": "1.7.4", "resolved": "https://registry.npmjs.org/applicationinsights/-/applicationinsights-1.7.4.tgz", @@ -706,131 +525,17 @@ "integrity": "sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==", "dev": true }, - "archy": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", - "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=", - "dev": true - }, "argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", "dev": true }, - "arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", - "dev": true - }, - "arr-filter": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/arr-filter/-/arr-filter-1.1.2.tgz", - "integrity": "sha1-Q/3d0JHo7xGqTEXZzcGOLf8XEe4=", - "dev": true, - "requires": { - "make-iterator": "^1.0.0" - } - }, - "arr-flatten": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", - "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", - "dev": true - }, - "arr-map": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/arr-map/-/arr-map-2.0.2.tgz", - "integrity": "sha1-Onc0X/wc814qkYJWAfnljy4kysQ=", - "dev": true, - "requires": { - "make-iterator": "^1.0.0" - } - }, - "arr-union": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", - "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", - "dev": true - }, - "array-each": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/array-each/-/array-each-1.0.1.tgz", - "integrity": "sha1-p5SvDAWrF1KEbudTofIRoFugxE8=", - "dev": true - }, - "array-initial": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/array-initial/-/array-initial-1.1.0.tgz", - "integrity": "sha1-L6dLJnOTccOUe9enrcc74zSz15U=", - "dev": true, - "requires": { - "array-slice": "^1.0.0", - "is-number": "^4.0.0" - }, - "dependencies": { - "is-number": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", - "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", - "dev": true - } - } - }, - "array-last": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/array-last/-/array-last-1.3.0.tgz", - "integrity": "sha512-eOCut5rXlI6aCOS7Z7kCplKRKyiFQ6dHFBem4PwlwKeNFk2/XxTrhRh5T9PyaEWGy/NHTZWbY+nsZlNFJu9rYg==", - "dev": true, - "requires": { - "is-number": "^4.0.0" - }, - "dependencies": { - "is-number": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", - "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", - "dev": true - } - } - }, - "array-slice": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-1.1.0.tgz", - "integrity": "sha512-B1qMD3RBP7O8o0H2KbrXDyB0IccejMF15+87Lvlor12ONPRHP6gTjXMNkt/d3ZuOGbAe66hFmaCfECI24Ufp6w==", - "dev": true - }, - "array-sort": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-sort/-/array-sort-1.0.0.tgz", - "integrity": "sha512-ihLeJkonmdiAsD7vpgN3CRcx2J2S0TiYW+IS/5zHBI7mKUq3ySvBdzzBfD236ubDBQFiiyG3SWCPc+msQ9KoYg==", - "dev": true, - "requires": { - "default-compare": "^1.0.0", - "get-value": "^2.0.6", - "kind-of": "^5.0.2" - }, - "dependencies": { - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true - } - } - }, "array-union": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==" }, - "array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", - "dev": true - }, "asn1": { "version": "0.2.4", "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", @@ -846,30 +551,6 @@ "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", "dev": true }, - "assign-symbols": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", - "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", - "dev": true - }, - "async-done": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/async-done/-/async-done-1.3.2.tgz", - "integrity": "sha512-uYkTP8dw2og1tu1nmza1n1CMW0qb8gWWlwqMmLb7MhBVs4BXrFziT6HXUd+/RlRA/i4H9AkofYloUbs1fwMqlw==", - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.2", - "process-nextick-args": "^2.0.0", - "stream-exhaust": "^1.0.1" - } - }, - "async-each": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", - "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==", - "dev": true - }, "async-hook-jl": { "version": "1.7.6", "resolved": "https://registry.npmjs.org/async-hook-jl/-/async-hook-jl-1.7.6.tgz", @@ -894,27 +575,12 @@ } } }, - "async-settle": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/async-settle/-/async-settle-1.0.0.tgz", - "integrity": "sha1-HQqRS7Aldb7IqPOnTlCA9yssDGs=", - "dev": true, - "requires": { - "async-done": "^1.2.2" - } - }, "asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", "dev": true }, - "atob": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", - "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", - "dev": true - }, "await-lock": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/await-lock/-/await-lock-2.1.0.tgz", @@ -950,83 +616,11 @@ "typed-rest-client": "^1.8.4" } }, - "bach": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/bach/-/bach-1.2.0.tgz", - "integrity": "sha1-Szzpa/JxNPeaG0FKUcFONMO9mIA=", - "dev": true, - "requires": { - "arr-filter": "^1.1.1", - "arr-flatten": "^1.0.1", - "arr-map": "^2.0.0", - "array-each": "^1.0.0", - "array-initial": "^1.0.0", - "array-last": "^1.1.1", - "async-done": "^1.2.2", - "async-settle": "^1.0.0", - "now-and-later": "^2.0.0" - } - }, "balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" }, - "base": { - "version": "0.11.2", - "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", - "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", - "dev": true, - "requires": { - "cache-base": "^1.0.1", - "class-utils": "^0.3.5", - "component-emitter": "^1.2.1", - "define-property": "^1.0.0", - "isobject": "^3.0.1", - "mixin-deep": "^1.2.0", - "pascalcase": "^0.1.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, "bcrypt-pbkdf": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", @@ -1058,22 +652,6 @@ "chainsaw": "~0.1.0" } }, - "binary-extensions": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", - "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", - "dev": true - }, - "bindings": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", - "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", - "dev": true, - "optional": true, - "requires": { - "file-uri-to-path": "1.0.0" - } - }, "bl": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.3.tgz", @@ -1154,12 +732,6 @@ "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=", "dev": true }, - "buffer-equal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/buffer-equal/-/buffer-equal-1.0.0.tgz", - "integrity": "sha1-WWFrSYME1Var1GaWayLu2j7KX74=", - "dev": true - }, "buffer-fill": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz", @@ -1216,23 +788,6 @@ "unique-filename": "^1.1.1" } }, - "cache-base": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", - "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", - "dev": true, - "requires": { - "collection-visit": "^1.0.0", - "component-emitter": "^1.2.1", - "get-value": "^2.0.6", - "has-value": "^1.0.0", - "isobject": "^3.0.1", - "set-value": "^2.0.0", - "to-object-path": "^0.3.0", - "union-value": "^1.0.0", - "unset-value": "^1.0.0" - } - }, "call-bind": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", @@ -1243,12 +798,6 @@ "get-intrinsic": "^1.0.2" } }, - "camelcase": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", - "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=", - "dev": true - }, "caniuse-lite": { "version": "1.0.30001259", "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001259.tgz", @@ -1327,116 +876,6 @@ "domutils": "^2.7.0" } }, - "chokidar": { - "version": "2.1.8", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", - "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", - "dev": true, - "requires": { - "anymatch": "^2.0.0", - "async-each": "^1.0.1", - "braces": "^2.3.2", - "fsevents": "^1.2.7", - "glob-parent": "^3.1.0", - "inherits": "^2.0.3", - "is-binary-path": "^1.0.0", - "is-glob": "^4.0.0", - "normalize-path": "^3.0.0", - "path-is-absolute": "^1.0.0", - "readdirp": "^2.2.1", - "upath": "^1.1.1" - }, - "dependencies": { - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dev": true, - "requires": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - } - }, - "glob-parent": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", - "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", - "dev": true, - "requires": { - "is-glob": "^3.1.0", - "path-dirname": "^1.0.0" - }, - "dependencies": { - "is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", - "dev": true, - "requires": { - "is-extglob": "^2.1.0" - } - } - } - }, - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - } - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - }, - "to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", - "dev": true, - "requires": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - } - } - } - }, "chownr": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", @@ -1449,29 +888,6 @@ "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", "dev": true }, - "class-utils": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", - "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", - "dev": true, - "requires": { - "arr-union": "^3.1.0", - "define-property": "^0.2.5", - "isobject": "^3.0.0", - "static-extend": "^0.1.1" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - } - } - }, "clean-stack": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", @@ -1489,33 +905,10 @@ "is-wsl": "^2.1.1" } }, - "cliui": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", - "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", - "dev": true, - "requires": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wrap-ansi": "^2.0.0" - } - }, - "clone": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", - "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=", - "dev": true - }, - "clone-buffer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/clone-buffer/-/clone-buffer-1.0.0.tgz", - "integrity": "sha1-4+JbIHrE5wGvch4staFnksrD3Fg=", - "dev": true - }, - "clone-deep": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", - "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", + "clone-deep": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", + "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", "dev": true, "requires": { "is-plain-object": "^2.0.4", @@ -1523,23 +916,6 @@ "shallow-clone": "^3.0.0" } }, - "clone-stats": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz", - "integrity": "sha1-s3gt/4u1R04Yuba/D9/ngvh3doA=", - "dev": true - }, - "cloneable-readable": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/cloneable-readable/-/cloneable-readable-1.1.3.tgz", - "integrity": "sha512-2EF8zTQOxYq70Y4XKtorQupqF0m49MBz2/yf5Bj+MHjvpG3Hy7sImifnqD6UA+TKYxeSV+u6qqQPawN5UvnpKQ==", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "process-nextick-args": "^2.0.0", - "readable-stream": "^2.3.5" - } - }, "cls-hooked": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/cls-hooked/-/cls-hooked-4.2.2.tgz", @@ -1563,27 +939,6 @@ "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", "dev": true }, - "collection-map": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/collection-map/-/collection-map-1.0.0.tgz", - "integrity": "sha1-rqDwb40mx4DCt1SUOFVEsiVa8Yw=", - "dev": true, - "requires": { - "arr-map": "^2.0.2", - "for-own": "^1.0.0", - "make-iterator": "^1.0.0" - } - }, - "collection-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", - "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", - "dev": true, - "requires": { - "map-visit": "^1.0.0", - "object-visit": "^1.0.0" - } - }, "color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -1599,12 +954,6 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, - "color-support": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", - "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", - "dev": true - }, "colorette": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.4.0.tgz", @@ -1638,29 +987,11 @@ "integrity": "sha512-W6Af2Iw1z4CB7q4uU4hv646dW9GQuBM+YpC0UvUCWSD8w90SJjp+ujJuXaEMtAXBtSqGfMPuFOVn4/+FlaqfBA==", "dev": true }, - "component-emitter": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", - "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", - "dev": true - }, "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" }, - "concat-stream": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", - "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", - "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" - } - }, "continuation-local-storage": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/continuation-local-storage/-/continuation-local-storage-3.2.1.tgz", @@ -1670,47 +1001,6 @@ "emitter-listener": "^1.1.1" } }, - "convert-source-map": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", - "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.1" - }, - "dependencies": { - "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 - } - } - }, - "copy-descriptor": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", - "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", - "dev": true - }, - "copy-props": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/copy-props/-/copy-props-2.0.5.tgz", - "integrity": "sha512-XBlx8HSqrT0ObQwmSzM7WE5k8FxTV75h1DX1Z3n6NhQ/UYYAvInWYmG06vFt7hQZArE2fuO62aihiWIVQwh1sw==", - "dev": true, - "requires": { - "each-props": "^1.3.2", - "is-plain-object": "^5.0.0" - }, - "dependencies": { - "is-plain-object": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", - "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", - "dev": true - } - } - }, "copy-webpack-plugin": { "version": "6.4.1", "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-6.4.1.tgz", @@ -1776,16 +1066,6 @@ "integrity": "sha512-FYDTSHb/7KXsWICVsxdmiExPjCfRC4qRFBdVwv7Ax9hMnvMmEjP9RfxTEZ3qPZGmADDn2vAKSo9UcN1jKVYscg==", "dev": true }, - "d": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", - "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", - "dev": true, - "requires": { - "es5-ext": "^0.10.50", - "type": "^1.0.1" - } - }, "dashdash": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", @@ -1795,100 +1075,6 @@ "assert-plus": "^1.0.0" } }, - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "dev": true - }, - "decode-uri-component": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", - "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", - "dev": true - }, - "default-compare": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/default-compare/-/default-compare-1.0.0.tgz", - "integrity": "sha512-QWfXlM0EkAbqOCbD/6HjdwT19j7WCkMyiRhWilc4H9/5h/RzTF9gv5LYh1+CmDV5d1rki6KAWLtQale0xt20eQ==", - "dev": true, - "requires": { - "kind-of": "^5.0.2" - }, - "dependencies": { - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true - } - } - }, - "default-resolution": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/default-resolution/-/default-resolution-2.0.0.tgz", - "integrity": "sha1-vLgrqnKtebQmp2cy8aga1t8m1oQ=", - "dev": true - }, - "define-properties": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", - "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", - "dev": true, - "requires": { - "object-keys": "^1.0.12" - } - }, - "define-property": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", - "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", - "dev": true, - "requires": { - "is-descriptor": "^1.0.2", - "isobject": "^3.0.1" - }, - "dependencies": { - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, "delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", @@ -1901,12 +1087,6 @@ "integrity": "sha1-OjYof1A05pnnV3kBBSwubJQlFjE=", "dev": true }, - "detect-file": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", - "integrity": "sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=", - "dev": true - }, "diagnostic-channel": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/diagnostic-channel/-/diagnostic-channel-0.2.0.tgz", @@ -1987,28 +1167,6 @@ "readable-stream": "^2.0.2" } }, - "duplexify": { - "version": "3.7.1", - "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", - "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", - "dev": true, - "requires": { - "end-of-stream": "^1.0.0", - "inherits": "^2.0.1", - "readable-stream": "^2.0.0", - "stream-shift": "^1.0.0" - } - }, - "each-props": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/each-props/-/each-props-1.3.2.tgz", - "integrity": "sha512-vV0Hem3zAGkJAyU7JSjixeU66rwdynTAa1vofCrSA5fEln+m67Az9CcnkVD776/fsN/UjIWmBDoNRS6t6G9RfA==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.1", - "object.defaults": "^1.1.0" - } - }, "ecc-jsbn": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", @@ -2076,65 +1234,12 @@ "integrity": "sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw==", "dev": true }, - "error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dev": true, - "requires": { - "is-arrayish": "^0.2.1" - } - }, "es-module-lexer": { "version": "0.7.1", "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.7.1.tgz", "integrity": "sha512-MgtWFl5No+4S3TmhDmCz2ObFGm6lEpTnzbQi+Dd+pw4mlTIZTmM2iAs5gRlmx5zS9luzobCSBSI90JM/1/JgOw==", "dev": true }, - "es5-ext": { - "version": "0.10.53", - "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.53.tgz", - "integrity": "sha512-Xs2Stw6NiNHWypzRTY1MtaG/uJlwCk8kH81920ma8mvN8Xq1gsfhZvpkImLQArw8AHnv8MT2I45J3c0R8slE+Q==", - "dev": true, - "requires": { - "es6-iterator": "~2.0.3", - "es6-symbol": "~3.1.3", - "next-tick": "~1.0.0" - } - }, - "es6-iterator": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", - "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", - "dev": true, - "requires": { - "d": "1", - "es5-ext": "^0.10.35", - "es6-symbol": "^3.1.1" - } - }, - "es6-symbol": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz", - "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==", - "dev": true, - "requires": { - "d": "^1.0.1", - "ext": "^1.1.2" - } - }, - "es6-weak-map": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.3.tgz", - "integrity": "sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==", - "dev": true, - "requires": { - "d": "1", - "es5-ext": "^0.10.46", - "es6-iterator": "^2.0.3", - "es6-symbol": "^3.1.1" - } - }, "escalade": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", @@ -2207,177 +1312,18 @@ "strip-eof": "^1.0.0" } }, - "expand-brackets": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", - "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", - "dev": true, - "requires": { - "debug": "^2.3.3", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "posix-character-classes": "^0.1.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "expand-tilde": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", - "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=", - "dev": true, - "requires": { - "homedir-polyfill": "^1.0.1" - } - }, - "ext": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/ext/-/ext-1.5.0.tgz", - "integrity": "sha512-+ONcYoWj/SoQwUofMr94aGu05Ou4FepKi7N7b+O8T4jVfyIsZQV1/xeS8jpaBzF0csAk0KLXoHCxU7cKYZjo1Q==", - "dev": true, - "requires": { - "type": "^2.5.0" - }, - "dependencies": { - "type": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/type/-/type-2.5.0.tgz", - "integrity": "sha512-180WMDQaIMm3+7hGXWf12GtdniDEy7nYcyFMKJn/eZz/6tSLXrUN9V0wKSbMjej0I1WHWbpREDEKHtqPQa9NNw==", - "dev": true - } - } - }, "extend": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", "dev": true }, - "extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "dev": true, - "requires": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4" - } - } - } - }, - "extglob": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", - "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", - "dev": true, - "requires": { - "array-unique": "^0.3.2", - "define-property": "^1.0.0", - "expand-brackets": "^2.1.4", - "extend-shallow": "^2.0.1", - "fragment-cache": "^0.2.1", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, "extsprintf": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", "dev": true }, - "fancy-log": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/fancy-log/-/fancy-log-1.3.3.tgz", - "integrity": "sha512-k9oEhlyc0FrVh25qYuSELjr8oxsCoc4/LEZfg2iJJrfEk/tZL9bCoJE47gqAvI2m/AUjluCS4+3I0eTx8n3AEw==", - "dev": true, - "requires": { - "ansi-gray": "^0.1.1", - "color-support": "^1.1.3", - "parse-node-version": "^1.0.0", - "time-stamp": "^1.0.0" - } - }, "fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", @@ -2402,12 +1348,6 @@ "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", "dev": true }, - "fast-levenshtein": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-1.1.4.tgz", - "integrity": "sha1-5qdUzI8V5YmHqpy9J69m/W9OWvk=", - "dev": true - }, "fastest-levenshtein": { "version": "1.0.12", "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.12.tgz", @@ -2431,13 +1371,6 @@ "pend": "~1.2.0" } }, - "file-uri-to-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", - "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", - "dev": true, - "optional": true - }, "fill-range": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", @@ -2467,178 +1400,17 @@ "path-exists": "^4.0.0" } }, - "findup-sync": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-3.0.0.tgz", - "integrity": "sha512-YbffarhcicEhOrm4CtrwdKBdCuz576RLdhJDsIfvNtxUuhdRet1qZcsMjqbePtAseKdAnDyM/IyXbu7PRPRLYg==", - "dev": true, - "requires": { - "detect-file": "^1.0.0", - "is-glob": "^4.0.0", - "micromatch": "^3.0.4", - "resolve-dir": "^1.0.1" - }, - "dependencies": { - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dev": true, - "requires": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "dev": true, - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - } - }, - "to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", - "dev": true, - "requires": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - } - } - } - }, - "fined": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/fined/-/fined-1.2.0.tgz", - "integrity": "sha512-ZYDqPLGxDkDhDZBjZBb+oD1+j0rA4E0pXY50eplAAOPg2N/gUBSSk5IM1/QhPfyVo19lJ+CvXpqfvk+b2p/8Ng==", - "dev": true, - "requires": { - "expand-tilde": "^2.0.2", - "is-plain-object": "^2.0.3", - "object.defaults": "^1.1.0", - "object.pick": "^1.2.0", - "parse-filepath": "^1.0.1" - } - }, - "flagged-respawn": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/flagged-respawn/-/flagged-respawn-1.0.1.tgz", - "integrity": "sha512-lNaHNVymajmk0OJMBn8fVUAU1BtDeKIqKoVhk4xAALB57aALg6b4W0MfJ/cUE0g9YBXy5XhSlPIpYIJ7HaY/3Q==", - "dev": true - }, "flat": { "version": "5.0.2", "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", "dev": true }, - "flush-write-stream": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz", - "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "readable-stream": "^2.3.6" - } - }, "follow-redirects": { "version": "1.14.4", "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.4.tgz", "integrity": "sha512-zwGkiSXC1MUJG/qmeIFH2HBJx9u0V46QGUe3YR1fXG8bXQxq7fLj0RjLZQ5nubr9qNJUZrH+xUcwXEoXNpfS+g==" }, - "for-in": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", - "dev": true - }, - "for-own": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz", - "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=", - "dev": true, - "requires": { - "for-in": "^1.0.1" - } - }, "forever-agent": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", @@ -2656,15 +1428,6 @@ "mime-types": "^2.1.12" } }, - "fragment-cache": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", - "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", - "dev": true, - "requires": { - "map-cache": "^0.2.2" - } - }, "fs-constants": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", @@ -2690,33 +1453,12 @@ "minipass": "^3.0.0" } }, - "fs-mkdirp-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-mkdirp-stream/-/fs-mkdirp-stream-1.0.0.tgz", - "integrity": "sha1-C3gV/DIBxqaeFNuYzgmMFpNSWes=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.11", - "through2": "^2.0.3" - } - }, "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", "dev": true }, - "fsevents": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", - "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", - "dev": true, - "optional": true, - "requires": { - "bindings": "^1.5.0", - "nan": "^2.12.1" - } - }, "fstream": { "version": "1.0.12", "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.12.tgz", @@ -2755,12 +1497,6 @@ "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", "dev": true }, - "get-caller-file": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", - "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", - "dev": true - }, "get-intrinsic": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", @@ -2793,12 +1529,6 @@ } } }, - "get-value": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", - "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", - "dev": true - }, "getpass": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", @@ -2830,90 +1560,12 @@ "is-glob": "^4.0.1" } }, - "glob-stream": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/glob-stream/-/glob-stream-6.1.0.tgz", - "integrity": "sha1-cEXJlBOz65SIjYOrRtC0BMx73eQ=", - "dev": true, - "requires": { - "extend": "^3.0.0", - "glob": "^7.1.1", - "glob-parent": "^3.1.0", - "is-negated-glob": "^1.0.0", - "ordered-read-streams": "^1.0.0", - "pumpify": "^1.3.5", - "readable-stream": "^2.1.5", - "remove-trailing-separator": "^1.0.1", - "to-absolute-glob": "^2.0.0", - "unique-stream": "^2.0.2" - }, - "dependencies": { - "glob-parent": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", - "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", - "dev": true, - "requires": { - "is-glob": "^3.1.0", - "path-dirname": "^1.0.0" - } - }, - "is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", - "dev": true, - "requires": { - "is-extglob": "^2.1.0" - } - } - } - }, "glob-to-regexp": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", "dev": true }, - "glob-watcher": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/glob-watcher/-/glob-watcher-5.0.5.tgz", - "integrity": "sha512-zOZgGGEHPklZNjZQaZ9f41i7F2YwE+tS5ZHrDhbBCk3stwahn5vQxnFmBJZHoYdusR6R1bLSXeGUy/BhctwKzw==", - "dev": true, - "requires": { - "anymatch": "^2.0.0", - "async-done": "^1.2.0", - "chokidar": "^2.0.0", - "is-negated-glob": "^1.0.0", - "just-debounce": "^1.0.0", - "normalize-path": "^3.0.0", - "object.defaults": "^1.1.0" - } - }, - "global-modules": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", - "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", - "dev": true, - "requires": { - "global-prefix": "^1.0.1", - "is-windows": "^1.0.1", - "resolve-dir": "^1.0.0" - } - }, - "global-prefix": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", - "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=", - "dev": true, - "requires": { - "expand-tilde": "^2.0.2", - "homedir-polyfill": "^1.0.1", - "ini": "^1.3.4", - "is-windows": "^1.0.1", - "which": "^1.2.14" - } - }, "globby": { "version": "11.0.1", "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.1.tgz", @@ -2927,15 +1579,6 @@ "slash": "^3.0.0" } }, - "glogg": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/glogg/-/glogg-1.0.2.tgz", - "integrity": "sha512-5mwUoSuBk44Y4EshyiqcH95ZntbDdTQqA3QYSrxmzj28Ai0vXBGMH1ApSANH14j2sIRtqCEyg6PfsuP7ElOEDA==", - "dev": true, - "requires": { - "sparkles": "^1.0.0" - } - }, "graceful-fs": { "version": "4.2.8", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz", @@ -2947,94 +1590,6 @@ "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", "dev": true }, - "gulp": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/gulp/-/gulp-4.0.2.tgz", - "integrity": "sha512-dvEs27SCZt2ibF29xYgmnwwCYZxdxhQ/+LFWlbAW8y7jt68L/65402Lz3+CKy0Ov4rOs+NERmDq7YlZaDqUIfA==", - "dev": true, - "requires": { - "glob-watcher": "^5.0.3", - "gulp-cli": "^2.2.0", - "undertaker": "^1.2.1", - "vinyl-fs": "^3.0.0" - }, - "dependencies": { - "gulp-cli": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/gulp-cli/-/gulp-cli-2.3.0.tgz", - "integrity": "sha512-zzGBl5fHo0EKSXsHzjspp3y5CONegCm8ErO5Qh0UzFzk2y4tMvzLWhoDokADbarfZRL2pGpRp7yt6gfJX4ph7A==", - "dev": true, - "requires": { - "ansi-colors": "^1.0.1", - "archy": "^1.0.0", - "array-sort": "^1.0.0", - "color-support": "^1.1.3", - "concat-stream": "^1.6.0", - "copy-props": "^2.0.1", - "fancy-log": "^1.3.2", - "gulplog": "^1.0.0", - "interpret": "^1.4.0", - "isobject": "^3.0.1", - "liftoff": "^3.1.0", - "matchdep": "^2.0.0", - "mute-stdout": "^1.0.0", - "pretty-hrtime": "^1.0.0", - "replace-homedir": "^1.0.0", - "semver-greatest-satisfied-range": "^1.1.0", - "v8flags": "^3.2.0", - "yargs": "^7.1.0" - } - } - } - }, - "gulp-copy": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/gulp-copy/-/gulp-copy-4.0.1.tgz", - "integrity": "sha512-UbdAwmEiVNNv55KAiUYWOP6Za7h8JPHNNyekNx8Gyc5XRlpUzTrlEclps939nOeiDPsd6jUtT2LmfavJirbZQg==", - "dev": true, - "requires": { - "gulp": "^4.0.0", - "plugin-error": "^0.1.2", - "through2": "^2.0.3" - } - }, - "gulp-tslint": { - "version": "8.1.4", - "resolved": "https://registry.npmjs.org/gulp-tslint/-/gulp-tslint-8.1.4.tgz", - "integrity": "sha512-wBoZIEMJRz9urHwolsvQpngA9l931p6g/Liwz1b/KrsVP6jEBFZv/o0NS1TFCQZi/l8mXxz8+v3twhf4HOXxPQ==", - "dev": true, - "requires": { - "@types/fancy-log": "1.3.0", - "ansi-colors": "^1.0.1", - "fancy-log": "1.3.3", - "map-stream": "~0.0.7", - "plugin-error": "1.0.1", - "through": "~2.3.8" - }, - "dependencies": { - "plugin-error": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/plugin-error/-/plugin-error-1.0.1.tgz", - "integrity": "sha512-L1zP0dk7vGweZME2i+EeakvUNqSrdiI3F91TwEoYiGrAfUXmVv6fJIq4g82PAXxNsWOp0J7ZqQy/3Szz0ajTxA==", - "dev": true, - "requires": { - "ansi-colors": "^1.0.1", - "arr-diff": "^4.0.0", - "arr-union": "^3.1.0", - "extend-shallow": "^3.0.2" - } - } - } - }, - "gulplog": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/gulplog/-/gulplog-1.0.0.tgz", - "integrity": "sha1-4oxNRdBey77YGDY86PnFkmIp/+U=", - "dev": true, - "requires": { - "glogg": "^1.0.0" - } - }, "har-schema": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", @@ -3072,79 +1627,12 @@ "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==", "dev": true }, - "has-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", - "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", - "dev": true, - "requires": { - "get-value": "^2.0.6", - "has-values": "^1.0.0", - "isobject": "^3.0.0" - } - }, - "has-values": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", - "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", - "dev": true, - "requires": { - "is-number": "^3.0.0", - "kind-of": "^4.0.0" - }, - "dependencies": { - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "kind-of": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", - "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, "he": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", "dev": true }, - "homedir-polyfill": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", - "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", - "dev": true, - "requires": { - "parse-passwd": "^1.0.0" - } - }, - "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 - }, "htmlparser2": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", @@ -3284,75 +1772,6 @@ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "dev": true }, - "ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "dev": true - }, - "interpret": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", - "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", - "dev": true - }, - "invert-kv": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", - "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=", - "dev": true - }, - "is-absolute": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz", - "integrity": "sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==", - "dev": true, - "requires": { - "is-relative": "^1.0.0", - "is-windows": "^1.0.1" - } - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", - "dev": true - }, - "is-binary-path": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", - "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", - "dev": true, - "requires": { - "binary-extensions": "^1.0.0" - } - }, - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, "is-core-module": { "version": "2.6.0", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.6.0.tgz", @@ -3362,57 +1781,12 @@ "has": "^1.0.3" } }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "dependencies": { - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true - } - } - }, "is-docker": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", "dev": true }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "dev": true - }, "is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", @@ -3435,12 +1809,6 @@ "is-extglob": "^2.1.1" } }, - "is-negated-glob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-negated-glob/-/is-negated-glob-1.0.0.tgz", - "integrity": "sha1-aRC8pdqMleeEtXUbl2z1oQ/uNtI=", - "dev": true - }, "is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", @@ -3461,15 +1829,6 @@ "isobject": "^3.0.1" } }, - "is-relative": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz", - "integrity": "sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==", - "dev": true, - "requires": { - "is-unc-path": "^1.0.0" - } - }, "is-stream": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", @@ -3482,33 +1841,6 @@ "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", "dev": true }, - "is-unc-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz", - "integrity": "sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==", - "dev": true, - "requires": { - "unc-path-regex": "^0.1.2" - } - }, - "is-utf8": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", - "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", - "dev": true - }, - "is-valid-glob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-valid-glob/-/is-valid-glob-1.0.0.tgz", - "integrity": "sha1-Kb8+/3Ab4tTTFdusw5vDn+j2Aao=", - "dev": true - }, - "is-windows": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", - "dev": true - }, "is-wsl": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", @@ -3592,12 +1924,6 @@ "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", "dev": true }, - "json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", - "dev": true - }, "json-stringify-safe": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", @@ -3645,93 +1971,34 @@ "set-immediate-shim": "~1.0.1" } }, - "just-debounce": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/just-debounce/-/just-debounce-1.1.0.tgz", - "integrity": "sha512-qpcRocdkUmf+UTNBYx5w6dexX5J31AKK1OmPwH630a83DdVVUIngk55RSAiIGpQyoH0dlr872VHfPjnQnK1qDQ==", - "dev": true - }, "kind-of": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", "dev": true }, - "last-run": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/last-run/-/last-run-1.1.1.tgz", - "integrity": "sha1-RblpQsF7HHnHchmCWbqUO+v4yls=", + "leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "dev": true + }, + "lie": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", + "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", "dev": true, "requires": { - "default-resolution": "^2.0.0", - "es6-weak-map": "^2.0.1" + "immediate": "~3.0.5" } }, - "lazystream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.0.tgz", - "integrity": "sha1-9plf4PggOS9hOWvolGJAe7dxaOQ=", + "linkify-it": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-2.2.0.tgz", + "integrity": "sha512-GnAl/knGn+i1U/wjBz3akz2stz+HrHLsxMwHQGofCDfPvlf+gDKN58UtfmUquTY4/MXeE2x7k19KQmeoZi94Iw==", "dev": true, "requires": { - "readable-stream": "^2.0.5" - } - }, - "lcid": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", - "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", - "dev": true, - "requires": { - "invert-kv": "^1.0.0" - } - }, - "lead": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lead/-/lead-1.0.0.tgz", - "integrity": "sha1-bxT5mje+Op3XhPVJVpDlkDRm7kI=", - "dev": true, - "requires": { - "flush-write-stream": "^1.0.2" - } - }, - "leven": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", - "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", - "dev": true - }, - "lie": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", - "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", - "dev": true, - "requires": { - "immediate": "~3.0.5" - } - }, - "liftoff": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/liftoff/-/liftoff-3.1.0.tgz", - "integrity": "sha512-DlIPlJUkCV0Ips2zf2pJP0unEoT1kwYhiiPUGF3s/jtxTCjziNLoiVVh+jqWOWeFi6mmwQ5fNxvAUyPad4Dfog==", - "dev": true, - "requires": { - "extend": "^3.0.0", - "findup-sync": "^3.0.0", - "fined": "^1.0.1", - "flagged-respawn": "^1.0.0", - "is-plain-object": "^2.0.4", - "object.map": "^1.0.0", - "rechoir": "^0.6.2", - "resolve": "^1.1.7" - } - }, - "linkify-it": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-2.2.0.tgz", - "integrity": "sha512-GnAl/knGn+i1U/wjBz3akz2stz+HrHLsxMwHQGofCDfPvlf+gDKN58UtfmUquTY4/MXeE2x7k19KQmeoZi94Iw==", - "dev": true, - "requires": { - "uc.micro": "^1.0.1" + "uc.micro": "^1.0.1" } }, "listenercount": { @@ -3740,19 +2007,6 @@ "integrity": "sha1-hMinKrWcRyUyFIDJdeZQg0LnCTc=", "dev": true }, - "load-json-file": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", - "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^2.2.0", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0", - "strip-bom": "^2.0.0" - } - }, "loader-runner": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.2.0.tgz", @@ -3819,36 +2073,6 @@ } } }, - "make-iterator": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/make-iterator/-/make-iterator-1.0.1.tgz", - "integrity": "sha512-pxiuXh0iVEq7VM7KMIhs5gxsfxCux2URptUQaXo4iZZJxBAzTPOLE2BumO5dbfVYq/hBJFBR/a1mFDmOx5AGmw==", - "dev": true, - "requires": { - "kind-of": "^6.0.2" - } - }, - "map-cache": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", - "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", - "dev": true - }, - "map-stream": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/map-stream/-/map-stream-0.0.7.tgz", - "integrity": "sha1-ih8HiW2CsQkmvTdEokIACfiJdKg=", - "dev": true - }, - "map-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", - "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", - "dev": true, - "requires": { - "object-visit": "^1.0.0" - } - }, "markdown-it": { "version": "10.0.0", "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-10.0.0.tgz", @@ -3879,144 +2103,6 @@ } } }, - "matchdep": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/matchdep/-/matchdep-2.0.0.tgz", - "integrity": "sha1-xvNINKDY28OzfCfui7yyfHd1WC4=", - "dev": true, - "requires": { - "findup-sync": "^2.0.0", - "micromatch": "^3.0.4", - "resolve": "^1.4.0", - "stack-trace": "0.0.10" - }, - "dependencies": { - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dev": true, - "requires": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "findup-sync": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-2.0.0.tgz", - "integrity": "sha1-kyaxSIwi0aYIhlCoaQGy2akKLLw=", - "dev": true, - "requires": { - "detect-file": "^1.0.0", - "is-glob": "^3.1.0", - "micromatch": "^3.0.4", - "resolve-dir": "^1.0.1" - } - }, - "is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", - "dev": true, - "requires": { - "is-extglob": "^2.1.0" - } - }, - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "dev": true, - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - } - }, - "to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", - "dev": true, - "requires": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - } - } - } - }, "mdurl": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", @@ -4130,27 +2216,6 @@ "yallist": "^4.0.0" } }, - "mixin-deep": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", - "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", - "dev": true, - "requires": { - "for-in": "^1.0.2", - "is-extendable": "^1.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4" - } - } - } - }, "mkdirp": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", @@ -4458,31 +2523,12 @@ } } }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - }, - "mute-stdout": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mute-stdout/-/mute-stdout-1.0.1.tgz", - "integrity": "sha512-kDcwXR4PS7caBpuRYYBUz9iVixUk3anO3f5OYFiIPwK/20vCzKCHyKoulbiDY1S53zD2bxUpxN/IJ+TnXjfvxg==", - "dev": true - }, "mute-stream": { "version": "0.0.8", "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", "dev": true }, - "nan": { - "version": "2.15.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.15.0.tgz", - "integrity": "sha512-8ZtvEnA2c5aYCZYd1cvgdnU6cqwixRoYg70xPLWUws5ORTa/lnw+u4amixRS/Ac5U5mQVgp9pnlSUnbNWFaWZQ==", - "dev": true, - "optional": true - }, "nanocolors": { "version": "0.1.5", "resolved": "https://registry.npmjs.org/nanocolors/-/nanocolors-0.1.5.tgz", @@ -4495,37 +2541,12 @@ "integrity": "sha512-a1cQNyczgKbLX9jwbS/+d7W8fX/RfgYR7lVWwWOGIPNgK2m0MWvrGF6/m4kk6U3QcFMnZf3RIhL0v2Jgh/0Uxw==", "dev": true }, - "nanomatch": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", - "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", - "dev": true, - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "fragment-cache": "^0.2.1", - "is-windows": "^1.0.2", - "kind-of": "^6.0.2", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - } - }, "neo-async": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", "dev": true }, - "next-tick": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz", - "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=", - "dev": true - }, "nice-try": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", @@ -4538,41 +2559,12 @@ "integrity": "sha512-9/IECtNr8dXNmPWmFXepT0/7o5eolGesHUa3mtr0KlgnCvnZxwh2qensKL42JJY2vQKC3nIBXetFAqR+PW1CmA==", "dev": true }, - "normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "dev": true, - "requires": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - } - } - }, "normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", "dev": true }, - "now-and-later": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/now-and-later/-/now-and-later-2.0.1.tgz", - "integrity": "sha512-KGvQ0cB70AQfg107Xvs/Fbu+dGmZoTRJp2TaPwcwQm3/7PteUyN2BCgk8KBMPGBUXZdVwyWS8fDCGFygBm19UQ==", - "dev": true, - "requires": { - "once": "^1.3.2" - } - }, "npm-run-path": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", @@ -4603,111 +2595,12 @@ "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", "dev": true }, - "object-copy": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", - "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", - "dev": true, - "requires": { - "copy-descriptor": "^0.1.0", - "define-property": "^0.2.5", - "kind-of": "^3.0.3" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, "object-inspect": { "version": "1.11.0", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.11.0.tgz", "integrity": "sha512-jp7ikS6Sd3GxQfZJPyH3cjcbJF6GZPClgdV+EFygjFLQ5FmW/dRUnTd9PQ9k0JhoNDabWFbpF1yCdSWCC6gexg==", "dev": true }, - "object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "dev": true - }, - "object-visit": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", - "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", - "dev": true, - "requires": { - "isobject": "^3.0.0" - } - }, - "object.assign": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", - "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", - "dev": true, - "requires": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3", - "has-symbols": "^1.0.1", - "object-keys": "^1.1.1" - } - }, - "object.defaults": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/object.defaults/-/object.defaults-1.1.0.tgz", - "integrity": "sha1-On+GgzS0B96gbaFtiNXNKeQ1/s8=", - "dev": true, - "requires": { - "array-each": "^1.0.1", - "array-slice": "^1.0.0", - "for-own": "^1.0.0", - "isobject": "^3.0.0" - } - }, - "object.map": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object.map/-/object.map-1.0.1.tgz", - "integrity": "sha1-z4Plncj8wK1fQlDh94s7gb2AHTc=", - "dev": true, - "requires": { - "for-own": "^1.0.0", - "make-iterator": "^1.0.0" - } - }, - "object.pick": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", - "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", - "dev": true, - "requires": { - "isobject": "^3.0.1" - } - }, - "object.reduce": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object.reduce/-/object.reduce-1.0.1.tgz", - "integrity": "sha1-b+NI8qx/oPlcpiEiZZkJaCW7A60=", - "dev": true, - "requires": { - "for-own": "^1.0.0", - "make-iterator": "^1.0.0" - } - }, "once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", @@ -4726,30 +2619,12 @@ "mimic-fn": "^2.1.0" } }, - "ordered-read-streams": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/ordered-read-streams/-/ordered-read-streams-1.0.1.tgz", - "integrity": "sha1-d8DLN8QVJdZBZtmQ/61+xqDhNj4=", - "dev": true, - "requires": { - "readable-stream": "^2.0.1" - } - }, "os-homedir": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", "dev": true }, - "os-locale": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", - "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", - "dev": true, - "requires": { - "lcid": "^1.0.0" - } - }, "os-tmpdir": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", @@ -4822,38 +2697,6 @@ "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", "dev": true }, - "parse-filepath": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/parse-filepath/-/parse-filepath-1.0.2.tgz", - "integrity": "sha1-pjISf1Oq89FYdvWHLz/6x2PWyJE=", - "dev": true, - "requires": { - "is-absolute": "^1.0.0", - "map-cache": "^0.2.0", - "path-root": "^0.1.1" - } - }, - "parse-json": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", - "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", - "dev": true, - "requires": { - "error-ex": "^1.2.0" - } - }, - "parse-node-version": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parse-node-version/-/parse-node-version-1.0.1.tgz", - "integrity": "sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==", - "dev": true - }, - "parse-passwd": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", - "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=", - "dev": true - }, "parse-semver": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/parse-semver/-/parse-semver-1.1.1.tgz", @@ -4886,18 +2729,6 @@ "parse5": "^6.0.1" } }, - "pascalcase": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", - "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", - "dev": true - }, - "path-dirname": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", - "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", - "dev": true - }, "path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", @@ -4922,21 +2753,6 @@ "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", "dev": true }, - "path-root": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/path-root/-/path-root-0.1.1.tgz", - "integrity": "sha1-mkpoFMrBwM1zNgqV8yCDyOpHRbc=", - "dev": true, - "requires": { - "path-root-regex": "^0.1.0" - } - }, - "path-root-regex": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/path-root-regex/-/path-root-regex-0.1.2.tgz", - "integrity": "sha1-v8zcjfWxLcUsi0PsONGNcsBLqW0=", - "dev": true - }, "path-type": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", @@ -4959,27 +2775,6 @@ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz", "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==" }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - }, - "pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", - "dev": true - }, - "pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", - "dev": true, - "requires": { - "pinkie": "^2.0.0" - } - }, "pkg-dir": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", @@ -4989,70 +2784,6 @@ "find-up": "^4.0.0" } }, - "plugin-error": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/plugin-error/-/plugin-error-0.1.2.tgz", - "integrity": "sha1-O5uzM1zPAPQl4HQ34ZJ2ln2kes4=", - "dev": true, - "requires": { - "ansi-cyan": "^0.1.1", - "ansi-red": "^0.1.1", - "arr-diff": "^1.0.1", - "arr-union": "^2.0.1", - "extend-shallow": "^1.1.2" - }, - "dependencies": { - "arr-diff": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-1.1.0.tgz", - "integrity": "sha1-aHwydYFjWI/vfeezb6vklesaOZo=", - "dev": true, - "requires": { - "arr-flatten": "^1.0.1", - "array-slice": "^0.2.3" - } - }, - "arr-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-2.1.0.tgz", - "integrity": "sha1-IPnqtexw9cfSFbEHexw5Fh0pLH0=", - "dev": true - }, - "array-slice": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-0.2.3.tgz", - "integrity": "sha1-3Tz7gO15c6dRF82sabC5nshhhvU=", - "dev": true - }, - "extend-shallow": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-1.1.4.tgz", - "integrity": "sha1-Gda/lN/AnXa6cR85uHLSH/TdkHE=", - "dev": true, - "requires": { - "kind-of": "^1.1.0" - } - }, - "kind-of": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-1.1.0.tgz", - "integrity": "sha1-FAo9LUGjbS78+pN3tiwk+ElaXEQ=", - "dev": true - } - } - }, - "posix-character-classes": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", - "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", - "dev": true - }, - "pretty-hrtime": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz", - "integrity": "sha1-t+PqQkNaTJsnWdmeDyAesZWALuE=", - "dev": true - }, "process-nextick-args": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", @@ -5071,27 +2802,6 @@ "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==", "dev": true }, - "pump": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", - "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "pumpify": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", - "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", - "dev": true, - "requires": { - "duplexify": "^3.6.0", - "inherits": "^2.0.3", - "pump": "^2.0.0" - } - }, "punycode": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", @@ -5127,61 +2837,6 @@ "mute-stream": "~0.0.4" } }, - "read-pkg": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", - "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", - "dev": true, - "requires": { - "load-json-file": "^1.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^1.0.0" - }, - "dependencies": { - "path-type": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", - "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" - } - } - } - }, - "read-pkg-up": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", - "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", - "dev": true, - "requires": { - "find-up": "^1.0.0", - "read-pkg": "^1.0.0" - }, - "dependencies": { - "find-up": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", - "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", - "dev": true, - "requires": { - "path-exists": "^2.0.0", - "pinkie-promise": "^2.0.0" - } - }, - "path-exists": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", - "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", - "dev": true, - "requires": { - "pinkie-promise": "^2.0.0" - } - } - } - }, "readable-stream": { "version": "2.3.7", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", @@ -5205,197 +2860,6 @@ } } }, - "readdirp": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", - "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.11", - "micromatch": "^3.1.10", - "readable-stream": "^2.0.2" - }, - "dependencies": { - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dev": true, - "requires": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "dev": true, - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - } - }, - "to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", - "dev": true, - "requires": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - } - } - } - }, - "rechoir": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", - "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", - "dev": true, - "requires": { - "resolve": "^1.1.6" - } - }, - "regex-not": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", - "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", - "dev": true, - "requires": { - "extend-shallow": "^3.0.2", - "safe-regex": "^1.1.0" - } - }, - "remove-bom-buffer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/remove-bom-buffer/-/remove-bom-buffer-3.0.0.tgz", - "integrity": "sha512-8v2rWhaakv18qcvNeli2mZ/TMTL2nEyAKRvzo1WtnZBl15SHyEhrCu2/xKlJyUFKHiHgfXIyuY6g2dObJJycXQ==", - "dev": true, - "requires": { - "is-buffer": "^1.1.5", - "is-utf8": "^0.2.1" - } - }, - "remove-bom-stream": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/remove-bom-stream/-/remove-bom-stream-1.2.0.tgz", - "integrity": "sha1-BfGlk/FuQuH7kOv1nejlaVJflSM=", - "dev": true, - "requires": { - "remove-bom-buffer": "^3.0.0", - "safe-buffer": "^5.1.0", - "through2": "^2.0.3" - } - }, - "remove-trailing-separator": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", - "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", - "dev": true - }, - "repeat-element": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.4.tgz", - "integrity": "sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==", - "dev": true - }, - "repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", - "dev": true - }, - "replace-ext": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.1.tgz", - "integrity": "sha512-yD5BHCe7quCgBph4rMQ+0KkIRKwWCrHDOX1p1Gp6HwjPM5kVoCdKGNhN7ydqqsX6lJEnQDKZ/tFMiEdQ1dvPEw==", - "dev": true - }, - "replace-homedir": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/replace-homedir/-/replace-homedir-1.0.0.tgz", - "integrity": "sha1-6H9tUTuSjd6AgmDBK+f+xv9ueYw=", - "dev": true, - "requires": { - "homedir-polyfill": "^1.0.1", - "is-absolute": "^1.0.0", - "remove-trailing-separator": "^1.1.0" - } - }, "request": { "version": "2.88.2", "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", @@ -5430,12 +2894,6 @@ "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", "dev": true }, - "require-main-filename": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", - "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", - "dev": true - }, "resolve": { "version": "1.20.0", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", @@ -5455,43 +2913,12 @@ "resolve-from": "^5.0.0" } }, - "resolve-dir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", - "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=", - "dev": true, - "requires": { - "expand-tilde": "^2.0.0", - "global-modules": "^1.0.0" - } - }, "resolve-from": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", "dev": true }, - "resolve-options": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/resolve-options/-/resolve-options-1.1.0.tgz", - "integrity": "sha1-MrueOcBtZzONyTeMDW1gdFZq0TE=", - "dev": true, - "requires": { - "value-or-function": "^3.0.0" - } - }, - "resolve-url": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", - "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", - "dev": true - }, - "ret": { - "version": "0.1.15", - "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", - "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", - "dev": true - }, "reusify": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", @@ -5520,15 +2947,6 @@ "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", "dev": true }, - "safe-regex": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", - "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", - "dev": true, - "requires": { - "ret": "~0.1.10" - } - }, "safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", @@ -5593,59 +3011,21 @@ "lru-cache": "^6.0.0" } }, - "semver-greatest-satisfied-range": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/semver-greatest-satisfied-range/-/semver-greatest-satisfied-range-1.1.0.tgz", - "integrity": "sha1-E+jCZYq5aRywzXEJMkAoDTb3els=", - "dev": true, - "requires": { - "sver-compat": "^1.5.0" - } - }, "serialize-javascript": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-5.0.1.tgz", "integrity": "sha512-SaaNal9imEO737H2c05Og0/8LUXG7EnsZyMa8MzkmuHoELfT6txuj0cMqRj6zfPKnmQ1yasR4PCJc8x+M4JSPA==", "dev": true, - "requires": { - "randombytes": "^2.1.0" - } - }, - "set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", - "dev": true - }, - "set-immediate-shim": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz", - "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=", - "dev": true - }, - "set-value": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", - "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-extendable": "^0.1.1", - "is-plain-object": "^2.0.3", - "split-string": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } + "requires": { + "randombytes": "^2.1.0" } }, + "set-immediate-shim": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz", + "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=", + "dev": true + }, "setimmediate": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", @@ -5703,119 +3083,6 @@ "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==" }, - "snapdragon": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", - "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", - "dev": true, - "requires": { - "base": "^0.11.1", - "debug": "^2.2.0", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "map-cache": "^0.2.2", - "source-map": "^0.5.6", - "source-map-resolve": "^0.5.0", - "use": "^3.1.0" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - } - } - }, - "snapdragon-node": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", - "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", - "dev": true, - "requires": { - "define-property": "^1.0.0", - "isobject": "^3.0.0", - "snapdragon-util": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, - "snapdragon-util": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", - "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", - "dev": true, - "requires": { - "kind-of": "^3.2.0" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, "source-list-map": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", @@ -5828,19 +3095,6 @@ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true }, - "source-map-resolve": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", - "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", - "dev": true, - "requires": { - "atob": "^2.1.2", - "decode-uri-component": "^0.2.0", - "resolve-url": "^0.2.1", - "source-map-url": "^0.4.0", - "urix": "^0.1.0" - } - }, "source-map-support": { "version": "0.5.20", "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.20.tgz", @@ -5851,59 +3105,6 @@ "source-map": "^0.6.0" } }, - "source-map-url": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.1.tgz", - "integrity": "sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==", - "dev": true - }, - "sparkles": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/sparkles/-/sparkles-1.0.1.tgz", - "integrity": "sha512-dSO0DDYUahUt/0/pD/Is3VIm5TGJjludZ0HVymmhYF6eNA53PVLhnUk0znSYbH8IYBuJdCE+1luR22jNLMaQdw==", - "dev": true - }, - "spdx-correct": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", - "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", - "dev": true, - "requires": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-exceptions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", - "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", - "dev": true - }, - "spdx-expression-parse": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", - "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", - "dev": true, - "requires": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-license-ids": { - "version": "3.0.10", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.10.tgz", - "integrity": "sha512-oie3/+gKf7QtpitB0LYLETe+k8SifzsX4KixvpOsbI6S0kRiRQ5MKOio8eMSAKQ17N06+wdEOXRiId+zOxo0hA==", - "dev": true - }, - "split-string": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", - "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", - "dev": true, - "requires": { - "extend-shallow": "^3.0.0" - } - }, "sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", @@ -5941,45 +3142,6 @@ "resolved": "https://registry.npmjs.org/stack-chain/-/stack-chain-1.3.7.tgz", "integrity": "sha1-0ZLJ/06moiyUxN1FkXHj8AzqEoU=" }, - "stack-trace": { - "version": "0.0.10", - "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", - "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=", - "dev": true - }, - "static-extend": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", - "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", - "dev": true, - "requires": { - "define-property": "^0.2.5", - "object-copy": "^0.1.0" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - } - } - }, - "stream-exhaust": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/stream-exhaust/-/stream-exhaust-1.0.2.tgz", - "integrity": "sha512-b/qaq/GlBK5xaq1yrK9/zFcyRSTNxmcZwFLGSTG0mXgZl/4Z6GgiyYOXOvY7N3eEvFRAG1bkDRz5EPGSvPYQlw==", - "dev": true - }, - "stream-shift": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz", - "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==", - "dev": true - }, "string-width": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", @@ -6017,15 +3179,6 @@ "ansi-regex": "^2.0.0" } }, - "strip-bom": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", - "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", - "dev": true, - "requires": { - "is-utf8": "^0.2.0" - } - }, "strip-eof": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", @@ -6053,16 +3206,6 @@ "has-flag": "^4.0.0" } }, - "sver-compat": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/sver-compat/-/sver-compat-1.5.0.tgz", - "integrity": "sha1-PPh9/rTQe0o/FIJ7wYaz/QxkXNg=", - "dev": true, - "requires": { - "es6-iterator": "^2.0.1", - "es6-symbol": "^3.1.1" - } - }, "tapable": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", @@ -6198,38 +3341,6 @@ } } }, - "through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", - "dev": true - }, - "through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dev": true, - "requires": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - }, - "through2-filter": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/through2-filter/-/through2-filter-3.0.0.tgz", - "integrity": "sha512-jaRjI2WxN3W1V8/FMZ9HKIBXixtiqs3SQSX4/YGIiP3gL6djW48VoZq9tDqeCWs3MT8YY5wb/zli8VW8snY1CA==", - "dev": true, - "requires": { - "through2": "~2.0.0", - "xtend": "~4.0.0" - } - }, - "time-stamp": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-1.1.0.tgz", - "integrity": "sha1-dkpaEa9QVhkhsTPztE5hhofg9cM=", - "dev": true - }, "tmp": { "version": "0.0.30", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.30.tgz", @@ -6239,54 +3350,12 @@ "os-tmpdir": "~1.0.1" } }, - "to-absolute-glob": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/to-absolute-glob/-/to-absolute-glob-2.0.2.tgz", - "integrity": "sha1-GGX0PZ50sIItufFFt4z/fQ98hJs=", - "dev": true, - "requires": { - "is-absolute": "^1.0.0", - "is-negated-glob": "^1.0.0" - } - }, "to-buffer": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/to-buffer/-/to-buffer-1.1.1.tgz", "integrity": "sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg==", "dev": true }, - "to-object-path": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", - "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "to-regex": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", - "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", - "dev": true, - "requires": { - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "regex-not": "^1.0.2", - "safe-regex": "^1.1.0" - } - }, "to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -6295,15 +3364,6 @@ "is-number": "^7.0.0" } }, - "to-through": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-through/-/to-through-2.0.0.tgz", - "integrity": "sha1-/JKtq6ByZHvAtn1rA2ZKoZUJOvY=", - "dev": true, - "requires": { - "through2": "^2.0.3" - } - }, "tough-cookie": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", @@ -6502,12 +3562,6 @@ "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", "dev": true }, - "type": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", - "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==", - "dev": true - }, "typed-rest-client": { "version": "1.8.6", "resolved": "https://registry.npmjs.org/typed-rest-client/-/typed-rest-client-1.8.6.tgz", @@ -6530,12 +3584,6 @@ } } }, - "typedarray": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", - "dev": true - }, "typescript": { "version": "4.4.3", "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.4.3.tgz", @@ -6548,54 +3596,12 @@ "integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==", "dev": true }, - "unc-path-regex": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", - "integrity": "sha1-5z3T17DXxe2G+6xrCufYxqadUPo=", - "dev": true - }, "underscore": { "version": "1.13.1", "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.1.tgz", "integrity": "sha512-hzSoAVtJF+3ZtiFX0VgfFPHEDRm7Y/QPjGyNo4TVdnDTdft3tr8hEkD25a1jC+TjTuE7tkHGKkhwCgs9dgBB2g==", "dev": true }, - "undertaker": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/undertaker/-/undertaker-1.3.0.tgz", - "integrity": "sha512-/RXwi5m/Mu3H6IHQGww3GNt1PNXlbeCuclF2QYR14L/2CHPz3DFZkvB5hZ0N/QUkiXWCACML2jXViIQEQc2MLg==", - "dev": true, - "requires": { - "arr-flatten": "^1.0.1", - "arr-map": "^2.0.0", - "bach": "^1.0.0", - "collection-map": "^1.0.0", - "es6-weak-map": "^2.0.1", - "fast-levenshtein": "^1.0.0", - "last-run": "^1.1.0", - "object.defaults": "^1.0.0", - "object.reduce": "^1.0.0", - "undertaker-registry": "^1.0.0" - } - }, - "undertaker-registry": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/undertaker-registry/-/undertaker-registry-1.0.1.tgz", - "integrity": "sha1-XkvaMI5KiirlhPm5pDWaSZglzFA=", - "dev": true - }, - "union-value": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", - "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", - "dev": true, - "requires": { - "arr-union": "^3.1.0", - "get-value": "^2.0.6", - "is-extendable": "^0.1.1", - "set-value": "^2.0.1" - } - }, "unique-filename": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", @@ -6614,61 +3620,11 @@ "imurmurhash": "^0.1.4" } }, - "unique-stream": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/unique-stream/-/unique-stream-2.3.1.tgz", - "integrity": "sha512-2nY4TnBE70yoxHkDli7DMazpWiP7xMdCYqU2nBRO0UB+ZpEkGsSija7MvmvnZFUeC+mrgiUfcHSr3LmRFIg4+A==", - "dev": true, - "requires": { - "json-stable-stringify-without-jsonify": "^1.0.1", - "through2-filter": "^3.0.0" - } - }, "universalify": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==" }, - "unset-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", - "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", - "dev": true, - "requires": { - "has-value": "^0.3.1", - "isobject": "^3.0.0" - }, - "dependencies": { - "has-value": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", - "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", - "dev": true, - "requires": { - "get-value": "^2.0.3", - "has-values": "^0.1.4", - "isobject": "^2.0.0" - }, - "dependencies": { - "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "dev": true, - "requires": { - "isarray": "1.0.0" - } - } - } - }, - "has-values": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", - "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", - "dev": true - } - } - }, "unzip-stream": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/unzip-stream/-/unzip-stream-0.3.1.tgz", @@ -6690,12 +3646,6 @@ } } }, - "upath": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", - "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", - "dev": true - }, "uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", @@ -6705,24 +3655,12 @@ "punycode": "^2.1.0" } }, - "urix": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", - "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", - "dev": true - }, "url-join": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/url-join/-/url-join-1.1.0.tgz", "integrity": "sha1-dBxsL0WWxIMNZxhGCSDQySIC3Hg=", "dev": true }, - "use": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", - "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", - "dev": true - }, "utf8-byte-length": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/utf8-byte-length/-/utf8-byte-length-1.0.4.tgz", @@ -6746,31 +3684,6 @@ "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", "dev": true }, - "v8flags": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-3.2.0.tgz", - "integrity": "sha512-mH8etigqMfiGWdeXpaaqGfs6BndypxusHHcv2qSHyZkGEznCd/qAXCWWRzeowtL54147cktFOC4P5y+kl8d8Jg==", - "dev": true, - "requires": { - "homedir-polyfill": "^1.0.1" - } - }, - "validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", - "dev": true, - "requires": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "value-or-function": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/value-or-function/-/value-or-function-3.0.0.tgz", - "integrity": "sha1-HCQ6ULWVwb5Up1S/7OhWO5/42BM=", - "dev": true - }, "verror": { "version": "1.10.0", "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", @@ -6790,71 +3703,6 @@ } } }, - "vinyl": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.2.1.tgz", - "integrity": "sha512-LII3bXRFBZLlezoG5FfZVcXflZgWP/4dCwKtxd5ky9+LOtM4CS3bIRQsmR1KMnMW07jpE8fqR2lcxPZ+8sJIcw==", - "dev": true, - "requires": { - "clone": "^2.1.1", - "clone-buffer": "^1.0.0", - "clone-stats": "^1.0.0", - "cloneable-readable": "^1.0.0", - "remove-trailing-separator": "^1.0.1", - "replace-ext": "^1.0.0" - } - }, - "vinyl-fs": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/vinyl-fs/-/vinyl-fs-3.0.3.tgz", - "integrity": "sha512-vIu34EkyNyJxmP0jscNzWBSygh7VWhqun6RmqVfXePrOwi9lhvRs//dOaGOTRUQr4tx7/zd26Tk5WeSVZitgng==", - "dev": true, - "requires": { - "fs-mkdirp-stream": "^1.0.0", - "glob-stream": "^6.1.0", - "graceful-fs": "^4.0.0", - "is-valid-glob": "^1.0.0", - "lazystream": "^1.0.0", - "lead": "^1.0.0", - "object.assign": "^4.0.4", - "pumpify": "^1.3.5", - "readable-stream": "^2.3.3", - "remove-bom-buffer": "^3.0.0", - "remove-bom-stream": "^1.2.0", - "resolve-options": "^1.1.0", - "through2": "^2.0.0", - "to-through": "^2.0.0", - "value-or-function": "^3.0.0", - "vinyl": "^2.0.0", - "vinyl-sourcemap": "^1.1.0" - } - }, - "vinyl-sourcemap": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/vinyl-sourcemap/-/vinyl-sourcemap-1.1.0.tgz", - "integrity": "sha1-kqgAWTo4cDqM2xHYswCtS+Y7PhY=", - "dev": true, - "requires": { - "append-buffer": "^1.0.2", - "convert-source-map": "^1.5.0", - "graceful-fs": "^4.1.6", - "normalize-path": "^2.1.1", - "now-and-later": "^2.0.0", - "remove-bom-buffer": "^3.0.0", - "vinyl": "^2.0.0" - }, - "dependencies": { - "normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", - "dev": true, - "requires": { - "remove-trailing-separator": "^1.0.1" - } - } - } - }, "vsce": { "version": "1.99.0", "resolved": "https://registry.npmjs.org/vsce/-/vsce-1.99.0.tgz", @@ -7304,12 +4152,6 @@ "isexe": "^2.0.0" } }, - "which-module": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz", - "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=", - "dev": true - }, "wide-align": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", @@ -7331,16 +4173,6 @@ "integrity": "sha512-toV7q9rWNYha963Pl/qyeZ6wG+3nnsyvolaNUS8+R5Wtw6qJPTxIlOP1ZSvcGhEJw+l3HMMmtiNo9Gl61G4GVg==", "dev": true }, - "wrap-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", - "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", - "dev": true, - "requires": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1" - } - }, "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", @@ -7369,49 +4201,12 @@ "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", "dev": true }, - "y18n": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.2.tgz", - "integrity": "sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ==", - "dev": true - }, "yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "dev": true }, - "yargs": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-7.1.2.tgz", - "integrity": "sha512-ZEjj/dQYQy0Zx0lgLMLR8QuaqTihnxirir7EwUHp1Axq4e3+k8jXU5K0VLbNvedv1f4EWtBonDIZm0NUr+jCcA==", - "dev": true, - "requires": { - "camelcase": "^3.0.0", - "cliui": "^3.2.0", - "decamelize": "^1.1.1", - "get-caller-file": "^1.0.1", - "os-locale": "^1.4.0", - "read-pkg-up": "^1.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^1.0.1", - "set-blocking": "^2.0.0", - "string-width": "^1.0.2", - "which-module": "^1.0.0", - "y18n": "^3.2.1", - "yargs-parser": "^5.0.1" - } - }, - "yargs-parser": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-5.0.1.tgz", - "integrity": "sha512-wpav5XYiddjXxirPoCTUPbqM0PXvJ9hiBMvuJgInvo4/lAOTZzUprArw17q2O1P2+GHhbBr18/iQwjL5Z9BqfA==", - "dev": true, - "requires": { - "camelcase": "^3.0.0", - "object.assign": "^4.1.0" - } - }, "yargs-unparser": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", diff --git a/package.json b/package.json index 0baafd3b..de49791f 100644 --- a/package.json +++ b/package.json @@ -595,8 +595,9 @@ "watch": "webpack --mode development --watch", "test": "tsc -p . && node ./dist/test/index.js", "test-ui": "tsc -p . && node ./dist/test/ui/index.js", - "build-server": "./node_modules/.bin/gulp build_server", - "vscode:prepublish": "tsc -p ./ && webpack --mode production" + "build-server": "node scripts/buildJdtlsExt.js", + "vscode:prepublish": "tsc -p ./ && webpack --mode production", + "tslint": "tslint -t verbose --project tsconfig.json" }, "devDependencies": { "@types/fs-extra": "^5.1.0", @@ -609,9 +610,6 @@ "@types/vscode": "1.60.0", "copy-webpack-plugin": "^6.4.1", "glob": "^7.1.6", - "gulp": "^4.0.2", - "gulp-copy": "^4.0.1", - "gulp-tslint": "^8.1.4", "mocha": "^8.3.1", "semver": "^7.3.5", "ts-loader": "^9.2.6", diff --git a/scripts/buildJdtlsExt.js b/scripts/buildJdtlsExt.js new file mode 100644 index 00000000..c6623dbf --- /dev/null +++ b/scripts/buildJdtlsExt.js @@ -0,0 +1,29 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT license. + +const cp = require('child_process'); +const fse = require('fs-extra'); +const path = require('path'); + +const server_dir = path.resolve('jdtls.ext'); + +cp.execSync(mvnw()+ ' clean package', {cwd:server_dir, stdio:[0,1,2]} ); +copy(path.join(server_dir, 'com.microsoft.jdtls.ext.core/target'), path.resolve('server'), (file) => { + return /^com.microsoft.jdtls.ext.core.*.jar$/.test(file); +}); + +function copy(sourceFolder, targetFolder, fileFilter) { + const jars = fse.readdirSync(sourceFolder).filter(file => fileFilter(file)); + fse.ensureDirSync(targetFolder); + for (const jar of jars) { + fse.copyFileSync(path.join(sourceFolder, jar), path.join(targetFolder, path.basename(jar))); + } +} + +function isWin() { + return /^win/.test(process.platform); +} + +function mvnw() { + return isWin()?"mvnw.cmd":"./mvnw"; +} From 6efa6fd46ac62aece1eb7b33be8347e8acef252d Mon Sep 17 00:00:00 2001 From: Sheng Chen Date: Tue, 19 Oct 2021 13:13:14 +0800 Subject: [PATCH 064/352] chore: Add ThridPartyNotice.txt (#559) --- ThirdPartyNotices.txt | 780 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 780 insertions(+) create mode 100644 ThirdPartyNotices.txt diff --git a/ThirdPartyNotices.txt b/ThirdPartyNotices.txt new file mode 100644 index 00000000..6ba2873d --- /dev/null +++ b/ThirdPartyNotices.txt @@ -0,0 +1,780 @@ +vscode-java-dependency + +THIRD-PARTY SOFTWARE NOTICES AND INFORMATION +Do Not Translate or Localize + +This project incorporates components from the projects listed below. The original copyright notices and the licenses under which Microsoft received such components are set forth below. Microsoft reserves all rights not expressly granted herein, whether by implication, estoppel or otherwise. + +1. apache/commons-io (https://github.com/apache/commons-io) +2. Apache Commons Lang (https://commons.apache.org/proper/commons-lang/) +3. Eskibear/vscode-extension-telemetry-wrapper (https://github.com/Eskibear/vscode-extension-telemetry-wrapper) +4. google/gson (https://github.com/google/gson) +5. ide/await-lock (https://github.com/ide/await-lock) +6. isaacs/minimatch (https://github.com/isaacs/minimatch) +7. jprichardson/node-fs-extra (https://github.com/jprichardson/node-fs-extra) +8. lodash/lodash (https://github.com/lodash/lodash) +9. sindresorhus/globby (https://github.com/sindresorhus/globby) + +%% apache/commons-io NOTICES AND INFORMATION BEGIN HERE +========================================= + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +========================================= +END OF apache/commons-io NOTICES AND INFORMATION + +%% Apache Commons Lang NOTICES AND INFORMATION BEGIN HERE +========================================= + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +========================================= +END OF Apache Commons Lang NOTICES AND INFORMATION + +%% Eskibear/vscode-extension-telemetry-wrapper NOTICES AND INFORMATION BEGIN HERE +========================================= +Copyright 2018 Yan Zhang + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +========================================= +END OF Eskibear/vscode-extension-telemetry-wrapper NOTICES AND INFORMATION + +%% google/gson NOTICES AND INFORMATION BEGIN HERE +========================================= + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +========================================= +END OF google/gson NOTICES AND INFORMATION + +%% ide/await-lock NOTICES AND INFORMATION BEGIN HERE +========================================= +The MIT License (MIT) + +Copyright (c) 2015-present James Ide + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +========================================= +END OF ide/await-lock NOTICES AND INFORMATION + +%% isaacs/minimatch NOTICES AND INFORMATION BEGIN HERE +========================================= +The ISC License + +Copyright (c) Isaac Z. Schlueter and Contributors + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +========================================= +END OF isaacs/minimatch NOTICES AND INFORMATION + +%% jprichardson/node-fs-extra NOTICES AND INFORMATION BEGIN HERE +========================================= +(The MIT License) + +Copyright (c) 2011-2017 JP Richardson + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files +(the 'Software'), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, + merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE +WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS +OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +========================================= +END OF jprichardson/node-fs-extra NOTICES AND INFORMATION + +%% lodash/lodash NOTICES AND INFORMATION BEGIN HERE +========================================= +The MIT License + +Copyright JS Foundation and other contributors + +Based on Underscore.js, copyright Jeremy Ashkenas, +DocumentCloud and Investigative Reporters & Editors + +This software consists of voluntary contributions made by many +individuals. For exact contribution history, see the revision history +available at https://github.com/lodash/lodash + +The following license applies to all parts of this software except as +documented below: + +==== + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +==== + +Copyright and related rights for sample code are waived via CC0. Sample +code is defined as all source code displayed within the prose of the +documentation. + +CC0: http://creativecommons.org/publicdomain/zero/1.0/ + +==== + +Files located in the node_modules and vendor directories are externally +maintained libraries used by this software which have their own +licenses; we recommend you read them, as their terms may differ from the +terms above. +========================================= +END OF lodash/lodash NOTICES AND INFORMATION + +%% sindresorhus/globby NOTICES AND INFORMATION BEGIN HERE +========================================= +MIT License + +Copyright (c) Sindre Sorhus (https://sindresorhus.com) + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +========================================= +END OF sindresorhus/globby NOTICES AND INFORMATION From fd306e48af651d63455b8292bc1a6547f04cccd5 Mon Sep 17 00:00:00 2001 From: Shi Chen Date: Tue, 7 Dec 2021 14:04:49 +0800 Subject: [PATCH 065/352] chore: use node 14 for GitHub Actions (#570) --- .github/workflows/linux.yml | 2 +- .github/workflows/linuxUI.yml | 2 +- .github/workflows/macOS.yml | 2 +- .github/workflows/windows.yml | 2 +- .github/workflows/windowsUI.yml | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/workflows/linux.yml b/.github/workflows/linux.yml index 9a0f2e5c..19f2cb79 100644 --- a/.github/workflows/linux.yml +++ b/.github/workflows/linux.yml @@ -29,7 +29,7 @@ jobs: - name: Setup Node.js environment uses: actions/setup-node@v2 with: - node-version: 12 + node-version: 14 - name: Install Node.js modules run: npm install diff --git a/.github/workflows/linuxUI.yml b/.github/workflows/linuxUI.yml index 5b43c542..addaa264 100644 --- a/.github/workflows/linuxUI.yml +++ b/.github/workflows/linuxUI.yml @@ -29,7 +29,7 @@ jobs: - name: Setup Node.js environment uses: actions/setup-node@v2 with: - node-version: 12 + node-version: 14 - name: Install Node.js modules run: npm install diff --git a/.github/workflows/macOS.yml b/.github/workflows/macOS.yml index 74adb14a..4027c4b9 100644 --- a/.github/workflows/macOS.yml +++ b/.github/workflows/macOS.yml @@ -22,7 +22,7 @@ jobs: - name: Setup Node.js environment uses: actions/setup-node@v2 with: - node-version: 12 + node-version: 14 - name: Install Node.js modules run: npm install diff --git a/.github/workflows/windows.yml b/.github/workflows/windows.yml index 31b5cf14..5fb3d71f 100644 --- a/.github/workflows/windows.yml +++ b/.github/workflows/windows.yml @@ -22,7 +22,7 @@ jobs: - name: Setup Node.js environment uses: actions/setup-node@v2 with: - node-version: 12 + node-version: 14 - name: Install Node.js modules run: npm install diff --git a/.github/workflows/windowsUI.yml b/.github/workflows/windowsUI.yml index 368a894f..4daef82f 100644 --- a/.github/workflows/windowsUI.yml +++ b/.github/workflows/windowsUI.yml @@ -22,7 +22,7 @@ jobs: - name: Setup Node.js environment uses: actions/setup-node@v2 with: - node-version: 12 + node-version: 14 - name: Install Node.js modules run: npm install From 6bbaddd6b2dd1e32f87d2677b29678ae6defb9c1 Mon Sep 17 00:00:00 2001 From: Esther Perelman <71729183+EstherPerelman@users.noreply.github.com> Date: Tue, 7 Dec 2021 10:23:50 +0200 Subject: [PATCH 066/352] Fix: type issue in package.json (#569) Co-authored-by: Shi Chen --- package.json | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index de49791f..2c944351 100644 --- a/package.json +++ b/package.json @@ -567,6 +567,9 @@ "type": "array", "items": { "anyOf": [ + { + "type": "string" + }, { "enum": [ "${compileOutput}", @@ -580,8 +583,7 @@ "%taskDefinitions.java.project.exportJar.dependencies%", "%taskDefinitions.java.project.exportJar.testDependencies%" ] - }, - "string" + } ] }, "description": "%taskDefinitions.java.project.exportJar.elements%" From fbd4f015fd9a75176929de4eb66692e1b4af23bb Mon Sep 17 00:00:00 2001 From: Sheng Chen Date: Fri, 17 Dec 2021 15:46:14 +0800 Subject: [PATCH 067/352] chore: Prepare for 0.18.9 (#573) Signed-off-by: Sheng Chen --- CHANGELOG.md | 4 ++++ .../META-INF/MANIFEST.MF | 2 +- .../com.microsoft.jdtls.ext.activator/pom.xml | 2 +- .../META-INF/MANIFEST.MF | 2 +- jdtls.ext/com.microsoft.jdtls.ext.core/pom.xml | 2 +- jdtls.ext/pom.xml | 2 +- package-lock.json | 16 ++++++++-------- package.json | 4 ++-- 8 files changed, 19 insertions(+), 15 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 47f42bfe..213d03af 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,10 @@ All notable changes to the "vscode-java-dependency" extension will be documented The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/) and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html). +## 0.18.9 +### Fixed +- [Bugs fixed](https://github.com/microsoft/vscode-java-dependency/issues?q=is%3Aissue+label%3Abug+milestone%3A0.18.9+is%3Aclosed) + ## 0.18.8 ### Changed - Adopt the new `folder-library` icon. [PR#545](https://github.com/microsoft/vscode-java-dependency/pull/545) diff --git a/jdtls.ext/com.microsoft.jdtls.ext.activator/META-INF/MANIFEST.MF b/jdtls.ext/com.microsoft.jdtls.ext.activator/META-INF/MANIFEST.MF index 46ce7544..1c35302e 100644 --- a/jdtls.ext/com.microsoft.jdtls.ext.activator/META-INF/MANIFEST.MF +++ b/jdtls.ext/com.microsoft.jdtls.ext.activator/META-INF/MANIFEST.MF @@ -2,7 +2,7 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: JDTLS EXT Activator Bundle-SymbolicName: com.microsoft.jdtls.ext.activator;singleton:=true -Bundle-Version: 0.18.8 +Bundle-Version: 0.18.9 Bundle-Activator: com.microsoft.jdtls.ext.activator.JdtlsExtActivator Bundle-RequiredExecutionEnvironment: JavaSE-1.8 Import-Package: org.eclipse.jdt.core, diff --git a/jdtls.ext/com.microsoft.jdtls.ext.activator/pom.xml b/jdtls.ext/com.microsoft.jdtls.ext.activator/pom.xml index 79f9f749..06a71bab 100644 --- a/jdtls.ext/com.microsoft.jdtls.ext.activator/pom.xml +++ b/jdtls.ext/com.microsoft.jdtls.ext.activator/pom.xml @@ -5,7 +5,7 @@ com.microsoft.jdtls.ext jdtls-ext-parent - 0.18.8 + 0.18.9 com.microsoft.jdtls.ext.activator eclipse-plugin diff --git a/jdtls.ext/com.microsoft.jdtls.ext.core/META-INF/MANIFEST.MF b/jdtls.ext/com.microsoft.jdtls.ext.core/META-INF/MANIFEST.MF index c2e5c78a..ab998dc5 100644 --- a/jdtls.ext/com.microsoft.jdtls.ext.core/META-INF/MANIFEST.MF +++ b/jdtls.ext/com.microsoft.jdtls.ext.core/META-INF/MANIFEST.MF @@ -2,7 +2,7 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: JDTLS EXT Core Bundle-SymbolicName: com.microsoft.jdtls.ext.core;singleton:=true -Bundle-Version: 0.18.8 +Bundle-Version: 0.18.9 Bundle-Activator: com.microsoft.jdtls.ext.core.JdtlsExtActivator Bundle-RequiredExecutionEnvironment: JavaSE-1.8 Bundle-ActivationPolicy: lazy diff --git a/jdtls.ext/com.microsoft.jdtls.ext.core/pom.xml b/jdtls.ext/com.microsoft.jdtls.ext.core/pom.xml index ea55cbcb..08dff420 100644 --- a/jdtls.ext/com.microsoft.jdtls.ext.core/pom.xml +++ b/jdtls.ext/com.microsoft.jdtls.ext.core/pom.xml @@ -5,7 +5,7 @@ com.microsoft.jdtls.ext jdtls-ext-parent - 0.18.8 + 0.18.9 com.microsoft.jdtls.ext.core eclipse-plugin diff --git a/jdtls.ext/pom.xml b/jdtls.ext/pom.xml index aa23eb53..1c0087a2 100644 --- a/jdtls.ext/pom.xml +++ b/jdtls.ext/pom.xml @@ -4,7 +4,7 @@ com.microsoft.jdtls.ext jdtls-ext-parent ${base.name} :: Parent - 0.18.8 + 0.18.9 pom Java Project Manager diff --git a/package-lock.json b/package-lock.json index 430b7312..4b4039de 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "vscode-java-dependency", - "version": "0.18.8", + "version": "0.18.9", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -1913,9 +1913,9 @@ "dev": true }, "json-schema": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", - "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", + "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", "dev": true }, "json-schema-traverse": { @@ -1948,14 +1948,14 @@ } }, "jsprim": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", - "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", + "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", "dev": true, "requires": { "assert-plus": "1.0.0", "extsprintf": "1.3.0", - "json-schema": "0.2.3", + "json-schema": "0.4.0", "verror": "1.10.0" } }, diff --git a/package.json b/package.json index 2c944351..e5bf1fc3 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "vscode-java-dependency", "displayName": "Project Manager for Java", "description": "%description%", - "version": "0.18.8", + "version": "0.18.9", "publisher": "vscjava", "preview": true, "aiKey": "5c642b22-e845-4400-badb-3f8509a70777", @@ -42,7 +42,7 @@ "main": "./main.js", "contributes": { "javaExtensions": [ - "./server/com.microsoft.jdtls.ext.core-0.18.8.jar" + "./server/com.microsoft.jdtls.ext.core-0.18.9.jar" ], "commands": [ { From fe6599022b220e2ada966e7101fe98b03d9e3b6c Mon Sep 17 00:00:00 2001 From: Sheng Chen Date: Tue, 21 Dec 2021 10:12:20 +0800 Subject: [PATCH 068/352] chore: Remove log4j in target platform definition (#574) Signed-off-by: sheche --- jdtls.ext/target.target | 1 - 1 file changed, 1 deletion(-) diff --git a/jdtls.ext/target.target b/jdtls.ext/target.target index db205200..a36584d9 100644 --- a/jdtls.ext/target.target +++ b/jdtls.ext/target.target @@ -7,7 +7,6 @@ - From 1d655a6fe80853011ab63c1a745329e53bc6c7c7 Mon Sep 17 00:00:00 2001 From: Sheng Chen Date: Wed, 12 Jan 2022 17:00:32 +0800 Subject: [PATCH 069/352] chore: Update dependencies (#582) Signed-off-by: Sheng Chen --- package-lock.json | 1350 ++++++++++++++++++++++++--------------------- package.json | 22 +- 2 files changed, 746 insertions(+), 626 deletions(-) diff --git a/package-lock.json b/package-lock.json index 4b4039de..7b7d7ce4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -89,9 +89,9 @@ } }, "@discoveryjs/json-ext": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.5.tgz", - "integrity": "sha512-6nFkfkmSeV/rqSaS4oWHgmpnYw194f6hmWF5is6b0J1naJZoiD0NTc9AiUwPHvWsowkjuHErCZT1wa0jg+BLIA==", + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.6.tgz", + "integrity": "sha512-ws57AidsDvREKrZKYffXddNkyaF14iHNHm8VQnZH6t99E8gczjNN0GpvcGny0imC80yQ0tHz1xVUKk/KFQSUyA==", "dev": true }, "@gar/promisify": { @@ -143,16 +143,43 @@ "rimraf": "^3.0.2" } }, + "@sindresorhus/is": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.2.1.tgz", + "integrity": "sha512-BrzrgtaqEre0qfvI8sMTaEvx+bayuhPmfe2rfeUGPPHYr/PLxCOqkOe4TQTDPb+qcqgNcsAtXV/Ew74mcDIE8w==", + "dev": true + }, + "@szmarczak/http-timer": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.6.tgz", + "integrity": "sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==", + "dev": true, + "requires": { + "defer-to-connect": "^2.0.0" + } + }, "@tootallnate/once": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", "dev": true }, + "@types/cacheable-request": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.2.tgz", + "integrity": "sha512-B3xVo+dlKM6nnKTcmm5ZtY/OL8bOAOd2Olee9M1zft65ox50OzjEHW91sDiU9j6cvW8Ejg1/Qkf4xd2kugApUA==", + "dev": true, + "requires": { + "@types/http-cache-semantics": "*", + "@types/keyv": "*", + "@types/node": "*", + "@types/responselike": "*" + } + }, "@types/eslint": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-7.28.0.tgz", - "integrity": "sha512-07XlgzX0YJUn4iG1ocY4IX9DzKSmMGUs6ESKlxWhZRaa0fatIWaHWUVapcuGa8r5HFnTqzj+4OCjd5f7EZ/i/A==", + "version": "8.2.2", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.2.2.tgz", + "integrity": "sha512-nQxgB8/Sg+QKhnV8e0WzPpxjIGT3tuJDDzybkDi8ItE/IgTlHo07U0shaIjzhcvQxlq9SDRE42lsJ23uvEgJ2A==", "dev": true, "requires": { "@types/estree": "*", @@ -160,9 +187,9 @@ } }, "@types/eslint-scope": { - "version": "3.7.1", - "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.1.tgz", - "integrity": "sha512-SCFeogqiptms4Fg29WpOTk5nHIzfpKCemSN63ksBQYKTcXoJEmJagV+DhVmbapZzY4/5YaOV1nZwrsU79fFm1g==", + "version": "3.7.3", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.3.tgz", + "integrity": "sha512-PB3ldyrcnAicT35TWPs5IcwKD8S333HMaa2VVv4+wdvebJkjWuW/xESoB8IwRcog8HYVYamb1g/R31Qv5Bx03g==", "dev": true, "requires": { "@types/eslint": "*", @@ -185,25 +212,40 @@ } }, "@types/glob": { - "version": "7.1.4", - "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.4.tgz", - "integrity": "sha512-w+LsMxKyYQm347Otw+IfBXOv9UWVjpHpCDdbBMt8Kz/xbvCYNjP+0qPh91Km3iKfSRLBB0P7fAMf0KHrPu+MyA==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==", "dev": true, "requires": { "@types/minimatch": "*", "@types/node": "*" } }, + "@types/http-cache-semantics": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.1.tgz", + "integrity": "sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ==", + "dev": true + }, "@types/json-schema": { "version": "7.0.9", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz", "integrity": "sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==", "dev": true }, + "@types/keyv": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.3.tgz", + "integrity": "sha512-FXCJgyyN3ivVgRoml4h94G/p3kY+u/B86La+QptcqJaWtBWtmc6TtkNfS40n9bIvyLteHh7zXOtgbobORKPbDg==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, "@types/lodash": { - "version": "4.14.173", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.173.tgz", - "integrity": "sha512-vv0CAYoaEjCw/mLy96GBTnRoZrSxkGE0BKzKimdR8P3OzrNYNvBgtW7p055A+E8C31vXNUhWKoFCbhq7gbyhFg==", + "version": "4.14.178", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.178.tgz", + "integrity": "sha512-0d5Wd09ItQWH1qFbEyQ7oTQ3GZrMfth5JkbN3EvTKLXcHLRDSXeLnlvlOn0wvxVIwK5o2M8JzP/OWz7T3NRsbw==", "dev": true }, "@types/minimatch": { @@ -224,6 +266,15 @@ "integrity": "sha512-tktOkFUA4kXx2hhhrB8bIFb5TbwzS4uOhKEmwiD+NoiL0qtP2OQ9mFldbgD4dV1djrlBYP6eBuQZiWjuHUpqFw==", "dev": true }, + "@types/responselike": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.0.tgz", + "integrity": "sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, "@types/selenium-webdriver": { "version": "3.0.19", "resolved": "https://registry.npmjs.org/@types/selenium-webdriver/-/selenium-webdriver-3.0.19.tgz", @@ -231,9 +282,9 @@ "dev": true }, "@types/semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-D/2EJvAlCEtYFEYmmlGwbGXuK886HzyCc3nZX/tkFTQdEU8jZDAgiv08P162yB17y4ZXZoq7yFAnW4GDBb9Now==", + "version": "7.3.9", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.3.9.tgz", + "integrity": "sha512-L/TMpyURfBkf+o/526Zb6kd/tchUP3iBDEPjqjb+U2MAJhVRxxrmr2fwpe08E7QsV7YLcpq0tUaQ9O9x97ZIxQ==", "dev": true }, "@types/vscode": { @@ -395,24 +446,24 @@ } }, "@webpack-cli/configtest": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-1.0.4.tgz", - "integrity": "sha512-cs3XLy+UcxiP6bj0A6u7MLLuwdXJ1c3Dtc0RkKg+wiI1g/Ti1om8+/2hc2A2B60NbBNAbMgyBMHvyymWm/j4wQ==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-1.1.0.tgz", + "integrity": "sha512-ttOkEkoalEHa7RaFYpM0ErK1xc4twg3Am9hfHhL7MVqlHebnkYd2wuI/ZqTDj0cVzZho6PdinY0phFZV3O0Mzg==", "dev": true }, "@webpack-cli/info": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-1.3.0.tgz", - "integrity": "sha512-ASiVB3t9LOKHs5DyVUcxpraBXDOKubYu/ihHhU+t1UPpxsivg6Od2E2qU4gJCekfEddzRBzHhzA/Acyw/mlK/w==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-1.4.0.tgz", + "integrity": "sha512-F6b+Man0rwE4n0409FyAJHStYA5OIZERxmnUfLVwv0mc0V1wLad3V7jqRlMkgKBeAq07jUvglacNaa6g9lOpuw==", "dev": true, "requires": { "envinfo": "^7.7.3" } }, "@webpack-cli/serve": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-1.5.2.tgz", - "integrity": "sha512-vgJ5OLWadI8aKjDlOH3rb+dYyPd2GTZuQC/Tihjct6F9GpXGZINo3Y/IVuZVTM1eDQB+/AOsjPUWH/WySDaXvw==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-1.6.0.tgz", + "integrity": "sha512-ZkVeqEmRpBV2GHvjjUZqEai2PpUbuq8Bqd//vEYsp63J8WyexI8ppCqVS3Zs0QADf6aWuPdU+0XsPI647PVlQA==", "dev": true }, "@xtuc/ieee754": { @@ -428,15 +479,15 @@ "dev": true }, "acorn": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.5.0.tgz", - "integrity": "sha512-yXbYeFy+jUuYd3/CDcg2NkIYE991XYX/bje7LmjJigUciaeO1JR4XxXgCIV1/Zc/dRuFEyw1L0pbA+qynJkW5Q==", + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.0.tgz", + "integrity": "sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ==", "dev": true }, "acorn-import-assertions": { - "version": "1.7.6", - "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.7.6.tgz", - "integrity": "sha512-FlVvVFA1TX6l3lp8VjDnYYq7R1nyW6x3svAt4nDgrWQ9SBaSh9CnbwgSUTasgfNfOG5HlM1ehugCvM+hjo56LA==", + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz", + "integrity": "sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==", "dev": true }, "agent-base": { @@ -508,16 +559,11 @@ "color-convert": "^2.0.1" } }, - "applicationinsights": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/applicationinsights/-/applicationinsights-1.7.4.tgz", - "integrity": "sha512-XFLsNlcanpjFhHNvVWEfcm6hr7lu9znnb6Le1Lk5RE03YUV9X2B2n2MfM4kJZRrUdV+C0hdHxvWyv+vWoLfY7A==", - "requires": { - "cls-hooked": "^4.2.2", - "continuation-local-storage": "^3.2.1", - "diagnostic-channel": "0.2.0", - "diagnostic-channel-publishers": "^0.3.3" - } + "aproba": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", + "dev": true }, "arch": { "version": "2.2.0", @@ -525,6 +571,16 @@ "integrity": "sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==", "dev": true }, + "are-we-there-yet": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.7.tgz", + "integrity": "sha512-nxwy40TuMiUGqMyRHgCSWZ9FM4VAoRP4xUYSTv5ImRog+h9yISPbVH7H8fASCIzYn9wlEv4zvFL7uKDMCFQm3g==", + "dev": true, + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + } + }, "argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", @@ -536,80 +592,23 @@ "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==" }, - "asn1": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", - "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", - "dev": true, - "requires": { - "safer-buffer": "~2.1.0" - } - }, - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true - }, - "async-hook-jl": { - "version": "1.7.6", - "resolved": "https://registry.npmjs.org/async-hook-jl/-/async-hook-jl-1.7.6.tgz", - "integrity": "sha512-gFaHkFfSxTjvoxDMYqDuGHlcRyUuamF8s+ZTtJdDzqjws4mCt7v0vuV79/E2Wr2/riMQgtG4/yUtXWs1gZ7JMg==", - "requires": { - "stack-chain": "^1.3.7" - } - }, - "async-listener": { - "version": "0.6.10", - "resolved": "https://registry.npmjs.org/async-listener/-/async-listener-0.6.10.tgz", - "integrity": "sha512-gpuo6xOyF4D5DE5WvyqZdPA3NGhiT6Qf07l7DCB0wwDEsLvDIbCr6j9S5aj5Ch96dLace5tXVzWBZkxU/c5ohw==", - "requires": { - "semver": "^5.3.0", - "shimmer": "^1.1.0" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" - } - } - }, - "asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", - "dev": true - }, "await-lock": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/await-lock/-/await-lock-2.1.0.tgz", "integrity": "sha512-t7Zm5YGgEEc/3eYAicF32m/TNvL+XOeYZy9CvBUeJY/szM7frLolFylhrlZNWV/ohWhcUXygrBGjYmoQdxF4CQ==" }, - "aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", - "dev": true - }, - "aws4": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", - "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==", - "dev": true - }, "axios": { - "version": "0.21.4", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz", - "integrity": "sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==", + "version": "0.22.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.22.0.tgz", + "integrity": "sha512-Z0U3uhqQeg1oNcihswf4ZD57O3NrR1+ZXhxaROaWpDmsDTx7T2HNBV2ulBtie2hwJptu8UvgnJoK+BIqdzh/1w==", "requires": { - "follow-redirects": "^1.14.0" + "follow-redirects": "^1.14.4" } }, "azure-devops-node-api": { - "version": "11.0.1", - "resolved": "https://registry.npmjs.org/azure-devops-node-api/-/azure-devops-node-api-11.0.1.tgz", - "integrity": "sha512-YMdjAw9l5p/6leiyIloxj3k7VIvYThKjvqgiQn88r3nhT93ENwsoDS3A83CyJ4uTWzCZ5f5jCi6c27rTU5Pz+A==", + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/azure-devops-node-api/-/azure-devops-node-api-11.1.0.tgz", + "integrity": "sha512-6/2YZuf+lJzJLrjXNYEA5RXAkMCb8j/4VcHD0qJQRsgG/KsRMYo0HgDh0by1FGHyZkQWY5LmQyJqCwRVUB3Y7Q==", "dev": true, "requires": { "tunnel": "0.0.6", @@ -621,14 +620,11 @@ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" }, - "bcrypt-pbkdf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", - "dev": true, - "requires": { - "tweetnacl": "^0.14.3" - } + "base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "dev": true }, "big-integer": { "version": "1.6.49", @@ -698,16 +694,26 @@ "dev": true }, "browserslist": { - "version": "4.17.1", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.17.1.tgz", - "integrity": "sha512-aLD0ZMDSnF4lUt4ZDNgqi5BUn9BZ7YdQdI/cYlILrhdSSZJLU9aNZoD5/NBmM4SK34APB2e83MOsRt1EnkuyaQ==", + "version": "4.19.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.19.1.tgz", + "integrity": "sha512-u2tbbG5PdKRTUoctO3NBD8FQ5HdPh1ZXPHzp1rwaa5jTc+RV9/+RlWiAIKmjRPQF+xbGM9Kklj5bZQFa2s/38A==", "dev": true, "requires": { - "caniuse-lite": "^1.0.30001259", - "electron-to-chromium": "^1.3.846", + "caniuse-lite": "^1.0.30001286", + "electron-to-chromium": "^1.4.17", "escalade": "^3.1.1", - "nanocolors": "^0.1.5", - "node-releases": "^1.1.76" + "node-releases": "^2.0.1", + "picocolors": "^1.0.0" + } + }, + "buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "dev": true, + "requires": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" } }, "buffer-alloc": { @@ -788,6 +794,27 @@ "unique-filename": "^1.1.1" } }, + "cacheable-lookup": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz", + "integrity": "sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==", + "dev": true + }, + "cacheable-request": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.2.tgz", + "integrity": "sha512-pouW8/FmiPQbuGpkXQ9BAPv/Mo5xDGANgSNXzTzJ8DrKGuXOssM4wIQRjfanNRh3Yu5cfYPvcorqbhg2KIJtew==", + "dev": true, + "requires": { + "clone-response": "^1.0.2", + "get-stream": "^5.1.0", + "http-cache-semantics": "^4.0.0", + "keyv": "^4.0.0", + "lowercase-keys": "^2.0.0", + "normalize-url": "^6.0.1", + "responselike": "^2.0.0" + } + }, "call-bind": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", @@ -799,15 +826,9 @@ } }, "caniuse-lite": { - "version": "1.0.30001259", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001259.tgz", - "integrity": "sha512-V7mQTFhjITxuk9zBpI6nYsiTXhcPe05l+364nZjK7MFK/E7ibvYBSAXr4YcA6oPR8j3ZLM/LN+lUqUVAQEUZFg==", - "dev": true - }, - "caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", + "version": "1.0.30001299", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001299.tgz", + "integrity": "sha512-iujN4+x7QzqA2NCSrS5VUy+4gLmRd4xv6vbBBsmfVqTx8bLAD8097euLqQgKxSVLvxjSDcvF1T/i9ocgnUFexw==", "dev": true }, "chainsaw": { @@ -916,21 +937,13 @@ "shallow-clone": "^3.0.0" } }, - "cls-hooked": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/cls-hooked/-/cls-hooked-4.2.2.tgz", - "integrity": "sha512-J4Xj5f5wq/4jAvcdgoGsL3G103BtWpZrMo8NEinRltN+xpTZdI+M38pyQqhuFU/P792xkMFvnKSf+Lm81U1bxw==", + "clone-response": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz", + "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=", + "dev": true, "requires": { - "async-hook-jl": "^1.7.6", - "emitter-listener": "^1.0.1", - "semver": "^5.4.1" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" - } + "mimic-response": "^1.0.0" } }, "code-point-at": { @@ -955,20 +968,11 @@ "dev": true }, "colorette": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.4.0.tgz", - "integrity": "sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g==", + "version": "2.0.16", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.16.tgz", + "integrity": "sha512-hUewv7oMjCp+wkBv5Rm0v87eJhq4woh5rSR+42YSQJKecCqgIqNkZ6lAlQms/BwHPJA5NKMRlpxPRv0n8HQW6g==", "dev": true }, - "combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dev": true, - "requires": { - "delayed-stream": "~1.0.0" - } - }, "commander": { "version": "2.20.3", "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", @@ -992,14 +996,11 @@ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" }, - "continuation-local-storage": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/continuation-local-storage/-/continuation-local-storage-3.2.1.tgz", - "integrity": "sha512-jx44cconVqkCEEyLSKWwkvUXwO561jXMa3LPjTPsm5QR22PA0/mhe33FT4Xb5y74JDvt/Cq+5lm8S8rskLv9ZA==", - "requires": { - "async-listener": "^0.6.0", - "emitter-listener": "^1.1.1" - } + "console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", + "dev": true }, "copy-webpack-plugin": { "version": "6.4.1", @@ -1048,37 +1049,57 @@ } }, "css-select": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.1.3.tgz", - "integrity": "sha512-gT3wBNd9Nj49rAbmtFHj1cljIAOLYSX1nZ8CB7TBO3INYckygm5B7LISU/szY//YmdiSLbJvDLOx9VnMVpMBxA==", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.2.1.tgz", + "integrity": "sha512-/aUslKhzkTNCQUB2qTX84lVmfia9NyjP3WpDGtj/WxhwBzWBYUV3DgUpurHTme8UTPcPlAD1DJ+b0nN/t50zDQ==", "dev": true, "requires": { "boolbase": "^1.0.0", - "css-what": "^5.0.0", - "domhandler": "^4.2.0", - "domutils": "^2.6.0", - "nth-check": "^2.0.0" + "css-what": "^5.1.0", + "domhandler": "^4.3.0", + "domutils": "^2.8.0", + "nth-check": "^2.0.1" } }, "css-what": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-5.0.1.tgz", - "integrity": "sha512-FYDTSHb/7KXsWICVsxdmiExPjCfRC4qRFBdVwv7Ax9hMnvMmEjP9RfxTEZ3qPZGmADDn2vAKSo9UcN1jKVYscg==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-5.1.0.tgz", + "integrity": "sha512-arSMRWIIFY0hV8pIxZMEfmMI47Wj3R/aWpZDDxWYCPEiOMv6tfOrnpDtgxBYPEQD4V0Y/958+1TdC3iWTFcUPw==", "dev": true }, - "dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "decompress-response": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", "dev": true, "requires": { - "assert-plus": "^1.0.0" + "mimic-response": "^3.1.0" + }, + "dependencies": { + "mimic-response": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", + "dev": true + } } }, - "delayed-stream": { + "deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "dev": true + }, + "defer-to-connect": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", + "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", + "dev": true + }, + "delegates": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", "dev": true }, "denodeify": { @@ -1087,25 +1108,11 @@ "integrity": "sha1-OjYof1A05pnnV3kBBSwubJQlFjE=", "dev": true }, - "diagnostic-channel": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/diagnostic-channel/-/diagnostic-channel-0.2.0.tgz", - "integrity": "sha1-zJmvlhLCP7H/8TYSxy8sv6qNWhc=", - "requires": { - "semver": "^5.3.0" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" - } - } - }, - "diagnostic-channel-publishers": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/diagnostic-channel-publishers/-/diagnostic-channel-publishers-0.3.5.tgz", - "integrity": "sha512-AOIjw4T7Nxl0G2BoBPhkQ6i7T4bUd9+xvdYizwvG7vVAM1dvr+SDrcUudlmzwH0kbEwdR2V1EcnKT0wAeYLQNQ==" + "detect-libc": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", + "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=", + "dev": true }, "diff": { "version": "5.0.0", @@ -1139,9 +1146,9 @@ "dev": true }, "domhandler": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.2.2.tgz", - "integrity": "sha512-PzE9aBMsdZO8TK4BnuJwH0QT41wgMbRzuZrHUcpYncEjmQazq8QEaBWgLG7ZyC/DAZKEgglpIA6j4Qn/HmxS3w==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.0.tgz", + "integrity": "sha512-fC0aXNQXqKSFTr2wDNZDhsEYjCiYsDWl3D01kwt25hm1YIPyDGHvvi3rw+PLqHAl/m71MaiF7d5zvBr0p5UB2g==", "dev": true, "requires": { "domelementtype": "^2.2.0" @@ -1167,30 +1174,12 @@ "readable-stream": "^2.0.2" } }, - "ecc-jsbn": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", - "dev": true, - "requires": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" - } - }, "electron-to-chromium": { - "version": "1.3.846", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.846.tgz", - "integrity": "sha512-2jtSwgyiRzybHRxrc2nKI+39wH3AwQgn+sogQ+q814gv8hIFwrcZbV07Ea9f8AmK0ufPVZUvvAG1uZJ+obV4Jw==", + "version": "1.4.43", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.43.tgz", + "integrity": "sha512-PO3kEfcxPrti/4STbXvCkNIF4fgWvCKl2508e6UI7KomCDffpIfeBZLXsh5DK/XGsjUw3kwq6WEsi0MJTlGAdg==", "dev": true }, - "emitter-listener": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/emitter-listener/-/emitter-listener-1.1.2.tgz", - "integrity": "sha512-Bt1sBAGFHY9DKY+4/2cV6izcKJUf5T7/gkdmkxzX/qv9CcGH8xSwVRW5mtX03SWJtRTWSOpzCuWN9rBFYZepZQ==", - "requires": { - "shimmer": "^1.2.0" - } - }, "emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", @@ -1235,9 +1224,9 @@ "dev": true }, "es-module-lexer": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.7.1.tgz", - "integrity": "sha512-MgtWFl5No+4S3TmhDmCz2ObFGm6lEpTnzbQi+Dd+pw4mlTIZTmM2iAs5gRlmx5zS9luzobCSBSI90JM/1/JgOw==", + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.9.3.tgz", + "integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==", "dev": true }, "escalade": { @@ -1278,9 +1267,9 @@ }, "dependencies": { "estraverse": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", - "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true } } @@ -1310,18 +1299,23 @@ "p-finally": "^1.0.0", "signal-exit": "^3.0.0", "strip-eof": "^1.0.0" + }, + "dependencies": { + "get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + } } }, - "extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", - "dev": true - }, - "extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", + "expand-template": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", + "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==", "dev": true }, "fast-deep-equal": { @@ -1334,6 +1328,7 @@ "version": "3.2.7", "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.7.tgz", "integrity": "sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q==", + "dev": true, "requires": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", @@ -1407,26 +1402,9 @@ "dev": true }, "follow-redirects": { - "version": "1.14.4", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.4.tgz", - "integrity": "sha512-zwGkiSXC1MUJG/qmeIFH2HBJx9u0V46QGUe3YR1fXG8bXQxq7fLj0RjLZQ5nubr9qNJUZrH+xUcwXEoXNpfS+g==" - }, - "forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", - "dev": true - }, - "form-data": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", - "dev": true, - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - } + "version": "1.14.7", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.7.tgz", + "integrity": "sha512-+hbxoLbFMbRKDwohX8GkTataGqO6Jb7jGwpAlwgy2bIz25XtRm7KEzJM76R1WiNT5SwZkX4Y75SwBolkpmE7iQ==" }, "fs-constants": { "version": "1.0.0", @@ -1497,6 +1475,22 @@ "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", "dev": true }, + "gauge": { + "version": "2.7.4", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", + "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", + "dev": true, + "requires": { + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" + } + }, "get-intrinsic": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", @@ -1509,39 +1503,24 @@ } }, "get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", "dev": true, "requires": { "pump": "^3.0.0" - }, - "dependencies": { - "pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - } } }, - "getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0" - } + "github-from-package": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", + "integrity": "sha1-l/tdlr/eiXMxPyDoKI75oWf6ZM4=", + "dev": true }, "glob": { - "version": "7.1.7", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", - "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", "dev": true, "requires": { "fs.realpath": "^1.0.0", @@ -1567,16 +1546,49 @@ "dev": true }, "globby": { - "version": "11.0.1", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.1.tgz", - "integrity": "sha512-iH9RmgwCmUJHi2z5o2l3eTtGBtXek1OYlHrbcxOYugyHLmAsZrPj43OtHThd62Buh/Vv6VyCBD2bdyWcGNQqoQ==", + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", "requires": { "array-union": "^2.1.0", "dir-glob": "^3.0.1", - "fast-glob": "^3.1.1", - "ignore": "^5.1.4", - "merge2": "^1.3.0", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", "slash": "^3.0.0" + }, + "dependencies": { + "fast-glob": { + "version": "3.2.10", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.10.tgz", + "integrity": "sha512-s9nFhFnvR63wls6/kM88kQqDhMu0AfdjqouE2l5GVQPbqLgyFjjU5ry/r2yKsJxpb9Py1EYNqieFrmMaX4v++A==", + "requires": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + } + } + } + }, + "got": { + "version": "11.8.3", + "resolved": "https://registry.npmjs.org/got/-/got-11.8.3.tgz", + "integrity": "sha512-7gtQ5KiPh1RtGS9/Jbv1ofDpBFuq42gyfEib+ejaRBJuj/3tQFeR5+gw57e4ipaU8c/rCjvX6fkQz2lyDlGAOg==", + "dev": true, + "requires": { + "@sindresorhus/is": "^4.0.0", + "@szmarczak/http-timer": "^4.0.5", + "@types/cacheable-request": "^6.0.1", + "@types/responselike": "^1.0.0", + "cacheable-lookup": "^5.0.3", + "cacheable-request": "^7.0.2", + "decompress-response": "^6.0.0", + "http2-wrapper": "^1.0.0-beta.5.2", + "lowercase-keys": "^2.0.0", + "p-cancelable": "^2.0.0", + "responselike": "^2.0.0" } }, "graceful-fs": { @@ -1590,22 +1602,6 @@ "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", "dev": true }, - "har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", - "dev": true - }, - "har-validator": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", - "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", - "dev": true, - "requires": { - "ajv": "^6.12.3", - "har-schema": "^2.0.0" - } - }, "has": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", @@ -1627,12 +1623,27 @@ "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==", "dev": true }, + "has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", + "dev": true + }, "he": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", "dev": true }, + "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, + "requires": { + "lru-cache": "^6.0.0" + } + }, "htmlparser2": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", @@ -1645,6 +1656,12 @@ "entities": "^2.0.0" } }, + "http-cache-semantics": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", + "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==", + "dev": true + }, "http-proxy-agent": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", @@ -1673,15 +1690,14 @@ } } }, - "http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "http2-wrapper": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-1.0.3.tgz", + "integrity": "sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==", "dev": true, "requires": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" + "quick-lru": "^5.1.1", + "resolve-alpn": "^1.0.0" } }, "https-proxy-agent": { @@ -1717,10 +1733,16 @@ "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", "dev": true }, + "ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "dev": true + }, "ignore": { - "version": "5.1.8", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", - "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==" + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", + "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==" }, "immediate": { "version": "3.0.6", @@ -1729,9 +1751,9 @@ "dev": true }, "import-local": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.0.2.tgz", - "integrity": "sha512-vjL3+w0oulAVZ0hBHnxa/Nm5TAurf9YLQJDhqRZyqb+VKGOB6LU8t9H1Nr5CIo16vh9XfJTOoHwU0B71S557gA==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", + "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", "dev": true, "requires": { "pkg-dir": "^4.2.0", @@ -1772,6 +1794,18 @@ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "dev": true }, + "ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "dev": true + }, + "interpret": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-2.2.0.tgz", + "integrity": "sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==", + "dev": true + }, "is-core-module": { "version": "2.6.0", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.6.0.tgz", @@ -1835,12 +1869,6 @@ "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", "dev": true }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", - "dev": true - }, "is-wsl": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", @@ -1868,16 +1896,10 @@ "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", "dev": true }, - "isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", - "dev": true - }, "jest-worker": { - "version": "27.2.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.2.0.tgz", - "integrity": "sha512-laB0ZVIBz+voh/QQy9dmUuuDsadixeerrKqyVpgPz+CCWiOYjOBabUXHIXZhsdvkWbLqSHbgkAHWl5cg24Q6RA==", + "version": "27.4.6", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.4.6.tgz", + "integrity": "sha512-gHWJF/6Xi5CTG5QCvROr6GcmpIqNYpDJyc8A1h/DyXqH1tD6SnRCM0d3U5msV31D2LB/U+E0M+W4oyvKV44oNw==", "dev": true, "requires": { "@types/node": "*", @@ -1900,10 +1922,10 @@ "argparse": "^2.0.1" } }, - "jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", + "json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", "dev": true }, "json-parse-better-errors": { @@ -1912,24 +1934,12 @@ "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", "dev": true }, - "json-schema": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", - "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", - "dev": true - }, "json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", "dev": true }, - "json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", - "dev": true - }, "json5": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", @@ -1947,18 +1957,6 @@ "graceful-fs": "^4.1.6" } }, - "jsprim": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", - "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", - "dev": true, - "requires": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.4.0", - "verror": "1.10.0" - } - }, "jszip": { "version": "3.7.1", "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.7.1.tgz", @@ -1971,6 +1969,25 @@ "set-immediate-shim": "~1.0.1" } }, + "keytar": { + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/keytar/-/keytar-7.7.0.tgz", + "integrity": "sha512-YEY9HWqThQc5q5xbXbRwsZTh2PJ36OSYRjSv3NN2xf5s5dpLTjEZnC2YikR29OaVybf9nQ0dJ/80i40RS97t/A==", + "dev": true, + "requires": { + "node-addon-api": "^3.0.0", + "prebuild-install": "^6.0.0" + } + }, + "keyv": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.0.5.tgz", + "integrity": "sha512-531pkGLqV3BMg0eDqqJFI0R1mkK1Nm5xIP2mM6keP5P8WfFtCkg2IOwplTUmlGoTgIg9yQYZ/kdihhz89XH3vA==", + "dev": true, + "requires": { + "json-buffer": "3.0.1" + } + }, "kind-of": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", @@ -2047,6 +2064,12 @@ "chalk": "^4.0.0" } }, + "lowercase-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", + "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", + "dev": true + }, "lru-cache": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", @@ -2136,18 +2159,18 @@ "dev": true }, "mime-db": { - "version": "1.49.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.49.0.tgz", - "integrity": "sha512-CIc8j9URtOVApSFCQIF+VBkX1RwXp/oMMOrqdyXSBXq5RWNEsRfyj1kiRnQgmNXmHxPoFIxOroKA3zcU9P+nAA==", + "version": "1.51.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.51.0.tgz", + "integrity": "sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g==", "dev": true }, "mime-types": { - "version": "2.1.32", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.32.tgz", - "integrity": "sha512-hJGaVS4G4c9TSMYh2n6SQAGrC4RnfU+daP8G7cSCmaqNjiOoUY0VHCMS42pxnQmVF1GWwFhbHWn3RIxCqTmZ9A==", + "version": "2.1.34", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.34.tgz", + "integrity": "sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A==", "dev": true, "requires": { - "mime-db": "1.49.0" + "mime-db": "1.51.0" } }, "mimic-fn": { @@ -2156,6 +2179,12 @@ "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", "dev": true }, + "mimic-response": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", + "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", + "dev": true + }, "minimatch": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", @@ -2222,6 +2251,12 @@ "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", "dev": true }, + "mkdirp-classic": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", + "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", + "dev": true + }, "mocha": { "version": "8.4.0", "resolved": "https://registry.npmjs.org/mocha/-/mocha-8.4.0.tgz", @@ -2482,9 +2517,9 @@ } }, "monaco-page-objects": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/monaco-page-objects/-/monaco-page-objects-1.7.1.tgz", - "integrity": "sha512-O/Nhx6idt6H6bJE5qQgoTjDBeaCEnoDTYYQEf605EhI1dxq5AcEEyoFR3Jb21KATEe7paBDGnjFXSedubIS3ww==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/monaco-page-objects/-/monaco-page-objects-1.9.0.tgz", + "integrity": "sha512-CVTbG5GAMv6Gh704/h0bL+VK8NkYwy/bga/5JG1uqc7TM426PCG5ssHe7gyTEYQx4iCgWQFg8+obQqn//d1ohQ==", "dev": true, "requires": { "clipboardy": "^2.3.0", @@ -2529,18 +2564,18 @@ "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", "dev": true }, - "nanocolors": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/nanocolors/-/nanocolors-0.1.5.tgz", - "integrity": "sha512-8qaMI2gVxDmSUgoSXwWwkDDKxVePjhYaPIoy0e1xRMP52EAQINxGJ04GfyUPs+Z2g83RPwuHx+mBiaUFJGfTCA==", - "dev": true - }, "nanoid": { "version": "3.1.20", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.20.tgz", "integrity": "sha512-a1cQNyczgKbLX9jwbS/+d7W8fX/RfgYR7lVWwWOGIPNgK2m0MWvrGF6/m4kk6U3QcFMnZf3RIhL0v2Jgh/0Uxw==", "dev": true }, + "napi-build-utils": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz", + "integrity": "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==", + "dev": true + }, "neo-async": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", @@ -2553,10 +2588,33 @@ "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", "dev": true }, + "node-abi": { + "version": "2.30.1", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-2.30.1.tgz", + "integrity": "sha512-/2D0wOQPgaUWzVSVgRMx+trKJRC2UG4SUc4oCJoXx9Uxjtp0Vy3/kt7zcbxHF8+Z/pK3UloLWzBISg72brfy1w==", + "dev": true, + "requires": { + "semver": "^5.4.1" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, + "node-addon-api": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-3.2.1.tgz", + "integrity": "sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A==", + "dev": true + }, "node-releases": { - "version": "1.1.76", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.76.tgz", - "integrity": "sha512-9/IECtNr8dXNmPWmFXepT0/7o5eolGesHUa3mtr0KlgnCvnZxwh2qensKL42JJY2vQKC3nIBXetFAqR+PW1CmA==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.1.tgz", + "integrity": "sha512-CqyzN6z7Q6aMeF/ktcMVTzhAHCEpf8SOarwpzpf8pNBY2k5/oM34UHldUwp8VKI7uxct2HxSRdJjBaZeESzcxA==", "dev": true }, "normalize-path": { @@ -2565,6 +2623,12 @@ "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", "dev": true }, + "normalize-url": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", + "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", + "dev": true + }, "npm-run-path": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", @@ -2574,6 +2638,18 @@ "path-key": "^2.0.0" } }, + "npmlog": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", + "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", + "dev": true, + "requires": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" + } + }, "nth-check": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.0.1.tgz", @@ -2589,16 +2665,16 @@ "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", "dev": true }, - "oauth-sign": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", "dev": true }, "object-inspect": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.11.0.tgz", - "integrity": "sha512-jp7ikS6Sd3GxQfZJPyH3cjcbJF6GZPClgdV+EFygjFLQ5FmW/dRUnTd9PQ9k0JhoNDabWFbpF1yCdSWCC6gexg==", + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.0.tgz", + "integrity": "sha512-Ho2z80bVIvJloH+YzRmpZVQe87+qASmBUKZDWgx9cu+KDrX2ZDH/3tMy+gXbZETVGs2M8YdxObOh7XAtim9Y0g==", "dev": true }, "once": { @@ -2641,6 +2717,12 @@ "os-tmpdir": "^1.0.0" } }, + "p-cancelable": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz", + "integrity": "sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==", + "dev": true + }, "p-finally": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", @@ -2764,10 +2846,10 @@ "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=", "dev": true }, - "performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", + "picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", "dev": true }, "picomatch": { @@ -2784,6 +2866,82 @@ "find-up": "^4.0.0" } }, + "prebuild-install": { + "version": "6.1.4", + "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-6.1.4.tgz", + "integrity": "sha512-Z4vpywnK1lBg+zdPCVCsKq0xO66eEV9rWo2zrROGGiRS4JtueBOdlB1FnY8lcy7JsUud/Q3ijUxyWN26Ika0vQ==", + "dev": true, + "requires": { + "detect-libc": "^1.0.3", + "expand-template": "^2.0.3", + "github-from-package": "0.0.0", + "minimist": "^1.2.3", + "mkdirp-classic": "^0.5.3", + "napi-build-utils": "^1.0.1", + "node-abi": "^2.21.0", + "npmlog": "^4.0.1", + "pump": "^3.0.0", + "rc": "^1.2.7", + "simple-get": "^3.0.3", + "tar-fs": "^2.0.0", + "tunnel-agent": "^0.6.0" + }, + "dependencies": { + "bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "dev": true, + "requires": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", + "dev": true + }, + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "tar-fs": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", + "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==", + "dev": true, + "requires": { + "chownr": "^1.1.1", + "mkdirp-classic": "^0.5.2", + "pump": "^3.0.0", + "tar-stream": "^2.1.4" + } + }, + "tar-stream": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", + "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", + "dev": true, + "requires": { + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + } + } + } + }, "process-nextick-args": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", @@ -2796,11 +2954,15 @@ "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=", "dev": true }, - "psl": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", - "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==", - "dev": true + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } }, "punycode": { "version": "2.1.1", @@ -2809,16 +2971,25 @@ "dev": true }, "qs": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", - "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", - "dev": true + "version": "6.10.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.3.tgz", + "integrity": "sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==", + "dev": true, + "requires": { + "side-channel": "^1.0.4" + } }, "queue-microtask": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==" }, + "quick-lru": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", + "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", + "dev": true + }, "randombytes": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", @@ -2828,6 +2999,26 @@ "safe-buffer": "^5.1.0" } }, + "rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "dev": true, + "requires": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "dependencies": { + "strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", + "dev": true + } + } + }, "read": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/read/-/read-1.0.7.tgz", @@ -2860,32 +3051,13 @@ } } }, - "request": { - "version": "2.88.2", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", - "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", - "dev": true, - "requires": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.3", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.5.0", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" + "rechoir": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.7.1.tgz", + "integrity": "sha512-/njmZ8s1wVeR6pjTZ+0nCnv8SpZNRMT2D1RLOJQESlYFDBvwpTA4KWJpZ+sBJ4+vhjILRcK7JIFdGCdxEAAitg==", + "dev": true, + "requires": { + "resolve": "^1.9.0" } }, "require-directory": { @@ -2904,6 +3076,12 @@ "path-parse": "^1.0.6" } }, + "resolve-alpn": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", + "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==", + "dev": true + }, "resolve-cwd": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", @@ -2919,6 +3097,15 @@ "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", "dev": true }, + "responselike": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.0.tgz", + "integrity": "sha512-xH48u3FTB9VsZw7R+vvgaKeLKzT6jOogbQhEe/jewwnZgzPcnyWui2Av6JpoYZF/91uueC+lqhWqeURw5/qhCw==", + "dev": true, + "requires": { + "lowercase-keys": "^2.0.0" + } + }, "reusify": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", @@ -2947,12 +3134,6 @@ "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", "dev": true }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true - }, "sanitize-filename": { "version": "1.6.3", "resolved": "https://registry.npmjs.org/sanitize-filename/-/sanitize-filename-1.6.3.tgz", @@ -3020,6 +3201,12 @@ "randombytes": "^2.1.0" } }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", + "dev": true + }, "set-immediate-shim": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz", @@ -3056,11 +3243,6 @@ "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", "dev": true }, - "shimmer": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/shimmer/-/shimmer-1.2.1.tgz", - "integrity": "sha512-sQTKC1Re/rM6XyFM6fIAGHRPVGvyXfgzIDvzoq608vM+jeyVD0Tu1E6Np0Kc2zAIFWIj963V2800iF/9LPieQw==" - }, "side-channel": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", @@ -3073,11 +3255,45 @@ } }, "signal-exit": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.4.tgz", - "integrity": "sha512-rqYhcAnZ6d/vTPGghdrw7iumdcbXpsk1b8IG/rz+VWV51DM0p7XCtMoJ3qhPLIbp3tvyt3pKRbaaEMZYpHto8Q==", + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.6.tgz", + "integrity": "sha512-sDl4qMFpijcGw22U5w63KmD3cZJfBuFlVNbVMKje2keoKML7X2UzWbc4XrmEbDwg0NXJc3yv4/ox7b+JWb57kQ==", + "dev": true + }, + "simple-concat": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", + "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", "dev": true }, + "simple-get": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-3.1.0.tgz", + "integrity": "sha512-bCR6cP+aTdScaQCnQKbPKtJOKDp/hj9EDLJo3Nw4y1QksqaovlW/bnptB6/c1e+qmNIDHRK+oXFDdEqBT8WzUA==", + "dev": true, + "requires": { + "decompress-response": "^4.2.0", + "once": "^1.3.1", + "simple-concat": "^1.0.0" + }, + "dependencies": { + "decompress-response": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-4.2.1.tgz", + "integrity": "sha512-jOSne2qbyE+/r8G1VU+G/82LBs2Fs4LAsTiLSHOCOMZQl2OKZ6i8i4IyHemTe+/yIXOtTcRQMzPcgyhoFlqPkw==", + "dev": true, + "requires": { + "mimic-response": "^2.0.0" + } + }, + "mimic-response": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-2.1.0.tgz", + "integrity": "sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA==", + "dev": true + } + } + }, "slash": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", @@ -3096,9 +3312,9 @@ "dev": true }, "source-map-support": { - "version": "0.5.20", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.20.tgz", - "integrity": "sha512-n1lZZ8Ve4ksRqizaBQgxXDgKwttHDhyfQjA6YZZn8+AroHbsIz+JjwxQDxbp+7y5OYCI8t1Yk7etjD9CRd2hIw==", + "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==", "dev": true, "requires": { "buffer-from": "^1.0.0", @@ -3111,23 +3327,6 @@ "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", "dev": true }, - "sshpk": { - "version": "1.16.1", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", - "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", - "dev": true, - "requires": { - "asn1": "~0.2.3", - "assert-plus": "^1.0.0", - "bcrypt-pbkdf": "^1.0.0", - "dashdash": "^1.12.0", - "ecc-jsbn": "~0.1.1", - "getpass": "^0.1.1", - "jsbn": "~0.1.0", - "safer-buffer": "^2.0.2", - "tweetnacl": "~0.14.0" - } - }, "ssri": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.1.tgz", @@ -3137,11 +3336,6 @@ "minipass": "^3.1.1" } }, - "stack-chain": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/stack-chain/-/stack-chain-1.3.7.tgz", - "integrity": "sha1-0ZLJ/06moiyUxN1FkXHj8AzqEoU=" - }, "string-width": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", @@ -3290,17 +3484,17 @@ } }, "tas-client": { - "version": "0.1.21", - "resolved": "https://registry.npmjs.org/tas-client/-/tas-client-0.1.21.tgz", - "integrity": "sha512-7UuIwOXarCYoCTrQHY5n7M+63XuwMC0sVUdbPQzxqDB9wMjIW0JF39dnp3yoJnxr4jJUVhPtvkkXZbAD0BxCcA==", + "version": "0.1.26", + "resolved": "https://registry.npmjs.org/tas-client/-/tas-client-0.1.26.tgz", + "integrity": "sha512-o9wYpOwf1jhIose0ArEeW/Zr2T/XZnCKDrNXsCiZ/ctpg0DliU76tJ1rbBGlrOvjzLrMY1S3QwZWOAaF7+5HDw==", "requires": { - "axios": "^0.21.1" + "axios": "^0.22.0" } }, "terser": { - "version": "5.9.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.9.0.tgz", - "integrity": "sha512-h5hxa23sCdpzcye/7b8YqbE5OwKca/ni0RQz1uRX3tGh8haaGHqcuSqbGRybuAKNdntZ0mDgFNXPJ48xQ2RXKQ==", + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.10.0.tgz", + "integrity": "sha512-AMmF99DMfEDiRJfxfY5jj5wNH/bYO09cniSqhfoyxc8sFoYIgkJy86G04UoZU5VjlpnplVu0K6Tx6E9b5+DlHA==", "dev": true, "requires": { "commander": "^2.20.0", @@ -3317,13 +3511,12 @@ } }, "terser-webpack-plugin": { - "version": "5.2.4", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.2.4.tgz", - "integrity": "sha512-E2CkNMN+1cho04YpdANyRrn8CyN4yMy+WdFKZIySFZrGXZxJwJP6PMNGGc/Mcr6qygQHUUqRxnAPmi0M9f00XA==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.0.tgz", + "integrity": "sha512-LPIisi3Ol4chwAaPP8toUJ3L4qCM1G0wao7L3qNv57Drezxj6+VEyySpPw4B1HSO2Eg/hDY/MNF5XihCAoqnsQ==", "dev": true, "requires": { - "jest-worker": "^27.0.6", - "p-limit": "^3.1.0", + "jest-worker": "^27.4.1", "schema-utils": "^3.1.1", "serialize-javascript": "^6.0.0", "source-map": "^0.6.1", @@ -3364,16 +3557,6 @@ "is-number": "^7.0.0" } }, - "tough-cookie": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", - "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", - "dev": true, - "requires": { - "psl": "^1.1.28", - "punycode": "^2.1.1" - } - }, "traverse": { "version": "0.3.9", "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.3.9.tgz", @@ -3556,12 +3739,6 @@ "safe-buffer": "^5.0.1" } }, - "tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", - "dev": true - }, "typed-rest-client": { "version": "1.8.6", "resolved": "https://registry.npmjs.org/typed-rest-client/-/typed-rest-client-1.8.6.tgz", @@ -3571,23 +3748,12 @@ "qs": "^6.9.1", "tunnel": "0.0.6", "underscore": "^1.12.1" - }, - "dependencies": { - "qs": { - "version": "6.10.1", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.1.tgz", - "integrity": "sha512-M528Hph6wsSVOBiYUnGf+K/7w0hNshs/duGsNXPUCLH5XAqjEtiPGwNONLV0tBH8NoGb0mvD5JubnUTrujKDTg==", - "dev": true, - "requires": { - "side-channel": "^1.0.4" - } - } } }, "typescript": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.4.3.tgz", - "integrity": "sha512-4xfscpisVgqqDfPaJo5vkd+Qd/ItkoagnHpufr+i2QCHBsNYp+G7UAoyFl8aPtx879u38wPV65rZ8qbGZijalA==", + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.5.4.tgz", + "integrity": "sha512-VgYs2A2QIRuGphtzFV7aQJduJ2gyfTljngLzjpfW9FoYZF6xuw1W0vW9ghCKLfcWrCFxK81CSGRAvS1pn4fIUg==", "dev": true }, "uc.micro": { @@ -3597,9 +3763,9 @@ "dev": true }, "underscore": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.1.tgz", - "integrity": "sha512-hzSoAVtJF+3ZtiFX0VgfFPHEDRm7Y/QPjGyNo4TVdnDTdft3tr8hEkD25a1jC+TjTuE7tkHGKkhwCgs9dgBB2g==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.2.tgz", + "integrity": "sha512-ekY1NhRzq0B08g4bGuX4wd2jZx5GnKz6mKSqFL4nqBlfyMGiG10gDFhDTMEfYmDL6Jy0FUIZp7wiRB+0BP7J2g==", "dev": true }, "unique-filename": { @@ -3678,35 +3844,10 @@ "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" }, - "v8-compile-cache": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", - "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", - "dev": true - }, - "verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" - }, - "dependencies": { - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", - "dev": true - } - } - }, "vsce": { - "version": "1.99.0", - "resolved": "https://registry.npmjs.org/vsce/-/vsce-1.99.0.tgz", - "integrity": "sha512-fyzOLcmcgBmA+CYg0NyYU3JMmcOBcf94ZzZZYi83mIoXBRU391mYByoJEPnkl8xZGa3/OW5lH438/JOThlYPNA==", + "version": "1.103.1", + "resolved": "https://registry.npmjs.org/vsce/-/vsce-1.103.1.tgz", + "integrity": "sha512-98oKQKKRp7J/vTIk1cuzom5cezZpYpRHs3WlySdsrTCrAEipB/HvaPTc4VZ3hGZHzHXS9P5p2L0IllntJeXwiQ==", "dev": true, "requires": { "azure-devops-node-api": "^11.0.1", @@ -3716,6 +3857,7 @@ "denodeify": "^1.2.1", "glob": "^7.0.6", "hosted-git-info": "^4.0.2", + "keytar": "^7.7.0", "leven": "^3.1.0", "lodash": "^4.17.15", "markdown-it": "^10.0.0", @@ -3786,15 +3928,6 @@ "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", "dev": true }, - "hosted-git-info": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.0.2.tgz", - "integrity": "sha512-c9OGXbZ3guC/xOlCg1Ci/VgWlwsqDv1yMQL1CWqXDL0hDjXuNcq0zuR4xqPSuasI3kqFDhqSyTjREz5gzq0fXg==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, "semver": { "version": "5.7.1", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", @@ -3822,26 +3955,23 @@ } }, "vscode-extension-telemetry": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/vscode-extension-telemetry/-/vscode-extension-telemetry-0.1.7.tgz", - "integrity": "sha512-pZuZTHO9OpsrwlerOKotWBRLRYJ53DobYb7aWiRAXjlqkuqE+YJJaP+2WEy8GrLIF1EnitXTDMaTAKsmLQ5ORQ==", - "requires": { - "applicationinsights": "1.7.4" - } + "version": "0.4.5", + "resolved": "https://registry.npmjs.org/vscode-extension-telemetry/-/vscode-extension-telemetry-0.4.5.tgz", + "integrity": "sha512-YhPiPcelqM5xyYWmD46jIcsxLYWkPZhAxlBkzqmpa218fMtTT17ERdOZVCXcs1S5AjvDHlq43yCgi8TaVQjjEg==" }, "vscode-extension-telemetry-wrapper": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/vscode-extension-telemetry-wrapper/-/vscode-extension-telemetry-wrapper-0.9.0.tgz", - "integrity": "sha512-QQvCn40hryS1U0Vob/fxqDX+kc7oYn+viiYpq0QOMp7q6aNaFFmjL9Wv5QfBIC/h2Jb083LFF0Xz38hhX8nCVQ==", + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/vscode-extension-telemetry-wrapper/-/vscode-extension-telemetry-wrapper-0.11.0.tgz", + "integrity": "sha512-+Ep9D0rYzSwSr/KJTeUmbIa67ssQqhtN1ikypYgS9VfP8jFxNyASIabkXg0PXJfCzJovQCpBBtO05UUV6gP+6g==", "requires": { "uuid": "^3.4.0", - "vscode-extension-telemetry": "^0.1.6" + "vscode-extension-telemetry": "^0.4.4" } }, "vscode-extension-tester": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/vscode-extension-tester/-/vscode-extension-tester-4.2.0.tgz", - "integrity": "sha512-9ypQM+4VI1aDoCXhVORJ4tot+PyPukYf7U4xvN5vPZSXywIOuHfknoyjIz9uTyx7hdCSfDhytTFBoGa8nkFtlg==", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/vscode-extension-tester/-/vscode-extension-tester-4.2.3.tgz", + "integrity": "sha512-VNJTw4I1uGULiUdAlyf47zZ+J5nYnqkcHI9rjk/gjpymphYob5rRHk1og1vPUUT7rYTv5fYL2cJ8xpw7POe+5A==", "dev": true, "requires": { "@types/selenium-webdriver": "^3.0.15", @@ -3849,21 +3979,21 @@ "compare-versions": "^3.6.0", "fs-extra": "^10.0.0", "glob": "^7.1.7", + "got": "^11.8.2", "js-yaml": "^4.1.0", - "monaco-page-objects": "^1.7.0", - "request": "^2.88.0", + "monaco-page-objects": "^1.9.0", "sanitize-filename": "^1.6.3", "selenium-webdriver": "^3.0.0", "targz": "^1.0.1", "unzip-stream": "^0.3.0", "vsce": "^1.96.0", - "vscode-extension-tester-locators": "^1.60.0" + "vscode-extension-tester-locators": "^1.62.0" }, "dependencies": { "commander": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-8.2.0.tgz", - "integrity": "sha512-LLKxDvHeL91/8MIyTAD5BFMNtoIwztGPMiM/7Bl8rIPmHCZXRxmSWr91h57dpOpnQ6jIUqEWdXE/uBYMfiVZDA==", + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", + "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", "dev": true }, "fs-extra": { @@ -3905,17 +4035,17 @@ } }, "vscode-extension-tester-locators": { - "version": "1.60.1", - "resolved": "https://registry.npmjs.org/vscode-extension-tester-locators/-/vscode-extension-tester-locators-1.60.1.tgz", - "integrity": "sha512-87MZai9RM9aM4MBuQjzcDEg1MDlNkvSeF1FnnD4x/3usQfCUXrcptyR2N0BsFbWIRyxV8HZ+qbWVhvrtxm4Pew==", + "version": "1.62.0", + "resolved": "https://registry.npmjs.org/vscode-extension-tester-locators/-/vscode-extension-tester-locators-1.62.0.tgz", + "integrity": "sha512-7mGTy2Fm5VA5Go6tXnt4RrItmJnygWmlGHstWmwsYqtxEkJ5hHC4Cc59FhnaPtl/j0NlgQ+iSqPBoiQNC+J8cw==", "dev": true }, "vscode-tas-client": { - "version": "0.1.22", - "resolved": "https://registry.npmjs.org/vscode-tas-client/-/vscode-tas-client-0.1.22.tgz", - "integrity": "sha512-1sYH73nhiSRVQgfZkLQNJW7VzhKM9qNbCe8QyXgiKkLhH4GflDXRPAK4yy4P41jUgula+Fc9G7i5imj1dlKfaw==", + "version": "0.1.27", + "resolved": "https://registry.npmjs.org/vscode-tas-client/-/vscode-tas-client-0.1.27.tgz", + "integrity": "sha512-wyYSdbaSoInXmaXVO54ihvmG6uoRIQ4TdVctJgYqf66oTvUq6e5F3XgtiYRSM6yaqhI0rPqPrYIzLNOO524Z9A==", "requires": { - "tas-client": "0.1.21" + "tas-client": "0.1.26" } }, "vscode-test": { @@ -3951,9 +4081,9 @@ } }, "watchpack": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.2.0.tgz", - "integrity": "sha512-up4YAn/XHgZHIxFBVCdlMiWDj6WaLKpwVeGQk2I5thdYxF/KmF0aaz6TfJZ/hfl1h/XlcDr7k1KH7ThDagpFaA==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.3.1.tgz", + "integrity": "sha512-x0t0JuydIo8qCNctdDrn1OzH/qDzk2+rdCOC3YzumZ42fiMqmQ7T3xQurykYMhYfHaPHTp4ZxAx2NfUo1K6QaA==", "dev": true, "requires": { "glob-to-regexp": "^0.4.1", @@ -3961,9 +4091,9 @@ } }, "webpack": { - "version": "5.53.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.53.0.tgz", - "integrity": "sha512-RZ1Z3z3ni44snoWjfWeHFyzvd9HMVYDYC5VXmlYUT6NWgEOWdCNpad5Fve2CzzHoRED7WtsKe+FCyP5Vk4pWiQ==", + "version": "5.66.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.66.0.tgz", + "integrity": "sha512-NJNtGT7IKpGzdW7Iwpn/09OXz9inIkeIQ/ibY6B+MdV1x6+uReqz/5z1L89ezWnpPDWpXF0TY5PCYKQdWVn8Vg==", "dev": true, "requires": { "@types/eslint-scope": "^3.7.0", @@ -3975,12 +4105,12 @@ "acorn-import-assertions": "^1.7.6", "browserslist": "^4.14.5", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.8.0", - "es-module-lexer": "^0.7.1", + "enhanced-resolve": "^5.8.3", + "es-module-lexer": "^0.9.0", "eslint-scope": "5.1.1", "events": "^3.2.0", "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.2.4", + "graceful-fs": "^4.2.9", "json-parse-better-errors": "^1.0.2", "loader-runner": "^4.2.0", "mime-types": "^2.1.27", @@ -3988,36 +4118,41 @@ "schema-utils": "^3.1.0", "tapable": "^2.1.1", "terser-webpack-plugin": "^5.1.3", - "watchpack": "^2.2.0", - "webpack-sources": "^3.2.0" + "watchpack": "^2.3.1", + "webpack-sources": "^3.2.2" }, "dependencies": { + "graceful-fs": { + "version": "4.2.9", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.9.tgz", + "integrity": "sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ==", + "dev": true + }, "webpack-sources": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.1.tgz", - "integrity": "sha512-t6BMVLQ0AkjBOoRTZgqrWm7xbXMBzD+XDq2EZ96+vMfn3qKgsvdXZhbPZ4ElUOpdv4u+iiGe+w3+J75iy/bYGA==", + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", + "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", "dev": true } } }, "webpack-cli": { - "version": "4.8.0", - "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-4.8.0.tgz", - "integrity": "sha512-+iBSWsX16uVna5aAYN6/wjhJy1q/GKk4KjKvfg90/6hykCTSgozbfz5iRgDTSJt/LgSbYxdBX3KBHeobIs+ZEw==", + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-4.9.1.tgz", + "integrity": "sha512-JYRFVuyFpzDxMDB+v/nanUdQYcZtqFPGzmlW4s+UkPMFhSpfRNmf1z4AwYcHJVdvEFAM7FFCQdNTpsBYhDLusQ==", "dev": true, "requires": { "@discoveryjs/json-ext": "^0.5.0", - "@webpack-cli/configtest": "^1.0.4", - "@webpack-cli/info": "^1.3.0", - "@webpack-cli/serve": "^1.5.2", - "colorette": "^1.2.1", + "@webpack-cli/configtest": "^1.1.0", + "@webpack-cli/info": "^1.4.0", + "@webpack-cli/serve": "^1.6.0", + "colorette": "^2.0.14", "commander": "^7.0.0", "execa": "^5.0.0", "fastest-levenshtein": "^1.0.12", "import-local": "^3.0.2", "interpret": "^2.2.0", "rechoir": "^0.7.0", - "v8-compile-cache": "^2.2.0", "webpack-merge": "^5.7.3" }, "dependencies": { @@ -4061,12 +4196,6 @@ "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", "dev": true }, - "interpret": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-2.2.0.tgz", - "integrity": "sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==", - "dev": true - }, "is-stream": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", @@ -4088,15 +4217,6 @@ "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", "dev": true }, - "rechoir": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.7.1.tgz", - "integrity": "sha512-/njmZ8s1wVeR6pjTZ+0nCnv8SpZNRMT2D1RLOJQESlYFDBvwpTA4KWJpZ+sBJ4+vhjILRcK7JIFdGCdxEAAitg==", - "dev": true, - "requires": { - "resolve": "^1.9.0" - } - }, "shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", diff --git a/package.json b/package.json index e5bf1fc3..3945de1a 100644 --- a/package.json +++ b/package.json @@ -603,32 +603,32 @@ }, "devDependencies": { "@types/fs-extra": "^5.1.0", - "@types/glob": "^7.1.3", - "@types/lodash": "^4.14.168", + "@types/glob": "^7.2.0", + "@types/lodash": "^4.14.178", "@types/minimatch": "^3.0.3", "@types/mocha": "^8.2.1", "@types/node": "^8.10.66", - "@types/semver": "^7.3.8", + "@types/semver": "^7.3.9", "@types/vscode": "1.60.0", "copy-webpack-plugin": "^6.4.1", - "glob": "^7.1.6", + "glob": "^7.2.0", "mocha": "^8.3.1", "semver": "^7.3.5", "ts-loader": "^9.2.6", "tslint": "^5.20.1", - "typescript": "^4.4.3", - "vscode-extension-tester": "^4.2.0", + "typescript": "^4.5.4", + "vscode-extension-tester": "^4.2.3", "vscode-test": "^1.5.1", - "webpack": "^5.53.0", - "webpack-cli": "^4.8.0" + "webpack": "^5.66.0", + "webpack-cli": "^4.9.1" }, "dependencies": { "await-lock": "^2.1.0", "fs-extra": "^7.0.1", - "globby": "11.0.1", + "globby": "^11.1.0", "lodash": "^4.17.21", "minimatch": "^3.0.4", - "vscode-extension-telemetry-wrapper": "0.9.0", - "vscode-tas-client": "^0.1.22" + "vscode-extension-telemetry-wrapper": "^0.11.0", + "vscode-tas-client": "^0.1.27" } } From c57c34f9c3a80e0ec69e6501e78d6433f2f9a203 Mon Sep 17 00:00:00 2001 From: Sheng Chen Date: Thu, 13 Jan 2022 16:46:15 +0800 Subject: [PATCH 070/352] feat: Support creating JavaFX projects (#581) Signed-off-by: Sheng Chen --- package-lock.json | 19 +++++++--------- package.json | 2 +- src/controllers/projectController.ts | 34 ++++++++++++++++++++++++++++ test/ui/command.test.ts | 7 ++---- 4 files changed, 45 insertions(+), 17 deletions(-) diff --git a/package-lock.json b/package-lock.json index 7b7d7ce4..e6709c01 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1437,6 +1437,13 @@ "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", "dev": true }, + "fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "optional": true + }, "fstream": { "version": "1.0.12", "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.12.tgz", @@ -2074,7 +2081,6 @@ "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, "requires": { "yallist": "^4.0.0" } @@ -2372,13 +2378,6 @@ "path-exists": "^4.0.0" } }, - "fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, - "optional": true - }, "get-caller-file": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", @@ -3187,7 +3186,6 @@ "version": "7.3.5", "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", - "dev": true, "requires": { "lru-cache": "^6.0.0" } @@ -4324,8 +4322,7 @@ "yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" }, "yargs-unparser": { "version": "2.0.0", diff --git a/package.json b/package.json index 3945de1a..4d0ea883 100644 --- a/package.json +++ b/package.json @@ -613,7 +613,6 @@ "copy-webpack-plugin": "^6.4.1", "glob": "^7.2.0", "mocha": "^8.3.1", - "semver": "^7.3.5", "ts-loader": "^9.2.6", "tslint": "^5.20.1", "typescript": "^4.5.4", @@ -628,6 +627,7 @@ "globby": "^11.1.0", "lodash": "^4.17.21", "minimatch": "^3.0.4", + "semver": "^7.3.5", "vscode-extension-telemetry-wrapper": "^0.11.0", "vscode-tas-client": "^0.1.27" } diff --git a/src/controllers/projectController.ts b/src/controllers/projectController.ts index 355f69c6..2c346251 100644 --- a/src/controllers/projectController.ts +++ b/src/controllers/projectController.ts @@ -4,6 +4,7 @@ import * as fse from "fs-extra"; import * as _ from "lodash"; import * as path from "path"; +import * as semver from "semver"; import { commands, Disposable, Extension, ExtensionContext, extensions, QuickPickItem, Uri, window, workspace } from "vscode"; import { instrumentOperationAsVsCodeCommand } from "vscode-extension-telemetry-wrapper"; import { Commands } from "../commands"; @@ -58,6 +59,8 @@ export class ProjectController implements Disposable { if (choice.metadata.type === ProjectType.NoBuildTool) { await scaffoldSimpleProject(this.context); + } else if (choice.metadata.createCommandId && choice.metadata.createCommandArgs) { + await commands.executeCommand(choice.metadata.createCommandId, ...choice.metadata.createCommandArgs); } else if (choice.metadata.createCommandId) { await commands.executeCommand(choice.metadata.createCommandId); } @@ -75,7 +78,9 @@ interface IProjectTypeMetadata { type: ProjectType; extensionId: string; extensionName: string; + leastExtensionVersion?: string; createCommandId: string; + createCommandArgs?: any[]; } interface IProjectTypeQuickPick extends QuickPickItem { @@ -88,6 +93,7 @@ enum ProjectType { SpringBoot = "SpringBoot", Quarkus = "Quarkus", MicroProfile = "MicroProfile", + JavaFX = "JavaFX", } async function ensureExtension(typeName: string, metaData: IProjectTypeMetadata): Promise { @@ -101,6 +107,11 @@ async function ensureExtension(typeName: string, metaData: IProjectTypeMetadata) return false; } + if (metaData.leastExtensionVersion && semver.lt(extension.packageJSON.version, metaData.leastExtensionVersion)) { + await promptUpdateExtension(typeName, metaData); + return false; + } + await extension.activate(); return true; } @@ -112,6 +123,13 @@ async function promptInstallExtension(projectType: string, metaData: IProjectTyp } } +async function promptUpdateExtension(projectType: string, metaData: IProjectTypeMetadata): Promise { + const choice: string | undefined = await window.showInformationMessage(`${metaData.extensionName} needs to be updated to create ${projectType} projects. Please re-run the command 'Java: Create Java Project...' after the extension is updated.`, "Update"); + if (choice === "Update") { + commands.executeCommand(Commands.INSTALL_EXTENSION, metaData.extensionId); + } +} + async function scaffoldSimpleProject(context: ExtensionContext): Promise { const workspaceFolder = Utility.getDefaultWorkspaceFolder(); const location: Uri[] | undefined = await window.showOpenDialog({ @@ -205,4 +223,20 @@ const projectTypes: IProjectType[] = [ createCommandId: "extension.microProfileStarter", }, }, + { + displayName: "JavaFX", + description: "create from archetype", + metadata: { + type: ProjectType.JavaFX, + extensionId: "vscjava.vscode-maven", + extensionName: "Maven for Java", + leastExtensionVersion: "0.35.0", + createCommandId: "maven.archetype.generate", + createCommandArgs: [{ + archetypeGroupId: "org.openjfx", + archetypeArtifactId: "javafx-archetype-fxml", + archetypeVersion: "RELEASE", + }], + }, + }, ]; diff --git a/test/ui/command.test.ts b/test/ui/command.test.ts index e0af096b..4d98e415 100644 --- a/test/ui/command.test.ts +++ b/test/ui/command.test.ts @@ -282,11 +282,8 @@ describe("Command Tests", function() { await new Workbench().executeCommand("java.project.create"); let inputBox = await InputBox.create(); const picks = await inputBox.getQuickPicks(); - for (const quickPick of picks) { - if (await quickPick.getLabel() === "No build tools") { - await quickPick.click(); - } - } + assert.equal("No build tools", await picks[0].getLabel()); + await picks[0].select(); await sleep(3000); inputBox = await InputBox.create(); await inputBox.setText(targetPath); From 2f66bb113f130718e2613396ca231fc52647fb5f Mon Sep 17 00:00:00 2001 From: Sheng Chen Date: Tue, 18 Jan 2022 13:35:35 +0800 Subject: [PATCH 071/352] feat: Support creating new Gradle project (#583) Signed-off-by: sheche --- src/controllers/projectController.ts | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/controllers/projectController.ts b/src/controllers/projectController.ts index 2c346251..3d8bf3a3 100644 --- a/src/controllers/projectController.ts +++ b/src/controllers/projectController.ts @@ -90,6 +90,7 @@ interface IProjectTypeQuickPick extends QuickPickItem { enum ProjectType { NoBuildTool = "NoBuildTool", Maven = "Maven", + Gradle = "Gradle", SpringBoot = "SpringBoot", Quarkus = "Quarkus", MicroProfile = "MicroProfile", @@ -196,6 +197,16 @@ const projectTypes: IProjectType[] = [ createCommandId: "maven.archetype.generate", }, }, + { + displayName: "Gradle", + metadata: { + type: ProjectType.Gradle, + extensionId: "vscjava.vscode-gradle", + extensionName: "Gradle for Java", + leastExtensionVersion: "3.10.0", + createCommandId: "gradle.createProject", + }, + }, { displayName: "Spring Boot", metadata: { From 718e5ad620d2f409aebc91d998d2b6154fa6696d Mon Sep 17 00:00:00 2001 From: Shi Chen Date: Tue, 18 Jan 2022 13:43:36 +0800 Subject: [PATCH 072/352] chore: Deprecate document of `askUser` (#575) --- README.md | 2 +- package.json | 23 ++++++++++++++++++----- package.nls.json | 5 ++--- package.nls.zh.json | 5 ++--- 4 files changed, 23 insertions(+), 12 deletions(-) diff --git a/README.md b/README.md index 7c6970cd..06e5c8df 100644 --- a/README.md +++ b/README.md @@ -69,7 +69,7 @@ You can tell that the glob pattern is supported. And here's more - you can incl | `java.dependency.autoRefresh` | Specify whether to automatically sync the change from editor to the Java Projects explorer. | `true` | | `java.dependency.refreshDelay` | The delay time (ms) the auto refresh is invoked when changes are detected. | `2000ms` | | `java.dependency.packagePresentation` | Specify how to display the package. Supported values are: `flat`, `hierarchical`.| `flat` | -| `java.project.exportJar.targetPath` | The output path of export jar. When this setting is **empty** or equals `askUser`, a file explorer will pop up to let the user select the output location.| `${workspaceFolder}/${workspaceFolderBasename}.jar` | +| `java.project.exportJar.targetPath` | The output path of export jar. When this setting is **empty** , a file explorer will pop up to let the user select the output location.| `${workspaceFolder}/${workspaceFolderBasename}.jar` | ## Contribution diff --git a/package.json b/package.json index 4d0ea883..79f6f6aa 100644 --- a/package.json +++ b/package.json @@ -210,18 +210,16 @@ { "enum": [ "${workspaceFolder}/${workspaceFolderBasename}.jar", - "askUser", "" ], "enumDescriptions": [ "%configuration.java.project.exportJar.targetPath.workspaceFolder%", - "%configuration.java.project.exportJar.targetPath.askUser%", - "%configuration.java.project.exportJar.targetPath.askUser%" + "%configuration.java.project.exportJar.targetPath.select%" ] }, "string" ], - "markdownDescription": "%configuration.java.project.exportJar.targetPath%", + "markdownDescription": "%configuration.java.project.exportJar.targetPath.customization%", "default": "${workspaceFolder}/${workspaceFolderBasename}.jar" } } @@ -561,7 +559,22 @@ }, "targetPath": { "type": "string", - "description": "%taskDefinitions.java.project.exportJar.targetPath%" + "anyOf": [ + { + "type": "string" + }, + { + "enum": [ + "${workspaceFolder}/${workspaceFolderBasename}.jar", + "" + ], + "enumDescriptions": [ + "%configuration.java.project.exportJar.targetPath.workspaceFolder%", + "%configuration.java.project.exportJar.targetPath.select%" + ] + } + ], + "description": "%configuration.java.project.exportJar.targetPath.customization%" }, "elements": { "type": "array", diff --git a/package.nls.json b/package.nls.json index b7534d58..c68f3bb9 100644 --- a/package.nls.json +++ b/package.nls.json @@ -26,13 +26,12 @@ "configuration.java.dependency.autoRefresh": "Synchronize Java Projects explorer with changes", "configuration.java.dependency.refreshDelay": "The delay time (ms) the auto refresh is invoked when changes are detected", "configuration.java.dependency.packagePresentation": "Package presentation mode: flat or hierarchical", - "configuration.java.project.exportJar.targetPath": "Specifies the output path of export jar. The default value is `${workspaceFolder}/${workspaceFolderBasename}.jar`. To select the output location manually each time exporting the jar file, simply leave it empty or set it to `askUser`.", + "configuration.java.project.exportJar.targetPath.customization": "The output path of the exported jar. Leave it empty if you want to manually pick the output location.", "configuration.java.project.exportJar.targetPath.workspaceFolder": "Export the jar file into the workspace folder. Its name is the same as the folder's.", - "configuration.java.project.exportJar.targetPath.askUser": "You will select the output location manually each time exporting the jar file.", + "configuration.java.project.exportJar.targetPath.select": "Select output location manually when exporting the jar file.", "taskDefinitions.java.project.exportJar.label": "The label of export jar task.", "taskDefinitions.java.project.exportJar.elements": "The content list of the exported jar.", "taskDefinitions.java.project.exportJar.mainClass": "The main class in the manifest of the exported jar.", - "taskDefinitions.java.project.exportJar.targetPath": "The output path of the exported jar. This will override configuration.java.project.exportJar.targetPath.", "taskDefinitions.java.project.exportJar.compileOutput": "The folders containing output class files in the runtime scope.", "taskDefinitions.java.project.exportJar.testCompileOutput": "The folders containing output class files in the test scope.", "taskDefinitions.java.project.exportJar.dependencies": "The artifact dependencies in the runtime scope.", diff --git a/package.nls.zh.json b/package.nls.zh.json index a24c56cb..314a8392 100644 --- a/package.nls.zh.json +++ b/package.nls.zh.json @@ -26,13 +26,12 @@ "configuration.java.dependency.autoRefresh": "在 Java 项目管理器中自动同步修改", "configuration.java.dependency.refreshDelay": "控制 Java 项目管理器刷新的延迟时间 (毫秒)", "configuration.java.dependency.packagePresentation": "Java 包显示方式: 平行显示或者分层显示", - "configuration.java.project.exportJar.targetPath": "导出 Jar 文件的默认路径,默认值为 `${workspaceFolder}/${workspaceFolderBasename}.jar` 。您也可以将此选项置为空串或 `askUser` 来手动选择 jar 文件的导出目录。", + "configuration.java.project.exportJar.targetPath.customization": "导出 Jar 文件的路径。您可以将此选项置为空串来手动选择 jar 文件的导出路径。", "configuration.java.project.exportJar.targetPath.workspaceFolder": "导出 Jar 文件到工作空间文件夹下。Jar 文件的名称和工作空间文件夹的名称相同。", - "configuration.java.project.exportJar.targetPath.askUser": "您将在每次导出 jar 文件时手动选择输出目录。", + "configuration.java.project.exportJar.targetPath.select": "在导出 Jar 文件时手动选择输出目录。", "taskDefinitions.java.project.exportJar.label": "导出 Jar 任务的名称。", "taskDefinitions.java.project.exportJar.elements": "导出 Jar 文件的内容列表。", "taskDefinitions.java.project.exportJar.mainClass": "导出 Jar 文件的 main 函数所在的类。", - "taskDefinitions.java.project.exportJar.targetPath": "导出 Jar 文件的输出路径。将会覆盖配置项: configuration.java.project.exportJar.targetPath 的值。", "taskDefinitions.java.project.exportJar.compileOutput": "在 runtime scope 内包含输出的 class 文件的文件夹。", "taskDefinitions.java.project.exportJar.testCompileOutput": "在 test scope 内包含输出的 class 文件的文件夹。", "taskDefinitions.java.project.exportJar.dependencies": "在 runtime scope 内的依赖。", From 52eddf63411a963f85c0ebba4e47d5d4ebedbfe0 Mon Sep 17 00:00:00 2001 From: Sheng Chen Date: Wed, 19 Jan 2022 20:20:00 +0800 Subject: [PATCH 073/352] fix: Add default setting for referenced libraries (#584) Signed-off-by: Sheng Chen --- templates/invisible-project/.vscode/settings.json | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/templates/invisible-project/.vscode/settings.json b/templates/invisible-project/.vscode/settings.json index 96ee3d15..e112a702 100644 --- a/templates/invisible-project/.vscode/settings.json +++ b/templates/invisible-project/.vscode/settings.json @@ -1,4 +1,7 @@ { "java.project.sourcePaths": ["src"], - "java.project.outputPath": "bin" + "java.project.outputPath": "bin", + "java.project.referencedLibraries": [ + "lib/**/*.jar" + ] } From f7a4e73f9f49d9489ec062d615c6d1f5f3b3b2e3 Mon Sep 17 00:00:00 2001 From: Sheng Chen Date: Thu, 20 Jan 2022 10:46:08 +0800 Subject: [PATCH 074/352] chore: Prepare for 0.19.0 (#585) Signed-off-by: Sheng Chen --- CHANGELOG.md | 9 ++++++++ .../META-INF/MANIFEST.MF | 2 +- .../com.microsoft.jdtls.ext.activator/pom.xml | 2 +- .../META-INF/MANIFEST.MF | 2 +- .../com.microsoft.jdtls.ext.core/pom.xml | 2 +- jdtls.ext/pom.xml | 2 +- package-lock.json | 22 +++++++++---------- package.json | 6 ++--- 8 files changed, 28 insertions(+), 19 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 213d03af..14d746ba 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,15 @@ All notable changes to the "vscode-java-dependency" extension will be documented The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/) and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html). +## 0.19.0 +### Added +- Support creating new JavaFX project via Maven archetype. [PR#581](https://github.com/microsoft/vscode-java-dependency/pull/581) +- Support creating new Gradle project. [PR#583](https://github.com/microsoft/vscode-java-dependency/pull/583) + +### Changed +- Now you can simply leave the setting `java.project.exportJar.targetPath` empty when you want to specify the location of exported jar manually. [PR#575](https://github.com/microsoft/vscode-java-dependency/pull/575) +- Add the `java.project.referencedLibraries` setting by default when creating an unmanaged folder project. [PR#584](https://github.com/microsoft/vscode-java-dependency/pull/584) + ## 0.18.9 ### Fixed - [Bugs fixed](https://github.com/microsoft/vscode-java-dependency/issues?q=is%3Aissue+label%3Abug+milestone%3A0.18.9+is%3Aclosed) diff --git a/jdtls.ext/com.microsoft.jdtls.ext.activator/META-INF/MANIFEST.MF b/jdtls.ext/com.microsoft.jdtls.ext.activator/META-INF/MANIFEST.MF index 1c35302e..3d205675 100644 --- a/jdtls.ext/com.microsoft.jdtls.ext.activator/META-INF/MANIFEST.MF +++ b/jdtls.ext/com.microsoft.jdtls.ext.activator/META-INF/MANIFEST.MF @@ -2,7 +2,7 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: JDTLS EXT Activator Bundle-SymbolicName: com.microsoft.jdtls.ext.activator;singleton:=true -Bundle-Version: 0.18.9 +Bundle-Version: 0.19.0 Bundle-Activator: com.microsoft.jdtls.ext.activator.JdtlsExtActivator Bundle-RequiredExecutionEnvironment: JavaSE-1.8 Import-Package: org.eclipse.jdt.core, diff --git a/jdtls.ext/com.microsoft.jdtls.ext.activator/pom.xml b/jdtls.ext/com.microsoft.jdtls.ext.activator/pom.xml index 06a71bab..e5cb94b1 100644 --- a/jdtls.ext/com.microsoft.jdtls.ext.activator/pom.xml +++ b/jdtls.ext/com.microsoft.jdtls.ext.activator/pom.xml @@ -5,7 +5,7 @@ com.microsoft.jdtls.ext jdtls-ext-parent - 0.18.9 + 0.19.0 com.microsoft.jdtls.ext.activator eclipse-plugin diff --git a/jdtls.ext/com.microsoft.jdtls.ext.core/META-INF/MANIFEST.MF b/jdtls.ext/com.microsoft.jdtls.ext.core/META-INF/MANIFEST.MF index ab998dc5..07e88481 100644 --- a/jdtls.ext/com.microsoft.jdtls.ext.core/META-INF/MANIFEST.MF +++ b/jdtls.ext/com.microsoft.jdtls.ext.core/META-INF/MANIFEST.MF @@ -2,7 +2,7 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: JDTLS EXT Core Bundle-SymbolicName: com.microsoft.jdtls.ext.core;singleton:=true -Bundle-Version: 0.18.9 +Bundle-Version: 0.19.0 Bundle-Activator: com.microsoft.jdtls.ext.core.JdtlsExtActivator Bundle-RequiredExecutionEnvironment: JavaSE-1.8 Bundle-ActivationPolicy: lazy diff --git a/jdtls.ext/com.microsoft.jdtls.ext.core/pom.xml b/jdtls.ext/com.microsoft.jdtls.ext.core/pom.xml index 08dff420..02c63e16 100644 --- a/jdtls.ext/com.microsoft.jdtls.ext.core/pom.xml +++ b/jdtls.ext/com.microsoft.jdtls.ext.core/pom.xml @@ -5,7 +5,7 @@ com.microsoft.jdtls.ext jdtls-ext-parent - 0.18.9 + 0.19.0 com.microsoft.jdtls.ext.core eclipse-plugin diff --git a/jdtls.ext/pom.xml b/jdtls.ext/pom.xml index 1c0087a2..7afcbbb5 100644 --- a/jdtls.ext/pom.xml +++ b/jdtls.ext/pom.xml @@ -4,7 +4,7 @@ com.microsoft.jdtls.ext jdtls-ext-parent ${base.name} :: Parent - 0.18.9 + 0.19.0 pom Java Project Manager diff --git a/package-lock.json b/package-lock.json index e6709c01..df20d77a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "vscode-java-dependency", - "version": "0.18.9", + "version": "0.19.0", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -299,6 +299,11 @@ "integrity": "sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==", "dev": true }, + "@vscode/extension-telemetry": { + "version": "0.4.6", + "resolved": "https://registry.npmjs.org/@vscode/extension-telemetry/-/extension-telemetry-0.4.6.tgz", + "integrity": "sha512-bDXwHoNXIR1Rc8xdphJ4B3rWdzAGm+FUPk4mJl6/oyZmfEX+QdlDLxnCwlv/vxHU1p11ThHSB8kRhsWZ1CzOqw==" + }, "@webassemblyjs/ast": { "version": "1.11.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz", @@ -3952,18 +3957,13 @@ } } }, - "vscode-extension-telemetry": { - "version": "0.4.5", - "resolved": "https://registry.npmjs.org/vscode-extension-telemetry/-/vscode-extension-telemetry-0.4.5.tgz", - "integrity": "sha512-YhPiPcelqM5xyYWmD46jIcsxLYWkPZhAxlBkzqmpa218fMtTT17ERdOZVCXcs1S5AjvDHlq43yCgi8TaVQjjEg==" - }, "vscode-extension-telemetry-wrapper": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/vscode-extension-telemetry-wrapper/-/vscode-extension-telemetry-wrapper-0.11.0.tgz", - "integrity": "sha512-+Ep9D0rYzSwSr/KJTeUmbIa67ssQqhtN1ikypYgS9VfP8jFxNyASIabkXg0PXJfCzJovQCpBBtO05UUV6gP+6g==", + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/vscode-extension-telemetry-wrapper/-/vscode-extension-telemetry-wrapper-0.11.1.tgz", + "integrity": "sha512-O8yrlxQNJCfuNylJ1tGTICEGszoNyexw9ZAaZ5EskOPcCEua96/9q/Fn6Xif1suLwReMcVplGR043fnF0ZAoFA==", "requires": { - "uuid": "^3.4.0", - "vscode-extension-telemetry": "^0.4.4" + "@vscode/extension-telemetry": "^0.4.6", + "uuid": "^3.4.0" } }, "vscode-extension-tester": { diff --git a/package.json b/package.json index 79f6f6aa..077b545d 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "vscode-java-dependency", "displayName": "Project Manager for Java", "description": "%description%", - "version": "0.18.9", + "version": "0.19.0", "publisher": "vscjava", "preview": true, "aiKey": "5c642b22-e845-4400-badb-3f8509a70777", @@ -42,7 +42,7 @@ "main": "./main.js", "contributes": { "javaExtensions": [ - "./server/com.microsoft.jdtls.ext.core-0.18.9.jar" + "./server/com.microsoft.jdtls.ext.core-0.19.0.jar" ], "commands": [ { @@ -641,7 +641,7 @@ "lodash": "^4.17.21", "minimatch": "^3.0.4", "semver": "^7.3.5", - "vscode-extension-telemetry-wrapper": "^0.11.0", + "vscode-extension-telemetry-wrapper": "^0.11.1", "vscode-tas-client": "^0.1.27" } } From 4eba6f6516ca144280f0b91d6ada3023cf96f15c Mon Sep 17 00:00:00 2001 From: Sheng Chen Date: Mon, 24 Jan 2022 10:48:40 +0800 Subject: [PATCH 075/352] chore: Update target platform (#587) Signed-off-by: Sheng Chen --- jdtls.ext/pom.xml | 10 +++++----- jdtls.ext/target.target | 6 +++--- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/jdtls.ext/pom.xml b/jdtls.ext/pom.xml index 7afcbbb5..a18cce96 100644 --- a/jdtls.ext/pom.xml +++ b/jdtls.ext/pom.xml @@ -119,7 +119,7 @@ 202006 p2 - http://download.eclipse.org/releases/2020-06/ + https://download.eclipse.org/releases/2021-09/202109151000/ oss.sonatype.org @@ -131,22 +131,22 @@ JDT.LS p2 - http://download.eclipse.org/jdtls/snapshots/repository/latest/ + https://download.eclipse.org/jdtls/snapshots/repository/latest/ LSP4J p2 - http://download.eclipse.org/lsp4j/updates/releases/0.5.0/ + https://download.eclipse.org/lsp4j/updates/releases/0.11.0/ JBOLL.TOOLS p2 - http://download.jboss.org/jbosstools/updates/m2e-extensions/m2e-apt/1.5.2-2018-12-24_15-46-05-H18/ + https://download.jboss.org/jbosstools/updates/m2e-extensions/m2e-apt/1.5.3-2019-11-08_11-04-22-H22/ orbit p2 - http://download.eclipse.org/tools/orbit/R-builds/R20170516192513/repository/ + https://download.eclipse.org/tools/orbit/R-builds/R20200529191137/repository/ diff --git a/jdtls.ext/target.target b/jdtls.ext/target.target index a36584d9..89340733 100644 --- a/jdtls.ext/target.target +++ b/jdtls.ext/target.target @@ -20,18 +20,18 @@ - + - + - + From f2a099eaceeffa6876fab805fe4dcd36e2039c19 Mon Sep 17 00:00:00 2001 From: Shi Chen Date: Fri, 11 Feb 2022 15:03:10 +0800 Subject: [PATCH 076/352] chore: Update dependency (#592) --- package-lock.json | 1612 +++++++++++++++++---------------------------- package.json | 16 +- 2 files changed, 610 insertions(+), 1018 deletions(-) diff --git a/package-lock.json b/package-lock.json index df20d77a..6482fd28 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5,27 +5,27 @@ "requires": true, "dependencies": { "@babel/code-frame": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.14.5.tgz", - "integrity": "sha512-9pzDqyc6OLDaqe+zbACgFkb6fKMNG6CObKpnYXChRsvYGyEdc7CA2BaqeOM+vOtCS5ndmJicPJhKAwYRI6UfFw==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz", + "integrity": "sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==", "dev": true, "requires": { - "@babel/highlight": "^7.14.5" + "@babel/highlight": "^7.16.7" } }, "@babel/helper-validator-identifier": { - "version": "7.15.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.15.7.tgz", - "integrity": "sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", + "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==", "dev": true }, "@babel/highlight": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.5.tgz", - "integrity": "sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg==", + "version": "7.16.10", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.10.tgz", + "integrity": "sha512-5FnTQLSLswEj6IkgVw5KusNUUFY9ZGqe/TRFnP/BKYHYgfh7tc+C7mwiy95/yNP7Dh9x580Vv8r7u7ZfTBFxdw==", "dev": true, "requires": { - "@babel/helper-validator-identifier": "^7.14.5", + "@babel/helper-validator-identifier": "^7.16.7", "chalk": "^2.0.0", "js-tokens": "^4.0.0" }, @@ -94,12 +94,6 @@ "integrity": "sha512-ws57AidsDvREKrZKYffXddNkyaF14iHNHm8VQnZH6t99E8gczjNN0GpvcGny0imC80yQ0tHz1xVUKk/KFQSUyA==", "dev": true }, - "@gar/promisify": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.2.tgz", - "integrity": "sha512-82cpyJyKRoQoRi+14ibCeGPu0CwypgtBAdBhq1WfvagpCZNKqwXbKwXllYSMG91DhmG4jt9gN8eP6lGOtozuaw==", - "dev": true - }, "@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -123,30 +117,10 @@ "fastq": "^1.6.0" } }, - "@npmcli/fs": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-1.0.0.tgz", - "integrity": "sha512-8ltnOpRR/oJbOp8vaGUnipOi3bqkcW+sLHFlyXIr08OGHmVJLB1Hn7QtGXbYcpVtH1gAYZTlmDXtE4YV0+AMMQ==", - "dev": true, - "requires": { - "@gar/promisify": "^1.0.1", - "semver": "^7.3.5" - } - }, - "@npmcli/move-file": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-1.1.2.tgz", - "integrity": "sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg==", - "dev": true, - "requires": { - "mkdirp": "^1.0.4", - "rimraf": "^3.0.2" - } - }, "@sindresorhus/is": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.2.1.tgz", - "integrity": "sha512-BrzrgtaqEre0qfvI8sMTaEvx+bayuhPmfe2rfeUGPPHYr/PLxCOqkOe4TQTDPb+qcqgNcsAtXV/Ew74mcDIE8w==", + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.4.0.tgz", + "integrity": "sha512-QppPM/8l3Mawvh4rn9CNEYIU9bxpXUCRMaX9yUpvBk1nMKusLKpfXGDEKExKaPhLzcn3lzil7pR6rnJ11HgeRQ==", "dev": true }, "@szmarczak/http-timer": { @@ -177,9 +151,9 @@ } }, "@types/eslint": { - "version": "8.2.2", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.2.2.tgz", - "integrity": "sha512-nQxgB8/Sg+QKhnV8e0WzPpxjIGT3tuJDDzybkDi8ItE/IgTlHo07U0shaIjzhcvQxlq9SDRE42lsJ23uvEgJ2A==", + "version": "8.4.1", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.4.1.tgz", + "integrity": "sha512-GE44+DNEyxxh2Kc6ro/VkIj+9ma0pO0bwv9+uHSyBrikYOHr8zYcdPvnBOp1aw8s+CjRvuSx7CyWqRrNFQ59mA==", "dev": true, "requires": { "@types/estree": "*", @@ -203,9 +177,9 @@ "dev": true }, "@types/fs-extra": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-5.1.0.tgz", - "integrity": "sha512-AInn5+UBFIK9FK5xc9yP5e3TQSPNNgjHByqYcj9g5elVBnDQcQL7PlO1CIRy2gWlbwK7UPYqi7vRvFA44dCmYQ==", + "version": "9.0.13", + "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-9.0.13.tgz", + "integrity": "sha512-nEnwB++1u5lVDM2UI4c1+5R+FYaKfaAzS4OococimjVm3nQw3TuzH5UNsocrcTBbhnerblyHj4A49qXbIiZdpA==", "dev": true, "requires": { "@types/node": "*" @@ -255,15 +229,15 @@ "dev": true }, "@types/mocha": { - "version": "8.2.3", - "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-8.2.3.tgz", - "integrity": "sha512-ekGvFhFgrc2zYQoX4JeZPmVzZxw6Dtllga7iGHzfbYIYkAMUx/sAFP2GdFpLff+vdHXu5fl7WX9AT+TtqYcsyw==", + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-9.1.0.tgz", + "integrity": "sha512-QCWHkbMv4Y5U9oW10Uxbr45qMMSzl4OzijsozynUAgx3kEHUdXB00udx2dWDQ7f2TU2a2uuiFaRZjCe3unPpeg==", "dev": true }, "@types/node": { - "version": "8.10.66", - "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.66.tgz", - "integrity": "sha512-tktOkFUA4kXx2hhhrB8bIFb5TbwzS4uOhKEmwiD+NoiL0qtP2OQ9mFldbgD4dV1djrlBYP6eBuQZiWjuHUpqFw==", + "version": "14.18.11", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.11.tgz", + "integrity": "sha512-zCoCEMA+IPpsRkyCFBqew5vGb7r8RSiB3uwdu/map7uwLAfu1MTazW26/pUDWoNnF88vJz4W3U56i5gtXNqxGg==", "dev": true }, "@types/responselike": { @@ -300,9 +274,9 @@ "dev": true }, "@vscode/extension-telemetry": { - "version": "0.4.6", - "resolved": "https://registry.npmjs.org/@vscode/extension-telemetry/-/extension-telemetry-0.4.6.tgz", - "integrity": "sha512-bDXwHoNXIR1Rc8xdphJ4B3rWdzAGm+FUPk4mJl6/oyZmfEX+QdlDLxnCwlv/vxHU1p11ThHSB8kRhsWZ1CzOqw==" + "version": "0.4.9", + "resolved": "https://registry.npmjs.org/@vscode/extension-telemetry/-/extension-telemetry-0.4.9.tgz", + "integrity": "sha512-ZQIqlcgJU462oyQJDVgmEKNSSibEp1CRs0ECoa43gwgkt877Jm2dpz5G+KQhXad/zJy1sxTq8r/5kD75nq4W8Q==" }, "@webassemblyjs/ast": { "version": "1.11.1", @@ -451,24 +425,24 @@ } }, "@webpack-cli/configtest": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-1.1.0.tgz", - "integrity": "sha512-ttOkEkoalEHa7RaFYpM0ErK1xc4twg3Am9hfHhL7MVqlHebnkYd2wuI/ZqTDj0cVzZho6PdinY0phFZV3O0Mzg==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-1.1.1.tgz", + "integrity": "sha512-1FBc1f9G4P/AxMqIgfZgeOTuRnwZMten8E7zap5zgpPInnCrP8D4Q81+4CWIch8i/Nf7nXjP0v6CjjbHOrXhKg==", "dev": true }, "@webpack-cli/info": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-1.4.0.tgz", - "integrity": "sha512-F6b+Man0rwE4n0409FyAJHStYA5OIZERxmnUfLVwv0mc0V1wLad3V7jqRlMkgKBeAq07jUvglacNaa6g9lOpuw==", + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-1.4.1.tgz", + "integrity": "sha512-PKVGmazEq3oAo46Q63tpMr4HipI3OPfP7LiNOEJg963RMgT0rqheag28NCML0o3GIzA3DmxP1ZIAv9oTX1CUIA==", "dev": true, "requires": { "envinfo": "^7.7.3" } }, "@webpack-cli/serve": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-1.6.0.tgz", - "integrity": "sha512-ZkVeqEmRpBV2GHvjjUZqEai2PpUbuq8Bqd//vEYsp63J8WyexI8ppCqVS3Zs0QADf6aWuPdU+0XsPI647PVlQA==", + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-1.6.1.tgz", + "integrity": "sha512-gNGTiTrjEVQ0OcVnzsRSqTxaBSr+dmTfm+qJsCDluky8uhdLWep7Gcr62QsAKHTMxjCS/8nEITsmFAhfIx+QSw==", "dev": true }, "@xtuc/ieee754": { @@ -502,33 +476,6 @@ "dev": true, "requires": { "debug": "4" - }, - "dependencies": { - "debug": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", - "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - } - } - }, - "aggregate-error": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", - "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", - "dev": true, - "requires": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" } }, "ajv": { @@ -549,6 +496,12 @@ "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", "dev": true }, + "ansi-colors": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", + "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", + "dev": true + }, "ansi-regex": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", @@ -564,6 +517,16 @@ "color-convert": "^2.0.1" } }, + "anymatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", + "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", + "dev": true, + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, "aproba": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", @@ -592,11 +555,6 @@ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", "dev": true }, - "array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==" - }, "await-lock": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/await-lock/-/await-lock-2.1.0.tgz", @@ -632,15 +590,9 @@ "dev": true }, "big-integer": { - "version": "1.6.49", - "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.49.tgz", - "integrity": "sha512-KJ7VhqH+f/BOt9a3yMwJNmcZjG53ijWMTjSAGMveQWyLwqIiwkjNP5PFgDob3Snnx86SjDj6I89fIbv0dkQeNw==", - "dev": true - }, - "big.js": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", - "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "version": "1.6.51", + "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.51.tgz", + "integrity": "sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg==", "dev": true }, "binary": { @@ -653,6 +605,12 @@ "chainsaw": "~0.1.0" } }, + "binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true + }, "bl": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.3.tgz", @@ -773,32 +731,6 @@ "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", "dev": true }, - "cacache": { - "version": "15.3.0", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.3.0.tgz", - "integrity": "sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ==", - "dev": true, - "requires": { - "@npmcli/fs": "^1.0.0", - "@npmcli/move-file": "^1.0.1", - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "glob": "^7.1.4", - "infer-owner": "^1.0.4", - "lru-cache": "^6.0.0", - "minipass": "^3.1.1", - "minipass-collect": "^1.0.2", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.2", - "mkdirp": "^1.0.3", - "p-map": "^4.0.0", - "promise-inflight": "^1.0.1", - "rimraf": "^3.0.2", - "ssri": "^8.0.1", - "tar": "^6.0.2", - "unique-filename": "^1.1.1" - } - }, "cacheable-lookup": { "version": "5.0.4", "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz", @@ -830,10 +762,16 @@ "get-intrinsic": "^1.0.2" } }, + "camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true + }, "caniuse-lite": { - "version": "1.0.30001299", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001299.tgz", - "integrity": "sha512-iujN4+x7QzqA2NCSrS5VUy+4gLmRd4xv6vbBBsmfVqTx8bLAD8097euLqQgKxSVLvxjSDcvF1T/i9ocgnUFexw==", + "version": "1.0.30001310", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001310.tgz", + "integrity": "sha512-cb9xTV8k9HTIUA3GnPUJCk0meUnrHL5gy5QePfDjxHyNBcnzPzrHFv5GqfP7ue5b1ZyzZL0RJboD6hQlPXjhjg==", "dev": true }, "chainsaw": { @@ -902,11 +840,32 @@ "domutils": "^2.7.0" } }, - "chownr": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", - "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", - "dev": true + "chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "dev": true, + "requires": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "fsevents": "~2.3.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "dependencies": { + "glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + } + } }, "chrome-trace-event": { "version": "1.0.3", @@ -914,12 +873,6 @@ "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", "dev": true }, - "clean-stack": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", - "dev": true - }, "clipboardy": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/clipboardy/-/clipboardy-2.3.0.tgz", @@ -931,6 +884,51 @@ "is-wsl": "^2.1.1" } }, + "cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dev": true, + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true + }, + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.1" + } + } + } + }, "clone-deep": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", @@ -984,12 +982,6 @@ "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", "dev": true }, - "commondir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", - "dev": true - }, "compare-versions": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-3.6.0.tgz", @@ -1008,22 +1000,17 @@ "dev": true }, "copy-webpack-plugin": { - "version": "6.4.1", - "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-6.4.1.tgz", - "integrity": "sha512-MXyPCjdPVx5iiWyl40Va3JGh27bKzOTNY3NjUTrosD2q7dR/cLD0013uqJ3BpFbUjyONINjb6qI7nDIJujrMbA==", + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-9.1.0.tgz", + "integrity": "sha512-rxnR7PaGigJzhqETHGmAcxKnLZSR5u1Y3/bcIv/1FnqXedcL/E2ewK7ZCNrArJKCiSv8yVXhTqetJh8inDvfsA==", "dev": true, "requires": { - "cacache": "^15.0.5", - "fast-glob": "^3.2.4", - "find-cache-dir": "^3.3.1", - "glob-parent": "^5.1.1", - "globby": "^11.0.1", - "loader-utils": "^2.0.0", + "fast-glob": "^3.2.7", + "glob-parent": "^6.0.1", + "globby": "^11.0.3", "normalize-path": "^3.0.0", - "p-limit": "^3.0.2", - "schema-utils": "^3.0.0", - "serialize-javascript": "^5.0.1", - "webpack-sources": "^1.4.3" + "schema-utils": "^3.1.1", + "serialize-javascript": "^6.0.0" } }, "core-util-is": { @@ -1050,6 +1037,15 @@ "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", "dev": true + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } } } }, @@ -1072,6 +1068,21 @@ "integrity": "sha512-arSMRWIIFY0hV8pIxZMEfmMI47Wj3R/aWpZDDxWYCPEiOMv6tfOrnpDtgxBYPEQD4V0Y/958+1TdC3iWTFcUPw==", "dev": true }, + "debug": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "decamelize": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", + "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", + "dev": true + }, "decompress-response": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", @@ -1107,22 +1118,16 @@ "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", "dev": true }, - "denodeify": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/denodeify/-/denodeify-1.2.1.tgz", - "integrity": "sha1-OjYof1A05pnnV3kBBSwubJQlFjE=", - "dev": true - }, "detect-libc": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", - "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.0.tgz", + "integrity": "sha512-S55LzUl8HUav8l9E2PBTlC5PAJrHK7tkM+XXFGD+fbsbkTzhCpG6K05LxJcUOEWzMa4v6ptcMZ9s3fOdJDu0Zw==", "dev": true }, "diff": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", - "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", "dev": true }, "dir-glob": { @@ -1180,9 +1185,9 @@ } }, "electron-to-chromium": { - "version": "1.4.43", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.43.tgz", - "integrity": "sha512-PO3kEfcxPrti/4STbXvCkNIF4fgWvCKl2508e6UI7KomCDffpIfeBZLXsh5DK/XGsjUw3kwq6WEsi0MJTlGAdg==", + "version": "1.4.68", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.68.tgz", + "integrity": "sha512-cId+QwWrV8R1UawO6b9BR1hnkJ4EJPCPAr4h315vliHUtVUJDk39Sg1PMNnaWKfj5x+93ssjeJ9LKL6r8LaMiA==", "dev": true }, "emoji-regex": { @@ -1191,12 +1196,6 @@ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "dev": true }, - "emojis-list": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", - "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", - "dev": true - }, "end-of-stream": { "version": "1.4.4", "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", @@ -1207,9 +1206,9 @@ } }, "enhanced-resolve": { - "version": "5.8.3", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.8.3.tgz", - "integrity": "sha512-EGAbGvH7j7Xt2nc0E7D99La1OiEs8LnyimkRgwExpUMScN6O+3x9tIWs7PLQZVNx4YD+00skHXPXi1yQHpAmZA==", + "version": "5.9.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.9.0.tgz", + "integrity": "sha512-weDYmzbBygL7HzGGS26M3hGQx68vehdEg6VUmqSOaFzXExFqlnKuSvsEJCVGQHScS8CQMbrAqftT+AzzHNt/YA==", "dev": true, "requires": { "graceful-fs": "^4.2.4", @@ -1330,16 +1329,25 @@ "dev": true }, "fast-glob": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.7.tgz", - "integrity": "sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q==", - "dev": true, + "version": "3.2.11", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz", + "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==", "requires": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", "glob-parent": "^5.1.2", "merge2": "^1.3.0", "micromatch": "^4.0.4" + }, + "dependencies": { + "glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "requires": { + "is-glob": "^4.0.1" + } + } } }, "fast-json-stable-stringify": { @@ -1379,24 +1387,13 @@ "to-regex-range": "^5.0.1" } }, - "find-cache-dir": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", - "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", - "dev": true, - "requires": { - "commondir": "^1.0.1", - "make-dir": "^3.0.2", - "pkg-dir": "^4.1.0" - } - }, "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", "dev": true, "requires": { - "locate-path": "^5.0.0", + "locate-path": "^6.0.0", "path-exists": "^4.0.0" } }, @@ -1407,9 +1404,9 @@ "dev": true }, "follow-redirects": { - "version": "1.14.7", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.7.tgz", - "integrity": "sha512-+hbxoLbFMbRKDwohX8GkTataGqO6Jb7jGwpAlwgy2bIz25XtRm7KEzJM76R1WiNT5SwZkX4Y75SwBolkpmE7iQ==" + "version": "1.14.8", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.8.tgz", + "integrity": "sha512-1x0S9UVJHsQprFcEC/qnNzBLcIxsjAV905f/UkQxbclCsoTWlacCNOpQa/anodLl2uaEKFhfWOvM2Qg77+15zA==" }, "fs-constants": { "version": "1.0.0", @@ -1418,22 +1415,13 @@ "dev": true }, "fs-extra": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", - "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", - "requires": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - } - }, - "fs-minipass": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", - "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", - "dev": true, + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.0.0.tgz", + "integrity": "sha512-C5owb14u9eJwizKGdchcDUQeFtlSHHthBk8pbX9Vc1PFZrLombudjDnNns88aYslCyF6IY5SUw3Roz6xShcEIQ==", "requires": { - "minipass": "^3.0.0" + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" } }, "fs.realpath": { @@ -1503,6 +1491,12 @@ "wide-align": "^1.1.0" } }, + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true + }, "get-intrinsic": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", @@ -1544,11 +1538,12 @@ } }, "glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, "requires": { - "is-glob": "^4.0.1" + "is-glob": "^4.0.3" } }, "glob-to-regexp": { @@ -1570,17 +1565,10 @@ "slash": "^3.0.0" }, "dependencies": { - "fast-glob": { - "version": "3.2.10", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.10.tgz", - "integrity": "sha512-s9nFhFnvR63wls6/kM88kQqDhMu0AfdjqouE2l5GVQPbqLgyFjjU5ry/r2yKsJxpb9Py1EYNqieFrmMaX4v++A==", - "requires": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - } + "array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==" } } }, @@ -1604,9 +1592,9 @@ } }, "graceful-fs": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz", - "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==" + "version": "4.2.9", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.9.tgz", + "integrity": "sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ==" }, "growl": { "version": "1.10.5", @@ -1656,6 +1644,12 @@ "lru-cache": "^6.0.0" } }, + "hpagent": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/hpagent/-/hpagent-0.1.2.tgz", + "integrity": "sha512-ePqFXHtSQWAFXYmj+JtOTHr84iNrII4/QRlAAPPE+zqnKy4xJo7Ie1Y4kC7AdB+LxLxSTTzBMASsEcy0q8YyvQ==", + "dev": true + }, "htmlparser2": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", @@ -1683,23 +1677,6 @@ "@tootallnate/once": "1", "agent-base": "6", "debug": "4" - }, - "dependencies": { - "debug": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", - "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - } } }, "http2-wrapper": { @@ -1720,23 +1697,6 @@ "requires": { "agent-base": "6", "debug": "4" - }, - "dependencies": { - "debug": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", - "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - } } }, "human-signals": { @@ -1772,24 +1732,6 @@ "resolve-cwd": "^3.0.0" } }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "dev": true - }, - "indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", - "dev": true - }, - "infer-owner": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", - "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", - "dev": true - }, "inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", @@ -1818,10 +1760,19 @@ "integrity": "sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==", "dev": true }, + "is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "requires": { + "binary-extensions": "^2.0.0" + } + }, "is-core-module": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.6.0.tgz", - "integrity": "sha512-wShG8vs60jKfPWpF2KZRaAtvt3a20OAn7+IJ6hLPECpSABLcKtFKTTI4ZtH5QcBruBHlq+WsdHWyz0BCZW7svQ==", + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.1.tgz", + "integrity": "sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA==", "dev": true, "requires": { "has": "^1.0.3" @@ -1848,9 +1799,9 @@ } }, "is-glob": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", - "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "requires": { "is-extglob": "^2.1.1" } @@ -1881,6 +1832,12 @@ "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", "dev": true }, + "is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "dev": true + }, "is-wsl": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", @@ -1909,9 +1866,9 @@ "dev": true }, "jest-worker": { - "version": "27.4.6", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.4.6.tgz", - "integrity": "sha512-gHWJF/6Xi5CTG5QCvROr6GcmpIqNYpDJyc8A1h/DyXqH1tD6SnRCM0d3U5msV31D2LB/U+E0M+W4oyvKV44oNw==", + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", + "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", "dev": true, "requires": { "@types/node": "*", @@ -1926,9 +1883,9 @@ "dev": true }, "js-yaml": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.0.0.tgz", - "integrity": "sha512-pqon0s+4ScYUvX30wxQi3PogGFAlUyH0awepWvwkj4jD4v+ova3RiYw8bmA6x2rDrEaj8i/oWKoRxpVNW+Re8Q==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", "dev": true, "requires": { "argparse": "^2.0.1" @@ -1952,21 +1909,13 @@ "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", "dev": true }, - "json5": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", - "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", - "dev": true, - "requires": { - "minimist": "^1.2.5" - } - }, "jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", "requires": { - "graceful-fs": "^4.1.6" + "graceful-fs": "^4.1.6", + "universalify": "^2.0.0" } }, "jszip": { @@ -1982,19 +1931,19 @@ } }, "keytar": { - "version": "7.7.0", - "resolved": "https://registry.npmjs.org/keytar/-/keytar-7.7.0.tgz", - "integrity": "sha512-YEY9HWqThQc5q5xbXbRwsZTh2PJ36OSYRjSv3NN2xf5s5dpLTjEZnC2YikR29OaVybf9nQ0dJ/80i40RS97t/A==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/keytar/-/keytar-7.8.0.tgz", + "integrity": "sha512-mR+BqtAOIW8j+T5FtLVyckCbvROWQD+4FzPeFMuk5njEZkXLpVPCGF26Y3mTyxMAAL1XCfswR7S6kIf+THSRFA==", "dev": true, "requires": { - "node-addon-api": "^3.0.0", - "prebuild-install": "^6.0.0" + "node-addon-api": "^4.3.0", + "prebuild-install": "^7.0.1" } }, "keyv": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.0.5.tgz", - "integrity": "sha512-531pkGLqV3BMg0eDqqJFI0R1mkK1Nm5xIP2mM6keP5P8WfFtCkg2IOwplTUmlGoTgIg9yQYZ/kdihhz89XH3vA==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.1.1.tgz", + "integrity": "sha512-tGv1yP6snQVDSM4X6yxrv2zzq/EvpW+oYiUz6aueW1u9CtS8RzUQYxxmFwgZlO2jSgCxQbchhxaqXXp2hnKGpQ==", "dev": true, "requires": { "json-buffer": "3.0.1" @@ -2022,9 +1971,9 @@ } }, "linkify-it": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-2.2.0.tgz", - "integrity": "sha512-GnAl/knGn+i1U/wjBz3akz2stz+HrHLsxMwHQGofCDfPvlf+gDKN58UtfmUquTY4/MXeE2x7k19KQmeoZi94Iw==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-3.0.3.tgz", + "integrity": "sha512-ynTsyrFSdE5oZ/O9GEf00kPngmOfVwazR5GKDq6EYfhlpFug3J2zybX56a2PRRpc9P+FuSoGNAwjlbDs9jJBPQ==", "dev": true, "requires": { "uc.micro": "^1.0.1" @@ -2042,24 +1991,13 @@ "integrity": "sha512-92+huvxMvYlMzMt0iIOukcwYBFpkYJdpl2xsZ7LrlayO7E8SOv+JJUEK17B/dJIHAOLMfh2dZZ/Y18WgmGtYNw==", "dev": true }, - "loader-utils": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz", - "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==", - "dev": true, - "requires": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^2.1.2" - } - }, "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", "dev": true, "requires": { - "p-locate": "^4.1.0" + "p-locate": "^5.0.0" } }, "lodash": { @@ -2068,12 +2006,13 @@ "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" }, "log-symbols": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.0.0.tgz", - "integrity": "sha512-FN8JBzLx6CzeMrB0tg6pqlGU1wCrXW+ZXGH481kfsBqer0hToTIiHdjH4Mq8xJUbvATujKCvaREGWpGUionraA==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", "dev": true, "requires": { - "chalk": "^4.0.0" + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" } }, "lowercase-keys": { @@ -2090,49 +2029,23 @@ "yallist": "^4.0.0" } }, - "make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "dev": true, - "requires": { - "semver": "^6.0.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, "markdown-it": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-10.0.0.tgz", - "integrity": "sha512-YWOP1j7UbDNz+TumYP1kpwnP0aEa711cJjrAQrzd0UXlbJfc5aAq0F/PZHjiioqDC1NKgvIMX+o+9Bk7yuM2dg==", + "version": "12.3.2", + "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-12.3.2.tgz", + "integrity": "sha512-TchMembfxfNVpHkbtriWltGWc+m3xszaRD0CZup7GFFhzIgQqxIfn3eGj1yZpfuflzPvfkt611B2Q/Bsk1YnGg==", "dev": true, "requires": { - "argparse": "^1.0.7", - "entities": "~2.0.0", - "linkify-it": "^2.0.0", + "argparse": "^2.0.1", + "entities": "~2.1.0", + "linkify-it": "^3.0.1", "mdurl": "^1.0.1", "uc.micro": "^1.0.5" }, "dependencies": { - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "requires": { - "sprintf-js": "~1.0.2" - } - }, "entities": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.0.3.tgz", - "integrity": "sha512-MyoZ0jgnLvB2X3Lg5HqpFmn1kybDiIfEQmKzTb5apr51Rb+T3KdmMiqa70T+bhGnyv7bQ6WMj2QMHpGMmlrUYQ==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.1.0.tgz", + "integrity": "sha512-hCx1oky9PFrJ611mf0ifBLBRW8lUUVRlFolb5gWRfIELabBlbp9xZvrqZLZAs+NxFnbfQoeGd8wDkygjg7U85w==", "dev": true } } @@ -2197,9 +2110,9 @@ "dev": true }, "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.5.tgz", + "integrity": "sha512-tUpxzX0VAzJHjLu0xUfFv1gwVp9ba3IOuRAVH2EGuRW8a5emA2FlACLqiT/lDVtS1W+TGNwqz3sWaNyLgDJWuw==", "requires": { "brace-expansion": "^1.1.7" } @@ -2210,221 +2123,57 @@ "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", "dev": true }, - "minipass": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.5.tgz", - "integrity": "sha512-+8NzxD82XQoNKNrl1d/FSi+X8wAEWR+sbYAfIvub4Nz0d22plFG72CEVVaufV8PNf4qSslFTD8VMOxNVhHCjTw==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } + "mkdirp-classic": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", + "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", + "dev": true }, - "minipass-collect": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", - "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", - "dev": true, - "requires": { - "minipass": "^3.0.0" - } - }, - "minipass-flush": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", - "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", - "dev": true, - "requires": { - "minipass": "^3.0.0" - } - }, - "minipass-pipeline": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", - "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", - "dev": true, - "requires": { - "minipass": "^3.0.0" - } - }, - "minizlib": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", - "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", - "dev": true, - "requires": { - "minipass": "^3.0.0", - "yallist": "^4.0.0" - } - }, - "mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "dev": true - }, - "mkdirp-classic": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", - "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", - "dev": true - }, - "mocha": { - "version": "8.4.0", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-8.4.0.tgz", - "integrity": "sha512-hJaO0mwDXmZS4ghXsvPVriOhsxQ7ofcpQdm8dE+jISUOKopitvnXFQmpRR7jd2K6VBG6E26gU3IAbXXGIbu4sQ==", + "mocha": { + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-9.2.0.tgz", + "integrity": "sha512-kNn7E8g2SzVcq0a77dkphPsDSN7P+iYkqE0ZsGCYWRsoiKjOt+NvXfaagik8vuDa6W5Zw3qxe8Jfpt5qKf+6/Q==", "dev": true, "requires": { "@ungap/promise-all-settled": "1.1.2", "ansi-colors": "4.1.1", "browser-stdout": "1.3.1", - "chokidar": "3.5.1", - "debug": "4.3.1", + "chokidar": "3.5.3", + "debug": "4.3.3", "diff": "5.0.0", "escape-string-regexp": "4.0.0", "find-up": "5.0.0", - "glob": "7.1.6", + "glob": "7.2.0", "growl": "1.10.5", "he": "1.2.0", - "js-yaml": "4.0.0", - "log-symbols": "4.0.0", + "js-yaml": "4.1.0", + "log-symbols": "4.1.0", "minimatch": "3.0.4", "ms": "2.1.3", - "nanoid": "3.1.20", - "serialize-javascript": "5.0.1", + "nanoid": "3.2.0", + "serialize-javascript": "6.0.0", "strip-json-comments": "3.1.1", "supports-color": "8.1.1", "which": "2.0.2", - "wide-align": "1.1.3", - "workerpool": "6.1.0", + "workerpool": "6.2.0", "yargs": "16.2.0", "yargs-parser": "20.2.4", "yargs-unparser": "2.0.0" }, "dependencies": { - "ansi-colors": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", - "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", - "dev": true - }, - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true - }, - "anymatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", - "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", - "dev": true, - "requires": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - } - }, - "binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "dev": true - }, - "chokidar": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.1.tgz", - "integrity": "sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw==", - "dev": true, - "requires": { - "anymatch": "~3.1.1", - "braces": "~3.0.2", - "fsevents": "~2.3.1", - "glob-parent": "~5.1.0", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.5.0" - } - }, - "cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "dev": true, - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, - "debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", - "dev": true, - "requires": { - "ms": "2.1.2" - }, - "dependencies": { - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - } - } - }, - "find-up": { + "diff": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "requires": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - } - }, - "get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true - }, - "glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "dev": true, - "requires": { - "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" - } - }, - "is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "requires": { - "binary-extensions": "^2.0.0" - } - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", + "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", "dev": true }, - "locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "dev": true, "requires": { - "p-locate": "^5.0.0" + "brace-expansion": "^1.1.7" } }, "ms": { @@ -2432,98 +2181,13 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "dev": true - }, - "p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "requires": { - "p-limit": "^3.0.2" - } - }, - "readdirp": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz", - "integrity": "sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==", - "dev": true, - "requires": { - "picomatch": "^2.2.1" - } - }, - "string-width": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", - "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" - } - }, - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.0" - } - }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - }, - "wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - } - }, - "y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true - }, - "yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", - "dev": true, - "requires": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" - } - }, - "yargs-parser": { - "version": "20.2.4", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", - "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", - "dev": true } } }, "monaco-page-objects": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/monaco-page-objects/-/monaco-page-objects-1.9.0.tgz", - "integrity": "sha512-CVTbG5GAMv6Gh704/h0bL+VK8NkYwy/bga/5JG1uqc7TM426PCG5ssHe7gyTEYQx4iCgWQFg8+obQqn//d1ohQ==", + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/monaco-page-objects/-/monaco-page-objects-1.9.1.tgz", + "integrity": "sha512-Sct5tMld91KRZFOJLmlqBfnK/F5jBBdAqMwioiGrTsATrWIJDCkrU6MVq4gdMmOMQxVGAXt1LwgfD6AzJWarrQ==", "dev": true, "requires": { "clipboardy": "^2.3.0", @@ -2531,37 +2195,14 @@ "compare-versions": "^3.5.1", "fs-extra": "^10.0.0", "ts-essentials": "^8.0.0" - }, - "dependencies": { - "fs-extra": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.0.0.tgz", - "integrity": "sha512-C5owb14u9eJwizKGdchcDUQeFtlSHHthBk8pbX9Vc1PFZrLombudjDnNns88aYslCyF6IY5SUw3Roz6xShcEIQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - } - }, - "jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.6", - "universalify": "^2.0.0" - } - }, - "universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", - "dev": true - } } }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, "mute-stream": { "version": "0.0.8", "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", @@ -2569,9 +2210,9 @@ "dev": true }, "nanoid": { - "version": "3.1.20", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.20.tgz", - "integrity": "sha512-a1cQNyczgKbLX9jwbS/+d7W8fX/RfgYR7lVWwWOGIPNgK2m0MWvrGF6/m4kk6U3QcFMnZf3RIhL0v2Jgh/0Uxw==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.2.0.tgz", + "integrity": "sha512-fmsZYa9lpn69Ad5eDn7FMcnnSR+8R34W9qJEijxYhTbfOWzr22n1QxCMzXLK+ODyW2973V3Fux959iQoUxzUIA==", "dev": true }, "napi-build-utils": { @@ -2593,32 +2234,24 @@ "dev": true }, "node-abi": { - "version": "2.30.1", - "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-2.30.1.tgz", - "integrity": "sha512-/2D0wOQPgaUWzVSVgRMx+trKJRC2UG4SUc4oCJoXx9Uxjtp0Vy3/kt7zcbxHF8+Z/pK3UloLWzBISg72brfy1w==", + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.8.0.tgz", + "integrity": "sha512-tzua9qWWi7iW4I42vUPKM+SfaF0vQSLAm4yO5J83mSwB7GeoWrDKC/K+8YCnYNwqP5duwazbw2X9l4m8SC2cUw==", "dev": true, "requires": { - "semver": "^5.4.1" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - } + "semver": "^7.3.5" } }, "node-addon-api": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-3.2.1.tgz", - "integrity": "sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-4.3.0.tgz", + "integrity": "sha512-73sE9+3UaLYYFmDsFZnqCInzPyh3MqIwZO9cw58yIqAZhONrrabrYyYe3TuIqtIiOuTXVhsGau8hcrhhwSsDIQ==", "dev": true }, "node-releases": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.1.tgz", - "integrity": "sha512-CqyzN6z7Q6aMeF/ktcMVTzhAHCEpf8SOarwpzpf8pNBY2k5/oM34UHldUwp8VKI7uxct2HxSRdJjBaZeESzcxA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.2.tgz", + "integrity": "sha512-XxYDdcQ6eKqp/YjI+tb2C5WM2LgjnZrfYg4vgQt49EK268b6gYCHsBLrK2qvJo4FmCtqmKezb0WZFK4fkrZNsg==", "dev": true }, "normalize-path": { @@ -2699,28 +2332,12 @@ "mimic-fn": "^2.1.0" } }, - "os-homedir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", - "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", - "dev": true - }, "os-tmpdir": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", "dev": true }, - "osenv": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", - "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", - "dev": true, - "requires": { - "os-homedir": "^1.0.0", - "os-tmpdir": "^1.0.0" - } - }, "p-cancelable": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz", @@ -2743,32 +2360,12 @@ } }, "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "requires": { - "p-limit": "^2.2.0" - }, - "dependencies": { - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - } - } - }, - "p-map": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", - "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", "dev": true, "requires": { - "aggregate-error": "^3.0.0" + "p-limit": "^3.0.2" } }, "p-try": { @@ -2857,9 +2454,9 @@ "dev": true }, "picomatch": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz", - "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==" + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==" }, "pkg-dir": { "version": "4.2.0", @@ -2868,25 +2465,64 @@ "dev": true, "requires": { "find-up": "^4.0.0" + }, + "dependencies": { + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + } } }, "prebuild-install": { - "version": "6.1.4", - "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-6.1.4.tgz", - "integrity": "sha512-Z4vpywnK1lBg+zdPCVCsKq0xO66eEV9rWo2zrROGGiRS4JtueBOdlB1FnY8lcy7JsUud/Q3ijUxyWN26Ika0vQ==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.0.1.tgz", + "integrity": "sha512-QBSab31WqkyxpnMWQxubYAHR5S9B2+r81ucocew34Fkl98FhvKIF50jIJnNOBmAZfyNV7vE5T6gd3hTVWgY6tg==", "dev": true, "requires": { - "detect-libc": "^1.0.3", + "detect-libc": "^2.0.0", "expand-template": "^2.0.3", "github-from-package": "0.0.0", "minimist": "^1.2.3", "mkdirp-classic": "^0.5.3", "napi-build-utils": "^1.0.1", - "node-abi": "^2.21.0", + "node-abi": "^3.3.0", "npmlog": "^4.0.1", "pump": "^3.0.0", "rc": "^1.2.7", - "simple-get": "^3.0.3", + "simple-get": "^4.0.0", "tar-fs": "^2.0.0", "tunnel-agent": "^0.6.0" }, @@ -2952,12 +2588,6 @@ "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", "dev": true }, - "promise-inflight": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", - "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=", - "dev": true - }, "pump": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", @@ -3055,6 +2685,15 @@ } } }, + "readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "requires": { + "picomatch": "^2.2.1" + } + }, "rechoir": { "version": "0.7.1", "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.7.1.tgz", @@ -3071,13 +2710,14 @@ "dev": true }, "resolve": { - "version": "1.20.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", - "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", + "version": "1.22.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.0.tgz", + "integrity": "sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==", "dev": true, "requires": { - "is-core-module": "^2.2.0", - "path-parse": "^1.0.6" + "is-core-module": "^2.8.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" } }, "resolve-alpn": { @@ -3196,9 +2836,9 @@ } }, "serialize-javascript": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-5.0.1.tgz", - "integrity": "sha512-SaaNal9imEO737H2c05Og0/8LUXG7EnsZyMa8MzkmuHoELfT6txuj0cMqRj6zfPKnmQ1yasR4PCJc8x+M4JSPA==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", + "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", "dev": true, "requires": { "randombytes": "^2.1.0" @@ -3258,9 +2898,9 @@ } }, "signal-exit": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.6.tgz", - "integrity": "sha512-sDl4qMFpijcGw22U5w63KmD3cZJfBuFlVNbVMKje2keoKML7X2UzWbc4XrmEbDwg0NXJc3yv4/ox7b+JWb57kQ==", + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", "dev": true }, "simple-concat": { @@ -3270,31 +2910,14 @@ "dev": true }, "simple-get": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-3.1.0.tgz", - "integrity": "sha512-bCR6cP+aTdScaQCnQKbPKtJOKDp/hj9EDLJo3Nw4y1QksqaovlW/bnptB6/c1e+qmNIDHRK+oXFDdEqBT8WzUA==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz", + "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==", "dev": true, "requires": { - "decompress-response": "^4.2.0", + "decompress-response": "^6.0.0", "once": "^1.3.1", "simple-concat": "^1.0.0" - }, - "dependencies": { - "decompress-response": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-4.2.1.tgz", - "integrity": "sha512-jOSne2qbyE+/r8G1VU+G/82LBs2Fs4LAsTiLSHOCOMZQl2OKZ6i8i4IyHemTe+/yIXOtTcRQMzPcgyhoFlqPkw==", - "dev": true, - "requires": { - "mimic-response": "^2.0.0" - } - }, - "mimic-response": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-2.1.0.tgz", - "integrity": "sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA==", - "dev": true - } } }, "slash": { @@ -3302,12 +2925,6 @@ "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==" }, - "source-list-map": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", - "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==", - "dev": true - }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -3330,15 +2947,6 @@ "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", "dev": true }, - "ssri": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.1.tgz", - "integrity": "sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==", - "dev": true, - "requires": { - "minipass": "^3.1.1" - } - }, "string-width": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", @@ -3403,26 +3011,18 @@ "has-flag": "^4.0.0" } }, + "supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true + }, "tapable": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", "dev": true }, - "tar": { - "version": "6.1.11", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.11.tgz", - "integrity": "sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA==", - "dev": true, - "requires": { - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "minipass": "^3.0.0", - "minizlib": "^2.1.1", - "mkdirp": "^1.0.3", - "yallist": "^4.0.0" - } - }, "tar-fs": { "version": "1.16.3", "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-1.16.3.tgz", @@ -3514,27 +3114,16 @@ } }, "terser-webpack-plugin": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.0.tgz", - "integrity": "sha512-LPIisi3Ol4chwAaPP8toUJ3L4qCM1G0wao7L3qNv57Drezxj6+VEyySpPw4B1HSO2Eg/hDY/MNF5XihCAoqnsQ==", + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.1.tgz", + "integrity": "sha512-GvlZdT6wPQKbDNW/GDQzZFg/j4vKU96yl2q6mcUkzKOgW4gwf1Z8cZToUCrz31XHlPWH8MVb1r2tFtdDtTGJ7g==", "dev": true, "requires": { - "jest-worker": "^27.4.1", + "jest-worker": "^27.4.5", "schema-utils": "^3.1.1", "serialize-javascript": "^6.0.0", "source-map": "^0.6.1", "terser": "^5.7.2" - }, - "dependencies": { - "serialize-javascript": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", - "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", - "dev": true, - "requires": { - "randombytes": "^2.1.0" - } - } } }, "tmp": { @@ -3600,9 +3189,9 @@ "dev": true }, "tslint": { - "version": "5.20.1", - "resolved": "https://registry.npmjs.org/tslint/-/tslint-5.20.1.tgz", - "integrity": "sha512-EcMxhzCFt8k+/UP5r8waCf/lzmeSyVlqxqMEDQE7rWYiQky8KpIBz1JAoYXfROHrPZ1XXd43q8yQnULOLiBRQg==", + "version": "6.1.3", + "resolved": "https://registry.npmjs.org/tslint/-/tslint-6.1.3.tgz", + "integrity": "sha512-IbR4nkT96EQOvKE2PW/djGz8iGNeJ4rF2mBfiYaR/nvUWYKJhLwimoJKgjIFEIDibBtOevj7BqCRL4oHeWWUCg==", "dev": true, "requires": { "@babel/code-frame": "^7.0.0", @@ -3613,10 +3202,10 @@ "glob": "^7.1.1", "js-yaml": "^3.13.1", "minimatch": "^3.0.4", - "mkdirp": "^0.5.1", + "mkdirp": "^0.5.3", "resolve": "^1.3.2", "semver": "^5.3.0", - "tslib": "^1.8.0", + "tslib": "^1.13.0", "tsutils": "^2.29.0" }, "dependencies": { @@ -3664,12 +3253,6 @@ "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", "dev": true }, - "diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "dev": true - }, "escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", @@ -3754,9 +3337,9 @@ } }, "typescript": { - "version": "4.5.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.5.4.tgz", - "integrity": "sha512-VgYs2A2QIRuGphtzFV7aQJduJ2gyfTljngLzjpfW9FoYZF6xuw1W0vW9ghCKLfcWrCFxK81CSGRAvS1pn4fIUg==", + "version": "4.5.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.5.5.tgz", + "integrity": "sha512-TCTIul70LyWe6IJWT8QSYeA54WQe8EjQFU4wY52Fasj5UKx88LNYKCgBEHcOMOrFF1rKGbD8v/xcNWVUq9SymA==", "dev": true }, "uc.micro": { @@ -3771,28 +3354,10 @@ "integrity": "sha512-ekY1NhRzq0B08g4bGuX4wd2jZx5GnKz6mKSqFL4nqBlfyMGiG10gDFhDTMEfYmDL6Jy0FUIZp7wiRB+0BP7J2g==", "dev": true }, - "unique-filename": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", - "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", - "dev": true, - "requires": { - "unique-slug": "^2.0.0" - } - }, - "unique-slug": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", - "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", - "dev": true, - "requires": { - "imurmurhash": "^0.1.4" - } - }, "universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==" + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==" }, "unzip-stream": { "version": "0.3.1", @@ -3815,6 +3380,24 @@ } } }, + "unzipper": { + "version": "0.10.11", + "resolved": "https://registry.npmjs.org/unzipper/-/unzipper-0.10.11.tgz", + "integrity": "sha512-+BrAq2oFqWod5IESRjL3S8baohbevGcVA+teAIOYWM3pDVdseogqbzhhvvmiyQrUNKFUnDMtELW3X8ykbyDCJw==", + "dev": true, + "requires": { + "big-integer": "^1.6.17", + "binary": "~0.3.0", + "bluebird": "~3.4.1", + "buffer-indexof-polyfill": "~1.0.0", + "duplexer2": "~0.1.4", + "fstream": "^1.0.12", + "graceful-fs": "^4.2.2", + "listenercount": "~1.0.1", + "readable-stream": "~2.3.6", + "setimmediate": "~1.0.4" + } + }, "uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", @@ -3825,9 +3408,9 @@ } }, "url-join": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/url-join/-/url-join-1.1.0.tgz", - "integrity": "sha1-dBxsL0WWxIMNZxhGCSDQySIC3Hg=", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/url-join/-/url-join-4.0.1.tgz", + "integrity": "sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA==", "dev": true }, "utf8-byte-length": { @@ -3848,31 +3431,28 @@ "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" }, "vsce": { - "version": "1.103.1", - "resolved": "https://registry.npmjs.org/vsce/-/vsce-1.103.1.tgz", - "integrity": "sha512-98oKQKKRp7J/vTIk1cuzom5cezZpYpRHs3WlySdsrTCrAEipB/HvaPTc4VZ3hGZHzHXS9P5p2L0IllntJeXwiQ==", + "version": "2.6.7", + "resolved": "https://registry.npmjs.org/vsce/-/vsce-2.6.7.tgz", + "integrity": "sha512-5dEtdi/yzWQbOU7JDUSOs8lmSzzkewBR5P122BUkmXE6A/DEdFsKNsg2773NGXJTwwF1MfsOgUR6QVF3cLLJNQ==", "dev": true, "requires": { "azure-devops-node-api": "^11.0.1", "chalk": "^2.4.2", "cheerio": "^1.0.0-rc.9", "commander": "^6.1.0", - "denodeify": "^1.2.1", "glob": "^7.0.6", "hosted-git-info": "^4.0.2", "keytar": "^7.7.0", "leven": "^3.1.0", - "lodash": "^4.17.15", - "markdown-it": "^10.0.0", + "markdown-it": "^12.3.2", "mime": "^1.3.4", "minimatch": "^3.0.3", - "osenv": "^0.1.3", "parse-semver": "^1.1.1", "read": "^1.0.7", "semver": "^5.1.0", "tmp": "^0.2.1", "typed-rest-client": "^1.8.4", - "url-join": "^1.1.0", + "url-join": "^4.0.1", "xml2js": "^0.4.23", "yauzl": "^2.3.1", "yazl": "^2.2.2" @@ -3967,9 +3547,9 @@ } }, "vscode-extension-tester": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/vscode-extension-tester/-/vscode-extension-tester-4.2.3.tgz", - "integrity": "sha512-VNJTw4I1uGULiUdAlyf47zZ+J5nYnqkcHI9rjk/gjpymphYob5rRHk1og1vPUUT7rYTv5fYL2cJ8xpw7POe+5A==", + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/vscode-extension-tester/-/vscode-extension-tester-4.2.4.tgz", + "integrity": "sha512-4BT9bf7fs7lE97z8XtzT+wfawIOaYwC5D64u4WbnlzxfV9YQoPEqd76g+MjD27YgjsZWItAC3fhNOip9ry2dSg==", "dev": true, "requires": { "@types/selenium-webdriver": "^3.0.15", @@ -3978,13 +3558,14 @@ "fs-extra": "^10.0.0", "glob": "^7.1.7", "got": "^11.8.2", + "hpagent": "^0.1.2", "js-yaml": "^4.1.0", "monaco-page-objects": "^1.9.0", "sanitize-filename": "^1.6.3", "selenium-webdriver": "^3.0.0", "targz": "^1.0.1", "unzip-stream": "^0.3.0", - "vsce": "^1.96.0", + "vsce": "^2.3.0", "vscode-extension-tester-locators": "^1.62.0" }, "dependencies": { @@ -3993,49 +3574,13 @@ "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", "dev": true - }, - "fs-extra": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.0.0.tgz", - "integrity": "sha512-C5owb14u9eJwizKGdchcDUQeFtlSHHthBk8pbX9Vc1PFZrLombudjDnNns88aYslCyF6IY5SUw3Roz6xShcEIQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - } - }, - "js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "requires": { - "argparse": "^2.0.1" - } - }, - "jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.6", - "universalify": "^2.0.0" - } - }, - "universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", - "dev": true } } }, "vscode-extension-tester-locators": { - "version": "1.62.0", - "resolved": "https://registry.npmjs.org/vscode-extension-tester-locators/-/vscode-extension-tester-locators-1.62.0.tgz", - "integrity": "sha512-7mGTy2Fm5VA5Go6tXnt4RrItmJnygWmlGHstWmwsYqtxEkJ5hHC4Cc59FhnaPtl/j0NlgQ+iSqPBoiQNC+J8cw==", + "version": "1.62.1", + "resolved": "https://registry.npmjs.org/vscode-extension-tester-locators/-/vscode-extension-tester-locators-1.62.1.tgz", + "integrity": "sha512-EHlQO8LDz+bvNdbyNS+K2nL2O0Wt6uMt8ZiRD15vASLQHONfmbQcFT7Zc+sHRa7Ylx0Q1HIv6iYScPAuKm7Eeg==", "dev": true }, "vscode-tas-client": { @@ -4056,26 +3601,6 @@ "https-proxy-agent": "^5.0.0", "rimraf": "^3.0.2", "unzipper": "^0.10.11" - }, - "dependencies": { - "unzipper": { - "version": "0.10.11", - "resolved": "https://registry.npmjs.org/unzipper/-/unzipper-0.10.11.tgz", - "integrity": "sha512-+BrAq2oFqWod5IESRjL3S8baohbevGcVA+teAIOYWM3pDVdseogqbzhhvvmiyQrUNKFUnDMtELW3X8ykbyDCJw==", - "dev": true, - "requires": { - "big-integer": "^1.6.17", - "binary": "~0.3.0", - "bluebird": "~3.4.1", - "buffer-indexof-polyfill": "~1.0.0", - "duplexer2": "~0.1.4", - "fstream": "^1.0.12", - "graceful-fs": "^4.2.2", - "listenercount": "~1.0.1", - "readable-stream": "~2.3.6", - "setimmediate": "~1.0.4" - } - } } }, "watchpack": { @@ -4089,9 +3614,9 @@ } }, "webpack": { - "version": "5.66.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.66.0.tgz", - "integrity": "sha512-NJNtGT7IKpGzdW7Iwpn/09OXz9inIkeIQ/ibY6B+MdV1x6+uReqz/5z1L89ezWnpPDWpXF0TY5PCYKQdWVn8Vg==", + "version": "5.68.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.68.0.tgz", + "integrity": "sha512-zUcqaUO0772UuuW2bzaES2Zjlm/y3kRBQDVFVCge+s2Y8mwuUTdperGaAv65/NtRL/1zanpSJOq/MD8u61vo6g==", "dev": true, "requires": { "@types/eslint-scope": "^3.7.0", @@ -4117,15 +3642,9 @@ "tapable": "^2.1.1", "terser-webpack-plugin": "^5.1.3", "watchpack": "^2.3.1", - "webpack-sources": "^3.2.2" + "webpack-sources": "^3.2.3" }, "dependencies": { - "graceful-fs": { - "version": "4.2.9", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.9.tgz", - "integrity": "sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ==", - "dev": true - }, "webpack-sources": { "version": "3.2.3", "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", @@ -4135,15 +3654,15 @@ } }, "webpack-cli": { - "version": "4.9.1", - "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-4.9.1.tgz", - "integrity": "sha512-JYRFVuyFpzDxMDB+v/nanUdQYcZtqFPGzmlW4s+UkPMFhSpfRNmf1z4AwYcHJVdvEFAM7FFCQdNTpsBYhDLusQ==", + "version": "4.9.2", + "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-4.9.2.tgz", + "integrity": "sha512-m3/AACnBBzK/kMTcxWHcZFPrw/eQuY4Df1TxvIWfWM2x7mRqBQCqKEd96oCUa9jkapLBaFfRce33eGDb4Pr7YQ==", "dev": true, "requires": { "@discoveryjs/json-ext": "^0.5.0", - "@webpack-cli/configtest": "^1.1.0", - "@webpack-cli/info": "^1.4.0", - "@webpack-cli/serve": "^1.6.0", + "@webpack-cli/configtest": "^1.1.1", + "@webpack-cli/info": "^1.4.1", + "@webpack-cli/serve": "^1.6.1", "colorette": "^2.0.14", "commander": "^7.0.0", "execa": "^5.0.0", @@ -4229,15 +3748,6 @@ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true - }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } } } }, @@ -4251,20 +3761,10 @@ "wildcard": "^2.0.0" } }, - "webpack-sources": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", - "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", - "dev": true, - "requires": { - "source-list-map": "^2.0.0", - "source-map": "~0.6.1" - } - }, "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dev": true, "requires": { "isexe": "^2.0.0" @@ -4286,11 +3786,56 @@ "dev": true }, "workerpool": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.1.0.tgz", - "integrity": "sha512-toV7q9rWNYha963Pl/qyeZ6wG+3nnsyvolaNUS8+R5Wtw6qJPTxIlOP1ZSvcGhEJw+l3HMMmtiNo9Gl61G4GVg==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.0.tgz", + "integrity": "sha512-Rsk5qQHJ9eowMH28Jwhe8HEbmdYDX4lwoMWshiCXugjtHqMD9ZbiqSDLxcsfdqsETPzVUtX5s1Z5kStiIM6l4A==", "dev": true }, + "wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true + }, + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.1" + } + } + } + }, "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", @@ -4319,11 +3864,72 @@ "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", "dev": true }, + "y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true + }, "yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" }, + "yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dev": true, + "requires": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true + }, + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.1" + } + } + } + }, + "yargs-parser": { + "version": "20.2.4", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", + "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", + "dev": true + }, "yargs-unparser": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", @@ -4334,20 +3940,6 @@ "decamelize": "^4.0.0", "flat": "^5.0.2", "is-plain-obj": "^2.1.0" - }, - "dependencies": { - "camelcase": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz", - "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==", - "dev": true - }, - "decamelize": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", - "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", - "dev": true - } } }, "yauzl": { diff --git a/package.json b/package.json index 077b545d..67542655 100644 --- a/package.json +++ b/package.json @@ -615,28 +615,28 @@ "tslint": "tslint -t verbose --project tsconfig.json" }, "devDependencies": { - "@types/fs-extra": "^5.1.0", + "@types/fs-extra": "^9.0.13", "@types/glob": "^7.2.0", "@types/lodash": "^4.14.178", "@types/minimatch": "^3.0.3", - "@types/mocha": "^8.2.1", - "@types/node": "^8.10.66", + "@types/mocha": "^9.1.0", + "@types/node": "^14.14.0", "@types/semver": "^7.3.9", "@types/vscode": "1.60.0", - "copy-webpack-plugin": "^6.4.1", + "copy-webpack-plugin": "^9.1.0", "glob": "^7.2.0", - "mocha": "^8.3.1", + "mocha": "^9.2.0", "ts-loader": "^9.2.6", - "tslint": "^5.20.1", + "tslint": "^6.1.3", "typescript": "^4.5.4", "vscode-extension-tester": "^4.2.3", "vscode-test": "^1.5.1", - "webpack": "^5.66.0", + "webpack": "^5.68.0", "webpack-cli": "^4.9.1" }, "dependencies": { "await-lock": "^2.1.0", - "fs-extra": "^7.0.1", + "fs-extra": "^10.0.0", "globby": "^11.1.0", "lodash": "^4.17.21", "minimatch": "^3.0.4", From 845adab9d8eed026ee295b7aa233e0161e9d23e9 Mon Sep 17 00:00:00 2001 From: Sheng Chen Date: Wed, 2 Mar 2022 11:25:23 +0800 Subject: [PATCH 077/352] fix: Record the selected project type (#597) Signed-off-by: Sheng Chen --- src/controllers/projectController.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/controllers/projectController.ts b/src/controllers/projectController.ts index 3d8bf3a3..8d0aac1f 100644 --- a/src/controllers/projectController.ts +++ b/src/controllers/projectController.ts @@ -6,7 +6,7 @@ import * as _ from "lodash"; import * as path from "path"; import * as semver from "semver"; import { commands, Disposable, Extension, ExtensionContext, extensions, QuickPickItem, Uri, window, workspace } from "vscode"; -import { instrumentOperationAsVsCodeCommand } from "vscode-extension-telemetry-wrapper"; +import { instrumentOperationAsVsCodeCommand, sendInfo } from "vscode-extension-telemetry-wrapper"; import { Commands } from "../commands"; import { Utility } from "../utility"; @@ -56,7 +56,7 @@ export class ProjectController implements Disposable { if (!choice || !await ensureExtension(choice.label, choice.metadata)) { return; } - + sendInfo("", {projectCreationType: choice.metadata.type}); if (choice.metadata.type === ProjectType.NoBuildTool) { await scaffoldSimpleProject(this.context); } else if (choice.metadata.createCommandId && choice.metadata.createCommandArgs) { From 12ee61ab4c81dab401975be40d3b3aa2aef4f249 Mon Sep 17 00:00:00 2001 From: Shi Chen <122255951@qq.com> Date: Fri, 18 Mar 2022 13:32:53 +0800 Subject: [PATCH 078/352] chore: Update dependency (#602) --- jdtls.ext/pom.xml | 9 +--- jdtls.ext/target.target | 6 +-- package-lock.json | 102 +++++++++++++++++++-------------------- package.json | 20 ++++---- test/gradle/build.gradle | 2 +- 5 files changed, 65 insertions(+), 74 deletions(-) diff --git a/jdtls.ext/pom.xml b/jdtls.ext/pom.xml index a18cce96..52913466 100644 --- a/jdtls.ext/pom.xml +++ b/jdtls.ext/pom.xml @@ -117,9 +117,9 @@ - 202006 + 202203 p2 - https://download.eclipse.org/releases/2021-09/202109151000/ + https://download.eclipse.org/releases/2022-03/202203161000/ oss.sonatype.org @@ -138,11 +138,6 @@ p2 https://download.eclipse.org/lsp4j/updates/releases/0.11.0/ - - JBOLL.TOOLS - p2 - https://download.jboss.org/jbosstools/updates/m2e-extensions/m2e-apt/1.5.3-2019-11-08_11-04-22-H22/ - orbit p2 diff --git a/jdtls.ext/target.target b/jdtls.ext/target.target index 89340733..608aad71 100644 --- a/jdtls.ext/target.target +++ b/jdtls.ext/target.target @@ -20,16 +20,12 @@ - + - - - - diff --git a/package-lock.json b/package-lock.json index 6482fd28..5669d9da 100644 --- a/package-lock.json +++ b/package-lock.json @@ -171,9 +171,9 @@ } }, "@types/estree": { - "version": "0.0.50", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.50.tgz", - "integrity": "sha512-C6N5s2ZFtuZRj54k2/zyRhNDjJwwcViAM3Nbm8zjBpbqAdZ00mr0CFxvSKeO8Y/e03WVFLpQMdHYVfUd6SB+Hw==", + "version": "0.0.51", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz", + "integrity": "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==", "dev": true }, "@types/fs-extra": { @@ -561,11 +561,11 @@ "integrity": "sha512-t7Zm5YGgEEc/3eYAicF32m/TNvL+XOeYZy9CvBUeJY/szM7frLolFylhrlZNWV/ohWhcUXygrBGjYmoQdxF4CQ==" }, "axios": { - "version": "0.22.0", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.22.0.tgz", - "integrity": "sha512-Z0U3uhqQeg1oNcihswf4ZD57O3NrR1+ZXhxaROaWpDmsDTx7T2HNBV2ulBtie2hwJptu8UvgnJoK+BIqdzh/1w==", + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.25.0.tgz", + "integrity": "sha512-cD8FOb0tRH3uuEe6+evtAbgJtfxr7ly3fQjYcMcuPlgkwVS9xboaVIpcDV+cYQe+yGykgwZCs1pzjntcGa6l5g==", "requires": { - "follow-redirects": "^1.14.4" + "follow-redirects": "^1.14.7" } }, "azure-devops-node-api": { @@ -1206,9 +1206,9 @@ } }, "enhanced-resolve": { - "version": "5.9.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.9.0.tgz", - "integrity": "sha512-weDYmzbBygL7HzGGS26M3hGQx68vehdEg6VUmqSOaFzXExFqlnKuSvsEJCVGQHScS8CQMbrAqftT+AzzHNt/YA==", + "version": "5.9.2", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.9.2.tgz", + "integrity": "sha512-GIm3fQfwLJ8YZx2smuHpBKkXC1yOk+OBEmKckVyL0i/ea8mqDEykK3ld5dgH1QYPNyT/lIllxV2LULnxCHaHkA==", "dev": true, "requires": { "graceful-fs": "^4.2.4", @@ -1404,9 +1404,9 @@ "dev": true }, "follow-redirects": { - "version": "1.14.8", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.8.tgz", - "integrity": "sha512-1x0S9UVJHsQprFcEC/qnNzBLcIxsjAV905f/UkQxbclCsoTWlacCNOpQa/anodLl2uaEKFhfWOvM2Qg77+15zA==" + "version": "1.14.9", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.9.tgz", + "integrity": "sha512-MQDfihBQYMcyy5dhRDJUHcw7lb2Pv/TuE6xP1vyraLukNDHKbDxDNaOE3NbCAdKQApno+GPRyo1YAp89yCjK4w==" }, "fs-constants": { "version": "1.0.0", @@ -1415,9 +1415,9 @@ "dev": true }, "fs-extra": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.0.0.tgz", - "integrity": "sha512-C5owb14u9eJwizKGdchcDUQeFtlSHHthBk8pbX9Vc1PFZrLombudjDnNns88aYslCyF6IY5SUw3Roz6xShcEIQ==", + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.0.1.tgz", + "integrity": "sha512-NbdoVMZso2Lsrn/QwLXOy6rm0ufY2zEOKCDzJR/0kBsb0E6qed0P3iYK+Ath3BfvXEeu4JhEtXLgILx5psUfag==", "requires": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", @@ -2130,9 +2130,9 @@ "dev": true }, "mocha": { - "version": "9.2.0", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-9.2.0.tgz", - "integrity": "sha512-kNn7E8g2SzVcq0a77dkphPsDSN7P+iYkqE0ZsGCYWRsoiKjOt+NvXfaagik8vuDa6W5Zw3qxe8Jfpt5qKf+6/Q==", + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-9.2.2.tgz", + "integrity": "sha512-L6XC3EdwT6YrIk0yXpavvLkn8h+EU+Y5UcCHKECyMbdUIxyMuZj4bX4U9e1nvnvUUvQVsV2VHQr5zLdcUkhW/g==", "dev": true, "requires": { "@ungap/promise-all-settled": "1.1.2", @@ -2148,9 +2148,9 @@ "he": "1.2.0", "js-yaml": "4.1.0", "log-symbols": "4.1.0", - "minimatch": "3.0.4", + "minimatch": "4.2.1", "ms": "2.1.3", - "nanoid": "3.2.0", + "nanoid": "3.3.1", "serialize-javascript": "6.0.0", "strip-json-comments": "3.1.1", "supports-color": "8.1.1", @@ -2168,9 +2168,9 @@ "dev": true }, "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-4.2.1.tgz", + "integrity": "sha512-9Uq1ChtSZO+Mxa/CL1eGizn2vRn3MlLgzhT0Iz8zaY8NdvxvB0d5QdPFmCKf7JKA9Lerx5vRrnwO03jsSfGG9g==", "dev": true, "requires": { "brace-expansion": "^1.1.7" @@ -2210,9 +2210,9 @@ "dev": true }, "nanoid": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.2.0.tgz", - "integrity": "sha512-fmsZYa9lpn69Ad5eDn7FMcnnSR+8R34W9qJEijxYhTbfOWzr22n1QxCMzXLK+ODyW2973V3Fux959iQoUxzUIA==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.1.tgz", + "integrity": "sha512-n6Vs/3KGyxPQd6uO0eH4Bv0ojGSUvuLlIHtC3Y0kEO23YRge8H9x1GCzLn28YX0H66pMkxuaeESFq4tKISKwdw==", "dev": true }, "napi-build-utils": { @@ -3087,11 +3087,11 @@ } }, "tas-client": { - "version": "0.1.26", - "resolved": "https://registry.npmjs.org/tas-client/-/tas-client-0.1.26.tgz", - "integrity": "sha512-o9wYpOwf1jhIose0ArEeW/Zr2T/XZnCKDrNXsCiZ/ctpg0DliU76tJ1rbBGlrOvjzLrMY1S3QwZWOAaF7+5HDw==", + "version": "0.1.30", + "resolved": "https://registry.npmjs.org/tas-client/-/tas-client-0.1.30.tgz", + "integrity": "sha512-4JINL2r0m7UWU8nIsfWI97SPxjnqz6nk0JtS5ajL5SCksPK8Yjx9yik4DbwwbsbXLJu9C2jasEKnDY40UxEh1g==", "requires": { - "axios": "^0.22.0" + "axios": "^0.25.0" } }, "terser": { @@ -3171,9 +3171,9 @@ "dev": true }, "ts-loader": { - "version": "9.2.6", - "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.2.6.tgz", - "integrity": "sha512-QMTC4UFzHmu9wU2VHZEmWWE9cUajjfcdcws+Gh7FhiO+Dy0RnR1bNz0YCHqhI0yRowCE9arVnNxYHqELOy9Hjw==", + "version": "9.2.8", + "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.2.8.tgz", + "integrity": "sha512-gxSak7IHUuRtwKf3FIPSW1VpZcqF9+MBrHOvBp9cjHh+525SjtCIJKVGjRKIAfxBwDGDGCFF00rTfzB1quxdSw==", "dev": true, "requires": { "chalk": "^4.1.0", @@ -3337,9 +3337,9 @@ } }, "typescript": { - "version": "4.5.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.5.5.tgz", - "integrity": "sha512-TCTIul70LyWe6IJWT8QSYeA54WQe8EjQFU4wY52Fasj5UKx88LNYKCgBEHcOMOrFF1rKGbD8v/xcNWVUq9SymA==", + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.6.2.tgz", + "integrity": "sha512-HM/hFigTBHZhLXshn9sN37H085+hQGeJHJ/X7LpBWLID/fbc2acUMfU+lGD98X81sKP+pFa9f0DZmCwB9GnbAg==", "dev": true }, "uc.micro": { @@ -3538,11 +3538,11 @@ } }, "vscode-extension-telemetry-wrapper": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/vscode-extension-telemetry-wrapper/-/vscode-extension-telemetry-wrapper-0.11.1.tgz", - "integrity": "sha512-O8yrlxQNJCfuNylJ1tGTICEGszoNyexw9ZAaZ5EskOPcCEua96/9q/Fn6Xif1suLwReMcVplGR043fnF0ZAoFA==", + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/vscode-extension-telemetry-wrapper/-/vscode-extension-telemetry-wrapper-0.12.0.tgz", + "integrity": "sha512-4q8sLhi1Az//cPHTdfxuoVpAAIIiL2jiui2Ta79QnZJ6nXk48uGgAdiz739IUQgZ40RwFl/vpvSF4uZ0ZLPpvA==", "requires": { - "@vscode/extension-telemetry": "^0.4.6", + "@vscode/extension-telemetry": "^0.4.9", "uuid": "^3.4.0" } }, @@ -3584,11 +3584,11 @@ "dev": true }, "vscode-tas-client": { - "version": "0.1.27", - "resolved": "https://registry.npmjs.org/vscode-tas-client/-/vscode-tas-client-0.1.27.tgz", - "integrity": "sha512-wyYSdbaSoInXmaXVO54ihvmG6uoRIQ4TdVctJgYqf66oTvUq6e5F3XgtiYRSM6yaqhI0rPqPrYIzLNOO524Z9A==", + "version": "0.1.31", + "resolved": "https://registry.npmjs.org/vscode-tas-client/-/vscode-tas-client-0.1.31.tgz", + "integrity": "sha512-GbvRil0TFdWtG0hvROi/haZkuKNkC/aVjhXWNCKBnS5VwpKtTRnt+o9M5FSETkW7dhfDTK/Jmv53372WtLnVSA==", "requires": { - "tas-client": "0.1.26" + "tas-client": "0.1.30" } }, "vscode-test": { @@ -3614,13 +3614,13 @@ } }, "webpack": { - "version": "5.68.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.68.0.tgz", - "integrity": "sha512-zUcqaUO0772UuuW2bzaES2Zjlm/y3kRBQDVFVCge+s2Y8mwuUTdperGaAv65/NtRL/1zanpSJOq/MD8u61vo6g==", + "version": "5.70.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.70.0.tgz", + "integrity": "sha512-ZMWWy8CeuTTjCxbeaQI21xSswseF2oNOwc70QSKNePvmxE7XW36i7vpBMYZFAUHPwQiEbNGCEYIOOlyRbdGmxw==", "dev": true, "requires": { - "@types/eslint-scope": "^3.7.0", - "@types/estree": "^0.0.50", + "@types/eslint-scope": "^3.7.3", + "@types/estree": "^0.0.51", "@webassemblyjs/ast": "1.11.1", "@webassemblyjs/wasm-edit": "1.11.1", "@webassemblyjs/wasm-parser": "1.11.1", @@ -3628,7 +3628,7 @@ "acorn-import-assertions": "^1.7.6", "browserslist": "^4.14.5", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.8.3", + "enhanced-resolve": "^5.9.2", "es-module-lexer": "^0.9.0", "eslint-scope": "5.1.1", "events": "^3.2.0", diff --git a/package.json b/package.json index 67542655..669fb39f 100644 --- a/package.json +++ b/package.json @@ -625,23 +625,23 @@ "@types/vscode": "1.60.0", "copy-webpack-plugin": "^9.1.0", "glob": "^7.2.0", - "mocha": "^9.2.0", - "ts-loader": "^9.2.6", + "mocha": "^9.2.2", + "ts-loader": "^9.2.8", "tslint": "^6.1.3", - "typescript": "^4.5.4", - "vscode-extension-tester": "^4.2.3", - "vscode-test": "^1.5.1", - "webpack": "^5.68.0", - "webpack-cli": "^4.9.1" + "typescript": "^4.6.2", + "vscode-extension-tester": "^4.2.4", + "vscode-test": "^1.6.1", + "webpack": "^5.70.0", + "webpack-cli": "^4.9.2" }, "dependencies": { "await-lock": "^2.1.0", - "fs-extra": "^10.0.0", + "fs-extra": "^10.0.1", "globby": "^11.1.0", "lodash": "^4.17.21", "minimatch": "^3.0.4", "semver": "^7.3.5", - "vscode-extension-telemetry-wrapper": "^0.11.1", - "vscode-tas-client": "^0.1.27" + "vscode-extension-telemetry-wrapper": "^0.12.0", + "vscode-tas-client": "^0.1.31" } } diff --git a/test/gradle/build.gradle b/test/gradle/build.gradle index 5508c216..020d07ce 100644 --- a/test/gradle/build.gradle +++ b/test/gradle/build.gradle @@ -10,5 +10,5 @@ repositories { } dependencies { - compile 'com.google.code.gson:gson:2.8.0' + implementation 'com.google.code.gson:gson:2.8.0' } From 5aa7ad88fe349008c990f291a00102ddd58afeb4 Mon Sep 17 00:00:00 2001 From: Yan Zhang Date: Thu, 24 Mar 2022 19:04:51 +0800 Subject: [PATCH 079/352] prepare for pre-release channel (#603) --- package-lock.json | 12 ++++++------ package.json | 4 ++-- scripts/prepare-nightly-build.js | 25 +++++++++++++++++++++++++ src/explorerCommands/utility.ts | 2 +- 4 files changed, 34 insertions(+), 9 deletions(-) create mode 100644 scripts/prepare-nightly-build.js diff --git a/package-lock.json b/package-lock.json index 5669d9da..f9599c88 100644 --- a/package-lock.json +++ b/package-lock.json @@ -262,9 +262,9 @@ "dev": true }, "@types/vscode": { - "version": "1.60.0", - "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.60.0.tgz", - "integrity": "sha512-wZt3VTmzYrgZ0l/3QmEbCq4KAJ71K3/hmMQ/nfpv84oH8e81KKwPEoQ5v8dNCxfHFVJ1JabHKmCvqdYOoVm1Ow==", + "version": "1.63.0", + "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.63.0.tgz", + "integrity": "sha512-iePu1axOi5WSThV6l2TYcciBIpAlMarjBC8H0y8L8ocsZLxh7MttzwFU3pjoItF5fRVGxHS0Hsvje9jO3yJsfw==", "dev": true }, "@ungap/promise-all-settled": { @@ -2118,9 +2118,9 @@ } }, "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", + "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", "dev": true }, "mkdirp-classic": { diff --git a/package.json b/package.json index 669fb39f..a888208a 100644 --- a/package.json +++ b/package.json @@ -12,7 +12,7 @@ "explorer" ], "engines": { - "vscode": "^1.60.0" + "vscode": "^1.63.0" }, "repository": { "type": "git", @@ -622,7 +622,7 @@ "@types/mocha": "^9.1.0", "@types/node": "^14.14.0", "@types/semver": "^7.3.9", - "@types/vscode": "1.60.0", + "@types/vscode": "1.63.0", "copy-webpack-plugin": "^9.1.0", "glob": "^7.2.0", "mocha": "^9.2.2", diff --git a/scripts/prepare-nightly-build.js b/scripts/prepare-nightly-build.js new file mode 100644 index 00000000..7e40038b --- /dev/null +++ b/scripts/prepare-nightly-build.js @@ -0,0 +1,25 @@ +const fs = require("fs"); + +const json = JSON.parse(fs.readFileSync("./package.json").toString()); +const stableVersion = json.version.match(/(\d+)\.(\d+)\.(\d+)/); +const major = stableVersion[1]; +const minor = stableVersion[2]; + +function prependZero(number) { + if (number > 99) { + throw "Unexpected value to prepend with zero"; + } + return `${number < 10 ? "0" : ""}${number}`; +} + +const date = new Date(); +const month = date.getMonth() + 1; +const day = date.getDate(); +const hours = date.getHours(); +patch = `${date.getFullYear()}${prependZero(month)}${prependZero(day)}${prependZero(hours)}`; + +const insiderPackageJson = Object.assign(json, { + version: `${major}.${minor}.${patch}`, +}); + +fs.writeFileSync("./package.insiders.json", JSON.stringify(insiderPackageJson)); \ No newline at end of file diff --git a/src/explorerCommands/utility.ts b/src/explorerCommands/utility.ts index 22e26968..3b46bcb7 100644 --- a/src/explorerCommands/utility.ts +++ b/src/explorerCommands/utility.ts @@ -35,7 +35,7 @@ export function checkJavaQualifiedName(value: string): string { return ""; } -export function getCmdNode(selectedNodes: ExplorerNode[], node?: DataNode): DataNode | undefined { +export function getCmdNode(selectedNodes: readonly ExplorerNode[], node?: DataNode): DataNode | undefined { // if command not invoked by context menu, use selected node in explorer if (node) { return node; From 50d57c11f3b579f03307f669fe3c3d615406b465 Mon Sep 17 00:00:00 2001 From: Sheng Chen Date: Mon, 11 Apr 2022 17:21:32 +0800 Subject: [PATCH 080/352] fix: Add null check (#607) Signed-off-by: sheche --- .../microsoft/jdtls/ext/core/ExtUtils.java | 12 +- package-lock.json | 108 ++++++++++-------- package.json | 12 +- 3 files changed, 75 insertions(+), 57 deletions(-) diff --git a/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/ExtUtils.java b/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/ExtUtils.java index 1eeb22a1..366b935b 100644 --- a/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/ExtUtils.java +++ b/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/ExtUtils.java @@ -11,6 +11,7 @@ package com.microsoft.jdtls.ext.core; +import java.io.File; import java.net.URI; import java.net.URISyntaxException; import java.util.Arrays; @@ -29,6 +30,7 @@ import org.eclipse.jdt.core.JavaModelException; import org.eclipse.jdt.internal.core.JarEntryDirectory; import org.eclipse.jdt.internal.core.JarEntryFile; +import org.eclipse.jdt.launching.IVMInstall; import org.eclipse.jdt.launching.JavaRuntime; import org.eclipse.jdt.ls.core.internal.JavaLanguageServerPlugin; @@ -112,7 +114,15 @@ public static URI getContainerURI(IJavaProject javaProject, IClasspathContainer switch (container.getKind()) { case IClasspathContainer.K_DEFAULT_SYSTEM: // JRE Container case IClasspathContainer.K_SYSTEM: - return JavaRuntime.getVMInstall(javaProject).getInstallLocation().toURI(); + IVMInstall vmInstall = JavaRuntime.getVMInstall(javaProject); + if (vmInstall == null) { + return null; + } + File installLocation = vmInstall.getInstallLocation(); + if (installLocation == null) { + return null; + } + return installLocation.toURI(); case IClasspathContainer.K_APPLICATION: // Plugin Container, Maven Container, etc return null; // TODO: find out a good way to detect these containers' uri default: // Persistent container (e.g. /src/main/java) diff --git a/package-lock.json b/package-lock.json index f9599c88..88bbf1aa 100644 --- a/package-lock.json +++ b/package-lock.json @@ -217,9 +217,9 @@ } }, "@types/lodash": { - "version": "4.14.178", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.178.tgz", - "integrity": "sha512-0d5Wd09ItQWH1qFbEyQ7oTQ3GZrMfth5JkbN3EvTKLXcHLRDSXeLnlvlOn0wvxVIwK5o2M8JzP/OWz7T3NRsbw==", + "version": "4.14.181", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.181.tgz", + "integrity": "sha512-n3tyKthHJbkiWhDZs3DkhkCzt2MexYHXlX0td5iMplyfwketaOeKboEVBqzceH7juqvEg3q5oUoBFxSLu7zFag==", "dev": true }, "@types/minimatch": { @@ -235,9 +235,9 @@ "dev": true }, "@types/node": { - "version": "14.18.11", - "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.11.tgz", - "integrity": "sha512-zCoCEMA+IPpsRkyCFBqew5vGb7r8RSiB3uwdu/map7uwLAfu1MTazW26/pUDWoNnF88vJz4W3U56i5gtXNqxGg==", + "version": "14.18.12", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.12.tgz", + "integrity": "sha512-q4jlIR71hUpWTnGhXWcakgkZeHa3CCjcQcnuzU8M891BAWA2jHiziiWEPEkdS5pFsz7H9HJiy8BrK7tBRNrY7A==", "dev": true }, "@types/responselike": { @@ -657,15 +657,15 @@ "dev": true }, "browserslist": { - "version": "4.19.1", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.19.1.tgz", - "integrity": "sha512-u2tbbG5PdKRTUoctO3NBD8FQ5HdPh1ZXPHzp1rwaa5jTc+RV9/+RlWiAIKmjRPQF+xbGM9Kklj5bZQFa2s/38A==", + "version": "4.20.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.20.2.tgz", + "integrity": "sha512-CQOBCqp/9pDvDbx3xfMi+86pr4KXIf2FDkTTdeuYw8OxS9t898LA1Khq57gtufFILXpfgsSx5woNgsBgvGjpsA==", "dev": true, "requires": { - "caniuse-lite": "^1.0.30001286", - "electron-to-chromium": "^1.4.17", + "caniuse-lite": "^1.0.30001317", + "electron-to-chromium": "^1.4.84", "escalade": "^3.1.1", - "node-releases": "^2.0.1", + "node-releases": "^2.0.2", "picocolors": "^1.0.0" } }, @@ -769,9 +769,9 @@ "dev": true }, "caniuse-lite": { - "version": "1.0.30001310", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001310.tgz", - "integrity": "sha512-cb9xTV8k9HTIUA3GnPUJCk0meUnrHL5gy5QePfDjxHyNBcnzPzrHFv5GqfP7ue5b1ZyzZL0RJboD6hQlPXjhjg==", + "version": "1.0.30001327", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001327.tgz", + "integrity": "sha512-1/Cg4jlD9qjZzhbzkzEaAC2JHsP0WrOc8Rd/3a3LuajGzGWR/hD7TVyvq99VqmTy99eVh8Zkmdq213OgvgXx7w==", "dev": true }, "chainsaw": { @@ -1185,9 +1185,9 @@ } }, "electron-to-chromium": { - "version": "1.4.68", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.68.tgz", - "integrity": "sha512-cId+QwWrV8R1UawO6b9BR1hnkJ4EJPCPAr4h315vliHUtVUJDk39Sg1PMNnaWKfj5x+93ssjeJ9LKL6r8LaMiA==", + "version": "1.4.106", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.106.tgz", + "integrity": "sha512-ZYfpVLULm67K7CaaGP7DmjyeMY4naxsbTy+syVVxT6QHI1Ww8XbJjmr9fDckrhq44WzCrcC5kH3zGpdusxwwqg==", "dev": true }, "emoji-regex": { @@ -2025,6 +2025,7 @@ "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, "requires": { "yallist": "^4.0.0" } @@ -2083,18 +2084,18 @@ "dev": true }, "mime-db": { - "version": "1.51.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.51.0.tgz", - "integrity": "sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g==", + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", "dev": true }, "mime-types": { - "version": "2.1.34", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.34.tgz", - "integrity": "sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A==", + "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, "requires": { - "mime-db": "1.51.0" + "mime-db": "1.52.0" } }, "mimic-fn": { @@ -2110,9 +2111,9 @@ "dev": true }, "minimatch": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.5.tgz", - "integrity": "sha512-tUpxzX0VAzJHjLu0xUfFv1gwVp9ba3IOuRAVH2EGuRW8a5emA2FlACLqiT/lDVtS1W+TGNwqz3sWaNyLgDJWuw==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "requires": { "brace-expansion": "^1.1.7" } @@ -2828,11 +2829,18 @@ } }, "semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "version": "7.3.6", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.6.tgz", + "integrity": "sha512-HZWqcgwLsjaX1HBD31msI/rXktuIhS+lWvdE4kN9z+8IVT4Itc7vqU2WvYsyD6/sjYCt4dEKH/m1M3dwI9CC5w==", "requires": { - "lru-cache": "^6.0.0" + "lru-cache": "^7.4.0" + }, + "dependencies": { + "lru-cache": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.8.1.tgz", + "integrity": "sha512-E1v547OCgJvbvevfjgK9sNKIVXO96NnsTsFPBlg4ZxjhsJSODoH9lk8Bm0OxvHNm6Vm5Yqkl/1fErDxhYL8Skg==" + } } }, "serialize-javascript": { @@ -3095,11 +3103,12 @@ } }, "terser": { - "version": "5.10.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.10.0.tgz", - "integrity": "sha512-AMmF99DMfEDiRJfxfY5jj5wNH/bYO09cniSqhfoyxc8sFoYIgkJy86G04UoZU5VjlpnplVu0K6Tx6E9b5+DlHA==", + "version": "5.12.1", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.12.1.tgz", + "integrity": "sha512-NXbs+7nisos5E+yXwAD+y7zrcTkMqb0dEJxIGtSKPdCBzopf7ni4odPul2aechpV7EXNvOudYOX2bb5tln1jbQ==", "dev": true, "requires": { + "acorn": "^8.5.0", "commander": "^2.20.0", "source-map": "~0.7.2", "source-map-support": "~0.5.20" @@ -3337,9 +3346,9 @@ } }, "typescript": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.6.2.tgz", - "integrity": "sha512-HM/hFigTBHZhLXshn9sN37H085+hQGeJHJ/X7LpBWLID/fbc2acUMfU+lGD98X81sKP+pFa9f0DZmCwB9GnbAg==", + "version": "4.6.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.6.3.tgz", + "integrity": "sha512-yNIatDa5iaofVozS/uQJEl3JRWLKKGJKh6Yaiv0GLGSuhpFJe7P3SbHZ8/yjAHRQwKRoA6YZqlfjXWmVzoVSMw==", "dev": true }, "uc.micro": { @@ -3614,9 +3623,9 @@ } }, "webpack": { - "version": "5.70.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.70.0.tgz", - "integrity": "sha512-ZMWWy8CeuTTjCxbeaQI21xSswseF2oNOwc70QSKNePvmxE7XW36i7vpBMYZFAUHPwQiEbNGCEYIOOlyRbdGmxw==", + "version": "5.72.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.72.0.tgz", + "integrity": "sha512-qmSmbspI0Qo5ld49htys8GY9XhS9CGqFoHTsOVAnjBdg0Zn79y135R+k4IR4rKK6+eKaabMhJwiVB7xw0SJu5w==", "dev": true, "requires": { "@types/eslint-scope": "^3.7.3", @@ -3643,14 +3652,6 @@ "terser-webpack-plugin": "^5.1.3", "watchpack": "^2.3.1", "webpack-sources": "^3.2.3" - }, - "dependencies": { - "webpack-sources": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", - "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", - "dev": true - } } }, "webpack-cli": { @@ -3761,6 +3762,12 @@ "wildcard": "^2.0.0" } }, + "webpack-sources": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", + "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", + "dev": true + }, "which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", @@ -3873,7 +3880,8 @@ "yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true }, "yargs": { "version": "16.2.0", diff --git a/package.json b/package.json index a888208a..0146db70 100644 --- a/package.json +++ b/package.json @@ -617,10 +617,10 @@ "devDependencies": { "@types/fs-extra": "^9.0.13", "@types/glob": "^7.2.0", - "@types/lodash": "^4.14.178", + "@types/lodash": "^4.14.181", "@types/minimatch": "^3.0.3", "@types/mocha": "^9.1.0", - "@types/node": "^14.14.0", + "@types/node": "^14.18.12", "@types/semver": "^7.3.9", "@types/vscode": "1.63.0", "copy-webpack-plugin": "^9.1.0", @@ -628,10 +628,10 @@ "mocha": "^9.2.2", "ts-loader": "^9.2.8", "tslint": "^6.1.3", - "typescript": "^4.6.2", + "typescript": "^4.6.3", "vscode-extension-tester": "^4.2.4", "vscode-test": "^1.6.1", - "webpack": "^5.70.0", + "webpack": "^5.72.0", "webpack-cli": "^4.9.2" }, "dependencies": { @@ -639,8 +639,8 @@ "fs-extra": "^10.0.1", "globby": "^11.1.0", "lodash": "^4.17.21", - "minimatch": "^3.0.4", - "semver": "^7.3.5", + "minimatch": "^3.1.2", + "semver": "^7.3.6", "vscode-extension-telemetry-wrapper": "^0.12.0", "vscode-tas-client": "^0.1.31" } From 4dd8591a56afa1af76667e534dcab42c9c0e4e7c Mon Sep 17 00:00:00 2001 From: Sheng Chen Date: Thu, 14 Apr 2022 10:06:39 +0800 Subject: [PATCH 081/352] fix: Remove file from remote environment (#609) Signed-off-by: sheche --- package.json | 31 ++++++++++++++++++++++++++++--- package.nls.json | 1 + package.nls.zh.json | 1 + src/commands.ts | 2 ++ src/explorerCommands/delete.ts | 32 ++++++++++++++++++++------------ src/views/dependencyExplorer.ts | 5 ++++- 6 files changed, 56 insertions(+), 16 deletions(-) diff --git a/package.json b/package.json index 0146db70..fc1af0ea 100644 --- a/package.json +++ b/package.json @@ -165,6 +165,11 @@ "title": "%contributes.commands.java.view.package.moveFileToTrash%", "category": "Java" }, + { + "command": "java.view.package.deleteFilePermanently", + "title": "%contributes.commands.java.view.package.deleteFilePermanently%", + "category": "Java" + }, { "command": "java.view.package.renameFile", "title": "%contributes.commands.java.view.package.renameFile%", @@ -256,7 +261,13 @@ "command": "java.view.package.moveFileToTrash", "key": "delete", "mac": "cmd+backspace", - "when": "java:serverMode == Standard && focusedView == javaProjectExplorer" + "when": "java:serverMode == Standard && focusedView == javaProjectExplorer && explorerResourceMoveableToTrash" + }, + { + "command": "java.view.package.deleteFilePermanently", + "key": "delete", + "mac": "cmd+backspace", + "when": "java:serverMode == Standard && focusedView == javaProjectExplorer && !explorerResourceMoveableToTrash" } ], "menus": { @@ -330,6 +341,10 @@ "command": "java.view.package.moveFileToTrash", "when": "false" }, + { + "command": "java.view.package.deleteFilePermanently", + "when": "false" + }, { "command": "java.project.build.workspace", "when": "false" @@ -446,12 +461,22 @@ }, { "command": "java.view.package.moveFileToTrash", - "when": "view == javaProjectExplorer && viewItem =~ /java:(package|packageRoot)(?=.*?\\b\\+(source|resource)\\b)(?=.*?\\b\\+uri\\b)/", + "when": "view == javaProjectExplorer && explorerResourceMoveableToTrash && viewItem =~ /java:(package|packageRoot)(?=.*?\\b\\+(source|resource)\\b)(?=.*?\\b\\+uri\\b)/", "group": "7_modification@20" }, { "command": "java.view.package.moveFileToTrash", - "when": "view == javaProjectExplorer && viewItem =~ /java:(file|type|folder)(?=.*?\\b\\+uri\\b)/", + "when": "view == javaProjectExplorer && explorerResourceMoveableToTrash && viewItem =~ /java:(file|type|folder)(?=.*?\\b\\+uri\\b)/", + "group": "7_modification@20" + }, + { + "command": "java.view.package.deleteFilePermanently", + "when": "view == javaProjectExplorer && !explorerResourceMoveableToTrash && viewItem =~ /java:(package|packageRoot)(?=.*?\\b\\+(source|resource)\\b)(?=.*?\\b\\+uri\\b)/", + "group": "7_modification@20" + }, + { + "command": "java.view.package.deleteFilePermanently", + "when": "view == javaProjectExplorer && !explorerResourceMoveableToTrash && viewItem =~ /java:(file|type|folder)(?=.*?\\b\\+uri\\b)/", "group": "7_modification@20" }, { diff --git a/package.nls.json b/package.nls.json index c68f3bb9..2442157c 100644 --- a/package.nls.json +++ b/package.nls.json @@ -21,6 +21,7 @@ "contributes.commands.java.view.package.newPackage": "New Package", "contributes.commands.java.view.package.renameFile": "Rename", "contributes.commands.java.view.package.moveFileToTrash": "Delete", + "contributes.commands.java.view.package.deleteFilePermanently": "Delete Permanently", "configuration.java.dependency.showMembers": "Show the members in the explorer", "configuration.java.dependency.syncWithFolderExplorer": "Synchronize Java Projects explorer selection with folder explorer", "configuration.java.dependency.autoRefresh": "Synchronize Java Projects explorer with changes", diff --git a/package.nls.zh.json b/package.nls.zh.json index 314a8392..6517258b 100644 --- a/package.nls.zh.json +++ b/package.nls.zh.json @@ -21,6 +21,7 @@ "contributes.commands.java.view.package.newPackage": "创建包", "contributes.commands.java.view.package.renameFile": "重命名", "contributes.commands.java.view.package.moveFileToTrash": "删除", + "contributes.commands.java.view.package.deleteFilePermanently": "永久删除", "configuration.java.dependency.showMembers": "在 Java 项目管理器中显示成员", "configuration.java.dependency.syncWithFolderExplorer": "在 Java 项目管理器中同步关联当前打开的文件", "configuration.java.dependency.autoRefresh": "在 Java 项目管理器中自动同步修改", diff --git a/src/commands.ts b/src/commands.ts index 11ffc606..b9b40f98 100644 --- a/src/commands.ts +++ b/src/commands.ts @@ -40,6 +40,8 @@ export namespace Commands { export const VIEW_PACKAGE_MOVE_FILE_TO_TRASH = "java.view.package.moveFileToTrash"; + export const VIEW_PACKAGE_DELETE_FILE_PERMANENTLY = "java.view.package.deleteFilePermanently"; + export const VIEW_PACKAGE_REVEAL_IN_PROJECT_EXPLORER = "java.view.package.revealInProjectExplorer"; export const JAVA_PROJECT_OPEN = "_java.project.open"; diff --git a/src/explorerCommands/delete.ts b/src/explorerCommands/delete.ts index 3a6d626b..0dc5e59e 100644 --- a/src/explorerCommands/delete.ts +++ b/src/explorerCommands/delete.ts @@ -2,19 +2,19 @@ // Licensed under the MIT license. import { Uri, window, workspace } from "vscode"; +import { sendError } from "vscode-extension-telemetry-wrapper"; import { DataNode } from "../views/dataNode"; import { isMutable } from "./utility"; -const confirmMessage = "Move to Recycle Bin"; - -export async function deleteFiles(node?: DataNode): Promise { +export async function deleteFiles(node: DataNode | undefined, useTrash: boolean): Promise { if (!node?.uri || !isMutable(node)) { return; } const children = await node.getChildren(); const isFolder = children && children.length !== 0; - const message = getInformationMessage(node.name, isFolder); + const message = getInformationMessage(node.name, isFolder, useTrash); + const confirmMessage = useTrash ? "Move to Recycle Bin" : "Delete"; const answer: string | undefined = await window.showInformationMessage( message, @@ -23,16 +23,24 @@ export async function deleteFiles(node?: DataNode): Promise { ); if (answer === confirmMessage) { - workspace.fs.delete(Uri.parse(node.uri), { - recursive: true, - useTrash: true, - }); + try { + await workspace.fs.delete(Uri.parse(node.uri), { + recursive: true, + useTrash, + }); + } catch (e) { + // See: https://github.com/microsoft/vscode-java-dependency/issues/608 + sendError(new Error("Failed to remove files.")); + } } } -function getInformationMessage(name: string, isFolder: boolean): string { +function getInformationMessage(name: string, isFolder: boolean, useTrash: boolean): string { const folderMsg = isFolder ? " and its contents" : ""; - const msg = `Are you sure you want to delete \'${name}\'${folderMsg}?\n\n`; - const additionMsg = "You can restore from the Recycle Bin."; - return msg + additionMsg; + let msg = `Are you sure you want to ${useTrash ? "" : "permanently "}delete \'${name}\'${folderMsg}?`; + + if (useTrash) { + msg += "\n\nYou can restore from the Recycle Bin."; + } + return msg; } diff --git a/src/views/dependencyExplorer.ts b/src/views/dependencyExplorer.ts index d5f99d12..3bfb7f90 100644 --- a/src/views/dependencyExplorer.ts +++ b/src/views/dependencyExplorer.ts @@ -126,7 +126,10 @@ export class DependencyExplorer implements Disposable { renameFile(getCmdNode(this._dependencyViewer.selection, node)); }), instrumentOperationAsVsCodeCommand(Commands.VIEW_PACKAGE_MOVE_FILE_TO_TRASH, (node?: DataNode) => { - deleteFiles(getCmdNode(this._dependencyViewer.selection, node)); + deleteFiles(getCmdNode(this._dependencyViewer.selection, node), true); + }), + instrumentOperationAsVsCodeCommand(Commands.VIEW_PACKAGE_DELETE_FILE_PERMANENTLY, (node?: DataNode) => { + deleteFiles(getCmdNode(this._dependencyViewer.selection, node), false); }), ); } From 172e23227819b3a618a675d7dff2d36e87e4d4d9 Mon Sep 17 00:00:00 2001 From: Sheng Chen Date: Fri, 22 Apr 2022 10:20:30 +0800 Subject: [PATCH 082/352] chore: Prepare for 0.19.1 (#610) --- CHANGELOG.md | 3 +++ .../com.microsoft.jdtls.ext.activator/META-INF/MANIFEST.MF | 2 +- jdtls.ext/com.microsoft.jdtls.ext.activator/pom.xml | 2 +- jdtls.ext/com.microsoft.jdtls.ext.core/META-INF/MANIFEST.MF | 2 +- jdtls.ext/com.microsoft.jdtls.ext.core/pom.xml | 2 +- jdtls.ext/pom.xml | 2 +- package-lock.json | 2 +- package.json | 4 ++-- 8 files changed, 11 insertions(+), 8 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 14d746ba..7285884e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,9 @@ All notable changes to the "vscode-java-dependency" extension will be documented The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/) and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html). +## 0.19.1 +- [Bugs fixed](https://github.com/microsoft/vscode-java-dependency/issues?q=is%3Aissue+label%3Abug+milestone%3A0.19.1+is%3Aclosed) + ## 0.19.0 ### Added - Support creating new JavaFX project via Maven archetype. [PR#581](https://github.com/microsoft/vscode-java-dependency/pull/581) diff --git a/jdtls.ext/com.microsoft.jdtls.ext.activator/META-INF/MANIFEST.MF b/jdtls.ext/com.microsoft.jdtls.ext.activator/META-INF/MANIFEST.MF index 3d205675..ef04d20f 100644 --- a/jdtls.ext/com.microsoft.jdtls.ext.activator/META-INF/MANIFEST.MF +++ b/jdtls.ext/com.microsoft.jdtls.ext.activator/META-INF/MANIFEST.MF @@ -2,7 +2,7 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: JDTLS EXT Activator Bundle-SymbolicName: com.microsoft.jdtls.ext.activator;singleton:=true -Bundle-Version: 0.19.0 +Bundle-Version: 0.19.1 Bundle-Activator: com.microsoft.jdtls.ext.activator.JdtlsExtActivator Bundle-RequiredExecutionEnvironment: JavaSE-1.8 Import-Package: org.eclipse.jdt.core, diff --git a/jdtls.ext/com.microsoft.jdtls.ext.activator/pom.xml b/jdtls.ext/com.microsoft.jdtls.ext.activator/pom.xml index e5cb94b1..6f9b23d9 100644 --- a/jdtls.ext/com.microsoft.jdtls.ext.activator/pom.xml +++ b/jdtls.ext/com.microsoft.jdtls.ext.activator/pom.xml @@ -5,7 +5,7 @@ com.microsoft.jdtls.ext jdtls-ext-parent - 0.19.0 + 0.19.1 com.microsoft.jdtls.ext.activator eclipse-plugin diff --git a/jdtls.ext/com.microsoft.jdtls.ext.core/META-INF/MANIFEST.MF b/jdtls.ext/com.microsoft.jdtls.ext.core/META-INF/MANIFEST.MF index 07e88481..821856f7 100644 --- a/jdtls.ext/com.microsoft.jdtls.ext.core/META-INF/MANIFEST.MF +++ b/jdtls.ext/com.microsoft.jdtls.ext.core/META-INF/MANIFEST.MF @@ -2,7 +2,7 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: JDTLS EXT Core Bundle-SymbolicName: com.microsoft.jdtls.ext.core;singleton:=true -Bundle-Version: 0.19.0 +Bundle-Version: 0.19.1 Bundle-Activator: com.microsoft.jdtls.ext.core.JdtlsExtActivator Bundle-RequiredExecutionEnvironment: JavaSE-1.8 Bundle-ActivationPolicy: lazy diff --git a/jdtls.ext/com.microsoft.jdtls.ext.core/pom.xml b/jdtls.ext/com.microsoft.jdtls.ext.core/pom.xml index 02c63e16..52c2392c 100644 --- a/jdtls.ext/com.microsoft.jdtls.ext.core/pom.xml +++ b/jdtls.ext/com.microsoft.jdtls.ext.core/pom.xml @@ -5,7 +5,7 @@ com.microsoft.jdtls.ext jdtls-ext-parent - 0.19.0 + 0.19.1 com.microsoft.jdtls.ext.core eclipse-plugin diff --git a/jdtls.ext/pom.xml b/jdtls.ext/pom.xml index 52913466..3d90edd3 100644 --- a/jdtls.ext/pom.xml +++ b/jdtls.ext/pom.xml @@ -4,7 +4,7 @@ com.microsoft.jdtls.ext jdtls-ext-parent ${base.name} :: Parent - 0.19.0 + 0.19.1 pom Java Project Manager diff --git a/package-lock.json b/package-lock.json index 88bbf1aa..29c150d8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "vscode-java-dependency", - "version": "0.19.0", + "version": "0.19.1", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index fc1af0ea..f4923784 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "vscode-java-dependency", "displayName": "Project Manager for Java", "description": "%description%", - "version": "0.19.0", + "version": "0.19.1", "publisher": "vscjava", "preview": true, "aiKey": "5c642b22-e845-4400-badb-3f8509a70777", @@ -42,7 +42,7 @@ "main": "./main.js", "contributes": { "javaExtensions": [ - "./server/com.microsoft.jdtls.ext.core-0.19.0.jar" + "./server/com.microsoft.jdtls.ext.core-0.19.1.jar" ], "commands": [ { From 77420fc2f8e739f616dfc5dec9ebb9ab8489a1bf Mon Sep 17 00:00:00 2001 From: Sheng Chen Date: Thu, 5 May 2022 10:16:46 +0800 Subject: [PATCH 083/352] chore: Update dependencies (#611) Signed-off-by: sheche --- package-lock.json | 312 +++++++++++++++++++++++----------------------- package.json | 20 +-- 2 files changed, 163 insertions(+), 169 deletions(-) diff --git a/package-lock.json b/package-lock.json index 29c150d8..80c61285 100644 --- a/package-lock.json +++ b/package-lock.json @@ -118,9 +118,9 @@ } }, "@sindresorhus/is": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.4.0.tgz", - "integrity": "sha512-QppPM/8l3Mawvh4rn9CNEYIU9bxpXUCRMaX9yUpvBk1nMKusLKpfXGDEKExKaPhLzcn3lzil7pR6rnJ11HgeRQ==", + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", + "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==", "dev": true }, "@szmarczak/http-timer": { @@ -201,6 +201,12 @@ "integrity": "sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ==", "dev": true }, + "@types/json-buffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/json-buffer/-/json-buffer-3.0.0.tgz", + "integrity": "sha512-3YP80IxxFJB4b5tYC2SUPwkg0XQLiu0nWvhRgEatgjf+29IcWO9X1k8xRv5DGssJ/lCrjYTjQPcobJr2yWIVuQ==", + "dev": true + }, "@types/json-schema": { "version": "7.0.9", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz", @@ -208,18 +214,18 @@ "dev": true }, "@types/keyv": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.3.tgz", - "integrity": "sha512-FXCJgyyN3ivVgRoml4h94G/p3kY+u/B86La+QptcqJaWtBWtmc6TtkNfS40n9bIvyLteHh7zXOtgbobORKPbDg==", + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.4.tgz", + "integrity": "sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==", "dev": true, "requires": { "@types/node": "*" } }, "@types/lodash": { - "version": "4.14.181", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.181.tgz", - "integrity": "sha512-n3tyKthHJbkiWhDZs3DkhkCzt2MexYHXlX0td5iMplyfwketaOeKboEVBqzceH7juqvEg3q5oUoBFxSLu7zFag==", + "version": "4.14.182", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.182.tgz", + "integrity": "sha512-/THyiqyQAP9AfARo4pF+aCGcyiQ94tX/Is2I7HofNRqoYLgN1PBoOWu2/zTA5zMxzP5EFutMtWtGAFRKUe961Q==", "dev": true }, "@types/minimatch": { @@ -229,15 +235,15 @@ "dev": true }, "@types/mocha": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-9.1.0.tgz", - "integrity": "sha512-QCWHkbMv4Y5U9oW10Uxbr45qMMSzl4OzijsozynUAgx3kEHUdXB00udx2dWDQ7f2TU2a2uuiFaRZjCe3unPpeg==", + "version": "9.1.1", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-9.1.1.tgz", + "integrity": "sha512-Z61JK7DKDtdKTWwLeElSEBcWGRLY8g95ic5FoQqI9CMx0ns/Ghep3B4DfcEimiKMvtamNVULVNKEsiwV3aQmXw==", "dev": true }, "@types/node": { - "version": "14.18.12", - "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.12.tgz", - "integrity": "sha512-q4jlIR71hUpWTnGhXWcakgkZeHa3CCjcQcnuzU8M891BAWA2jHiziiWEPEkdS5pFsz7H9HJiy8BrK7tBRNrY7A==", + "version": "14.18.16", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.16.tgz", + "integrity": "sha512-X3bUMdK/VmvrWdoTkz+VCn6nwKwrKCFTHtqwBIaQJNx4RUIBBUFXM00bqPz/DsDd+Icjmzm6/tyYZzeGVqb6/Q==", "dev": true }, "@types/responselike": { @@ -556,22 +562,22 @@ "dev": true }, "await-lock": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/await-lock/-/await-lock-2.1.0.tgz", - "integrity": "sha512-t7Zm5YGgEEc/3eYAicF32m/TNvL+XOeYZy9CvBUeJY/szM7frLolFylhrlZNWV/ohWhcUXygrBGjYmoQdxF4CQ==" + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/await-lock/-/await-lock-2.2.2.tgz", + "integrity": "sha512-aDczADvlvTGajTDjcjpJMqRkOF6Qdz3YbPZm/PyW6tKPkx2hlYBzxMhEywM/tU72HrVZjgl5VCdRuMlA7pZ8Gw==" }, "axios": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.25.0.tgz", - "integrity": "sha512-cD8FOb0tRH3uuEe6+evtAbgJtfxr7ly3fQjYcMcuPlgkwVS9xboaVIpcDV+cYQe+yGykgwZCs1pzjntcGa6l5g==", + "version": "0.26.1", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.26.1.tgz", + "integrity": "sha512-fPwcX4EvnSHuInCMItEhAGnaSEXRBjtzh9fOtsE6E1G6p7vl7edEeZe11QHf18+6+9gR5PbKV/sGKNaD8YaMeA==", "requires": { - "follow-redirects": "^1.14.7" + "follow-redirects": "^1.14.8" } }, "azure-devops-node-api": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/azure-devops-node-api/-/azure-devops-node-api-11.1.0.tgz", - "integrity": "sha512-6/2YZuf+lJzJLrjXNYEA5RXAkMCb8j/4VcHD0qJQRsgG/KsRMYo0HgDh0by1FGHyZkQWY5LmQyJqCwRVUB3Y7Q==", + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/azure-devops-node-api/-/azure-devops-node-api-11.1.1.tgz", + "integrity": "sha512-XDG91XzLZ15reP12s3jFkKS8oiagSICjnLwxEYieme4+4h3ZveFOFRA4iYIG40RyHXsiI0mefFYYMFIJbMpWcg==", "dev": true, "requires": { "tunnel": "0.0.6", @@ -820,24 +826,24 @@ }, "dependencies": { "tslib": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", - "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", "dev": true } } }, "cheerio-select": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-1.5.0.tgz", - "integrity": "sha512-qocaHPv5ypefh6YNxvnbABM07KMxExbtbfuJoIie3iZXX1ERwYmJcIiRrr9H05ucQP1k28dav8rpdDgjQd8drg==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-1.6.0.tgz", + "integrity": "sha512-eq0GdBvxVFbqWgmCm7M3XGs1I8oLy/nExUnh6oLqmBditPO9AqQJrkslDpMun/hZ0yyTs8L0m85OHp4ho6Qm9g==", "dev": true, "requires": { - "css-select": "^4.1.3", - "css-what": "^5.0.1", + "css-select": "^4.3.0", + "css-what": "^6.0.1", "domelementtype": "^2.2.0", - "domhandler": "^4.2.0", - "domutils": "^2.7.0" + "domhandler": "^4.3.1", + "domutils": "^2.8.0" } }, "chokidar": { @@ -867,6 +873,12 @@ } } }, + "chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", + "dev": true + }, "chrome-trace-event": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", @@ -988,6 +1000,16 @@ "integrity": "sha512-W6Af2Iw1z4CB7q4uU4hv646dW9GQuBM+YpC0UvUCWSD8w90SJjp+ujJuXaEMtAXBtSqGfMPuFOVn4/+FlaqfBA==", "dev": true }, + "compress-brotli": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/compress-brotli/-/compress-brotli-1.3.6.tgz", + "integrity": "sha512-au99/GqZtUtiCBliqLFbWlhnCxn+XSYjwZ77q6mKN4La4qOXDoLVPZ50iXr0WmAyMxl8yqoq3Yq4OeQNPPkyeQ==", + "dev": true, + "requires": { + "@types/json-buffer": "~3.0.0", + "json-buffer": "~3.0.1" + } + }, "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -1050,22 +1072,22 @@ } }, "css-select": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.2.1.tgz", - "integrity": "sha512-/aUslKhzkTNCQUB2qTX84lVmfia9NyjP3WpDGtj/WxhwBzWBYUV3DgUpurHTme8UTPcPlAD1DJ+b0nN/t50zDQ==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", + "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", "dev": true, "requires": { "boolbase": "^1.0.0", - "css-what": "^5.1.0", - "domhandler": "^4.3.0", + "css-what": "^6.0.1", + "domhandler": "^4.3.1", "domutils": "^2.8.0", "nth-check": "^2.0.1" } }, "css-what": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-5.1.0.tgz", - "integrity": "sha512-arSMRWIIFY0hV8pIxZMEfmMI47Wj3R/aWpZDDxWYCPEiOMv6tfOrnpDtgxBYPEQD4V0Y/958+1TdC3iWTFcUPw==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", + "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", "dev": true }, "debug": { @@ -1119,9 +1141,9 @@ "dev": true }, "detect-libc": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.0.tgz", - "integrity": "sha512-S55LzUl8HUav8l9E2PBTlC5PAJrHK7tkM+XXFGD+fbsbkTzhCpG6K05LxJcUOEWzMa4v6ptcMZ9s3fOdJDu0Zw==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.1.tgz", + "integrity": "sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==", "dev": true }, "diff": { @@ -1139,9 +1161,9 @@ } }, "dom-serializer": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.3.2.tgz", - "integrity": "sha512-5c54Bk5Dw4qAxNOI1pFEizPSjVsx5+bpJKmL2kPn8JhBUq2q09tTCa3mjijun2NfK78NMouDYNMBkOrPZiS+ig==", + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", + "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", "dev": true, "requires": { "domelementtype": "^2.0.1", @@ -1150,15 +1172,15 @@ } }, "domelementtype": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz", - "integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", "dev": true }, "domhandler": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.0.tgz", - "integrity": "sha512-fC0aXNQXqKSFTr2wDNZDhsEYjCiYsDWl3D01kwt25hm1YIPyDGHvvi3rw+PLqHAl/m71MaiF7d5zvBr0p5UB2g==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", + "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", "dev": true, "requires": { "domelementtype": "^2.2.0" @@ -1404,9 +1426,9 @@ "dev": true }, "follow-redirects": { - "version": "1.14.9", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.9.tgz", - "integrity": "sha512-MQDfihBQYMcyy5dhRDJUHcw7lb2Pv/TuE6xP1vyraLukNDHKbDxDNaOE3NbCAdKQApno+GPRyo1YAp89yCjK4w==" + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.0.tgz", + "integrity": "sha512-aExlJShTV4qOUOL7yF1U5tvLCB0xQuudbf6toyYA0E/acBNw71mvjFTnLaRp50aQaYocMR0a/RMMBIHeZnGyjQ==" }, "fs-constants": { "version": "1.0.0", @@ -1415,9 +1437,9 @@ "dev": true }, "fs-extra": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.0.1.tgz", - "integrity": "sha512-NbdoVMZso2Lsrn/QwLXOy6rm0ufY2zEOKCDzJR/0kBsb0E6qed0P3iYK+Ath3BfvXEeu4JhEtXLgILx5psUfag==", + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", "requires": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", @@ -1618,9 +1640,9 @@ "dev": true }, "has-symbols": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", - "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", "dev": true }, "has-unicode": { @@ -1919,9 +1941,9 @@ } }, "jszip": { - "version": "3.7.1", - "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.7.1.tgz", - "integrity": "sha512-ghL0tz1XG9ZEmRMcEN2vt7xabrDdqHHeykgARpmZ0BiIctWxM47Vt63ZO2dnp4QYt/xJVLLy5Zv1l/xRdh2byg==", + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.9.1.tgz", + "integrity": "sha512-H9A60xPqJ1CuC4Ka6qxzXZeU8aNmgOeP5IFqwJbQQwtu2EUYxota3LdsiZWplF7Wgd9tkAd0mdu36nceSaPuYw==", "dev": true, "requires": { "lie": "~3.3.0", @@ -1931,9 +1953,9 @@ } }, "keytar": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/keytar/-/keytar-7.8.0.tgz", - "integrity": "sha512-mR+BqtAOIW8j+T5FtLVyckCbvROWQD+4FzPeFMuk5njEZkXLpVPCGF26Y3mTyxMAAL1XCfswR7S6kIf+THSRFA==", + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/keytar/-/keytar-7.9.0.tgz", + "integrity": "sha512-VPD8mtVtm5JNtA2AErl6Chp06JBfy7diFQ7TQQhdpWOl6MrCRB+eRbvAZUsbGQS9kiMq0coJsy0W0vHpDCkWsQ==", "dev": true, "requires": { "node-addon-api": "^4.3.0", @@ -1941,11 +1963,12 @@ } }, "keyv": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.1.1.tgz", - "integrity": "sha512-tGv1yP6snQVDSM4X6yxrv2zzq/EvpW+oYiUz6aueW1u9CtS8RzUQYxxmFwgZlO2jSgCxQbchhxaqXXp2hnKGpQ==", + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.2.2.tgz", + "integrity": "sha512-uYS0vKTlBIjNCAUqrjlxmruxOEiZxZIHXyp32sdcGmP+ukFrmWUnE//RcPXJH3Vxrni1H2gsQbjHE0bH7MtMQQ==", "dev": true, "requires": { + "compress-brotli": "^1.3.6", "json-buffer": "3.0.1" } }, @@ -2025,7 +2048,6 @@ "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, "requires": { "yallist": "^4.0.0" } @@ -2124,6 +2146,15 @@ "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", "dev": true }, + "mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dev": true, + "requires": { + "minimist": "^1.2.6" + } + }, "mkdirp-classic": { "version": "0.5.3", "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", @@ -2186,9 +2217,9 @@ } }, "monaco-page-objects": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/monaco-page-objects/-/monaco-page-objects-1.9.1.tgz", - "integrity": "sha512-Sct5tMld91KRZFOJLmlqBfnK/F5jBBdAqMwioiGrTsATrWIJDCkrU6MVq4gdMmOMQxVGAXt1LwgfD6AzJWarrQ==", + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/monaco-page-objects/-/monaco-page-objects-1.9.2.tgz", + "integrity": "sha512-1/JHv0ZwGnoWfq23IyP5PVLRq8NC0YXIoP6jG02R5Ev73hDznwJ3xTEVMzzpRPRGfMyVK4JNaA1aqax82jzaQA==", "dev": true, "requires": { "clipboardy": "^2.3.0", @@ -2235,9 +2266,9 @@ "dev": true }, "node-abi": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.8.0.tgz", - "integrity": "sha512-tzua9qWWi7iW4I42vUPKM+SfaF0vQSLAm4yO5J83mSwB7GeoWrDKC/K+8YCnYNwqP5duwazbw2X9l4m8SC2cUw==", + "version": "3.15.0", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.15.0.tgz", + "integrity": "sha512-Ic6z/j6I9RLm4ov7npo1I48UQr2BEyFCqh6p7S1dhEx9jPO0GPGq/e2Rb7x7DroQrmiVMz/Bw1vJm9sPAl2nxA==", "dev": true, "requires": { "semver": "^7.3.5" @@ -2508,9 +2539,9 @@ } }, "prebuild-install": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.0.1.tgz", - "integrity": "sha512-QBSab31WqkyxpnMWQxubYAHR5S9B2+r81ucocew34Fkl98FhvKIF50jIJnNOBmAZfyNV7vE5T6gd3hTVWgY6tg==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.0.tgz", + "integrity": "sha512-CNcMgI1xBypOyGqjp3wOc8AAo1nMhZS3Cwd3iHIxOdAUbb+YxdNuM4Z5iIrZ8RLvOsf3F3bl7b7xGq6DjQoNYA==", "dev": true, "requires": { "detect-libc": "^2.0.0", @@ -2539,12 +2570,6 @@ "readable-stream": "^3.4.0" } }, - "chownr": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", - "dev": true - }, "readable-stream": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", @@ -2829,18 +2854,11 @@ } }, "semver": { - "version": "7.3.6", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.6.tgz", - "integrity": "sha512-HZWqcgwLsjaX1HBD31msI/rXktuIhS+lWvdE4kN9z+8IVT4Itc7vqU2WvYsyD6/sjYCt4dEKH/m1M3dwI9CC5w==", + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", + "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", "requires": { - "lru-cache": "^7.4.0" - }, - "dependencies": { - "lru-cache": { - "version": "7.8.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.8.1.tgz", - "integrity": "sha512-E1v547OCgJvbvevfjgK9sNKIVXO96NnsTsFPBlg4ZxjhsJSODoH9lk8Bm0OxvHNm6Vm5Yqkl/1fErDxhYL8Skg==" - } + "lru-cache": "^6.0.0" } }, "serialize-javascript": { @@ -3043,21 +3061,6 @@ "tar-stream": "^1.1.2" }, "dependencies": { - "chownr": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", - "dev": true - }, - "mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "dev": true, - "requires": { - "minimist": "^1.2.5" - } - }, "pump": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/pump/-/pump-1.0.3.tgz", @@ -3095,11 +3098,11 @@ } }, "tas-client": { - "version": "0.1.30", - "resolved": "https://registry.npmjs.org/tas-client/-/tas-client-0.1.30.tgz", - "integrity": "sha512-4JINL2r0m7UWU8nIsfWI97SPxjnqz6nk0JtS5ajL5SCksPK8Yjx9yik4DbwwbsbXLJu9C2jasEKnDY40UxEh1g==", + "version": "0.1.45", + "resolved": "https://registry.npmjs.org/tas-client/-/tas-client-0.1.45.tgz", + "integrity": "sha512-IG9UmCpDbDPK23UByQ27rLybkRZYEx2eC9EkieXdwPKKjZPD2zPwfQmyGnZrZet4FUt3yj0ytkwz+liR9Nz/nA==", "requires": { - "axios": "^0.25.0" + "axios": "^0.26.1" } }, "terser": { @@ -3180,9 +3183,9 @@ "dev": true }, "ts-loader": { - "version": "9.2.8", - "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.2.8.tgz", - "integrity": "sha512-gxSak7IHUuRtwKf3FIPSW1VpZcqF9+MBrHOvBp9cjHh+525SjtCIJKVGjRKIAfxBwDGDGCFF00rTfzB1quxdSw==", + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.3.0.tgz", + "integrity": "sha512-2kLLAdAD+FCKijvGKi9sS0OzoqxLCF3CxHpok7rVgCZ5UldRzH0TkbwG9XECKjBzHsAewntC5oDaI/FwKzEUog==", "dev": true, "requires": { "chalk": "^4.1.0", @@ -3346,9 +3349,9 @@ } }, "typescript": { - "version": "4.6.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.6.3.tgz", - "integrity": "sha512-yNIatDa5iaofVozS/uQJEl3JRWLKKGJKh6Yaiv0GLGSuhpFJe7P3SbHZ8/yjAHRQwKRoA6YZqlfjXWmVzoVSMw==", + "version": "4.6.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.6.4.tgz", + "integrity": "sha512-9ia/jWHIEbo49HfjrLGfKbZSuWo9iTMwXO+Ca3pRsSpbsMbc7/IU8NKdCZVRRBafVPGnoJeFL76ZOAA84I9fEg==", "dev": true }, "uc.micro": { @@ -3358,9 +3361,9 @@ "dev": true }, "underscore": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.2.tgz", - "integrity": "sha512-ekY1NhRzq0B08g4bGuX4wd2jZx5GnKz6mKSqFL4nqBlfyMGiG10gDFhDTMEfYmDL6Jy0FUIZp7wiRB+0BP7J2g==", + "version": "1.13.3", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.3.tgz", + "integrity": "sha512-QvjkYpiD+dJJraRA8+dGAU4i7aBbb2s0S3jA45TFOvg2VgqvdCDd/3N6CqA8gluk1W91GLoXg5enMUx560QzuA==", "dev": true }, "universalify": { @@ -3376,17 +3379,6 @@ "requires": { "binary": "^0.3.0", "mkdirp": "^0.5.1" - }, - "dependencies": { - "mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "dev": true, - "requires": { - "minimist": "^1.2.5" - } - } } }, "unzipper": { @@ -3440,9 +3432,9 @@ "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" }, "vsce": { - "version": "2.6.7", - "resolved": "https://registry.npmjs.org/vsce/-/vsce-2.6.7.tgz", - "integrity": "sha512-5dEtdi/yzWQbOU7JDUSOs8lmSzzkewBR5P122BUkmXE6A/DEdFsKNsg2773NGXJTwwF1MfsOgUR6QVF3cLLJNQ==", + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/vsce/-/vsce-2.7.0.tgz", + "integrity": "sha512-CKU34wrQlbKDeJCRBkd1a8iwF9EvNxcYMg9hAUH6AxFGR6Wo2IKWwt3cJIcusHxx6XdjDHWlfAS/fJN30uvVnA==", "dev": true, "requires": { "azure-devops-node-api": "^11.0.1", @@ -3556,9 +3548,9 @@ } }, "vscode-extension-tester": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/vscode-extension-tester/-/vscode-extension-tester-4.2.4.tgz", - "integrity": "sha512-4BT9bf7fs7lE97z8XtzT+wfawIOaYwC5D64u4WbnlzxfV9YQoPEqd76g+MjD27YgjsZWItAC3fhNOip9ry2dSg==", + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/vscode-extension-tester/-/vscode-extension-tester-4.2.5.tgz", + "integrity": "sha512-Igl3hnnLOtcC7vBJyMui5G+Vt6OiWtoomtqdD1oD+7bZFsF9OqBqDE9tD2K1mTYI4tlRFEBgC7jRi2h29bRNfg==", "dev": true, "requires": { "@types/selenium-webdriver": "^3.0.15", @@ -3587,17 +3579,20 @@ } }, "vscode-extension-tester-locators": { - "version": "1.62.1", - "resolved": "https://registry.npmjs.org/vscode-extension-tester-locators/-/vscode-extension-tester-locators-1.62.1.tgz", - "integrity": "sha512-EHlQO8LDz+bvNdbyNS+K2nL2O0Wt6uMt8ZiRD15vASLQHONfmbQcFT7Zc+sHRa7Ylx0Q1HIv6iYScPAuKm7Eeg==", - "dev": true + "version": "1.62.2", + "resolved": "https://registry.npmjs.org/vscode-extension-tester-locators/-/vscode-extension-tester-locators-1.62.2.tgz", + "integrity": "sha512-XzN0Tus5ct2aQKY/KpQbRz/M4+0isKC5/5SvS+6djLphBj3pZqvwduOdp6Gb6ATHt3AkwGn+Yau3X6mwgNJGlg==", + "dev": true, + "requires": { + "vscode-extension-tester-locators": "^1.62.1" + } }, "vscode-tas-client": { - "version": "0.1.31", - "resolved": "https://registry.npmjs.org/vscode-tas-client/-/vscode-tas-client-0.1.31.tgz", - "integrity": "sha512-GbvRil0TFdWtG0hvROi/haZkuKNkC/aVjhXWNCKBnS5VwpKtTRnt+o9M5FSETkW7dhfDTK/Jmv53372WtLnVSA==", + "version": "0.1.47", + "resolved": "https://registry.npmjs.org/vscode-tas-client/-/vscode-tas-client-0.1.47.tgz", + "integrity": "sha512-SlEPDi+0gwxor4ANzBtXwqROPQdQkClHeVJgnkvdDF5Xnl407htCsabTPAq4Di8muObORtLchqQS/k1ocaGDEg==", "requires": { - "tas-client": "0.1.30" + "tas-client": "0.1.45" } }, "vscode-test": { @@ -3778,12 +3773,12 @@ } }, "wide-align": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", - "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", + "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", "dev": true, "requires": { - "string-width": "^1.0.2 || 2" + "string-width": "^1.0.2 || 2 || 3 || 4" } }, "wildcard": { @@ -3880,8 +3875,7 @@ "yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" }, "yargs": { "version": "16.2.0", diff --git a/package.json b/package.json index f4923784..a9915a80 100644 --- a/package.json +++ b/package.json @@ -642,31 +642,31 @@ "devDependencies": { "@types/fs-extra": "^9.0.13", "@types/glob": "^7.2.0", - "@types/lodash": "^4.14.181", + "@types/lodash": "^4.14.182", "@types/minimatch": "^3.0.3", - "@types/mocha": "^9.1.0", - "@types/node": "^14.18.12", + "@types/mocha": "^9.1.1", + "@types/node": "^14.18.16", "@types/semver": "^7.3.9", "@types/vscode": "1.63.0", "copy-webpack-plugin": "^9.1.0", "glob": "^7.2.0", "mocha": "^9.2.2", - "ts-loader": "^9.2.8", + "ts-loader": "^9.3.0", "tslint": "^6.1.3", - "typescript": "^4.6.3", - "vscode-extension-tester": "^4.2.4", + "typescript": "^4.6.4", + "vscode-extension-tester": "^4.2.5", "vscode-test": "^1.6.1", "webpack": "^5.72.0", "webpack-cli": "^4.9.2" }, "dependencies": { - "await-lock": "^2.1.0", - "fs-extra": "^10.0.1", + "await-lock": "^2.2.2", + "fs-extra": "^10.1.0", "globby": "^11.1.0", "lodash": "^4.17.21", "minimatch": "^3.1.2", - "semver": "^7.3.6", + "semver": "^7.3.7", "vscode-extension-telemetry-wrapper": "^0.12.0", - "vscode-tas-client": "^0.1.31" + "vscode-tas-client": "^0.1.47" } } From dbf472b435347622d5f577d9729fd2c23573b0e8 Mon Sep 17 00:00:00 2001 From: Sheng Chen Date: Thu, 5 May 2022 10:51:08 +0800 Subject: [PATCH 084/352] chore: Update gson in test projects (#612) Signed-off-by: sheche --- test/java9/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/java9/pom.xml b/test/java9/pom.xml index 97e73aa6..af1012dc 100644 --- a/test/java9/pom.xml +++ b/test/java9/pom.xml @@ -17,7 +17,7 @@ com.google.code.gson gson - 2.7 + 2.8.9 From 664accc075eb2d1cae3710494be34d615375cee8 Mon Sep 17 00:00:00 2001 From: "microsoft-github-policy-service[bot]" <77245923+microsoft-github-policy-service[bot]@users.noreply.github.com> Date: Mon, 23 May 2022 18:26:14 -0700 Subject: [PATCH 085/352] chore: Add Microsoft SECURITY.MD (#616) Co-authored-by: microsoft-github-policy-service[bot] <77245923+microsoft-github-policy-service[bot]@users.noreply.github.com> --- SECURITY.md | 41 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100644 SECURITY.md diff --git a/SECURITY.md b/SECURITY.md new file mode 100644 index 00000000..869fdfe2 --- /dev/null +++ b/SECURITY.md @@ -0,0 +1,41 @@ + + +## Security + +Microsoft takes the security of our software products and services seriously, which includes all source code repositories managed through our GitHub organizations, which include [Microsoft](https://github.com/Microsoft), [Azure](https://github.com/Azure), [DotNet](https://github.com/dotnet), [AspNet](https://github.com/aspnet), [Xamarin](https://github.com/xamarin), and [our GitHub organizations](https://opensource.microsoft.com/). + +If you believe you have found a security vulnerability in any Microsoft-owned repository that meets [Microsoft's definition of a security vulnerability](https://aka.ms/opensource/security/definition), please report it to us as described below. + +## Reporting Security Issues + +**Please do not report security vulnerabilities through public GitHub issues.** + +Instead, please report them to the Microsoft Security Response Center (MSRC) at [https://msrc.microsoft.com/create-report](https://aka.ms/opensource/security/create-report). + +If you prefer to submit without logging in, send email to [secure@microsoft.com](mailto:secure@microsoft.com). If possible, encrypt your message with our PGP key; please download it from the [Microsoft Security Response Center PGP Key page](https://aka.ms/opensource/security/pgpkey). + +You should receive a response within 24 hours. If for some reason you do not, please follow up via email to ensure we received your original message. Additional information can be found at [microsoft.com/msrc](https://aka.ms/opensource/security/msrc). + +Please include the requested information listed below (as much as you can provide) to help us better understand the nature and scope of the possible issue: + + * Type of issue (e.g. buffer overflow, SQL injection, cross-site scripting, etc.) + * Full paths of source file(s) related to the manifestation of the issue + * The location of the affected source code (tag/branch/commit or direct URL) + * Any special configuration required to reproduce the issue + * Step-by-step instructions to reproduce the issue + * Proof-of-concept or exploit code (if possible) + * Impact of the issue, including how an attacker might exploit the issue + +This information will help us triage your report more quickly. + +If you are reporting for a bug bounty, more complete reports can contribute to a higher bounty award. Please visit our [Microsoft Bug Bounty Program](https://aka.ms/opensource/security/bounty) page for more details about our active programs. + +## Preferred Languages + +We prefer all communications to be in English. + +## Policy + +Microsoft follows the principle of [Coordinated Vulnerability Disclosure](https://aka.ms/opensource/security/cvd). + + From 3383a0cdd335dc7432868048e9b9598f5dc0f6f4 Mon Sep 17 00:00:00 2001 From: Sheng Chen Date: Mon, 6 Jun 2022 13:57:05 +0800 Subject: [PATCH 086/352] chore: Update dependencies (#621) Signed-off-by: sheche --- package-lock.json | 208 +++++++++++++++++++++++++++++++--------------- package.json | 8 +- 2 files changed, 147 insertions(+), 69 deletions(-) diff --git a/package-lock.json b/package-lock.json index 80c61285..1ff01da5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -94,6 +94,55 @@ "integrity": "sha512-ws57AidsDvREKrZKYffXddNkyaF14iHNHm8VQnZH6t99E8gczjNN0GpvcGny0imC80yQ0tHz1xVUKk/KFQSUyA==", "dev": true }, + "@jridgewell/gen-mapping": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.1.tgz", + "integrity": "sha512-GcHwniMlA2z+WFPWuY8lp3fsza0I8xPFMWL5+n8LYyP6PSvPrXf4+n8stDHZY2DM0zy9sVkRDy1jDI4XGzYVqg==", + "dev": true, + "requires": { + "@jridgewell/set-array": "^1.0.0", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "@jridgewell/resolve-uri": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.0.7.tgz", + "integrity": "sha512-8cXDaBBHOr2pQ7j77Y6Vp5VDT2sIqWyWQ56TjEq4ih/a4iST3dItRe8Q9fp0rrIl9DoKhWQtUQz/YpOxLkXbNA==", + "dev": true + }, + "@jridgewell/set-array": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.1.tgz", + "integrity": "sha512-Ct5MqZkLGEXTVmQYbGtx9SVqD2fqwvdubdps5D3djjAkgkKwT918VNOz65pEHFaYTeWcukmJmH5SwsA9Tn2ObQ==", + "dev": true + }, + "@jridgewell/source-map": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.2.tgz", + "integrity": "sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw==", + "dev": true, + "requires": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "@jridgewell/sourcemap-codec": { + "version": "1.4.13", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.13.tgz", + "integrity": "sha512-GryiOJmNcWbovBxTfZSF71V/mXbgcV3MewDe3kIMCLyIh5e7SKAeUZs+rMnJ8jkMolZ/4/VsdBmMrw3l+VdZ3w==", + "dev": true + }, + "@jridgewell/trace-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.13.tgz", + "integrity": "sha512-o1xbKhp9qnIAoHJSWd6KlCZfqslL4valSF81H8ImioOAxluWYWOpWkpyktY2vnt4tbrX9XYaxovq6cgowaJp2w==", + "dev": true, + "requires": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, "@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -151,9 +200,9 @@ } }, "@types/eslint": { - "version": "8.4.1", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.4.1.tgz", - "integrity": "sha512-GE44+DNEyxxh2Kc6ro/VkIj+9ma0pO0bwv9+uHSyBrikYOHr8zYcdPvnBOp1aw8s+CjRvuSx7CyWqRrNFQ59mA==", + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.4.2.tgz", + "integrity": "sha512-Z1nseZON+GEnFjJc04sv4NSALGjhFwy6K0HXt7qsn5ArfAKtb63dXNJHf+1YW6IpOIYRBGUbu3GwJdj8DGnCjA==", "dev": true, "requires": { "@types/estree": "*", @@ -241,9 +290,9 @@ "dev": true }, "@types/node": { - "version": "14.18.16", - "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.16.tgz", - "integrity": "sha512-X3bUMdK/VmvrWdoTkz+VCn6nwKwrKCFTHtqwBIaQJNx4RUIBBUFXM00bqPz/DsDd+Icjmzm6/tyYZzeGVqb6/Q==", + "version": "14.18.20", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.20.tgz", + "integrity": "sha512-Q8KKwm9YqEmUBRsqJ2GWJDtXltBDxTdC4m5vTdXBolu2PeQh8LX+f6BTwU+OuXPu37fLxoN6gidqBmnky36FXA==", "dev": true }, "@types/responselike": { @@ -464,9 +513,9 @@ "dev": true }, "acorn": { - "version": "8.7.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.0.tgz", - "integrity": "sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ==", + "version": "8.7.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.1.tgz", + "integrity": "sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A==", "dev": true }, "acorn-import-assertions": { @@ -663,15 +712,15 @@ "dev": true }, "browserslist": { - "version": "4.20.2", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.20.2.tgz", - "integrity": "sha512-CQOBCqp/9pDvDbx3xfMi+86pr4KXIf2FDkTTdeuYw8OxS9t898LA1Khq57gtufFILXpfgsSx5woNgsBgvGjpsA==", + "version": "4.20.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.20.3.tgz", + "integrity": "sha512-NBhymBQl1zM0Y5dQT/O+xiLP9/rzOIQdKM/eMJBAq7yBgaB6krIYLGejrwVYnSHZdqjscB1SPuAjHwxjvN6Wdg==", "dev": true, "requires": { - "caniuse-lite": "^1.0.30001317", - "electron-to-chromium": "^1.4.84", + "caniuse-lite": "^1.0.30001332", + "electron-to-chromium": "^1.4.118", "escalade": "^3.1.1", - "node-releases": "^2.0.2", + "node-releases": "^2.0.3", "picocolors": "^1.0.0" } }, @@ -775,9 +824,9 @@ "dev": true }, "caniuse-lite": { - "version": "1.0.30001327", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001327.tgz", - "integrity": "sha512-1/Cg4jlD9qjZzhbzkzEaAC2JHsP0WrOc8Rd/3a3LuajGzGWR/hD7TVyvq99VqmTy99eVh8Zkmdq213OgvgXx7w==", + "version": "1.0.30001346", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001346.tgz", + "integrity": "sha512-q6ibZUO2t88QCIPayP/euuDREq+aMAxFE5S70PkrLh0iTDj/zEhgvJRKC2+CvXY6EWc6oQwUR48lL5vCW6jiXQ==", "dev": true }, "chainsaw": { @@ -1207,9 +1256,9 @@ } }, "electron-to-chromium": { - "version": "1.4.106", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.106.tgz", - "integrity": "sha512-ZYfpVLULm67K7CaaGP7DmjyeMY4naxsbTy+syVVxT6QHI1Ww8XbJjmr9fDckrhq44WzCrcC5kH3zGpdusxwwqg==", + "version": "1.4.146", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.146.tgz", + "integrity": "sha512-4eWebzDLd+hYLm4csbyMU2EbBnqhwl8Oe9eF/7CBDPWcRxFmqzx4izxvHH+lofQxzieg8UbB8ZuzNTxeukzfTg==", "dev": true }, "emoji-regex": { @@ -1449,7 +1498,7 @@ "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", "dev": true }, "fsevents": { @@ -1546,15 +1595,15 @@ "dev": true }, "glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "dev": true, "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", - "minimatch": "^3.0.4", + "minimatch": "^3.1.1", "once": "^1.3.0", "path-is-absolute": "^1.0.0" } @@ -1757,7 +1806,7 @@ "inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", "dev": true, "requires": { "once": "^1.3.0", @@ -1919,10 +1968,10 @@ "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", "dev": true }, - "json-parse-better-errors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", - "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", "dev": true }, "json-schema-traverse": { @@ -2009,9 +2058,9 @@ "dev": true }, "loader-runner": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.2.0.tgz", - "integrity": "sha512-92+huvxMvYlMzMt0iIOukcwYBFpkYJdpl2xsZ7LrlayO7E8SOv+JJUEK17B/dJIHAOLMfh2dZZ/Y18WgmGtYNw==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", + "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", "dev": true }, "locate-path": { @@ -2199,6 +2248,31 @@ "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", "dev": true }, + "glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "dev": true, + "requires": { + "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" + }, + "dependencies": { + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + } + } + }, "minimatch": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-4.2.1.tgz", @@ -2281,9 +2355,9 @@ "dev": true }, "node-releases": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.2.tgz", - "integrity": "sha512-XxYDdcQ6eKqp/YjI+tb2C5WM2LgjnZrfYg4vgQt49EK268b6gYCHsBLrK2qvJo4FmCtqmKezb0WZFK4fkrZNsg==", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.5.tgz", + "integrity": "sha512-U9h1NLROZTq9uE1SNffn6WuPDg8icmi3ns4rEl/oTfIle4iLjTliCzgTsbaIFMq/Xn078/lfY/BL0GWZ+psK4Q==", "dev": true }, "normalize-path": { @@ -2453,7 +2527,7 @@ "path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", "dev": true }, "path-key": { @@ -3106,35 +3180,27 @@ } }, "terser": { - "version": "5.12.1", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.12.1.tgz", - "integrity": "sha512-NXbs+7nisos5E+yXwAD+y7zrcTkMqb0dEJxIGtSKPdCBzopf7ni4odPul2aechpV7EXNvOudYOX2bb5tln1jbQ==", + "version": "5.14.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.14.0.tgz", + "integrity": "sha512-JC6qfIEkPBd9j1SMO3Pfn+A6w2kQV54tv+ABQLgZr7dA3k/DL/OBoYSWxzVpZev3J+bUHXfr55L8Mox7AaNo6g==", "dev": true, "requires": { + "@jridgewell/source-map": "^0.3.2", "acorn": "^8.5.0", "commander": "^2.20.0", - "source-map": "~0.7.2", "source-map-support": "~0.5.20" - }, - "dependencies": { - "source-map": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", - "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", - "dev": true - } } }, "terser-webpack-plugin": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.1.tgz", - "integrity": "sha512-GvlZdT6wPQKbDNW/GDQzZFg/j4vKU96yl2q6mcUkzKOgW4gwf1Z8cZToUCrz31XHlPWH8MVb1r2tFtdDtTGJ7g==", + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.3.tgz", + "integrity": "sha512-Fx60G5HNYknNTNQnzQ1VePRuu89ZVYWfjRAeT5rITuCY/1b08s49e5kSQwHDirKZWuoKOBRFS98EUUoZ9kLEwQ==", "dev": true, "requires": { + "@jridgewell/trace-mapping": "^0.3.7", "jest-worker": "^27.4.5", "schema-utils": "^3.1.1", "serialize-javascript": "^6.0.0", - "source-map": "^0.6.1", "terser": "^5.7.2" } }, @@ -3349,9 +3415,9 @@ } }, "typescript": { - "version": "4.6.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.6.4.tgz", - "integrity": "sha512-9ia/jWHIEbo49HfjrLGfKbZSuWo9iTMwXO+Ca3pRsSpbsMbc7/IU8NKdCZVRRBafVPGnoJeFL76ZOAA84I9fEg==", + "version": "4.7.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.7.3.tgz", + "integrity": "sha512-WOkT3XYvrpXx4vMMqlD+8R8R37fZkjyLGlxavMc4iB8lrl8L0DeTcHbYgw/v0N/z9wAFsgBhcsF0ruoySS22mA==", "dev": true }, "uc.micro": { @@ -3608,9 +3674,9 @@ } }, "watchpack": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.3.1.tgz", - "integrity": "sha512-x0t0JuydIo8qCNctdDrn1OzH/qDzk2+rdCOC3YzumZ42fiMqmQ7T3xQurykYMhYfHaPHTp4ZxAx2NfUo1K6QaA==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", + "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", "dev": true, "requires": { "glob-to-regexp": "^0.4.1", @@ -3618,9 +3684,9 @@ } }, "webpack": { - "version": "5.72.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.72.0.tgz", - "integrity": "sha512-qmSmbspI0Qo5ld49htys8GY9XhS9CGqFoHTsOVAnjBdg0Zn79y135R+k4IR4rKK6+eKaabMhJwiVB7xw0SJu5w==", + "version": "5.73.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.73.0.tgz", + "integrity": "sha512-svjudQRPPa0YiOYa2lM/Gacw0r6PvxptHj4FuEKQ2kX05ZLkjbVc5MnPs6its5j7IZljnIqSVo/OsY2X0IpHGA==", "dev": true, "requires": { "@types/eslint-scope": "^3.7.3", @@ -3632,13 +3698,13 @@ "acorn-import-assertions": "^1.7.6", "browserslist": "^4.14.5", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.9.2", + "enhanced-resolve": "^5.9.3", "es-module-lexer": "^0.9.0", "eslint-scope": "5.1.1", "events": "^3.2.0", "glob-to-regexp": "^0.4.1", "graceful-fs": "^4.2.9", - "json-parse-better-errors": "^1.0.2", + "json-parse-even-better-errors": "^2.3.1", "loader-runner": "^4.2.0", "mime-types": "^2.1.27", "neo-async": "^2.6.2", @@ -3647,6 +3713,18 @@ "terser-webpack-plugin": "^5.1.3", "watchpack": "^2.3.1", "webpack-sources": "^3.2.3" + }, + "dependencies": { + "enhanced-resolve": { + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.9.3.tgz", + "integrity": "sha512-Bq9VSor+kjvW3f9/MiiR4eE3XYgOl7/rS8lnSxbRbF3kS0B2r+Y9w5krBWxZgDxASVZbdYrn5wT4j/Wb0J9qow==", + "dev": true, + "requires": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + } + } } }, "webpack-cli": { diff --git a/package.json b/package.json index a9915a80..3b180851 100644 --- a/package.json +++ b/package.json @@ -645,18 +645,18 @@ "@types/lodash": "^4.14.182", "@types/minimatch": "^3.0.3", "@types/mocha": "^9.1.1", - "@types/node": "^14.18.16", + "@types/node": "^14.18.20", "@types/semver": "^7.3.9", "@types/vscode": "1.63.0", "copy-webpack-plugin": "^9.1.0", - "glob": "^7.2.0", + "glob": "^7.2.3", "mocha": "^9.2.2", "ts-loader": "^9.3.0", "tslint": "^6.1.3", - "typescript": "^4.6.4", + "typescript": "^4.7.3", "vscode-extension-tester": "^4.2.5", "vscode-test": "^1.6.1", - "webpack": "^5.72.0", + "webpack": "^5.73.0", "webpack-cli": "^4.9.2" }, "dependencies": { From ac162dac91836aa065e07782a06880e624938004 Mon Sep 17 00:00:00 2001 From: Sheng Chen Date: Tue, 7 Jun 2022 13:36:38 +0800 Subject: [PATCH 087/352] chore: Clean up the metadata files (#622) Signed-off-by: sheche Co-authored-by: Shi Chen <122255951@qq.com> --- .gitignore | 3 ++ jdtls.ext/.project | 28 ----------- .../org.eclipse.core.resources.prefs | 2 - .../.settings/org.eclipse.m2e.core.prefs | 4 -- .../.classpath | 7 --- .../.project | 45 ------------------ .../com.microsoft.jdtls.ext.core/.classpath | 8 ---- .../com.microsoft.jdtls.ext.core/.project | 45 ------------------ test/gradle/.classpath | 7 --- .../.gradle/4.3/fileChanges/last-build.bin | Bin 1 -> 0 bytes .../.gradle/4.3/fileHashes/fileHashes.bin | Bin 18547 -> 0 bytes .../.gradle/4.3/fileHashes/fileHashes.lock | Bin 17 -> 0 bytes test/gradle/.project | 23 --------- .../org.eclipse.buildship.core.prefs | 2 - test/maven/.classpath | 27 ----------- test/maven/.project | 23 --------- .../.settings/org.eclipse.jdt.core.prefs | 5 -- .../.settings/org.eclipse.m2e.core.prefs | 4 -- 18 files changed, 3 insertions(+), 230 deletions(-) delete mode 100644 jdtls.ext/.project delete mode 100644 jdtls.ext/.settings/org.eclipse.core.resources.prefs delete mode 100644 jdtls.ext/.settings/org.eclipse.m2e.core.prefs delete mode 100644 jdtls.ext/com.microsoft.jdtls.ext.activator/.classpath delete mode 100644 jdtls.ext/com.microsoft.jdtls.ext.activator/.project delete mode 100644 jdtls.ext/com.microsoft.jdtls.ext.core/.classpath delete mode 100644 jdtls.ext/com.microsoft.jdtls.ext.core/.project delete mode 100644 test/gradle/.classpath delete mode 100644 test/gradle/.gradle/4.3/fileChanges/last-build.bin delete mode 100644 test/gradle/.gradle/4.3/fileHashes/fileHashes.bin delete mode 100644 test/gradle/.gradle/4.3/fileHashes/fileHashes.lock delete mode 100644 test/gradle/.project delete mode 100644 test/gradle/.settings/org.eclipse.buildship.core.prefs delete mode 100644 test/maven/.classpath delete mode 100644 test/maven/.project delete mode 100644 test/maven/.settings/org.eclipse.jdt.core.prefs delete mode 100644 test/maven/.settings/org.eclipse.m2e.core.prefs diff --git a/.gitignore b/.gitignore index f2f12ec9..3ecbdbef 100644 --- a/.gitignore +++ b/.gitignore @@ -11,5 +11,8 @@ vscode-java-*.vsix packages/ dist **/.settings +**/.classpath +**/.project **/.checkstyle test-resources/ +**/.gradle diff --git a/jdtls.ext/.project b/jdtls.ext/.project deleted file mode 100644 index 74d8a563..00000000 --- a/jdtls.ext/.project +++ /dev/null @@ -1,28 +0,0 @@ - - - parent - - - - - - org.eclipse.m2e.core.maven2Builder - - - - - - org.eclipse.m2e.core.maven2Nature - - - - 1600748815789 - - 30 - - org.eclipse.core.resources.regexFilterMatcher - node_modules|.git|__CREATED_BY_JAVA_LANGUAGE_SERVER__ - - - - diff --git a/jdtls.ext/.settings/org.eclipse.core.resources.prefs b/jdtls.ext/.settings/org.eclipse.core.resources.prefs deleted file mode 100644 index 99f26c02..00000000 --- a/jdtls.ext/.settings/org.eclipse.core.resources.prefs +++ /dev/null @@ -1,2 +0,0 @@ -eclipse.preferences.version=1 -encoding/=UTF-8 diff --git a/jdtls.ext/.settings/org.eclipse.m2e.core.prefs b/jdtls.ext/.settings/org.eclipse.m2e.core.prefs deleted file mode 100644 index f897a7f1..00000000 --- a/jdtls.ext/.settings/org.eclipse.m2e.core.prefs +++ /dev/null @@ -1,4 +0,0 @@ -activeProfiles= -eclipse.preferences.version=1 -resolveWorkspaceProjects=true -version=1 diff --git a/jdtls.ext/com.microsoft.jdtls.ext.activator/.classpath b/jdtls.ext/com.microsoft.jdtls.ext.activator/.classpath deleted file mode 100644 index cf36b561..00000000 --- a/jdtls.ext/com.microsoft.jdtls.ext.activator/.classpath +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/jdtls.ext/com.microsoft.jdtls.ext.activator/.project b/jdtls.ext/com.microsoft.jdtls.ext.activator/.project deleted file mode 100644 index 5d481795..00000000 --- a/jdtls.ext/com.microsoft.jdtls.ext.activator/.project +++ /dev/null @@ -1,45 +0,0 @@ - - - com.microsoft.jdtls.ext.activator - - - - - - org.eclipse.jdt.core.javabuilder - - - - - org.eclipse.pde.ManifestBuilder - - - - - org.eclipse.pde.SchemaBuilder - - - - - org.eclipse.m2e.core.maven2Builder - - - - - - org.eclipse.m2e.core.maven2Nature - org.eclipse.pde.PluginNature - org.eclipse.jdt.core.javanature - - - - 1599551246411 - - 30 - - org.eclipse.core.resources.regexFilterMatcher - node_modules|.git|__CREATED_BY_JAVA_LANGUAGE_SERVER__ - - - - diff --git a/jdtls.ext/com.microsoft.jdtls.ext.core/.classpath b/jdtls.ext/com.microsoft.jdtls.ext.core/.classpath deleted file mode 100644 index 67efab8e..00000000 --- a/jdtls.ext/com.microsoft.jdtls.ext.core/.classpath +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - diff --git a/jdtls.ext/com.microsoft.jdtls.ext.core/.project b/jdtls.ext/com.microsoft.jdtls.ext.core/.project deleted file mode 100644 index eb810c39..00000000 --- a/jdtls.ext/com.microsoft.jdtls.ext.core/.project +++ /dev/null @@ -1,45 +0,0 @@ - - - com.microsoft.jdtls.ext.core - - - - - - org.eclipse.jdt.core.javabuilder - - - - - org.eclipse.pde.ManifestBuilder - - - - - org.eclipse.pde.SchemaBuilder - - - - - org.eclipse.m2e.core.maven2Builder - - - - - - org.eclipse.m2e.core.maven2Nature - org.eclipse.pde.PluginNature - org.eclipse.jdt.core.javanature - - - - 1599551246411 - - 30 - - org.eclipse.core.resources.regexFilterMatcher - node_modules|.git|__CREATED_BY_JAVA_LANGUAGE_SERVER__ - - - - diff --git a/test/gradle/.classpath b/test/gradle/.classpath deleted file mode 100644 index 0b72ca4b..00000000 --- a/test/gradle/.classpath +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/test/gradle/.gradle/4.3/fileChanges/last-build.bin b/test/gradle/.gradle/4.3/fileChanges/last-build.bin deleted file mode 100644 index f76dd238ade08917e6712764a16a22005a50573d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1 IcmZPo000310RR91 diff --git a/test/gradle/.gradle/4.3/fileHashes/fileHashes.bin b/test/gradle/.gradle/4.3/fileHashes/fileHashes.bin deleted file mode 100644 index a79dbf78ddc0f0b87bd678487ac3e99ea0918d72..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18547 zcmeI(F$;k~7y#g7lwwg - - gradle - Project gradle created by Buildship. - - - - - org.eclipse.jdt.core.javabuilder - - - - - org.eclipse.buildship.core.gradleprojectbuilder - - - - - - org.eclipse.jdt.core.javanature - org.eclipse.buildship.core.gradleprojectnature - - diff --git a/test/gradle/.settings/org.eclipse.buildship.core.prefs b/test/gradle/.settings/org.eclipse.buildship.core.prefs deleted file mode 100644 index 3a69942e..00000000 --- a/test/gradle/.settings/org.eclipse.buildship.core.prefs +++ /dev/null @@ -1,2 +0,0 @@ -#Tue May 08 13:17:09 CST 2018 -connection.project.dir= diff --git a/test/maven/.classpath b/test/maven/.classpath deleted file mode 100644 index ebde5200..00000000 --- a/test/maven/.classpath +++ /dev/null @@ -1,27 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/test/maven/.project b/test/maven/.project deleted file mode 100644 index 700a32c7..00000000 --- a/test/maven/.project +++ /dev/null @@ -1,23 +0,0 @@ - - - my-app - - - - - - org.eclipse.jdt.core.javabuilder - - - - - org.eclipse.m2e.core.maven2Builder - - - - - - org.eclipse.jdt.core.javanature - org.eclipse.m2e.core.maven2Nature - - diff --git a/test/maven/.settings/org.eclipse.jdt.core.prefs b/test/maven/.settings/org.eclipse.jdt.core.prefs deleted file mode 100644 index abec6ca3..00000000 --- a/test/maven/.settings/org.eclipse.jdt.core.prefs +++ /dev/null @@ -1,5 +0,0 @@ -eclipse.preferences.version=1 -org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5 -org.eclipse.jdt.core.compiler.compliance=1.5 -org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning -org.eclipse.jdt.core.compiler.source=1.5 diff --git a/test/maven/.settings/org.eclipse.m2e.core.prefs b/test/maven/.settings/org.eclipse.m2e.core.prefs deleted file mode 100644 index f897a7f1..00000000 --- a/test/maven/.settings/org.eclipse.m2e.core.prefs +++ /dev/null @@ -1,4 +0,0 @@ -activeProfiles= -eclipse.preferences.version=1 -resolveWorkspaceProjects=true -version=1 From 51f4969d3a909a65cf62f225928b2ff930762635 Mon Sep 17 00:00:00 2001 From: Sheng Chen Date: Wed, 8 Jun 2022 15:29:54 +0800 Subject: [PATCH 088/352] chore: Update to JDK 17 in CIs (#627) Signed-off-by: sheche --- .github/workflows/linux.yml | 4 ++-- .github/workflows/linuxUI.yml | 4 ++-- .github/workflows/macOS.yml | 4 ++-- .github/workflows/windows.yml | 4 ++-- .github/workflows/windowsUI.yml | 4 ++-- jdtls.ext/pom.xml | 2 +- test/gradle/.vscode/settings.json | 2 +- 7 files changed, 12 insertions(+), 12 deletions(-) diff --git a/.github/workflows/linux.yml b/.github/workflows/linux.yml index 19f2cb79..dbb1c9c8 100644 --- a/.github/workflows/linux.yml +++ b/.github/workflows/linux.yml @@ -21,10 +21,10 @@ jobs: sudo /usr/bin/Xvfb :99 -screen 0 1024x768x24 > /dev/null 2>&1 & sleep 3 - - name: Set up JDK 11 + - name: Set up JDK 17 uses: actions/setup-java@v1 with: - java-version: '11' + java-version: '17' - name: Setup Node.js environment uses: actions/setup-node@v2 diff --git a/.github/workflows/linuxUI.yml b/.github/workflows/linuxUI.yml index addaa264..82a984aa 100644 --- a/.github/workflows/linuxUI.yml +++ b/.github/workflows/linuxUI.yml @@ -21,10 +21,10 @@ jobs: sudo /usr/bin/Xvfb :99 -screen 0 1024x768x24 > /dev/null 2>&1 & sleep 3 - - name: Set up JDK 11 + - name: Set up JDK 17 uses: actions/setup-java@v1 with: - java-version: '11' + java-version: '17' - name: Setup Node.js environment uses: actions/setup-node@v2 diff --git a/.github/workflows/macOS.yml b/.github/workflows/macOS.yml index 4027c4b9..7e71df29 100644 --- a/.github/workflows/macOS.yml +++ b/.github/workflows/macOS.yml @@ -14,10 +14,10 @@ jobs: steps: - uses: actions/checkout@v2 - - name: Set up JDK 11 + - name: Set up JDK 17 uses: actions/setup-java@v1 with: - java-version: '11' + java-version: '17' - name: Setup Node.js environment uses: actions/setup-node@v2 diff --git a/.github/workflows/windows.yml b/.github/workflows/windows.yml index 5fb3d71f..7219aa7e 100644 --- a/.github/workflows/windows.yml +++ b/.github/workflows/windows.yml @@ -14,10 +14,10 @@ jobs: steps: - uses: actions/checkout@v2 - - name: Set up JDK 11 + - name: Set up JDK 17 uses: actions/setup-java@v1 with: - java-version: '11' + java-version: '17' - name: Setup Node.js environment uses: actions/setup-node@v2 diff --git a/.github/workflows/windowsUI.yml b/.github/workflows/windowsUI.yml index 4daef82f..9e779896 100644 --- a/.github/workflows/windowsUI.yml +++ b/.github/workflows/windowsUI.yml @@ -14,10 +14,10 @@ jobs: steps: - uses: actions/checkout@v2 - - name: Set up JDK 11 + - name: Set up JDK 17 uses: actions/setup-java@v1 with: - java-version: '11' + java-version: '17' - name: Setup Node.js environment uses: actions/setup-node@v2 diff --git a/jdtls.ext/pom.xml b/jdtls.ext/pom.xml index 3d90edd3..c0786d0c 100644 --- a/jdtls.ext/pom.xml +++ b/jdtls.ext/pom.xml @@ -9,7 +9,7 @@ Java Project Manager UTF-8 - 1.5.0 + 2.7.2 ${basedir} diff --git a/test/gradle/.vscode/settings.json b/test/gradle/.vscode/settings.json index 7766fde9..2a3242ee 100644 --- a/test/gradle/.vscode/settings.json +++ b/test/gradle/.vscode/settings.json @@ -1,4 +1,4 @@ { "java.server.launchMode": "Standard", - "java.import.gradle.version": "6.8" + "java.import.gradle.version": "7.3" } From 04e8c3d6b0e9d3253c7fc88de45407c42db4bc28 Mon Sep 17 00:00:00 2001 From: Sheng Chen Date: Wed, 8 Jun 2022 16:51:54 +0800 Subject: [PATCH 089/352] fix: Adopt serverReady() API (#624) Signed-off-by: sheche Co-authored-by: Shi Chen <122255951@qq.com> --- src/extension.ts | 24 +++-- .../languageServerApiManager.ts | 90 +++++++------------ src/syncHandler.ts | 5 ++ 3 files changed, 54 insertions(+), 65 deletions(-) diff --git a/src/extension.ts b/src/extension.ts index e4fad0cb..3d867b2d 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -1,15 +1,14 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT license. -import { ExtensionContext, tasks, Uri, workspace } from "vscode"; +import { commands, Extension, ExtensionContext, extensions, tasks, Uri, workspace } from "vscode"; import { dispose as disposeTelemetryWrapper, initializeFromJsonFile, instrumentOperation, sendInfo } from "vscode-extension-telemetry-wrapper"; -import { contextManager } from "../extension.bundle"; -import { Context } from "./constants"; +import { Commands, contextManager } from "../extension.bundle"; +import { Context, ExtensionName } from "./constants"; import { LibraryController } from "./controllers/libraryController"; import { ProjectController } from "./controllers/projectController"; import { init as initExpService } from "./ExperimentationService"; import { ExportJarTaskProvider } from "./exportJarSteps/ExportJarTaskProvider"; -import { languageServerApiManager } from "./languageServerApi/languageServerApiManager"; import { Settings } from "./settings"; import { syncHandler } from "./syncHandler"; import { EventCounter } from "./utility"; @@ -20,7 +19,7 @@ export async function activate(context: ExtensionContext): Promise { await initializeFromJsonFile(context.asAbsolutePath("./package.json"), { firstParty: true }); await initExpService(context); await instrumentOperation("activation", activateExtension)(context); - languageServerApiManager.initializeJavaLanguageServerApi(false); + addExtensionChangeListener(context); // the when clause does not support 'workspaceContains' we used for activation event, // so we manually find the target files and set it to a context value. workspace.findFiles("{*.gradle,*.gradle.kts,pom.xml,.classpath}", undefined, 1).then((uris: Uri[]) => { @@ -32,7 +31,6 @@ export async function activate(context: ExtensionContext): Promise { } async function activateExtension(_operationId: string, context: ExtensionContext): Promise { - context.subscriptions.push(languageServerApiManager); context.subscriptions.push(new ProjectController(context)); Settings.initialize(context); context.subscriptions.push(new LibraryController(context)); @@ -47,3 +45,17 @@ export async function deactivate(): Promise { sendInfo("", EventCounter.dict); await disposeTelemetryWrapper(); } + +function addExtensionChangeListener(context: ExtensionContext): void { + const extension: Extension | undefined = extensions.getExtension(ExtensionName.JAVA_LANGUAGE_SUPPORT); + if (!extension) { + // java language support is not installed or disabled + const extensionChangeListener = extensions.onDidChange(() => { + if (extensions.getExtension(ExtensionName.JAVA_LANGUAGE_SUPPORT)) { + commands.executeCommand(Commands.VIEW_PACKAGE_REFRESH, /* debounce = */false); + extensionChangeListener.dispose(); + } + }); + context.subscriptions.push(extensionChangeListener); + } +} diff --git a/src/languageServerApi/languageServerApiManager.ts b/src/languageServerApi/languageServerApiManager.ts index 3f207848..39c08d65 100644 --- a/src/languageServerApi/languageServerApiManager.ts +++ b/src/languageServerApi/languageServerApiManager.ts @@ -1,7 +1,7 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT license. -import { commands, Disposable, Event, Extension, extensions, Uri } from "vscode"; +import { commands, Event, Extension, extensions, Uri, window } from "vscode"; import { Commands } from "../commands"; import { Context, ExtensionName } from "../constants"; import { contextManager } from "../contextManager"; @@ -9,61 +9,46 @@ import { Settings } from "../settings"; import { syncHandler } from "../syncHandler"; import { LanguageServerMode } from "./LanguageServerMode"; -class LanguageServerApiManager implements Disposable { - /** - * undefined means a legacy version language server - * null means the JDT.LS is not activated - */ - private serverMode: LanguageServerMode | null | undefined = null; +class LanguageServerApiManager { + private extensionApi: any; - private extensionChangeListener: Disposable; + private isReady: boolean = false; public async ready(): Promise { - await this.checkServerMode(); + if (this.isReady) { + return true; + } - if (this.serverMode === null || this.serverMode === LanguageServerMode.LightWeight) { - return false; + if (!this.isApiInitialized()) { + await this.initializeJavaLanguageServerApis(); } - if (this.serverMode === LanguageServerMode.Hybrid) { - await new Promise((resolve: () => void): void => { - extensions.getExtension("redhat.java")!.exports.onDidServerModeChange(resolve); - }); + const serverMode: LanguageServerMode | undefined = this.extensionApi?.serverMode; + if (!serverMode || serverMode === LanguageServerMode.LightWeight) { + return false; } + await this.extensionApi.serverReady(); + this.isReady = true; return true; } - public async initializeJavaLanguageServerApi(forceActivate: boolean = true): Promise { - if (this.isLanguageServerActivated()) { + public async initializeJavaLanguageServerApis(): Promise { + if (this.isApiInitialized()) { return; } - if (!this.extensionChangeListener) { - this.extensionChangeListener = extensions.onDidChange(() => { - if (this.serverMode === null) { - commands.executeCommand(Commands.VIEW_PACKAGE_REFRESH, /* debounce = */false); - } - }); - } - const extension: Extension | undefined = extensions.getExtension(ExtensionName.JAVA_LANGUAGE_SUPPORT); if (extension) { contextManager.setContextValue(Context.LANGUAGE_SUPPORT_INSTALLED, true); - if (!forceActivate) { - return; - } await extension.activate(); const extensionApi: any = extension.exports; if (!extensionApi) { + window.showErrorMessage("Please update 'redhat.java' to the latest version."); return; } - this.serverMode = extensionApi.serverMode; - if (this.serverMode === LanguageServerMode.Standard) { - syncHandler.updateFileWatcher(Settings.autoRefresh()); - } - + this.extensionApi = extensionApi; if (extensionApi.onDidClasspathUpdate) { const onDidClasspathUpdate: Event = extensionApi.onDidClasspathUpdate; contextManager.context.subscriptions.push(onDidClasspathUpdate(() => { @@ -72,20 +57,6 @@ class LanguageServerApiManager implements Disposable { })); } - if (extensionApi.onDidServerModeChange) { - const onDidServerModeChange: Event = extensionApi.onDidServerModeChange; - contextManager.context.subscriptions.push(onDidServerModeChange((mode: LanguageServerMode) => { - if (this.serverMode !== mode) { - if (mode === LanguageServerMode.Hybrid) { - commands.executeCommand(Commands.VIEW_PACKAGE_REFRESH, /* debounce = */false); - } else if (mode === LanguageServerMode.Standard) { - syncHandler.updateFileWatcher(Settings.autoRefresh()); - } - this.serverMode = mode; - } - })); - } - if (extensionApi.onDidProjectsImport) { const onDidProjectsImport: Event = extensionApi.onDidProjectsImport; contextManager.context.subscriptions.push(onDidProjectsImport(() => { @@ -93,21 +64,22 @@ class LanguageServerApiManager implements Disposable { syncHandler.updateFileWatcher(Settings.autoRefresh()); })); } - } - } - public dispose() { - this.extensionChangeListener.dispose(); - } - - private isLanguageServerActivated(): boolean { - return this.serverMode !== null; + if (this.extensionApi?.serverMode === LanguageServerMode.LightWeight) { + if (extensionApi.onDidServerModeChange) { + const onDidServerModeChange: Event = extensionApi.onDidServerModeChange; + contextManager.context.subscriptions.push(onDidServerModeChange((mode: LanguageServerMode) => { + if (mode === LanguageServerMode.Hybrid) { + commands.executeCommand(Commands.VIEW_PACKAGE_REFRESH, /* debounce = */false); + } + })); + } + } + } } - private async checkServerMode(): Promise { - if (!this.isLanguageServerActivated()) { - await this.initializeJavaLanguageServerApi(); - } + private isApiInitialized(): boolean { + return this.extensionApi !== undefined; } } diff --git a/src/syncHandler.ts b/src/syncHandler.ts index dcfe0498..58c9fcf1 100644 --- a/src/syncHandler.ts +++ b/src/syncHandler.ts @@ -6,6 +6,7 @@ import { commands, Disposable, FileSystemWatcher, RelativePattern, Uri, workspac import { instrumentOperation } from "vscode-extension-telemetry-wrapper"; import { Commands } from "./commands"; import { NodeKind } from "./java/nodeData"; +import { languageServerApiManager } from "./languageServerApi/languageServerApiManager"; import { Settings } from "./settings"; import { DataNode } from "./views/dataNode"; import { ExplorerNode } from "./views/explorerNode"; @@ -37,6 +38,10 @@ class SyncHandler implements Disposable { } private async enableAutoRefresh() { + if (!await languageServerApiManager.ready()) { + return; + } + this.disposables.push(workspace.onDidChangeWorkspaceFolders(() => { this.refresh(); })); From e17ef1f3ef632e10d6a93124a99ba2a2ac7b44b7 Mon Sep 17 00:00:00 2001 From: Sheng Chen Date: Thu, 9 Jun 2022 12:35:52 +0800 Subject: [PATCH 090/352] fix: Duplicated tree items show in the explorer (#629) Signed-off-by: sheche --- src/views/dependencyExplorer.ts | 41 ++++++++++++++++++++------------- 1 file changed, 25 insertions(+), 16 deletions(-) diff --git a/src/views/dependencyExplorer.ts b/src/views/dependencyExplorer.ts index 3bfb7f90..c891a261 100644 --- a/src/views/dependencyExplorer.ts +++ b/src/views/dependencyExplorer.ts @@ -1,6 +1,7 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT license. +import AwaitLock from "await-lock"; import * as fse from "fs-extra"; import * as _ from "lodash"; import * as path from "path"; @@ -38,9 +39,12 @@ export class DependencyExplorer implements Disposable { private _dataProvider: DependencyDataProvider; + private _revealLock: AwaitLock; + constructor(public readonly context: ExtensionContext) { this._dataProvider = new DependencyDataProvider(context); this._dependencyViewer = window.createTreeView("javaProjectExplorer", { treeDataProvider: this._dataProvider, showCollapseAll: true }); + this._revealLock = new AwaitLock(); // register reveal events context.subscriptions.push( @@ -141,27 +145,32 @@ export class DependencyExplorer implements Disposable { } public async reveal(uri: Uri, needCheckSyncSetting: boolean = true): Promise { - if (needCheckSyncSetting && !Settings.syncWithFolderExplorer()) { - return; - } + try { + await this._revealLock.acquireAsync(); + if (needCheckSyncSetting && !Settings.syncWithFolderExplorer()) { + return; + } - if (!await Utility.isRevealable(uri)) { - return; - } + if (!await Utility.isRevealable(uri)) { + return; + } - let node: DataNode | undefined = explorerNodeCache.getDataNode(uri); - if (!node) { - const paths: INodeData[] = await Jdtls.resolvePath(uri.toString()); - if (!_.isEmpty(paths)) { - node = await this._dataProvider.revealPaths(paths); + let node: DataNode | undefined = explorerNodeCache.getDataNode(uri); + if (!node) { + const paths: INodeData[] = await Jdtls.resolvePath(uri.toString()); + if (!_.isEmpty(paths)) { + node = await this._dataProvider.revealPaths(paths); + } } - } - if (!node) { - return; - } + if (!node) { + return; + } - await this._dependencyViewer.reveal(node); + await this._dependencyViewer.reveal(node); + } finally { + this._revealLock.release(); + } } public get dataProvider(): DependencyDataProvider { From 5de25ace4bcdf1053f3fd20ea718851358207d29 Mon Sep 17 00:00:00 2001 From: Sheng Chen Date: Thu, 9 Jun 2022 16:29:15 +0800 Subject: [PATCH 091/352] ux: Expose rebuild workspace command (#623) Signed-off-by: sheche --- package.json | 11 ++++++----- package.nls.json | 2 +- package.nls.zh.json | 2 +- src/views/dependencyDataProvider.ts | 2 +- 4 files changed, 9 insertions(+), 8 deletions(-) diff --git a/package.json b/package.json index 3b180851..58b4582c 100644 --- a/package.json +++ b/package.json @@ -77,7 +77,8 @@ }, { "command": "java.project.build.workspace", - "title": "%contributes.commands.java.project.build.workspace%" + "title": "%contributes.commands.java.project.build.workspace%", + "icon": "$(tools)" }, { "command": "java.project.clean.workspace", @@ -398,7 +399,7 @@ "group": "navigation@20" }, { - "command": "java.view.package.refresh", + "command": "java.project.build.workspace", "when": "view == javaProjectExplorer && java:serverMode == Standard && !java:noJavaProjects", "group": "navigation@30" }, @@ -423,14 +424,14 @@ "group": "overflow_10@20" }, { - "command": "java.project.build.workspace", + "command": "java.project.clean.workspace", "when": "view == javaProjectExplorer && java:serverMode == Standard && !java:noJavaProjects", "group": "overflow_20@10" }, { - "command": "java.project.clean.workspace", + "command": "java.view.package.refresh", "when": "view == javaProjectExplorer && java:serverMode == Standard && !java:noJavaProjects", - "group": "overflow_20@20" + "group": "overflow_50@10" } ], "view/item/context": [ diff --git a/package.nls.json b/package.nls.json index 2442157c..9e3a3296 100644 --- a/package.nls.json +++ b/package.nls.json @@ -5,7 +5,7 @@ "contributes.commands.java.project.addLibraryFolders": "Add Library Folders to Project Classpath...", "contributes.commands.java.project.removeLibrary": "Remove from Project Classpath", "contributes.commands.java.view.package.refresh": "Refresh", - "contributes.commands.java.project.build.workspace": "Build Workspace", + "contributes.commands.java.project.build.workspace": "Rebuild Workspace", "contributes.commands.java.project.clean.workspace": "Clean Workspace", "contributes.commands.java.project.update": "Update Project", "contributes.commands.java.view.package.revealInProjectExplorer": "Reveal in Java Project Explorer", diff --git a/package.nls.zh.json b/package.nls.zh.json index 6517258b..f9fa60a5 100644 --- a/package.nls.zh.json +++ b/package.nls.zh.json @@ -5,7 +5,7 @@ "contributes.commands.java.project.addLibraryFolders": "添加文件夹至项目 Classpath...", "contributes.commands.java.project.removeLibrary": "从项目 Classpath 中移除", "contributes.commands.java.view.package.refresh": "刷新", - "contributes.commands.java.project.build.workspace": "构建工作空间", + "contributes.commands.java.project.build.workspace": "重新构建工作空间", "contributes.commands.java.project.clean.workspace": "清理工作空间", "contributes.commands.java.project.update": "更新项目", "contributes.commands.java.view.package.revealInProjectExplorer": "在 Java 项目视图中显示", diff --git a/src/views/dependencyDataProvider.ts b/src/views/dependencyDataProvider.ts index 7901497c..cad8775c 100644 --- a/src/views/dependencyDataProvider.ts +++ b/src/views/dependencyDataProvider.ts @@ -44,7 +44,7 @@ export class DependencyDataProvider implements TreeDataProvider { context.subscriptions.push(instrumentOperationAsVsCodeCommand(Commands.VIEW_PACKAGE_OUTLINE, (uri, range) => window.showTextDocument(Uri.parse(uri), { selection: range }))); context.subscriptions.push(instrumentOperationAsVsCodeCommand(Commands.JAVA_PROJECT_BUILD_WORKSPACE, () => - commands.executeCommand(Commands.JAVA_BUILD_WORKSPACE))); + commands.executeCommand(Commands.JAVA_BUILD_WORKSPACE, true /*fullCompile*/))); context.subscriptions.push(instrumentOperationAsVsCodeCommand(Commands.JAVA_PROJECT_CLEAN_WORKSPACE, () => commands.executeCommand(Commands.JAVA_CLEAN_WORKSPACE))); context.subscriptions.push(instrumentOperationAsVsCodeCommand(Commands.JAVA_PROJECT_UPDATE, async (node: INodeData) => { From 317bd63a9d5bd45f6b0efab45dcef7ce2bcef2c2 Mon Sep 17 00:00:00 2001 From: Sheng Chen Date: Mon, 13 Jun 2022 11:54:51 +0800 Subject: [PATCH 092/352] feat: Support drag and drop to editor (#632) - Primary type nodes and file nodes can drag to editor. - Document symbol nodes can drag to editor with its range. Signed-off-by: sheche --- package-lock.json | 6 ++--- package.json | 4 +-- src/constants.ts | 5 ++++ src/views/DragAndDropController.ts | 40 ++++++++++++++++++++++++++++++ src/views/baseSymbolNode.ts | 4 +-- src/views/dependencyExplorer.ts | 11 +++++++- src/views/documentSymbolNode.ts | 2 +- src/views/symbolNode.ts | 2 +- 8 files changed, 64 insertions(+), 10 deletions(-) create mode 100644 src/views/DragAndDropController.ts diff --git a/package-lock.json b/package-lock.json index 1ff01da5..755cad3a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -317,9 +317,9 @@ "dev": true }, "@types/vscode": { - "version": "1.63.0", - "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.63.0.tgz", - "integrity": "sha512-iePu1axOi5WSThV6l2TYcciBIpAlMarjBC8H0y8L8ocsZLxh7MttzwFU3pjoItF5fRVGxHS0Hsvje9jO3yJsfw==", + "version": "1.66.0", + "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.66.0.tgz", + "integrity": "sha512-ZfJck4M7nrGasfs4A4YbUoxis3Vu24cETw3DERsNYtDZmYSYtk6ljKexKFKhImO/ZmY6ZMsmegu2FPkXoUFImA==", "dev": true }, "@ungap/promise-all-settled": { diff --git a/package.json b/package.json index 58b4582c..cd2a512a 100644 --- a/package.json +++ b/package.json @@ -12,7 +12,7 @@ "explorer" ], "engines": { - "vscode": "^1.63.0" + "vscode": "^1.66.0" }, "repository": { "type": "git", @@ -648,7 +648,7 @@ "@types/mocha": "^9.1.1", "@types/node": "^14.18.20", "@types/semver": "^7.3.9", - "@types/vscode": "1.63.0", + "@types/vscode": "1.66.0", "copy-webpack-plugin": "^9.1.0", "glob": "^7.2.3", "mocha": "^9.2.2", diff --git a/src/constants.ts b/src/constants.ts index e71cad32..45ac1443 100644 --- a/src/constants.ts +++ b/src/constants.ts @@ -20,6 +20,11 @@ export namespace Explorer { Type = "type", Folder = "folder", } + + export enum Mime { + JavaProjectExplorer = "application/vnd.code.tree.javaProjectExplorer", + TextUriList = "text/uri-list", + } } export namespace ExtensionName { diff --git a/src/views/DragAndDropController.ts b/src/views/DragAndDropController.ts new file mode 100644 index 00000000..8a630ebc --- /dev/null +++ b/src/views/DragAndDropController.ts @@ -0,0 +1,40 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT license. + +import { DataTransfer, DataTransferItem, TreeDragAndDropController } from "vscode"; +import { Explorer } from "../constants"; +import { BaseSymbolNode } from "./baseSymbolNode"; +import { DataNode } from "./dataNode"; +import { ExplorerNode } from "./explorerNode"; +import { FileNode } from "./fileNode"; +import { PrimaryTypeNode } from "./PrimaryTypeNode"; + +export class DragAndDropController implements TreeDragAndDropController { + + dropMimeTypes: string[] = [ + Explorer.Mime.JavaProjectExplorer, + ]; + dragMimeTypes: string[] = [ + Explorer.Mime.TextUriList, + ];; + + public handleDrag(source: ExplorerNode[], treeDataTransfer: DataTransfer): void { + // select many is not supported yet + let dragItem = source[0]; + this.addDragToEditorDataTransfer(dragItem, treeDataTransfer); + } + + private addDragToEditorDataTransfer(node: ExplorerNode, treeDataTransfer: DataTransfer) { + if ((node instanceof PrimaryTypeNode || node instanceof FileNode) && (node as DataNode).uri) { + treeDataTransfer.set(Explorer.Mime.TextUriList, new DataTransferItem((node as DataNode).uri)); + } else if ((node instanceof BaseSymbolNode)) { + const parent = (node.getParent() as PrimaryTypeNode); + if (parent.uri) { + const range = (node as BaseSymbolNode).range; + const fragment = `#L${range.start.line + 1},${range.start.character + 1}`; + const uri = parent.uri + fragment; + treeDataTransfer.set(Explorer.Mime.TextUriList, new DataTransferItem(uri)); + } + } + } +} diff --git a/src/views/baseSymbolNode.ts b/src/views/baseSymbolNode.ts index 8ee30451..e34b4fce 100644 --- a/src/views/baseSymbolNode.ts +++ b/src/views/baseSymbolNode.ts @@ -27,6 +27,8 @@ export abstract class BaseSymbolNode extends ExplorerNode { super(parent); } + public abstract get range(): Range; + protected get iconPath(): ThemeIcon { if (BaseSymbolNode._iconMap.has(this.symbolInfo.kind)) { const symbolKind = BaseSymbolNode._iconMap.get(this.symbolInfo.kind); @@ -42,6 +44,4 @@ export abstract class BaseSymbolNode extends ExplorerNode { arguments: [(this.getParent() as PrimaryTypeNode).uri, this.range], }; } - - protected abstract get range(): Range; } diff --git a/src/views/dependencyExplorer.ts b/src/views/dependencyExplorer.ts index c891a261..117fe031 100644 --- a/src/views/dependencyExplorer.ts +++ b/src/views/dependencyExplorer.ts @@ -21,6 +21,7 @@ import { Settings } from "../settings"; import { EventCounter, Utility } from "../utility"; import { DataNode } from "./dataNode"; import { DependencyDataProvider } from "./dependencyDataProvider"; +import { DragAndDropController } from "./DragAndDropController"; import { ExplorerNode } from "./explorerNode"; import { explorerNodeCache } from "./nodeCache/explorerNodeCache"; @@ -43,7 +44,15 @@ export class DependencyExplorer implements Disposable { constructor(public readonly context: ExtensionContext) { this._dataProvider = new DependencyDataProvider(context); - this._dependencyViewer = window.createTreeView("javaProjectExplorer", { treeDataProvider: this._dataProvider, showCollapseAll: true }); + const dndController = new DragAndDropController(); + this._dependencyViewer = window.createTreeView( + "javaProjectExplorer", + { + treeDataProvider: this._dataProvider, + showCollapseAll: true, + dragAndDropController: dndController, + } + ); this._revealLock = new AwaitLock(); // register reveal events diff --git a/src/views/documentSymbolNode.ts b/src/views/documentSymbolNode.ts index 02bd9ba2..8360512f 100644 --- a/src/views/documentSymbolNode.ts +++ b/src/views/documentSymbolNode.ts @@ -31,7 +31,7 @@ export class DocumentSymbolNode extends BaseSymbolNode { return item; } - protected get range(): Range { + public get range(): Range { // Using `selectionRange` instead of `range` to make sure the cursor will be pointing to the codes, not the comments return (this.symbolInfo).selectionRange; } diff --git a/src/views/symbolNode.ts b/src/views/symbolNode.ts index a25701b0..eb7817a8 100644 --- a/src/views/symbolNode.ts +++ b/src/views/symbolNode.ts @@ -36,7 +36,7 @@ export class SymbolNode extends BaseSymbolNode { return item; } - protected get range(): Range { + public get range(): Range { return (this.symbolInfo).location.range; } } From 2a6c0fc9fa07480dd28d4f1f7214a946f9136f17 Mon Sep 17 00:00:00 2001 From: Sheng Chen Date: Mon, 13 Jun 2022 13:07:30 +0800 Subject: [PATCH 093/352] fix: Lose refresh events when debouncing (#633) Signed-off-by: sheche --- src/commands.ts | 2 + src/extension.ts | 2 +- .../languageServerApiManager.ts | 6 +-- src/settings.ts | 2 +- src/syncHandler.ts | 2 +- src/views/dependencyDataProvider.ts | 45 +++++++++++++------ src/views/explorerNode.ts | 11 +++++ 7 files changed, 50 insertions(+), 20 deletions(-) diff --git a/src/commands.ts b/src/commands.ts index b9b40f98..1d436438 100644 --- a/src/commands.ts +++ b/src/commands.ts @@ -20,6 +20,8 @@ export namespace Commands { export const VIEW_PACKAGE_REFRESH = "java.view.package.refresh"; + export const VIEW_PACKAGE_INTERNAL_REFRESH = "_java.view.package.internal.refresh"; + export const VIEW_PACKAGE_OUTLINE = "java.view.package.outline"; export const VIEW_PACKAGE_REVEAL_FILE_OS = "java.view.package.revealFileInOS"; diff --git a/src/extension.ts b/src/extension.ts index 3d867b2d..e35de08e 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -52,7 +52,7 @@ function addExtensionChangeListener(context: ExtensionContext): void { // java language support is not installed or disabled const extensionChangeListener = extensions.onDidChange(() => { if (extensions.getExtension(ExtensionName.JAVA_LANGUAGE_SUPPORT)) { - commands.executeCommand(Commands.VIEW_PACKAGE_REFRESH, /* debounce = */false); + commands.executeCommand(Commands.VIEW_PACKAGE_INTERNAL_REFRESH, /* debounce = */false); extensionChangeListener.dispose(); } }); diff --git a/src/languageServerApi/languageServerApiManager.ts b/src/languageServerApi/languageServerApiManager.ts index 39c08d65..a5b72402 100644 --- a/src/languageServerApi/languageServerApiManager.ts +++ b/src/languageServerApi/languageServerApiManager.ts @@ -52,7 +52,7 @@ class LanguageServerApiManager { if (extensionApi.onDidClasspathUpdate) { const onDidClasspathUpdate: Event = extensionApi.onDidClasspathUpdate; contextManager.context.subscriptions.push(onDidClasspathUpdate(() => { - commands.executeCommand(Commands.VIEW_PACKAGE_REFRESH, /* debounce = */true); + commands.executeCommand(Commands.VIEW_PACKAGE_INTERNAL_REFRESH, /* debounce = */true); syncHandler.updateFileWatcher(Settings.autoRefresh()); })); } @@ -60,7 +60,7 @@ class LanguageServerApiManager { if (extensionApi.onDidProjectsImport) { const onDidProjectsImport: Event = extensionApi.onDidProjectsImport; contextManager.context.subscriptions.push(onDidProjectsImport(() => { - commands.executeCommand(Commands.VIEW_PACKAGE_REFRESH, /* debounce = */true); + commands.executeCommand(Commands.VIEW_PACKAGE_INTERNAL_REFRESH, /* debounce = */true); syncHandler.updateFileWatcher(Settings.autoRefresh()); })); } @@ -70,7 +70,7 @@ class LanguageServerApiManager { const onDidServerModeChange: Event = extensionApi.onDidServerModeChange; contextManager.context.subscriptions.push(onDidServerModeChange((mode: LanguageServerMode) => { if (mode === LanguageServerMode.Hybrid) { - commands.executeCommand(Commands.VIEW_PACKAGE_REFRESH, /* debounce = */false); + commands.executeCommand(Commands.VIEW_PACKAGE_INTERNAL_REFRESH, /* debounce = */false); } })); } diff --git a/src/settings.ts b/src/settings.ts index 72b5a9bf..fc541bb7 100644 --- a/src/settings.ts +++ b/src/settings.ts @@ -27,7 +27,7 @@ export class Settings { || updatedConfig.packagePresentation !== oldConfig.packagePresentation || (updatedConfig.syncWithFolderExplorer !== oldConfig.syncWithFolderExplorer && updatedConfig.syncWithFolderExplorer)) { - commands.executeCommand(Commands.VIEW_PACKAGE_REFRESH); + commands.executeCommand(Commands.VIEW_PACKAGE_INTERNAL_REFRESH); } else if (updatedConfig.autoRefresh !== oldConfig.autoRefresh) { syncHandler.updateFileWatcher(updatedConfig.autoRefresh); } diff --git a/src/syncHandler.ts b/src/syncHandler.ts index 58c9fcf1..6e91547d 100644 --- a/src/syncHandler.ts +++ b/src/syncHandler.ts @@ -118,7 +118,7 @@ class SyncHandler implements Disposable { } private refresh(node?: ExplorerNode): void { - commands.executeCommand(Commands.VIEW_PACKAGE_REFRESH, /* debounce = */true, node); + commands.executeCommand(Commands.VIEW_PACKAGE_INTERNAL_REFRESH, /* debounce = */true, node); } } diff --git a/src/views/dependencyDataProvider.ts b/src/views/dependencyDataProvider.ts index cad8775c..ec7158f1 100644 --- a/src/views/dependencyDataProvider.ts +++ b/src/views/dependencyDataProvider.ts @@ -6,7 +6,7 @@ import { commands, Event, EventEmitter, ExtensionContext, ProviderResult, RelativePattern, TreeDataProvider, TreeItem, Uri, window, workspace, } from "vscode"; -import { instrumentOperation, instrumentOperationAsVsCodeCommand } from "vscode-extension-telemetry-wrapper"; +import { instrumentOperationAsVsCodeCommand } from "vscode-extension-telemetry-wrapper"; import { contextManager } from "../../extension.bundle"; import { Commands } from "../commands"; import { Context } from "../constants"; @@ -31,13 +31,24 @@ export class DependencyDataProvider implements TreeDataProvider { private _rootItems: ExplorerNode[] | undefined = undefined; private _refreshDelayTrigger: _.DebouncedFunc<((element?: ExplorerNode) => void)>; + /** + * The element which is pending to be refreshed. + * `undefined` denotes to root node. + * `null` means no node is pending. + */ + private pendingRefreshElement: ExplorerNode | undefined | null; constructor(public readonly context: ExtensionContext) { - context.subscriptions.push(commands.registerCommand(Commands.VIEW_PACKAGE_REFRESH, (debounce?: boolean, element?: ExplorerNode) => - this.refreshWithLog(debounce, element))); + // commands that do not send back telemetry + context.subscriptions.push(commands.registerCommand(Commands.VIEW_PACKAGE_INTERNAL_REFRESH, (debounce?: boolean, element?: ExplorerNode) => + this.refresh(debounce, element))); context.subscriptions.push(commands.registerCommand(Commands.EXPORT_JAR_REPORT, (terminalId: string, message: string) => { appendOutput(terminalId, message); })); + + // normal commands + context.subscriptions.push(instrumentOperationAsVsCodeCommand(Commands.VIEW_PACKAGE_REFRESH, (debounce?: boolean, element?: ExplorerNode) => + this.refresh(debounce, element))); context.subscriptions.push(instrumentOperationAsVsCodeCommand(Commands.VIEW_PACKAGE_EXPORT_JAR, async (node: INodeData) => { executeExportJarTask(node); })); @@ -61,28 +72,33 @@ export class DependencyDataProvider implements TreeDataProvider { Settings.registerConfigurationListener((updatedConfig, oldConfig) => { if (updatedConfig.refreshDelay !== oldConfig.refreshDelay) { - this.setRefreshDelay(updatedConfig.refreshDelay); + this.setRefreshDebounceFunc(updatedConfig.refreshDelay); } }); - this.setRefreshDelay(); + this.setRefreshDebounceFunc(); } - public refreshWithLog(debounce?: boolean, element?: ExplorerNode) { - if (Settings.autoRefresh()) { - this.refresh(debounce, element); + public refresh(debounce = false, element?: ExplorerNode) { + if (element === undefined || this.pendingRefreshElement === undefined) { + this._refreshDelayTrigger(undefined); + this.pendingRefreshElement = undefined; + } else if (this.pendingRefreshElement === null + || element.isItselfOrAncestorOf(this.pendingRefreshElement)) { + this._refreshDelayTrigger(element); + this.pendingRefreshElement = element; + } else if (this.pendingRefreshElement.isItselfOrAncestorOf(element)) { + this._refreshDelayTrigger(this.pendingRefreshElement); } else { - instrumentOperation(Commands.VIEW_PACKAGE_REFRESH, () => this.refresh(debounce, element))(); + this._refreshDelayTrigger.flush(); + this._refreshDelayTrigger(element); + this.pendingRefreshElement = element; } - } - - public refresh(debounce = false, element?: ExplorerNode) { - this._refreshDelayTrigger(element); if (!debounce) { // Immediately refresh this._refreshDelayTrigger.flush(); } } - public setRefreshDelay(wait?: number) { + public setRefreshDebounceFunc(wait?: number) { if (!wait) { wait = Settings.refreshDelay(); } @@ -142,6 +158,7 @@ export class DependencyDataProvider implements TreeDataProvider { } explorerNodeCache.removeNodeChildren(element); this._onDidChangeTreeData.fire(element); + this.pendingRefreshElement = null; } private async getRootNodes(): Promise { diff --git a/src/views/explorerNode.ts b/src/views/explorerNode.ts index 68d35550..18c0e79e 100644 --- a/src/views/explorerNode.ts +++ b/src/views/explorerNode.ts @@ -12,6 +12,17 @@ export abstract class ExplorerNode { return this._parent; } + public isItselfOrAncestorOf(node: ExplorerNode | undefined | null) { + while (node) { + if (this === node) { + return true; + } + node = node.getParent(); + } + + return false; + } + protected get command(): Command | undefined { return undefined; } From 16d35e89cf6a0911f3c5c9d24c2e35a5f3471cdb Mon Sep 17 00:00:00 2001 From: Sheng Chen Date: Tue, 14 Jun 2022 13:06:58 +0800 Subject: [PATCH 094/352] feat: Support drag and drop inside Java Project explorer (#634) Signed-off-by: sheche --- src/views/DragAndDropController.ts | 183 ++++++++++++++++++++++++++++- src/views/containerNode.ts | 35 +++--- src/views/explorerNode.ts | 5 +- src/views/packageRootNode.ts | 4 + src/views/projectNode.ts | 10 ++ 5 files changed, 216 insertions(+), 21 deletions(-) diff --git a/src/views/DragAndDropController.ts b/src/views/DragAndDropController.ts index 8a630ebc..fca6ffc1 100644 --- a/src/views/DragAndDropController.ts +++ b/src/views/DragAndDropController.ts @@ -1,13 +1,22 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT license. -import { DataTransfer, DataTransferItem, TreeDragAndDropController } from "vscode"; +import * as path from "path"; +import { commands, DataTransfer, DataTransferItem, TreeDragAndDropController, Uri, window, workspace, WorkspaceEdit } from "vscode"; +import { Commands } from "../commands"; import { Explorer } from "../constants"; import { BaseSymbolNode } from "./baseSymbolNode"; +import { ContainerNode, ContainerType } from "./containerNode"; import { DataNode } from "./dataNode"; import { ExplorerNode } from "./explorerNode"; import { FileNode } from "./fileNode"; +import { FolderNode } from "./folderNode"; +import { explorerNodeCache } from "./nodeCache/explorerNodeCache"; +import { PackageNode } from "./packageNode"; +import { PackageRootNode } from "./packageRootNode"; import { PrimaryTypeNode } from "./PrimaryTypeNode"; +import { ProjectNode } from "./projectNode"; +import { WorkspaceNode } from "./workspaceNode"; export class DragAndDropController implements TreeDragAndDropController { @@ -16,17 +25,31 @@ export class DragAndDropController implements TreeDragAndDropController { + const data = dataTransfer.get(Explorer.Mime.JavaProjectExplorer); + if (data) { + await this.dropFromJavaProjectExplorer(target, data.value); + return; + } } + /** + * Add data transfer that is used when node is dropped to the editor. + * @param node node being dragged. + * @param treeDataTransfer A map containing a mapping of the mime type of the corresponding transferred data. + */ private addDragToEditorDataTransfer(node: ExplorerNode, treeDataTransfer: DataTransfer) { - if ((node instanceof PrimaryTypeNode || node instanceof FileNode) && (node as DataNode).uri) { - treeDataTransfer.set(Explorer.Mime.TextUriList, new DataTransferItem((node as DataNode).uri)); + if ((node instanceof PrimaryTypeNode || node instanceof FileNode) && node.uri) { + treeDataTransfer.set(Explorer.Mime.TextUriList, new DataTransferItem(node.uri)); } else if ((node instanceof BaseSymbolNode)) { const parent = (node.getParent() as PrimaryTypeNode); if (parent.uri) { @@ -37,4 +60,154 @@ export class DragAndDropController implements TreeDragAndDropController { + const source: DataNode | undefined = explorerNodeCache.getDataNode(Uri.parse(uri)); + if (!this.isDraggableNode(source)) { + return; + } + + if (!this.isDroppableNode(target)) { + return; + } + + // check if the target node is source node itself or its parent. + if (target?.isItselfOrAncestorOf(source, 1 /*levelToCheck*/)) { + return; + } + + if (target instanceof ContainerNode) { + if (target.getContainerType() !== ContainerType.ReferencedLibrary) { + return; + } + + if (!(target.getParent() as ProjectNode).isUnmanagedFolder()) { + return; + } + + // TODO: referenced library + } else if (target instanceof PackageRootNode || target instanceof PackageNode + || target instanceof FolderNode) { + await this.move(source!, target); + } + } + + /** + * Check whether the dragged node is draggable. + * @param node the dragged node. + */ + private isDraggableNode(node: DataNode | undefined): boolean { + if (!node?.uri) { + return false; + } + if (node instanceof WorkspaceNode || node instanceof ProjectNode + || node instanceof PackageRootNode || node instanceof ContainerNode + || node instanceof BaseSymbolNode) { + return false; + } + + return this.isUnderSourceRoot(node); + } + + /** + * Check whether the node is under source root. + * + * Note: There is one exception: The primary type directly under an unmanaged folder project, + * in that case, `true` is returned. + * @param node DataNode + */ + private isUnderSourceRoot(node: DataNode): boolean { + let parent = node.getParent(); + while (parent) { + if (parent instanceof ContainerNode) { + return false; + } + + if (parent instanceof PackageRootNode) { + return parent.isSourceRoot(); + } + parent = parent.getParent(); + } + return true; + } + + /** + * Check whether the node is able to be dropped. + */ + private isDroppableNode(node: ExplorerNode | undefined): boolean { + // drop to root is not supported yet + if (!node) { + return false; + } + + if (node instanceof DataNode && !node.uri) { + return false; + } + + if (node instanceof WorkspaceNode || node instanceof ProjectNode + || node instanceof BaseSymbolNode) { + return false; + } + + let parent: ExplorerNode | undefined = node; + while (parent) { + if (parent instanceof ProjectNode) { + return false; + } else if (parent instanceof PackageRootNode) { + return parent.isSourceRoot(); + } else if (parent instanceof ContainerNode) { + if (parent.getContainerType() === ContainerType.ReferencedLibrary) { + return (parent.getParent() as ProjectNode).isUnmanagedFolder(); + } + return false; + } + parent = parent.getParent(); + } + return false; + } + + /** + * Trigger a workspace edit that move the source node into the target node. + */ + private async move(source: DataNode, target: DataNode): Promise { + const sourceUri = Uri.parse(source.uri!); + const targetUri = Uri.parse(target.uri!); + if (sourceUri === targetUri) { + return; + } + + const newPath = path.join(targetUri.fsPath, path.basename(sourceUri.fsPath)); + const choice = await window.showInformationMessage( + `Are you sure you want to move '${path.basename(sourceUri.fsPath)}' into '${path.basename(targetUri.fsPath)}'?`, + { modal: true }, + "Move", + ); + + if (choice === "Move") { + const edit = new WorkspaceEdit(); + edit.renameFile(sourceUri, Uri.file(newPath)); + await workspace.applyEdit(edit); + commands.executeCommand(Commands.VIEW_PACKAGE_REFRESH, /* debounce = */true); + } + } } diff --git a/src/views/containerNode.ts b/src/views/containerNode.ts index 664feb7b..c85c98d9 100644 --- a/src/views/containerNode.ts +++ b/src/views/containerNode.ts @@ -20,6 +20,20 @@ export class ContainerNode extends DataNode { return this._project.uri && Uri.parse(this._project.uri).fsPath; } + public getContainerType(): string { + const containerPath: string = this._nodeData.path || ""; + if (containerPath.startsWith(ContainerPath.JRE)) { + return ContainerType.JRE; + } else if (containerPath.startsWith(ContainerPath.Maven)) { + return ContainerType.Maven; + } else if (containerPath.startsWith(ContainerPath.Gradle)) { + return ContainerType.Gradle; + } else if (containerPath.startsWith(ContainerPath.ReferencedLibrary)) { + return ContainerType.ReferencedLibrary; + } + return ContainerType.Unknown; + } + protected async loadData(): Promise { return Jdtls.getPackageData({ kind: NodeKind.Container, projectUri: this._project.uri, path: this.path }); } @@ -36,7 +50,7 @@ export class ContainerNode extends DataNode { protected get contextValue(): string { let contextValue: string = Explorer.ContextValueType.Container; - const containerType: string = getContainerType(this._nodeData.path); + const containerType: string = this.getContainerType(); if (containerType) { contextValue += `+${containerType}`; } @@ -48,19 +62,12 @@ export class ContainerNode extends DataNode { } } -function getContainerType(containerPath: string | undefined): string { - if (!containerPath) { - return ""; - } else if (containerPath.startsWith(ContainerPath.JRE)) { - return "jre"; - } else if (containerPath.startsWith(ContainerPath.Maven)) { - return "maven"; - } else if (containerPath.startsWith(ContainerPath.Gradle)) { - return "gradle"; - } else if (containerPath.startsWith(ContainerPath.ReferencedLibrary)) { - return "referencedLibrary"; - } - return ""; +export enum ContainerType { + JRE = "jre", + Maven = "maven", + Gradle = "gradle", + ReferencedLibrary = "referencedLibrary", + Unknown = "", } const enum ContainerPath { diff --git a/src/views/explorerNode.ts b/src/views/explorerNode.ts index 18c0e79e..c892a1d6 100644 --- a/src/views/explorerNode.ts +++ b/src/views/explorerNode.ts @@ -12,12 +12,13 @@ export abstract class ExplorerNode { return this._parent; } - public isItselfOrAncestorOf(node: ExplorerNode | undefined | null) { - while (node) { + public isItselfOrAncestorOf(node: ExplorerNode | undefined | null, levelToCheck: number = Number.MAX_VALUE) { + while (node && levelToCheck >= 0) { if (this === node) { return true; } node = node.getParent(); + levelToCheck--; } return false; diff --git a/src/views/packageRootNode.ts b/src/views/packageRootNode.ts index ef98f72e..90a6bd29 100644 --- a/src/views/packageRootNode.ts +++ b/src/views/packageRootNode.ts @@ -23,6 +23,10 @@ export class PackageRootNode extends DataNode { super(nodeData, parent); } + public isSourceRoot(): boolean { + return (this.nodeData).entryKind === PackageRootKind.K_SOURCE; + } + protected async loadData(): Promise { return Jdtls.getPackageData({ kind: NodeKind.PackageRoot, diff --git a/src/views/projectNode.ts b/src/views/projectNode.ts index 52fd5b2c..1ec431e6 100644 --- a/src/views/projectNode.ts +++ b/src/views/projectNode.ts @@ -52,6 +52,16 @@ export class ProjectNode extends DataNode { return (childNode && paths.length > 0) ? childNode.revealPaths(paths) : childNode; } + public isUnmanagedFolder(): boolean { + const natureIds: string[] = this.nodeData.metaData?.[NATURE_ID] || []; + for (const natureId of natureIds) { + if (natureId === NatureId.UnmanagedFolder) { + return true; + } + } + return false; + } + protected async loadData(): Promise { let result: INodeData[] = []; return Jdtls.getPackageData({ kind: NodeKind.Project, projectUri: this.nodeData.uri }).then((res) => { From 5e63a428e144650710313949c2e752c42786a119 Mon Sep 17 00:00:00 2001 From: Sheng Chen Date: Tue, 14 Jun 2022 14:25:58 +0800 Subject: [PATCH 095/352] fix: Add overwrite confirmation (#636) Signed-off-by: sheche --- src/views/DragAndDropController.ts | 26 ++++++++++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-) diff --git a/src/views/DragAndDropController.ts b/src/views/DragAndDropController.ts index fca6ffc1..0d476aa5 100644 --- a/src/views/DragAndDropController.ts +++ b/src/views/DragAndDropController.ts @@ -2,6 +2,7 @@ // Licensed under the MIT license. import * as path from "path"; +import * as fse from "fs-extra"; import { commands, DataTransfer, DataTransferItem, TreeDragAndDropController, Uri, window, workspace, WorkspaceEdit } from "vscode"; import { Commands } from "../commands"; import { Explorer } from "../constants"; @@ -203,11 +204,32 @@ export class DragAndDropController implements TreeDragAndDropController { + if (await fse.pathExists(file)) { + const name = path.basename(file); + const ans = await window.showWarningMessage( + `A file or folder with the name '${name}' already exists in the destination folder. Do you want to replace it?`, + { + modal: true, + detail: "This action is irreversible!", + }, + "Replace", + ); + return ans === "Replace"; + } + + return true; + } } From eed2e9f38364a705f735656cd7fe5f5fecdcb0d6 Mon Sep 17 00:00:00 2001 From: Sheng Chen Date: Wed, 15 Jun 2022 10:52:42 +0800 Subject: [PATCH 096/352] feat: Support adding referenced libraries via drag and drop (#637) Signed-off-by: sheche --- src/controllers/libraryController.ts | 46 +++++++------- src/views/DragAndDropController.ts | 92 ++++++++++++++++++++++++++-- 2 files changed, 109 insertions(+), 29 deletions(-) diff --git a/src/controllers/libraryController.ts b/src/controllers/libraryController.ts index 563823e3..237d2afc 100644 --- a/src/controllers/libraryController.ts +++ b/src/controllers/libraryController.ts @@ -33,13 +33,6 @@ export class LibraryController implements Disposable { this.disposable.dispose(); } - public async addLibraryGlobs(libraryGlobs: string[]) { - const setting = Settings.referencedLibraries(); - setting.exclude = this.dedupAlreadyCoveredPattern(libraryGlobs, ...setting.exclude); - setting.include = this.updatePatternArray(setting.include, ...libraryGlobs); - Settings.updateReferencedLibraries(setting); - } - public async addLibraries(canSelectFolders?: boolean) { const workspaceFolder: WorkspaceFolder | undefined = Utility.getDefaultWorkspaceFolder(); const isMac = platform() === "darwin"; @@ -54,7 +47,7 @@ export class LibraryController implements Disposable { if (!results) { return; } - this.addLibraryGlobs(await Promise.all(results.map(async (uri: Uri) => { + addLibraryGlobs(await Promise.all(results.map(async (uri: Uri) => { // keep the param: `includeWorkspaceFolder` to false here // since the multi-root is not supported well for invisible projects const uriPath = workspace.asRelativePath(uri, false); @@ -74,7 +67,7 @@ export class LibraryController implements Disposable { }); if (removedPaths.length === 0) { // No duplicated item in include array, add it into the exclude field - setting.exclude = this.updatePatternArray(setting.exclude, workspace.asRelativePath(removalFsPath, false)); + setting.exclude = updatePatternArray(setting.exclude, workspace.asRelativePath(removalFsPath, false)); } Settings.updateReferencedLibraries(setting); } @@ -85,21 +78,28 @@ export class LibraryController implements Disposable { await Jdtls.refreshLibraries(workspaceFolder.uri.toString()); } } +} - /** - * Check if the `update` patterns are already covered by `origin` patterns and return those uncovered - */ - private dedupAlreadyCoveredPattern(origin: string[], ...update: string[]): string[] { - return update.filter((newPattern) => { - return !origin.some((originPattern) => { - return minimatch(newPattern, originPattern); - }); +export function addLibraryGlobs(libraryGlobs: string[]) { + const setting = Settings.referencedLibraries(); + setting.exclude = dedupAlreadyCoveredPattern(libraryGlobs, ...setting.exclude); + setting.include = updatePatternArray(setting.include, ...libraryGlobs); + Settings.updateReferencedLibraries(setting); +} + +/** + * Check if the `update` patterns are already covered by `origin` patterns and return those uncovered + */ +function dedupAlreadyCoveredPattern(origin: string[], ...update: string[]): string[] { + return update.filter((newPattern) => { + return !origin.some((originPattern) => { + return minimatch(newPattern, originPattern); }); - } + }); +} - private updatePatternArray(origin: string[], ...update: string[]): string[] { - update = this.dedupAlreadyCoveredPattern(origin, ...update); - origin.push(...update); - return _.uniq(origin); - } +function updatePatternArray(origin: string[], ...update: string[]): string[] { + update = dedupAlreadyCoveredPattern(origin, ...update); + origin.push(...update); + return _.uniq(origin); } diff --git a/src/views/DragAndDropController.ts b/src/views/DragAndDropController.ts index 0d476aa5..cc2921b5 100644 --- a/src/views/DragAndDropController.ts +++ b/src/views/DragAndDropController.ts @@ -18,11 +18,14 @@ import { PackageRootNode } from "./packageRootNode"; import { PrimaryTypeNode } from "./PrimaryTypeNode"; import { ProjectNode } from "./projectNode"; import { WorkspaceNode } from "./workspaceNode"; +import { addLibraryGlobs } from "../controllers/libraryController"; +import { sendError } from "vscode-extension-telemetry-wrapper"; export class DragAndDropController implements TreeDragAndDropController { dropMimeTypes: string[] = [ Explorer.Mime.JavaProjectExplorer, + Explorer.Mime.TextUriList, ]; dragMimeTypes: string[] = [ Explorer.Mime.TextUriList, @@ -41,6 +44,33 @@ export class DragAndDropController implements TreeDragAndDropController { + if (key === Explorer.Mime.TextUriList && value.value) { + uriList.push(...(value.value as string).split("\n")); + } + }); + + uriList = uriList.map(u => { + try { + const uri = Uri.parse(u, true /* strict */); + if (uri.scheme !== "file") { + return undefined; + } + return u; + } catch (e) { + sendError(e); + return undefined; + } + }).filter(Boolean) as string[]; + + if (uriList.length) { + this.dropFromFileExplorer(target, uriList); + } } /** @@ -82,7 +112,7 @@ export class DragAndDropController implements TreeDragAndDropController { + private async dropFromJavaProjectExplorer(target: ExplorerNode | undefined, uri: string): Promise { const source: DataNode | undefined = explorerNodeCache.getDataNode(Uri.parse(uri)); if (!this.isDraggableNode(source)) { return; @@ -98,18 +128,38 @@ export class DragAndDropController implements TreeDragAndDropController { + if (!this.isDroppableNode(target)) { + return; + } + + if (target instanceof ContainerNode) { + if (target.getContainerType() !== ContainerType.ReferencedLibrary + || !(target.getParent() as ProjectNode).isUnmanagedFolder()) { return; } - // TODO: referenced library + this.addReferencedLibraries(uris); } else if (target instanceof PackageRootNode || target instanceof PackageNode || target instanceof FolderNode) { - await this.move(source!, target); + // TODO: copy the resources to other nodes } } @@ -161,7 +211,7 @@ export class DragAndDropController implements TreeDragAndDropController { + const pattern = (await Promise.all(uriStrings.map(async uriString => { + try { + const uri = Uri.parse(uriString, true /* strict */); + if (uri.scheme !== "file") { + return undefined; + } + const isDirectory = (await fse.stat(uri.fsPath)).isDirectory(); + // only jars and folders can be dropped into referenced libraries. + if (!isDirectory && path.extname(uri.fsPath) !== ".jar") { + return undefined; + } + const uriPath = workspace.asRelativePath(uri, false); + return isDirectory ? uriPath + "/**/*.jar" : uriPath; + } catch (e) { + sendError(e); + return undefined; + } + }))).filter(Boolean); + + if (pattern) { + addLibraryGlobs(pattern as string[]); + } + } } From 4e6e6d331be5fe78b0984907d876ad5fc03b009b Mon Sep 17 00:00:00 2001 From: Sheng Chen Date: Thu, 16 Jun 2022 10:49:00 +0800 Subject: [PATCH 097/352] feat: Support copy files from file explorer (#638) Signed-off-by: sheche --- src/views/DragAndDropController.ts | 28 ++++++++++++++++++++-------- 1 file changed, 20 insertions(+), 8 deletions(-) diff --git a/src/views/DragAndDropController.ts b/src/views/DragAndDropController.ts index cc2921b5..35291862 100644 --- a/src/views/DragAndDropController.ts +++ b/src/views/DragAndDropController.ts @@ -3,8 +3,7 @@ import * as path from "path"; import * as fse from "fs-extra"; -import { commands, DataTransfer, DataTransferItem, TreeDragAndDropController, Uri, window, workspace, WorkspaceEdit } from "vscode"; -import { Commands } from "../commands"; +import { DataTransfer, DataTransferItem, TreeDragAndDropController, Uri, window, workspace, WorkspaceEdit } from "vscode"; import { Explorer } from "../constants"; import { BaseSymbolNode } from "./baseSymbolNode"; import { ContainerNode, ContainerType } from "./containerNode"; @@ -136,7 +135,7 @@ export class DragAndDropController implements TreeDragAndDropController { - const sourceUri = Uri.parse(source.uri!); - const targetUri = Uri.parse(target.uri!); + private async move(sourceUri: Uri, targetUri: Uri): Promise { if (sourceUri === targetUri) { return; } @@ -258,7 +257,20 @@ export class DragAndDropController implements TreeDragAndDropController { + if (sourceUri === targetUri) { + return; + } + + const newPath = path.join(targetUri.fsPath, path.basename(sourceUri.fsPath)); + if (await this.confirmOverwrite(newPath)) { + await workspace.fs.copy(sourceUri, Uri.file(newPath), { overwrite: true }); } } From 365a0872c32695417e5770d292d3ee78646a5710 Mon Sep 17 00:00:00 2001 From: Sheng Chen Date: Mon, 20 Jun 2022 13:54:39 +0800 Subject: [PATCH 098/352] bi: Add telemetry for dnd support (#644) Signed-off-by: Sheng Chen --- src/views/DragAndDropController.ts | 71 +++++++++++++++++++++++++++++- 1 file changed, 69 insertions(+), 2 deletions(-) diff --git a/src/views/DragAndDropController.ts b/src/views/DragAndDropController.ts index 35291862..1d315da3 100644 --- a/src/views/DragAndDropController.ts +++ b/src/views/DragAndDropController.ts @@ -18,7 +18,7 @@ import { PrimaryTypeNode } from "./PrimaryTypeNode"; import { ProjectNode } from "./projectNode"; import { WorkspaceNode } from "./workspaceNode"; import { addLibraryGlobs } from "../controllers/libraryController"; -import { sendError } from "vscode-extension-telemetry-wrapper"; +import { sendError, sendInfo } from "vscode-extension-telemetry-wrapper"; export class DragAndDropController implements TreeDragAndDropController { @@ -35,6 +35,10 @@ export class DragAndDropController implements TreeDragAndDropController { @@ -68,7 +72,8 @@ export class DragAndDropController implements TreeDragAndDropController { const source: DataNode | undefined = explorerNodeCache.getDataNode(Uri.parse(uri)); if (!this.isDraggableNode(source)) { + sendInfo("", { + dndType: "drop", + dragFrom: source ? source.constructor.name : "undefined", + dropTo: target ? target.constructor.name : "undefined", + draggable: "false", + }); return; } if (!this.isDroppableNode(target)) { + sendInfo("", { + dndType: "drop", + dragFrom: source ? source.constructor.name : "undefined", + dropTo: target ? target.constructor.name : "undefined", + draggable: "true", + droppable: "false", + }); return; } @@ -129,13 +147,34 @@ export class DragAndDropController implements TreeDragAndDropController { if (!this.isDroppableNode(target)) { + sendInfo("", { + dndType: "drop", + dragFrom: "File Explorer", + dropTo: target ? target.constructor.name : "undefined", + draggable: "true", + droppable: "false", + }); return; } if (target instanceof ContainerNode) { if (target.getContainerType() !== ContainerType.ReferencedLibrary || !(target.getParent() as ProjectNode).isUnmanagedFolder()) { + sendInfo("", { + dndType: "drop", + dragFrom: "File Explorer", + dropTo: "Referenced Libraries", + draggable: "true", + droppable: "false", + }); return; } this.addReferencedLibraries(uris); + sendInfo("", { + dndType: "drop", + dragFrom: "File Explorer", + dropTo: "Referenced Libraries", + draggable: "true", + droppable: "true", + }); } else if (target instanceof PackageRootNode || target instanceof PackageNode || target instanceof FolderNode) { for (const uri of uris) { await this.copy(Uri.parse(uri), Uri.parse(target.uri!)); } + sendInfo("", { + dndType: "drop", + dragFrom: "File Explorer", + dropTo: target ? target.constructor.name : "undefined", + draggable: "true", + droppable: "true", + }); } } From d5d02ca9bad011517468b26a2d1b676082306f60 Mon Sep 17 00:00:00 2001 From: Sheng Chen Date: Wed, 22 Jun 2022 12:24:12 +0800 Subject: [PATCH 099/352] fix: Show folders in the package nodes (#643) Signed-off-by: sheche --- .../microsoft/jdtls/ext/core/PackageCommand.java | 14 ++++++++++---- src/views/hierarchicalPackageNode.ts | 3 +++ src/views/packageNode.ts | 6 +++++- 3 files changed, 18 insertions(+), 5 deletions(-) diff --git a/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/PackageCommand.java b/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/PackageCommand.java index 02538119..43cf4f5c 100644 --- a/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/PackageCommand.java +++ b/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/PackageCommand.java @@ -18,6 +18,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Objects; import java.util.function.BiFunction; import java.util.stream.Collectors; @@ -403,20 +404,25 @@ private static List getRootTypes(PackageParams query, IProgressMoni } // when .java files and other .properties files are mixed up rootTypeNodes.addAll( - Arrays.stream(nonJavaResources).filter(resource -> resource instanceof IFile || resource instanceof JarEntryFile).map(resource -> { + Arrays.stream(nonJavaResources).map(resource -> { if (resource instanceof IFile) { IFile file = (IFile) resource; PackageNode item = new PackageNode(file.getName(), file.getFullPath().toPortableString(), NodeKind.FILE); item.setUri(JDTUtils.getFileURI(file)); return item; - } else { + } else if (resource instanceof IFolder) { + IFolder folder = (IFolder) resource; + PackageNode item = new PackageNode(folder.getName(), folder.getFullPath().toPortableString(), NodeKind.FOLDER); + item.setUri(JDTUtils.getFileURI(folder)); + return item; + } else if (resource instanceof JarEntryFile) { JarEntryFile file = (JarEntryFile) resource; PackageNode entry = new PackageNode(file.getName(), file.getFullPath().toPortableString(), NodeKind.FILE); entry.setUri(ExtUtils.toUri((JarEntryFile) resource)); return entry; } - - }).collect(Collectors.toList())); + return null; + }).filter(Objects::nonNull).collect(Collectors.toList())); return rootTypeNodes; } } catch (CoreException e) { diff --git a/src/views/hierarchicalPackageNode.ts b/src/views/hierarchicalPackageNode.ts index 3364f7ff..43db37ed 100644 --- a/src/views/hierarchicalPackageNode.ts +++ b/src/views/hierarchicalPackageNode.ts @@ -9,6 +9,7 @@ import { explorerLock } from "../utils/Lock"; import { DataNode } from "./dataNode"; import { ExplorerNode } from "./explorerNode"; import { FileNode } from "./fileNode"; +import { FolderNode } from "./folderNode"; import { PackageNode } from "./packageNode"; import { PrimaryTypeNode } from "./PrimaryTypeNode"; import { ProjectNode } from "./projectNode"; @@ -75,6 +76,8 @@ export class HierarchicalPackageNode extends PackageNode { if (nodeData.metaData && nodeData.metaData[PrimaryTypeNode.K_TYPE_KIND]) { result.push(new PrimaryTypeNode(nodeData, this, this._rootNode)); } + } else if (nodeData.kind === NodeKind.Folder) { + result.push(new FolderNode(nodeData, this, this._project, this._rootNode)); } }); } diff --git a/src/views/packageNode.ts b/src/views/packageNode.ts index da05fbb8..8b4bedc2 100644 --- a/src/views/packageNode.ts +++ b/src/views/packageNode.ts @@ -10,10 +10,12 @@ import { isTest } from "../utility"; import { DataNode } from "./dataNode"; import { ExplorerNode } from "./explorerNode"; import { FileNode } from "./fileNode"; +import { FolderNode } from "./folderNode"; import { PrimaryTypeNode } from "./PrimaryTypeNode"; +import { ProjectNode } from "./projectNode"; export class PackageNode extends DataNode { - constructor(nodeData: INodeData, parent: DataNode, protected _project: DataNode, protected _rootNode: DataNode) { + constructor(nodeData: INodeData, parent: DataNode, protected _project: ProjectNode, protected _rootNode: DataNode) { super(nodeData, parent); } @@ -37,6 +39,8 @@ export class PackageNode extends DataNode { if (nodeData.metaData && nodeData.metaData[PrimaryTypeNode.K_TYPE_KIND]) { result.push(new PrimaryTypeNode(nodeData, this, this._rootNode)); } + } else if (nodeData.kind === NodeKind.Folder) { + result.push(new FolderNode(nodeData, this, this._project, this._rootNode)); } }); } From 232309bdb04ed0adbd7487f36f9e083ea48f159f Mon Sep 17 00:00:00 2001 From: Sheng Chen Date: Wed, 22 Jun 2022 13:03:46 +0800 Subject: [PATCH 100/352] fix: Use context value to identify the node types (#646) Signed-off-by: Sheng Chen --- src/constants.ts | 1 + src/views/DragAndDropController.ts | 24 +++++++++++++----------- src/views/documentSymbolNode.ts | 5 +++++ src/views/explorerNode.ts | 2 ++ src/views/packageNode.ts | 5 +++++ src/views/symbolNode.ts | 5 +++++ 6 files changed, 31 insertions(+), 11 deletions(-) diff --git a/src/constants.ts b/src/constants.ts index 45ac1443..36b81729 100644 --- a/src/constants.ts +++ b/src/constants.ts @@ -19,6 +19,7 @@ export namespace Explorer { File = "file", Type = "type", Folder = "folder", + Symbol = "symbol", } export enum Mime { diff --git a/src/views/DragAndDropController.ts b/src/views/DragAndDropController.ts index 1d315da3..2f5e140b 100644 --- a/src/views/DragAndDropController.ts +++ b/src/views/DragAndDropController.ts @@ -37,7 +37,7 @@ export class DragAndDropController implements TreeDragAndDropControllerthis.symbolInfo).selectionRange; } + + public computeContextValue(): string | undefined { + return `java:${Explorer.ContextValueType.Symbol}`; + } } diff --git a/src/views/explorerNode.ts b/src/views/explorerNode.ts index c892a1d6..c5c29092 100644 --- a/src/views/explorerNode.ts +++ b/src/views/explorerNode.ts @@ -31,4 +31,6 @@ export abstract class ExplorerNode { public abstract getChildren(): ProviderResult; public abstract getTreeItem(): TreeItem | Promise; + + public abstract computeContextValue(): string | undefined; } diff --git a/src/views/packageNode.ts b/src/views/packageNode.ts index 8b4bedc2..12aebcc6 100644 --- a/src/views/packageNode.ts +++ b/src/views/packageNode.ts @@ -19,6 +19,11 @@ export class PackageNode extends DataNode { super(nodeData, parent); } + public isSourcePackage(): boolean { + const parentData = this._rootNode.nodeData; + return parentData.entryKind === PackageRootKind.K_SOURCE || parentData.kind === NodeKind.Project; + } + protected async loadData(): Promise { return Jdtls.getPackageData({ kind: NodeKind.Package, diff --git a/src/views/symbolNode.ts b/src/views/symbolNode.ts index eb7817a8..1505a079 100644 --- a/src/views/symbolNode.ts +++ b/src/views/symbolNode.ts @@ -2,6 +2,7 @@ // Licensed under the MIT license. import { Range, SymbolInformation, TreeItem, TreeItemCollapsibleState } from "vscode"; +import { Explorer } from "../constants"; import { ITypeRootNodeData } from "../java/typeRootNodeData"; import { BaseSymbolNode } from "./baseSymbolNode"; import { ExplorerNode } from "./explorerNode"; @@ -39,4 +40,8 @@ export class SymbolNode extends BaseSymbolNode { public get range(): Range { return (this.symbolInfo).location.range; } + + public computeContextValue(): string | undefined { + return `java:${Explorer.ContextValueType.Symbol}`; + } } From 145ee5c69bf0fcd3bd7e4050f533f25fa4311086 Mon Sep 17 00:00:00 2001 From: Sheng Chen Date: Thu, 23 Jun 2022 12:53:39 +0800 Subject: [PATCH 101/352] chore: Prepare for 0.20.0 (#648) Signed-off-by: sheche --- CHANGELOG.md | 11 +++++++++++ .../META-INF/MANIFEST.MF | 2 +- jdtls.ext/com.microsoft.jdtls.ext.activator/pom.xml | 2 +- .../com.microsoft.jdtls.ext.core/META-INF/MANIFEST.MF | 2 +- jdtls.ext/com.microsoft.jdtls.ext.core/pom.xml | 2 +- jdtls.ext/pom.xml | 2 +- package-lock.json | 2 +- package.json | 4 ++-- 8 files changed, 19 insertions(+), 8 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7285884e..5a49f2e5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,7 +4,18 @@ All notable changes to the "vscode-java-dependency" extension will be documented The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/) and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html). +## 0.20.0 +### Added +- Support Support drag and drop for Java Project explorer. [#613](https://github.com/microsoft/vscode-java-dependency/issues/613) + +### Changed +- Move the `Rebuild Workspace` action to navigation bar. [#619](https://github.com/microsoft/vscode-java-dependency/issues/619) + +### Fixed +- [Bugs fixed](https://github.com/microsoft/vscode-java-dependency/issues?q=is%3Aissue+label%3Abug+milestone%3A0.20.0+is%3Aclosed) + ## 0.19.1 +### Fixed - [Bugs fixed](https://github.com/microsoft/vscode-java-dependency/issues?q=is%3Aissue+label%3Abug+milestone%3A0.19.1+is%3Aclosed) ## 0.19.0 diff --git a/jdtls.ext/com.microsoft.jdtls.ext.activator/META-INF/MANIFEST.MF b/jdtls.ext/com.microsoft.jdtls.ext.activator/META-INF/MANIFEST.MF index ef04d20f..4374f96c 100644 --- a/jdtls.ext/com.microsoft.jdtls.ext.activator/META-INF/MANIFEST.MF +++ b/jdtls.ext/com.microsoft.jdtls.ext.activator/META-INF/MANIFEST.MF @@ -2,7 +2,7 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: JDTLS EXT Activator Bundle-SymbolicName: com.microsoft.jdtls.ext.activator;singleton:=true -Bundle-Version: 0.19.1 +Bundle-Version: 0.20.0 Bundle-Activator: com.microsoft.jdtls.ext.activator.JdtlsExtActivator Bundle-RequiredExecutionEnvironment: JavaSE-1.8 Import-Package: org.eclipse.jdt.core, diff --git a/jdtls.ext/com.microsoft.jdtls.ext.activator/pom.xml b/jdtls.ext/com.microsoft.jdtls.ext.activator/pom.xml index 6f9b23d9..1deee26e 100644 --- a/jdtls.ext/com.microsoft.jdtls.ext.activator/pom.xml +++ b/jdtls.ext/com.microsoft.jdtls.ext.activator/pom.xml @@ -5,7 +5,7 @@ com.microsoft.jdtls.ext jdtls-ext-parent - 0.19.1 + 0.20.0 com.microsoft.jdtls.ext.activator eclipse-plugin diff --git a/jdtls.ext/com.microsoft.jdtls.ext.core/META-INF/MANIFEST.MF b/jdtls.ext/com.microsoft.jdtls.ext.core/META-INF/MANIFEST.MF index 821856f7..9522f485 100644 --- a/jdtls.ext/com.microsoft.jdtls.ext.core/META-INF/MANIFEST.MF +++ b/jdtls.ext/com.microsoft.jdtls.ext.core/META-INF/MANIFEST.MF @@ -2,7 +2,7 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: JDTLS EXT Core Bundle-SymbolicName: com.microsoft.jdtls.ext.core;singleton:=true -Bundle-Version: 0.19.1 +Bundle-Version: 0.20.0 Bundle-Activator: com.microsoft.jdtls.ext.core.JdtlsExtActivator Bundle-RequiredExecutionEnvironment: JavaSE-1.8 Bundle-ActivationPolicy: lazy diff --git a/jdtls.ext/com.microsoft.jdtls.ext.core/pom.xml b/jdtls.ext/com.microsoft.jdtls.ext.core/pom.xml index 52c2392c..ac0c184a 100644 --- a/jdtls.ext/com.microsoft.jdtls.ext.core/pom.xml +++ b/jdtls.ext/com.microsoft.jdtls.ext.core/pom.xml @@ -5,7 +5,7 @@ com.microsoft.jdtls.ext jdtls-ext-parent - 0.19.1 + 0.20.0 com.microsoft.jdtls.ext.core eclipse-plugin diff --git a/jdtls.ext/pom.xml b/jdtls.ext/pom.xml index c0786d0c..77a5f209 100644 --- a/jdtls.ext/pom.xml +++ b/jdtls.ext/pom.xml @@ -4,7 +4,7 @@ com.microsoft.jdtls.ext jdtls-ext-parent ${base.name} :: Parent - 0.19.1 + 0.20.0 pom Java Project Manager diff --git a/package-lock.json b/package-lock.json index 755cad3a..5e37164c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "vscode-java-dependency", - "version": "0.19.1", + "version": "0.20.0", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index cd2a512a..36a08385 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "vscode-java-dependency", "displayName": "Project Manager for Java", "description": "%description%", - "version": "0.19.1", + "version": "0.20.0", "publisher": "vscjava", "preview": true, "aiKey": "5c642b22-e845-4400-badb-3f8509a70777", @@ -42,7 +42,7 @@ "main": "./main.js", "contributes": { "javaExtensions": [ - "./server/com.microsoft.jdtls.ext.core-0.19.1.jar" + "./server/com.microsoft.jdtls.ext.core-0.20.0.jar" ], "commands": [ { From a16aad39b84601dd83afe1730e7ecfebf4dba7a8 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 24 Jun 2022 11:12:34 +0800 Subject: [PATCH 102/352] chore(deps): Bump got from 11.8.3 to 11.8.5 (#649) Bumps [got](https://github.com/sindresorhus/got) from 11.8.3 to 11.8.5. - [Release notes](https://github.com/sindresorhus/got/releases) - [Commits](https://github.com/sindresorhus/got/compare/v11.8.3...v11.8.5) --- updated-dependencies: - dependency-name: got dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 5e37164c..f8fbceaf 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1644,9 +1644,9 @@ } }, "got": { - "version": "11.8.3", - "resolved": "https://registry.npmjs.org/got/-/got-11.8.3.tgz", - "integrity": "sha512-7gtQ5KiPh1RtGS9/Jbv1ofDpBFuq42gyfEib+ejaRBJuj/3tQFeR5+gw57e4ipaU8c/rCjvX6fkQz2lyDlGAOg==", + "version": "11.8.5", + "resolved": "https://registry.npmjs.org/got/-/got-11.8.5.tgz", + "integrity": "sha512-o0Je4NvQObAuZPHLFoRSkdG2lTgtcynqymzg2Vupdx6PorhaT5MCbIyXG6d4D94kk8ZG57QeosgdiqfJWhEhlQ==", "dev": true, "requires": { "@sindresorhus/is": "^4.0.0", From 2d7c09977eb839d50c32fe6072c8f806546077b6 Mon Sep 17 00:00:00 2001 From: Sheng Chen Date: Tue, 28 Jun 2022 13:49:36 +0800 Subject: [PATCH 103/352] fix: Document symbol should not be dropped to Project explorer (#651) Signed-off-by: sheche --- src/views/DragAndDropController.ts | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/views/DragAndDropController.ts b/src/views/DragAndDropController.ts index 2f5e140b..4ce35aec 100644 --- a/src/views/DragAndDropController.ts +++ b/src/views/DragAndDropController.ts @@ -64,6 +64,12 @@ export class DragAndDropController implements TreeDragAndDropController Date: Tue, 28 Jun 2022 15:46:11 +0800 Subject: [PATCH 104/352] fix: Check file path as well when moving (#653) Signed-off-by: sheche --- src/views/DragAndDropController.ts | 22 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/src/views/DragAndDropController.ts b/src/views/DragAndDropController.ts index 4ce35aec..c86d224e 100644 --- a/src/views/DragAndDropController.ts +++ b/src/views/DragAndDropController.ts @@ -145,8 +145,7 @@ export class DragAndDropController implements TreeDragAndDropController Date: Wed, 29 Jun 2022 10:08:58 +0800 Subject: [PATCH 105/352] chore(deps): Bump vscode-extension-telemetry-wrapper to 0.13.1 (#655) Signed-off-by: Sheng Chen --- package-lock.json | 71 +++++++++++++++++++++++++++++++++++++---------- package.json | 2 +- 2 files changed, 58 insertions(+), 15 deletions(-) diff --git a/package-lock.json b/package-lock.json index f8fbceaf..9c642517 100644 --- a/package-lock.json +++ b/package-lock.json @@ -143,6 +143,45 @@ "@jridgewell/sourcemap-codec": "^1.4.10" } }, + "@microsoft/1ds-core-js": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/@microsoft/1ds-core-js/-/1ds-core-js-3.2.3.tgz", + "integrity": "sha512-796A8fd90oUKDRO7UXUT9BwZ3G+a9XzJj5v012FcCN/2qRhEsIV3x/0wkx2S08T4FiQEUPkB2uoYHpEjEneM7g==", + "requires": { + "@microsoft/applicationinsights-core-js": "2.8.4", + "@microsoft/applicationinsights-shims": "^2.0.1", + "@microsoft/dynamicproto-js": "^1.1.6" + } + }, + "@microsoft/1ds-post-js": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/@microsoft/1ds-post-js/-/1ds-post-js-3.2.3.tgz", + "integrity": "sha512-tcGJQXXr2LYoBbIXPoUVe1KCF3OtBsuKDFL7BXfmNtuSGtWF0yejm6H83DrR8/cUIGMRMUP9lqNlqFGwDYiwAQ==", + "requires": { + "@microsoft/1ds-core-js": "3.2.3", + "@microsoft/applicationinsights-shims": "^2.0.1", + "@microsoft/dynamicproto-js": "^1.1.6" + } + }, + "@microsoft/applicationinsights-core-js": { + "version": "2.8.4", + "resolved": "https://registry.npmjs.org/@microsoft/applicationinsights-core-js/-/applicationinsights-core-js-2.8.4.tgz", + "integrity": "sha512-FoA0FNOsFbJnLyTyQlYs6+HR7HMEa6nAOE6WOm9WVejBHMHQ/Bdb+hfVFi6slxwCimr/ner90jchi4/sIYdnyQ==", + "requires": { + "@microsoft/applicationinsights-shims": "2.0.1", + "@microsoft/dynamicproto-js": "^1.1.6" + } + }, + "@microsoft/applicationinsights-shims": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@microsoft/applicationinsights-shims/-/applicationinsights-shims-2.0.1.tgz", + "integrity": "sha512-G0MXf6R6HndRbDy9BbEj0zrLeuhwt2nsXk2zKtF0TnYo39KgYqhYC2ayIzKPTm2KAE+xzD7rgyLdZnrcRvt9WQ==" + }, + "@microsoft/dynamicproto-js": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/@microsoft/dynamicproto-js/-/dynamicproto-js-1.1.6.tgz", + "integrity": "sha512-D1Oivw1A4bIXhzBIy3/BBPn3p2On+kpO2NiYt9shICDK7L/w+cR6FFBUsBZ05l6iqzTeL+Jm8lAYn0g6G7DmDg==" + }, "@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -329,9 +368,13 @@ "dev": true }, "@vscode/extension-telemetry": { - "version": "0.4.9", - "resolved": "https://registry.npmjs.org/@vscode/extension-telemetry/-/extension-telemetry-0.4.9.tgz", - "integrity": "sha512-ZQIqlcgJU462oyQJDVgmEKNSSibEp1CRs0ECoa43gwgkt877Jm2dpz5G+KQhXad/zJy1sxTq8r/5kD75nq4W8Q==" + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/@vscode/extension-telemetry/-/extension-telemetry-0.6.2.tgz", + "integrity": "sha512-yb/wxLuaaCRcBAZtDCjNYSisAXz3FWsSqAha5nhHcYxx2ZPdQdWuZqVXGKq0ZpHVndBWWtK6XqtpCN2/HB4S1w==", + "requires": { + "@microsoft/1ds-core-js": "^3.2.3", + "@microsoft/1ds-post-js": "^3.2.3" + } }, "@webassemblyjs/ast": { "version": "1.11.1", @@ -1498,7 +1541,7 @@ "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", "dev": true }, "fsevents": { @@ -1806,7 +1849,7 @@ "inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", "dev": true, "requires": { "once": "^1.3.0", @@ -2527,7 +2570,7 @@ "path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", "dev": true }, "path-key": { @@ -3493,9 +3536,9 @@ "dev": true }, "uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==" }, "vsce": { "version": "2.7.0", @@ -3605,12 +3648,12 @@ } }, "vscode-extension-telemetry-wrapper": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/vscode-extension-telemetry-wrapper/-/vscode-extension-telemetry-wrapper-0.12.0.tgz", - "integrity": "sha512-4q8sLhi1Az//cPHTdfxuoVpAAIIiL2jiui2Ta79QnZJ6nXk48uGgAdiz739IUQgZ40RwFl/vpvSF4uZ0ZLPpvA==", + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/vscode-extension-telemetry-wrapper/-/vscode-extension-telemetry-wrapper-0.13.1.tgz", + "integrity": "sha512-EZH0rNqQXhl6vyoM+z2FGrlBVGNHBS4bRjw4wkCNce1IageaFhCJpElWdumQrxQRM2cBQRNkbUAe8d3LYrpMSQ==", "requires": { - "@vscode/extension-telemetry": "^0.4.9", - "uuid": "^3.4.0" + "@vscode/extension-telemetry": "^0.6.2", + "uuid": "^8.3.2" } }, "vscode-extension-tester": { diff --git a/package.json b/package.json index 36a08385..01aa820b 100644 --- a/package.json +++ b/package.json @@ -667,7 +667,7 @@ "lodash": "^4.17.21", "minimatch": "^3.1.2", "semver": "^7.3.7", - "vscode-extension-telemetry-wrapper": "^0.12.0", + "vscode-extension-telemetry-wrapper": "^0.13.1", "vscode-tas-client": "^0.1.47" } } From fde9b4fc2d4d458cf0e40fcf678813a8c34be7bb Mon Sep 17 00:00:00 2001 From: Sheng Chen Date: Tue, 5 Jul 2022 12:56:20 +0800 Subject: [PATCH 106/352] Remove symbolNode.ts (#657) Signed-off-by: sheche --- src/views/DragAndDropController.ts | 10 +++--- src/views/baseSymbolNode.ts | 47 --------------------------- src/views/documentSymbolNode.ts | 51 ++++++++++++++++++++++++------ src/views/symbolNode.ts | 47 --------------------------- 4 files changed, 46 insertions(+), 109 deletions(-) delete mode 100644 src/views/baseSymbolNode.ts delete mode 100644 src/views/symbolNode.ts diff --git a/src/views/DragAndDropController.ts b/src/views/DragAndDropController.ts index c86d224e..62135a43 100644 --- a/src/views/DragAndDropController.ts +++ b/src/views/DragAndDropController.ts @@ -5,7 +5,6 @@ import * as path from "path"; import * as fse from "fs-extra"; import { DataTransfer, DataTransferItem, TreeDragAndDropController, Uri, window, workspace, WorkspaceEdit } from "vscode"; import { Explorer } from "../constants"; -import { BaseSymbolNode } from "./baseSymbolNode"; import { ContainerNode, ContainerType } from "./containerNode"; import { DataNode } from "./dataNode"; import { ExplorerNode } from "./explorerNode"; @@ -19,6 +18,7 @@ import { ProjectNode } from "./projectNode"; import { WorkspaceNode } from "./workspaceNode"; import { addLibraryGlobs } from "../controllers/libraryController"; import { sendError, sendInfo } from "vscode-extension-telemetry-wrapper"; +import { DocumentSymbolNode } from "./documentSymbolNode"; export class DragAndDropController implements TreeDragAndDropController { @@ -91,10 +91,10 @@ export class DragAndDropController implements TreeDragAndDropController = new Map([ - [SymbolKind.Package, "package"], - [SymbolKind.Class, "class"], - [SymbolKind.Interface, "interface"], - [SymbolKind.Enum, "enum"], - [SymbolKind.EnumMember, "enum-member"], - [SymbolKind.Constant, "constant"], - [SymbolKind.Method, "method"], - [SymbolKind.Function, "method"], - [SymbolKind.Constructor, "method"], - [SymbolKind.Field, "field"], - [SymbolKind.Property, "property"], - [SymbolKind.Variable, "variable"], - ]); - - constructor(public readonly symbolInfo: SymbolInformation | DocumentSymbol, parent: PrimaryTypeNode) { - super(parent); - } - - public abstract get range(): Range; - - protected get iconPath(): ThemeIcon { - if (BaseSymbolNode._iconMap.has(this.symbolInfo.kind)) { - const symbolKind = BaseSymbolNode._iconMap.get(this.symbolInfo.kind); - return new ThemeIcon(`symbol-${symbolKind}`); - } - return new ThemeIcon("symbol-misc"); - } - - protected get command(): Command { - return { - title: "Go to outline", - command: Commands.VIEW_PACKAGE_OUTLINE, - arguments: [(this.getParent() as PrimaryTypeNode).uri, this.range], - }; - } -} diff --git a/src/views/documentSymbolNode.ts b/src/views/documentSymbolNode.ts index 6fe22386..a6ead753 100644 --- a/src/views/documentSymbolNode.ts +++ b/src/views/documentSymbolNode.ts @@ -1,22 +1,37 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT license. -import { DocumentSymbol, Range, TreeItem, TreeItemCollapsibleState } from "vscode"; +import { Command, DocumentSymbol, Range, SymbolKind, ThemeIcon, TreeItem, TreeItemCollapsibleState } from "vscode"; +import { Commands } from "../commands"; import { Explorer } from "../constants"; -import { BaseSymbolNode } from "./baseSymbolNode"; import { ExplorerNode } from "./explorerNode"; import { PrimaryTypeNode } from "./PrimaryTypeNode"; -export class DocumentSymbolNode extends BaseSymbolNode { +export class DocumentSymbolNode extends ExplorerNode { - constructor(symbolInfo: DocumentSymbol, parent: PrimaryTypeNode) { - super(symbolInfo, parent); + private readonly _iconMap: Map = new Map([ + [SymbolKind.Package, "package"], + [SymbolKind.Class, "class"], + [SymbolKind.Interface, "interface"], + [SymbolKind.Enum, "enum"], + [SymbolKind.EnumMember, "enum-member"], + [SymbolKind.Constant, "constant"], + [SymbolKind.Method, "method"], + [SymbolKind.Function, "method"], + [SymbolKind.Constructor, "method"], + [SymbolKind.Field, "field"], + [SymbolKind.Property, "property"], + [SymbolKind.Variable, "variable"], + ]); + + constructor(private readonly symbolInfo: DocumentSymbol, parent: PrimaryTypeNode) { + super(parent); } public getChildren(): ExplorerNode[] | Promise { const res: ExplorerNode[] = []; - if (this.symbolInfo && (this.symbolInfo).children && (this.symbolInfo).children.length) { - (this.symbolInfo).children.forEach((child) => { + if (this.symbolInfo?.children?.length) { + this.symbolInfo.children.forEach((child) => { res.push(new DocumentSymbolNode(child, this.getParent() as PrimaryTypeNode)); }); } @@ -25,8 +40,8 @@ export class DocumentSymbolNode extends BaseSymbolNode { public getTreeItem(): TreeItem | Promise { const item = new TreeItem(this.symbolInfo.name, - ((this.symbolInfo).children && (this.symbolInfo).children.length) - ? TreeItemCollapsibleState.Collapsed : TreeItemCollapsibleState.None); + this.symbolInfo?.children?.length ? TreeItemCollapsibleState.Collapsed + : TreeItemCollapsibleState.None); item.iconPath = this.iconPath; item.command = this.command; return item; @@ -34,10 +49,26 @@ export class DocumentSymbolNode extends BaseSymbolNode { public get range(): Range { // Using `selectionRange` instead of `range` to make sure the cursor will be pointing to the codes, not the comments - return (this.symbolInfo).selectionRange; + return this.symbolInfo.selectionRange; } public computeContextValue(): string | undefined { return `java:${Explorer.ContextValueType.Symbol}`; } + + protected get iconPath(): ThemeIcon { + if (this._iconMap.has(this.symbolInfo.kind)) { + const symbolKind = this._iconMap.get(this.symbolInfo.kind); + return new ThemeIcon(`symbol-${symbolKind}`); + } + return new ThemeIcon("symbol-misc"); + } + + protected get command(): Command { + return { + title: "Go to outline", + command: Commands.VIEW_PACKAGE_OUTLINE, + arguments: [(this.getParent() as PrimaryTypeNode).uri, this.range], + }; + } } diff --git a/src/views/symbolNode.ts b/src/views/symbolNode.ts deleted file mode 100644 index 1505a079..00000000 --- a/src/views/symbolNode.ts +++ /dev/null @@ -1,47 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT license. - -import { Range, SymbolInformation, TreeItem, TreeItemCollapsibleState } from "vscode"; -import { Explorer } from "../constants"; -import { ITypeRootNodeData } from "../java/typeRootNodeData"; -import { BaseSymbolNode } from "./baseSymbolNode"; -import { ExplorerNode } from "./explorerNode"; -import { PrimaryTypeNode } from "./PrimaryTypeNode"; - -export class SymbolNode extends BaseSymbolNode { - private _children?: SymbolInformation[]; - - constructor(symbolInfo: SymbolInformation, parent: PrimaryTypeNode) { - super(symbolInfo, parent); - } - - public getChildren(): ExplorerNode[] | Promise { - const res: ExplorerNode[] = []; - if (this._children?.length) { - this._children.forEach((child) => { - res.push(new SymbolNode(child, this.getParent() as PrimaryTypeNode)); - }); - } - return res; - } - - public getTreeItem(): TreeItem | Promise { - const parentData = (this.getParent()).nodeData; - if (parentData && parentData.symbolTree) { - this._children = parentData.symbolTree.get(this.symbolInfo.name); - } - const item = new TreeItem(this.symbolInfo.name, - (this._children && this._children.length) ? TreeItemCollapsibleState.Collapsed : TreeItemCollapsibleState.None); - item.iconPath = this.iconPath; - item.command = this.command; - return item; - } - - public get range(): Range { - return (this.symbolInfo).location.range; - } - - public computeContextValue(): string | undefined { - return `java:${Explorer.ContextValueType.Symbol}`; - } -} From c04125058a2558436f7f4a398c56001d8fe0bde3 Mon Sep 17 00:00:00 2001 From: Sheng Chen Date: Wed, 6 Jul 2022 15:15:13 +0800 Subject: [PATCH 107/352] chore: Bump dependencies version (#658) Signed-off-by: Sheng Chen --- package-lock.json | 647 +++++++++++++++------------------------------- package.json | 12 +- 2 files changed, 221 insertions(+), 438 deletions(-) diff --git a/package-lock.json b/package-lock.json index 9c642517..acd09fc5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -89,9 +89,9 @@ } }, "@discoveryjs/json-ext": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.6.tgz", - "integrity": "sha512-ws57AidsDvREKrZKYffXddNkyaF14iHNHm8VQnZH6t99E8gczjNN0GpvcGny0imC80yQ0tHz1xVUKk/KFQSUyA==", + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", + "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", "dev": true }, "@jridgewell/gen-mapping": { @@ -329,9 +329,9 @@ "dev": true }, "@types/node": { - "version": "14.18.20", - "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.20.tgz", - "integrity": "sha512-Q8KKwm9YqEmUBRsqJ2GWJDtXltBDxTdC4m5vTdXBolu2PeQh8LX+f6BTwU+OuXPu37fLxoN6gidqBmnky36FXA==", + "version": "14.18.21", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.21.tgz", + "integrity": "sha512-x5W9s+8P4XteaxT/jKF0PSb7XEvo5VmqEWgsMlyeY4ZlLK8I6aH6g5TPPyDlLAep+GYf4kefb7HFyc7PAO3m+Q==", "dev": true }, "@types/responselike": { @@ -344,15 +344,18 @@ } }, "@types/selenium-webdriver": { - "version": "3.0.19", - "resolved": "https://registry.npmjs.org/@types/selenium-webdriver/-/selenium-webdriver-3.0.19.tgz", - "integrity": "sha512-OFUilxQg+rWL2FMxtmIgCkUDlJB6pskkpvmew7yeXfzzsOBb5rc+y2+DjHm+r3r1ZPPcJefK3DveNSYWGiy68g==", - "dev": true + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@types/selenium-webdriver/-/selenium-webdriver-4.1.1.tgz", + "integrity": "sha512-NxxZZek50ylIACiXebKQYHD3D4One3WXOasEXWazL6aTfYbZob7ClNKxUpg8I4/oWArX87oPWvj1cHKqfel3Hg==", + "dev": true, + "requires": { + "@types/ws": "*" + } }, "@types/semver": { - "version": "7.3.9", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.3.9.tgz", - "integrity": "sha512-L/TMpyURfBkf+o/526Zb6kd/tchUP3iBDEPjqjb+U2MAJhVRxxrmr2fwpe08E7QsV7YLcpq0tUaQ9O9x97ZIxQ==", + "version": "7.3.10", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.3.10.tgz", + "integrity": "sha512-zsv3fsC7S84NN6nPK06u79oWgrPVd0NvOyqgghV1haPaFcVxIrP4DLomRwGAXk0ui4HZA7mOcSFL98sMVW9viw==", "dev": true }, "@types/vscode": { @@ -361,6 +364,15 @@ "integrity": "sha512-ZfJck4M7nrGasfs4A4YbUoxis3Vu24cETw3DERsNYtDZmYSYtk6ljKexKFKhImO/ZmY6ZMsmegu2FPkXoUFImA==", "dev": true }, + "@types/ws": { + "version": "8.5.3", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.3.tgz", + "integrity": "sha512-6YOoWjruKj1uLf3INHH7D3qTXwFfEsg1kf3c0uDdSBJwfa/llkwIjrAGV7j7mVgGNbzTQ3HiHKKDXl6bJPD97w==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, "@ungap/promise-all-settled": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz", @@ -523,24 +535,24 @@ } }, "@webpack-cli/configtest": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-1.1.1.tgz", - "integrity": "sha512-1FBc1f9G4P/AxMqIgfZgeOTuRnwZMten8E7zap5zgpPInnCrP8D4Q81+4CWIch8i/Nf7nXjP0v6CjjbHOrXhKg==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-1.2.0.tgz", + "integrity": "sha512-4FB8Tj6xyVkyqjj1OaTqCjXYULB9FMkqQ8yGrZjRDrYh0nOE+7Lhs45WioWQQMV+ceFlE368Ukhe6xdvJM9Egg==", "dev": true }, "@webpack-cli/info": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-1.4.1.tgz", - "integrity": "sha512-PKVGmazEq3oAo46Q63tpMr4HipI3OPfP7LiNOEJg963RMgT0rqheag28NCML0o3GIzA3DmxP1ZIAv9oTX1CUIA==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-1.5.0.tgz", + "integrity": "sha512-e8tSXZpw2hPl2uMJY6fsMswaok5FdlGNRTktvFk2sD8RjH0hE2+XistawJx1vmKteh4NmGmNUrp+Tb2w+udPcQ==", "dev": true, "requires": { "envinfo": "^7.7.3" } }, "@webpack-cli/serve": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-1.6.1.tgz", - "integrity": "sha512-gNGTiTrjEVQ0OcVnzsRSqTxaBSr+dmTfm+qJsCDluky8uhdLWep7Gcr62QsAKHTMxjCS/8nEITsmFAhfIx+QSw==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-1.7.0.tgz", + "integrity": "sha512-oxnCNGj88fL+xzV+dacXs44HcDwf1ovs3AuEzvP7mqXw7fQntqIhQ1BRmynh4qEKQSSSRSWVyXRjmTbZIX9V2Q==", "dev": true }, "@xtuc/ieee754": { @@ -600,12 +612,6 @@ "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", "dev": true }, - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, "ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", @@ -625,28 +631,12 @@ "picomatch": "^2.0.4" } }, - "aproba": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", - "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", - "dev": true - }, "arch": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/arch/-/arch-2.2.0.tgz", "integrity": "sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==", "dev": true }, - "are-we-there-yet": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.7.tgz", - "integrity": "sha512-nxwy40TuMiUGqMyRHgCSWZ9FM4VAoRP4xUYSTv5ImRog+h9yISPbVH7H8fASCIzYn9wlEv4zvFL7uKDMCFQm3g==", - "dev": true, - "requires": { - "delegates": "^1.0.0", - "readable-stream": "^2.0.6" - } - }, "argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", @@ -728,7 +718,7 @@ "boolbase": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", "dev": true }, "brace-expansion": { @@ -796,13 +786,13 @@ "buffer-crc32": { "version": "0.2.13", "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", - "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=", + "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", "dev": true }, "buffer-fill": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz", - "integrity": "sha1-+PeLdniYiO858gXNY39o5wISKyw=", + "integrity": "sha512-T7zexNBwiiaCOGDg9xNX9PBmjrubblRkENuptryuI64URkXDFum9il/JGL8Lm8wYfAXpredVXXZz7eMHilimiQ==", "dev": true }, "buffer-from": { @@ -903,39 +893,32 @@ } }, "cheerio": { - "version": "1.0.0-rc.10", - "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.10.tgz", - "integrity": "sha512-g0J0q/O6mW8z5zxQ3A8E8J1hUgp4SMOvEoW/x84OwyHKe/Zccz83PVT4y5Crcr530FV6NgmKI1qvGTKVl9XXVw==", - "dev": true, - "requires": { - "cheerio-select": "^1.5.0", - "dom-serializer": "^1.3.2", - "domhandler": "^4.2.0", - "htmlparser2": "^6.1.0", - "parse5": "^6.0.1", - "parse5-htmlparser2-tree-adapter": "^6.0.1", - "tslib": "^2.2.0" - }, - "dependencies": { - "tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", - "dev": true - } + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.12.tgz", + "integrity": "sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q==", + "dev": true, + "requires": { + "cheerio-select": "^2.1.0", + "dom-serializer": "^2.0.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1", + "htmlparser2": "^8.0.1", + "parse5": "^7.0.0", + "parse5-htmlparser2-tree-adapter": "^7.0.0" } }, "cheerio-select": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-1.6.0.tgz", - "integrity": "sha512-eq0GdBvxVFbqWgmCm7M3XGs1I8oLy/nExUnh6oLqmBditPO9AqQJrkslDpMun/hZ0yyTs8L0m85OHp4ho6Qm9g==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-2.1.0.tgz", + "integrity": "sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==", "dev": true, "requires": { - "css-select": "^4.3.0", - "css-what": "^6.0.1", - "domelementtype": "^2.2.0", - "domhandler": "^4.3.1", - "domutils": "^2.8.0" + "boolbase": "^1.0.0", + "css-select": "^5.1.0", + "css-what": "^6.1.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1" } }, "chokidar": { @@ -1047,18 +1030,12 @@ "clone-response": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz", - "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=", + "integrity": "sha512-yjLXh88P599UOyPTFX0POsd7WxnbsVsGohcwzHOLspIhhpalPw1BcqED8NblyZLKcGrL8dTgMlcaZxV2jAD41Q==", "dev": true, "requires": { "mimic-response": "^1.0.0" } }, - "code-point-at": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", - "dev": true - }, "color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -1075,9 +1052,9 @@ "dev": true }, "colorette": { - "version": "2.0.16", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.16.tgz", - "integrity": "sha512-hUewv7oMjCp+wkBv5Rm0v87eJhq4woh5rSR+42YSQJKecCqgIqNkZ6lAlQms/BwHPJA5NKMRlpxPRv0n8HQW6g==", + "version": "2.0.19", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.19.tgz", + "integrity": "sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==", "dev": true }, "commander": { @@ -1093,9 +1070,9 @@ "dev": true }, "compress-brotli": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/compress-brotli/-/compress-brotli-1.3.6.tgz", - "integrity": "sha512-au99/GqZtUtiCBliqLFbWlhnCxn+XSYjwZ77q6mKN4La4qOXDoLVPZ50iXr0WmAyMxl8yqoq3Yq4OeQNPPkyeQ==", + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/compress-brotli/-/compress-brotli-1.3.8.tgz", + "integrity": "sha512-lVcQsjhxhIXsuupfy9fmZUFtAIdBmXA7EGY6GBdgZ++qkM9zG4YFT8iU7FoBxzryNDMOpD1HIFHUSX4D87oqhQ==", "dev": true, "requires": { "@types/json-buffer": "~3.0.0", @@ -1107,12 +1084,6 @@ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" }, - "console-control-strings": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", - "dev": true - }, "copy-webpack-plugin": { "version": "9.1.0", "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-9.1.0.tgz", @@ -1164,15 +1135,15 @@ } }, "css-select": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", - "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", + "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==", "dev": true, "requires": { "boolbase": "^1.0.0", - "css-what": "^6.0.1", - "domhandler": "^4.3.1", - "domutils": "^2.8.0", + "css-what": "^6.1.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", "nth-check": "^2.0.1" } }, @@ -1226,12 +1197,6 @@ "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", "dev": true }, - "delegates": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", - "dev": true - }, "detect-libc": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.1.tgz", @@ -1253,14 +1218,14 @@ } }, "dom-serializer": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", - "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", "dev": true, "requires": { - "domelementtype": "^2.0.1", - "domhandler": "^4.2.0", - "entities": "^2.0.0" + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" } }, "domelementtype": { @@ -1270,23 +1235,23 @@ "dev": true }, "domhandler": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", - "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", "dev": true, "requires": { - "domelementtype": "^2.2.0" + "domelementtype": "^2.3.0" } }, "domutils": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", - "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.0.1.tgz", + "integrity": "sha512-z08c1l761iKhDFtfXO04C7kTdPBLi41zwOZl00WS8b5eiaebNpY00HKbztwBq+e3vyqWNwWF3mP9YLUeqIrF+Q==", "dev": true, "requires": { - "dom-serializer": "^1.0.1", - "domelementtype": "^2.2.0", - "domhandler": "^4.2.0" + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.1" } }, "duplexer2": { @@ -1320,9 +1285,9 @@ } }, "enhanced-resolve": { - "version": "5.9.2", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.9.2.tgz", - "integrity": "sha512-GIm3fQfwLJ8YZx2smuHpBKkXC1yOk+OBEmKckVyL0i/ea8mqDEykK3ld5dgH1QYPNyT/lIllxV2LULnxCHaHkA==", + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.10.0.tgz", + "integrity": "sha512-T0yTFjdpldGY8PmuXXR0PyQ1ufZpEGiHVrp7zHKB7jdR4qlmZHhONVM5AQOAWXuF/w3dnHbEQVrNptJgt7F+cQ==", "dev": true, "requires": { "graceful-fs": "^4.2.4", @@ -1330,9 +1295,9 @@ } }, "entities": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", - "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.3.1.tgz", + "integrity": "sha512-o4q/dYJlmyjP2zfnaWDUC6A3BQFmVTX+tZPezK7k0GLSU9QYCauscf5Y+qcEPzKL+EixVouYDgLQK5H9GrLpkg==", "dev": true }, "envinfo": { @@ -1487,7 +1452,7 @@ "fd-slicer": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", - "integrity": "sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4=", + "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", "dev": true, "requires": { "pend": "~1.2.0" @@ -1589,22 +1554,6 @@ "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", "dev": true }, - "gauge": { - "version": "2.7.4", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", - "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", - "dev": true, - "requires": { - "aproba": "^1.0.3", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.0", - "object-assign": "^4.1.0", - "signal-exit": "^3.0.0", - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wide-align": "^1.1.0" - } - }, "get-caller-file": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", @@ -1612,14 +1561,14 @@ "dev": true }, "get-intrinsic": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", - "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.2.tgz", + "integrity": "sha512-Jfm3OyCxHh9DJyc28qGk+JmfkpO41A4XkneDSujN9MDXrm4oDKdHvndhZ2dN94+ERNfkYJWDclW6k2L/ZGHjXA==", "dev": true, "requires": { "function-bind": "^1.1.1", "has": "^1.0.3", - "has-symbols": "^1.0.1" + "has-symbols": "^1.0.3" } }, "get-stream": { @@ -1634,7 +1583,7 @@ "github-from-package": { "version": "0.0.0", "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", - "integrity": "sha1-l/tdlr/eiXMxPyDoKI75oWf6ZM4=", + "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==", "dev": true }, "glob": { @@ -1737,12 +1686,6 @@ "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", "dev": true }, - "has-unicode": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", - "dev": true - }, "he": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", @@ -1765,15 +1708,15 @@ "dev": true }, "htmlparser2": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", - "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.1.tgz", + "integrity": "sha512-4lVbmc1diZC7GUJQtRQ5yBAeUCL1exyMwmForWkRLnwyzWBFxN633SALPMGYaWZvKe9j1pRZJpauvmxENSp/EA==", "dev": true, "requires": { - "domelementtype": "^2.0.1", - "domhandler": "^4.0.0", - "domutils": "^2.5.2", - "entities": "^2.0.0" + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", + "entities": "^4.3.0" } }, "http-cache-semantics": { @@ -1813,12 +1756,6 @@ "debug": "4" } }, - "human-signals": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", - "dev": true - }, "ieee754": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", @@ -1833,7 +1770,7 @@ "immediate": { "version": "3.0.6", "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", - "integrity": "sha1-nbHb0Pr43m++D13V5Wu2BigN5ps=", + "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==", "dev": true }, "import-local": { @@ -1903,15 +1840,6 @@ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=" }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dev": true, - "requires": { - "number-is-nan": "^1.0.0" - } - }, "is-glob": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", @@ -1943,7 +1871,7 @@ "is-stream": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==", "dev": true }, "is-unicode-supported": { @@ -1976,7 +1904,7 @@ "isobject": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", "dev": true }, "jest-worker": { @@ -2033,15 +1961,15 @@ } }, "jszip": { - "version": "3.9.1", - "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.9.1.tgz", - "integrity": "sha512-H9A60xPqJ1CuC4Ka6qxzXZeU8aNmgOeP5IFqwJbQQwtu2EUYxota3LdsiZWplF7Wgd9tkAd0mdu36nceSaPuYw==", + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.10.0.tgz", + "integrity": "sha512-LDfVtOLtOxb9RXkYOwPyNBTQDL4eUbqahtoY6x07GiDJHwSYvn8sHHIw8wINImV3MqbMNve2gSuM1DDqEKk09Q==", "dev": true, "requires": { "lie": "~3.3.0", "pako": "~1.0.2", "readable-stream": "~2.3.6", - "set-immediate-shim": "~1.0.1" + "setimmediate": "^1.0.5" } }, "keytar": { @@ -2055,12 +1983,12 @@ } }, "keyv": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.2.2.tgz", - "integrity": "sha512-uYS0vKTlBIjNCAUqrjlxmruxOEiZxZIHXyp32sdcGmP+ukFrmWUnE//RcPXJH3Vxrni1H2gsQbjHE0bH7MtMQQ==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.3.2.tgz", + "integrity": "sha512-kn8WmodVBe12lmHpA6W8OY7SNh6wVR+Z+wZESF4iF5FCazaVXGWOtnbnvX0tMQ1bO+/TmOD9LziuYMvrIIs0xw==", "dev": true, "requires": { - "compress-brotli": "^1.3.6", + "compress-brotli": "^1.3.8", "json-buffer": "3.0.1" } }, @@ -2168,7 +2096,7 @@ "mdurl": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", - "integrity": "sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4=", + "integrity": "sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==", "dev": true }, "merge-stream": { @@ -2212,12 +2140,6 @@ "mime-db": "1.52.0" } }, - "mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true - }, "mimic-response": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", @@ -2334,9 +2256,9 @@ } }, "monaco-page-objects": { - "version": "1.9.2", - "resolved": "https://registry.npmjs.org/monaco-page-objects/-/monaco-page-objects-1.9.2.tgz", - "integrity": "sha512-1/JHv0ZwGnoWfq23IyP5PVLRq8NC0YXIoP6jG02R5Ev73hDznwJ3xTEVMzzpRPRGfMyVK4JNaA1aqax82jzaQA==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/monaco-page-objects/-/monaco-page-objects-2.0.0.tgz", + "integrity": "sha512-+nMHbbQIsxpBqn0semRpAaa24L+RORi+RKD3yoTIzZQLCBqhsgjksqX+c3mIFpvIQDLGUxS5MKZoo1xRpkKd2g==", "dev": true, "requires": { "clipboardy": "^2.3.0", @@ -2383,9 +2305,9 @@ "dev": true }, "node-abi": { - "version": "3.15.0", - "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.15.0.tgz", - "integrity": "sha512-Ic6z/j6I9RLm4ov7npo1I48UQr2BEyFCqh6p7S1dhEx9jPO0GPGq/e2Rb7x7DroQrmiVMz/Bw1vJm9sPAl2nxA==", + "version": "3.22.0", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.22.0.tgz", + "integrity": "sha512-u4uAs/4Zzmp/jjsD9cyFYDXeISfUWaAVWshPmDZOFOv4Xl4SbzTXm53I04C2uRueYJ+0t5PEtLH/owbn2Npf/w==", "dev": true, "requires": { "semver": "^7.3.5" @@ -2418,49 +2340,25 @@ "npm-run-path": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", - "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "integrity": "sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==", "dev": true, "requires": { "path-key": "^2.0.0" } }, - "npmlog": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", - "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", - "dev": true, - "requires": { - "are-we-there-yet": "~1.1.2", - "console-control-strings": "~1.1.0", - "gauge": "~2.7.3", - "set-blocking": "~2.0.0" - } - }, "nth-check": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.0.1.tgz", - "integrity": "sha512-it1vE95zF6dTT9lBsYbxvqh0Soy4SPowchj0UBGj/V6cTPnXXtQOPUbhZ6CmGzAD/rW22LQK6E96pcdJXk4A4w==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", "dev": true, "requires": { "boolbase": "^1.0.0" } }, - "number-is-nan": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", - "dev": true - }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", - "dev": true - }, "object-inspect": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.0.tgz", - "integrity": "sha512-Ho2z80bVIvJloH+YzRmpZVQe87+qASmBUKZDWgx9cu+KDrX2ZDH/3tMy+gXbZETVGs2M8YdxObOh7XAtim9Y0g==", + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", + "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==", "dev": true }, "once": { @@ -2472,21 +2370,6 @@ "wrappy": "1" } }, - "onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dev": true, - "requires": { - "mimic-fn": "^2.1.0" - } - }, - "os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", - "dev": true - }, "p-cancelable": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz", @@ -2496,7 +2379,7 @@ "p-finally": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", + "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==", "dev": true }, "p-limit": { @@ -2532,7 +2415,7 @@ "parse-semver": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/parse-semver/-/parse-semver-1.1.1.tgz", - "integrity": "sha1-mkr9bfBj3Egm+T+6SpnPIj9mbLg=", + "integrity": "sha512-Eg1OuNntBMH0ojvEKSrvDSnwLmvVuUOSdylH/pSCPNMIspLlweJyIWXCE+k/5hm3cj/EBUYwmWkjhBALNP4LXQ==", "dev": true, "requires": { "semver": "^5.1.0" @@ -2547,18 +2430,22 @@ } }, "parse5": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", - "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", - "dev": true + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.0.0.tgz", + "integrity": "sha512-y/t8IXSPWTuRZqXc0ajH/UwDj4mnqLEbSttNbThcFhGrZuOyoyvNBO85PBp2jQa55wY9d07PBNjsK8ZP3K5U6g==", + "dev": true, + "requires": { + "entities": "^4.3.0" + } }, "parse5-htmlparser2-tree-adapter": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-6.0.1.tgz", - "integrity": "sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.0.0.tgz", + "integrity": "sha512-B77tOZrqqfUfnVcOrUvfdLbz4pu4RopLD/4vmu3HUPswwTA8OH0EMW9BlWR2B0RCoiZRAHEUu7IxeP1Pd1UU+g==", "dev": true, "requires": { - "parse5": "^6.0.1" + "domhandler": "^5.0.2", + "parse5": "^7.0.0" } }, "path-exists": { @@ -2576,7 +2463,7 @@ "path-key": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", "dev": true }, "path-parse": { @@ -2593,7 +2480,7 @@ "pend": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", - "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=", + "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", "dev": true }, "picocolors": { @@ -2656,9 +2543,9 @@ } }, "prebuild-install": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.0.tgz", - "integrity": "sha512-CNcMgI1xBypOyGqjp3wOc8AAo1nMhZS3Cwd3iHIxOdAUbb+YxdNuM4Z5iIrZ8RLvOsf3F3bl7b7xGq6DjQoNYA==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.1.tgz", + "integrity": "sha512-jAXscXWMcCK8GgCoHOfIr0ODh5ai8mj63L2nWrjuAgXE6tDyYGnx4/8o/rCgU+B4JSyZBKbeZqzhtwtC3ovxjw==", "dev": true, "requires": { "detect-libc": "^2.0.0", @@ -2668,7 +2555,6 @@ "mkdirp-classic": "^0.5.3", "napi-build-utils": "^1.0.1", "node-abi": "^3.3.0", - "npmlog": "^4.0.1", "pump": "^3.0.0", "rc": "^1.2.7", "simple-get": "^4.0.0", @@ -2748,9 +2634,9 @@ "dev": true }, "qs": { - "version": "6.10.3", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.3.tgz", - "integrity": "sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==", + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", "dev": true, "requires": { "side-channel": "^1.0.4" @@ -2791,7 +2677,7 @@ "strip-json-comments": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", + "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", "dev": true } } @@ -2799,7 +2685,7 @@ "read": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/read/-/read-1.0.7.tgz", - "integrity": "sha1-s9oZvQUkMal2cdRKQmNK33ELQMQ=", + "integrity": "sha512-rSOKNYUmaxy0om1BNjMN4ezNT6VKK+2xF4GBhc81mkH7L60i6dp8qPYrkndNLT3QPphoII3maL9PVC9XmhHwVQ==", "dev": true, "requires": { "mute-stream": "~0.0.4" @@ -2948,26 +2834,14 @@ } }, "selenium-webdriver": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/selenium-webdriver/-/selenium-webdriver-3.6.0.tgz", - "integrity": "sha512-WH7Aldse+2P5bbFBO4Gle/nuQOdVwpHMTL6raL3uuBj/vPG07k6uzt3aiahu352ONBr5xXh0hDlM3LhtXPOC4Q==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/selenium-webdriver/-/selenium-webdriver-4.3.0.tgz", + "integrity": "sha512-9XFr8w95BO7jageR61AtiB83fJNem3fdtOQcUpqIIDHWSxihomyG/yBlL1H4y/shi/dO/Ai3PJMAOG+OW3+JHw==", "dev": true, "requires": { - "jszip": "^3.1.3", - "rimraf": "^2.5.4", - "tmp": "0.0.30", - "xml2js": "^0.4.17" - }, - "dependencies": { - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - } + "jszip": "^3.10.0", + "tmp": "^0.2.1", + "ws": ">=8.7.0" } }, "semver": { @@ -2987,18 +2861,6 @@ "randombytes": "^2.1.0" } }, - "set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", - "dev": true - }, - "set-immediate-shim": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz", - "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=", - "dev": true - }, "setimmediate": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", @@ -3017,7 +2879,7 @@ "shebang-command": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", "dev": true, "requires": { "shebang-regex": "^1.0.0" @@ -3026,7 +2888,7 @@ "shebang-regex": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", "dev": true }, "side-channel": { @@ -3090,17 +2952,6 @@ "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", "dev": true }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dev": true, - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - }, "string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", @@ -3118,25 +2969,10 @@ } } }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, "strip-eof": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", - "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", - "dev": true - }, - "strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "integrity": "sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q==", "dev": true }, "strip-json-comments": { @@ -3208,7 +3044,7 @@ "targz": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/targz/-/targz-1.0.1.tgz", - "integrity": "sha1-j3alI2lM3t+7XWCkB2/27uzFOY8=", + "integrity": "sha512-6q4tP9U55mZnRuMTBqnqc3nwYQY3kv+QthCFZuMk+Tn1qYUnMPmL/JZ/mzgXINzFpSqfU+242IFmFU9VPvqaQw==", "dev": true, "requires": { "tar-fs": "^1.8.1" @@ -3248,12 +3084,12 @@ } }, "tmp": { - "version": "0.0.30", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.30.tgz", - "integrity": "sha1-ckGdSovn1s51FI/YsyTlk6cRwu0=", + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", + "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", "dev": true, "requires": { - "os-tmpdir": "~1.0.1" + "rimraf": "^3.0.0" } }, "to-buffer": { @@ -3279,7 +3115,7 @@ "truncate-utf8-bytes": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/truncate-utf8-bytes/-/truncate-utf8-bytes-1.0.2.tgz", - "integrity": "sha1-QFkjkJWS1W94pYGENLC3hInKXys=", + "integrity": "sha512-95Pu1QXQvruGEhv62XCMO3Mm90GscOCClvrIUwCM0PYOXK3kaF3l3sIHxx71ThJfcbM2O5Au6SO3AWCSEfW4mQ==", "dev": true, "requires": { "utf8-byte-length": "^1.0.1" @@ -3292,9 +3128,9 @@ "dev": true }, "ts-loader": { - "version": "9.3.0", - "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.3.0.tgz", - "integrity": "sha512-2kLLAdAD+FCKijvGKi9sS0OzoqxLCF3CxHpok7rVgCZ5UldRzH0TkbwG9XECKjBzHsAewntC5oDaI/FwKzEUog==", + "version": "9.3.1", + "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.3.1.tgz", + "integrity": "sha512-OkyShkcZTsTwyS3Kt7a4rsT/t2qvEVQuKCTg4LJmpj9fhFR7ukGdZwV6Qq3tRUkqcXtfGpPR7+hFKHCG/0d3Lw==", "dev": true, "requires": { "chalk": "^4.1.0", @@ -3440,16 +3276,16 @@ "tunnel-agent": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", "dev": true, "requires": { "safe-buffer": "^5.0.1" } }, "typed-rest-client": { - "version": "1.8.6", - "resolved": "https://registry.npmjs.org/typed-rest-client/-/typed-rest-client-1.8.6.tgz", - "integrity": "sha512-xcQpTEAJw2DP7GqVNECh4dD+riS+C1qndXLfBCJ3xk0kqprtGN491P5KlmrDbKdtuW8NEcP/5ChxiJI3S9WYTA==", + "version": "1.8.9", + "resolved": "https://registry.npmjs.org/typed-rest-client/-/typed-rest-client-1.8.9.tgz", + "integrity": "sha512-uSmjE38B80wjL85UFX3sTYEUlvZ1JgCRhsWj/fJ4rZ0FqDUFoIuodtiVeE+cUqiVTOKPdKrp/sdftD15MDek6g==", "dev": true, "requires": { "qs": "^6.9.1", @@ -3458,9 +3294,9 @@ } }, "typescript": { - "version": "4.7.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.7.3.tgz", - "integrity": "sha512-WOkT3XYvrpXx4vMMqlD+8R8R37fZkjyLGlxavMc4iB8lrl8L0DeTcHbYgw/v0N/z9wAFsgBhcsF0ruoySS22mA==", + "version": "4.7.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.7.4.tgz", + "integrity": "sha512-C0WQT0gezHuw6AdY1M2jxUO83Rjf0HP7Sk1DtXj6j1EwkQNZrHAg2XPWlq62oqEhYvONq5pkC2Y9oPljWToLmQ==", "dev": true }, "uc.micro": { @@ -3470,9 +3306,9 @@ "dev": true }, "underscore": { - "version": "1.13.3", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.3.tgz", - "integrity": "sha512-QvjkYpiD+dJJraRA8+dGAU4i7aBbb2s0S3jA45TFOvg2VgqvdCDd/3N6CqA8gluk1W91GLoXg5enMUx560QzuA==", + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.4.tgz", + "integrity": "sha512-BQFnUDuAQ4Yf/cYY5LNrK9NCJFKriaRbD9uR1fTeXnBeoa97W0i41qkZfGO9pSo8I5KzjAcSY2XYtdf0oKd7KQ==", "dev": true }, "universalify": { @@ -3526,7 +3362,7 @@ "utf8-byte-length": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/utf8-byte-length/-/utf8-byte-length-1.0.4.tgz", - "integrity": "sha1-9F8VDExm7uloGGUFq5P8u4rWv2E=", + "integrity": "sha512-4+wkEYLBbWxqTahEsWrhxepcoVOJ+1z5PGIjPZxRkytcdSUaNjIjBM7Xn8E+pdSuV7SzvWovBFA54FO0JSoqhA==", "dev": true }, "util-deprecate": { @@ -3541,9 +3377,9 @@ "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==" }, "vsce": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/vsce/-/vsce-2.7.0.tgz", - "integrity": "sha512-CKU34wrQlbKDeJCRBkd1a8iwF9EvNxcYMg9hAUH6AxFGR6Wo2IKWwt3cJIcusHxx6XdjDHWlfAS/fJN30uvVnA==", + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/vsce/-/vsce-2.9.2.tgz", + "integrity": "sha512-xyLqL4U82BilUX1t6Ym2opQEa2tLGWYjbgB7+ETeNVXlIJz5sWBJjQJSYJVFOKJSpiOtQclolu88cj7oY6vvPQ==", "dev": true, "requires": { "azure-devops-node-api": "^11.0.1", @@ -3600,7 +3436,7 @@ "color-name": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", "dev": true }, "commander": { @@ -3612,13 +3448,13 @@ "escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "dev": true }, "has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", "dev": true }, "semver": { @@ -3635,15 +3471,6 @@ "requires": { "has-flag": "^3.0.0" } - }, - "tmp": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", - "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", - "dev": true, - "requires": { - "rimraf": "^3.0.0" - } } } }, @@ -3657,12 +3484,12 @@ } }, "vscode-extension-tester": { - "version": "4.2.5", - "resolved": "https://registry.npmjs.org/vscode-extension-tester/-/vscode-extension-tester-4.2.5.tgz", - "integrity": "sha512-Igl3hnnLOtcC7vBJyMui5G+Vt6OiWtoomtqdD1oD+7bZFsF9OqBqDE9tD2K1mTYI4tlRFEBgC7jRi2h29bRNfg==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/vscode-extension-tester/-/vscode-extension-tester-4.3.0.tgz", + "integrity": "sha512-Ih12B4j64l/XQMQ4SdWI+UpltzaCmHlX1u9yv9iIIUi/y401jgjQLbIoFxCUNas0SzG767hVjkzKsKbmzFPMXw==", "dev": true, "requires": { - "@types/selenium-webdriver": "^3.0.15", + "@types/selenium-webdriver": "^4.1.1", "commander": "^8.0.0", "compare-versions": "^3.6.0", "fs-extra": "^10.0.0", @@ -3670,13 +3497,13 @@ "got": "^11.8.2", "hpagent": "^0.1.2", "js-yaml": "^4.1.0", - "monaco-page-objects": "^1.9.0", + "monaco-page-objects": "^2.0.0", "sanitize-filename": "^1.6.3", - "selenium-webdriver": "^3.0.0", + "selenium-webdriver": "^4.2.0", "targz": "^1.0.1", "unzip-stream": "^0.3.0", "vsce": "^2.3.0", - "vscode-extension-tester-locators": "^1.62.0" + "vscode-extension-tester-locators": "^2.0.0" }, "dependencies": { "commander": { @@ -3688,13 +3515,10 @@ } }, "vscode-extension-tester-locators": { - "version": "1.62.2", - "resolved": "https://registry.npmjs.org/vscode-extension-tester-locators/-/vscode-extension-tester-locators-1.62.2.tgz", - "integrity": "sha512-XzN0Tus5ct2aQKY/KpQbRz/M4+0isKC5/5SvS+6djLphBj3pZqvwduOdp6Gb6ATHt3AkwGn+Yau3X6mwgNJGlg==", - "dev": true, - "requires": { - "vscode-extension-tester-locators": "^1.62.1" - } + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/vscode-extension-tester-locators/-/vscode-extension-tester-locators-2.0.0.tgz", + "integrity": "sha512-ljmevi7R1K5uCiMpstKydh/sCA9TEiohxLmzX30ZZU5qE/ZNWz/5oLrxTdqN3EcSVW9ZXhExvrQFvHoYZxy9Ng==", + "dev": true }, "vscode-tas-client": { "version": "0.1.47", @@ -3771,18 +3595,18 @@ } }, "webpack-cli": { - "version": "4.9.2", - "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-4.9.2.tgz", - "integrity": "sha512-m3/AACnBBzK/kMTcxWHcZFPrw/eQuY4Df1TxvIWfWM2x7mRqBQCqKEd96oCUa9jkapLBaFfRce33eGDb4Pr7YQ==", + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-4.10.0.tgz", + "integrity": "sha512-NLhDfH/h4O6UOy+0LSso42xvYypClINuMNBVVzX4vX98TmTaTUxwRbXdhucbFMd2qLaCTcLq/PdYrvi8onw90w==", "dev": true, "requires": { "@discoveryjs/json-ext": "^0.5.0", - "@webpack-cli/configtest": "^1.1.1", - "@webpack-cli/info": "^1.4.1", - "@webpack-cli/serve": "^1.6.1", + "@webpack-cli/configtest": "^1.2.0", + "@webpack-cli/info": "^1.5.0", + "@webpack-cli/serve": "^1.7.0", "colorette": "^2.0.14", "commander": "^7.0.0", - "execa": "^5.0.0", + "cross-spawn": "^7.0.3", "fastest-levenshtein": "^1.0.12", "import-local": "^3.0.2", "interpret": "^2.2.0", @@ -3807,44 +3631,6 @@ "which": "^2.0.1" } }, - "execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "dev": true, - "requires": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" - } - }, - "get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "dev": true - }, - "is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "dev": true - }, - "npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "dev": true, - "requires": { - "path-key": "^3.0.0" - } - }, "path-key": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", @@ -3893,15 +3679,6 @@ "isexe": "^2.0.0" } }, - "wide-align": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", - "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", - "dev": true, - "requires": { - "string-width": "^1.0.2 || 2 || 3 || 4" - } - }, "wildcard": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.0.tgz", @@ -3965,6 +3742,12 @@ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", "dev": true }, + "ws": { + "version": "8.8.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.8.0.tgz", + "integrity": "sha512-JDAgSYQ1ksuwqfChJusw1LSJ8BizJ2e/vVu5Lxjq3YvNJNlROv1ui4i+c/kUUrPheBvQl4c5UbERhTwKa6QBJQ==", + "dev": true + }, "xml2js": { "version": "0.4.23", "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz", @@ -4068,7 +3851,7 @@ "yauzl": { "version": "2.10.0", "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", - "integrity": "sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk=", + "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", "dev": true, "requires": { "buffer-crc32": "~0.2.3", diff --git a/package.json b/package.json index 01aa820b..fdc67bdb 100644 --- a/package.json +++ b/package.json @@ -646,19 +646,19 @@ "@types/lodash": "^4.14.182", "@types/minimatch": "^3.0.3", "@types/mocha": "^9.1.1", - "@types/node": "^14.18.20", - "@types/semver": "^7.3.9", + "@types/node": "^14.18.21", + "@types/semver": "^7.3.10", "@types/vscode": "1.66.0", "copy-webpack-plugin": "^9.1.0", "glob": "^7.2.3", "mocha": "^9.2.2", - "ts-loader": "^9.3.0", + "ts-loader": "^9.3.1", "tslint": "^6.1.3", - "typescript": "^4.7.3", - "vscode-extension-tester": "^4.2.5", + "typescript": "^4.7.4", + "vscode-extension-tester": "^4.3.0", "vscode-test": "^1.6.1", "webpack": "^5.73.0", - "webpack-cli": "^4.9.2" + "webpack-cli": "^4.10.0" }, "dependencies": { "await-lock": "^2.2.2", From 3ee3afd2de4bec4683c06e45bc6be74a72bfadd4 Mon Sep 17 00:00:00 2001 From: Shi Chen Date: Thu, 7 Jul 2022 12:17:15 +0800 Subject: [PATCH 108/352] chore: Update test framework to `@vscode/test-electron` (#659) --- package-lock.json | 74 +++++++++++++++++++++++------------------------ package.json | 2 +- test/index.ts | 24 ++++++++------- 3 files changed, 52 insertions(+), 48 deletions(-) diff --git a/package-lock.json b/package-lock.json index acd09fc5..527d4e63 100644 --- a/package-lock.json +++ b/package-lock.json @@ -388,6 +388,18 @@ "@microsoft/1ds-post-js": "^3.2.3" } }, + "@vscode/test-electron": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@vscode/test-electron/-/test-electron-2.1.5.tgz", + "integrity": "sha512-O/ioqFpV+RvKbRykX2ItYPnbcZ4Hk5V0rY4uhQjQTLhGL9WZUvS7exzuYQCCI+ilSqJpctvxq2llTfGXf9UnnA==", + "dev": true, + "requires": { + "http-proxy-agent": "^4.0.1", + "https-proxy-agent": "^5.0.0", + "rimraf": "^3.0.2", + "unzipper": "^0.10.11" + } + }, "@webassemblyjs/ast": { "version": "1.11.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz", @@ -718,7 +730,7 @@ "boolbase": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", + "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=", "dev": true }, "brace-expansion": { @@ -786,13 +798,13 @@ "buffer-crc32": { "version": "0.2.13", "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", - "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", + "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=", "dev": true }, "buffer-fill": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz", - "integrity": "sha512-T7zexNBwiiaCOGDg9xNX9PBmjrubblRkENuptryuI64URkXDFum9il/JGL8Lm8wYfAXpredVXXZz7eMHilimiQ==", + "integrity": "sha1-+PeLdniYiO858gXNY39o5wISKyw=", "dev": true }, "buffer-from": { @@ -1030,7 +1042,7 @@ "clone-response": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz", - "integrity": "sha512-yjLXh88P599UOyPTFX0POsd7WxnbsVsGohcwzHOLspIhhpalPw1BcqED8NblyZLKcGrL8dTgMlcaZxV2jAD41Q==", + "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=", "dev": true, "requires": { "mimic-response": "^1.0.0" @@ -1452,7 +1464,7 @@ "fd-slicer": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", - "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", + "integrity": "sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4=", "dev": true, "requires": { "pend": "~1.2.0" @@ -1583,7 +1595,7 @@ "github-from-package": { "version": "0.0.0", "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", - "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==", + "integrity": "sha1-l/tdlr/eiXMxPyDoKI75oWf6ZM4=", "dev": true }, "glob": { @@ -1770,7 +1782,7 @@ "immediate": { "version": "3.0.6", "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", - "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==", + "integrity": "sha1-nbHb0Pr43m++D13V5Wu2BigN5ps=", "dev": true }, "import-local": { @@ -1871,7 +1883,7 @@ "is-stream": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", "dev": true }, "is-unicode-supported": { @@ -1904,7 +1916,7 @@ "isobject": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", "dev": true }, "jest-worker": { @@ -2096,7 +2108,7 @@ "mdurl": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", - "integrity": "sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==", + "integrity": "sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4=", "dev": true }, "merge-stream": { @@ -2340,7 +2352,7 @@ "npm-run-path": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", - "integrity": "sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==", + "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", "dev": true, "requires": { "path-key": "^2.0.0" @@ -2379,7 +2391,7 @@ "p-finally": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==", + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", "dev": true }, "p-limit": { @@ -2415,7 +2427,7 @@ "parse-semver": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/parse-semver/-/parse-semver-1.1.1.tgz", - "integrity": "sha512-Eg1OuNntBMH0ojvEKSrvDSnwLmvVuUOSdylH/pSCPNMIspLlweJyIWXCE+k/5hm3cj/EBUYwmWkjhBALNP4LXQ==", + "integrity": "sha1-mkr9bfBj3Egm+T+6SpnPIj9mbLg=", "dev": true, "requires": { "semver": "^5.1.0" @@ -2463,7 +2475,7 @@ "path-key": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", "dev": true }, "path-parse": { @@ -2480,7 +2492,7 @@ "pend": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", - "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", + "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=", "dev": true }, "picocolors": { @@ -2677,7 +2689,7 @@ "strip-json-comments": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", "dev": true } } @@ -2685,7 +2697,7 @@ "read": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/read/-/read-1.0.7.tgz", - "integrity": "sha512-rSOKNYUmaxy0om1BNjMN4ezNT6VKK+2xF4GBhc81mkH7L60i6dp8qPYrkndNLT3QPphoII3maL9PVC9XmhHwVQ==", + "integrity": "sha1-s9oZvQUkMal2cdRKQmNK33ELQMQ=", "dev": true, "requires": { "mute-stream": "~0.0.4" @@ -2879,7 +2891,7 @@ "shebang-command": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", "dev": true, "requires": { "shebang-regex": "^1.0.0" @@ -2888,7 +2900,7 @@ "shebang-regex": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", "dev": true }, "side-channel": { @@ -2972,7 +2984,7 @@ "strip-eof": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", - "integrity": "sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q==", + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", "dev": true }, "strip-json-comments": { @@ -3044,7 +3056,7 @@ "targz": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/targz/-/targz-1.0.1.tgz", - "integrity": "sha512-6q4tP9U55mZnRuMTBqnqc3nwYQY3kv+QthCFZuMk+Tn1qYUnMPmL/JZ/mzgXINzFpSqfU+242IFmFU9VPvqaQw==", + "integrity": "sha1-j3alI2lM3t+7XWCkB2/27uzFOY8=", "dev": true, "requires": { "tar-fs": "^1.8.1" @@ -3115,7 +3127,7 @@ "truncate-utf8-bytes": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/truncate-utf8-bytes/-/truncate-utf8-bytes-1.0.2.tgz", - "integrity": "sha512-95Pu1QXQvruGEhv62XCMO3Mm90GscOCClvrIUwCM0PYOXK3kaF3l3sIHxx71ThJfcbM2O5Au6SO3AWCSEfW4mQ==", + "integrity": "sha1-QFkjkJWS1W94pYGENLC3hInKXys=", "dev": true, "requires": { "utf8-byte-length": "^1.0.1" @@ -3276,7 +3288,7 @@ "tunnel-agent": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", "dev": true, "requires": { "safe-buffer": "^5.0.1" @@ -3362,7 +3374,7 @@ "utf8-byte-length": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/utf8-byte-length/-/utf8-byte-length-1.0.4.tgz", - "integrity": "sha512-4+wkEYLBbWxqTahEsWrhxepcoVOJ+1z5PGIjPZxRkytcdSUaNjIjBM7Xn8E+pdSuV7SzvWovBFA54FO0JSoqhA==", + "integrity": "sha1-9F8VDExm7uloGGUFq5P8u4rWv2E=", "dev": true }, "util-deprecate": { @@ -3528,18 +3540,6 @@ "tas-client": "0.1.45" } }, - "vscode-test": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/vscode-test/-/vscode-test-1.6.1.tgz", - "integrity": "sha512-086q88T2ca1k95mUzffvbzb7esqQNvJgiwY4h29ukPhFo8u+vXOOmelUoU5EQUHs3Of8+JuQ3oGdbVCqaxuTXA==", - "dev": true, - "requires": { - "http-proxy-agent": "^4.0.1", - "https-proxy-agent": "^5.0.0", - "rimraf": "^3.0.2", - "unzipper": "^0.10.11" - } - }, "watchpack": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", @@ -3851,7 +3851,7 @@ "yauzl": { "version": "2.10.0", "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", - "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", + "integrity": "sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk=", "dev": true, "requires": { "buffer-crc32": "~0.2.3", diff --git a/package.json b/package.json index fdc67bdb..f2ed39e7 100644 --- a/package.json +++ b/package.json @@ -649,6 +649,7 @@ "@types/node": "^14.18.21", "@types/semver": "^7.3.10", "@types/vscode": "1.66.0", + "@vscode/test-electron": "^2.1.5", "copy-webpack-plugin": "^9.1.0", "glob": "^7.2.3", "mocha": "^9.2.2", @@ -656,7 +657,6 @@ "tslint": "^6.1.3", "typescript": "^4.7.4", "vscode-extension-tester": "^4.3.0", - "vscode-test": "^1.6.1", "webpack": "^5.73.0", "webpack-cli": "^4.10.0" }, diff --git a/test/index.ts b/test/index.ts index d844bc55..69934a3f 100644 --- a/test/index.ts +++ b/test/index.ts @@ -2,19 +2,23 @@ // Licensed under the MIT license. import * as cp from "child_process"; +import * as fs from "fs"; import * as os from "os"; import * as path from "path"; -import { downloadAndUnzipVSCode, resolveCliPathFromVSCodeExecutablePath, runTests } from "vscode-test"; +import { downloadAndUnzipVSCode, resolveCliArgsFromVSCodeExecutablePath, runTests } from "@vscode/test-electron"; async function main(): Promise { try { + // test fails in macOS since the limitation of path length + // See: https://github.com/microsoft/vscode/issues/86382#issuecomment-593765388 + const userDir = fs.mkdtempSync(path.join(os.tmpdir(), "vscode-user")); const vscodeExecutablePath = await downloadAndUnzipVSCode(); - const cliPath = resolveCliPathFromVSCodeExecutablePath(vscodeExecutablePath); // Resolve redhat.java dependency - cp.spawnSync(cliPath, ["--install-extension", "redhat.java"], { - encoding: "utf-8", - stdio: "inherit", + const [cli, ...args] = resolveCliArgsFromVSCodeExecutablePath(vscodeExecutablePath); + cp.spawnSync(cli, [...args, '--install-extension', 'redhat.java'], { + encoding: 'utf-8', + stdio: 'inherit' }); // The folder containing the Extension Manifest package.json @@ -30,7 +34,7 @@ async function main(): Promise { extensionTestsPath: path.resolve(__dirname, "./suite"), launchArgs: [ path.join(__dirname, "..", "..", "test", "java9"), - "--disable-workspace-trust", + `--user-data-dir=${userDir}`, ], }); @@ -41,7 +45,7 @@ async function main(): Promise { extensionTestsPath: path.resolve(__dirname, "./simple-suite"), launchArgs: [ path.join(__dirname, "..", "..", "test", "simple"), - "--disable-workspace-trust", + `--user-data-dir=${userDir}`, ], }); @@ -52,7 +56,7 @@ async function main(): Promise { extensionTestsPath: path.resolve(__dirname, "./maven-suite"), launchArgs: [ path.join(__dirname, "..", "..", "test", "maven"), - "--disable-workspace-trust", + `--user-data-dir=${userDir}`, ], }); @@ -63,7 +67,7 @@ async function main(): Promise { extensionTestsPath: path.resolve(__dirname, "./gradle-suite"), launchArgs: [ path.join(__dirname, "..", "..", "test", "gradle"), - "--disable-workspace-trust", + `--user-data-dir=${userDir}`, ], }); @@ -74,7 +78,7 @@ async function main(): Promise { extensionTestsPath: path.resolve(__dirname, "./invisible-suite"), launchArgs: [ path.join(__dirname, "..", "..", "test", "invisible"), - "--disable-workspace-trust", + `--user-data-dir=${userDir}`, ], }); From 60091d4c7d66c4774e3b0f68e7ed8afcdb2e2452 Mon Sep 17 00:00:00 2001 From: Sheng Chen Date: Tue, 12 Jul 2022 09:39:42 +0800 Subject: [PATCH 109/352] fix: Cannot drag from VS Code's file explorer to Java Project explorer (#661) --- package-lock.json | 12 ++++++------ package.json | 4 ++-- src/views/DragAndDropController.ts | 15 +++++---------- 3 files changed, 13 insertions(+), 18 deletions(-) diff --git a/package-lock.json b/package-lock.json index 527d4e63..d54e40af 100644 --- a/package-lock.json +++ b/package-lock.json @@ -359,9 +359,9 @@ "dev": true }, "@types/vscode": { - "version": "1.66.0", - "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.66.0.tgz", - "integrity": "sha512-ZfJck4M7nrGasfs4A4YbUoxis3Vu24cETw3DERsNYtDZmYSYtk6ljKexKFKhImO/ZmY6ZMsmegu2FPkXoUFImA==", + "version": "1.69.0", + "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.69.0.tgz", + "integrity": "sha512-RlzDAnGqUoo9wS6d4tthNyAdZLxOIddLiX3djMoWk29jFfSA1yJbIwr0epBYqqYarWB6s2Z+4VaZCQ80Jaa3kA==", "dev": true }, "@types/ws": { @@ -1518,7 +1518,7 @@ "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", "dev": true }, "fsevents": { @@ -1798,7 +1798,7 @@ "inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", "dev": true, "requires": { "once": "^1.3.0", @@ -2469,7 +2469,7 @@ "path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", "dev": true }, "path-key": { diff --git a/package.json b/package.json index f2ed39e7..683a47d4 100644 --- a/package.json +++ b/package.json @@ -12,7 +12,7 @@ "explorer" ], "engines": { - "vscode": "^1.66.0" + "vscode": "^1.69.0" }, "repository": { "type": "git", @@ -648,7 +648,7 @@ "@types/mocha": "^9.1.1", "@types/node": "^14.18.21", "@types/semver": "^7.3.10", - "@types/vscode": "1.66.0", + "@types/vscode": "1.69.0", "@vscode/test-electron": "^2.1.5", "copy-webpack-plugin": "^9.1.0", "glob": "^7.2.3", diff --git a/src/views/DragAndDropController.ts b/src/views/DragAndDropController.ts index 62135a43..3ef2c0bf 100644 --- a/src/views/DragAndDropController.ts +++ b/src/views/DragAndDropController.ts @@ -48,17 +48,12 @@ export class DragAndDropController implements TreeDragAndDropController { - if (key === Explorer.Mime.TextUriList && value.value) { - uriList.push(...(value.value as string).split("\n")); - } - }); + const uris: string | undefined = await dataTransfer.get(Explorer.Mime.TextUriList)?.asString(); + if (!uris) { + return; + } - uriList = uriList.map(u => { + const uriList: string[] = uris.split(/\r?\n/g).map(u => { try { const uri = Uri.parse(u, true /* strict */); if (uri.scheme !== "file") { From 932edfe15d636600cd8ab4460a6c0c132cb54060 Mon Sep 17 00:00:00 2001 From: Shi Chen Date: Tue, 12 Jul 2022 17:11:14 +0800 Subject: [PATCH 110/352] chore: Update `globby` and `copy-webpack-plugin` (#662) --- package-lock.json | 124 +++++++++++++++----- package.json | 6 +- src/exportJarSteps/ExportJarTaskProvider.ts | 2 +- src/exportJarSteps/GenerateJarExecutor.ts | 2 +- 4 files changed, 101 insertions(+), 33 deletions(-) diff --git a/package-lock.json b/package-lock.json index d54e40af..ab46b5ca 100644 --- a/package-lock.json +++ b/package-lock.json @@ -329,9 +329,9 @@ "dev": true }, "@types/node": { - "version": "14.18.21", - "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.21.tgz", - "integrity": "sha512-x5W9s+8P4XteaxT/jKF0PSb7XEvo5VmqEWgsMlyeY4ZlLK8I6aH6g5TPPyDlLAep+GYf4kefb7HFyc7PAO3m+Q==", + "version": "16.11.7", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.7.tgz", + "integrity": "sha512-QB5D2sqfSjCmTuWcBWyJ+/44bcjO7VbjSbOE0ucoVbAsSNQc4Lt6QkgkVXkTDwkL4z/beecZNDvVX15D4P8Jbw==", "dev": true }, "@types/responselike": { @@ -612,6 +612,35 @@ "uri-js": "^4.2.2" } }, + "ajv-formats": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", + "dev": true, + "requires": { + "ajv": "^8.0.0" + }, + "dependencies": { + "ajv": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", + "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + } + }, + "json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + } + } + }, "ajv-keywords": { "version": "3.5.2", "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", @@ -1097,17 +1126,58 @@ "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" }, "copy-webpack-plugin": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-9.1.0.tgz", - "integrity": "sha512-rxnR7PaGigJzhqETHGmAcxKnLZSR5u1Y3/bcIv/1FnqXedcL/E2ewK7ZCNrArJKCiSv8yVXhTqetJh8inDvfsA==", + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-11.0.0.tgz", + "integrity": "sha512-fX2MWpamkW0hZxMEg0+mYnA40LTosOSa5TqZ9GYIBzyJa9C3QUaMPSE2xAi/buNr8u89SfD9wHSQVBzrRa/SOQ==", "dev": true, "requires": { - "fast-glob": "^3.2.7", + "fast-glob": "^3.2.11", "glob-parent": "^6.0.1", - "globby": "^11.0.3", + "globby": "^13.1.1", "normalize-path": "^3.0.0", - "schema-utils": "^3.1.1", + "schema-utils": "^4.0.0", "serialize-javascript": "^6.0.0" + }, + "dependencies": { + "ajv": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", + "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + } + }, + "ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.3" + } + }, + "json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "schema-utils": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", + "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.8.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.0.0" + } + } } }, "core-util-is": { @@ -1518,7 +1588,7 @@ "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", "dev": true }, "fsevents": { @@ -1628,23 +1698,15 @@ "dev": true }, "globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "version": "13.1.2", + "resolved": "https://registry.npmjs.org/globby/-/globby-13.1.2.tgz", + "integrity": "sha512-LKSDZXToac40u8Q1PQtZihbNdTYSNMuWe+K5l+oa6KgDzSvVrHXlJy40hUP522RjAIoNLJYBJi7ow+rbFpIhHQ==", "requires": { - "array-union": "^2.1.0", "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", + "fast-glob": "^3.2.11", "ignore": "^5.2.0", "merge2": "^1.4.1", - "slash": "^3.0.0" - }, - "dependencies": { - "array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==" - } + "slash": "^4.0.0" } }, "got": { @@ -1798,7 +1860,7 @@ "inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", "dev": true, "requires": { "once": "^1.3.0", @@ -2469,7 +2531,7 @@ "path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", "dev": true }, "path-key": { @@ -2750,6 +2812,12 @@ "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", "dev": true }, + "require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true + }, "resolve": { "version": "1.22.0", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.0.tgz", @@ -2938,9 +3006,9 @@ } }, "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==" + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", + "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==" }, "source-map": { "version": "0.6.1", diff --git a/package.json b/package.json index 683a47d4..7ca87db3 100644 --- a/package.json +++ b/package.json @@ -646,11 +646,11 @@ "@types/lodash": "^4.14.182", "@types/minimatch": "^3.0.3", "@types/mocha": "^9.1.1", - "@types/node": "^14.18.21", + "@types/node": "16.x", "@types/semver": "^7.3.10", "@types/vscode": "1.69.0", "@vscode/test-electron": "^2.1.5", - "copy-webpack-plugin": "^9.1.0", + "copy-webpack-plugin": "^11.0.0", "glob": "^7.2.3", "mocha": "^9.2.2", "ts-loader": "^9.3.1", @@ -663,7 +663,7 @@ "dependencies": { "await-lock": "^2.2.2", "fs-extra": "^10.1.0", - "globby": "^11.1.0", + "globby": "^13.1.2", "lodash": "^4.17.21", "minimatch": "^3.1.2", "semver": "^7.3.7", diff --git a/src/exportJarSteps/ExportJarTaskProvider.ts b/src/exportJarSteps/ExportJarTaskProvider.ts index 6d3aadf6..206cece9 100644 --- a/src/exportJarSteps/ExportJarTaskProvider.ts +++ b/src/exportJarSteps/ExportJarTaskProvider.ts @@ -2,7 +2,7 @@ // Licensed under the MIT license. import { lstat } from "fs-extra"; -import * as globby from "globby"; +import { globby } from "globby"; import * as _ from "lodash"; import { platform } from "os"; import { dirname, extname, isAbsolute, join, relative } from "path"; diff --git a/src/exportJarSteps/GenerateJarExecutor.ts b/src/exportJarSteps/GenerateJarExecutor.ts index c87d79d4..5bd18b20 100644 --- a/src/exportJarSteps/GenerateJarExecutor.ts +++ b/src/exportJarSteps/GenerateJarExecutor.ts @@ -2,7 +2,7 @@ // Licensed under the MIT license. import { ensureDir, pathExists } from "fs-extra"; -import globby = require("globby"); +import { globby } from "globby"; import * as _ from "lodash"; import { basename, dirname, extname, isAbsolute, join, normalize, relative } from "path"; import { Disposable, ProgressLocation, QuickInputButtons, QuickPickItem, Uri, window, WorkspaceFolder } from "vscode"; From a444949fe6a2cec7a2a186bd14a005c92e995ebd Mon Sep 17 00:00:00 2001 From: Sheng Chen Date: Wed, 13 Jul 2022 14:09:48 +0800 Subject: [PATCH 111/352] feat: Support run build from tasks (#660) * feat: Support run build from tasks - Add a new task provider with type: 'java (build)'. - Use 'paths' to define the root path of the project to be built. - Use 'isFullBuild' to define whether this build is a full built or not. Signed-off-by: Sheng Chen --- extension.bundle.ts | 3 + package.json | 34 +++ package.nls.json | 4 + package.nls.zh.json | 4 + src/build.ts | 2 +- src/commands.ts | 8 + src/extension.ts | 2 + src/java/jdtls.ts | 4 + src/tasks/build/buildTaskProvider.ts | 302 +++++++++++++++++++++++++++ test/suite/buildTask.test.ts | 68 ++++++ 10 files changed, 430 insertions(+), 1 deletion(-) create mode 100644 src/tasks/build/buildTaskProvider.ts create mode 100644 test/suite/buildTask.test.ts diff --git a/extension.bundle.ts b/extension.bundle.ts index 168f3e38..eb28b400 100644 --- a/extension.bundle.ts +++ b/extension.bundle.ts @@ -22,3 +22,6 @@ export { contextManager } from "./src/contextManager"; export { DependencyExplorer } from "./src/views/dependencyExplorer"; export { Commands } from "./src/commands"; export { LanguageServerMode } from "./src/languageServerApi/LanguageServerMode"; + +// tasks +export { BuildTaskProvider, categorizePaths, getFinalPaths } from "./src/tasks/build/buildTaskProvider"; diff --git a/package.json b/package.json index 7ca87db3..c9e411a0 100644 --- a/package.json +++ b/package.json @@ -628,6 +628,40 @@ "description": "%taskDefinitions.java.project.exportJar.elements%" } } + }, + { + "type": "java (build)", + "properties": { + "paths": { + "type": "array", + "items": { + "anyOf": [ + { + "type": "string" + }, + { + "enum": [ + "${workspace}", + "!" + ], + "enumDescriptions": [ + "%taskDefinitions.java.project.build.path.workspace%", + "%taskDefinitions.java.project.build.path.exclude%" + ] + } + ] + }, + "default": [ + "${workspace}" + ], + "description": "%taskDefinitions.java.project.build.path%" + }, + "isFullBuild": { + "type": "boolean", + "default": "true", + "description": "%taskDefinitions.java.project.build.isFullBuild%" + } + } } ] }, diff --git a/package.nls.json b/package.nls.json index 9e3a3296..ba59ab8f 100644 --- a/package.nls.json +++ b/package.nls.json @@ -37,6 +37,10 @@ "taskDefinitions.java.project.exportJar.testCompileOutput": "The folders containing output class files in the test scope.", "taskDefinitions.java.project.exportJar.dependencies": "The artifact dependencies in the runtime scope.", "taskDefinitions.java.project.exportJar.testDependencies": "The artifact dependencies in the test scope.", + "taskDefinitions.java.project.build.path": "The project root paths that will be built. Both absolute path and relative path to the workspace folder are supported.", + "taskDefinitions.java.project.build.path.workspace": "All the projects in workspace.", + "taskDefinitions.java.project.build.path.exclude": "The path after '!' will be excluded from the paths to be built.", + "taskDefinitions.java.project.build.isFullBuild": "Whether to execute a clean build or not.", "viewsWelcome.workbench.createNewJavaProject": "You can also [open a Java project folder](command:_java.project.open), or create a new Java project by clicking the button below.\n[Create Java Project](command:java.project.create)", "viewsWelcome.workbench.noJavaProject": "No Java projects found in the current workspace. You can [open a Java project folder](command:_java.project.open), or create a new Java project by clicking the button below.\n[Create Java Project](command:java.project.create)", "viewsWelcome.workbench.inLightWeightMode": "To view the projects, you can import the projects into workspace.\n[Import Projects](command:java.server.mode.switch?%5B%22Standard%22,true%5D)", diff --git a/package.nls.zh.json b/package.nls.zh.json index f9fa60a5..7d9cedb9 100644 --- a/package.nls.zh.json +++ b/package.nls.zh.json @@ -37,6 +37,10 @@ "taskDefinitions.java.project.exportJar.testCompileOutput": "在 test scope 内包含输出的 class 文件的文件夹。", "taskDefinitions.java.project.exportJar.dependencies": "在 runtime scope 内的依赖。", "taskDefinitions.java.project.exportJar.testDependencies": "在 test scope 内的依赖。", + "taskDefinitions.java.project.build.path": "被构建项目的根目录路径。绝对路径或者相对于工作空间目录的相对路径都可以使用。", + "taskDefinitions.java.project.build.path.workspace": "工作空间中的所有项目。", + "taskDefinitions.java.project.build.path.exclude": "'!' 后的路径将会从待构建项目路径中移除。", + "taskDefinitions.java.project.build.isFullBuild": "是否要重新构建项目。", "viewsWelcome.workbench.createNewJavaProject": "您也可以[打开一个 Java 项目目录](command:_java.project.open),或点击下方按钮创建一个新的 Java 项目。\n[创建 Java 项目](command:java.project.create)", "viewsWelcome.workbench.noJavaProject": "当前工作空间未发现 Java 项目,您可以[打开一个 Java 项目目录](command:_java.project.open),或点击下方按钮创建一个新的 Java 项目。\n[创建 Java 项目](command:java.project.create)", "viewsWelcome.workbench.inLightWeightMode": "要浏览项目信息,你可以将项目导入到工作空间中。\n[导入项目](command:java.server.mode.switch?%5B%22Standard%22,true%5D)", diff --git a/src/build.ts b/src/build.ts index d0542c56..cd9ceca8 100644 --- a/src/build.ts +++ b/src/build.ts @@ -60,7 +60,7 @@ async function handleBuildFailure(operationId: string, err: any): Promise { + return await commands.executeCommand(Commands.EXECUTE_WORKSPACE_COMMAND, Commands.GET_ALL_PROJECTS) || []; + } + export async function refreshLibraries(params: string): Promise { return commands.executeCommand(Commands.EXECUTE_WORKSPACE_COMMAND, Commands.JAVA_PROJECT_REFRESH_LIB_SERVER, params); } diff --git a/src/tasks/build/buildTaskProvider.ts b/src/tasks/build/buildTaskProvider.ts new file mode 100644 index 00000000..6844d68b --- /dev/null +++ b/src/tasks/build/buildTaskProvider.ts @@ -0,0 +1,302 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT license. + +import { CancellationTokenSource, commands, CustomExecution, Event, EventEmitter, Pseudoterminal, Task, + TaskDefinition, TaskGroup, TaskProvider, TaskRevealKind, TaskScope, Uri, workspace, WorkspaceFolder } from "vscode"; +import { Jdtls } from "../../java/jdtls"; +import * as path from "path"; +import { checkErrorsReportedByJavaExtension } from "../../build"; +import { Commands } from "../../commands"; +import { sendInfo } from "vscode-extension-telemetry-wrapper"; + +/** + * A task provider to provide Java build task support. + */ +export class BuildTaskProvider implements TaskProvider { + + public static readonly type = "java (build)"; + + // tslint:disable-next-line: no-invalid-template-strings + public static readonly workspace = "${workspace}"; + public static readonly defaultTaskName = "Build Workspace"; + + async provideTasks(): Promise { + const folders: readonly WorkspaceFolder[] = workspace.workspaceFolders || []; + if (!folders.length) { + return []; + } + const defaultTaskDefinition = { + type: BuildTaskProvider.type, + paths: [ BuildTaskProvider.workspace ], + isFullBuild: true, + }; + const defaultTask = new Task( + defaultTaskDefinition, + TaskScope.Workspace, + BuildTaskProvider.defaultTaskName, + BuildTaskProvider.type, + new CustomExecution(async (resolvedDefinition: IBuildTaskDefinition): Promise => { + return new BuildTaskTerminal(resolvedDefinition, TaskScope.Workspace); + }), + ); + defaultTask.detail = "$(tools) Build all the Java projects in workspace."; + defaultTask.group = TaskGroup.Build; + defaultTask.presentationOptions = { + reveal: TaskRevealKind.Never, + clear: true, + }; + return [defaultTask]; + } + + async resolveTask(task: Task): Promise { + const taskDefinition = task.definition as IBuildTaskDefinition; + if (!taskDefinition.paths?.length) { + taskDefinition.paths = [ BuildTaskProvider.workspace ]; + } else { + taskDefinition.paths = taskDefinition.paths + .map(p => p.trim()) + .filter(Boolean); + task.definition = taskDefinition; + } + task.execution = new CustomExecution(async (resolvedDefinition: IBuildTaskDefinition): Promise => { + return new BuildTaskTerminal(resolvedDefinition, task.scope ?? TaskScope.Workspace); + }); + task.presentationOptions = { + reveal: TaskRevealKind.Never, + clear: true, + }; + return task; + } +} + +class BuildTaskTerminal implements Pseudoterminal { + + private cancellationTokenSource: CancellationTokenSource; + + constructor(private readonly definition: IBuildTaskDefinition, + private readonly scope: WorkspaceFolder | TaskScope.Global | TaskScope.Workspace) { + this.cancellationTokenSource = new CancellationTokenSource(); + } + + writeEmitter = new EventEmitter(); + closeEmitter = new EventEmitter(); + + onDidWrite: Event = this.writeEmitter.event; + onDidClose: Event = this.closeEmitter.event; + + async open(): Promise { + // TODO: consider change to terminal name via changeNameEmitter. + // see: https://github.com/microsoft/vscode/issues/154146 + + let returnCode = Number.MAX_SAFE_INTEGER; + if (this.scope === TaskScope.Global) { + this.writeEmitter.fire('Global task is not supported.\r\n\r\n'); + returnCode = ReturnCode.UnsupportedTask; + } else if (this.definition.paths.length === 1 && + this.definition.paths[0] === BuildTaskProvider.workspace) { + returnCode = await this.buildWorkspace(); + } else { + returnCode = await this.buildProjects(); + } + + this.writeEmitter.fire('Task complete.\r\n'); + this.closeEmitter.fire(returnCode); + sendInfo("", { + buildTaskReturnCode: returnCode.toString() + }); + } + + close(): void { + this.cancellationTokenSource.cancel(); + this.cancellationTokenSource.dispose(); + } + + async buildWorkspace(): Promise { + this.writeEmitter.fire("Building all the Java projects in workspace...\r\n\r\n"); + try { + await commands.executeCommand(Commands.COMPILE_WORKSPACE, this.definition.isFullBuild, this.cancellationTokenSource.token); + } catch (e) { + if (checkErrorsReportedByJavaExtension()) { + commands.executeCommand(Commands.WORKBENCH_VIEW_PROBLEMS); + this.writeEmitter.fire("Errors found when building the workspace, please open PROBLEMS view for details.\r\n\r\n"); + return ReturnCode.UserError; + } else { + this.writeEmitter.fire("Errors occur when building the workspace:\r\n"); + this.writeEmitter.fire(`${e}\r\n\r\n`); + return ReturnCode.CommandFail; + } + } + return ReturnCode.Success; + } + + async buildProjects(): Promise { + // tslint:disable-next-line: prefer-const + let [includedPaths, excludedPaths, invalidPaths] = categorizePaths(this.definition.paths, this.scope); + if (invalidPaths.length) { + this.printList("Following paths are invalid, please provide absolute paths instead:", invalidPaths); + return ReturnCode.InvalidPath; + } + + const projectUris: string[] = await Jdtls.getProjectUris(); + const projectPaths: string[] = projectUris + .map(uri => Uri.parse(uri).fsPath) + .filter(p => path.basename(p) !== "jdt.ls-java-project"); + [includedPaths, invalidPaths] = getFinalPaths(includedPaths, excludedPaths, projectPaths); + + if (invalidPaths.length) { + this.printList("Following paths are skipped due to not matching any project root path:", invalidPaths); + } + + if (includedPaths.length === 0) { + return ReturnCode.EmptyIncludedPath; + } + + if (this.cancellationTokenSource.token.isCancellationRequested) { + return ReturnCode.Cancelled; + } + + this.printList("Building following projects:", includedPaths); + const uris: Uri[] = includedPaths.map(p => Uri.file(p)); + try { + const res = await commands.executeCommand(Commands.BUILD_PROJECT, uris, this.definition.isFullBuild, + this.cancellationTokenSource.token); + switch (res) { + case Jdtls.CompileWorkspaceStatus.Witherror: + if (checkErrorsReportedByJavaExtension()) { + commands.executeCommand(Commands.WORKBENCH_VIEW_PROBLEMS); + this.writeEmitter.fire("Errors found when building the workspace, please open PROBLEMS view for details.\r\n\r\n"); + } + return ReturnCode.UserError; + case Jdtls.CompileWorkspaceStatus.Cancelled: + return ReturnCode.Cancelled; + case Jdtls.CompileWorkspaceStatus.Failed: + return ReturnCode.CommandFail; + case Jdtls.CompileWorkspaceStatus.Succeed: + return ReturnCode.Success; + } + } catch (e) { + this.writeEmitter.fire(`Error occurs when building the workspace:\r\n`); + this.writeEmitter.fire(`${e}\r\n\r\n`); + return ReturnCode.CommandFail; + } + return ReturnCode.Success; + } + + private printList(title: string, list: string[]) { + this.writeEmitter.fire(`${title}\r\n`); + for (const l of list) { + this.writeEmitter.fire(` ${l}\r\n`); + } + this.writeEmitter.fire("\r\n"); + } +} + +/** + * Categorize the paths into three categories, and return the categories in an array. + * @param paths paths in the task definition. + * @param scope scope of the task + * @returns {Array} [included paths, excluded paths, invalid paths]. + */ +export function categorizePaths(paths: string[], scope: WorkspaceFolder | TaskScope.Global | TaskScope.Workspace): string[][] { + const includes = []; + const excludes = []; + const invalid = []; + for (const p of paths) { + let actualPath = p; + const isNegative: boolean = p.startsWith("!"); + if (isNegative) { + actualPath = trimNegativeSign(actualPath); + } + + if (actualPath === BuildTaskProvider.workspace || path.isAbsolute(actualPath)) { + if (isNegative) { + excludes.push(actualPath); + } else { + includes.push(actualPath); + } + continue; + } + + let folder: WorkspaceFolder | undefined; + if (scope === TaskScope.Workspace) { + // cannot recover the absolute path + if (!workspace.workspaceFolders || workspace.workspaceFolders.length > 1) { + invalid.push(p); + } else { + folder = workspace.workspaceFolders[0]; + } + } + + if (!folder) { + continue; + } + + const resolvedPath = path.join(folder.uri.fsPath, actualPath); + if (isNegative) { + excludes.push(resolvedPath); + } else { + includes.push(resolvedPath); + } + } + return [includes, excludes, invalid]; +} + +function trimNegativeSign(negativePath: string) { + let idx = 0; + for (; idx < negativePath.length; idx++) { + if (negativePath.charAt(idx) !== "!") { + break; + } + } + return negativePath.substring(idx); +} + +/** + * Get the final paths which will be passed to the build projects command. + * @param includes included paths. + * @param excludes excluded paths. + * @param projectPaths paths of all the projects. + * @returns {Array} [ final paths, invalid paths ]. + */ +export function getFinalPaths(includes: string[], excludes: string[], projectPaths: string[]): string[][] { + if (includes.includes(BuildTaskProvider.workspace)) { + includes = projectPaths; + } + + includes = includes.filter(p => { + return !excludes.some(excludePath => path.relative(excludePath, p) === ""); + }); + + const result: string[] = []; + const invalid: string[] = []; + for (const p of includes) { + const valid = projectPaths.some(projectPath => path.relative(projectPath, p) === ""); + if (valid) { + result.push(p); + } else { + invalid.push(p); + } + } + return [result, invalid]; +} + +interface IBuildTaskDefinition extends TaskDefinition { + /** + * The root paths of the projects to be built. + */ + paths: string[]; + /** + * Whether this is a full build or not. + */ + isFullBuild: boolean; +} + +enum ReturnCode { + Success = 0, + InvalidPath = 1, + UnsupportedTask = 2, + EmptyIncludedPath = 3, + UserError = 64, + CommandFail = -1, + Cancelled = -32800, +} diff --git a/test/suite/buildTask.test.ts b/test/suite/buildTask.test.ts new file mode 100644 index 00000000..8a4bab84 --- /dev/null +++ b/test/suite/buildTask.test.ts @@ -0,0 +1,68 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT license. + +import * as assert from "assert"; +import { Task, tasks, TaskScope } from "vscode"; +import { BuildTaskProvider, categorizePaths, getFinalPaths } from "../../extension.bundle"; +import { setupTestEnv } from "../shared"; + +// tslint:disable: only-arrow-functions +// tslint:disable: no-object-literal-type-assertion +// tslint:disable: no-invalid-template-strings + +suite("Build Task Tests", () => { + + suiteSetup(setupTestEnv); + + test("test providing default build task", async function() { + const vscodeTasks: Task[] = await tasks.fetchTasks(); + const exportJarTask: Task | undefined = vscodeTasks.find((t: Task) => { + return t.name === BuildTaskProvider.defaultTaskName + && t.source === BuildTaskProvider.type; + }); + assert.ok(exportJarTask !== undefined); + }); + + test("test categorizePaths()", async function() { + const [includes, excludes, invalid] = categorizePaths([ + BuildTaskProvider.workspace, + "a/b/c", + "!foo" + ], TaskScope.Workspace); + assert.deepStrictEqual(includes.length, 2); + assert.deepStrictEqual(excludes.length, 1); + assert.deepStrictEqual(invalid.length, 0); + }); + + test("test getFinalPaths() 1", async function() { + const [result, invalid] = getFinalPaths([ + BuildTaskProvider.workspace, + "a/b/c", + ], [ + "foo/bar", + ], [ + "a/b/c", + "foo/bar", + "test/path" + ]); + assert.deepStrictEqual(result.length, 2); + assert.deepStrictEqual(invalid.length, 0); + }); + + test("test getFinalPaths() 2", async function() { + const [result, invalid] = getFinalPaths([ + "a/b/c", + "non/exist2" + ], [ + "foo/bar", + "non/exist" + ], [ + "a/b/c", + "foo/bar", + "test/path" + ]); + assert.deepStrictEqual(result.length, 1); + assert.deepStrictEqual(invalid.length, 1); + assert.deepStrictEqual(invalid[0], "non/exist2"); + }); +}); From 8f59095587fbee1b8835f9cc52791411c460fec6 Mon Sep 17 00:00:00 2001 From: Sheng Chen Date: Wed, 13 Jul 2022 16:02:01 +0800 Subject: [PATCH 112/352] feat: Add 'Build All' and 'Build Project' commands into context menu. (#663) Signed-off-by: sheche --- package.json | 18 ++++++++++++++++++ package.nls.json | 3 ++- package.nls.zh.json | 3 ++- src/commands.ts | 2 ++ src/views/dependencyDataProvider.ts | 10 +++++++++- 5 files changed, 33 insertions(+), 3 deletions(-) diff --git a/package.json b/package.json index c9e411a0..322b4359 100644 --- a/package.json +++ b/package.json @@ -88,6 +88,10 @@ "command": "java.project.update", "title": "%contributes.commands.java.project.update%" }, + { + "command": "java.project.rebuild", + "title": "%contributes.commands.java.project.rebuild%" + }, { "command": "java.view.package.revealInProjectExplorer", "title": "%contributes.commands.java.view.package.revealInProjectExplorer%", @@ -358,6 +362,10 @@ "command": "java.project.update", "when": "false" }, + { + "command": "java.project.rebuild", + "when": "false" + }, { "command": "java.view.package.revealInProjectExplorer", "when": "false" @@ -480,6 +488,16 @@ "when": "view == javaProjectExplorer && !explorerResourceMoveableToTrash && viewItem =~ /java:(file|type|folder)(?=.*?\\b\\+uri\\b)/", "group": "7_modification@20" }, + { + "command": "java.project.build.workspace", + "when": "view == javaProjectExplorer && viewItem =~ /java:project(?=.*?\\b\\+java\\b)(?=.*?\\b\\+uri\\b)/", + "group":"8_execution@5" + }, + { + "command": "java.project.rebuild", + "when": "view == javaProjectExplorer && viewItem =~ /java:project(?=.*?\\b\\+java\\b)(?=.*?\\b\\+uri\\b)/", + "group": "8_execution@6" + }, { "command": "java.view.package.newJavaClass", "when": "view == javaProjectExplorer && viewItem =~ /java:(package|packageRoot)(?=.*?\\b\\+source\\b)(?=.*?\\b\\+uri\\b)/", diff --git a/package.nls.json b/package.nls.json index ba59ab8f..4cb668cb 100644 --- a/package.nls.json +++ b/package.nls.json @@ -5,9 +5,10 @@ "contributes.commands.java.project.addLibraryFolders": "Add Library Folders to Project Classpath...", "contributes.commands.java.project.removeLibrary": "Remove from Project Classpath", "contributes.commands.java.view.package.refresh": "Refresh", - "contributes.commands.java.project.build.workspace": "Rebuild Workspace", + "contributes.commands.java.project.build.workspace": "Rebuild All", "contributes.commands.java.project.clean.workspace": "Clean Workspace", "contributes.commands.java.project.update": "Update Project", + "contributes.commands.java.project.rebuild": "Rebuild Project", "contributes.commands.java.view.package.revealInProjectExplorer": "Reveal in Java Project Explorer", "contributes.commands.java.view.package.changeToFlatPackageView":"Flat View", "contributes.commands.java.view.package.changeToHierarchicalPackageView":"Hierarchical View", diff --git a/package.nls.zh.json b/package.nls.zh.json index 7d9cedb9..5ed400d6 100644 --- a/package.nls.zh.json +++ b/package.nls.zh.json @@ -5,9 +5,10 @@ "contributes.commands.java.project.addLibraryFolders": "添加文件夹至项目 Classpath...", "contributes.commands.java.project.removeLibrary": "从项目 Classpath 中移除", "contributes.commands.java.view.package.refresh": "刷新", - "contributes.commands.java.project.build.workspace": "重新构建工作空间", + "contributes.commands.java.project.build.workspace": "重新构建所有项目", "contributes.commands.java.project.clean.workspace": "清理工作空间", "contributes.commands.java.project.update": "更新项目", + "contributes.commands.java.project.rebuild": "重新构建项目", "contributes.commands.java.view.package.revealInProjectExplorer": "在 Java 项目视图中显示", "contributes.commands.java.view.package.changeToFlatPackageView":"平行显示", "contributes.commands.java.view.package.changeToHierarchicalPackageView":"层级显示", diff --git a/src/commands.ts b/src/commands.ts index 4f35d29a..bf090287 100644 --- a/src/commands.ts +++ b/src/commands.ts @@ -64,6 +64,8 @@ export namespace Commands { export const JAVA_PROJECT_UPDATE = "java.project.update"; + export const JAVA_PROJECT_REBUILD = "java.project.rebuild"; + export const JAVA_PROJECT_EXPLORER_FOCUS = "javaProjectExplorer.focus"; export const JAVA_PROJECT_LIST = "java.project.list"; diff --git a/src/views/dependencyDataProvider.ts b/src/views/dependencyDataProvider.ts index ec7158f1..be72d18e 100644 --- a/src/views/dependencyDataProvider.ts +++ b/src/views/dependencyDataProvider.ts @@ -6,7 +6,7 @@ import { commands, Event, EventEmitter, ExtensionContext, ProviderResult, RelativePattern, TreeDataProvider, TreeItem, Uri, window, workspace, } from "vscode"; -import { instrumentOperationAsVsCodeCommand } from "vscode-extension-telemetry-wrapper"; +import { instrumentOperationAsVsCodeCommand, sendError } from "vscode-extension-telemetry-wrapper"; import { contextManager } from "../../extension.bundle"; import { Commands } from "../commands"; import { Context } from "../constants"; @@ -69,6 +69,14 @@ export class DependencyDataProvider implements TreeDataProvider { commands.executeCommand(Commands.JAVA_PROJECT_CONFIGURATION_UPDATE, uris[0]); } })); + context.subscriptions.push(instrumentOperationAsVsCodeCommand(Commands.JAVA_PROJECT_REBUILD, async (node: INodeData) => { + if (!node.uri) { + sendError(new Error("Uri not available when building project")); + window.showErrorMessage("The URI of the project is not available, you can try to trigger the command 'Java: Rebuild Projects' from Command Palette."); + return; + } + commands.executeCommand(Commands.BUILD_PROJECT, Uri.parse(node.uri), true); + })); Settings.registerConfigurationListener((updatedConfig, oldConfig) => { if (updatedConfig.refreshDelay !== oldConfig.refreshDelay) { From 755f1c13b66986ea9e0f5120d7e410d0c105ea2b Mon Sep 17 00:00:00 2001 From: Sheng Chen Date: Wed, 13 Jul 2022 16:30:27 +0800 Subject: [PATCH 113/352] ui: Add submenu for Maven and Gradle (#664) Signed-off-by: sheche --- package.json | 31 +++++++++++++++++++++++++++-- package.nls.json | 2 +- package.nls.zh.json | 2 +- src/views/dependencyDataProvider.ts | 3 ++- 4 files changed, 33 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 322b4359..b57b73bf 100644 --- a/package.json +++ b/package.json @@ -550,12 +550,39 @@ "group": "inline" }, { - "command": "java.project.update", - "when": "view == javaProjectExplorer && viewItem =~ /java:project(?=.*?\\b\\+uri\\b)(?=.*?\\b\\+(maven|gradle)\\b)/", + "submenu": "javaProject.maven", + "when": "view == javaProjectExplorer && viewItem =~ /java:project(?=.*?\\b\\+uri\\b)(?=.*?\\b\\+(maven)\\b)/", + "group": "9_configuration@10" + }, + { + "submenu": "javaProject.gradle", + "when": "view == javaProjectExplorer && viewItem =~ /java:project(?=.*?\\b\\+uri\\b)(?=.*?\\b\\+(gradle)\\b)/", "group": "9_configuration@10" } + ], + "javaProject.maven": [ + { + "command": "java.project.update", + "group": "maven@10" + } + ], + "javaProject.gradle": [ + { + "command": "java.project.update", + "group": "gradle@10" + } ] }, + "submenus": [ + { + "id": "javaProject.maven", + "label": "Maven" + }, + { + "id": "javaProject.gradle", + "label": "Gradle" + } + ], "views": { "explorer": [ { diff --git a/package.nls.json b/package.nls.json index 4cb668cb..95206a17 100644 --- a/package.nls.json +++ b/package.nls.json @@ -7,8 +7,8 @@ "contributes.commands.java.view.package.refresh": "Refresh", "contributes.commands.java.project.build.workspace": "Rebuild All", "contributes.commands.java.project.clean.workspace": "Clean Workspace", - "contributes.commands.java.project.update": "Update Project", "contributes.commands.java.project.rebuild": "Rebuild Project", + "contributes.commands.java.project.update": "Reload Project", "contributes.commands.java.view.package.revealInProjectExplorer": "Reveal in Java Project Explorer", "contributes.commands.java.view.package.changeToFlatPackageView":"Flat View", "contributes.commands.java.view.package.changeToHierarchicalPackageView":"Hierarchical View", diff --git a/package.nls.zh.json b/package.nls.zh.json index 5ed400d6..e816f6ed 100644 --- a/package.nls.zh.json +++ b/package.nls.zh.json @@ -7,8 +7,8 @@ "contributes.commands.java.view.package.refresh": "刷新", "contributes.commands.java.project.build.workspace": "重新构建所有项目", "contributes.commands.java.project.clean.workspace": "清理工作空间", - "contributes.commands.java.project.update": "更新项目", "contributes.commands.java.project.rebuild": "重新构建项目", + "contributes.commands.java.project.update": "重新加载项目", "contributes.commands.java.view.package.revealInProjectExplorer": "在 Java 项目视图中显示", "contributes.commands.java.view.package.changeToFlatPackageView":"平行显示", "contributes.commands.java.view.package.changeToHierarchicalPackageView":"层级显示", diff --git a/src/views/dependencyDataProvider.ts b/src/views/dependencyDataProvider.ts index be72d18e..fba59d5e 100644 --- a/src/views/dependencyDataProvider.ts +++ b/src/views/dependencyDataProvider.ts @@ -60,7 +60,8 @@ export class DependencyDataProvider implements TreeDataProvider { commands.executeCommand(Commands.JAVA_CLEAN_WORKSPACE))); context.subscriptions.push(instrumentOperationAsVsCodeCommand(Commands.JAVA_PROJECT_UPDATE, async (node: INodeData) => { if (!node.uri) { - window.showErrorMessage("The URI of the project is not available, you can try to update the project by right clicking the project configuration file (pom.xml or *.gradle) from the File Explorer."); + sendError(new Error("Uri not available when reloading project")); + window.showErrorMessage("The URI of the project is not available, you can try to trigger the command 'Java: Reload Project' from Command Palette."); return; } const pattern: RelativePattern = new RelativePattern(Uri.parse(node.uri).fsPath, "{pom.xml,*.gradle}"); From 9d65500d64e6cab020e78c8634e4c2d84de721dc Mon Sep 17 00:00:00 2001 From: Mu-Tsun Tsai <39870664+MuTsunTsai@users.noreply.github.com> Date: Wed, 20 Jul 2022 13:33:18 +0800 Subject: [PATCH 114/352] feat: Add zh-tw locale (#669) Co-authored-by: Donald --- package.nls.zh-tw.json | 49 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) create mode 100644 package.nls.zh-tw.json diff --git a/package.nls.zh-tw.json b/package.nls.zh-tw.json new file mode 100644 index 00000000..bcb6cf9d --- /dev/null +++ b/package.nls.zh-tw.json @@ -0,0 +1,49 @@ +{ + "description": "在 Visual Studio Code 中管理 Java 專案", + "contributes.commands.java.project.create": "建立 Java 專案...", + "contributes.commands.java.project.addLibraries": "新增 Jar 檔案至專案 Classpath...", + "contributes.commands.java.project.addLibraryFolders": "新增資料夾至專案 Classpath...", + "contributes.commands.java.project.removeLibrary": "從專案 Classpath 中移除", + "contributes.commands.java.view.package.refresh": "重新整理", + "contributes.commands.java.project.build.workspace": "重新建置所有專案", + "contributes.commands.java.project.clean.workspace": "清理工作區", + "contributes.commands.java.project.rebuild": "重新建置專案", + "contributes.commands.java.project.update": "重新載入專案", + "contributes.commands.java.view.package.revealInProjectExplorer": "在 Java 專案視圖中顯示", + "contributes.commands.java.view.package.changeToFlatPackageView":"平行顯示", + "contributes.commands.java.view.package.changeToHierarchicalPackageView":"階層顯示", + "contributes.commands.java.view.package.linkWithFolderExplorer":"與編輯器同步", + "contributes.commands.java.view.package.unlinkWithFolderExplorer":"與編輯器解除同步", + "contributes.commands.java.view.package.revealFileInOS": "在檔案總管中顯示", + "contributes.commands.java.view.package.exportJar": "匯出成 Jar 檔案...", + "contributes.commands.java.view.package.copyFilePath": "複製路徑", + "contributes.commands.java.view.package.copyRelativeFilePath": "複製相對路徑", + "contributes.commands.java.view.package.newJavaClass": "建立 Java 類別", + "contributes.commands.java.view.package.newPackage": "建立套件", + "contributes.commands.java.view.package.renameFile": "重新命名", + "contributes.commands.java.view.package.moveFileToTrash": "刪除", + "contributes.commands.java.view.package.deleteFilePermanently": "永久刪除", + "configuration.java.dependency.showMembers": "在 Java 專案管理員中顯示成員", + "configuration.java.dependency.syncWithFolderExplorer": "在 Java 專案管理員中同步關聯當前開啟的檔案", + "configuration.java.dependency.autoRefresh": "在 Java 專案管理員中自動同步修改", + "configuration.java.dependency.refreshDelay": "控制 Java 專案管理員重新整理的延遲時間 (毫秒)", + "configuration.java.dependency.packagePresentation": "Java 套件顯示方式: 平行顯示或者分層顯示", + "configuration.java.project.exportJar.targetPath.customization": "匯出 Jar 檔案的路徑。如果您想要手動選擇輸出路徑,可以不填。", + "configuration.java.project.exportJar.targetPath.workspaceFolder": "匯出 Jar 檔案到工作區資料夾下。Jar 檔案的名稱和工作區資料夾的名稱相同。", + "configuration.java.project.exportJar.targetPath.select": "在匯出 Jar 檔案時手動選擇輸出位置。", + "taskDefinitions.java.project.exportJar.label": "匯出 Jar 任務的名稱。", + "taskDefinitions.java.project.exportJar.elements": "匯出 Jar 檔案的內容列表。", + "taskDefinitions.java.project.exportJar.mainClass": "匯出 Jar 檔案的 main 函數所在的類別。", + "taskDefinitions.java.project.exportJar.compileOutput": "在 runtime scope 內包含輸出的類別檔案的資料夾。", + "taskDefinitions.java.project.exportJar.testCompileOutput": "在 test scope 內包含輸出的類別檔案的資料夾。", + "taskDefinitions.java.project.exportJar.dependencies": "在 runtime scope 內的製品相依性。", + "taskDefinitions.java.project.exportJar.testDependencies": "在 test scope 內的製品相依性。", + "taskDefinitions.java.project.build.path": "被建置專案的根目錄路徑。絕對路徑或者相對於工作區目錄的相對路徑都可以使用。", + "taskDefinitions.java.project.build.path.workspace": "工作區中的所有專案。", + "taskDefinitions.java.project.build.path.exclude": "'!' 後的路徑將會從待建置專案路徑中移除。", + "taskDefinitions.java.project.build.isFullBuild": "是否要重新建置專案。", + "viewsWelcome.workbench.createNewJavaProject": "您也可以[開啟一個 Java 專案目錄](command:_java.project.open),或點擊下方按鈕建立一個新的 Java 專案。\n[建立 Java 專案](command:java.project.create)", + "viewsWelcome.workbench.noJavaProject": "當前工作區未發現 Java 專案,您可以[開啟一個 Java 專案目錄](command:_java.project.open),或點擊下方按鈕建立一個新的 Java 專案。\n[建立 Java 專案](command:java.project.create)", + "viewsWelcome.workbench.inLightWeightMode": "若要檢視各專案,你可以將專案匯入到工作區中。\n[匯入專案](command:java.server.mode.switch?%5B%22Standard%22,true%5D)", + "viewsWelcome.workbench.installLanguageSupport": "Java 專案視圖需要安裝並啟用 [Extension Pack for Java](command:extension.open?%5B%22vscjava.vscode-java-pack%22%5D) 以提供完整的功能。\n[安裝](command:java.project.installExtension?%5B%22vscjava.vscode-java-pack%22%5D)" +} \ No newline at end of file From 5552e538395dc0f506b09295320260342d6f06b7 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 21 Jul 2022 14:54:53 +0800 Subject: [PATCH 115/352] chore(deps): Bump terser from 5.14.0 to 5.14.2 (#670) Bumps [terser](https://github.com/terser/terser) from 5.14.0 to 5.14.2. - [Release notes](https://github.com/terser/terser/releases) - [Changelog](https://github.com/terser/terser/blob/master/CHANGELOG.md) - [Commits](https://github.com/terser/terser/commits) --- updated-dependencies: - dependency-name: terser dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index ab46b5ca..6e382a72 100644 --- a/package-lock.json +++ b/package-lock.json @@ -3139,9 +3139,9 @@ } }, "terser": { - "version": "5.14.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.14.0.tgz", - "integrity": "sha512-JC6qfIEkPBd9j1SMO3Pfn+A6w2kQV54tv+ABQLgZr7dA3k/DL/OBoYSWxzVpZev3J+bUHXfr55L8Mox7AaNo6g==", + "version": "5.14.2", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.14.2.tgz", + "integrity": "sha512-oL0rGeM/WFQCUd0y2QrWxYnq7tfSuKBiqTjRPWrRgB46WD/kiwHwF8T23z78H6Q6kGCuuHcPB+KULHRdxvVGQA==", "dev": true, "requires": { "@jridgewell/source-map": "^0.3.2", From f65f3811d21dcbd339b3a0b17cca3c6184d1778f Mon Sep 17 00:00:00 2001 From: Sheng Chen Date: Fri, 22 Jul 2022 09:46:31 +0800 Subject: [PATCH 116/352] chore: Rename to package.json.zh-cn.json (#672) Signed-off-by: Sheng Chen Co-authored-by: Shi Chen --- package.nls.zh.json => package.nls.zh-cn.json | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename package.nls.zh.json => package.nls.zh-cn.json (100%) diff --git a/package.nls.zh.json b/package.nls.zh-cn.json similarity index 100% rename from package.nls.zh.json rename to package.nls.zh-cn.json From 336ebb4a37349e8e8d5087b2d3b5603e1624fe5a Mon Sep 17 00:00:00 2001 From: Sheng Chen Date: Fri, 22 Jul 2022 15:42:54 +0800 Subject: [PATCH 117/352] feat: Show reload button at editor title when there is reload required diagnostics (#671) * feat: Show reload button at editor title when there is reload required diagnostics Signed-off-by: Sheng Chen --- package.json | 17 +++++++++++ package.nls.json | 1 + package.nls.zh-cn.json | 1 + package.nls.zh-tw.json | 1 + src/commands.ts | 2 ++ src/constants.ts | 6 ++++ src/extension.ts | 50 ++++++++++++++++++++++++++++++-- test/maven-suite/context.test.ts | 35 ++++++++++++++++++++++ 8 files changed, 110 insertions(+), 3 deletions(-) create mode 100644 test/maven-suite/context.test.ts diff --git a/package.json b/package.json index b57b73bf..eb4dcff1 100644 --- a/package.json +++ b/package.json @@ -88,6 +88,12 @@ "command": "java.project.update", "title": "%contributes.commands.java.project.update%" }, + { + "command": "java.project.reloadProjectFromActiveFile", + "title": "%contributes.commands.java.project.reloadProjectFromActiveFile%", + "category": "Java", + "icon": "$(sync)" + }, { "command": "java.project.rebuild", "title": "%contributes.commands.java.project.rebuild%" @@ -282,6 +288,10 @@ } ], "commandPalette": [ + { + "command": "java.project.reloadProjectFromActiveFile", + "when": "false" + }, { "command": "java.view.package.exportJar", "when": "java:serverMode == Standard && !java:noJavaProjects" @@ -383,6 +393,13 @@ "group": "navigation@100" } ], + "editor/title": [ + { + "command": "java.project.reloadProjectFromActiveFile", + "when": "java:reloadProjectActive && javaLSReady", + "group": "navigation" + } + ], "editor/title/context": [ { "command": "java.view.package.revealInProjectExplorer", diff --git a/package.nls.json b/package.nls.json index 95206a17..df8d0d19 100644 --- a/package.nls.json +++ b/package.nls.json @@ -9,6 +9,7 @@ "contributes.commands.java.project.clean.workspace": "Clean Workspace", "contributes.commands.java.project.rebuild": "Rebuild Project", "contributes.commands.java.project.update": "Reload Project", + "contributes.commands.java.project.reloadProjectFromActiveFile": "Reload Java Project", "contributes.commands.java.view.package.revealInProjectExplorer": "Reveal in Java Project Explorer", "contributes.commands.java.view.package.changeToFlatPackageView":"Flat View", "contributes.commands.java.view.package.changeToHierarchicalPackageView":"Hierarchical View", diff --git a/package.nls.zh-cn.json b/package.nls.zh-cn.json index e816f6ed..741c137f 100644 --- a/package.nls.zh-cn.json +++ b/package.nls.zh-cn.json @@ -9,6 +9,7 @@ "contributes.commands.java.project.clean.workspace": "清理工作空间", "contributes.commands.java.project.rebuild": "重新构建项目", "contributes.commands.java.project.update": "重新加载项目", + "contributes.commands.java.project.reloadProjectFromActiveFile": "重新加载 Java 项目", "contributes.commands.java.view.package.revealInProjectExplorer": "在 Java 项目视图中显示", "contributes.commands.java.view.package.changeToFlatPackageView":"平行显示", "contributes.commands.java.view.package.changeToHierarchicalPackageView":"层级显示", diff --git a/package.nls.zh-tw.json b/package.nls.zh-tw.json index bcb6cf9d..2a48fb6d 100644 --- a/package.nls.zh-tw.json +++ b/package.nls.zh-tw.json @@ -9,6 +9,7 @@ "contributes.commands.java.project.clean.workspace": "清理工作區", "contributes.commands.java.project.rebuild": "重新建置專案", "contributes.commands.java.project.update": "重新載入專案", + "contributes.commands.java.project.reloadProjectFromActiveFile": "重新載入 Java 專案", "contributes.commands.java.view.package.revealInProjectExplorer": "在 Java 專案視圖中顯示", "contributes.commands.java.view.package.changeToFlatPackageView":"平行顯示", "contributes.commands.java.view.package.changeToHierarchicalPackageView":"階層顯示", diff --git a/src/commands.ts b/src/commands.ts index bf090287..60a2a179 100644 --- a/src/commands.ts +++ b/src/commands.ts @@ -64,6 +64,8 @@ export namespace Commands { export const JAVA_PROJECT_UPDATE = "java.project.update"; + export const JAVA_PROJECT_RELOAD_ACTIVE_FILE = "java.project.reloadProjectFromActiveFile"; + export const JAVA_PROJECT_REBUILD = "java.project.rebuild"; export const JAVA_PROJECT_EXPLORER_FOCUS = "javaProjectExplorer.focus"; diff --git a/src/constants.ts b/src/constants.ts index 36b81729..349f6f08 100644 --- a/src/constants.ts +++ b/src/constants.ts @@ -6,6 +6,7 @@ export namespace Context { export const LANGUAGE_SUPPORT_INSTALLED: string = "java:languageSupportInstalled"; export const NO_JAVA_PROJECT: string = "java:noJavaProjects"; export const WORKSPACE_CONTAINS_BUILD_FILES: string = "java:workspaceContainsBuildFiles"; + export const RELOAD_PROJECT_ACTIVE: string = "java:reloadProjectActive"; } export namespace Explorer { @@ -31,3 +32,8 @@ export namespace Explorer { export namespace ExtensionName { export const JAVA_LANGUAGE_SUPPORT: string = "redhat.java"; } + +/** + * The files names for all the build files we support. + */ +export const buildFiles = ["pom.xml", "build.gradle", "settings.gradle", "build.gradle.kts", "settings.gradle.kts"]; diff --git a/src/extension.ts b/src/extension.ts index bc437ff9..21c98971 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -1,11 +1,13 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT license. -import { commands, Extension, ExtensionContext, extensions, tasks, Uri, workspace } from "vscode"; -import { dispose as disposeTelemetryWrapper, initializeFromJsonFile, instrumentOperation, sendInfo } from "vscode-extension-telemetry-wrapper"; + +import * as path from "path"; +import { commands, Diagnostic, Extension, ExtensionContext, extensions, languages, tasks, TextDocument, TextEditor, Uri, window, workspace } from "vscode"; +import { dispose as disposeTelemetryWrapper, initializeFromJsonFile, instrumentOperation, instrumentOperationAsVsCodeCommand, sendInfo } from "vscode-extension-telemetry-wrapper"; import { Commands, contextManager } from "../extension.bundle"; import { BuildTaskProvider } from "./tasks/build/buildTaskProvider"; -import { Context, ExtensionName } from "./constants"; +import { buildFiles, Context, ExtensionName } from "./constants"; import { LibraryController } from "./controllers/libraryController"; import { ProjectController } from "./controllers/projectController"; import { init as initExpService } from "./ExperimentationService"; @@ -40,6 +42,28 @@ async function activateExtension(_operationId: string, context: ExtensionContext context.subscriptions.push(syncHandler); context.subscriptions.push(tasks.registerTaskProvider(ExportJarTaskProvider.exportJarType, new ExportJarTaskProvider())); context.subscriptions.push(tasks.registerTaskProvider(BuildTaskProvider.type, new BuildTaskProvider())); + + context.subscriptions.push(window.onDidChangeActiveTextEditor((e: TextEditor | undefined) => { + setContextForReloadProject(e?.document); + })); + context.subscriptions.push(languages.onDidChangeDiagnostics(() => { + setContextForReloadProject(window.activeTextEditor?.document); + })); + instrumentOperationAsVsCodeCommand(Commands.JAVA_PROJECT_RELOAD_ACTIVE_FILE, (uri?: Uri) => { + if (!uri) { + const activeDocument = window.activeTextEditor?.document; + if (!activeDocument) { + return; + } + uri = activeDocument.uri; + } + + if (!buildFiles.includes(path.basename(uri.fsPath))) { + return; + } + + commands.executeCommand(Commands.JAVA_PROJECT_CONFIGURATION_UPDATE, uri); + }); } // this method is called when your extension is deactivated @@ -61,3 +85,23 @@ function addExtensionChangeListener(context: ExtensionContext): void { context.subscriptions.push(extensionChangeListener); } } + +/** + * Set the context value when reload diagnostic is detected for the active + * build file. + */ +function setContextForReloadProject(document: TextDocument | undefined): void { + if (!document || !buildFiles.includes(path.basename(document.fileName))) { + contextManager.setContextValue(Context.RELOAD_PROJECT_ACTIVE, false); + return; + } + + const diagnostics: Diagnostic[] = languages.getDiagnostics(document.uri); + for (const diagnostic of diagnostics) { + if (diagnostic.message.startsWith("The build file has been changed")) { + contextManager.setContextValue(Context.RELOAD_PROJECT_ACTIVE, true); + return; + } + } + contextManager.setContextValue(Context.RELOAD_PROJECT_ACTIVE, false); +} diff --git a/test/maven-suite/context.test.ts b/test/maven-suite/context.test.ts new file mode 100644 index 00000000..c0d8848a --- /dev/null +++ b/test/maven-suite/context.test.ts @@ -0,0 +1,35 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT license. + +import * as path from "path"; +import * as assert from "assert"; +import { Diagnostic, DiagnosticSeverity, languages, Position, Range, Uri, window } from "vscode"; +import { contextManager } from "../../extension.bundle"; +import { setupTestEnv, Uris } from "../shared"; +import { sleep } from "../util"; + +// tslint:disable: only-arrow-functions +suite("Context Manager Tests", () => { + + suiteSetup(setupTestEnv); + + test("Can set reload project context correctly", async function() { + assert.strictEqual(!!contextManager.getContextValue("java:reloadProjectActive"), false); + + const pomUri = Uri.file(path.join(Uris.MAVEN_PROJECT_NODE, "pom.xml")); + await window.showTextDocument(pomUri); + assert.strictEqual(!!contextManager.getContextValue("java:reloadProjectActive"), false); + + const collection = languages.createDiagnosticCollection("test-collection"); + collection.set(pomUri, [new Diagnostic( + new Range(new Position(0, 0), new Position(0, 0)), + "The build file has been changed and may need reload to make it effective.", + DiagnosticSeverity.Information + )]); + await sleep(1000); + assert.strictEqual(!!contextManager.getContextValue("java:reloadProjectActive"), true); + + await window.showTextDocument(Uri.file(Uris.MAVEN_MAIN_CLASS)); + assert.strictEqual(!!contextManager.getContextValue("java:reloadProjectActive"), false); + }); +}); From 88f7d0ffb3fe0c80a21fc795867c45cb16c41ff7 Mon Sep 17 00:00:00 2001 From: Shi Chen Date: Mon, 25 Jul 2022 10:46:14 +0800 Subject: [PATCH 118/352] UX: Change export task type to `java (buildArtifact)` (#667) --- package.json | 62 +++++++++++++++- src/commands.ts | 2 + src/constants.ts | 1 + src/exportJarSteps/ExportJarTaskProvider.ts | 39 +++++++--- src/extension.ts | 22 +++++- src/tasks/migration/CodeActionProvider.ts | 41 +++++++++++ src/tasks/migration/DiagnosticProvider.ts | 82 +++++++++++++++++++++ src/tasks/migration/utils.ts | 39 ++++++++++ test/maven-suite/exportJar.test.ts | 2 +- test/maven/.vscode/tasks.json | 4 +- 10 files changed, 277 insertions(+), 17 deletions(-) create mode 100644 src/tasks/migration/CodeActionProvider.ts create mode 100644 src/tasks/migration/DiagnosticProvider.ts create mode 100644 src/tasks/migration/utils.ts diff --git a/package.json b/package.json index eb4dcff1..9b6004db 100644 --- a/package.json +++ b/package.json @@ -508,7 +508,7 @@ { "command": "java.project.build.workspace", "when": "view == javaProjectExplorer && viewItem =~ /java:project(?=.*?\\b\\+java\\b)(?=.*?\\b\\+uri\\b)/", - "group":"8_execution@5" + "group": "8_execution@5" }, { "command": "java.project.rebuild", @@ -635,7 +635,7 @@ ], "taskDefinitions": [ { - "type": "java", + "type": "java (buildArtifact)", "properties": { "label": { "type": "string", @@ -724,6 +724,64 @@ "description": "%taskDefinitions.java.project.build.isFullBuild%" } } + }, + { + "type": "java", + "when": "java:showDeprecatedTasks", + "properties": { + "label": { + "type": "string", + "description": "%taskDefinitions.java.project.exportJar.label%" + }, + "mainClass": { + "type": "string", + "description": "%taskDefinitions.java.project.exportJar.mainClass%" + }, + "targetPath": { + "type": "string", + "anyOf": [ + { + "type": "string" + }, + { + "enum": [ + "${workspaceFolder}/${workspaceFolderBasename}.jar", + "" + ], + "enumDescriptions": [ + "%configuration.java.project.exportJar.targetPath.workspaceFolder%", + "%configuration.java.project.exportJar.targetPath.select%" + ] + } + ], + "description": "%configuration.java.project.exportJar.targetPath.customization%" + }, + "elements": { + "type": "array", + "items": { + "anyOf": [ + { + "type": "string" + }, + { + "enum": [ + "${compileOutput}", + "${testCompileOutput}", + "${dependencies}", + "${testDependencies}" + ], + "enumDescriptions": [ + "%taskDefinitions.java.project.exportJar.compileOutput%", + "%taskDefinitions.java.project.exportJar.testCompileOutput%", + "%taskDefinitions.java.project.exportJar.dependencies%", + "%taskDefinitions.java.project.exportJar.testDependencies%" + ] + } + ] + }, + "description": "%taskDefinitions.java.project.exportJar.elements%" + } + } } ] }, diff --git a/src/commands.ts b/src/commands.ts index 60a2a179..8cf89057 100644 --- a/src/commands.ts +++ b/src/commands.ts @@ -94,6 +94,8 @@ export namespace Commands { export const INSTALL_EXTENSION = "java.project.installExtension"; + export const JAVA_UPDATE_DEPRECATED_TASK = "java.updateDeprecatedTask"; + /** * Commands from Visual Studio Code */ diff --git a/src/constants.ts b/src/constants.ts index 349f6f08..bcc8f9a0 100644 --- a/src/constants.ts +++ b/src/constants.ts @@ -7,6 +7,7 @@ export namespace Context { export const NO_JAVA_PROJECT: string = "java:noJavaProjects"; export const WORKSPACE_CONTAINS_BUILD_FILES: string = "java:workspaceContainsBuildFiles"; export const RELOAD_PROJECT_ACTIVE: string = "java:reloadProjectActive"; + export const SHOW_DEPRECATED_TASKS: string = "java:showDeprecatedTasks"; } export namespace Explorer { diff --git a/src/exportJarSteps/ExportJarTaskProvider.ts b/src/exportJarSteps/ExportJarTaskProvider.ts index 206cece9..0a2567e6 100644 --- a/src/exportJarSteps/ExportJarTaskProvider.ts +++ b/src/exportJarSteps/ExportJarTaskProvider.ts @@ -7,9 +7,11 @@ import * as _ from "lodash"; import { platform } from "os"; import { dirname, extname, isAbsolute, join, relative } from "path"; import { - CustomExecution, Event, EventEmitter, Pseudoterminal, Task, TaskDefinition, + CancellationToken, + CustomExecution, Event, EventEmitter, ProviderResult, Pseudoterminal, Task, TaskDefinition, TaskProvider, TaskRevealKind, tasks, TerminalDimensions, Uri, workspace, WorkspaceFolder, } from "vscode"; +import { sendInfo } from "vscode-extension-telemetry-wrapper"; import { buildWorkspace } from "../build"; import { Jdtls } from "../java/jdtls"; import { INodeData } from "../java/nodeData"; @@ -46,7 +48,7 @@ export async function executeExportJarTask(node?: INodeData): Promise { isExportingJar = true; const stepMetadata: IStepMetadata = { entry: node, - taskLabel: "exportjar:default", + taskLabel: "default", steps: [], projectList: [], elements: [], @@ -69,7 +71,7 @@ export async function executeExportJarTask(node?: INodeData): Promise { } export class ExportJarTaskProvider implements TaskProvider { - public static exportJarType: string = "java"; + public static exportJarType: string = "java (buildArtifact)"; public static getDefaultTask(stepMetadata: IStepMetadata): Task { if (!stepMetadata.workspaceFolder) { @@ -77,12 +79,12 @@ export class ExportJarTaskProvider implements TaskProvider { } const defaultDefinition: IExportJarTaskDefinition = { type: ExportJarTaskProvider.exportJarType, - label: "exportjar:default", + label: "default", targetPath: Settings.getExportJarTargetPath(), elements: [], mainClass: undefined, }; - const task: Task = new Task(defaultDefinition, stepMetadata.workspaceFolder, "exportjar:default", ExportJarTaskProvider.exportJarType, + const task: Task = new Task(defaultDefinition, stepMetadata.workspaceFolder, "default", ExportJarTaskProvider.exportJarType, new CustomExecution(async (resolvedDefinition: TaskDefinition): Promise => { return new ExportJarTaskTerminal(resolvedDefinition, stepMetadata); })); @@ -93,13 +95,17 @@ export class ExportJarTaskProvider implements TaskProvider { private tasks: Task[] | undefined; public async resolveTask(task: Task): Promise { + return ExportJarTaskProvider.resolveExportTask(task, ExportJarTaskProvider.exportJarType); + } + + public static async resolveExportTask(task: Task, type: string): Promise { const definition: IExportJarTaskDefinition = task.definition; const folder: WorkspaceFolder = task.scope; - const resolvedTask: Task = new Task(definition, folder, task.name, ExportJarTaskProvider.exportJarType, + const resolvedTask: Task = new Task(definition, folder, task.name, type, new CustomExecution(async (resolvedDefinition: IExportJarTaskDefinition): Promise => { const stepMetadata: IStepMetadata = { entry: undefined, - taskLabel: resolvedDefinition.label || `exportjar:${folder.name}`, + taskLabel: resolvedDefinition.label || folder.name, workspaceFolder: folder, projectList: await Jdtls.getProjects(folder.uri.toString()), steps: [], @@ -142,11 +148,11 @@ export class ExportJarTaskProvider implements TaskProvider { targetPath: Settings.getExportJarTargetPath(), elements: elementList, }; - const defaultTask: Task = new Task(defaultDefinition, folder, `exportjar:${folder.name}`, ExportJarTaskProvider.exportJarType, + const defaultTask: Task = new Task(defaultDefinition, folder, folder.name, ExportJarTaskProvider.exportJarType, new CustomExecution(async (resolvedDefinition: IExportJarTaskDefinition): Promise => { const stepMetadata: IStepMetadata = { entry: undefined, - taskLabel: resolvedDefinition.label || `exportjar:${folder.name}`, + taskLabel: resolvedDefinition.label || folder.name, workspaceFolder: folder, projectList: await Jdtls.getProjects(folder.uri.toString()), steps: [], @@ -162,6 +168,21 @@ export class ExportJarTaskProvider implements TaskProvider { } } +export class DeprecatedExportJarTaskProvider implements TaskProvider { + + public static type: string = "java"; + + provideTasks(_token: CancellationToken): ProviderResult { + return []; + } + + resolveTask(task: Task, _token: CancellationToken): ProviderResult { + sendInfo("", { name: "resolve-deprecated-export-task" }); + return ExportJarTaskProvider.resolveExportTask(task, DeprecatedExportJarTaskProvider.type); + } + +} + class ExportJarTaskTerminal implements Pseudoterminal { public writeEmitter = new EventEmitter(); diff --git a/src/extension.ts b/src/extension.ts index 21c98971..62b9e8a8 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -1,9 +1,9 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT license. - import * as path from "path"; -import { commands, Diagnostic, Extension, ExtensionContext, extensions, languages, tasks, TextDocument, TextEditor, Uri, window, workspace } from "vscode"; +import { commands, Diagnostic, Extension, ExtensionContext, extensions, languages, + Range, tasks, TextDocument, TextEditor, Uri, window, workspace } from "vscode"; import { dispose as disposeTelemetryWrapper, initializeFromJsonFile, instrumentOperation, instrumentOperationAsVsCodeCommand, sendInfo } from "vscode-extension-telemetry-wrapper"; import { Commands, contextManager } from "../extension.bundle"; import { BuildTaskProvider } from "./tasks/build/buildTaskProvider"; @@ -11,11 +11,14 @@ import { buildFiles, Context, ExtensionName } from "./constants"; import { LibraryController } from "./controllers/libraryController"; import { ProjectController } from "./controllers/projectController"; import { init as initExpService } from "./ExperimentationService"; -import { ExportJarTaskProvider } from "./exportJarSteps/ExportJarTaskProvider"; +import { DeprecatedExportJarTaskProvider, ExportJarTaskProvider } from "./exportJarSteps/ExportJarTaskProvider"; import { Settings } from "./settings"; import { syncHandler } from "./syncHandler"; import { EventCounter } from "./utility"; import { DependencyExplorer } from "./views/dependencyExplorer"; +import { DiagnosticProvider } from "./tasks/migration/DiagnosticProvider"; +import { setContextForDeprecatedTasks, updateExportTaskType } from "./tasks/migration/utils"; +import { CodeActionProvider } from "./tasks/migration/CodeActionProvider"; export async function activate(context: ExtensionContext): Promise { contextManager.initialize(context); @@ -40,6 +43,7 @@ async function activateExtension(_operationId: string, context: ExtensionContext context.subscriptions.push(DependencyExplorer.getInstance(context)); context.subscriptions.push(contextManager); context.subscriptions.push(syncHandler); + context.subscriptions.push(tasks.registerTaskProvider(DeprecatedExportJarTaskProvider.type, new DeprecatedExportJarTaskProvider())); context.subscriptions.push(tasks.registerTaskProvider(ExportJarTaskProvider.exportJarType, new ExportJarTaskProvider())); context.subscriptions.push(tasks.registerTaskProvider(BuildTaskProvider.type, new BuildTaskProvider())); @@ -64,6 +68,18 @@ async function activateExtension(_operationId: string, context: ExtensionContext commands.executeCommand(Commands.JAVA_PROJECT_CONFIGURATION_UPDATE, uri); }); + // handle deprecated tasks + context.subscriptions.push(new DiagnosticProvider()); + context.subscriptions.push(languages.registerCodeActionsProvider([{ + scheme: "file", + pattern: "**/.vscode/tasks.json" + }], new CodeActionProvider())); + context.subscriptions.push(instrumentOperationAsVsCodeCommand( + Commands.JAVA_UPDATE_DEPRECATED_TASK, async (document: TextDocument, range: Range) => { + await updateExportTaskType(document, range); + } + )); + setContextForDeprecatedTasks(); } // this method is called when your extension is deactivated diff --git a/src/tasks/migration/CodeActionProvider.ts b/src/tasks/migration/CodeActionProvider.ts new file mode 100644 index 00000000..faf06742 --- /dev/null +++ b/src/tasks/migration/CodeActionProvider.ts @@ -0,0 +1,41 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT license. + +import * as vscode from "vscode"; +import { Commands } from "../../commands"; +import { ExportJarTaskProvider } from "../../exportJarSteps/ExportJarTaskProvider"; +import { DiagnosticProvider } from "./DiagnosticProvider"; + +export class CodeActionProvider implements vscode.CodeActionProvider { + + public static JAVA_UPDATE_DEPRECATED_TASK_TITLE = "Update deprecated task"; + public static JAVA_BUILD_ARTIFACT_TYPE = `"type": "${ExportJarTaskProvider.exportJarType}"`; + + public provideCodeActions(document: vscode.TextDocument, range: vscode.Range | vscode.Selection, + _context: vscode.CodeActionContext, _token: vscode.CancellationToken): vscode.CodeAction[] | undefined { + const diagnostics = vscode.languages.getDiagnostics(document.uri); + if (diagnostics?.length) { + for (const diagnostic of diagnostics) { + if (diagnostic.source !== DiagnosticProvider.DIAGNOSTIC_SOURCE) { + continue; + } + if (diagnostic.range.contains(range)) { + const updateTaskCommand: vscode.Command = { + command: Commands.JAVA_UPDATE_DEPRECATED_TASK, + title: CodeActionProvider.JAVA_UPDATE_DEPRECATED_TASK_TITLE, + arguments: [ + document, + diagnostic.range + ] + }; + return [{ + title: CodeActionProvider.JAVA_UPDATE_DEPRECATED_TASK_TITLE, + kind: vscode.CodeActionKind.QuickFix, + command: updateTaskCommand + }]; + } + } + } + return []; + } +} diff --git a/src/tasks/migration/DiagnosticProvider.ts b/src/tasks/migration/DiagnosticProvider.ts new file mode 100644 index 00000000..88628f13 --- /dev/null +++ b/src/tasks/migration/DiagnosticProvider.ts @@ -0,0 +1,82 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT license. + +import * as _ from "lodash"; +import * as fs from "fs"; +import * as path from "path"; +import * as readline from "readline"; +import * as vscode from "vscode"; +import { getTasksJsonPaths } from "./utils"; +import { DeprecatedExportJarTaskProvider, ExportJarTaskProvider } from "../../exportJarSteps/ExportJarTaskProvider"; + +export class DiagnosticProvider implements vscode.Disposable { + public static DIAGNOSTIC_SOURCE = "Project Manager for Java"; + public static DEPRECATED_TASK_TYPE_DECLARATION = `\"type\": \"${DeprecatedExportJarTaskProvider.type}\"`; + public static DEPRECATED_TASK_TYPE_MESSAGE = `Tasks with type \"${DeprecatedExportJarTaskProvider.type}\" are deprecated and will not be supported in the future, please use \"${ExportJarTaskProvider.exportJarType}\" instead.`; + private diagnosticCollection: vscode.DiagnosticCollection; + private disposables: vscode.Disposable[] = []; + private refreshDiagnosticsTrigger: any; + + constructor() { + this.refreshDiagnosticsTrigger = _.debounce(this.refreshDiagnostics, 500 /** ms */); + this.diagnosticCollection = vscode.languages.createDiagnosticCollection("migrateExportTask"); + this.disposables.push(this.diagnosticCollection); + this.disposables.push(vscode.workspace.onDidChangeTextDocument(async (e) => { + if (path.basename(e.document.fileName) === "tasks.json") { + this.refreshDiagnosticsTrigger(e.document.uri); + } + })); + this.initializeDiagnostics(); + } + + public dispose() { + for (const d of this.disposables) { + d.dispose(); + } + } + + private async initializeDiagnostics(): Promise { + const tasksJsonPaths = await getTasksJsonPaths(); + for (const tasksJsonPath of tasksJsonPaths) { + const diagnostics: vscode.Diagnostic[] = await DiagnosticProvider.getDiagnosticsFromTasksJsonPath(tasksJsonPath); + this.diagnosticCollection.set(vscode.Uri.file(tasksJsonPath), diagnostics); + } + } + + private async refreshDiagnostics(uri: vscode.Uri): Promise { + const diagnostics: vscode.Diagnostic[] = await DiagnosticProvider.getDiagnosticsFromTasksJsonPath(uri.fsPath); + this.diagnosticCollection.set(uri, diagnostics); + } + + private static async getDiagnosticsFromTasksJsonPath(tasksJsonPath: string): Promise { + const diagnostics: vscode.Diagnostic[] = []; + const fileStream = fs.createReadStream(tasksJsonPath); + let lineNumber = 0; + const rl = readline.createInterface({ + input: fileStream, + crlfDelay: Infinity + }); + for await (const line of rl) { + const regExp: RegExp = /\"type\":\s*\"java\"/g; + const result: RegExpMatchArray | null = line.match(regExp); + if (result?.length === 1) { + const matchString = result[0]; + const columnNumber = line.indexOf(matchString); + if (columnNumber > -1) { + const diagnostic = new vscode.Diagnostic( + new vscode.Range( + new vscode.Position(lineNumber, columnNumber), + new vscode.Position(lineNumber, columnNumber + matchString.length) + ), + DiagnosticProvider.DEPRECATED_TASK_TYPE_MESSAGE, + vscode.DiagnosticSeverity.Warning + ); + diagnostic.source = DiagnosticProvider.DIAGNOSTIC_SOURCE; + diagnostics.push(diagnostic); + } + } + lineNumber++; + } + return diagnostics; + } +} diff --git a/src/tasks/migration/utils.ts b/src/tasks/migration/utils.ts new file mode 100644 index 00000000..2eca880e --- /dev/null +++ b/src/tasks/migration/utils.ts @@ -0,0 +1,39 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT license. + +import * as fse from "fs-extra"; +import * as path from "path"; +import { Range, tasks, TextDocument, workspace, WorkspaceEdit } from "vscode"; +import { DeprecatedExportJarTaskProvider } from "../../exportJarSteps/ExportJarTaskProvider"; +import { contextManager } from "../../contextManager"; +import { Context } from "../../constants"; +import { CodeActionProvider } from "./CodeActionProvider"; + +export async function getTasksJsonPaths(): Promise { + const tasksJsonPaths = []; + if (workspace.workspaceFolders?.length) { + for (const folder of workspace.workspaceFolders) { + const tasksJsonPath = path.join(folder.uri.fsPath, ".vscode", "tasks.json"); + if (await fse.pathExists(tasksJsonPath)) { + tasksJsonPaths.push(tasksJsonPath); + } + } + } + return tasksJsonPaths; +} + +export async function updateExportTaskType(document: TextDocument, range: Range): Promise { + const workspaceEdit = new WorkspaceEdit(); + workspaceEdit.replace(document.uri, range, CodeActionProvider.JAVA_BUILD_ARTIFACT_TYPE); + await workspace.applyEdit(workspaceEdit); + await document.save(); +} + +export async function setContextForDeprecatedTasks(): Promise { + await contextManager.setContextValue(Context.SHOW_DEPRECATED_TASKS, true); + const deprecatedTasks = await tasks.fetchTasks({ type: DeprecatedExportJarTaskProvider.type }); + if (deprecatedTasks?.length) { + return; + } + await contextManager.setContextValue(Context.SHOW_DEPRECATED_TASKS, false); +} diff --git a/test/maven-suite/exportJar.test.ts b/test/maven-suite/exportJar.test.ts index b81b4df2..e74241ef 100644 --- a/test/maven-suite/exportJar.test.ts +++ b/test/maven-suite/exportJar.test.ts @@ -20,7 +20,7 @@ suite("Export Jar Tests", () => { test("Can export jar correctly", async function() { const vscodeTasks: Task[] = await tasks.fetchTasks(); - const exportJarTask: Task | undefined = vscodeTasks.find((t: Task) => t.name === "java: exportjar:maven"); + const exportJarTask: Task | undefined = vscodeTasks.find((t: Task) => t.name === "java (buildArtifact): maven"); assert.ok(exportJarTask !== undefined); await new Promise(async (resolve) => { diff --git a/test/maven/.vscode/tasks.json b/test/maven/.vscode/tasks.json index a26671f3..1b09480c 100644 --- a/test/maven/.vscode/tasks.json +++ b/test/maven/.vscode/tasks.json @@ -2,8 +2,8 @@ "version": "2.0.0", "tasks": [ { - "type": "java", - "label": "java: exportjar:maven", + "type": "java (buildArtifact)", + "label": "java (buildArtifact): maven", "mainClass": "com.mycompany.app.App", "targetPath": "${workspaceFolder}/${workspaceFolderBasename}.jar", "elements": [ From 991310a72726637b61a35bec1582d2b2d2c1e243 Mon Sep 17 00:00:00 2001 From: Sheng Chen Date: Mon, 25 Jul 2022 11:03:48 +0800 Subject: [PATCH 119/352] chore: Prepare for 0.21.0 (#673) Signed-off-by: Sheng Chen --- CHANGELOG.md | 14 ++++++++++++++ .../META-INF/MANIFEST.MF | 2 +- .../com.microsoft.jdtls.ext.activator/pom.xml | 2 +- .../META-INF/MANIFEST.MF | 2 +- jdtls.ext/com.microsoft.jdtls.ext.core/pom.xml | 2 +- jdtls.ext/pom.xml | 2 +- package-lock.json | 2 +- package.json | 4 ++-- 8 files changed, 22 insertions(+), 8 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5a49f2e5..c56f9d23 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,20 @@ All notable changes to the "vscode-java-dependency" extension will be documented The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/) and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html). +## 0.21.0 +### Added +- Add sub-menu for Maven and Gradle projects in Java Project explorer. [PR#664](https://github.com/microsoft/vscode-java-dependency/pull/664) +- Add Rebuild commands into context menu. [PR#663](https://github.com/microsoft/vscode-java-dependency/pull/663) +- Support `Run Build Task...` in the `Terminal` menu. [PR#660](https://github.com/microsoft/vscode-java-dependency/pull/660) +- Show `Reload Java Project` shortcut in editor title area on demand. [PR#671](https://github.com/microsoft/vscode-java-dependency/pull/671) +- Add `zh-tw` locale. [PR#669](https://github.com/microsoft/vscode-java-dependency/pull/669), contributed by [@MuTsunTsai](https://github.com/MuTsunTsai) + +### Changed +- Rename the task type `java`, which is used for exporting jar files, to `java (buildArtifact)`. [#665](https://github.com/microsoft/vscode-java-dependency/issues/665) + +### Fixed +- [Bugs fixed](https://github.com/microsoft/vscode-java-dependency/issues?q=is%3Aissue+label%3Abug+milestone%3A0.21.0+is%3Aclosed) + ## 0.20.0 ### Added - Support Support drag and drop for Java Project explorer. [#613](https://github.com/microsoft/vscode-java-dependency/issues/613) diff --git a/jdtls.ext/com.microsoft.jdtls.ext.activator/META-INF/MANIFEST.MF b/jdtls.ext/com.microsoft.jdtls.ext.activator/META-INF/MANIFEST.MF index 4374f96c..f25ad223 100644 --- a/jdtls.ext/com.microsoft.jdtls.ext.activator/META-INF/MANIFEST.MF +++ b/jdtls.ext/com.microsoft.jdtls.ext.activator/META-INF/MANIFEST.MF @@ -2,7 +2,7 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: JDTLS EXT Activator Bundle-SymbolicName: com.microsoft.jdtls.ext.activator;singleton:=true -Bundle-Version: 0.20.0 +Bundle-Version: 0.21.0 Bundle-Activator: com.microsoft.jdtls.ext.activator.JdtlsExtActivator Bundle-RequiredExecutionEnvironment: JavaSE-1.8 Import-Package: org.eclipse.jdt.core, diff --git a/jdtls.ext/com.microsoft.jdtls.ext.activator/pom.xml b/jdtls.ext/com.microsoft.jdtls.ext.activator/pom.xml index 1deee26e..d134a6a8 100644 --- a/jdtls.ext/com.microsoft.jdtls.ext.activator/pom.xml +++ b/jdtls.ext/com.microsoft.jdtls.ext.activator/pom.xml @@ -5,7 +5,7 @@ com.microsoft.jdtls.ext jdtls-ext-parent - 0.20.0 + 0.21.0 com.microsoft.jdtls.ext.activator eclipse-plugin diff --git a/jdtls.ext/com.microsoft.jdtls.ext.core/META-INF/MANIFEST.MF b/jdtls.ext/com.microsoft.jdtls.ext.core/META-INF/MANIFEST.MF index 9522f485..fd4c383f 100644 --- a/jdtls.ext/com.microsoft.jdtls.ext.core/META-INF/MANIFEST.MF +++ b/jdtls.ext/com.microsoft.jdtls.ext.core/META-INF/MANIFEST.MF @@ -2,7 +2,7 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: JDTLS EXT Core Bundle-SymbolicName: com.microsoft.jdtls.ext.core;singleton:=true -Bundle-Version: 0.20.0 +Bundle-Version: 0.21.0 Bundle-Activator: com.microsoft.jdtls.ext.core.JdtlsExtActivator Bundle-RequiredExecutionEnvironment: JavaSE-1.8 Bundle-ActivationPolicy: lazy diff --git a/jdtls.ext/com.microsoft.jdtls.ext.core/pom.xml b/jdtls.ext/com.microsoft.jdtls.ext.core/pom.xml index ac0c184a..36e77457 100644 --- a/jdtls.ext/com.microsoft.jdtls.ext.core/pom.xml +++ b/jdtls.ext/com.microsoft.jdtls.ext.core/pom.xml @@ -5,7 +5,7 @@ com.microsoft.jdtls.ext jdtls-ext-parent - 0.20.0 + 0.21.0 com.microsoft.jdtls.ext.core eclipse-plugin diff --git a/jdtls.ext/pom.xml b/jdtls.ext/pom.xml index 77a5f209..2cc36567 100644 --- a/jdtls.ext/pom.xml +++ b/jdtls.ext/pom.xml @@ -4,7 +4,7 @@ com.microsoft.jdtls.ext jdtls-ext-parent ${base.name} :: Parent - 0.20.0 + 0.21.0 pom Java Project Manager diff --git a/package-lock.json b/package-lock.json index 6e382a72..41a06937 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "vscode-java-dependency", - "version": "0.20.0", + "version": "0.21.0", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 9b6004db..5f338088 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "vscode-java-dependency", "displayName": "Project Manager for Java", "description": "%description%", - "version": "0.20.0", + "version": "0.21.0", "publisher": "vscjava", "preview": true, "aiKey": "5c642b22-e845-4400-badb-3f8509a70777", @@ -42,7 +42,7 @@ "main": "./main.js", "contributes": { "javaExtensions": [ - "./server/com.microsoft.jdtls.ext.core-0.20.0.jar" + "./server/com.microsoft.jdtls.ext.core-0.21.0.jar" ], "commands": [ { From 93d1ef7b95d82dd9743d2e1f1d9da9b77cf83489 Mon Sep 17 00:00:00 2001 From: Shi Chen Date: Mon, 25 Jul 2022 13:42:35 +0800 Subject: [PATCH 120/352] fix: Only show migration Quick fixes for opened tasks.json (#674) --- src/tasks/migration/DiagnosticProvider.ts | 22 +++++++++++----------- src/tasks/migration/utils.ts | 15 --------------- 2 files changed, 11 insertions(+), 26 deletions(-) diff --git a/src/tasks/migration/DiagnosticProvider.ts b/src/tasks/migration/DiagnosticProvider.ts index 88628f13..85e1bdbb 100644 --- a/src/tasks/migration/DiagnosticProvider.ts +++ b/src/tasks/migration/DiagnosticProvider.ts @@ -6,7 +6,6 @@ import * as fs from "fs"; import * as path from "path"; import * as readline from "readline"; import * as vscode from "vscode"; -import { getTasksJsonPaths } from "./utils"; import { DeprecatedExportJarTaskProvider, ExportJarTaskProvider } from "../../exportJarSteps/ExportJarTaskProvider"; export class DiagnosticProvider implements vscode.Disposable { @@ -21,12 +20,21 @@ export class DiagnosticProvider implements vscode.Disposable { this.refreshDiagnosticsTrigger = _.debounce(this.refreshDiagnostics, 500 /** ms */); this.diagnosticCollection = vscode.languages.createDiagnosticCollection("migrateExportTask"); this.disposables.push(this.diagnosticCollection); - this.disposables.push(vscode.workspace.onDidChangeTextDocument(async (e) => { + this.disposables.push(vscode.workspace.onDidChangeTextDocument(async (e: vscode.TextDocumentChangeEvent) => { if (path.basename(e.document.fileName) === "tasks.json") { this.refreshDiagnosticsTrigger(e.document.uri); } })); - this.initializeDiagnostics(); + this.disposables.push(vscode.workspace.onDidOpenTextDocument(async (e: vscode.TextDocument) => { + if (path.basename(e.fileName) === "tasks.json") { + this.refreshDiagnosticsTrigger(e.uri); + } + })); + this.disposables.push(vscode.workspace.onDidCloseTextDocument(async (e: vscode.TextDocument) => { + if (path.basename(e.fileName) === "tasks.json") { + this.diagnosticCollection.set(e.uri, undefined); + } + })); } public dispose() { @@ -35,14 +43,6 @@ export class DiagnosticProvider implements vscode.Disposable { } } - private async initializeDiagnostics(): Promise { - const tasksJsonPaths = await getTasksJsonPaths(); - for (const tasksJsonPath of tasksJsonPaths) { - const diagnostics: vscode.Diagnostic[] = await DiagnosticProvider.getDiagnosticsFromTasksJsonPath(tasksJsonPath); - this.diagnosticCollection.set(vscode.Uri.file(tasksJsonPath), diagnostics); - } - } - private async refreshDiagnostics(uri: vscode.Uri): Promise { const diagnostics: vscode.Diagnostic[] = await DiagnosticProvider.getDiagnosticsFromTasksJsonPath(uri.fsPath); this.diagnosticCollection.set(uri, diagnostics); diff --git a/src/tasks/migration/utils.ts b/src/tasks/migration/utils.ts index 2eca880e..e3e096ea 100644 --- a/src/tasks/migration/utils.ts +++ b/src/tasks/migration/utils.ts @@ -1,27 +1,12 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT license. -import * as fse from "fs-extra"; -import * as path from "path"; import { Range, tasks, TextDocument, workspace, WorkspaceEdit } from "vscode"; import { DeprecatedExportJarTaskProvider } from "../../exportJarSteps/ExportJarTaskProvider"; import { contextManager } from "../../contextManager"; import { Context } from "../../constants"; import { CodeActionProvider } from "./CodeActionProvider"; -export async function getTasksJsonPaths(): Promise { - const tasksJsonPaths = []; - if (workspace.workspaceFolders?.length) { - for (const folder of workspace.workspaceFolders) { - const tasksJsonPath = path.join(folder.uri.fsPath, ".vscode", "tasks.json"); - if (await fse.pathExists(tasksJsonPath)) { - tasksJsonPaths.push(tasksJsonPath); - } - } - } - return tasksJsonPaths; -} - export async function updateExportTaskType(document: TextDocument, range: Range): Promise { const workspaceEdit = new WorkspaceEdit(); workspaceEdit.replace(document.uri, range, CodeActionProvider.JAVA_BUILD_ARTIFACT_TYPE); From de4a64b8ae685d9f843a06517ffb71f3c52dc65a Mon Sep 17 00:00:00 2001 From: Shi Chen Date: Mon, 25 Jul 2022 14:53:39 +0800 Subject: [PATCH 121/352] UX: Polish messages for task type migration (#675) --- src/tasks/migration/CodeActionProvider.ts | 2 +- src/tasks/migration/DiagnosticProvider.ts | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/src/tasks/migration/CodeActionProvider.ts b/src/tasks/migration/CodeActionProvider.ts index faf06742..3fb6b4d5 100644 --- a/src/tasks/migration/CodeActionProvider.ts +++ b/src/tasks/migration/CodeActionProvider.ts @@ -8,7 +8,7 @@ import { DiagnosticProvider } from "./DiagnosticProvider"; export class CodeActionProvider implements vscode.CodeActionProvider { - public static JAVA_UPDATE_DEPRECATED_TASK_TITLE = "Update deprecated task"; + public static JAVA_UPDATE_DEPRECATED_TASK_TITLE = `Change to \"${ExportJarTaskProvider.exportJarType}\"`; public static JAVA_BUILD_ARTIFACT_TYPE = `"type": "${ExportJarTaskProvider.exportJarType}"`; public provideCodeActions(document: vscode.TextDocument, range: vscode.Range | vscode.Selection, diff --git a/src/tasks/migration/DiagnosticProvider.ts b/src/tasks/migration/DiagnosticProvider.ts index 85e1bdbb..2f966630 100644 --- a/src/tasks/migration/DiagnosticProvider.ts +++ b/src/tasks/migration/DiagnosticProvider.ts @@ -10,8 +10,7 @@ import { DeprecatedExportJarTaskProvider, ExportJarTaskProvider } from "../../ex export class DiagnosticProvider implements vscode.Disposable { public static DIAGNOSTIC_SOURCE = "Project Manager for Java"; - public static DEPRECATED_TASK_TYPE_DECLARATION = `\"type\": \"${DeprecatedExportJarTaskProvider.type}\"`; - public static DEPRECATED_TASK_TYPE_MESSAGE = `Tasks with type \"${DeprecatedExportJarTaskProvider.type}\" are deprecated and will not be supported in the future, please use \"${ExportJarTaskProvider.exportJarType}\" instead.`; + public static DEPRECATED_TASK_TYPE_MESSAGE = `The type \"${DeprecatedExportJarTaskProvider.type}\" is deprecated, please use \"${ExportJarTaskProvider.exportJarType}\" instead.`; private diagnosticCollection: vscode.DiagnosticCollection; private disposables: vscode.Disposable[] = []; private refreshDiagnosticsTrigger: any; From 6c82573ca98c58ca8c61661ad73e83b7868c38b1 Mon Sep 17 00:00:00 2001 From: Sheng Chen Date: Wed, 27 Jul 2022 13:51:04 +0800 Subject: [PATCH 122/352] refactor: Move export jar related code under tasks folder (#678) Signed-off-by: Sheng Chen --- extension.bundle.ts | 2 +- src/extension.ts | 10 +++---- src/java/jdtls.ts | 4 +-- .../BuildArtifactTaskProvider.ts} | 28 +++++++++---------- .../buildArtifact}/GenerateJarExecutor.ts | 4 +-- .../buildArtifact}/IExportJarStepExecutor.ts | 0 .../buildArtifact}/IStepMetadata.ts | 2 +- .../ResolveJavaProjectExecutor.ts | 6 ++-- .../ResolveMainClassExecutor.ts | 2 +- .../migration/CodeActionProvider.ts | 8 +++--- .../migration/DiagnosticProvider.ts | 4 +-- .../{ => buildArtifact}/migration/utils.ts | 6 ++-- .../buildArtifact}/utility.ts | 2 +- src/views/dependencyDataProvider.ts | 2 +- ...xportJar.test.ts => buildArtifact.test.ts} | 12 ++++---- 15 files changed, 46 insertions(+), 46 deletions(-) rename src/{exportJarSteps/ExportJarTaskProvider.ts => tasks/buildArtifact/BuildArtifactTaskProvider.ts} (95%) rename src/{exportJarSteps => tasks/buildArtifact}/GenerateJarExecutor.ts (99%) rename src/{exportJarSteps => tasks/buildArtifact}/IExportJarStepExecutor.ts (100%) rename src/{exportJarSteps => tasks/buildArtifact}/IStepMetadata.ts (92%) rename src/{exportJarSteps => tasks/buildArtifact}/ResolveJavaProjectExecutor.ts (96%) rename src/{exportJarSteps => tasks/buildArtifact}/ResolveMainClassExecutor.ts (98%) rename src/tasks/{ => buildArtifact}/migration/CodeActionProvider.ts (85%) rename src/tasks/{ => buildArtifact}/migration/DiagnosticProvider.ts (95%) rename src/tasks/{ => buildArtifact}/migration/utils.ts (83%) rename src/{exportJarSteps => tasks/buildArtifact}/utility.ts (99%) rename test/maven-suite/{exportJar.test.ts => buildArtifact.test.ts} (80%) diff --git a/extension.bundle.ts b/extension.bundle.ts index eb28b400..e0c9a3ba 100644 --- a/extension.bundle.ts +++ b/extension.bundle.ts @@ -15,7 +15,7 @@ export { PackageRootNode } from "./src/views/packageRootNode"; export { PrimaryTypeNode } from "./src/views/PrimaryTypeNode"; export { ProjectNode } from "./src/views/projectNode"; export { WorkspaceNode } from "./src/views/workspaceNode"; -export { IMainClassInfo } from "./src/exportJarSteps/ResolveMainClassExecutor"; +export { IMainClassInfo } from "./src/tasks/buildArtifact/ResolveMainClassExecutor"; // project view test export { contextManager } from "./src/contextManager"; diff --git a/src/extension.ts b/src/extension.ts index 62b9e8a8..35eb624e 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -11,14 +11,14 @@ import { buildFiles, Context, ExtensionName } from "./constants"; import { LibraryController } from "./controllers/libraryController"; import { ProjectController } from "./controllers/projectController"; import { init as initExpService } from "./ExperimentationService"; -import { DeprecatedExportJarTaskProvider, ExportJarTaskProvider } from "./exportJarSteps/ExportJarTaskProvider"; +import { DeprecatedExportJarTaskProvider, BuildArtifactTaskProvider } from "./tasks/buildArtifact/BuildArtifactTaskProvider"; import { Settings } from "./settings"; import { syncHandler } from "./syncHandler"; import { EventCounter } from "./utility"; import { DependencyExplorer } from "./views/dependencyExplorer"; -import { DiagnosticProvider } from "./tasks/migration/DiagnosticProvider"; -import { setContextForDeprecatedTasks, updateExportTaskType } from "./tasks/migration/utils"; -import { CodeActionProvider } from "./tasks/migration/CodeActionProvider"; +import { DiagnosticProvider } from "./tasks/buildArtifact/migration/DiagnosticProvider"; +import { setContextForDeprecatedTasks, updateExportTaskType } from "./tasks/buildArtifact/migration/utils"; +import { CodeActionProvider } from "./tasks/buildArtifact/migration/CodeActionProvider"; export async function activate(context: ExtensionContext): Promise { contextManager.initialize(context); @@ -44,7 +44,7 @@ async function activateExtension(_operationId: string, context: ExtensionContext context.subscriptions.push(contextManager); context.subscriptions.push(syncHandler); context.subscriptions.push(tasks.registerTaskProvider(DeprecatedExportJarTaskProvider.type, new DeprecatedExportJarTaskProvider())); - context.subscriptions.push(tasks.registerTaskProvider(ExportJarTaskProvider.exportJarType, new ExportJarTaskProvider())); + context.subscriptions.push(tasks.registerTaskProvider(BuildArtifactTaskProvider.exportJarType, new BuildArtifactTaskProvider())); context.subscriptions.push(tasks.registerTaskProvider(BuildTaskProvider.type, new BuildTaskProvider())); context.subscriptions.push(window.onDidChangeActiveTextEditor((e: TextEditor | undefined) => { diff --git a/src/java/jdtls.ts b/src/java/jdtls.ts index c1a01069..a5674e62 100644 --- a/src/java/jdtls.ts +++ b/src/java/jdtls.ts @@ -3,8 +3,8 @@ import { CancellationToken, commands } from "vscode"; import { Commands, executeJavaLanguageServerCommand } from "../commands"; -import { IClasspath } from "../exportJarSteps/IStepMetadata"; -import { IMainClassInfo } from "../exportJarSteps/ResolveMainClassExecutor"; +import { IClasspath } from "../tasks/buildArtifact/IStepMetadata"; +import { IMainClassInfo } from "../tasks/buildArtifact/ResolveMainClassExecutor"; import { INodeData } from "./nodeData"; export namespace Jdtls { diff --git a/src/exportJarSteps/ExportJarTaskProvider.ts b/src/tasks/buildArtifact/BuildArtifactTaskProvider.ts similarity index 95% rename from src/exportJarSteps/ExportJarTaskProvider.ts rename to src/tasks/buildArtifact/BuildArtifactTaskProvider.ts index 0a2567e6..abe73083 100644 --- a/src/exportJarSteps/ExportJarTaskProvider.ts +++ b/src/tasks/buildArtifact/BuildArtifactTaskProvider.ts @@ -12,12 +12,12 @@ import { TaskProvider, TaskRevealKind, tasks, TerminalDimensions, Uri, workspace, WorkspaceFolder, } from "vscode"; import { sendInfo } from "vscode-extension-telemetry-wrapper"; -import { buildWorkspace } from "../build"; -import { Jdtls } from "../java/jdtls"; -import { INodeData } from "../java/nodeData"; -import { languageServerApiManager } from "../languageServerApi/languageServerApiManager"; -import { Settings } from "../settings"; -import { IUriData, Trie, TrieNode } from "../views/nodeCache/Trie"; +import { buildWorkspace } from "../../build"; +import { Jdtls } from "../../java/jdtls"; +import { INodeData } from "../../java/nodeData"; +import { languageServerApiManager } from "../../languageServerApi/languageServerApiManager"; +import { Settings } from "../../settings"; +import { IUriData, Trie, TrieNode } from "../../views/nodeCache/Trie"; import { IClasspathResult } from "./GenerateJarExecutor"; import { IExportJarStepExecutor } from "./IExportJarStepExecutor"; import { IClasspath, IStepMetadata } from "./IStepMetadata"; @@ -60,7 +60,7 @@ export async function executeExportJarTask(node?: INodeData): Promise { throw new Error(ExportJarMessages.stepErrorMessage(ExportJarMessages.StepAction.FINDEXECUTOR, ExportJarStep.ResolveJavaProject)); } await resolveJavaProjectExecutor.execute(stepMetadata); - tasks.executeTask(ExportJarTaskProvider.getDefaultTask(stepMetadata)); + tasks.executeTask(BuildArtifactTaskProvider.getDefaultTask(stepMetadata)); } catch (err) { if (err) { failMessage(`${err}`); @@ -69,7 +69,7 @@ export async function executeExportJarTask(node?: INodeData): Promise { return; } } -export class ExportJarTaskProvider implements TaskProvider { +export class BuildArtifactTaskProvider implements TaskProvider { public static exportJarType: string = "java (buildArtifact)"; @@ -78,13 +78,13 @@ export class ExportJarTaskProvider implements TaskProvider { throw new Error(ExportJarMessages.fieldUndefinedMessage(ExportJarMessages.Field.WORKSPACEFOLDER, ExportJarStep.ResolveTask)); } const defaultDefinition: IExportJarTaskDefinition = { - type: ExportJarTaskProvider.exportJarType, + type: BuildArtifactTaskProvider.exportJarType, label: "default", targetPath: Settings.getExportJarTargetPath(), elements: [], mainClass: undefined, }; - const task: Task = new Task(defaultDefinition, stepMetadata.workspaceFolder, "default", ExportJarTaskProvider.exportJarType, + const task: Task = new Task(defaultDefinition, stepMetadata.workspaceFolder, "default", BuildArtifactTaskProvider.exportJarType, new CustomExecution(async (resolvedDefinition: TaskDefinition): Promise => { return new ExportJarTaskTerminal(resolvedDefinition, stepMetadata); })); @@ -95,7 +95,7 @@ export class ExportJarTaskProvider implements TaskProvider { private tasks: Task[] | undefined; public async resolveTask(task: Task): Promise { - return ExportJarTaskProvider.resolveExportTask(task, ExportJarTaskProvider.exportJarType); + return BuildArtifactTaskProvider.resolveExportTask(task, BuildArtifactTaskProvider.exportJarType); } public static async resolveExportTask(task: Task, type: string): Promise { @@ -143,12 +143,12 @@ export class ExportJarTaskProvider implements TaskProvider { } const mainClasses: IMainClassInfo[] = await Jdtls.getMainClasses(folder.uri.toString()); const defaultDefinition: IExportJarTaskDefinition = { - type: ExportJarTaskProvider.exportJarType, + type: BuildArtifactTaskProvider.exportJarType, mainClass: (mainClasses.length === 1) ? mainClasses[0].name : undefined, targetPath: Settings.getExportJarTargetPath(), elements: elementList, }; - const defaultTask: Task = new Task(defaultDefinition, folder, folder.name, ExportJarTaskProvider.exportJarType, + const defaultTask: Task = new Task(defaultDefinition, folder, folder.name, BuildArtifactTaskProvider.exportJarType, new CustomExecution(async (resolvedDefinition: IExportJarTaskDefinition): Promise => { const stepMetadata: IStepMetadata = { entry: undefined, @@ -178,7 +178,7 @@ export class DeprecatedExportJarTaskProvider implements TaskProvider { resolveTask(task: Task, _token: CancellationToken): ProviderResult { sendInfo("", { name: "resolve-deprecated-export-task" }); - return ExportJarTaskProvider.resolveExportTask(task, DeprecatedExportJarTaskProvider.type); + return BuildArtifactTaskProvider.resolveExportTask(task, DeprecatedExportJarTaskProvider.type); } } diff --git a/src/exportJarSteps/GenerateJarExecutor.ts b/src/tasks/buildArtifact/GenerateJarExecutor.ts similarity index 99% rename from src/exportJarSteps/GenerateJarExecutor.ts rename to src/tasks/buildArtifact/GenerateJarExecutor.ts index 5bd18b20..a8823886 100644 --- a/src/exportJarSteps/GenerateJarExecutor.ts +++ b/src/tasks/buildArtifact/GenerateJarExecutor.ts @@ -7,8 +7,8 @@ import * as _ from "lodash"; import { basename, dirname, extname, isAbsolute, join, normalize, relative } from "path"; import { Disposable, ProgressLocation, QuickInputButtons, QuickPickItem, Uri, window, WorkspaceFolder } from "vscode"; import { sendInfo } from "vscode-extension-telemetry-wrapper"; -import { Jdtls } from "../java/jdtls"; -import { INodeData } from "../java/nodeData"; +import { Jdtls } from "../../java/jdtls"; +import { INodeData } from "../../java/nodeData"; import { IExportJarStepExecutor } from "./IExportJarStepExecutor"; import { IClasspath, IStepMetadata } from "./IStepMetadata"; import { createPickBox, ExportJarMessages, ExportJarStep, ExportJarTargets, getExtensionApi, toPosixPath } from "./utility"; diff --git a/src/exportJarSteps/IExportJarStepExecutor.ts b/src/tasks/buildArtifact/IExportJarStepExecutor.ts similarity index 100% rename from src/exportJarSteps/IExportJarStepExecutor.ts rename to src/tasks/buildArtifact/IExportJarStepExecutor.ts diff --git a/src/exportJarSteps/IStepMetadata.ts b/src/tasks/buildArtifact/IStepMetadata.ts similarity index 92% rename from src/exportJarSteps/IStepMetadata.ts rename to src/tasks/buildArtifact/IStepMetadata.ts index de582e2d..2d6ef514 100644 --- a/src/exportJarSteps/IStepMetadata.ts +++ b/src/tasks/buildArtifact/IStepMetadata.ts @@ -2,7 +2,7 @@ // Licensed under the MIT license. import { WorkspaceFolder } from "vscode"; -import { INodeData } from "../java/nodeData"; +import { INodeData } from "../../java/nodeData"; import { ExportJarStep } from "./utility"; export interface IStepMetadata { diff --git a/src/exportJarSteps/ResolveJavaProjectExecutor.ts b/src/tasks/buildArtifact/ResolveJavaProjectExecutor.ts similarity index 96% rename from src/exportJarSteps/ResolveJavaProjectExecutor.ts rename to src/tasks/buildArtifact/ResolveJavaProjectExecutor.ts index 41c58a24..ab609809 100644 --- a/src/exportJarSteps/ResolveJavaProjectExecutor.ts +++ b/src/tasks/buildArtifact/ResolveJavaProjectExecutor.ts @@ -3,9 +3,9 @@ import * as _ from "lodash"; import { Disposable, QuickPickItem, Uri, workspace, WorkspaceFolder } from "vscode"; -import { Jdtls } from "../java/jdtls"; -import { INodeData } from "../java/nodeData"; -import { WorkspaceNode } from "../views/workspaceNode"; +import { Jdtls } from "../../java/jdtls"; +import { INodeData } from "../../java/nodeData"; +import { WorkspaceNode } from "../../views/workspaceNode"; import { IExportJarStepExecutor } from "./IExportJarStepExecutor"; import { IStepMetadata } from "./IStepMetadata"; import { createPickBox, ExportJarMessages, ExportJarStep } from "./utility"; diff --git a/src/exportJarSteps/ResolveMainClassExecutor.ts b/src/tasks/buildArtifact/ResolveMainClassExecutor.ts similarity index 98% rename from src/exportJarSteps/ResolveMainClassExecutor.ts rename to src/tasks/buildArtifact/ResolveMainClassExecutor.ts index a27b5e56..fbb9466e 100644 --- a/src/exportJarSteps/ResolveMainClassExecutor.ts +++ b/src/tasks/buildArtifact/ResolveMainClassExecutor.ts @@ -3,7 +3,7 @@ import * as _ from "lodash"; import { Disposable, ProgressLocation, QuickInputButtons, QuickPickItem, window } from "vscode"; -import { Jdtls } from "../java/jdtls"; +import { Jdtls } from "../../java/jdtls"; import { IExportJarStepExecutor } from "./IExportJarStepExecutor"; import { IStepMetadata } from "./IStepMetadata"; import { createPickBox, ExportJarMessages, ExportJarStep } from "./utility"; diff --git a/src/tasks/migration/CodeActionProvider.ts b/src/tasks/buildArtifact/migration/CodeActionProvider.ts similarity index 85% rename from src/tasks/migration/CodeActionProvider.ts rename to src/tasks/buildArtifact/migration/CodeActionProvider.ts index 3fb6b4d5..be211773 100644 --- a/src/tasks/migration/CodeActionProvider.ts +++ b/src/tasks/buildArtifact/migration/CodeActionProvider.ts @@ -2,14 +2,14 @@ // Licensed under the MIT license. import * as vscode from "vscode"; -import { Commands } from "../../commands"; -import { ExportJarTaskProvider } from "../../exportJarSteps/ExportJarTaskProvider"; +import { Commands } from "../../../commands"; +import { BuildArtifactTaskProvider } from "../BuildArtifactTaskProvider"; import { DiagnosticProvider } from "./DiagnosticProvider"; export class CodeActionProvider implements vscode.CodeActionProvider { - public static JAVA_UPDATE_DEPRECATED_TASK_TITLE = `Change to \"${ExportJarTaskProvider.exportJarType}\"`; - public static JAVA_BUILD_ARTIFACT_TYPE = `"type": "${ExportJarTaskProvider.exportJarType}"`; + public static JAVA_UPDATE_DEPRECATED_TASK_TITLE = `Change to \"${BuildArtifactTaskProvider.exportJarType}\"`; + public static JAVA_BUILD_ARTIFACT_TYPE = `"type": "${BuildArtifactTaskProvider.exportJarType}"`; public provideCodeActions(document: vscode.TextDocument, range: vscode.Range | vscode.Selection, _context: vscode.CodeActionContext, _token: vscode.CancellationToken): vscode.CodeAction[] | undefined { diff --git a/src/tasks/migration/DiagnosticProvider.ts b/src/tasks/buildArtifact/migration/DiagnosticProvider.ts similarity index 95% rename from src/tasks/migration/DiagnosticProvider.ts rename to src/tasks/buildArtifact/migration/DiagnosticProvider.ts index 2f966630..4bd31605 100644 --- a/src/tasks/migration/DiagnosticProvider.ts +++ b/src/tasks/buildArtifact/migration/DiagnosticProvider.ts @@ -6,11 +6,11 @@ import * as fs from "fs"; import * as path from "path"; import * as readline from "readline"; import * as vscode from "vscode"; -import { DeprecatedExportJarTaskProvider, ExportJarTaskProvider } from "../../exportJarSteps/ExportJarTaskProvider"; +import { DeprecatedExportJarTaskProvider, BuildArtifactTaskProvider } from "../BuildArtifactTaskProvider"; export class DiagnosticProvider implements vscode.Disposable { public static DIAGNOSTIC_SOURCE = "Project Manager for Java"; - public static DEPRECATED_TASK_TYPE_MESSAGE = `The type \"${DeprecatedExportJarTaskProvider.type}\" is deprecated, please use \"${ExportJarTaskProvider.exportJarType}\" instead.`; + public static DEPRECATED_TASK_TYPE_MESSAGE = `The type \"${DeprecatedExportJarTaskProvider.type}\" is deprecated, please use \"${BuildArtifactTaskProvider.exportJarType}\" instead.`; private diagnosticCollection: vscode.DiagnosticCollection; private disposables: vscode.Disposable[] = []; private refreshDiagnosticsTrigger: any; diff --git a/src/tasks/migration/utils.ts b/src/tasks/buildArtifact/migration/utils.ts similarity index 83% rename from src/tasks/migration/utils.ts rename to src/tasks/buildArtifact/migration/utils.ts index e3e096ea..017aa40f 100644 --- a/src/tasks/migration/utils.ts +++ b/src/tasks/buildArtifact/migration/utils.ts @@ -2,9 +2,9 @@ // Licensed under the MIT license. import { Range, tasks, TextDocument, workspace, WorkspaceEdit } from "vscode"; -import { DeprecatedExportJarTaskProvider } from "../../exportJarSteps/ExportJarTaskProvider"; -import { contextManager } from "../../contextManager"; -import { Context } from "../../constants"; +import { DeprecatedExportJarTaskProvider } from "../BuildArtifactTaskProvider"; +import { contextManager } from "../../../contextManager"; +import { Context } from "../../../constants"; import { CodeActionProvider } from "./CodeActionProvider"; export async function updateExportTaskType(document: TextDocument, range: Range): Promise { diff --git a/src/exportJarSteps/utility.ts b/src/tasks/buildArtifact/utility.ts similarity index 99% rename from src/exportJarSteps/utility.ts rename to src/tasks/buildArtifact/utility.ts index 6184fa89..fc29d5e0 100644 --- a/src/exportJarSteps/utility.ts +++ b/src/tasks/buildArtifact/utility.ts @@ -5,7 +5,7 @@ import { EOL, platform } from "os"; import { posix, win32 } from "path"; import { commands, Extension, extensions, QuickInputButtons, QuickPick, QuickPickItem, Uri, window } from "vscode"; import { sendOperationError } from "vscode-extension-telemetry-wrapper"; -import { Commands } from "../commands"; +import { Commands } from "../../commands"; import { GenerateJarExecutor } from "./GenerateJarExecutor"; import { IExportJarStepExecutor } from "./IExportJarStepExecutor"; import { IStepMetadata } from "./IStepMetadata"; diff --git a/src/views/dependencyDataProvider.ts b/src/views/dependencyDataProvider.ts index fba59d5e..fabee567 100644 --- a/src/views/dependencyDataProvider.ts +++ b/src/views/dependencyDataProvider.ts @@ -10,7 +10,7 @@ import { instrumentOperationAsVsCodeCommand, sendError } from "vscode-extension- import { contextManager } from "../../extension.bundle"; import { Commands } from "../commands"; import { Context } from "../constants"; -import { appendOutput, executeExportJarTask } from "../exportJarSteps/ExportJarTaskProvider"; +import { appendOutput, executeExportJarTask } from "../tasks/buildArtifact/BuildArtifactTaskProvider"; import { Jdtls } from "../java/jdtls"; import { INodeData, NodeKind } from "../java/nodeData"; import { languageServerApiManager } from "../languageServerApi/languageServerApiManager"; diff --git a/test/maven-suite/exportJar.test.ts b/test/maven-suite/buildArtifact.test.ts similarity index 80% rename from test/maven-suite/exportJar.test.ts rename to test/maven-suite/buildArtifact.test.ts index e74241ef..e1189f2c 100644 --- a/test/maven-suite/exportJar.test.ts +++ b/test/maven-suite/buildArtifact.test.ts @@ -14,22 +14,22 @@ const folderPath: string = workspace.workspaceFolders![0].uri.fsPath; const jarFileName: string = "maven.jar"; const testFolder: string = path.join(folderPath, "test"); -suite("Export Jar Tests", () => { +suite("Build Artifact Tests", () => { suiteSetup(setupTestEnv); - test("Can export jar correctly", async function() { + test("Can build jar correctly", async function() { const vscodeTasks: Task[] = await tasks.fetchTasks(); - const exportJarTask: Task | undefined = vscodeTasks.find((t: Task) => t.name === "java (buildArtifact): maven"); - assert.ok(exportJarTask !== undefined); + const buildJarTask: Task | undefined = vscodeTasks.find((t: Task) => t.name === "java (buildArtifact): maven"); + assert.ok(buildJarTask !== undefined); await new Promise(async (resolve) => { tasks.onDidEndTask((e: TaskEndEvent) => { - if (e.execution.task.name === exportJarTask?.name) { + if (e.execution.task.name === buildJarTask?.name) { return resolve(); } }); - await tasks.executeTask(exportJarTask!); + await tasks.executeTask(buildJarTask!); }); const isFileExist: boolean = await fse.pathExists(path.join(folderPath, jarFileName)); From bfa43f7ad799d2e7e84f625d7f52144820335aa2 Mon Sep 17 00:00:00 2001 From: Sheng Chen Date: Wed, 27 Jul 2022 17:09:08 +0800 Subject: [PATCH 123/352] chore: Remove unused module (#679) Signed-off-by: Sheng Chen --- .vscode/settings.json | 9 +++- javaConfig.json | 3 +- .../META-INF/MANIFEST.MF | 12 ----- .../build.properties | 5 -- .../plugin.xml | 5 -- .../com.microsoft.jdtls.ext.activator/pom.xml | 29 ----------- .../ext/activator/JdtlsExtActivator.java | 49 ------------------- jdtls.ext/pom.xml | 1 - test/suite/buildTask.test.ts | 1 + 9 files changed, 10 insertions(+), 104 deletions(-) delete mode 100644 jdtls.ext/com.microsoft.jdtls.ext.activator/META-INF/MANIFEST.MF delete mode 100644 jdtls.ext/com.microsoft.jdtls.ext.activator/build.properties delete mode 100644 jdtls.ext/com.microsoft.jdtls.ext.activator/plugin.xml delete mode 100644 jdtls.ext/com.microsoft.jdtls.ext.activator/pom.xml delete mode 100644 jdtls.ext/com.microsoft.jdtls.ext.activator/src/com/microsoft/jdtls/ext/activator/JdtlsExtActivator.java diff --git a/.vscode/settings.json b/.vscode/settings.json index 7f19ff69..56a9603b 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,5 +1,12 @@ { "java.configuration.updateBuildConfiguration": "automatic", "java.checkstyle.configuration": "${workspaceFolder}/jdtls.ext/check_style.xml", - "java.checkstyle.version": "8.29" + "java.checkstyle.version": "8.29", + "java.import.exclusions": [ + "**/test/**", + "**/node_modules/**", + "**/.metadata/**", + "**/archetype-resources/**", + "**/META-INF/maven/**", + ] } diff --git a/javaConfig.json b/javaConfig.json index ac6a9020..5544d609 100644 --- a/javaConfig.json +++ b/javaConfig.json @@ -1,7 +1,6 @@ { "projects": [ - "./jdtls.ext/com.microsoft.jdtls.ext.core", - "./jdtls.ext/com.microsoft.jdtls.ext.activator" + "./jdtls.ext/com.microsoft.jdtls.ext.core" ], "targetPlatform": "./jdtls.ext/target.target" } diff --git a/jdtls.ext/com.microsoft.jdtls.ext.activator/META-INF/MANIFEST.MF b/jdtls.ext/com.microsoft.jdtls.ext.activator/META-INF/MANIFEST.MF deleted file mode 100644 index f25ad223..00000000 --- a/jdtls.ext/com.microsoft.jdtls.ext.activator/META-INF/MANIFEST.MF +++ /dev/null @@ -1,12 +0,0 @@ -Manifest-Version: 1.0 -Bundle-ManifestVersion: 2 -Bundle-Name: JDTLS EXT Activator -Bundle-SymbolicName: com.microsoft.jdtls.ext.activator;singleton:=true -Bundle-Version: 0.21.0 -Bundle-Activator: com.microsoft.jdtls.ext.activator.JdtlsExtActivator -Bundle-RequiredExecutionEnvironment: JavaSE-1.8 -Import-Package: org.eclipse.jdt.core, - org.osgi.framework;version="1.3.0" -Require-Bundle: org.eclipse.core.runtime, - org.eclipse.jdt.ls.core -Bundle-ClassPath: . diff --git a/jdtls.ext/com.microsoft.jdtls.ext.activator/build.properties b/jdtls.ext/com.microsoft.jdtls.ext.activator/build.properties deleted file mode 100644 index e9863e28..00000000 --- a/jdtls.ext/com.microsoft.jdtls.ext.activator/build.properties +++ /dev/null @@ -1,5 +0,0 @@ -source.. = src/ -output.. = bin/ -bin.includes = META-INF/,\ - .,\ - plugin.xml diff --git a/jdtls.ext/com.microsoft.jdtls.ext.activator/plugin.xml b/jdtls.ext/com.microsoft.jdtls.ext.activator/plugin.xml deleted file mode 100644 index 5535690d..00000000 --- a/jdtls.ext/com.microsoft.jdtls.ext.activator/plugin.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/jdtls.ext/com.microsoft.jdtls.ext.activator/pom.xml b/jdtls.ext/com.microsoft.jdtls.ext.activator/pom.xml deleted file mode 100644 index d134a6a8..00000000 --- a/jdtls.ext/com.microsoft.jdtls.ext.activator/pom.xml +++ /dev/null @@ -1,29 +0,0 @@ - - - 4.0.0 - - com.microsoft.jdtls.ext - jdtls-ext-parent - 0.21.0 - - com.microsoft.jdtls.ext.activator - eclipse-plugin - ${base.name} :: JDTLS Ext Activator Plugin - - - - - - org.eclipse.tycho - tycho-maven-plugin - ${tycho-version} - true - - - org.apache.maven.plugins - maven-checkstyle-plugin - - - - diff --git a/jdtls.ext/com.microsoft.jdtls.ext.activator/src/com/microsoft/jdtls/ext/activator/JdtlsExtActivator.java b/jdtls.ext/com.microsoft.jdtls.ext.activator/src/com/microsoft/jdtls/ext/activator/JdtlsExtActivator.java deleted file mode 100644 index 57e3c27b..00000000 --- a/jdtls.ext/com.microsoft.jdtls.ext.activator/src/com/microsoft/jdtls/ext/activator/JdtlsExtActivator.java +++ /dev/null @@ -1,49 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2020 Microsoft Corporation and others. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * Microsoft Corporation - initial API and implementation - *******************************************************************************/ - -package com.microsoft.jdtls.ext.activator; - -import org.eclipse.core.runtime.jobs.IJobChangeEvent; -import org.eclipse.core.runtime.jobs.IJobChangeListener; -import org.eclipse.core.runtime.jobs.Job; -import org.eclipse.core.runtime.jobs.JobChangeAdapter; -import org.eclipse.jdt.ls.core.internal.JavaClientConnection; -import org.eclipse.jdt.ls.core.internal.JavaLanguageServerPlugin; -import org.osgi.framework.BundleActivator; -import org.osgi.framework.BundleContext; - -public class JdtlsExtActivator implements BundleActivator { - - private static final String INITIALIZE_WORKSPACE_JOB_NAME = "Initialize workspace"; - private static final String JAVA_PROJECT_ACTIVATE_COMMAND = "java.project.activate"; - - private static IJobChangeListener jobChangeListener = new JobChangeAdapter() { - @Override - public void done(IJobChangeEvent event) { - if (!event.getJob().getName().contains(INITIALIZE_WORKSPACE_JOB_NAME)) { - return; - } - - JavaClientConnection connection = JavaLanguageServerPlugin.getInstance().getClientConnection(); - connection.executeClientCommand(JAVA_PROJECT_ACTIVATE_COMMAND); - } - }; - - @Override - public void start(BundleContext bundleContext) throws Exception { - Job.getJobManager().addJobChangeListener(jobChangeListener); - } - - @Override - public void stop(BundleContext bundleContext) throws Exception { - Job.getJobManager().removeJobChangeListener(jobChangeListener); - } -} diff --git a/jdtls.ext/pom.xml b/jdtls.ext/pom.xml index 2cc36567..2616f9d5 100644 --- a/jdtls.ext/pom.xml +++ b/jdtls.ext/pom.xml @@ -23,7 +23,6 @@ com.microsoft.jdtls.ext.core - com.microsoft.jdtls.ext.activator diff --git a/test/suite/buildTask.test.ts b/test/suite/buildTask.test.ts index 8a4bab84..a861f73a 100644 --- a/test/suite/buildTask.test.ts +++ b/test/suite/buildTask.test.ts @@ -15,6 +15,7 @@ suite("Build Task Tests", () => { suiteSetup(setupTestEnv); test("test providing default build task", async function() { + this.timeout(60 * 1000 * 3); const vscodeTasks: Task[] = await tasks.fetchTasks(); const exportJarTask: Task | undefined = vscodeTasks.find((t: Task) => { return t.name === BuildTaskProvider.defaultTaskName From b1084335b684d2d821c085d2d9ec424ff3071594 Mon Sep 17 00:00:00 2001 From: Sheng Chen Date: Fri, 29 Jul 2022 15:14:37 +0800 Subject: [PATCH 124/352] fix: Scan two levels of directories for activation indicators (#681) Signed-off-by: sheche --- package.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/package.json b/package.json index 5f338088..9ed21573 100644 --- a/package.json +++ b/package.json @@ -28,12 +28,12 @@ }, "activationEvents": [ "onLanguage:java", - "workspaceContains:pom.xml", - "workspaceContains:build.gradle", - "workspaceContains:settings.gradle", - "workspaceContains:build.gradle.kts", - "workspaceContains:settings.gradle.kts", - "workspaceContains:.classpath", + "workspaceContains:{*/,}pom.xml", + "workspaceContains:{*/,}build.gradle", + "workspaceContains:{*/,}settings.gradle", + "workspaceContains:{*/,}build.gradle.kts", + "workspaceContains:{*/,}settings.gradle.kts", + "workspaceContains:{*/,}.classpath", "onCommand:_java.project.open", "onCommand:java.project.create", "onCommand:java.view.package.newJavaClass" From 13cc5e90dbde19ee51c8772d6b49d8ee54e1caec Mon Sep 17 00:00:00 2001 From: Sheng Chen Date: Mon, 1 Aug 2022 13:21:44 +0800 Subject: [PATCH 125/352] chore(deps): Update dependencies (#682) - Update NPM modules. - Remove commons-io. - Update the required JRE to 11. --- ThirdPartyNotices.txt | 223 +----------------- .../com.microsoft.jdtls.ext.core/.classpath | 7 + .../com.microsoft.jdtls.ext.core/.project | 45 ++++ .../org.eclipse.core.resources.prefs | 2 + .../.settings/org.eclipse.jdt.core.prefs | 8 + .../.settings/org.eclipse.m2e.core.prefs | 4 + .../META-INF/MANIFEST.MF | 5 +- .../build.properties | 3 +- .../com.microsoft.jdtls.ext.core/pom.xml | 13 - .../ext/core/JarFileContentProvider.java | 3 +- .../jdtls/ext/core/ProjectCommand.java | 3 +- jdtls.ext/target.target | 2 - package-lock.json | 180 ++++++++------ package.json | 4 +- 14 files changed, 190 insertions(+), 312 deletions(-) create mode 100644 jdtls.ext/com.microsoft.jdtls.ext.core/.classpath create mode 100644 jdtls.ext/com.microsoft.jdtls.ext.core/.project create mode 100644 jdtls.ext/com.microsoft.jdtls.ext.core/.settings/org.eclipse.core.resources.prefs create mode 100644 jdtls.ext/com.microsoft.jdtls.ext.core/.settings/org.eclipse.jdt.core.prefs create mode 100644 jdtls.ext/com.microsoft.jdtls.ext.core/.settings/org.eclipse.m2e.core.prefs diff --git a/ThirdPartyNotices.txt b/ThirdPartyNotices.txt index 6ba2873d..86dfa178 100644 --- a/ThirdPartyNotices.txt +++ b/ThirdPartyNotices.txt @@ -5,221 +5,14 @@ Do Not Translate or Localize This project incorporates components from the projects listed below. The original copyright notices and the licenses under which Microsoft received such components are set forth below. Microsoft reserves all rights not expressly granted herein, whether by implication, estoppel or otherwise. -1. apache/commons-io (https://github.com/apache/commons-io) -2. Apache Commons Lang (https://commons.apache.org/proper/commons-lang/) -3. Eskibear/vscode-extension-telemetry-wrapper (https://github.com/Eskibear/vscode-extension-telemetry-wrapper) -4. google/gson (https://github.com/google/gson) -5. ide/await-lock (https://github.com/ide/await-lock) -6. isaacs/minimatch (https://github.com/isaacs/minimatch) -7. jprichardson/node-fs-extra (https://github.com/jprichardson/node-fs-extra) -8. lodash/lodash (https://github.com/lodash/lodash) -9. sindresorhus/globby (https://github.com/sindresorhus/globby) - -%% apache/commons-io NOTICES AND INFORMATION BEGIN HERE -========================================= - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -========================================= -END OF apache/commons-io NOTICES AND INFORMATION +1. Apache Commons Lang (https://commons.apache.org/proper/commons-lang/) +2. Eskibear/vscode-extension-telemetry-wrapper (https://github.com/Eskibear/vscode-extension-telemetry-wrapper) +3. google/gson (https://github.com/google/gson) +4. ide/await-lock (https://github.com/ide/await-lock) +5. isaacs/minimatch (https://github.com/isaacs/minimatch) +6. jprichardson/node-fs-extra (https://github.com/jprichardson/node-fs-extra) +7. lodash/lodash (https://github.com/lodash/lodash) +8. sindresorhus/globby (https://github.com/sindresorhus/globby) %% Apache Commons Lang NOTICES AND INFORMATION BEGIN HERE ========================================= diff --git a/jdtls.ext/com.microsoft.jdtls.ext.core/.classpath b/jdtls.ext/com.microsoft.jdtls.ext.core/.classpath new file mode 100644 index 00000000..bc57d238 --- /dev/null +++ b/jdtls.ext/com.microsoft.jdtls.ext.core/.classpath @@ -0,0 +1,7 @@ + + + + + + + diff --git a/jdtls.ext/com.microsoft.jdtls.ext.core/.project b/jdtls.ext/com.microsoft.jdtls.ext.core/.project new file mode 100644 index 00000000..40a2a856 --- /dev/null +++ b/jdtls.ext/com.microsoft.jdtls.ext.core/.project @@ -0,0 +1,45 @@ + + + com.microsoft.jdtls.ext.core + + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.eclipse.pde.ManifestBuilder + + + + + org.eclipse.pde.SchemaBuilder + + + + + org.eclipse.m2e.core.maven2Builder + + + + + + org.eclipse.m2e.core.maven2Nature + org.eclipse.pde.PluginNature + org.eclipse.jdt.core.javanature + + + + 1655120454990 + + 30 + + org.eclipse.core.resources.regexFilterMatcher + node_modules|.git|__CREATED_BY_JAVA_LANGUAGE_SERVER__ + + + + diff --git a/jdtls.ext/com.microsoft.jdtls.ext.core/.settings/org.eclipse.core.resources.prefs b/jdtls.ext/com.microsoft.jdtls.ext.core/.settings/org.eclipse.core.resources.prefs new file mode 100644 index 00000000..99f26c02 --- /dev/null +++ b/jdtls.ext/com.microsoft.jdtls.ext.core/.settings/org.eclipse.core.resources.prefs @@ -0,0 +1,2 @@ +eclipse.preferences.version=1 +encoding/=UTF-8 diff --git a/jdtls.ext/com.microsoft.jdtls.ext.core/.settings/org.eclipse.jdt.core.prefs b/jdtls.ext/com.microsoft.jdtls.ext.core/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 00000000..3a85c5a5 --- /dev/null +++ b/jdtls.ext/com.microsoft.jdtls.ext.core/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,8 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled +org.eclipse.jdt.core.compiler.codegen.targetPlatform=11 +org.eclipse.jdt.core.compiler.compliance=11 +org.eclipse.jdt.core.compiler.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.release=disabled +org.eclipse.jdt.core.compiler.source=11 diff --git a/jdtls.ext/com.microsoft.jdtls.ext.core/.settings/org.eclipse.m2e.core.prefs b/jdtls.ext/com.microsoft.jdtls.ext.core/.settings/org.eclipse.m2e.core.prefs new file mode 100644 index 00000000..f897a7f1 --- /dev/null +++ b/jdtls.ext/com.microsoft.jdtls.ext.core/.settings/org.eclipse.m2e.core.prefs @@ -0,0 +1,4 @@ +activeProfiles= +eclipse.preferences.version=1 +resolveWorkspaceProjects=true +version=1 diff --git a/jdtls.ext/com.microsoft.jdtls.ext.core/META-INF/MANIFEST.MF b/jdtls.ext/com.microsoft.jdtls.ext.core/META-INF/MANIFEST.MF index fd4c383f..a78a6faf 100644 --- a/jdtls.ext/com.microsoft.jdtls.ext.core/META-INF/MANIFEST.MF +++ b/jdtls.ext/com.microsoft.jdtls.ext.core/META-INF/MANIFEST.MF @@ -4,7 +4,7 @@ Bundle-Name: JDTLS EXT Core Bundle-SymbolicName: com.microsoft.jdtls.ext.core;singleton:=true Bundle-Version: 0.21.0 Bundle-Activator: com.microsoft.jdtls.ext.core.JdtlsExtActivator -Bundle-RequiredExecutionEnvironment: JavaSE-1.8 +Bundle-RequiredExecutionEnvironment: JavaSE-11 Bundle-ActivationPolicy: lazy Import-Package: org.eclipse.jdt.core, org.eclipse.jdt.launching, @@ -17,5 +17,4 @@ Require-Bundle: org.eclipse.core.runtime, org.eclipse.lsp4j, org.apache.commons.lang3, com.google.gson -Bundle-ClassPath: ., - lib/commons-io-2.5.jar +Bundle-ClassPath: . diff --git a/jdtls.ext/com.microsoft.jdtls.ext.core/build.properties b/jdtls.ext/com.microsoft.jdtls.ext.core/build.properties index 3179734c..e9863e28 100644 --- a/jdtls.ext/com.microsoft.jdtls.ext.core/build.properties +++ b/jdtls.ext/com.microsoft.jdtls.ext.core/build.properties @@ -2,5 +2,4 @@ source.. = src/ output.. = bin/ bin.includes = META-INF/,\ .,\ - plugin.xml,\ - lib/ + plugin.xml diff --git a/jdtls.ext/com.microsoft.jdtls.ext.core/pom.xml b/jdtls.ext/com.microsoft.jdtls.ext.core/pom.xml index 36e77457..233c3db7 100644 --- a/jdtls.ext/com.microsoft.jdtls.ext.core/pom.xml +++ b/jdtls.ext/com.microsoft.jdtls.ext.core/pom.xml @@ -20,19 +20,6 @@ ${tycho-version} true - - org.apache.maven.plugins - maven-dependency-plugin - - - - commons-io - commons-io - 2.5 - - - - org.apache.maven.plugins maven-checkstyle-plugin diff --git a/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/JarFileContentProvider.java b/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/JarFileContentProvider.java index acbcd656..86851cb0 100644 --- a/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/JarFileContentProvider.java +++ b/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/JarFileContentProvider.java @@ -16,7 +16,6 @@ import java.net.URI; import java.nio.charset.StandardCharsets; -import org.apache.commons.io.IOUtils; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; @@ -67,6 +66,6 @@ private static String readFileContent(JarEntryFile file) throws CoreException { } private static String convertStreamToString(InputStream inputStream) throws IOException { - return IOUtils.toString(inputStream, StandardCharsets.UTF_8); + return new String(inputStream.readAllBytes(), StandardCharsets.UTF_8); } } diff --git a/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/ProjectCommand.java b/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/ProjectCommand.java index 38acc6b2..4106ea65 100644 --- a/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/ProjectCommand.java +++ b/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/ProjectCommand.java @@ -28,7 +28,6 @@ import java.util.jar.Manifest; import java.util.zip.ZipFile; -import org.apache.commons.io.FilenameUtils; import org.apache.commons.lang3.StringUtils; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IProject; @@ -113,7 +112,7 @@ public static List listProjects(List arguments, IProgressMo } PackageNode projectNode = PackageNode.createNodeForProject(JavaCore.create(project)); if (Objects.equals(project.getName(), invisibleProjectName)) { - projectNode.setDisplayName(FilenameUtils.getBaseName(workspaceFolderPath.toOSString())); + projectNode.setDisplayName(workspaceFolderPath.lastSegment()); } children.add(projectNode); } diff --git a/jdtls.ext/target.target b/jdtls.ext/target.target index 608aad71..e276dfc2 100644 --- a/jdtls.ext/target.target +++ b/jdtls.ext/target.target @@ -5,7 +5,6 @@ - @@ -31,6 +30,5 @@ - diff --git a/package-lock.json b/package-lock.json index 41a06937..3ac51837 100644 --- a/package-lock.json +++ b/package-lock.json @@ -95,26 +95,26 @@ "dev": true }, "@jridgewell/gen-mapping": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.1.tgz", - "integrity": "sha512-GcHwniMlA2z+WFPWuY8lp3fsza0I8xPFMWL5+n8LYyP6PSvPrXf4+n8stDHZY2DM0zy9sVkRDy1jDI4XGzYVqg==", + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", + "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", "dev": true, "requires": { - "@jridgewell/set-array": "^1.0.0", + "@jridgewell/set-array": "^1.0.1", "@jridgewell/sourcemap-codec": "^1.4.10", "@jridgewell/trace-mapping": "^0.3.9" } }, "@jridgewell/resolve-uri": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.0.7.tgz", - "integrity": "sha512-8cXDaBBHOr2pQ7j77Y6Vp5VDT2sIqWyWQ56TjEq4ih/a4iST3dItRe8Q9fp0rrIl9DoKhWQtUQz/YpOxLkXbNA==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", "dev": true }, "@jridgewell/set-array": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.1.tgz", - "integrity": "sha512-Ct5MqZkLGEXTVmQYbGtx9SVqD2fqwvdubdps5D3djjAkgkKwT918VNOz65pEHFaYTeWcukmJmH5SwsA9Tn2ObQ==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", "dev": true }, "@jridgewell/source-map": { @@ -128,15 +128,15 @@ } }, "@jridgewell/sourcemap-codec": { - "version": "1.4.13", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.13.tgz", - "integrity": "sha512-GryiOJmNcWbovBxTfZSF71V/mXbgcV3MewDe3kIMCLyIh5e7SKAeUZs+rMnJ8jkMolZ/4/VsdBmMrw3l+VdZ3w==", + "version": "1.4.14", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", "dev": true }, "@jridgewell/trace-mapping": { - "version": "0.3.13", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.13.tgz", - "integrity": "sha512-o1xbKhp9qnIAoHJSWd6KlCZfqslL4valSF81H8ImioOAxluWYWOpWkpyktY2vnt4tbrX9XYaxovq6cgowaJp2w==", + "version": "0.3.14", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.14.tgz", + "integrity": "sha512-bJWEfQ9lPTvm3SneWwRFVLzrh6nhjwqw7TUFFBEMzwvg7t7PCDenf2lDwqo4NQXzdpgBXyFgDWnQA+2vkruksQ==", "dev": true, "requires": { "@jridgewell/resolve-uri": "^3.0.3", @@ -239,9 +239,9 @@ } }, "@types/eslint": { - "version": "8.4.2", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.4.2.tgz", - "integrity": "sha512-Z1nseZON+GEnFjJc04sv4NSALGjhFwy6K0HXt7qsn5ArfAKtb63dXNJHf+1YW6IpOIYRBGUbu3GwJdj8DGnCjA==", + "version": "8.4.5", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.4.5.tgz", + "integrity": "sha512-dhsC09y1gpJWnK+Ff4SGvCuSnk9DaU0BJZSzOwa6GVSg65XtTugLBITDAAzRU5duGBoXBHpdR/9jHGxJjNflJQ==", "dev": true, "requires": { "@types/estree": "*", @@ -249,9 +249,9 @@ } }, "@types/eslint-scope": { - "version": "3.7.3", - "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.3.tgz", - "integrity": "sha512-PB3ldyrcnAicT35TWPs5IcwKD8S333HMaa2VVv4+wdvebJkjWuW/xESoB8IwRcog8HYVYamb1g/R31Qv5Bx03g==", + "version": "3.7.4", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.4.tgz", + "integrity": "sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==", "dev": true, "requires": { "@types/eslint": "*", @@ -329,9 +329,9 @@ "dev": true }, "@types/node": { - "version": "16.11.7", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.7.tgz", - "integrity": "sha512-QB5D2sqfSjCmTuWcBWyJ+/44bcjO7VbjSbOE0ucoVbAsSNQc4Lt6QkgkVXkTDwkL4z/beecZNDvVX15D4P8Jbw==", + "version": "16.11.47", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.47.tgz", + "integrity": "sha512-fpP+jk2zJ4VW66+wAMFoBJlx1bxmBKx4DUFf68UHgdGCOuyUTDlLWqsaNPJh7xhNDykyJ9eIzAygilP/4WoN8g==", "dev": true }, "@types/responselike": { @@ -580,9 +580,9 @@ "dev": true }, "acorn": { - "version": "8.7.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.1.tgz", - "integrity": "sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A==", + "version": "8.8.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.0.tgz", + "integrity": "sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w==", "dev": true }, "acorn-import-assertions": { @@ -766,6 +766,7 @@ "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -786,16 +787,15 @@ "dev": true }, "browserslist": { - "version": "4.20.3", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.20.3.tgz", - "integrity": "sha512-NBhymBQl1zM0Y5dQT/O+xiLP9/rzOIQdKM/eMJBAq7yBgaB6krIYLGejrwVYnSHZdqjscB1SPuAjHwxjvN6Wdg==", + "version": "4.21.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.3.tgz", + "integrity": "sha512-898rgRXLAyRkM1GryrrBHGkqA5hlpkV5MhtZwg9QXeiyLUYs2k00Un05aX5l2/yJIOObYKOpS2JNo8nJDE7fWQ==", "dev": true, "requires": { - "caniuse-lite": "^1.0.30001332", - "electron-to-chromium": "^1.4.118", - "escalade": "^3.1.1", - "node-releases": "^2.0.3", - "picocolors": "^1.0.0" + "caniuse-lite": "^1.0.30001370", + "electron-to-chromium": "^1.4.202", + "node-releases": "^2.0.6", + "update-browserslist-db": "^1.0.5" } }, "buffer": { @@ -898,9 +898,9 @@ "dev": true }, "caniuse-lite": { - "version": "1.0.30001346", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001346.tgz", - "integrity": "sha512-q6ibZUO2t88QCIPayP/euuDREq+aMAxFE5S70PkrLh0iTDj/zEhgvJRKC2+CvXY6EWc6oQwUR48lL5vCW6jiXQ==", + "version": "1.0.30001373", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001373.tgz", + "integrity": "sha512-pJYArGHrPp3TUqQzFYRmP/lwJlj8RCbVe3Gd3eJQkAV8SAC6b19XS9BjMvRdvaS8RMkaTN8ZhoHP6S1y8zzwEQ==", "dev": true }, "chainsaw": { @@ -1123,7 +1123,8 @@ "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true }, "copy-webpack-plugin": { "version": "11.0.0", @@ -1346,9 +1347,9 @@ } }, "electron-to-chromium": { - "version": "1.4.146", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.146.tgz", - "integrity": "sha512-4eWebzDLd+hYLm4csbyMU2EbBnqhwl8Oe9eF/7CBDPWcRxFmqzx4izxvHH+lofQxzieg8UbB8ZuzNTxeukzfTg==", + "version": "1.4.206", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.206.tgz", + "integrity": "sha512-h+Fadt1gIaQ06JaIiyqPsBjJ08fV5Q7md+V8bUvQW/9OvXfL2LRICTz2EcnnCP7QzrFTS6/27MRV6Bl9Yn97zA==", "dev": true }, "emoji-regex": { @@ -1588,7 +1589,7 @@ "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", "dev": true }, "fsevents": { @@ -1680,6 +1681,17 @@ "minimatch": "^3.1.1", "once": "^1.3.0", "path-is-absolute": "^1.0.0" + }, + "dependencies": { + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + } } }, "glob-parent": { @@ -1860,7 +1872,7 @@ "inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", "dev": true, "requires": { "once": "^1.3.0", @@ -2221,11 +2233,21 @@ "dev": true }, "minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.0.tgz", + "integrity": "sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg==", "requires": { - "brace-expansion": "^1.1.7" + "brace-expansion": "^2.0.1" + }, + "dependencies": { + "brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "requires": { + "balanced-match": "^1.0.0" + } + } } }, "minimist": { @@ -2394,9 +2416,9 @@ "dev": true }, "node-releases": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.5.tgz", - "integrity": "sha512-U9h1NLROZTq9uE1SNffn6WuPDg8icmi3ns4rEl/oTfIle4iLjTliCzgTsbaIFMq/Xn078/lfY/BL0GWZ+psK4Q==", + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.6.tgz", + "integrity": "sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==", "dev": true }, "normalize-path": { @@ -2531,7 +2553,7 @@ "path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", "dev": true }, "path-key": { @@ -3312,6 +3334,15 @@ "esprima": "^4.0.0" } }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, "mkdirp": { "version": "0.5.5", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", @@ -3424,6 +3455,16 @@ "setimmediate": "~1.0.4" } }, + "update-browserslist-db": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.5.tgz", + "integrity": "sha512-dteFFpCyvuDdr9S/ff1ISkKt/9YZxKjI9WlRR99c180GaztJtRa/fn18FdxGVKVsnPY7/a/FDN68mcvUmP4U7Q==", + "dev": true, + "requires": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + } + }, "uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", @@ -3537,6 +3578,15 @@ "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", "dev": true }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, "semver": { "version": "5.7.1", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", @@ -3619,9 +3669,9 @@ } }, "webpack": { - "version": "5.73.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.73.0.tgz", - "integrity": "sha512-svjudQRPPa0YiOYa2lM/Gacw0r6PvxptHj4FuEKQ2kX05ZLkjbVc5MnPs6its5j7IZljnIqSVo/OsY2X0IpHGA==", + "version": "5.74.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.74.0.tgz", + "integrity": "sha512-A2InDwnhhGN4LYctJj6M1JEaGL7Luj6LOmyBHjcI8529cm5p6VXiTIW2sn6ffvEAKmveLzvu4jrihwXtPojlAA==", "dev": true, "requires": { "@types/eslint-scope": "^3.7.3", @@ -3629,11 +3679,11 @@ "@webassemblyjs/ast": "1.11.1", "@webassemblyjs/wasm-edit": "1.11.1", "@webassemblyjs/wasm-parser": "1.11.1", - "acorn": "^8.4.1", + "acorn": "^8.7.1", "acorn-import-assertions": "^1.7.6", "browserslist": "^4.14.5", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.9.3", + "enhanced-resolve": "^5.10.0", "es-module-lexer": "^0.9.0", "eslint-scope": "5.1.1", "events": "^3.2.0", @@ -3646,20 +3696,8 @@ "schema-utils": "^3.1.0", "tapable": "^2.1.1", "terser-webpack-plugin": "^5.1.3", - "watchpack": "^2.3.1", + "watchpack": "^2.4.0", "webpack-sources": "^3.2.3" - }, - "dependencies": { - "enhanced-resolve": { - "version": "5.9.3", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.9.3.tgz", - "integrity": "sha512-Bq9VSor+kjvW3f9/MiiR4eE3XYgOl7/rS8lnSxbRbF3kS0B2r+Y9w5krBWxZgDxASVZbdYrn5wT4j/Wb0J9qow==", - "dev": true, - "requires": { - "graceful-fs": "^4.2.4", - "tapable": "^2.2.0" - } - } } }, "webpack-cli": { diff --git a/package.json b/package.json index 9ed21573..b0b328a6 100644 --- a/package.json +++ b/package.json @@ -811,7 +811,7 @@ "tslint": "^6.1.3", "typescript": "^4.7.4", "vscode-extension-tester": "^4.3.0", - "webpack": "^5.73.0", + "webpack": "^5.74.0", "webpack-cli": "^4.10.0" }, "dependencies": { @@ -819,7 +819,7 @@ "fs-extra": "^10.1.0", "globby": "^13.1.2", "lodash": "^4.17.21", - "minimatch": "^3.1.2", + "minimatch": "^5.1.0", "semver": "^7.3.7", "vscode-extension-telemetry-wrapper": "^0.13.1", "vscode-tas-client": "^0.1.47" From 118eb9617d01f0828f24221222f536a94330dd28 Mon Sep 17 00:00:00 2001 From: Sheng Chen Date: Tue, 2 Aug 2022 15:35:55 +0800 Subject: [PATCH 126/352] fix: Activation events not working (#683) Signed-off-by: sheche --- package.json | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/package.json b/package.json index b0b328a6..99b25f56 100644 --- a/package.json +++ b/package.json @@ -28,12 +28,18 @@ }, "activationEvents": [ "onLanguage:java", - "workspaceContains:{*/,}pom.xml", - "workspaceContains:{*/,}build.gradle", - "workspaceContains:{*/,}settings.gradle", - "workspaceContains:{*/,}build.gradle.kts", - "workspaceContains:{*/,}settings.gradle.kts", - "workspaceContains:{*/,}.classpath", + "workspaceContains:pom.xml", + "workspaceContains:*/pom.xml", + "workspaceContains:build.gradle", + "workspaceContains:*/build.gradle", + "workspaceContains:settings.gradle", + "workspaceContains:*/settings.gradle", + "workspaceContains:build.gradle.kts", + "workspaceContains:*/build.gradle.kts", + "workspaceContains:settings.gradle.kts", + "workspaceContains:*/settings.gradle.kts", + "workspaceContains:.classpath", + "workspaceContains:*/.classpath", "onCommand:_java.project.open", "onCommand:java.project.create", "onCommand:java.view.package.newJavaClass" From 6c9d1561e9542a484bb7e6c941999c3e81dc34a8 Mon Sep 17 00:00:00 2001 From: Sheng Chen Date: Thu, 4 Aug 2022 15:23:50 +0800 Subject: [PATCH 127/352] fix: Do not allow craeting new types in resource folder (#685) Signed-off-by: Sheng Chen --- src/explorerCommands/new.ts | 7 ++++--- src/views/packageRootNode.ts | 2 +- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src/explorerCommands/new.ts b/src/explorerCommands/new.ts index 36a3d470..ba93aeb4 100644 --- a/src/explorerCommands/new.ts +++ b/src/explorerCommands/new.ts @@ -10,6 +10,7 @@ import { Commands } from "../../extension.bundle"; import { ExtensionName } from "../constants"; import { NodeKind } from "../java/nodeData"; import { DataNode } from "../views/dataNode"; +import { resourceRoots } from "../views/packageRootNode"; import { checkJavaQualifiedName } from "./utility"; export async function newJavaClass(node?: DataNode): Promise { @@ -35,7 +36,7 @@ export async function newJavaClass(node?: DataNode): Promise { // User canceled return; } else if (packageFsPath.length === 0) { - return newUntiledJavaFile(); + return newUntitledJavaFile(); } const className: string | undefined = await window.showInputBox({ @@ -67,7 +68,7 @@ export async function newJavaClass(node?: DataNode): Promise { workspace.applyEdit(workspaceEdit); } -async function newUntiledJavaFile(): Promise { +async function newUntitledJavaFile(): Promise { await commands.executeCommand("workbench.action.files.newUntitledFile"); const textEditor: TextEditor | undefined = window.activeTextEditor; if (!textEditor) { @@ -147,7 +148,7 @@ async function getPackageFsPath(node: DataNode): Promise { if (node.nodeData.kind === NodeKind.Project) { const childrenNodes: DataNode[] = await node.getChildren() as DataNode[]; const packageRoots: any[] = childrenNodes.filter((child) => { - return child.nodeData.kind === NodeKind.PackageRoot; + return child.nodeData.kind === NodeKind.PackageRoot && !resourceRoots.includes(child.name); }); if (packageRoots.length < 1) { // This might happen for an invisible project with "_" as its root diff --git a/src/views/packageRootNode.ts b/src/views/packageRootNode.ts index 90a6bd29..c91b39e1 100644 --- a/src/views/packageRootNode.ts +++ b/src/views/packageRootNode.ts @@ -104,4 +104,4 @@ export class PackageRootNode extends DataNode { } } -const resourceRoots: string[] = ["src/main/resources", "src/test/resources"]; +export const resourceRoots: string[] = ["src/main/resources", "src/test/resources"]; From a27b2ae10bd73a334f0317db6c4ab99c4b636a1e Mon Sep 17 00:00:00 2001 From: Sheng Chen Date: Thu, 4 Aug 2022 15:50:47 +0800 Subject: [PATCH 128/352] fix: Remove the limitation of only displaying invisible projects (#684) - now, no matter where the projects are located, we will display all of them in Java Projects explorer. (The only exception is the default project). Signed-off-by: Sheng Chen --- .../jdtls/ext/core/ProjectCommand.java | 25 ++++++++++--------- 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/ProjectCommand.java b/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/ProjectCommand.java index 4106ea65..b4f6058c 100644 --- a/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/ProjectCommand.java +++ b/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/ProjectCommand.java @@ -18,7 +18,6 @@ import java.io.FileOutputStream; import java.io.IOException; import java.util.ArrayList; -import java.util.Collections; import java.util.HashSet; import java.util.List; import java.util.Objects; @@ -59,6 +58,7 @@ import org.eclipse.jdt.ls.core.internal.JavaLanguageServerPlugin; import org.eclipse.jdt.ls.core.internal.ProjectUtils; import org.eclipse.jdt.ls.core.internal.ResourceUtils; +import org.eclipse.jdt.ls.core.internal.managers.ProjectsManager; import org.eclipse.jdt.ls.core.internal.managers.UpdateClasspathJob; import org.eclipse.jdt.ls.core.internal.preferences.Preferences.ReferencedLibraries; import org.eclipse.lsp4j.jsonrpc.json.adapters.CollectionTypeAdapter; @@ -94,24 +94,25 @@ private static class Classpath { public static List listProjects(List arguments, IProgressMonitor monitor) { String workspaceUri = (String) arguments.get(0); IPath workspaceFolderPath = ResourceUtils.canonicalFilePathFromURI(workspaceUri); - String invisibleProjectName = ProjectUtils.getWorkspaceInvisibleProjectName(workspaceFolderPath); - IProject[] projects = getWorkspaceRoot().getProjects(); + IJavaProject[] javaProjects = ProjectUtils.getJavaProjects(); ArrayList children = new ArrayList<>(); - List paths = Collections.singletonList(workspaceFolderPath); - for (IProject project : projects) { - if (!project.isAccessible() || !ProjectUtils.isJavaProject(project)) { + for (IJavaProject javaProject : javaProjects) { + IProject project = javaProject.getProject(); + if (!project.isAccessible() || project.getLocation() == null) { continue; } - // Ignore all the projects that's not contained in the workspace folder, except - // for the invisible project. - // This check is needed in multi-root scenario. - if ((!ResourceUtils.isContainedIn(project.getLocation(), paths) - && !Objects.equals(project.getName(), invisibleProjectName))) { + + // ignore default projects + if (Objects.equals(project.getName(), ProjectsManager.DEFAULT_PROJECT_NAME)) { continue; } + PackageNode projectNode = PackageNode.createNodeForProject(JavaCore.create(project)); - if (Objects.equals(project.getName(), invisibleProjectName)) { + + // set the folder name as the project name when the project location + // is out of the workspace folder. + if (!workspaceFolderPath.isPrefixOf(project.getLocation())) { projectNode.setDisplayName(workspaceFolderPath.lastSegment()); } children.add(projectNode); From 3554bcdd4d4c8b70acd0871973d580c934ce6468 Mon Sep 17 00:00:00 2001 From: Shi Chen Date: Wed, 31 Aug 2022 14:04:55 +0800 Subject: [PATCH 129/352] chore: remove ASKUSER option(#686) --- src/tasks/buildArtifact/GenerateJarExecutor.ts | 8 ++------ src/tasks/buildArtifact/utility.ts | 6 ------ 2 files changed, 2 insertions(+), 12 deletions(-) diff --git a/src/tasks/buildArtifact/GenerateJarExecutor.ts b/src/tasks/buildArtifact/GenerateJarExecutor.ts index a8823886..0bdb8ab9 100644 --- a/src/tasks/buildArtifact/GenerateJarExecutor.ts +++ b/src/tasks/buildArtifact/GenerateJarExecutor.ts @@ -6,12 +6,11 @@ import { globby } from "globby"; import * as _ from "lodash"; import { basename, dirname, extname, isAbsolute, join, normalize, relative } from "path"; import { Disposable, ProgressLocation, QuickInputButtons, QuickPickItem, Uri, window, WorkspaceFolder } from "vscode"; -import { sendInfo } from "vscode-extension-telemetry-wrapper"; import { Jdtls } from "../../java/jdtls"; import { INodeData } from "../../java/nodeData"; import { IExportJarStepExecutor } from "./IExportJarStepExecutor"; import { IClasspath, IStepMetadata } from "./IStepMetadata"; -import { createPickBox, ExportJarMessages, ExportJarStep, ExportJarTargets, getExtensionApi, toPosixPath } from "./utility"; +import { createPickBox, ExportJarMessages, ExportJarStep, getExtensionApi, toPosixPath } from "./utility"; export class GenerateJarExecutor implements IExportJarStepExecutor { @@ -34,10 +33,7 @@ export class GenerateJarExecutor implements IExportJarStepExecutor { throw new Error(ExportJarMessages.fieldUndefinedMessage(ExportJarMessages.Field.WORKSPACEFOLDER, this.currentStep)); } let destPath = ""; - if (stepMetadata.outputPath === ExportJarTargets.SETTING_ASKUSER || stepMetadata.outputPath === "") { - if (stepMetadata.outputPath === ExportJarTargets.SETTING_ASKUSER) { - sendInfo("", { exportJarPath: stepMetadata.outputPath }); - } + if (stepMetadata.outputPath === "") { const outputUri: Uri | undefined = await window.showSaveDialog({ defaultUri: Uri.file(join(folder.uri.fsPath, `${folder.name}.jar`)), filters: { diff --git a/src/tasks/buildArtifact/utility.ts b/src/tasks/buildArtifact/utility.ts index fc29d5e0..60c5ffd8 100644 --- a/src/tasks/buildArtifact/utility.ts +++ b/src/tasks/buildArtifact/utility.ts @@ -27,12 +27,6 @@ export const stepMap: Map = new Map Date: Wed, 14 Sep 2022 13:13:47 +0800 Subject: [PATCH 130/352] chore(deps): Update dependencies (#688) --- package-lock.json | 261 +++++++++++++++++++--------------------- package.json | 12 +- test/ui/command.test.ts | 2 +- 3 files changed, 129 insertions(+), 146 deletions(-) diff --git a/package-lock.json b/package-lock.json index 3ac51837..42de3718 100644 --- a/package-lock.json +++ b/package-lock.json @@ -144,29 +144,29 @@ } }, "@microsoft/1ds-core-js": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/@microsoft/1ds-core-js/-/1ds-core-js-3.2.3.tgz", - "integrity": "sha512-796A8fd90oUKDRO7UXUT9BwZ3G+a9XzJj5v012FcCN/2qRhEsIV3x/0wkx2S08T4FiQEUPkB2uoYHpEjEneM7g==", + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/@microsoft/1ds-core-js/-/1ds-core-js-3.2.6.tgz", + "integrity": "sha512-6OpppYCEA+rXjcs2w0KnWji3Y6ZDx0wykY7ZL3QF68NS323C45GHSpkDpVRT/lDU6Xbau/PvQm2zTYAzLcperA==", "requires": { - "@microsoft/applicationinsights-core-js": "2.8.4", + "@microsoft/applicationinsights-core-js": "2.8.6", "@microsoft/applicationinsights-shims": "^2.0.1", "@microsoft/dynamicproto-js": "^1.1.6" } }, "@microsoft/1ds-post-js": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/@microsoft/1ds-post-js/-/1ds-post-js-3.2.3.tgz", - "integrity": "sha512-tcGJQXXr2LYoBbIXPoUVe1KCF3OtBsuKDFL7BXfmNtuSGtWF0yejm6H83DrR8/cUIGMRMUP9lqNlqFGwDYiwAQ==", + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/@microsoft/1ds-post-js/-/1ds-post-js-3.2.6.tgz", + "integrity": "sha512-Zdyl3FU6kU/a7TlVVSTBZg+hSECTT65iI99FsjMOx88HudyVyk9M/0lVbA+FVXvGaxzmtBW6Lw0qRHYp4tBMSA==", "requires": { - "@microsoft/1ds-core-js": "3.2.3", + "@microsoft/1ds-core-js": "3.2.6", "@microsoft/applicationinsights-shims": "^2.0.1", "@microsoft/dynamicproto-js": "^1.1.6" } }, "@microsoft/applicationinsights-core-js": { - "version": "2.8.4", - "resolved": "https://registry.npmjs.org/@microsoft/applicationinsights-core-js/-/applicationinsights-core-js-2.8.4.tgz", - "integrity": "sha512-FoA0FNOsFbJnLyTyQlYs6+HR7HMEa6nAOE6WOm9WVejBHMHQ/Bdb+hfVFi6slxwCimr/ner90jchi4/sIYdnyQ==", + "version": "2.8.6", + "resolved": "https://registry.npmjs.org/@microsoft/applicationinsights-core-js/-/applicationinsights-core-js-2.8.6.tgz", + "integrity": "sha512-rL+ceda1Y6HaHBe1vIbNT/f5JGuHiD5Ydq+DoAfu56o13wyJu4sao3QKaabgaIM59pPO+3BMeGsK8NNUGYaT3w==", "requires": { "@microsoft/applicationinsights-shims": "2.0.1", "@microsoft/dynamicproto-js": "^1.1.6" @@ -289,12 +289,6 @@ "integrity": "sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ==", "dev": true }, - "@types/json-buffer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/json-buffer/-/json-buffer-3.0.0.tgz", - "integrity": "sha512-3YP80IxxFJB4b5tYC2SUPwkg0XQLiu0nWvhRgEatgjf+29IcWO9X1k8xRv5DGssJ/lCrjYTjQPcobJr2yWIVuQ==", - "dev": true - }, "@types/json-schema": { "version": "7.0.9", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz", @@ -311,9 +305,9 @@ } }, "@types/lodash": { - "version": "4.14.182", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.182.tgz", - "integrity": "sha512-/THyiqyQAP9AfARo4pF+aCGcyiQ94tX/Is2I7HofNRqoYLgN1PBoOWu2/zTA5zMxzP5EFutMtWtGAFRKUe961Q==", + "version": "4.14.184", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.184.tgz", + "integrity": "sha512-RoZphVtHbxPZizt4IcILciSWiC6dcn+eZ8oX9IWEYfDMcocdd42f7NPI6fQj+6zI8y4E0L7gu2pcZKLGTRaV9Q==", "dev": true }, "@types/minimatch": { @@ -344,18 +338,18 @@ } }, "@types/selenium-webdriver": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/@types/selenium-webdriver/-/selenium-webdriver-4.1.1.tgz", - "integrity": "sha512-NxxZZek50ylIACiXebKQYHD3D4One3WXOasEXWazL6aTfYbZob7ClNKxUpg8I4/oWArX87oPWvj1cHKqfel3Hg==", + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/@types/selenium-webdriver/-/selenium-webdriver-4.1.3.tgz", + "integrity": "sha512-wbLIzr+fG/JT2qGJUo4YU9oObkKI1TqNSxJZkQIlpK2xllJAAZA7+IcybSnC4537qGQEmhCHwWqFN1GC9r8dgw==", "dev": true, "requires": { "@types/ws": "*" } }, "@types/semver": { - "version": "7.3.10", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.3.10.tgz", - "integrity": "sha512-zsv3fsC7S84NN6nPK06u79oWgrPVd0NvOyqgghV1haPaFcVxIrP4DLomRwGAXk0ui4HZA7mOcSFL98sMVW9viw==", + "version": "7.3.12", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.3.12.tgz", + "integrity": "sha512-WwA1MW0++RfXmCr12xeYOOC5baSC9mSb0ZqCquFzKhcoF4TvHu5MKOuXsncgZcpVFhB1pXd5hZmM0ryAoCp12A==", "dev": true }, "@types/vscode": { @@ -698,9 +692,9 @@ } }, "azure-devops-node-api": { - "version": "11.1.1", - "resolved": "https://registry.npmjs.org/azure-devops-node-api/-/azure-devops-node-api-11.1.1.tgz", - "integrity": "sha512-XDG91XzLZ15reP12s3jFkKS8oiagSICjnLwxEYieme4+4h3ZveFOFRA4iYIG40RyHXsiI0mefFYYMFIJbMpWcg==", + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/azure-devops-node-api/-/azure-devops-node-api-11.2.0.tgz", + "integrity": "sha512-XdiGPhrpaT5J8wdERRKs5g8E0Zy1pvOYTli7z9E8nmOn3YGp4FhtjhrOyFmX/8veWCwdI69mCHKJw6l+4J/bHA==", "dev": true, "requires": { "tunnel": "0.0.6", @@ -727,7 +721,7 @@ "binary": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/binary/-/binary-0.3.0.tgz", - "integrity": "sha1-n2BVO8XOjDOG87VTz/R0Yq3sqnk=", + "integrity": "sha512-D4H1y5KYwpJgK8wk1Cue5LLPgmwHKYSChkbspQg5JtVuR5ulGckxfR62H3AE9UDkdMC8yyXlqYihuz3Aqg2XZg==", "dev": true, "requires": { "buffers": "~0.1.1", @@ -753,13 +747,13 @@ "bluebird": { "version": "3.4.7", "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.4.7.tgz", - "integrity": "sha1-9y12C+Cbf3bQjtj66Ysomo0F+rM=", + "integrity": "sha512-iD3898SR7sWVRHbiQv+sHUtHnMvC1o3nW5rAcqnq3uOn07DSAppZYUkIGslDz6gXC7HfunPe7YVBgoEJASPcHA==", "dev": true }, "boolbase": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", "dev": true }, "brace-expansion": { @@ -827,13 +821,13 @@ "buffer-crc32": { "version": "0.2.13", "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", - "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=", + "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", "dev": true }, "buffer-fill": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz", - "integrity": "sha1-+PeLdniYiO858gXNY39o5wISKyw=", + "integrity": "sha512-T7zexNBwiiaCOGDg9xNX9PBmjrubblRkENuptryuI64URkXDFum9il/JGL8Lm8wYfAXpredVXXZz7eMHilimiQ==", "dev": true }, "buffer-from": { @@ -851,13 +845,13 @@ "buffers": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/buffers/-/buffers-0.1.1.tgz", - "integrity": "sha1-skV5w77U1tOWru5tmorn9Ugqt7s=", + "integrity": "sha512-9q/rDEGSb/Qsvv2qvzIzdluL5k7AaJOTrw23z9reQthrbF7is4CtlT0DXyO1oei2DCp4uojjzQ7igaSHp1kAEQ==", "dev": true }, "builtin-modules": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", - "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", + "integrity": "sha512-wxXCdllwGhI2kCC0MnvTGYTMvnVZTvqgypkiTI8Pa5tcz2i6VqsqwYGgqwXji+4RgCzms6EajE4IxiUH6HH8nQ==", "dev": true }, "cacheable-lookup": { @@ -906,7 +900,7 @@ "chainsaw": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/chainsaw/-/chainsaw-0.1.0.tgz", - "integrity": "sha1-XqtQsor+WAdNDVgpE4iCi15fvJg=", + "integrity": "sha512-75kWfWt6MEKNC8xYXIdRpDehRYY/tNSgwKaJq+dbbDcxORuVrrQ+SEHoWsniVn9XPYfP4gmdWIeDk/4YNp1rNQ==", "dev": true, "requires": { "traverse": ">=0.3.0 <0.4" @@ -1069,9 +1063,9 @@ } }, "clone-response": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz", - "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.3.tgz", + "integrity": "sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==", "dev": true, "requires": { "mimic-response": "^1.0.0" @@ -1110,20 +1104,10 @@ "integrity": "sha512-W6Af2Iw1z4CB7q4uU4hv646dW9GQuBM+YpC0UvUCWSD8w90SJjp+ujJuXaEMtAXBtSqGfMPuFOVn4/+FlaqfBA==", "dev": true }, - "compress-brotli": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/compress-brotli/-/compress-brotli-1.3.8.tgz", - "integrity": "sha512-lVcQsjhxhIXsuupfy9fmZUFtAIdBmXA7EGY6GBdgZ++qkM9zG4YFT8iU7FoBxzryNDMOpD1HIFHUSX4D87oqhQ==", - "dev": true, - "requires": { - "@types/json-buffer": "~3.0.0", - "json-buffer": "~3.0.1" - } - }, "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", "dev": true }, "copy-webpack-plugin": { @@ -1340,7 +1324,7 @@ "duplexer2": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", - "integrity": "sha1-ixLauHjA1p4+eJEFFmKjL8a93ME=", + "integrity": "sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==", "dev": true, "requires": { "readable-stream": "^2.0.2" @@ -1378,9 +1362,9 @@ } }, "entities": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.3.1.tgz", - "integrity": "sha512-o4q/dYJlmyjP2zfnaWDUC6A3BQFmVTX+tZPezK7k0GLSU9QYCauscf5Y+qcEPzKL+EixVouYDgLQK5H9GrLpkg==", + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.4.0.tgz", + "integrity": "sha512-oYp7156SP8LkeGD0GF85ad1X9Ai79WtRsZ2gxJqtBuzH+98YUV6jkHEKlZkMbcrjJjIVJNIDP/3WL9wQkoPbWA==", "dev": true }, "envinfo": { @@ -1535,7 +1519,7 @@ "fd-slicer": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", - "integrity": "sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4=", + "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", "dev": true, "requires": { "pend": "~1.2.0" @@ -1566,9 +1550,9 @@ "dev": true }, "follow-redirects": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.0.tgz", - "integrity": "sha512-aExlJShTV4qOUOL7yF1U5tvLCB0xQuudbf6toyYA0E/acBNw71mvjFTnLaRp50aQaYocMR0a/RMMBIHeZnGyjQ==" + "version": "1.15.1", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.1.tgz", + "integrity": "sha512-yLAMQs+k0b2m7cVxpS1VKJVvoz7SS9Td1zss3XRwXj+ZDH00RJgnuLx7E44wx02kQLrdM3aOOy+FpzS7+8OizA==" }, "fs-constants": { "version": "1.0.0", @@ -1666,7 +1650,7 @@ "github-from-package": { "version": "0.0.0", "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", - "integrity": "sha1-l/tdlr/eiXMxPyDoKI75oWf6ZM4=", + "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==", "dev": true }, "glob": { @@ -1856,7 +1840,7 @@ "immediate": { "version": "3.0.6", "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", - "integrity": "sha1-nbHb0Pr43m++D13V5Wu2BigN5ps=", + "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==", "dev": true }, "import-local": { @@ -1924,7 +1908,7 @@ "is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=" + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==" }, "is-glob": { "version": "4.0.3", @@ -1957,7 +1941,7 @@ "is-stream": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==", "dev": true }, "is-unicode-supported": { @@ -1978,19 +1962,19 @@ "isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", "dev": true }, "isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", "dev": true }, "isobject": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", "dev": true }, "jest-worker": { @@ -2047,9 +2031,9 @@ } }, "jszip": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.10.0.tgz", - "integrity": "sha512-LDfVtOLtOxb9RXkYOwPyNBTQDL4eUbqahtoY6x07GiDJHwSYvn8sHHIw8wINImV3MqbMNve2gSuM1DDqEKk09Q==", + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.10.1.tgz", + "integrity": "sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==", "dev": true, "requires": { "lie": "~3.3.0", @@ -2069,12 +2053,11 @@ } }, "keyv": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.3.2.tgz", - "integrity": "sha512-kn8WmodVBe12lmHpA6W8OY7SNh6wVR+Z+wZESF4iF5FCazaVXGWOtnbnvX0tMQ1bO+/TmOD9LziuYMvrIIs0xw==", + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.0.tgz", + "integrity": "sha512-2YvuMsA+jnFGtBareKqgANOEKe1mk3HKiXu2fRmAfyxG0MJAywNhi5ttWA3PMjl4NmpyjZNbFifR2vNjW1znfA==", "dev": true, "requires": { - "compress-brotli": "^1.3.8", "json-buffer": "3.0.1" } }, @@ -2111,7 +2094,7 @@ "listenercount": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/listenercount/-/listenercount-1.0.1.tgz", - "integrity": "sha1-hMinKrWcRyUyFIDJdeZQg0LnCTc=", + "integrity": "sha512-3mk/Zag0+IJxeDrxSgaDPy4zZ3w05PRZeJNnlWhzFz5OkX49J4krc+A8X2d2M69vGMBEX0uyl8M+W+8gH+kBqQ==", "dev": true }, "loader-runner": { @@ -2182,7 +2165,7 @@ "mdurl": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", - "integrity": "sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4=", + "integrity": "sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==", "dev": true }, "merge-stream": { @@ -2352,9 +2335,9 @@ } }, "monaco-page-objects": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/monaco-page-objects/-/monaco-page-objects-2.0.0.tgz", - "integrity": "sha512-+nMHbbQIsxpBqn0semRpAaa24L+RORi+RKD3yoTIzZQLCBqhsgjksqX+c3mIFpvIQDLGUxS5MKZoo1xRpkKd2g==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/monaco-page-objects/-/monaco-page-objects-2.0.1.tgz", + "integrity": "sha512-OL2vzqA0YkKozdEEwj3fBYyJsv2jWZrG8nlKfho5epe//FQ7sY7QzaJ8OtfBD5mYGT7mwV1O649A/E33D5H6kA==", "dev": true, "requires": { "clipboardy": "^2.3.0", @@ -2401,9 +2384,9 @@ "dev": true }, "node-abi": { - "version": "3.22.0", - "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.22.0.tgz", - "integrity": "sha512-u4uAs/4Zzmp/jjsD9cyFYDXeISfUWaAVWshPmDZOFOv4Xl4SbzTXm53I04C2uRueYJ+0t5PEtLH/owbn2Npf/w==", + "version": "3.24.0", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.24.0.tgz", + "integrity": "sha512-YPG3Co0luSu6GwOBsmIdGW6Wx0NyNDLg/hriIyDllVsNwnI6UeqaWShxC3lbH4LtEQUgoLP3XR1ndXiDAWvmRw==", "dev": true, "requires": { "semver": "^7.3.5" @@ -2436,7 +2419,7 @@ "npm-run-path": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", - "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "integrity": "sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==", "dev": true, "requires": { "path-key": "^2.0.0" @@ -2460,7 +2443,7 @@ "once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", "dev": true, "requires": { "wrappy": "1" @@ -2475,7 +2458,7 @@ "p-finally": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", + "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==", "dev": true }, "p-limit": { @@ -2511,7 +2494,7 @@ "parse-semver": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/parse-semver/-/parse-semver-1.1.1.tgz", - "integrity": "sha1-mkr9bfBj3Egm+T+6SpnPIj9mbLg=", + "integrity": "sha512-Eg1OuNntBMH0ojvEKSrvDSnwLmvVuUOSdylH/pSCPNMIspLlweJyIWXCE+k/5hm3cj/EBUYwmWkjhBALNP4LXQ==", "dev": true, "requires": { "semver": "^5.1.0" @@ -2526,12 +2509,12 @@ } }, "parse5": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.0.0.tgz", - "integrity": "sha512-y/t8IXSPWTuRZqXc0ajH/UwDj4mnqLEbSttNbThcFhGrZuOyoyvNBO85PBp2jQa55wY9d07PBNjsK8ZP3K5U6g==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.1.tgz", + "integrity": "sha512-kwpuwzB+px5WUg9pyK0IcK/shltJN5/OVhQagxhCQNtT9Y9QRZqNY2e1cmbu/paRh5LMnz/oVTVLBpjFmMZhSg==", "dev": true, "requires": { - "entities": "^4.3.0" + "entities": "^4.4.0" } }, "parse5-htmlparser2-tree-adapter": { @@ -2559,7 +2542,7 @@ "path-key": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", "dev": true }, "path-parse": { @@ -2576,7 +2559,7 @@ "pend": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", - "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=", + "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", "dev": true }, "picocolors": { @@ -2773,7 +2756,7 @@ "strip-json-comments": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", + "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", "dev": true } } @@ -2781,7 +2764,7 @@ "read": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/read/-/read-1.0.7.tgz", - "integrity": "sha1-s9oZvQUkMal2cdRKQmNK33ELQMQ=", + "integrity": "sha512-rSOKNYUmaxy0om1BNjMN4ezNT6VKK+2xF4GBhc81mkH7L60i6dp8qPYrkndNLT3QPphoII3maL9PVC9XmhHwVQ==", "dev": true, "requires": { "mute-stream": "~0.0.4" @@ -2831,7 +2814,7 @@ "require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", "dev": true }, "require-from-string": { @@ -2873,9 +2856,9 @@ "dev": true }, "responselike": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.0.tgz", - "integrity": "sha512-xH48u3FTB9VsZw7R+vvgaKeLKzT6jOogbQhEe/jewwnZgzPcnyWui2Av6JpoYZF/91uueC+lqhWqeURw5/qhCw==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.1.tgz", + "integrity": "sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==", "dev": true, "requires": { "lowercase-keys": "^2.0.0" @@ -2936,9 +2919,9 @@ } }, "selenium-webdriver": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/selenium-webdriver/-/selenium-webdriver-4.3.0.tgz", - "integrity": "sha512-9XFr8w95BO7jageR61AtiB83fJNem3fdtOQcUpqIIDHWSxihomyG/yBlL1H4y/shi/dO/Ai3PJMAOG+OW3+JHw==", + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/selenium-webdriver/-/selenium-webdriver-4.4.0.tgz", + "integrity": "sha512-Du+/xfpvNi9zHAeYgXhOWN9yH0hph+cuX+hHDBr7d+SbtQVcfNJwBzLsbdHrB1Wh7MHXFuIkSG88A9TRRQUx3g==", "dev": true, "requires": { "jszip": "^3.10.0", @@ -2966,7 +2949,7 @@ "setimmediate": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=", + "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==", "dev": true }, "shallow-clone": { @@ -2981,7 +2964,7 @@ "shebang-command": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", "dev": true, "requires": { "shebang-regex": "^1.0.0" @@ -2990,7 +2973,7 @@ "shebang-regex": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", "dev": true }, "side-channel": { @@ -3051,7 +3034,7 @@ "sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", "dev": true }, "string_decoder": { @@ -3074,7 +3057,7 @@ "strip-eof": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", - "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", + "integrity": "sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q==", "dev": true }, "strip-json-comments": { @@ -3146,16 +3129,16 @@ "targz": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/targz/-/targz-1.0.1.tgz", - "integrity": "sha1-j3alI2lM3t+7XWCkB2/27uzFOY8=", + "integrity": "sha512-6q4tP9U55mZnRuMTBqnqc3nwYQY3kv+QthCFZuMk+Tn1qYUnMPmL/JZ/mzgXINzFpSqfU+242IFmFU9VPvqaQw==", "dev": true, "requires": { "tar-fs": "^1.8.1" } }, "tas-client": { - "version": "0.1.45", - "resolved": "https://registry.npmjs.org/tas-client/-/tas-client-0.1.45.tgz", - "integrity": "sha512-IG9UmCpDbDPK23UByQ27rLybkRZYEx2eC9EkieXdwPKKjZPD2zPwfQmyGnZrZet4FUt3yj0ytkwz+liR9Nz/nA==", + "version": "0.1.58", + "resolved": "https://registry.npmjs.org/tas-client/-/tas-client-0.1.58.tgz", + "integrity": "sha512-fOWii4wQXuo9Zl0oXgvjBzZWzKc5MmUR6XQWX93WU2c1SaP1plPo/zvXP8kpbZ9fvegFOHdapszYqMTRq/SRtg==", "requires": { "axios": "^0.26.1" } @@ -3211,13 +3194,13 @@ "traverse": { "version": "0.3.9", "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.3.9.tgz", - "integrity": "sha1-cXuPIgzAu3tE5AUUwisui7xw2Lk=", + "integrity": "sha512-iawgk0hLP3SxGKDfnDJf8wTz4p2qImnyihM5Hh/sGvQ3K37dPi/w8sRhdNIxYA1TwFwc5mDhIJq+O0RsvXBKdQ==", "dev": true }, "truncate-utf8-bytes": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/truncate-utf8-bytes/-/truncate-utf8-bytes-1.0.2.tgz", - "integrity": "sha1-QFkjkJWS1W94pYGENLC3hInKXys=", + "integrity": "sha512-95Pu1QXQvruGEhv62XCMO3Mm90GscOCClvrIUwCM0PYOXK3kaF3l3sIHxx71ThJfcbM2O5Au6SO3AWCSEfW4mQ==", "dev": true, "requires": { "utf8-byte-length": "^1.0.1" @@ -3309,19 +3292,19 @@ "color-name": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", "dev": true }, "escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "dev": true }, "has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", "dev": true }, "js-yaml": { @@ -3387,7 +3370,7 @@ "tunnel-agent": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", "dev": true, "requires": { "safe-buffer": "^5.0.1" @@ -3405,9 +3388,9 @@ } }, "typescript": { - "version": "4.7.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.7.4.tgz", - "integrity": "sha512-C0WQT0gezHuw6AdY1M2jxUO83Rjf0HP7Sk1DtXj6j1EwkQNZrHAg2XPWlq62oqEhYvONq5pkC2Y9oPljWToLmQ==", + "version": "4.9.0-dev.20220907", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.0-dev.20220907.tgz", + "integrity": "sha512-wRH/8rol9ktq6cQ6NxT7fsaa7bcVBSl7KcE27AGfzlbvq6c1/KlOOXywzhtsCHFtNLPBucsirHBZxFx3gdfpBg==", "dev": true }, "uc.micro": { @@ -3483,13 +3466,13 @@ "utf8-byte-length": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/utf8-byte-length/-/utf8-byte-length-1.0.4.tgz", - "integrity": "sha1-9F8VDExm7uloGGUFq5P8u4rWv2E=", + "integrity": "sha512-4+wkEYLBbWxqTahEsWrhxepcoVOJ+1z5PGIjPZxRkytcdSUaNjIjBM7Xn8E+pdSuV7SzvWovBFA54FO0JSoqhA==", "dev": true }, "util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", "dev": true }, "uuid": { @@ -3498,9 +3481,9 @@ "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==" }, "vsce": { - "version": "2.9.2", - "resolved": "https://registry.npmjs.org/vsce/-/vsce-2.9.2.tgz", - "integrity": "sha512-xyLqL4U82BilUX1t6Ym2opQEa2tLGWYjbgB7+ETeNVXlIJz5sWBJjQJSYJVFOKJSpiOtQclolu88cj7oY6vvPQ==", + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/vsce/-/vsce-2.11.0.tgz", + "integrity": "sha512-pr9Y0va/HCer0tTifeqaUrK24JJSpRd6oLeF/PY6FtrY41e+lwxiAq6jfMXx4ShAZglYg2rFKoKROwa7E7SEqQ==", "dev": true, "requires": { "azure-devops-node-api": "^11.0.1", @@ -3605,18 +3588,18 @@ } }, "vscode-extension-telemetry-wrapper": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/vscode-extension-telemetry-wrapper/-/vscode-extension-telemetry-wrapper-0.13.1.tgz", - "integrity": "sha512-EZH0rNqQXhl6vyoM+z2FGrlBVGNHBS4bRjw4wkCNce1IageaFhCJpElWdumQrxQRM2cBQRNkbUAe8d3LYrpMSQ==", + "version": "0.13.2", + "resolved": "https://registry.npmjs.org/vscode-extension-telemetry-wrapper/-/vscode-extension-telemetry-wrapper-0.13.2.tgz", + "integrity": "sha512-Ika7ws4VlFZuK4hmP7rUYsMe91evjCaRsWbEzxijr2um6S97LKhQxave1yub7XWowErLTk3wZKPZS6aodaYjhw==", "requires": { "@vscode/extension-telemetry": "^0.6.2", "uuid": "^8.3.2" } }, "vscode-extension-tester": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/vscode-extension-tester/-/vscode-extension-tester-4.3.0.tgz", - "integrity": "sha512-Ih12B4j64l/XQMQ4SdWI+UpltzaCmHlX1u9yv9iIIUi/y401jgjQLbIoFxCUNas0SzG767hVjkzKsKbmzFPMXw==", + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/vscode-extension-tester/-/vscode-extension-tester-4.4.1.tgz", + "integrity": "sha512-CaxWk41sX1Q9rycFCN6GRmNzjY3DJl5dxVknbLxVbjeR9g0Qam+dIajVQIeHsdUVEKJdfPCA8xbpJOyl/bUFnA==", "dev": true, "requires": { "@types/selenium-webdriver": "^4.1.1", @@ -3627,7 +3610,7 @@ "got": "^11.8.2", "hpagent": "^0.1.2", "js-yaml": "^4.1.0", - "monaco-page-objects": "^2.0.0", + "monaco-page-objects": "^2.0.1", "sanitize-filename": "^1.6.3", "selenium-webdriver": "^4.2.0", "targz": "^1.0.1", @@ -3651,11 +3634,11 @@ "dev": true }, "vscode-tas-client": { - "version": "0.1.47", - "resolved": "https://registry.npmjs.org/vscode-tas-client/-/vscode-tas-client-0.1.47.tgz", - "integrity": "sha512-SlEPDi+0gwxor4ANzBtXwqROPQdQkClHeVJgnkvdDF5Xnl407htCsabTPAq4Di8muObORtLchqQS/k1ocaGDEg==", + "version": "0.1.63", + "resolved": "https://registry.npmjs.org/vscode-tas-client/-/vscode-tas-client-0.1.63.tgz", + "integrity": "sha512-TY5TPyibzi6rNmuUB7eRVqpzLzNfQYrrIl/0/F8ukrrbzOrKVvS31hM3urE+tbaVrnT+TMYXL16GhX57vEowhA==", "requires": { - "tas-client": "0.1.45" + "tas-client": "0.1.58" } }, "watchpack": { @@ -3845,13 +3828,13 @@ "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", "dev": true }, "ws": { - "version": "8.8.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.8.0.tgz", - "integrity": "sha512-JDAgSYQ1ksuwqfChJusw1LSJ8BizJ2e/vVu5Lxjq3YvNJNlROv1ui4i+c/kUUrPheBvQl4c5UbERhTwKa6QBJQ==", + "version": "8.8.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.8.1.tgz", + "integrity": "sha512-bGy2JzvzkPowEJV++hF07hAD6niYSr0JzBNo/J29WsB57A2r7Wlc1UFcTR9IzrPvuNVO4B8LGqF8qcpsVOhJCA==", "dev": true }, "xml2js": { @@ -3957,7 +3940,7 @@ "yauzl": { "version": "2.10.0", "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", - "integrity": "sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk=", + "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", "dev": true, "requires": { "buffer-crc32": "~0.2.3", diff --git a/package.json b/package.json index 99b25f56..a4ee3a71 100644 --- a/package.json +++ b/package.json @@ -803,11 +803,11 @@ "devDependencies": { "@types/fs-extra": "^9.0.13", "@types/glob": "^7.2.0", - "@types/lodash": "^4.14.182", + "@types/lodash": "^4.14.184", "@types/minimatch": "^3.0.3", "@types/mocha": "^9.1.1", "@types/node": "16.x", - "@types/semver": "^7.3.10", + "@types/semver": "^7.3.12", "@types/vscode": "1.69.0", "@vscode/test-electron": "^2.1.5", "copy-webpack-plugin": "^11.0.0", @@ -815,8 +815,8 @@ "mocha": "^9.2.2", "ts-loader": "^9.3.1", "tslint": "^6.1.3", - "typescript": "^4.7.4", - "vscode-extension-tester": "^4.3.0", + "typescript": "^4.9.0-dev.20220907", + "vscode-extension-tester": "^4.4.1", "webpack": "^5.74.0", "webpack-cli": "^4.10.0" }, @@ -827,7 +827,7 @@ "lodash": "^4.17.21", "minimatch": "^5.1.0", "semver": "^7.3.7", - "vscode-extension-telemetry-wrapper": "^0.13.1", - "vscode-tas-client": "^0.1.47" + "vscode-extension-telemetry-wrapper": "^0.13.2", + "vscode-tas-client": "^0.1.63" } } diff --git a/test/ui/command.test.ts b/test/ui/command.test.ts index 4d98e415..a7e72b76 100644 --- a/test/ui/command.test.ts +++ b/test/ui/command.test.ts @@ -262,7 +262,7 @@ describe("Command Tests", function() { await referencedItem.click(); const buttons = await referencedItem.getActionButtons(); await buttons[0].getDriver().actions() - .mouseMove(buttons[0]) + // .mouseMove(buttons[0]) .keyDown(seleniumWebdriver.Key.ALT) .click(buttons[0]) .keyUp(seleniumWebdriver.Key.ALT) From e60b2b33dd26d42dca7d831461f764aafd75cbcd Mon Sep 17 00:00:00 2001 From: Sheng Chen Date: Wed, 12 Oct 2022 14:16:27 +0800 Subject: [PATCH 131/352] chore: Bump dependency versions (#693) Signed-off-by: Sheng Chen --- package-lock.json | 106 +++++++++++++++++++++++----------------------- package.json | 8 ++-- tsconfig.json | 3 +- 3 files changed, 59 insertions(+), 58 deletions(-) diff --git a/package-lock.json b/package-lock.json index 42de3718..23015259 100644 --- a/package-lock.json +++ b/package-lock.json @@ -144,29 +144,29 @@ } }, "@microsoft/1ds-core-js": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/@microsoft/1ds-core-js/-/1ds-core-js-3.2.6.tgz", - "integrity": "sha512-6OpppYCEA+rXjcs2w0KnWji3Y6ZDx0wykY7ZL3QF68NS323C45GHSpkDpVRT/lDU6Xbau/PvQm2zTYAzLcperA==", + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/@microsoft/1ds-core-js/-/1ds-core-js-3.2.7.tgz", + "integrity": "sha512-Tc8K/IYIBFdFTUH87eSxWlIBTI5HRbx/v6lbH1xX5CS+DB6HW5v142FtSYFihQ7m+23I8YSxP9BW7dAicGqZCg==", "requires": { - "@microsoft/applicationinsights-core-js": "2.8.6", + "@microsoft/applicationinsights-core-js": "2.8.8", "@microsoft/applicationinsights-shims": "^2.0.1", "@microsoft/dynamicproto-js": "^1.1.6" } }, "@microsoft/1ds-post-js": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/@microsoft/1ds-post-js/-/1ds-post-js-3.2.6.tgz", - "integrity": "sha512-Zdyl3FU6kU/a7TlVVSTBZg+hSECTT65iI99FsjMOx88HudyVyk9M/0lVbA+FVXvGaxzmtBW6Lw0qRHYp4tBMSA==", + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/@microsoft/1ds-post-js/-/1ds-post-js-3.2.7.tgz", + "integrity": "sha512-MC1qukJMLC0ABq9Pwwd6ojZVXOz80ZBtTT7dDDM58Bx+kfdr7Owko3AJHYV0/V93HOLThU1laztoBEK1fqkzcA==", "requires": { - "@microsoft/1ds-core-js": "3.2.6", + "@microsoft/1ds-core-js": "3.2.7", "@microsoft/applicationinsights-shims": "^2.0.1", "@microsoft/dynamicproto-js": "^1.1.6" } }, "@microsoft/applicationinsights-core-js": { - "version": "2.8.6", - "resolved": "https://registry.npmjs.org/@microsoft/applicationinsights-core-js/-/applicationinsights-core-js-2.8.6.tgz", - "integrity": "sha512-rL+ceda1Y6HaHBe1vIbNT/f5JGuHiD5Ydq+DoAfu56o13wyJu4sao3QKaabgaIM59pPO+3BMeGsK8NNUGYaT3w==", + "version": "2.8.8", + "resolved": "https://registry.npmjs.org/@microsoft/applicationinsights-core-js/-/applicationinsights-core-js-2.8.8.tgz", + "integrity": "sha512-SuEkiqXFRWoptonfLxBd/kV9VYz+RbW+cBR/AHL3W6D9DyhctAyrxrtTHd2r6oxZlndAi2L3gHXANSjF/ahqyg==", "requires": { "@microsoft/applicationinsights-shims": "2.0.1", "@microsoft/dynamicproto-js": "^1.1.6" @@ -178,9 +178,9 @@ "integrity": "sha512-G0MXf6R6HndRbDy9BbEj0zrLeuhwt2nsXk2zKtF0TnYo39KgYqhYC2ayIzKPTm2KAE+xzD7rgyLdZnrcRvt9WQ==" }, "@microsoft/dynamicproto-js": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/@microsoft/dynamicproto-js/-/dynamicproto-js-1.1.6.tgz", - "integrity": "sha512-D1Oivw1A4bIXhzBIy3/BBPn3p2On+kpO2NiYt9shICDK7L/w+cR6FFBUsBZ05l6iqzTeL+Jm8lAYn0g6G7DmDg==" + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/@microsoft/dynamicproto-js/-/dynamicproto-js-1.1.7.tgz", + "integrity": "sha512-SK3D3aVt+5vOOccKPnGaJWB5gQ8FuKfjboUJHedMP7gu54HqSCXX5iFXhktGD8nfJb0Go30eDvs/UDoTnR2kOA==" }, "@nodelib/fs.scandir": { "version": "2.1.5", @@ -323,9 +323,9 @@ "dev": true }, "@types/node": { - "version": "16.11.47", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.47.tgz", - "integrity": "sha512-fpP+jk2zJ4VW66+wAMFoBJlx1bxmBKx4DUFf68UHgdGCOuyUTDlLWqsaNPJh7xhNDykyJ9eIzAygilP/4WoN8g==", + "version": "16.11.65", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.65.tgz", + "integrity": "sha512-Vfz7wGMOr4jbQGiQHVJm8VjeQwM9Ya7mHe9LtQ264/Epf5n1KiZShOFqk++nBzw6a/ubgYdB9Od7P+MH/LjoWw==", "dev": true }, "@types/responselike": { @@ -721,7 +721,7 @@ "binary": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/binary/-/binary-0.3.0.tgz", - "integrity": "sha512-D4H1y5KYwpJgK8wk1Cue5LLPgmwHKYSChkbspQg5JtVuR5ulGckxfR62H3AE9UDkdMC8yyXlqYihuz3Aqg2XZg==", + "integrity": "sha1-n2BVO8XOjDOG87VTz/R0Yq3sqnk=", "dev": true, "requires": { "buffers": "~0.1.1", @@ -747,7 +747,7 @@ "bluebird": { "version": "3.4.7", "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.4.7.tgz", - "integrity": "sha512-iD3898SR7sWVRHbiQv+sHUtHnMvC1o3nW5rAcqnq3uOn07DSAppZYUkIGslDz6gXC7HfunPe7YVBgoEJASPcHA==", + "integrity": "sha1-9y12C+Cbf3bQjtj66Ysomo0F+rM=", "dev": true }, "boolbase": { @@ -845,13 +845,13 @@ "buffers": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/buffers/-/buffers-0.1.1.tgz", - "integrity": "sha512-9q/rDEGSb/Qsvv2qvzIzdluL5k7AaJOTrw23z9reQthrbF7is4CtlT0DXyO1oei2DCp4uojjzQ7igaSHp1kAEQ==", + "integrity": "sha1-skV5w77U1tOWru5tmorn9Ugqt7s=", "dev": true }, "builtin-modules": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", - "integrity": "sha512-wxXCdllwGhI2kCC0MnvTGYTMvnVZTvqgypkiTI8Pa5tcz2i6VqsqwYGgqwXji+4RgCzms6EajE4IxiUH6HH8nQ==", + "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", "dev": true }, "cacheable-lookup": { @@ -900,7 +900,7 @@ "chainsaw": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/chainsaw/-/chainsaw-0.1.0.tgz", - "integrity": "sha512-75kWfWt6MEKNC8xYXIdRpDehRYY/tNSgwKaJq+dbbDcxORuVrrQ+SEHoWsniVn9XPYfP4gmdWIeDk/4YNp1rNQ==", + "integrity": "sha1-XqtQsor+WAdNDVgpE4iCi15fvJg=", "dev": true, "requires": { "traverse": ">=0.3.0 <0.4" @@ -1107,7 +1107,7 @@ "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", "dev": true }, "copy-webpack-plugin": { @@ -1324,7 +1324,7 @@ "duplexer2": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", - "integrity": "sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==", + "integrity": "sha1-ixLauHjA1p4+eJEFFmKjL8a93ME=", "dev": true, "requires": { "readable-stream": "^2.0.2" @@ -1550,9 +1550,9 @@ "dev": true }, "follow-redirects": { - "version": "1.15.1", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.1.tgz", - "integrity": "sha512-yLAMQs+k0b2m7cVxpS1VKJVvoz7SS9Td1zss3XRwXj+ZDH00RJgnuLx7E44wx02kQLrdM3aOOy+FpzS7+8OizA==" + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", + "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==" }, "fs-constants": { "version": "1.0.0", @@ -1573,7 +1573,7 @@ "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", "dev": true }, "fsevents": { @@ -1856,7 +1856,7 @@ "inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", "dev": true, "requires": { "once": "^1.3.0", @@ -1908,7 +1908,7 @@ "is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==" + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=" }, "is-glob": { "version": "4.0.3", @@ -1962,13 +1962,13 @@ "isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", "dev": true }, "isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", "dev": true }, "isobject": { @@ -2094,7 +2094,7 @@ "listenercount": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/listenercount/-/listenercount-1.0.1.tgz", - "integrity": "sha512-3mk/Zag0+IJxeDrxSgaDPy4zZ3w05PRZeJNnlWhzFz5OkX49J4krc+A8X2d2M69vGMBEX0uyl8M+W+8gH+kBqQ==", + "integrity": "sha1-hMinKrWcRyUyFIDJdeZQg0LnCTc=", "dev": true }, "loader-runner": { @@ -2443,7 +2443,7 @@ "once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", "dev": true, "requires": { "wrappy": "1" @@ -2536,7 +2536,7 @@ "path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", "dev": true }, "path-key": { @@ -2814,7 +2814,7 @@ "require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", "dev": true }, "require-from-string": { @@ -2930,9 +2930,9 @@ } }, "semver": { - "version": "7.3.7", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", - "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", + "version": "7.3.8", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", + "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", "requires": { "lru-cache": "^6.0.0" } @@ -2949,7 +2949,7 @@ "setimmediate": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==", + "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=", "dev": true }, "shallow-clone": { @@ -3034,7 +3034,7 @@ "sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", "dev": true }, "string_decoder": { @@ -3194,7 +3194,7 @@ "traverse": { "version": "0.3.9", "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.3.9.tgz", - "integrity": "sha512-iawgk0hLP3SxGKDfnDJf8wTz4p2qImnyihM5Hh/sGvQ3K37dPi/w8sRhdNIxYA1TwFwc5mDhIJq+O0RsvXBKdQ==", + "integrity": "sha1-cXuPIgzAu3tE5AUUwisui7xw2Lk=", "dev": true }, "truncate-utf8-bytes": { @@ -3213,9 +3213,9 @@ "dev": true }, "ts-loader": { - "version": "9.3.1", - "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.3.1.tgz", - "integrity": "sha512-OkyShkcZTsTwyS3Kt7a4rsT/t2qvEVQuKCTg4LJmpj9fhFR7ukGdZwV6Qq3tRUkqcXtfGpPR7+hFKHCG/0d3Lw==", + "version": "9.4.1", + "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.4.1.tgz", + "integrity": "sha512-384TYAqGs70rn9F0VBnh6BPTfhga7yFNdC5gXbQpDrBj9/KsT4iRkGqKXhziofHOlE2j6YEaiTYVGKKvPhGWvw==", "dev": true, "requires": { "chalk": "^4.1.0", @@ -3292,19 +3292,19 @@ "color-name": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", "dev": true }, "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==", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", "dev": true }, "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==", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", "dev": true }, "js-yaml": { @@ -3388,9 +3388,9 @@ } }, "typescript": { - "version": "4.9.0-dev.20220907", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.0-dev.20220907.tgz", - "integrity": "sha512-wRH/8rol9ktq6cQ6NxT7fsaa7bcVBSl7KcE27AGfzlbvq6c1/KlOOXywzhtsCHFtNLPBucsirHBZxFx3gdfpBg==", + "version": "4.8.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.8.4.tgz", + "integrity": "sha512-QCh+85mCy+h0IGff8r5XWzOVSbBO+KfeYrMQh7NJ58QujwcE22u+NUSmUxqF+un70P9GXKxa2HCNiTTMJknyjQ==", "dev": true }, "uc.micro": { @@ -3472,7 +3472,7 @@ "util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", "dev": true }, "uuid": { @@ -3828,7 +3828,7 @@ "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", "dev": true }, "ws": { diff --git a/package.json b/package.json index a4ee3a71..f68196eb 100644 --- a/package.json +++ b/package.json @@ -806,16 +806,16 @@ "@types/lodash": "^4.14.184", "@types/minimatch": "^3.0.3", "@types/mocha": "^9.1.1", - "@types/node": "16.x", + "@types/node": "^16.11.65", "@types/semver": "^7.3.12", "@types/vscode": "1.69.0", "@vscode/test-electron": "^2.1.5", "copy-webpack-plugin": "^11.0.0", "glob": "^7.2.3", "mocha": "^9.2.2", - "ts-loader": "^9.3.1", + "ts-loader": "^9.4.1", "tslint": "^6.1.3", - "typescript": "^4.9.0-dev.20220907", + "typescript": "^4.8.4", "vscode-extension-tester": "^4.4.1", "webpack": "^5.74.0", "webpack-cli": "^4.10.0" @@ -826,7 +826,7 @@ "globby": "^13.1.2", "lodash": "^4.17.21", "minimatch": "^5.1.0", - "semver": "^7.3.7", + "semver": "^7.3.8", "vscode-extension-telemetry-wrapper": "^0.13.2", "vscode-tas-client": "^0.1.63" } diff --git a/tsconfig.json b/tsconfig.json index c789462a..20c38219 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -4,7 +4,8 @@ "target": "es6", "outDir": "out", "lib": [ - "es6" + "es6", + "DOM" ], "sourceMap": true, "rootDir": ".", From b00b2df64879d86079ab20b5c65dea76fc086b06 Mon Sep 17 00:00:00 2001 From: Sheng Chen Date: Mon, 24 Oct 2022 13:24:05 +0800 Subject: [PATCH 132/352] fix: Better handling the linked resource when getting projects (#694) - When comparing the project location with the workspace folder path, scan the folder with one level deep and check if the linked folder belongs to the workspace folder. Signed-off-by: Sheng Chen --- .../jdtls/ext/core/ProjectCommand.java | 54 ++++++++++++++++++- 1 file changed, 52 insertions(+), 2 deletions(-) diff --git a/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/ProjectCommand.java b/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/ProjectCommand.java index b4f6058c..a69a93ea 100644 --- a/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/ProjectCommand.java +++ b/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/ProjectCommand.java @@ -30,6 +30,8 @@ import org.apache.commons.lang3.StringUtils; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IProject; +import org.eclipse.core.resources.IResource; +import org.eclipse.core.resources.IResourceVisitor; import org.eclipse.core.resources.IWorkspaceRoot; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.CoreException; @@ -110,9 +112,21 @@ public static List listProjects(List arguments, IProgressMo PackageNode projectNode = PackageNode.createNodeForProject(JavaCore.create(project)); - // set the folder name as the project name when the project location - // is out of the workspace folder. if (!workspaceFolderPath.isPrefixOf(project.getLocation())) { + LinkedFolderVisitor visitor = new LinkedFolderVisitor(workspaceFolderPath); + try { + project.accept(visitor, IResource.DEPTH_ONE, false); + } catch (CoreException e) { + JdtlsExtActivator.log(e); + continue; + } + + if (!visitor.isBelongsToWorkspace()) { + continue; + } + + // set the folder name as the project name when the project location + // is out of the workspace folder. projectNode.setDisplayName(workspaceFolderPath.lastSegment()); } children.add(projectNode); @@ -292,4 +306,40 @@ private static String getSeverityString(int severity) { return "UNKNOWN STATUS"; } } + + private static final class LinkedFolderVisitor implements IResourceVisitor { + + private boolean belongsToWorkspace; + + private IPath workspaceFolderPath; + + public LinkedFolderVisitor(IPath workspaceFolderPath) { + this.belongsToWorkspace = false; + this.workspaceFolderPath = workspaceFolderPath; + } + + @Override + public boolean visit(IResource resource) throws CoreException { + if (this.belongsToWorkspace) { + return false; + } + + if (!resource.exists()) { + return false; + } + + if (resource.isLinked()) { + IPath realPath = resource.getLocation(); + if (workspaceFolderPath.isPrefixOf(realPath)) { + this.belongsToWorkspace = true; + } + } + + return true; + } + + public boolean isBelongsToWorkspace() { + return belongsToWorkspace; + } + } } From 2f2c48d91e05839e42e6c703772c39bec6270cc3 Mon Sep 17 00:00:00 2001 From: Sheng Chen Date: Mon, 31 Oct 2022 11:26:09 +0800 Subject: [PATCH 133/352] Prepare 0.21.1 (#697) --- CHANGELOG.md | 7 +++++++ jdtls.ext/com.microsoft.jdtls.ext.core/.project | 4 ++-- .../com.microsoft.jdtls.ext.core/META-INF/MANIFEST.MF | 2 +- jdtls.ext/com.microsoft.jdtls.ext.core/pom.xml | 2 +- jdtls.ext/pom.xml | 2 +- package-lock.json | 2 +- package.json | 4 ++-- 7 files changed, 15 insertions(+), 8 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c56f9d23..5dd4f7e3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,13 @@ All notable changes to the "vscode-java-dependency" extension will be documented The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/) and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html). +## 0.21.1 +### Changed +- Scan two levels of directories for activation indicators. [PR#681](https://github.com/microsoft/vscode-java-dependency/pull/681) +- Remove the `ASKUSER` option when specify the output path of exporting jar task. To make the extension asks for the output path when exporting jars, simply leave it empty. [#676](https://github.com/microsoft/vscode-java-dependency/issues/676) +### Fixed +- [Bugs fixed](https://github.com/microsoft/vscode-java-dependency/issues?q=is%3Aissue+label%3Abug+milestone%3A0.21.1+is%3Aclosed) + ## 0.21.0 ### Added - Add sub-menu for Maven and Gradle projects in Java Project explorer. [PR#664](https://github.com/microsoft/vscode-java-dependency/pull/664) diff --git a/jdtls.ext/com.microsoft.jdtls.ext.core/.project b/jdtls.ext/com.microsoft.jdtls.ext.core/.project index 40a2a856..57b7843d 100644 --- a/jdtls.ext/com.microsoft.jdtls.ext.core/.project +++ b/jdtls.ext/com.microsoft.jdtls.ext.core/.project @@ -33,12 +33,12 @@ - 1655120454990 + 1665551209562 30 org.eclipse.core.resources.regexFilterMatcher - node_modules|.git|__CREATED_BY_JAVA_LANGUAGE_SERVER__ + node_modules|\.git|__CREATED_BY_JAVA_LANGUAGE_SERVER__ diff --git a/jdtls.ext/com.microsoft.jdtls.ext.core/META-INF/MANIFEST.MF b/jdtls.ext/com.microsoft.jdtls.ext.core/META-INF/MANIFEST.MF index a78a6faf..d3fabbde 100644 --- a/jdtls.ext/com.microsoft.jdtls.ext.core/META-INF/MANIFEST.MF +++ b/jdtls.ext/com.microsoft.jdtls.ext.core/META-INF/MANIFEST.MF @@ -2,7 +2,7 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: JDTLS EXT Core Bundle-SymbolicName: com.microsoft.jdtls.ext.core;singleton:=true -Bundle-Version: 0.21.0 +Bundle-Version: 0.21.1 Bundle-Activator: com.microsoft.jdtls.ext.core.JdtlsExtActivator Bundle-RequiredExecutionEnvironment: JavaSE-11 Bundle-ActivationPolicy: lazy diff --git a/jdtls.ext/com.microsoft.jdtls.ext.core/pom.xml b/jdtls.ext/com.microsoft.jdtls.ext.core/pom.xml index 233c3db7..184370a3 100644 --- a/jdtls.ext/com.microsoft.jdtls.ext.core/pom.xml +++ b/jdtls.ext/com.microsoft.jdtls.ext.core/pom.xml @@ -5,7 +5,7 @@ com.microsoft.jdtls.ext jdtls-ext-parent - 0.21.0 + 0.21.1 com.microsoft.jdtls.ext.core eclipse-plugin diff --git a/jdtls.ext/pom.xml b/jdtls.ext/pom.xml index 2616f9d5..b8dd06f5 100644 --- a/jdtls.ext/pom.xml +++ b/jdtls.ext/pom.xml @@ -4,7 +4,7 @@ com.microsoft.jdtls.ext jdtls-ext-parent ${base.name} :: Parent - 0.21.0 + 0.21.1 pom Java Project Manager diff --git a/package-lock.json b/package-lock.json index 23015259..43ea29fa 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "vscode-java-dependency", - "version": "0.21.0", + "version": "0.21.1", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index f68196eb..a9394862 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "vscode-java-dependency", "displayName": "Project Manager for Java", "description": "%description%", - "version": "0.21.0", + "version": "0.21.1", "publisher": "vscjava", "preview": true, "aiKey": "5c642b22-e845-4400-badb-3f8509a70777", @@ -48,7 +48,7 @@ "main": "./main.js", "contributes": { "javaExtensions": [ - "./server/com.microsoft.jdtls.ext.core-0.21.0.jar" + "./server/com.microsoft.jdtls.ext.core-0.21.1.jar" ], "commands": [ { From 929e6aa08ff621e7f8397cd40f206a1b3caad2d8 Mon Sep 17 00:00:00 2001 From: Sheng Chen Date: Mon, 7 Nov 2022 12:47:20 +0800 Subject: [PATCH 134/352] chore: Update dependencies (#700) Signed-off-by: Sheng Chen --- package-lock.json | 45 ++++++++++++++++++--------------------------- package.json | 8 ++++---- 2 files changed, 22 insertions(+), 31 deletions(-) diff --git a/package-lock.json b/package-lock.json index 43ea29fa..dfd8f403 100644 --- a/package-lock.json +++ b/package-lock.json @@ -305,9 +305,9 @@ } }, "@types/lodash": { - "version": "4.14.184", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.184.tgz", - "integrity": "sha512-RoZphVtHbxPZizt4IcILciSWiC6dcn+eZ8oX9IWEYfDMcocdd42f7NPI6fQj+6zI8y4E0L7gu2pcZKLGTRaV9Q==", + "version": "4.14.188", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.188.tgz", + "integrity": "sha512-zmEmF5OIM3rb7SbLCFYoQhO4dGt2FRM9AMkxvA3LaADOF1n8in/zGJlWji9fmafLoNyz+FoL6FE0SLtGIArD7w==", "dev": true }, "@types/minimatch": { @@ -323,9 +323,9 @@ "dev": true }, "@types/node": { - "version": "16.11.65", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.65.tgz", - "integrity": "sha512-Vfz7wGMOr4jbQGiQHVJm8VjeQwM9Ya7mHe9LtQ264/Epf5n1KiZShOFqk++nBzw6a/ubgYdB9Od7P+MH/LjoWw==", + "version": "16.18.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.3.tgz", + "integrity": "sha512-jh6m0QUhIRcZpNv7Z/rpN+ZWXOicUUQbSoWks7Htkbb9IjFQj4kzcX/xFCkjstCj5flMsN8FiSvt+q+Tcs4Llg==", "dev": true }, "@types/responselike": { @@ -347,9 +347,9 @@ } }, "@types/semver": { - "version": "7.3.12", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.3.12.tgz", - "integrity": "sha512-WwA1MW0++RfXmCr12xeYOOC5baSC9mSb0ZqCquFzKhcoF4TvHu5MKOuXsncgZcpVFhB1pXd5hZmM0ryAoCp12A==", + "version": "7.3.13", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.3.13.tgz", + "integrity": "sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw==", "dev": true }, "@types/vscode": { @@ -383,9 +383,9 @@ } }, "@vscode/test-electron": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@vscode/test-electron/-/test-electron-2.1.5.tgz", - "integrity": "sha512-O/ioqFpV+RvKbRykX2ItYPnbcZ4Hk5V0rY4uhQjQTLhGL9WZUvS7exzuYQCCI+ilSqJpctvxq2llTfGXf9UnnA==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@vscode/test-electron/-/test-electron-2.2.0.tgz", + "integrity": "sha512-xk2xrOTMG75/hxO8OVVZ+GErv9gmdZwOD8rEHV3ty3n1Joav2yFcfrmqD6Ukref27U13LEL8gVvSHzauGAK5nQ==", "dev": true, "requires": { "http-proxy-agent": "^4.0.1", @@ -747,7 +747,7 @@ "bluebird": { "version": "3.4.7", "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.4.7.tgz", - "integrity": "sha1-9y12C+Cbf3bQjtj66Ysomo0F+rM=", + "integrity": "sha512-iD3898SR7sWVRHbiQv+sHUtHnMvC1o3nW5rAcqnq3uOn07DSAppZYUkIGslDz6gXC7HfunPe7YVBgoEJASPcHA==", "dev": true }, "boolbase": { @@ -1324,7 +1324,7 @@ "duplexer2": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", - "integrity": "sha1-ixLauHjA1p4+eJEFFmKjL8a93ME=", + "integrity": "sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==", "dev": true, "requires": { "readable-stream": "^2.0.2" @@ -1595,15 +1595,6 @@ "rimraf": "2" }, "dependencies": { - "mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "dev": true, - "requires": { - "minimist": "^1.2.5" - } - }, "rimraf": { "version": "2.7.1", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", @@ -1817,9 +1808,9 @@ } }, "https-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", - "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", + "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==", "dev": true, "requires": { "agent-base": "6", @@ -2094,7 +2085,7 @@ "listenercount": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/listenercount/-/listenercount-1.0.1.tgz", - "integrity": "sha1-hMinKrWcRyUyFIDJdeZQg0LnCTc=", + "integrity": "sha512-3mk/Zag0+IJxeDrxSgaDPy4zZ3w05PRZeJNnlWhzFz5OkX49J4krc+A8X2d2M69vGMBEX0uyl8M+W+8gH+kBqQ==", "dev": true }, "loader-runner": { diff --git a/package.json b/package.json index a9394862..239d2e80 100644 --- a/package.json +++ b/package.json @@ -803,13 +803,13 @@ "devDependencies": { "@types/fs-extra": "^9.0.13", "@types/glob": "^7.2.0", - "@types/lodash": "^4.14.184", + "@types/lodash": "^4.14.188", "@types/minimatch": "^3.0.3", "@types/mocha": "^9.1.1", - "@types/node": "^16.11.65", - "@types/semver": "^7.3.12", + "@types/node": "^16.18.3", + "@types/semver": "^7.3.13", "@types/vscode": "1.69.0", - "@vscode/test-electron": "^2.1.5", + "@vscode/test-electron": "^2.2.0", "copy-webpack-plugin": "^11.0.0", "glob": "^7.2.3", "mocha": "^9.2.2", From bbeea0e7b804967a33ff18a8904955913fd138e8 Mon Sep 17 00:00:00 2001 From: Shi Chen Date: Mon, 14 Nov 2022 10:46:10 +0800 Subject: [PATCH 135/352] fix: Add eol after emit message (#701) --- src/tasks/buildArtifact/BuildArtifactTaskProvider.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/tasks/buildArtifact/BuildArtifactTaskProvider.ts b/src/tasks/buildArtifact/BuildArtifactTaskProvider.ts index abe73083..45f21e67 100644 --- a/src/tasks/buildArtifact/BuildArtifactTaskProvider.ts +++ b/src/tasks/buildArtifact/BuildArtifactTaskProvider.ts @@ -206,7 +206,7 @@ class ExportJarTaskTerminal implements Pseudoterminal { public exit(message?: string) { if (message) { - this.writeEmitter.fire(message); + this.writeEmitter.fire(message + "\r\n"); } if (activeTerminalMap.has(this.terminalId)) { activeTerminalMap.delete(this.terminalId); From fe27a033fbd415089278dc40bd20d1f7f12900f9 Mon Sep 17 00:00:00 2001 From: Sheng Chen Date: Wed, 30 Nov 2022 10:50:43 +0800 Subject: [PATCH 136/352] chore: Update dependencies (#703) Signed-off-by: Sheng Chen --- package-lock.json | 92 +++++++++++++++++++++++------------------------ package.json | 8 ++--- 2 files changed, 50 insertions(+), 50 deletions(-) diff --git a/package-lock.json b/package-lock.json index dfd8f403..a8aeaa99 100644 --- a/package-lock.json +++ b/package-lock.json @@ -134,13 +134,13 @@ "dev": true }, "@jridgewell/trace-mapping": { - "version": "0.3.14", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.14.tgz", - "integrity": "sha512-bJWEfQ9lPTvm3SneWwRFVLzrh6nhjwqw7TUFFBEMzwvg7t7PCDenf2lDwqo4NQXzdpgBXyFgDWnQA+2vkruksQ==", + "version": "0.3.17", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz", + "integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==", "dev": true, "requires": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" + "@jridgewell/resolve-uri": "3.1.0", + "@jridgewell/sourcemap-codec": "1.4.14" } }, "@microsoft/1ds-core-js": { @@ -239,9 +239,9 @@ } }, "@types/eslint": { - "version": "8.4.5", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.4.5.tgz", - "integrity": "sha512-dhsC09y1gpJWnK+Ff4SGvCuSnk9DaU0BJZSzOwa6GVSg65XtTugLBITDAAzRU5duGBoXBHpdR/9jHGxJjNflJQ==", + "version": "8.4.10", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.4.10.tgz", + "integrity": "sha512-Sl/HOqN8NKPmhWo2VBEPm0nvHnu2LL3v9vKo8MEq0EtbJ4eVzGPl41VNPvn5E1i5poMk4/XD8UriLHpJvEP/Nw==", "dev": true, "requires": { "@types/estree": "*", @@ -305,9 +305,9 @@ } }, "@types/lodash": { - "version": "4.14.188", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.188.tgz", - "integrity": "sha512-zmEmF5OIM3rb7SbLCFYoQhO4dGt2FRM9AMkxvA3LaADOF1n8in/zGJlWji9fmafLoNyz+FoL6FE0SLtGIArD7w==", + "version": "4.14.190", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.190.tgz", + "integrity": "sha512-5iJ3FBJBvQHQ8sFhEhJfjUP+G+LalhavTkYyrAYqz5MEJG+erSv0k9KJLb6q7++17Lafk1scaTIFXcMJlwK8Mw==", "dev": true }, "@types/minimatch": { @@ -574,9 +574,9 @@ "dev": true }, "acorn": { - "version": "8.8.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.0.tgz", - "integrity": "sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w==", + "version": "8.8.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.1.tgz", + "integrity": "sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA==", "dev": true }, "acorn-import-assertions": { @@ -781,15 +781,15 @@ "dev": true }, "browserslist": { - "version": "4.21.3", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.3.tgz", - "integrity": "sha512-898rgRXLAyRkM1GryrrBHGkqA5hlpkV5MhtZwg9QXeiyLUYs2k00Un05aX5l2/yJIOObYKOpS2JNo8nJDE7fWQ==", + "version": "4.21.4", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.4.tgz", + "integrity": "sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw==", "dev": true, "requires": { - "caniuse-lite": "^1.0.30001370", - "electron-to-chromium": "^1.4.202", + "caniuse-lite": "^1.0.30001400", + "electron-to-chromium": "^1.4.251", "node-releases": "^2.0.6", - "update-browserslist-db": "^1.0.5" + "update-browserslist-db": "^1.0.9" } }, "buffer": { @@ -892,9 +892,9 @@ "dev": true }, "caniuse-lite": { - "version": "1.0.30001373", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001373.tgz", - "integrity": "sha512-pJYArGHrPp3TUqQzFYRmP/lwJlj8RCbVe3Gd3eJQkAV8SAC6b19XS9BjMvRdvaS8RMkaTN8ZhoHP6S1y8zzwEQ==", + "version": "1.0.30001434", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001434.tgz", + "integrity": "sha512-aOBHrLmTQw//WFa2rcF1If9fa3ypkC1wzqqiKHgfdrXTWcU8C4gKVZT77eQAPWN1APys3+uQ0Df07rKauXGEYA==", "dev": true }, "chainsaw": { @@ -1331,9 +1331,9 @@ } }, "electron-to-chromium": { - "version": "1.4.206", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.206.tgz", - "integrity": "sha512-h+Fadt1gIaQ06JaIiyqPsBjJ08fV5Q7md+V8bUvQW/9OvXfL2LRICTz2EcnnCP7QzrFTS6/27MRV6Bl9Yn97zA==", + "version": "1.4.284", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz", + "integrity": "sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA==", "dev": true }, "emoji-regex": { @@ -2207,9 +2207,9 @@ "dev": true }, "minimatch": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.0.tgz", - "integrity": "sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.1.tgz", + "integrity": "sha512-362NP+zlprccbEt/SkxKfRMHnNY85V74mVnpUpNyr3F35covl09Kec7/sEFLt3RA4oXmewtoaanoIf67SE5Y5g==", "requires": { "brace-expansion": "^2.0.1" }, @@ -3135,9 +3135,9 @@ } }, "terser": { - "version": "5.14.2", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.14.2.tgz", - "integrity": "sha512-oL0rGeM/WFQCUd0y2QrWxYnq7tfSuKBiqTjRPWrRgB46WD/kiwHwF8T23z78H6Q6kGCuuHcPB+KULHRdxvVGQA==", + "version": "5.16.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.16.0.tgz", + "integrity": "sha512-KjTV81QKStSfwbNiwlBXfcgMcOloyuRdb62/iLFPGBcVNF4EXjhdYBhYHmbJpiBrVxZhDvltE11j+LBQUxEEJg==", "dev": true, "requires": { "@jridgewell/source-map": "^0.3.2", @@ -3147,16 +3147,16 @@ } }, "terser-webpack-plugin": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.3.tgz", - "integrity": "sha512-Fx60G5HNYknNTNQnzQ1VePRuu89ZVYWfjRAeT5rITuCY/1b08s49e5kSQwHDirKZWuoKOBRFS98EUUoZ9kLEwQ==", + "version": "5.3.6", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.6.tgz", + "integrity": "sha512-kfLFk+PoLUQIbLmB1+PZDMRSZS99Mp+/MHqDNmMA6tOItzRt+Npe3E+fsMs5mfcM0wCtrrdU387UnV+vnSffXQ==", "dev": true, "requires": { - "@jridgewell/trace-mapping": "^0.3.7", + "@jridgewell/trace-mapping": "^0.3.14", "jest-worker": "^27.4.5", "schema-utils": "^3.1.1", "serialize-javascript": "^6.0.0", - "terser": "^5.7.2" + "terser": "^5.14.1" } }, "tmp": { @@ -3379,9 +3379,9 @@ } }, "typescript": { - "version": "4.8.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.8.4.tgz", - "integrity": "sha512-QCh+85mCy+h0IGff8r5XWzOVSbBO+KfeYrMQh7NJ58QujwcE22u+NUSmUxqF+un70P9GXKxa2HCNiTTMJknyjQ==", + "version": "4.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.3.tgz", + "integrity": "sha512-CIfGzTelbKNEnLpLdGFgdyKhG23CKdKgQPOBc+OUNrkJ2vr+KSzsSV5kq5iWhEQbok+quxgGzrAtGWCyU7tHnA==", "dev": true }, "uc.micro": { @@ -3430,9 +3430,9 @@ } }, "update-browserslist-db": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.5.tgz", - "integrity": "sha512-dteFFpCyvuDdr9S/ff1ISkKt/9YZxKjI9WlRR99c180GaztJtRa/fn18FdxGVKVsnPY7/a/FDN68mcvUmP4U7Q==", + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz", + "integrity": "sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==", "dev": true, "requires": { "escalade": "^3.1.1", @@ -3643,9 +3643,9 @@ } }, "webpack": { - "version": "5.74.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.74.0.tgz", - "integrity": "sha512-A2InDwnhhGN4LYctJj6M1JEaGL7Luj6LOmyBHjcI8529cm5p6VXiTIW2sn6ffvEAKmveLzvu4jrihwXtPojlAA==", + "version": "5.75.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.75.0.tgz", + "integrity": "sha512-piaIaoVJlqMsPtX/+3KTTO6jfvrSYgauFVdt8cr9LTHKmcq/AMd4mhzsiP7ZF/PGRNPGA8336jldh9l2Kt2ogQ==", "dev": true, "requires": { "@types/eslint-scope": "^3.7.3", diff --git a/package.json b/package.json index 239d2e80..2d4966c0 100644 --- a/package.json +++ b/package.json @@ -803,7 +803,7 @@ "devDependencies": { "@types/fs-extra": "^9.0.13", "@types/glob": "^7.2.0", - "@types/lodash": "^4.14.188", + "@types/lodash": "^4.14.190", "@types/minimatch": "^3.0.3", "@types/mocha": "^9.1.1", "@types/node": "^16.18.3", @@ -815,9 +815,9 @@ "mocha": "^9.2.2", "ts-loader": "^9.4.1", "tslint": "^6.1.3", - "typescript": "^4.8.4", + "typescript": "^4.9.3", "vscode-extension-tester": "^4.4.1", - "webpack": "^5.74.0", + "webpack": "^5.75.0", "webpack-cli": "^4.10.0" }, "dependencies": { @@ -825,7 +825,7 @@ "fs-extra": "^10.1.0", "globby": "^13.1.2", "lodash": "^4.17.21", - "minimatch": "^5.1.0", + "minimatch": "^5.1.1", "semver": "^7.3.8", "vscode-extension-telemetry-wrapper": "^0.13.2", "vscode-tas-client": "^0.1.63" From 3e4cc5a0dbba499ca55f62021314a16892f041fa Mon Sep 17 00:00:00 2001 From: Sheng Chen Date: Thu, 1 Dec 2022 17:19:05 +0800 Subject: [PATCH 137/352] chore: Enable no response check (#704) Signed-off-by: Sheng Chen --- .github/no-response.yml | 4 ---- .github/workflows/no-response.yml | 23 +++++++++++++++++++++++ 2 files changed, 23 insertions(+), 4 deletions(-) delete mode 100644 .github/no-response.yml create mode 100644 .github/workflows/no-response.yml diff --git a/.github/no-response.yml b/.github/no-response.yml deleted file mode 100644 index 14bbe279..00000000 --- a/.github/no-response.yml +++ /dev/null @@ -1,4 +0,0 @@ -daysUntilClose: 14 -responseRequiredLabel: need more info -closeComment: > - This issue has been closed automatically because it needs more information and has not had recent activity. Please reach out if you have or find the answers we need so that we can investigate further. diff --git a/.github/workflows/no-response.yml b/.github/workflows/no-response.yml new file mode 100644 index 00000000..2cd00744 --- /dev/null +++ b/.github/workflows/no-response.yml @@ -0,0 +1,23 @@ +name: No Response + +# **What it does**: Closes issues where the original author doesn't respond to a request for information. +# **Why we have it**: To remove the need for maintainers to remember to check back on issues periodically to see if contributors have responded. + +on: + issue_comment: + types: [created] + schedule: + # every morning at 5:30 AM + - cron: '30 5 * * *' + +jobs: + noResponse: + runs-on: ubuntu-latest + steps: + - uses: lee-dohm/no-response@v0.5.0 + with: + token: ${{ github.token }} + daysUntilClose: 14 + responseRequiredLabel: "need more info" + closeComment: > + This issue has been closed automatically because it needs more information and has not had recent activity. Please reach out if you have or find the answers we need so that we can investigate further. \ No newline at end of file From b30d959fc7f0887caa7388979a79dd31d847099e Mon Sep 17 00:00:00 2001 From: Sheng Chen Date: Wed, 18 Jan 2023 10:26:56 +0800 Subject: [PATCH 138/352] chore: Update dependencies (#709) * chore: Update dependencies Signed-off-by: sheche --- package-lock.json | 84 +++++++++++++++++++++++------------------------ package.json | 14 ++++---- 2 files changed, 49 insertions(+), 49 deletions(-) diff --git a/package-lock.json b/package-lock.json index a8aeaa99..1e68d7fd 100644 --- a/package-lock.json +++ b/package-lock.json @@ -305,9 +305,9 @@ } }, "@types/lodash": { - "version": "4.14.190", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.190.tgz", - "integrity": "sha512-5iJ3FBJBvQHQ8sFhEhJfjUP+G+LalhavTkYyrAYqz5MEJG+erSv0k9KJLb6q7++17Lafk1scaTIFXcMJlwK8Mw==", + "version": "4.14.191", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.191.tgz", + "integrity": "sha512-BdZ5BCCvho3EIXw6wUCXHe7rS53AIDPLE+JzwgT+OsJk53oBfbSmZZ7CX4VaRoN78N+TJpFi9QPlfIVNmJYWxQ==", "dev": true }, "@types/minimatch": { @@ -323,9 +323,9 @@ "dev": true }, "@types/node": { - "version": "16.18.3", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.3.tgz", - "integrity": "sha512-jh6m0QUhIRcZpNv7Z/rpN+ZWXOicUUQbSoWks7Htkbb9IjFQj4kzcX/xFCkjstCj5flMsN8FiSvt+q+Tcs4Llg==", + "version": "16.18.11", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.11.tgz", + "integrity": "sha512-3oJbGBUWuS6ahSnEq1eN2XrCyf4YsWI8OyCvo7c64zQJNplk3mO84t53o8lfTk+2ji59g5ycfc6qQ3fdHliHuA==", "dev": true }, "@types/responselike": { @@ -721,7 +721,7 @@ "binary": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/binary/-/binary-0.3.0.tgz", - "integrity": "sha1-n2BVO8XOjDOG87VTz/R0Yq3sqnk=", + "integrity": "sha512-D4H1y5KYwpJgK8wk1Cue5LLPgmwHKYSChkbspQg5JtVuR5ulGckxfR62H3AE9UDkdMC8yyXlqYihuz3Aqg2XZg==", "dev": true, "requires": { "buffers": "~0.1.1", @@ -845,13 +845,13 @@ "buffers": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/buffers/-/buffers-0.1.1.tgz", - "integrity": "sha1-skV5w77U1tOWru5tmorn9Ugqt7s=", + "integrity": "sha512-9q/rDEGSb/Qsvv2qvzIzdluL5k7AaJOTrw23z9reQthrbF7is4CtlT0DXyO1oei2DCp4uojjzQ7igaSHp1kAEQ==", "dev": true }, "builtin-modules": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", - "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", + "integrity": "sha512-wxXCdllwGhI2kCC0MnvTGYTMvnVZTvqgypkiTI8Pa5tcz2i6VqsqwYGgqwXji+4RgCzms6EajE4IxiUH6HH8nQ==", "dev": true }, "cacheable-lookup": { @@ -900,7 +900,7 @@ "chainsaw": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/chainsaw/-/chainsaw-0.1.0.tgz", - "integrity": "sha1-XqtQsor+WAdNDVgpE4iCi15fvJg=", + "integrity": "sha512-75kWfWt6MEKNC8xYXIdRpDehRYY/tNSgwKaJq+dbbDcxORuVrrQ+SEHoWsniVn9XPYfP4gmdWIeDk/4YNp1rNQ==", "dev": true, "requires": { "traverse": ">=0.3.0 <0.4" @@ -1107,7 +1107,7 @@ "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", "dev": true }, "copy-webpack-plugin": { @@ -1573,7 +1573,7 @@ "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", "dev": true }, "fsevents": { @@ -1685,9 +1685,9 @@ "dev": true }, "globby": { - "version": "13.1.2", - "resolved": "https://registry.npmjs.org/globby/-/globby-13.1.2.tgz", - "integrity": "sha512-LKSDZXToac40u8Q1PQtZihbNdTYSNMuWe+K5l+oa6KgDzSvVrHXlJy40hUP522RjAIoNLJYBJi7ow+rbFpIhHQ==", + "version": "13.1.3", + "resolved": "https://registry.npmjs.org/globby/-/globby-13.1.3.tgz", + "integrity": "sha512-8krCNHXvlCgHDpegPzleMq07yMYTO2sXKASmZmquEYWEmCx6J5UTRbp5RwMJkTJGtcQ44YpiUYUiN0b9mzy8Bw==", "requires": { "dir-glob": "^3.0.1", "fast-glob": "^3.2.11", @@ -1824,9 +1824,9 @@ "dev": true }, "ignore": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", - "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==" + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", + "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==" }, "immediate": { "version": "3.0.6", @@ -1847,7 +1847,7 @@ "inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", "dev": true, "requires": { "once": "^1.3.0", @@ -1899,7 +1899,7 @@ "is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=" + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==" }, "is-glob": { "version": "4.0.3", @@ -1953,13 +1953,13 @@ "isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", "dev": true }, "isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", "dev": true }, "isobject": { @@ -2207,9 +2207,9 @@ "dev": true }, "minimatch": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.1.tgz", - "integrity": "sha512-362NP+zlprccbEt/SkxKfRMHnNY85V74mVnpUpNyr3F35covl09Kec7/sEFLt3RA4oXmewtoaanoIf67SE5Y5g==", + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", "requires": { "brace-expansion": "^2.0.1" }, @@ -2434,7 +2434,7 @@ "once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", "dev": true, "requires": { "wrappy": "1" @@ -2527,7 +2527,7 @@ "path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", "dev": true }, "path-key": { @@ -2805,7 +2805,7 @@ "require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", "dev": true }, "require-from-string": { @@ -2940,7 +2940,7 @@ "setimmediate": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=", + "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==", "dev": true }, "shallow-clone": { @@ -3025,7 +3025,7 @@ "sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", "dev": true }, "string_decoder": { @@ -3185,7 +3185,7 @@ "traverse": { "version": "0.3.9", "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.3.9.tgz", - "integrity": "sha1-cXuPIgzAu3tE5AUUwisui7xw2Lk=", + "integrity": "sha512-iawgk0hLP3SxGKDfnDJf8wTz4p2qImnyihM5Hh/sGvQ3K37dPi/w8sRhdNIxYA1TwFwc5mDhIJq+O0RsvXBKdQ==", "dev": true }, "truncate-utf8-bytes": { @@ -3204,9 +3204,9 @@ "dev": true }, "ts-loader": { - "version": "9.4.1", - "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.4.1.tgz", - "integrity": "sha512-384TYAqGs70rn9F0VBnh6BPTfhga7yFNdC5gXbQpDrBj9/KsT4iRkGqKXhziofHOlE2j6YEaiTYVGKKvPhGWvw==", + "version": "9.4.2", + "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.4.2.tgz", + "integrity": "sha512-OmlC4WVmFv5I0PpaxYb+qGeGOdm5giHU7HwDDUjw59emP2UYMHy9fFSDcYgSNoH8sXcj4hGCSEhlDZ9ULeDraA==", "dev": true, "requires": { "chalk": "^4.1.0", @@ -3283,19 +3283,19 @@ "color-name": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", "dev": true }, "escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "dev": true }, "has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", "dev": true }, "js-yaml": { @@ -3379,9 +3379,9 @@ } }, "typescript": { - "version": "4.9.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.3.tgz", - "integrity": "sha512-CIfGzTelbKNEnLpLdGFgdyKhG23CKdKgQPOBc+OUNrkJ2vr+KSzsSV5kq5iWhEQbok+quxgGzrAtGWCyU7tHnA==", + "version": "4.9.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.4.tgz", + "integrity": "sha512-Uz+dTXYzxXXbsFpM86Wh3dKCxrQqUcVMxwU54orwlJjOpO3ao8L7j5lH+dWfTwgCwIuM9GQ2kvVotzYJMXTBZg==", "dev": true }, "uc.micro": { @@ -3463,7 +3463,7 @@ "util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", "dev": true }, "uuid": { @@ -3819,7 +3819,7 @@ "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", "dev": true }, "ws": { diff --git a/package.json b/package.json index 2d4966c0..7f16c08b 100644 --- a/package.json +++ b/package.json @@ -803,19 +803,19 @@ "devDependencies": { "@types/fs-extra": "^9.0.13", "@types/glob": "^7.2.0", - "@types/lodash": "^4.14.190", + "@types/lodash": "^4.14.191", "@types/minimatch": "^3.0.3", "@types/mocha": "^9.1.1", - "@types/node": "^16.18.3", + "@types/node": "^16.18.11", "@types/semver": "^7.3.13", "@types/vscode": "1.69.0", - "@vscode/test-electron": "^2.2.0", + "@vscode/test-electron": "2.2.0", "copy-webpack-plugin": "^11.0.0", "glob": "^7.2.3", "mocha": "^9.2.2", - "ts-loader": "^9.4.1", + "ts-loader": "^9.4.2", "tslint": "^6.1.3", - "typescript": "^4.9.3", + "typescript": "^4.9.4", "vscode-extension-tester": "^4.4.1", "webpack": "^5.75.0", "webpack-cli": "^4.10.0" @@ -823,9 +823,9 @@ "dependencies": { "await-lock": "^2.2.2", "fs-extra": "^10.1.0", - "globby": "^13.1.2", + "globby": "^13.1.3", "lodash": "^4.17.21", - "minimatch": "^5.1.1", + "minimatch": "^5.1.6", "semver": "^7.3.8", "vscode-extension-telemetry-wrapper": "^0.13.2", "vscode-tas-client": "^0.1.63" From a4e6956cb35a162e066ecd887bf6825c67b91d99 Mon Sep 17 00:00:00 2001 From: Sheng Chen Date: Mon, 30 Jan 2023 11:25:14 +0800 Subject: [PATCH 139/352] Update the CI node version (#710) - To match the requirement of the dependency @vscode/test-electron@2.2.2 Signed-off-by: sheche --- .github/workflows/linux.yml | 4 ++-- .github/workflows/macOS.yml | 4 ++-- .github/workflows/windows.yml | 4 ++-- package-lock.json | 6 +++--- package.json | 2 +- 5 files changed, 10 insertions(+), 10 deletions(-) diff --git a/.github/workflows/linux.yml b/.github/workflows/linux.yml index dbb1c9c8..6cec9f67 100644 --- a/.github/workflows/linux.yml +++ b/.github/workflows/linux.yml @@ -29,13 +29,13 @@ jobs: - name: Setup Node.js environment uses: actions/setup-node@v2 with: - node-version: 14 + node-version: 16 - name: Install Node.js modules run: npm install - name: Install VSCE - run: npm install -g vsce + run: npm install -g @vscode/vsce - name: Build OSGi bundle run: npm run build-server diff --git a/.github/workflows/macOS.yml b/.github/workflows/macOS.yml index 7e71df29..85a934a3 100644 --- a/.github/workflows/macOS.yml +++ b/.github/workflows/macOS.yml @@ -22,13 +22,13 @@ jobs: - name: Setup Node.js environment uses: actions/setup-node@v2 with: - node-version: 14 + node-version: 16 - name: Install Node.js modules run: npm install - name: Install VSCE - run: npm install -g vsce + run: npm install -g @vscode/vsce - name: Build OSGi bundle run: npm run build-server diff --git a/.github/workflows/windows.yml b/.github/workflows/windows.yml index 7219aa7e..b6716e1d 100644 --- a/.github/workflows/windows.yml +++ b/.github/workflows/windows.yml @@ -22,13 +22,13 @@ jobs: - name: Setup Node.js environment uses: actions/setup-node@v2 with: - node-version: 14 + node-version: 16 - name: Install Node.js modules run: npm install - name: Install VSCE - run: npm install -g vsce + run: npm install -g @vscode/vsce - name: Build OSGi bundle run: npm run build-server diff --git a/package-lock.json b/package-lock.json index 1e68d7fd..739029de 100644 --- a/package-lock.json +++ b/package-lock.json @@ -383,9 +383,9 @@ } }, "@vscode/test-electron": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@vscode/test-electron/-/test-electron-2.2.0.tgz", - "integrity": "sha512-xk2xrOTMG75/hxO8OVVZ+GErv9gmdZwOD8rEHV3ty3n1Joav2yFcfrmqD6Ukref27U13LEL8gVvSHzauGAK5nQ==", + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/@vscode/test-electron/-/test-electron-2.2.2.tgz", + "integrity": "sha512-s5d2VtMySvff0UgqkJ0BMCr1es+qREE194EAodGIefq518W53ifvv69e80l9e2MrYJEqUUKwukE/w3H9o15YEw==", "dev": true, "requires": { "http-proxy-agent": "^4.0.1", diff --git a/package.json b/package.json index 7f16c08b..d3192280 100644 --- a/package.json +++ b/package.json @@ -809,7 +809,7 @@ "@types/node": "^16.18.11", "@types/semver": "^7.3.13", "@types/vscode": "1.69.0", - "@vscode/test-electron": "2.2.0", + "@vscode/test-electron": "^2.2.2", "copy-webpack-plugin": "^11.0.0", "glob": "^7.2.3", "mocha": "^9.2.2", From b3634c08bcd0fc52a825412d1b219397d6527ac6 Mon Sep 17 00:00:00 2001 From: Sheng Chen Date: Mon, 30 Jan 2023 13:02:44 +0800 Subject: [PATCH 140/352] chore: Update the badges (#711) Signed-off-by: Sheng Chen --- README.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 06e5c8df..f7c99e07 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,9 @@ > Manage Java projects in Visual Studio Code -[![GitHub Actions](https://img.shields.io/github/workflow/status/microsoft/vscode-java-dependency/CI/main?style=flat-square)](https://github.com/microsoft/vscode-java-dependency/actions?query=workflow%3ACI+branch%3Amain) +[![GitHub Actions](https://img.shields.io/github/actions/workflow/status/microsoft/vscode-java-dependency/windows.yml?label=Windows%20Build&style=flat-square)](https://github.com/microsoft/vscode-java-dependency/actions/workflows/windows.yml?query=branch%3Amain) +[![GitHub Actions](https://img.shields.io/github/actions/workflow/status/microsoft/vscode-java-dependency/linux.yml?label=Linux%20Build&style=flat-square)](https://github.com/microsoft/vscode-java-dependency/actions/workflows/linux.yml?query=branch%3Amain) +[![GitHub Actions](https://img.shields.io/github/actions/workflow/status/microsoft/vscode-java-dependency/macOS.yml?label=Darwin%20Build&style=flat-square)](https://github.com/microsoft/vscode-java-dependency/actions/workflows/macOS.yml?query=branch%3Amain) ## Overview From ecc66d870bdac567eecec484184b7ac53fab5c74 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 6 Feb 2023 09:41:02 +0800 Subject: [PATCH 141/352] chore(deps): Bump http-cache-semantics from 4.1.0 to 4.1.1 (#714) Bumps [http-cache-semantics](https://github.com/kornelski/http-cache-semantics) from 4.1.0 to 4.1.1. - [Release notes](https://github.com/kornelski/http-cache-semantics/releases) - [Commits](https://github.com/kornelski/http-cache-semantics/compare/v4.1.0...v4.1.1) --- updated-dependencies: - dependency-name: http-cache-semantics dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 739029de..6e898160 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1781,9 +1781,9 @@ } }, "http-cache-semantics": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", - "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", + "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==", "dev": true }, "http-proxy-agent": { From 26c2ca1b5ddc3af0efd4271e2b9a57af61bbca87 Mon Sep 17 00:00:00 2001 From: Sheng Chen Date: Thu, 2 Mar 2023 16:44:09 +0800 Subject: [PATCH 142/352] chore: Bump version (#719) --- .vscode/launch.json | 6 - javaConfig.json | 2 +- .../com.microsoft.jdtls.ext.core/pom.xml | 6 - .../com.microsoft.jdtls.ext.tp.target} | 14 +- .../com.microsoft.jdtls.ext.target/pom.xml | 12 + jdtls.ext/pom.xml | 79 +- package-lock.json | 6049 +++++++++++++++-- .../BuildArtifactTaskProvider.ts | 6 + 8 files changed, 5627 insertions(+), 547 deletions(-) rename jdtls.ext/{target.target => com.microsoft.jdtls.ext.target/com.microsoft.jdtls.ext.tp.target} (81%) create mode 100644 jdtls.ext/com.microsoft.jdtls.ext.target/pom.xml diff --git a/.vscode/launch.json b/.vscode/launch.json index 0b1d4cb8..2f331a2d 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -11,7 +11,6 @@ "env": { "DEBUG_VSCODE_JAVA":"true" }, - "stopOnEntry": false, "sourceMaps": true, "outFiles": [ "${workspaceFolder}/dist/**/*.js" ], "preLaunchTask": "npm: watch" @@ -33,7 +32,6 @@ "--extensionDevelopmentPath=${workspaceFolder}", "--extensionTestsPath=${workspaceFolder}/dist/test/suite/index" ], - "stopOnEntry": false, "sourceMaps": true, "outFiles": [ "${workspaceFolder}/dist/**/*.js" ], "preLaunchTask": "npm: compile" @@ -48,7 +46,6 @@ "--extensionDevelopmentPath=${workspaceFolder}", "--extensionTestsPath=${workspaceFolder}/dist/test/simple-suite/index" ], - "stopOnEntry": false, "sourceMaps": true, "outFiles": [ "${workspaceFolder}/dist/**/*.js" ], "preLaunchTask": "npm: compile" @@ -63,7 +60,6 @@ "--extensionDevelopmentPath=${workspaceFolder}", "--extensionTestsPath=${workspaceFolder}/dist/test/maven-suite/index" ], - "stopOnEntry": false, "sourceMaps": true, "outFiles": [ "${workspaceFolder}/dist/**/*.js" ], "preLaunchTask": "npm: compile" @@ -78,7 +74,6 @@ "--extensionDevelopmentPath=${workspaceFolder}", "--extensionTestsPath=${workspaceFolder}/dist/test/gradle-suite/index" ], - "stopOnEntry": false, "sourceMaps": true, "outFiles": [ "${workspaceFolder}/dist/**/*.js" ], "preLaunchTask": "npm: compile" @@ -93,7 +88,6 @@ "--extensionDevelopmentPath=${workspaceFolder}", "--extensionTestsPath=${workspaceFolder}/dist/test/invisible-suite/index" ], - "stopOnEntry": false, "sourceMaps": true, "outFiles": [ "${workspaceFolder}/dist/**/*.js" ], "preLaunchTask": "npm: compile" diff --git a/javaConfig.json b/javaConfig.json index 5544d609..08c7530f 100644 --- a/javaConfig.json +++ b/javaConfig.json @@ -2,5 +2,5 @@ "projects": [ "./jdtls.ext/com.microsoft.jdtls.ext.core" ], - "targetPlatform": "./jdtls.ext/target.target" + "targetPlatform": "./jdtls.ext/com.microsoft.jdtls.ext.target/com.microsoft.jdtls.ext.tp.target" } diff --git a/jdtls.ext/com.microsoft.jdtls.ext.core/pom.xml b/jdtls.ext/com.microsoft.jdtls.ext.core/pom.xml index 184370a3..ca7e4fd5 100644 --- a/jdtls.ext/com.microsoft.jdtls.ext.core/pom.xml +++ b/jdtls.ext/com.microsoft.jdtls.ext.core/pom.xml @@ -14,12 +14,6 @@ - - org.eclipse.tycho - tycho-maven-plugin - ${tycho-version} - true - org.apache.maven.plugins maven-checkstyle-plugin diff --git a/jdtls.ext/target.target b/jdtls.ext/com.microsoft.jdtls.ext.target/com.microsoft.jdtls.ext.tp.target similarity index 81% rename from jdtls.ext/target.target rename to jdtls.ext/com.microsoft.jdtls.ext.target/com.microsoft.jdtls.ext.tp.target index e276dfc2..1cb53687 100644 --- a/jdtls.ext/target.target +++ b/jdtls.ext/com.microsoft.jdtls.ext.target/com.microsoft.jdtls.ext.tp.target @@ -3,8 +3,6 @@ - - @@ -16,19 +14,19 @@ - - - - + + + + + - + - diff --git a/jdtls.ext/com.microsoft.jdtls.ext.target/pom.xml b/jdtls.ext/com.microsoft.jdtls.ext.target/pom.xml new file mode 100644 index 00000000..bd1cee50 --- /dev/null +++ b/jdtls.ext/com.microsoft.jdtls.ext.target/pom.xml @@ -0,0 +1,12 @@ + + 4.0.0 + + com.microsoft.jdtls.ext + jdtls-ext-parent + 0.21.1 + + com.microsoft.jdtls.ext.tp + ${base.name} :: Target Platform + eclipse-target-definition + diff --git a/jdtls.ext/pom.xml b/jdtls.ext/pom.xml index b8dd06f5..b1ec9e76 100644 --- a/jdtls.ext/pom.xml +++ b/jdtls.ext/pom.xml @@ -23,6 +23,7 @@ com.microsoft.jdtls.ext.core + com.microsoft.jdtls.ext.target @@ -51,27 +52,6 @@ - - org.apache.maven.plugins - maven-dependency-plugin - - - - get-libs - - copy - - validate - - - - false - ${basedir}/lib/ - - true - - org.apache.maven.plugins maven-checkstyle-plugin @@ -97,9 +77,46 @@ org.eclipse.tycho target-platform-configuration ${tycho-version} + + p2 + + + com.microsoft.jdtls.ext + com.microsoft.jdtls.ext.tp + ${project.version} + + + + + linux + gtk + x86_64 + + + win32 + win32 + x86_64 + + + macosx + cocoa + x86_64 + + + + + + + + org.eclipse.tycho + tycho-maven-plugin + ${tycho-version} + true + + @@ -115,11 +132,6 @@ - - 202203 - p2 - https://download.eclipse.org/releases/2022-03/202203161000/ - oss.sonatype.org https://oss.sonatype.org/content/repositories/snapshots/ @@ -127,20 +139,5 @@ true - - JDT.LS - p2 - https://download.eclipse.org/jdtls/snapshots/repository/latest/ - - - LSP4J - p2 - https://download.eclipse.org/lsp4j/updates/releases/0.11.0/ - - - orbit - p2 - https://download.eclipse.org/tools/orbit/R-builds/R20200529191137/repository/ - diff --git a/package-lock.json b/package-lock.json index 6e898160..723f17ac 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,31 +1,5201 @@ { "name": "vscode-java-dependency", "version": "0.21.1", - "lockfileVersion": 1, + "lockfileVersion": 2, "requires": true, + "packages": { + "": { + "name": "vscode-java-dependency", + "version": "0.21.1", + "license": "MIT", + "dependencies": { + "await-lock": "^2.2.2", + "fs-extra": "^10.1.0", + "globby": "^13.1.3", + "lodash": "^4.17.21", + "minimatch": "^5.1.6", + "semver": "^7.3.8", + "vscode-extension-telemetry-wrapper": "^0.13.2", + "vscode-tas-client": "^0.1.63" + }, + "devDependencies": { + "@types/fs-extra": "^9.0.13", + "@types/glob": "^7.2.0", + "@types/lodash": "^4.14.191", + "@types/minimatch": "^3.0.3", + "@types/mocha": "^9.1.1", + "@types/node": "^16.18.11", + "@types/semver": "^7.3.13", + "@types/vscode": "1.69.0", + "@vscode/test-electron": "^2.2.2", + "copy-webpack-plugin": "^11.0.0", + "glob": "^7.2.3", + "mocha": "^9.2.2", + "ts-loader": "^9.4.2", + "tslint": "^6.1.3", + "typescript": "^4.9.4", + "vscode-extension-tester": "^4.4.1", + "webpack": "^5.75.0", + "webpack-cli": "^4.10.0" + }, + "engines": { + "vscode": "^1.69.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", + "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", + "dev": true, + "dependencies": { + "@babel/highlight": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", + "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", + "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.18.6", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight/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, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/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, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/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, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/highlight/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 + }, + "node_modules/@babel/highlight/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, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@babel/highlight/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, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/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, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@discoveryjs/json-ext": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", + "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", + "dev": true, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", + "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", + "dev": true, + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/source-map": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.2.tgz", + "integrity": "sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.14", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", + "dev": true + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.17", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz", + "integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "3.1.0", + "@jridgewell/sourcemap-codec": "1.4.14" + } + }, + "node_modules/@microsoft/1ds-core-js": { + "version": "3.2.9", + "resolved": "https://registry.npmjs.org/@microsoft/1ds-core-js/-/1ds-core-js-3.2.9.tgz", + "integrity": "sha512-3pCfM2TzHn3gU9pxHztduKcVRdb/nzruvPFfHPZD0IM0mb0h6TGo2isELF3CTMahTx50RAC51ojNIw2/7VRkOg==", + "dependencies": { + "@microsoft/applicationinsights-core-js": "2.8.10", + "@microsoft/applicationinsights-shims": "^2.0.2", + "@microsoft/dynamicproto-js": "^1.1.7" + } + }, + "node_modules/@microsoft/1ds-post-js": { + "version": "3.2.9", + "resolved": "https://registry.npmjs.org/@microsoft/1ds-post-js/-/1ds-post-js-3.2.9.tgz", + "integrity": "sha512-D/RtqkQ2Nr4cuoGqmhi5QTmi3cBlxehIThJ1u3BaH9H/YkLNTKEcHZRWTXy14bXheCefNHciLuadg37G2Kekcg==", + "dependencies": { + "@microsoft/1ds-core-js": "3.2.9", + "@microsoft/applicationinsights-shims": "^2.0.2", + "@microsoft/dynamicproto-js": "^1.1.7" + } + }, + "node_modules/@microsoft/applicationinsights-core-js": { + "version": "2.8.10", + "resolved": "https://registry.npmjs.org/@microsoft/applicationinsights-core-js/-/applicationinsights-core-js-2.8.10.tgz", + "integrity": "sha512-jQrufDW0+sV8fBhRvzIPNGiCC6dELH+Ug0DM5CfN9757TBqZJz8CSWyDjex39as8+jD0F/8HRU9QdmrVgq5vFg==", + "dependencies": { + "@microsoft/applicationinsights-shims": "2.0.2", + "@microsoft/dynamicproto-js": "^1.1.7" + }, + "peerDependencies": { + "tslib": "*" + } + }, + "node_modules/@microsoft/applicationinsights-shims": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@microsoft/applicationinsights-shims/-/applicationinsights-shims-2.0.2.tgz", + "integrity": "sha512-PoHEgsnmcqruLNHZ/amACqdJ6YYQpED0KSRe6J7gIJTtpZC1FfFU9b1fmDKDKtFoUSrPzEh1qzO3kmRZP0betg==" + }, + "node_modules/@microsoft/dynamicproto-js": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/@microsoft/dynamicproto-js/-/dynamicproto-js-1.1.8.tgz", + "integrity": "sha512-j4ZgOZRtX0LTUgKq+4tRQotgwH03HH/mLkYbcgFBBJ9XKTDc4NIGzZeam2UQMzwz+5IVN0SXexNbbsz5B0b/og==" + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@sindresorhus/is": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", + "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/is?sponsor=1" + } + }, + "node_modules/@szmarczak/http-timer": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.6.tgz", + "integrity": "sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==", + "dev": true, + "dependencies": { + "defer-to-connect": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "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==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/@types/cacheable-request": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.3.tgz", + "integrity": "sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==", + "dev": true, + "dependencies": { + "@types/http-cache-semantics": "*", + "@types/keyv": "^3.1.4", + "@types/node": "*", + "@types/responselike": "^1.0.0" + } + }, + "node_modules/@types/eslint": { + "version": "8.21.1", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.21.1.tgz", + "integrity": "sha512-rc9K8ZpVjNcLs8Fp0dkozd5Pt2Apk1glO4Vgz8ix1u6yFByxfqo5Yavpy65o+93TAe24jr7v+eSBtFLvOQtCRQ==", + "dev": true, + "dependencies": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "node_modules/@types/eslint-scope": { + "version": "3.7.4", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.4.tgz", + "integrity": "sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==", + "dev": true, + "dependencies": { + "@types/eslint": "*", + "@types/estree": "*" + } + }, + "node_modules/@types/estree": { + "version": "0.0.51", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz", + "integrity": "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==", + "dev": true + }, + "node_modules/@types/fs-extra": { + "version": "9.0.13", + "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-9.0.13.tgz", + "integrity": "sha512-nEnwB++1u5lVDM2UI4c1+5R+FYaKfaAzS4OococimjVm3nQw3TuzH5UNsocrcTBbhnerblyHj4A49qXbIiZdpA==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==", + "dev": true, + "dependencies": { + "@types/minimatch": "*", + "@types/node": "*" + } + }, + "node_modules/@types/http-cache-semantics": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.1.tgz", + "integrity": "sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ==", + "dev": true + }, + "node_modules/@types/json-schema": { + "version": "7.0.11", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", + "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", + "dev": true + }, + "node_modules/@types/keyv": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.4.tgz", + "integrity": "sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/lodash": { + "version": "4.14.191", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.191.tgz", + "integrity": "sha512-BdZ5BCCvho3EIXw6wUCXHe7rS53AIDPLE+JzwgT+OsJk53oBfbSmZZ7CX4VaRoN78N+TJpFi9QPlfIVNmJYWxQ==", + "dev": true + }, + "node_modules/@types/minimatch": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.5.tgz", + "integrity": "sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==", + "dev": true + }, + "node_modules/@types/mocha": { + "version": "9.1.1", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-9.1.1.tgz", + "integrity": "sha512-Z61JK7DKDtdKTWwLeElSEBcWGRLY8g95ic5FoQqI9CMx0ns/Ghep3B4DfcEimiKMvtamNVULVNKEsiwV3aQmXw==", + "dev": true + }, + "node_modules/@types/node": { + "version": "16.18.14", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.14.tgz", + "integrity": "sha512-wvzClDGQXOCVNU4APPopC2KtMYukaF1MN/W3xAmslx22Z4/IF1/izDMekuyoUlwfnDHYCIZGaj7jMwnJKBTxKw==", + "dev": true + }, + "node_modules/@types/responselike": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.0.tgz", + "integrity": "sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/selenium-webdriver": { + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@types/selenium-webdriver/-/selenium-webdriver-4.1.12.tgz", + "integrity": "sha512-3DxuYHEbzIyUtuICRtxXtJomdOOkBeCbkXAlAPm/h8ArIn/ArWNnVSC6tIj/ECZ/sdxBoI0F/wuwcpxBew3hGw==", + "dev": true, + "dependencies": { + "@types/ws": "*" + } + }, + "node_modules/@types/semver": { + "version": "7.3.13", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.3.13.tgz", + "integrity": "sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw==", + "dev": true + }, + "node_modules/@types/vscode": { + "version": "1.69.0", + "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.69.0.tgz", + "integrity": "sha512-RlzDAnGqUoo9wS6d4tthNyAdZLxOIddLiX3djMoWk29jFfSA1yJbIwr0epBYqqYarWB6s2Z+4VaZCQ80Jaa3kA==", + "dev": true + }, + "node_modules/@types/ws": { + "version": "8.5.4", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.4.tgz", + "integrity": "sha512-zdQDHKUgcX/zBc4GrwsE/7dVdAD8JR4EuiAXiiUhhfyIJXXb2+PrGshFyeXWQPMmmZ2XxgaqclgpIC7eTXc1mg==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@ungap/promise-all-settled": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz", + "integrity": "sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==", + "dev": true + }, + "node_modules/@vscode/extension-telemetry": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/@vscode/extension-telemetry/-/extension-telemetry-0.6.2.tgz", + "integrity": "sha512-yb/wxLuaaCRcBAZtDCjNYSisAXz3FWsSqAha5nhHcYxx2ZPdQdWuZqVXGKq0ZpHVndBWWtK6XqtpCN2/HB4S1w==", + "dependencies": { + "@microsoft/1ds-core-js": "^3.2.3", + "@microsoft/1ds-post-js": "^3.2.3" + }, + "engines": { + "vscode": "^1.60.0" + } + }, + "node_modules/@vscode/test-electron": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@vscode/test-electron/-/test-electron-2.3.0.tgz", + "integrity": "sha512-fwzA9RtazH1GT/sckYlbxu6t5e4VaMXwCVtyLv4UAG0hP6NTfnMaaG25XCfWqlVwFhBMcQXHBCy5dmz2eLUnkw==", + "dev": true, + "dependencies": { + "http-proxy-agent": "^4.0.1", + "https-proxy-agent": "^5.0.0", + "jszip": "^3.10.1", + "semver": "^7.3.8" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/@webassemblyjs/ast": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz", + "integrity": "sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==", + "dev": true, + "dependencies": { + "@webassemblyjs/helper-numbers": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1" + } + }, + "node_modules/@webassemblyjs/floating-point-hex-parser": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz", + "integrity": "sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-api-error": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz", + "integrity": "sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-buffer": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz", + "integrity": "sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-numbers": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz", + "integrity": "sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ==", + "dev": true, + "dependencies": { + "@webassemblyjs/floating-point-hex-parser": "1.11.1", + "@webassemblyjs/helper-api-error": "1.11.1", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/helper-wasm-bytecode": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz", + "integrity": "sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-wasm-section": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz", + "integrity": "sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-buffer": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/wasm-gen": "1.11.1" + } + }, + "node_modules/@webassemblyjs/ieee754": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz", + "integrity": "sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ==", + "dev": true, + "dependencies": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "node_modules/@webassemblyjs/leb128": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.1.tgz", + "integrity": "sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw==", + "dev": true, + "dependencies": { + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/utf8": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.1.tgz", + "integrity": "sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ==", + "dev": true + }, + "node_modules/@webassemblyjs/wasm-edit": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz", + "integrity": "sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-buffer": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/helper-wasm-section": "1.11.1", + "@webassemblyjs/wasm-gen": "1.11.1", + "@webassemblyjs/wasm-opt": "1.11.1", + "@webassemblyjs/wasm-parser": "1.11.1", + "@webassemblyjs/wast-printer": "1.11.1" + } + }, + "node_modules/@webassemblyjs/wasm-gen": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz", + "integrity": "sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/ieee754": "1.11.1", + "@webassemblyjs/leb128": "1.11.1", + "@webassemblyjs/utf8": "1.11.1" + } + }, + "node_modules/@webassemblyjs/wasm-opt": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz", + "integrity": "sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-buffer": "1.11.1", + "@webassemblyjs/wasm-gen": "1.11.1", + "@webassemblyjs/wasm-parser": "1.11.1" + } + }, + "node_modules/@webassemblyjs/wasm-parser": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz", + "integrity": "sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-api-error": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/ieee754": "1.11.1", + "@webassemblyjs/leb128": "1.11.1", + "@webassemblyjs/utf8": "1.11.1" + } + }, + "node_modules/@webassemblyjs/wast-printer": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz", + "integrity": "sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.1", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webpack-cli/configtest": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-1.2.0.tgz", + "integrity": "sha512-4FB8Tj6xyVkyqjj1OaTqCjXYULB9FMkqQ8yGrZjRDrYh0nOE+7Lhs45WioWQQMV+ceFlE368Ukhe6xdvJM9Egg==", + "dev": true, + "peerDependencies": { + "webpack": "4.x.x || 5.x.x", + "webpack-cli": "4.x.x" + } + }, + "node_modules/@webpack-cli/info": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-1.5.0.tgz", + "integrity": "sha512-e8tSXZpw2hPl2uMJY6fsMswaok5FdlGNRTktvFk2sD8RjH0hE2+XistawJx1vmKteh4NmGmNUrp+Tb2w+udPcQ==", + "dev": true, + "dependencies": { + "envinfo": "^7.7.3" + }, + "peerDependencies": { + "webpack-cli": "4.x.x" + } + }, + "node_modules/@webpack-cli/serve": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-1.7.0.tgz", + "integrity": "sha512-oxnCNGj88fL+xzV+dacXs44HcDwf1ovs3AuEzvP7mqXw7fQntqIhQ1BRmynh4qEKQSSSRSWVyXRjmTbZIX9V2Q==", + "dev": true, + "peerDependencies": { + "webpack-cli": "4.x.x" + }, + "peerDependenciesMeta": { + "webpack-dev-server": { + "optional": true + } + } + }, + "node_modules/@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "dev": true + }, + "node_modules/@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", + "dev": true + }, + "node_modules/acorn": { + "version": "8.8.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", + "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-import-assertions": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz", + "integrity": "sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==", + "dev": true, + "peerDependencies": { + "acorn": "^8" + } + }, + "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==", + "dev": true, + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-formats": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", + "dev": true, + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "node_modules/ansi-colors": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", + "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/arch": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/arch/-/arch-2.2.0.tgz", + "integrity": "sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==", + "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" + } + ] + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "node_modules/await-lock": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/await-lock/-/await-lock-2.2.2.tgz", + "integrity": "sha512-aDczADvlvTGajTDjcjpJMqRkOF6Qdz3YbPZm/PyW6tKPkx2hlYBzxMhEywM/tU72HrVZjgl5VCdRuMlA7pZ8Gw==" + }, + "node_modules/axios": { + "version": "0.26.1", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.26.1.tgz", + "integrity": "sha512-fPwcX4EvnSHuInCMItEhAGnaSEXRBjtzh9fOtsE6E1G6p7vl7edEeZe11QHf18+6+9gR5PbKV/sGKNaD8YaMeA==", + "dependencies": { + "follow-redirects": "^1.14.8" + } + }, + "node_modules/azure-devops-node-api": { + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/azure-devops-node-api/-/azure-devops-node-api-11.2.0.tgz", + "integrity": "sha512-XdiGPhrpaT5J8wdERRKs5g8E0Zy1pvOYTli7z9E8nmOn3YGp4FhtjhrOyFmX/8veWCwdI69mCHKJw6l+4J/bHA==", + "dev": true, + "dependencies": { + "tunnel": "0.0.6", + "typed-rest-client": "^1.8.4" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/binary": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/binary/-/binary-0.3.0.tgz", + "integrity": "sha512-D4H1y5KYwpJgK8wk1Cue5LLPgmwHKYSChkbspQg5JtVuR5ulGckxfR62H3AE9UDkdMC8yyXlqYihuz3Aqg2XZg==", + "dev": true, + "dependencies": { + "buffers": "~0.1.1", + "chainsaw": "~0.1.0" + }, + "engines": { + "node": "*" + } + }, + "node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/bl": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.3.tgz", + "integrity": "sha512-pvcNpa0UU69UT341rO6AYy4FVAIkUHuZXRIWbq+zHnsVcRzDDjIAhGuuYoi0d//cwIwtt4pkpKycWEfjdV+vww==", + "dev": true, + "dependencies": { + "readable-stream": "^2.3.5", + "safe-buffer": "^5.1.1" + } + }, + "node_modules/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", + "dev": true + }, + "node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browser-stdout": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", + "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", + "dev": true + }, + "node_modules/browserslist": { + "version": "4.21.5", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.5.tgz", + "integrity": "sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + } + ], + "dependencies": { + "caniuse-lite": "^1.0.30001449", + "electron-to-chromium": "^1.4.284", + "node-releases": "^2.0.8", + "update-browserslist-db": "^1.0.10" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/buffer-alloc": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz", + "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==", + "dev": true, + "dependencies": { + "buffer-alloc-unsafe": "^1.1.0", + "buffer-fill": "^1.0.0" + } + }, + "node_modules/buffer-alloc-unsafe": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz", + "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==", + "dev": true + }, + "node_modules/buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/buffer-fill": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz", + "integrity": "sha512-T7zexNBwiiaCOGDg9xNX9PBmjrubblRkENuptryuI64URkXDFum9il/JGL8Lm8wYfAXpredVXXZz7eMHilimiQ==", + "dev": true + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true + }, + "node_modules/buffers": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/buffers/-/buffers-0.1.1.tgz", + "integrity": "sha512-9q/rDEGSb/Qsvv2qvzIzdluL5k7AaJOTrw23z9reQthrbF7is4CtlT0DXyO1oei2DCp4uojjzQ7igaSHp1kAEQ==", + "dev": true, + "engines": { + "node": ">=0.2.0" + } + }, + "node_modules/builtin-modules": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", + "integrity": "sha512-wxXCdllwGhI2kCC0MnvTGYTMvnVZTvqgypkiTI8Pa5tcz2i6VqsqwYGgqwXji+4RgCzms6EajE4IxiUH6HH8nQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/cacheable-lookup": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz", + "integrity": "sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==", + "dev": true, + "engines": { + "node": ">=10.6.0" + } + }, + "node_modules/cacheable-request": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.2.tgz", + "integrity": "sha512-pouW8/FmiPQbuGpkXQ9BAPv/Mo5xDGANgSNXzTzJ8DrKGuXOssM4wIQRjfanNRh3Yu5cfYPvcorqbhg2KIJtew==", + "dev": true, + "dependencies": { + "clone-response": "^1.0.2", + "get-stream": "^5.1.0", + "http-cache-semantics": "^4.0.0", + "keyv": "^4.0.0", + "lowercase-keys": "^2.0.0", + "normalize-url": "^6.0.1", + "responselike": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001458", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001458.tgz", + "integrity": "sha512-lQ1VlUUq5q9ro9X+5gOEyH7i3vm+AYVT1WDCVB69XOZ17KZRhnZ9J0Sqz7wTHQaLBJccNCHq8/Ww5LlOIZbB0w==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + } + ] + }, + "node_modules/chainsaw": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/chainsaw/-/chainsaw-0.1.0.tgz", + "integrity": "sha512-75kWfWt6MEKNC8xYXIdRpDehRYY/tNSgwKaJq+dbbDcxORuVrrQ+SEHoWsniVn9XPYfP4gmdWIeDk/4YNp1rNQ==", + "dev": true, + "dependencies": { + "traverse": ">=0.3.0 <0.4" + }, + "engines": { + "node": "*" + } + }, + "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, + "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/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==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cheerio": { + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.12.tgz", + "integrity": "sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q==", + "dev": true, + "dependencies": { + "cheerio-select": "^2.1.0", + "dom-serializer": "^2.0.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1", + "htmlparser2": "^8.0.1", + "parse5": "^7.0.0", + "parse5-htmlparser2-tree-adapter": "^7.0.0" + }, + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/cheeriojs/cheerio?sponsor=1" + } + }, + "node_modules/cheerio-select": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-2.1.0.tgz", + "integrity": "sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==", + "dev": true, + "dependencies": { + "boolbase": "^1.0.0", + "css-select": "^5.1.0", + "css-what": "^6.1.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chokidar/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", + "dev": true + }, + "node_modules/chrome-trace-event": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", + "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", + "dev": true, + "engines": { + "node": ">=6.0" + } + }, + "node_modules/clipboardy": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/clipboardy/-/clipboardy-2.3.0.tgz", + "integrity": "sha512-mKhiIL2DrQIsuXMgBgnfEHOZOryC7kY7YO//TN6c63wlEm3NG5tz+YgY5rVi29KCmq/QQjKYvM7a19+MDOTHOQ==", + "dev": true, + "dependencies": { + "arch": "^2.1.1", + "execa": "^1.0.0", + "is-wsl": "^2.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/clone-deep": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", + "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", + "dev": true, + "dependencies": { + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/clone-response": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.3.tgz", + "integrity": "sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==", + "dev": true, + "dependencies": { + "mimic-response": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/colorette": { + "version": "2.0.19", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.19.tgz", + "integrity": "sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==", + "dev": true + }, + "node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + }, + "node_modules/compare-versions": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-3.6.0.tgz", + "integrity": "sha512-W6Af2Iw1z4CB7q4uU4hv646dW9GQuBM+YpC0UvUCWSD8w90SJjp+ujJuXaEMtAXBtSqGfMPuFOVn4/+FlaqfBA==", + "dev": true + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "node_modules/copy-webpack-plugin": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-11.0.0.tgz", + "integrity": "sha512-fX2MWpamkW0hZxMEg0+mYnA40LTosOSa5TqZ9GYIBzyJa9C3QUaMPSE2xAi/buNr8u89SfD9wHSQVBzrRa/SOQ==", + "dev": true, + "dependencies": { + "fast-glob": "^3.2.11", + "glob-parent": "^6.0.1", + "globby": "^13.1.1", + "normalize-path": "^3.0.0", + "schema-utils": "^4.0.0", + "serialize-javascript": "^6.0.0" + }, + "engines": { + "node": ">= 14.15.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" + } + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "dev": true + }, + "node_modules/cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, + "dependencies": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + }, + "engines": { + "node": ">=4.8" + } + }, + "node_modules/cross-spawn/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/cross-spawn/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/css-select": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", + "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==", + "dev": true, + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.1.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/css-what": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", + "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", + "dev": true, + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decamelize": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", + "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/decompress-response": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "dev": true, + "dependencies": { + "mimic-response": "^3.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/decompress-response/node_modules/mimic-response": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "dev": true, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/defer-to-connect": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", + "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/detect-libc": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.1.tgz", + "integrity": "sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/diff": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", + "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", + "dev": true, + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/dom-serializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", + "dev": true, + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ] + }, + "node_modules/domhandler": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "dev": true, + "dependencies": { + "domelementtype": "^2.3.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/domutils": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.0.1.tgz", + "integrity": "sha512-z08c1l761iKhDFtfXO04C7kTdPBLi41zwOZl00WS8b5eiaebNpY00HKbztwBq+e3vyqWNwWF3mP9YLUeqIrF+Q==", + "dev": true, + "dependencies": { + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.1" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.4.315", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.315.tgz", + "integrity": "sha512-ndBQYz3Eyy3rASjjQ9poMJGoAlsZ/aZnq6GBsGL4w/4sWIAwiUHVSsMuADbxa8WJw7pZ0oxLpGbtoDt4vRTdCg==", + "dev": true + }, + "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 + }, + "node_modules/end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dev": true, + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/enhanced-resolve": { + "version": "5.12.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.12.0.tgz", + "integrity": "sha512-QHTXI/sZQmko1cbDoNAa3mJ5qhWUUNAq3vR0/YiD379fWQrcfuoX1+HW2S0MTt7XmoPLapdaDKUtelUSPic7hQ==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/entities": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.4.0.tgz", + "integrity": "sha512-oYp7156SP8LkeGD0GF85ad1X9Ai79WtRsZ2gxJqtBuzH+98YUV6jkHEKlZkMbcrjJjIVJNIDP/3WL9wQkoPbWA==", + "dev": true, + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/envinfo": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.8.1.tgz", + "integrity": "sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw==", + "dev": true, + "bin": { + "envinfo": "dist/cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/es-module-lexer": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.9.3.tgz", + "integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==", + "dev": true + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "dev": true, + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/execa": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "dev": true, + "dependencies": { + "cross-spawn": "^6.0.0", + "get-stream": "^4.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/execa/node_modules/get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "dev": true, + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/expand-template": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", + "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "node_modules/fast-glob": { + "version": "3.2.12", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", + "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "node_modules/fastest-levenshtein": { + "version": "1.0.16", + "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", + "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==", + "dev": true, + "engines": { + "node": ">= 4.9.1" + } + }, + "node_modules/fastq": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", + "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fd-slicer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", + "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", + "dev": true, + "dependencies": { + "pend": "~1.2.0" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", + "dev": true, + "bin": { + "flat": "cli.js" + } + }, + "node_modules/follow-redirects": { + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", + "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", + "dev": true + }, + "node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true + }, + "node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz", + "integrity": "sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dev": true, + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/github-from-package": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", + "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==", + "dev": true + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "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/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", + "dev": true + }, + "node_modules/glob/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==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/glob/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/globby": { + "version": "13.1.3", + "resolved": "https://registry.npmjs.org/globby/-/globby-13.1.3.tgz", + "integrity": "sha512-8krCNHXvlCgHDpegPzleMq07yMYTO2sXKASmZmquEYWEmCx6J5UTRbp5RwMJkTJGtcQ44YpiUYUiN0b9mzy8Bw==", + "dependencies": { + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.11", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/got": { + "version": "11.8.6", + "resolved": "https://registry.npmjs.org/got/-/got-11.8.6.tgz", + "integrity": "sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==", + "dev": true, + "dependencies": { + "@sindresorhus/is": "^4.0.0", + "@szmarczak/http-timer": "^4.0.5", + "@types/cacheable-request": "^6.0.1", + "@types/responselike": "^1.0.0", + "cacheable-lookup": "^5.0.3", + "cacheable-request": "^7.0.2", + "decompress-response": "^6.0.0", + "http2-wrapper": "^1.0.0-beta.5.2", + "lowercase-keys": "^2.0.0", + "p-cancelable": "^2.0.0", + "responselike": "^2.0.0" + }, + "engines": { + "node": ">=10.19.0" + }, + "funding": { + "url": "https://github.com/sindresorhus/got?sponsor=1" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==" + }, + "node_modules/growl": { + "version": "1.10.5", + "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", + "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", + "dev": true, + "engines": { + "node": ">=4.x" + } + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "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, + "engines": { + "node": ">=8" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true, + "bin": { + "he": "bin/he" + } + }, + "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, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/hpagent": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/hpagent/-/hpagent-0.1.2.tgz", + "integrity": "sha512-ePqFXHtSQWAFXYmj+JtOTHr84iNrII4/QRlAAPPE+zqnKy4xJo7Ie1Y4kC7AdB+LxLxSTTzBMASsEcy0q8YyvQ==", + "dev": true + }, + "node_modules/htmlparser2": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.1.tgz", + "integrity": "sha512-4lVbmc1diZC7GUJQtRQ5yBAeUCL1exyMwmForWkRLnwyzWBFxN633SALPMGYaWZvKe9j1pRZJpauvmxENSp/EA==", + "dev": true, + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", + "entities": "^4.3.0" + } + }, + "node_modules/http-cache-semantics": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", + "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==", + "dev": true + }, + "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==", + "dev": true, + "dependencies": { + "@tootallnate/once": "1", + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/http2-wrapper": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-1.0.3.tgz", + "integrity": "sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==", + "dev": true, + "dependencies": { + "quick-lru": "^5.1.1", + "resolve-alpn": "^1.0.0" + }, + "engines": { + "node": ">=10.19.0" + } + }, + "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==", + "dev": true, + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "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" + } + ] + }, + "node_modules/ignore": { + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", + "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", + "engines": { + "node": ">= 4" + } + }, + "node_modules/immediate": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", + "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==", + "dev": true + }, + "node_modules/import-local": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", + "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", + "dev": true, + "dependencies": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + }, + "bin": { + "import-local-fixture": "fixtures/cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dev": true, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "dev": true + }, + "node_modules/interpret": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-2.2.0.tgz", + "integrity": "sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-core-module": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", + "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", + "dev": true, + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "dev": true, + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-plain-obj": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", + "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "dev": true, + "dependencies": { + "is-docker": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/jest-worker": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", + "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", + "dev": true, + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true + }, + "node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/jszip": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.10.1.tgz", + "integrity": "sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==", + "dev": true, + "dependencies": { + "lie": "~3.3.0", + "pako": "~1.0.2", + "readable-stream": "~2.3.6", + "setimmediate": "^1.0.5" + } + }, + "node_modules/keytar": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/keytar/-/keytar-7.9.0.tgz", + "integrity": "sha512-VPD8mtVtm5JNtA2AErl6Chp06JBfy7diFQ7TQQhdpWOl6MrCRB+eRbvAZUsbGQS9kiMq0coJsy0W0vHpDCkWsQ==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "node-addon-api": "^4.3.0", + "prebuild-install": "^7.0.1" + } + }, + "node_modules/keyv": { + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.2.tgz", + "integrity": "sha512-5MHbFaKn8cNSmVW7BYnijeAVlE4cYA/SVkifVgrh7yotnfhKmjuXpDKjrABLnT0SfHWV21P8ow07OGfRrNDg8g==", + "dev": true, + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/lie": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", + "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", + "dev": true, + "dependencies": { + "immediate": "~3.0.5" + } + }, + "node_modules/linkify-it": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-3.0.3.tgz", + "integrity": "sha512-ynTsyrFSdE5oZ/O9GEf00kPngmOfVwazR5GKDq6EYfhlpFug3J2zybX56a2PRRpc9P+FuSoGNAwjlbDs9jJBPQ==", + "dev": true, + "dependencies": { + "uc.micro": "^1.0.1" + } + }, + "node_modules/loader-runner": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", + "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", + "dev": true, + "engines": { + "node": ">=6.11.5" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "node_modules/log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lowercase-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", + "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "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==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/markdown-it": { + "version": "12.3.2", + "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-12.3.2.tgz", + "integrity": "sha512-TchMembfxfNVpHkbtriWltGWc+m3xszaRD0CZup7GFFhzIgQqxIfn3eGj1yZpfuflzPvfkt611B2Q/Bsk1YnGg==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1", + "entities": "~2.1.0", + "linkify-it": "^3.0.1", + "mdurl": "^1.0.1", + "uc.micro": "^1.0.5" + }, + "bin": { + "markdown-it": "bin/markdown-it.js" + } + }, + "node_modules/markdown-it/node_modules/entities": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.1.0.tgz", + "integrity": "sha512-hCx1oky9PFrJ611mf0ifBLBRW8lUUVRlFolb5gWRfIELabBlbp9xZvrqZLZAs+NxFnbfQoeGd8wDkygjg7U85w==", + "dev": true, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/mdurl": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", + "integrity": "sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==", + "dev": true + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true, + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "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, + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-response": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", + "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dev": true, + "dependencies": { + "minimist": "^1.2.6" + }, + "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", + "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", + "dev": true + }, + "node_modules/mocha": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-9.2.2.tgz", + "integrity": "sha512-L6XC3EdwT6YrIk0yXpavvLkn8h+EU+Y5UcCHKECyMbdUIxyMuZj4bX4U9e1nvnvUUvQVsV2VHQr5zLdcUkhW/g==", + "dev": true, + "dependencies": { + "@ungap/promise-all-settled": "1.1.2", + "ansi-colors": "4.1.1", + "browser-stdout": "1.3.1", + "chokidar": "3.5.3", + "debug": "4.3.3", + "diff": "5.0.0", + "escape-string-regexp": "4.0.0", + "find-up": "5.0.0", + "glob": "7.2.0", + "growl": "1.10.5", + "he": "1.2.0", + "js-yaml": "4.1.0", + "log-symbols": "4.1.0", + "minimatch": "4.2.1", + "ms": "2.1.3", + "nanoid": "3.3.1", + "serialize-javascript": "6.0.0", + "strip-json-comments": "3.1.1", + "supports-color": "8.1.1", + "which": "2.0.2", + "workerpool": "6.2.0", + "yargs": "16.2.0", + "yargs-parser": "20.2.4", + "yargs-unparser": "2.0.0" + }, + "bin": { + "_mocha": "bin/_mocha", + "mocha": "bin/mocha" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mochajs" + } + }, + "node_modules/mocha/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==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/mocha/node_modules/debug": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/mocha/node_modules/debug/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/mocha/node_modules/glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "dev": true, + "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": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/mocha/node_modules/glob/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/mocha/node_modules/minimatch": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-4.2.1.tgz", + "integrity": "sha512-9Uq1ChtSZO+Mxa/CL1eGizn2vRn3MlLgzhT0Iz8zaY8NdvxvB0d5QdPFmCKf7JKA9Lerx5vRrnwO03jsSfGG9g==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/mocha/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "node_modules/mocha/node_modules/serialize-javascript": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", + "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", + "dev": true, + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/monaco-page-objects": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/monaco-page-objects/-/monaco-page-objects-2.0.1.tgz", + "integrity": "sha512-OL2vzqA0YkKozdEEwj3fBYyJsv2jWZrG8nlKfho5epe//FQ7sY7QzaJ8OtfBD5mYGT7mwV1O649A/E33D5H6kA==", + "dev": true, + "dependencies": { + "clipboardy": "^2.3.0", + "clone-deep": "^4.0.1", + "compare-versions": "^3.5.1", + "fs-extra": "^10.0.0", + "ts-essentials": "^8.0.0" + }, + "peerDependencies": { + "selenium-webdriver": "^4.2.0" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/mute-stream": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", + "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", + "dev": true + }, + "node_modules/nanoid": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.1.tgz", + "integrity": "sha512-n6Vs/3KGyxPQd6uO0eH4Bv0ojGSUvuLlIHtC3Y0kEO23YRge8H9x1GCzLn28YX0H66pMkxuaeESFq4tKISKwdw==", + "dev": true, + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/napi-build-utils": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz", + "integrity": "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==", + "dev": true + }, + "node_modules/neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "dev": true + }, + "node_modules/nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", + "dev": true + }, + "node_modules/node-abi": { + "version": "3.33.0", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.33.0.tgz", + "integrity": "sha512-7GGVawqyHF4pfd0YFybhv/eM9JwTtPqx0mAanQ146O3FlSh3pA24zf9IRQTOsfTSqXTNzPSP5iagAJ94jjuVog==", + "dev": true, + "dependencies": { + "semver": "^7.3.5" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/node-addon-api": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-4.3.0.tgz", + "integrity": "sha512-73sE9+3UaLYYFmDsFZnqCInzPyh3MqIwZO9cw58yIqAZhONrrabrYyYe3TuIqtIiOuTXVhsGau8hcrhhwSsDIQ==", + "dev": true + }, + "node_modules/node-releases": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.10.tgz", + "integrity": "sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w==", + "dev": true + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-url": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", + "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==", + "dev": true, + "dependencies": { + "path-key": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "dev": true, + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, + "node_modules/object-inspect": { + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/once": { + "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, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/p-cancelable": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz", + "integrity": "sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", + "dev": true + }, + "node_modules/parse-semver": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/parse-semver/-/parse-semver-1.1.1.tgz", + "integrity": "sha512-Eg1OuNntBMH0ojvEKSrvDSnwLmvVuUOSdylH/pSCPNMIspLlweJyIWXCE+k/5hm3cj/EBUYwmWkjhBALNP4LXQ==", + "dev": true, + "dependencies": { + "semver": "^5.1.0" + } + }, + "node_modules/parse-semver/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/parse5": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", + "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", + "dev": true, + "dependencies": { + "entities": "^4.4.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parse5-htmlparser2-tree-adapter": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.0.0.tgz", + "integrity": "sha512-B77tOZrqqfUfnVcOrUvfdLbz4pu4RopLD/4vmu3HUPswwTA8OH0EMW9BlWR2B0RCoiZRAHEUu7IxeP1Pd1UU+g==", + "dev": true, + "dependencies": { + "domhandler": "^5.0.2", + "parse5": "^7.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "engines": { + "node": ">=8" + } + }, + "node_modules/pend": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", + "dev": true + }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-dir/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/prebuild-install": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.1.tgz", + "integrity": "sha512-jAXscXWMcCK8GgCoHOfIr0ODh5ai8mj63L2nWrjuAgXE6tDyYGnx4/8o/rCgU+B4JSyZBKbeZqzhtwtC3ovxjw==", + "dev": true, + "dependencies": { + "detect-libc": "^2.0.0", + "expand-template": "^2.0.3", + "github-from-package": "0.0.0", + "minimist": "^1.2.3", + "mkdirp-classic": "^0.5.3", + "napi-build-utils": "^1.0.1", + "node-abi": "^3.3.0", + "pump": "^3.0.0", + "rc": "^1.2.7", + "simple-get": "^4.0.0", + "tar-fs": "^2.0.0", + "tunnel-agent": "^0.6.0" + }, + "bin": { + "prebuild-install": "bin.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/prebuild-install/node_modules/bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "dev": true, + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "node_modules/prebuild-install/node_modules/readable-stream": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.1.tgz", + "integrity": "sha512-+rQmrWMYGA90yenhTYsLWAsLsqVC8osOw6PKE1HDYiO0gdPeKe/xDHNzIAIn4C91YQ6oenEhfYqqc1883qHbjQ==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/prebuild-install/node_modules/tar-fs": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", + "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==", + "dev": true, + "dependencies": { + "chownr": "^1.1.1", + "mkdirp-classic": "^0.5.2", + "pump": "^3.0.0", + "tar-stream": "^2.1.4" + } + }, + "node_modules/prebuild-install/node_modules/tar-stream": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", + "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", + "dev": true, + "dependencies": { + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true + }, + "node_modules/pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dev": true, + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/punycode": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", + "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "dev": true, + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/quick-lru": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", + "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "dev": true, + "dependencies": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "bin": { + "rc": "cli.js" + } + }, + "node_modules/rc/node_modules/strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/read": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/read/-/read-1.0.7.tgz", + "integrity": "sha512-rSOKNYUmaxy0om1BNjMN4ezNT6VKK+2xF4GBhc81mkH7L60i6dp8qPYrkndNLT3QPphoII3maL9PVC9XmhHwVQ==", + "dev": true, + "dependencies": { + "mute-stream": "~0.0.4" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/rechoir": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.7.1.tgz", + "integrity": "sha512-/njmZ8s1wVeR6pjTZ+0nCnv8SpZNRMT2D1RLOJQESlYFDBvwpTA4KWJpZ+sBJ4+vhjILRcK7JIFdGCdxEAAitg==", + "dev": true, + "dependencies": { + "resolve": "^1.9.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve": { + "version": "1.22.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", + "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", + "dev": true, + "dependencies": { + "is-core-module": "^2.9.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-alpn": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", + "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==", + "dev": true + }, + "node_modules/resolve-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "dev": true, + "dependencies": { + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/responselike": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.1.tgz", + "integrity": "sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==", + "dev": true, + "dependencies": { + "lowercase-keys": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "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 + }, + "node_modules/sanitize-filename": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/sanitize-filename/-/sanitize-filename-1.6.3.tgz", + "integrity": "sha512-y/52Mcy7aw3gRm7IrcGDFx/bCk4AhRh2eI9luHOQM86nZsqwiRkkq2GekHXBBD+SmPidc8i2PqtYZl+pWJ8Oeg==", + "dev": true, + "dependencies": { + "truncate-utf8-bytes": "^1.0.0" + } + }, + "node_modules/sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", + "dev": true + }, + "node_modules/schema-utils": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", + "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.8.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.0.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/selenium-webdriver": { + "version": "4.8.1", + "resolved": "https://registry.npmjs.org/selenium-webdriver/-/selenium-webdriver-4.8.1.tgz", + "integrity": "sha512-p4MtfhCQdcV6xxkS7eI0tQN6+WNReRULLCAuT4RDGkrjfObBNXMJ3WT8XdK+aXTr5nnBKuh+PxIevM0EjJgkxA==", + "dev": true, + "dependencies": { + "jszip": "^3.10.0", + "tmp": "^0.2.1", + "ws": ">=8.11.0" + }, + "engines": { + "node": ">= 14.20.0" + } + }, + "node_modules/semver": { + "version": "7.3.8", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", + "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/serialize-javascript": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.1.tgz", + "integrity": "sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==", + "dev": true, + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==", + "dev": true + }, + "node_modules/shallow-clone": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", + "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", + "dev": true, + "dependencies": { + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", + "dev": true, + "dependencies": { + "shebang-regex": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true + }, + "node_modules/simple-concat": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", + "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", + "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" + } + ] + }, + "node_modules/simple-get": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz", + "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==", + "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" + } + ], + "dependencies": { + "decompress-response": "^6.0.0", + "once": "^1.3.1", + "simple-concat": "^1.0.0" + } + }, + "node_modules/slash": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", + "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "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==", + "dev": true, + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true + }, + "node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-eof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/tapable": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", + "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/tar-fs": { + "version": "1.16.3", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-1.16.3.tgz", + "integrity": "sha512-NvCeXpYx7OsmOh8zIOP/ebG55zZmxLE0etfWRbWok+q2Qo8x/vOR/IJT1taADXPe+jsiu9axDb3X4B+iIgNlKw==", + "dev": true, + "dependencies": { + "chownr": "^1.0.1", + "mkdirp": "^0.5.1", + "pump": "^1.0.0", + "tar-stream": "^1.1.2" + } + }, + "node_modules/tar-fs/node_modules/pump": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/pump/-/pump-1.0.3.tgz", + "integrity": "sha512-8k0JupWme55+9tCVE+FS5ULT3K6AbgqrGa58lTT49RpyfwwcGedHqaC5LlQNdEAumn/wFsu6aPwkuPMioy8kqw==", + "dev": true, + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/tar-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.6.2.tgz", + "integrity": "sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A==", + "dev": true, + "dependencies": { + "bl": "^1.0.0", + "buffer-alloc": "^1.2.0", + "end-of-stream": "^1.0.0", + "fs-constants": "^1.0.0", + "readable-stream": "^2.3.0", + "to-buffer": "^1.1.1", + "xtend": "^4.0.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/targz": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/targz/-/targz-1.0.1.tgz", + "integrity": "sha512-6q4tP9U55mZnRuMTBqnqc3nwYQY3kv+QthCFZuMk+Tn1qYUnMPmL/JZ/mzgXINzFpSqfU+242IFmFU9VPvqaQw==", + "dev": true, + "dependencies": { + "tar-fs": "^1.8.1" + } + }, + "node_modules/tas-client": { + "version": "0.1.58", + "resolved": "https://registry.npmjs.org/tas-client/-/tas-client-0.1.58.tgz", + "integrity": "sha512-fOWii4wQXuo9Zl0oXgvjBzZWzKc5MmUR6XQWX93WU2c1SaP1plPo/zvXP8kpbZ9fvegFOHdapszYqMTRq/SRtg==", + "dependencies": { + "axios": "^0.26.1" + } + }, + "node_modules/terser": { + "version": "5.16.5", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.16.5.tgz", + "integrity": "sha512-qcwfg4+RZa3YvlFh0qjifnzBHjKGNbtDo9yivMqMFDy9Q6FSaQWSB/j1xKhsoUFJIqDOM3TsN6D5xbrMrFcHbg==", + "dev": true, + "dependencies": { + "@jridgewell/source-map": "^0.3.2", + "acorn": "^8.5.0", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/terser-webpack-plugin": { + "version": "5.3.6", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.6.tgz", + "integrity": "sha512-kfLFk+PoLUQIbLmB1+PZDMRSZS99Mp+/MHqDNmMA6tOItzRt+Npe3E+fsMs5mfcM0wCtrrdU387UnV+vnSffXQ==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.14", + "jest-worker": "^27.4.5", + "schema-utils": "^3.1.1", + "serialize-javascript": "^6.0.0", + "terser": "^5.14.1" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "uglify-js": { + "optional": true + } + } + }, + "node_modules/terser-webpack-plugin/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/terser-webpack-plugin/node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true, + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/terser-webpack-plugin/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/terser-webpack-plugin/node_modules/schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/tmp": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", + "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", + "dev": true, + "dependencies": { + "rimraf": "^3.0.0" + }, + "engines": { + "node": ">=8.17.0" + } + }, + "node_modules/to-buffer": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/to-buffer/-/to-buffer-1.1.1.tgz", + "integrity": "sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg==", + "dev": true + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/traverse": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.3.9.tgz", + "integrity": "sha512-iawgk0hLP3SxGKDfnDJf8wTz4p2qImnyihM5Hh/sGvQ3K37dPi/w8sRhdNIxYA1TwFwc5mDhIJq+O0RsvXBKdQ==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/truncate-utf8-bytes": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/truncate-utf8-bytes/-/truncate-utf8-bytes-1.0.2.tgz", + "integrity": "sha512-95Pu1QXQvruGEhv62XCMO3Mm90GscOCClvrIUwCM0PYOXK3kaF3l3sIHxx71ThJfcbM2O5Au6SO3AWCSEfW4mQ==", + "dev": true, + "dependencies": { + "utf8-byte-length": "^1.0.1" + } + }, + "node_modules/ts-essentials": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/ts-essentials/-/ts-essentials-8.1.0.tgz", + "integrity": "sha512-34xALeQADWRYq9kbtprP4KdpTQ3v3BBIs/U4SpaP+C4++B8ijXY5NnILRJLchQVMzw7YBzKuGMUMrI9uT+ALVw==", + "dev": true, + "peerDependencies": { + "typescript": ">=4.0.0" + } + }, + "node_modules/ts-loader": { + "version": "9.4.2", + "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.4.2.tgz", + "integrity": "sha512-OmlC4WVmFv5I0PpaxYb+qGeGOdm5giHU7HwDDUjw59emP2UYMHy9fFSDcYgSNoH8sXcj4hGCSEhlDZ9ULeDraA==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0", + "enhanced-resolve": "^5.0.0", + "micromatch": "^4.0.0", + "semver": "^7.3.4" + }, + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "typescript": "*", + "webpack": "^5.0.0" + } + }, + "node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "node_modules/tslint": { + "version": "6.1.3", + "resolved": "https://registry.npmjs.org/tslint/-/tslint-6.1.3.tgz", + "integrity": "sha512-IbR4nkT96EQOvKE2PW/djGz8iGNeJ4rF2mBfiYaR/nvUWYKJhLwimoJKgjIFEIDibBtOevj7BqCRL4oHeWWUCg==", + "deprecated": "TSLint has been deprecated in favor of ESLint. Please see https://github.com/palantir/tslint/issues/4534 for more information.", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.0.0", + "builtin-modules": "^1.1.1", + "chalk": "^2.3.0", + "commander": "^2.12.1", + "diff": "^4.0.1", + "glob": "^7.1.1", + "js-yaml": "^3.13.1", + "minimatch": "^3.0.4", + "mkdirp": "^0.5.3", + "resolve": "^1.3.2", + "semver": "^5.3.0", + "tslib": "^1.13.0", + "tsutils": "^2.29.0" + }, + "bin": { + "tslint": "bin/tslint" + }, + "engines": { + "node": ">=4.8.0" + }, + "peerDependencies": { + "typescript": ">=2.3.0-dev || >=2.4.0-dev || >=2.5.0-dev || >=2.6.0-dev || >=2.7.0-dev || >=2.8.0-dev || >=2.9.0-dev || >=3.0.0-dev || >= 3.1.0-dev || >= 3.2.0-dev || >= 4.0.0-dev" + } + }, + "node_modules/tslint/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, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/tslint/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/tslint/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==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/tslint/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, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/tslint/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, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/tslint/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 + }, + "node_modules/tslint/node_modules/diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true, + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/tslint/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, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/tslint/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, + "engines": { + "node": ">=4" + } + }, + "node_modules/tslint/node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/tslint/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/tslint/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/tslint/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, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/tsutils": { + "version": "2.29.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.29.0.tgz", + "integrity": "sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==", + "dev": true, + "dependencies": { + "tslib": "^1.8.1" + }, + "peerDependencies": { + "typescript": ">=2.1.0 || >=2.1.0-dev || >=2.2.0-dev || >=2.3.0-dev || >=2.4.0-dev || >=2.5.0-dev || >=2.6.0-dev || >=2.7.0-dev || >=2.8.0-dev || >=2.9.0-dev || >= 3.0.0-dev || >= 3.1.0-dev" + } + }, + "node_modules/tunnel": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/tunnel/-/tunnel-0.0.6.tgz", + "integrity": "sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==", + "dev": true, + "engines": { + "node": ">=0.6.11 <=0.7.0 || >=0.7.3" + } + }, + "node_modules/tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", + "dev": true, + "dependencies": { + "safe-buffer": "^5.0.1" + }, + "engines": { + "node": "*" + } + }, + "node_modules/typed-rest-client": { + "version": "1.8.9", + "resolved": "https://registry.npmjs.org/typed-rest-client/-/typed-rest-client-1.8.9.tgz", + "integrity": "sha512-uSmjE38B80wjL85UFX3sTYEUlvZ1JgCRhsWj/fJ4rZ0FqDUFoIuodtiVeE+cUqiVTOKPdKrp/sdftD15MDek6g==", + "dev": true, + "dependencies": { + "qs": "^6.9.1", + "tunnel": "0.0.6", + "underscore": "^1.12.1" + } + }, + "node_modules/typescript": { + "version": "4.9.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", + "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + }, + "node_modules/uc.micro": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz", + "integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==", + "dev": true + }, + "node_modules/underscore": { + "version": "1.13.6", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.6.tgz", + "integrity": "sha512-+A5Sja4HP1M08MaXya7p5LvjuM7K6q/2EaC0+iovj/wOcMsTzMvDFbasi/oSapiwOlt252IqsKqPjCl7huKS0A==", + "dev": true + }, + "node_modules/universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/unzip-stream": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/unzip-stream/-/unzip-stream-0.3.1.tgz", + "integrity": "sha512-RzaGXLNt+CW+T41h1zl6pGz3EaeVhYlK+rdAap+7DxW5kqsqePO8kRtWPaCiVqdhZc86EctSPVYNix30YOMzmw==", + "dev": true, + "dependencies": { + "binary": "^0.3.0", + "mkdirp": "^0.5.1" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz", + "integrity": "sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + } + ], + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + }, + "bin": { + "browserslist-lint": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/url-join": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/url-join/-/url-join-4.0.1.tgz", + "integrity": "sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA==", + "dev": true + }, + "node_modules/utf8-byte-length": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/utf8-byte-length/-/utf8-byte-length-1.0.4.tgz", + "integrity": "sha512-4+wkEYLBbWxqTahEsWrhxepcoVOJ+1z5PGIjPZxRkytcdSUaNjIjBM7Xn8E+pdSuV7SzvWovBFA54FO0JSoqhA==", + "dev": true + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true + }, + "node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/vsce": { + "version": "2.15.0", + "resolved": "https://registry.npmjs.org/vsce/-/vsce-2.15.0.tgz", + "integrity": "sha512-P8E9LAZvBCQnoGoizw65JfGvyMqNGlHdlUXD1VAuxtvYAaHBKLBdKPnpy60XKVDAkQCfmMu53g+gq9FM+ydepw==", + "deprecated": "vsce has been renamed to @vscode/vsce. Install using @vscode/vsce instead.", + "dev": true, + "dependencies": { + "azure-devops-node-api": "^11.0.1", + "chalk": "^2.4.2", + "cheerio": "^1.0.0-rc.9", + "commander": "^6.1.0", + "glob": "^7.0.6", + "hosted-git-info": "^4.0.2", + "keytar": "^7.7.0", + "leven": "^3.1.0", + "markdown-it": "^12.3.2", + "mime": "^1.3.4", + "minimatch": "^3.0.3", + "parse-semver": "^1.1.1", + "read": "^1.0.7", + "semver": "^5.1.0", + "tmp": "^0.2.1", + "typed-rest-client": "^1.8.4", + "url-join": "^4.0.1", + "xml2js": "^0.4.23", + "yauzl": "^2.3.1", + "yazl": "^2.2.2" + }, + "bin": { + "vsce": "vsce" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/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, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/vsce/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==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/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, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/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, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/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 + }, + "node_modules/vsce/node_modules/commander": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz", + "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/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, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/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, + "engines": { + "node": ">=4" + } + }, + "node_modules/vsce/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/vsce/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/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, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/vscode-extension-telemetry-wrapper": { + "version": "0.13.3", + "resolved": "https://registry.npmjs.org/vscode-extension-telemetry-wrapper/-/vscode-extension-telemetry-wrapper-0.13.3.tgz", + "integrity": "sha512-k/PbUbH9/xqiMXI2g2RXpDg+4/v08t3NzdPc7HuDPF3A1XcYkgYwsPnS/bqsKZNymSQdbLvVuie6STMxbDX9KQ==", + "dependencies": { + "@vscode/extension-telemetry": "^0.6.2", + "uuid": "^8.3.2" + }, + "engines": { + "vscode": "^1.14.0" + } + }, + "node_modules/vscode-extension-tester": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/vscode-extension-tester/-/vscode-extension-tester-4.4.1.tgz", + "integrity": "sha512-CaxWk41sX1Q9rycFCN6GRmNzjY3DJl5dxVknbLxVbjeR9g0Qam+dIajVQIeHsdUVEKJdfPCA8xbpJOyl/bUFnA==", + "dev": true, + "dependencies": { + "@types/selenium-webdriver": "^4.1.1", + "commander": "^8.0.0", + "compare-versions": "^3.6.0", + "fs-extra": "^10.0.0", + "glob": "^7.1.7", + "got": "^11.8.2", + "hpagent": "^0.1.2", + "js-yaml": "^4.1.0", + "monaco-page-objects": "^2.0.1", + "sanitize-filename": "^1.6.3", + "selenium-webdriver": "^4.2.0", + "targz": "^1.0.1", + "unzip-stream": "^0.3.0", + "vsce": "^2.3.0", + "vscode-extension-tester-locators": "^2.0.0" + }, + "bin": { + "extest": "out/cli.js" + }, + "peerDependencies": { + "mocha": ">=5.2.0" + } + }, + "node_modules/vscode-extension-tester-locators": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/vscode-extension-tester-locators/-/vscode-extension-tester-locators-2.0.0.tgz", + "integrity": "sha512-ljmevi7R1K5uCiMpstKydh/sCA9TEiohxLmzX30ZZU5qE/ZNWz/5oLrxTdqN3EcSVW9ZXhExvrQFvHoYZxy9Ng==", + "dev": true, + "peerDependencies": { + "monaco-page-objects": "^2.0.0", + "selenium-webdriver": "^4.2.0" + } + }, + "node_modules/vscode-extension-tester/node_modules/commander": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", + "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", + "dev": true, + "engines": { + "node": ">= 12" + } + }, + "node_modules/vscode-tas-client": { + "version": "0.1.63", + "resolved": "https://registry.npmjs.org/vscode-tas-client/-/vscode-tas-client-0.1.63.tgz", + "integrity": "sha512-TY5TPyibzi6rNmuUB7eRVqpzLzNfQYrrIl/0/F8ukrrbzOrKVvS31hM3urE+tbaVrnT+TMYXL16GhX57vEowhA==", + "dependencies": { + "tas-client": "0.1.58" + }, + "engines": { + "vscode": "^1.19.1" + } + }, + "node_modules/watchpack": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", + "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", + "dev": true, + "dependencies": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/webpack": { + "version": "5.75.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.75.0.tgz", + "integrity": "sha512-piaIaoVJlqMsPtX/+3KTTO6jfvrSYgauFVdt8cr9LTHKmcq/AMd4mhzsiP7ZF/PGRNPGA8336jldh9l2Kt2ogQ==", + "dev": true, + "dependencies": { + "@types/eslint-scope": "^3.7.3", + "@types/estree": "^0.0.51", + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/wasm-edit": "1.11.1", + "@webassemblyjs/wasm-parser": "1.11.1", + "acorn": "^8.7.1", + "acorn-import-assertions": "^1.7.6", + "browserslist": "^4.14.5", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.10.0", + "es-module-lexer": "^0.9.0", + "eslint-scope": "5.1.1", + "events": "^3.2.0", + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.2.9", + "json-parse-even-better-errors": "^2.3.1", + "loader-runner": "^4.2.0", + "mime-types": "^2.1.27", + "neo-async": "^2.6.2", + "schema-utils": "^3.1.0", + "tapable": "^2.1.1", + "terser-webpack-plugin": "^5.1.3", + "watchpack": "^2.4.0", + "webpack-sources": "^3.2.3" + }, + "bin": { + "webpack": "bin/webpack.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-cli": { + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-4.10.0.tgz", + "integrity": "sha512-NLhDfH/h4O6UOy+0LSso42xvYypClINuMNBVVzX4vX98TmTaTUxwRbXdhucbFMd2qLaCTcLq/PdYrvi8onw90w==", + "dev": true, + "dependencies": { + "@discoveryjs/json-ext": "^0.5.0", + "@webpack-cli/configtest": "^1.2.0", + "@webpack-cli/info": "^1.5.0", + "@webpack-cli/serve": "^1.7.0", + "colorette": "^2.0.14", + "commander": "^7.0.0", + "cross-spawn": "^7.0.3", + "fastest-levenshtein": "^1.0.12", + "import-local": "^3.0.2", + "interpret": "^2.2.0", + "rechoir": "^0.7.0", + "webpack-merge": "^5.7.3" + }, + "bin": { + "webpack-cli": "bin/cli.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "4.x.x || 5.x.x" + }, + "peerDependenciesMeta": { + "@webpack-cli/generators": { + "optional": true + }, + "@webpack-cli/migrate": { + "optional": true + }, + "webpack-bundle-analyzer": { + "optional": true + }, + "webpack-dev-server": { + "optional": true + } + } + }, + "node_modules/webpack-cli/node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "dev": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/webpack-cli/node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/webpack-cli/node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/webpack-cli/node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/webpack-cli/node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/webpack-merge": { + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.8.0.tgz", + "integrity": "sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q==", + "dev": true, + "dependencies": { + "clone-deep": "^4.0.1", + "wildcard": "^2.0.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/webpack-sources": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", + "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", + "dev": true, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/webpack/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/webpack/node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true, + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/webpack/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/webpack/node_modules/schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/wildcard": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.0.tgz", + "integrity": "sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw==", + "dev": true + }, + "node_modules/workerpool": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.0.tgz", + "integrity": "sha512-Rsk5qQHJ9eowMH28Jwhe8HEbmdYDX4lwoMWshiCXugjtHqMD9ZbiqSDLxcsfdqsETPzVUtX5s1Z5kStiIM6l4A==", + "dev": true + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true + }, + "node_modules/ws": { + "version": "8.12.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.12.1.tgz", + "integrity": "sha512-1qo+M9Ba+xNhPB+YTWUlK6M17brTut5EXbcBaMRN5pH5dFrXz7lzz1ChFSUq3bOUl8yEvSenhHmYUNJxFzdJew==", + "dev": true, + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/xml2js": { + "version": "0.4.23", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz", + "integrity": "sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==", + "dev": true, + "dependencies": { + "sax": ">=0.6.0", + "xmlbuilder": "~11.0.0" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/xmlbuilder": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", + "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "dev": true, + "engines": { + "node": ">=0.4" + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "node_modules/yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dev": true, + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs-parser": { + "version": "20.2.4", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", + "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs-unparser": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", + "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", + "dev": true, + "dependencies": { + "camelcase": "^6.0.0", + "decamelize": "^4.0.0", + "flat": "^5.0.2", + "is-plain-obj": "^2.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/yauzl": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", + "dev": true, + "dependencies": { + "buffer-crc32": "~0.2.3", + "fd-slicer": "~1.1.0" + } + }, + "node_modules/yazl": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/yazl/-/yazl-2.5.1.tgz", + "integrity": "sha512-phENi2PLiHnHb6QBVot+dJnaAZ0xosj7p3fWl+znIjBDlnMI2PsZCJZ306BPTFOaHf5qdDEI8x5qFrSOBN5vrw==", + "dev": true, + "dependencies": { + "buffer-crc32": "~0.2.3" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + }, "dependencies": { "@babel/code-frame": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz", - "integrity": "sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", + "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", "dev": true, "requires": { - "@babel/highlight": "^7.16.7" + "@babel/highlight": "^7.18.6" } }, "@babel/helper-validator-identifier": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", - "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==", + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", + "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", "dev": true }, "@babel/highlight": { - "version": "7.16.10", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.10.tgz", - "integrity": "sha512-5FnTQLSLswEj6IkgVw5KusNUUFY9ZGqe/TRFnP/BKYHYgfh7tc+C7mwiy95/yNP7Dh9x580Vv8r7u7ZfTBFxdw==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", + "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", "dev": true, "requires": { - "@babel/helper-validator-identifier": "^7.16.7", + "@babel/helper-validator-identifier": "^7.18.6", "chalk": "^2.0.0", "js-tokens": "^4.0.0" }, @@ -62,19 +5232,19 @@ "color-name": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", "dev": true }, "escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "dev": true }, "has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", "dev": true }, "supports-color": { @@ -144,43 +5314,43 @@ } }, "@microsoft/1ds-core-js": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/@microsoft/1ds-core-js/-/1ds-core-js-3.2.7.tgz", - "integrity": "sha512-Tc8K/IYIBFdFTUH87eSxWlIBTI5HRbx/v6lbH1xX5CS+DB6HW5v142FtSYFihQ7m+23I8YSxP9BW7dAicGqZCg==", + "version": "3.2.9", + "resolved": "https://registry.npmjs.org/@microsoft/1ds-core-js/-/1ds-core-js-3.2.9.tgz", + "integrity": "sha512-3pCfM2TzHn3gU9pxHztduKcVRdb/nzruvPFfHPZD0IM0mb0h6TGo2isELF3CTMahTx50RAC51ojNIw2/7VRkOg==", "requires": { - "@microsoft/applicationinsights-core-js": "2.8.8", - "@microsoft/applicationinsights-shims": "^2.0.1", - "@microsoft/dynamicproto-js": "^1.1.6" + "@microsoft/applicationinsights-core-js": "2.8.10", + "@microsoft/applicationinsights-shims": "^2.0.2", + "@microsoft/dynamicproto-js": "^1.1.7" } }, "@microsoft/1ds-post-js": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/@microsoft/1ds-post-js/-/1ds-post-js-3.2.7.tgz", - "integrity": "sha512-MC1qukJMLC0ABq9Pwwd6ojZVXOz80ZBtTT7dDDM58Bx+kfdr7Owko3AJHYV0/V93HOLThU1laztoBEK1fqkzcA==", + "version": "3.2.9", + "resolved": "https://registry.npmjs.org/@microsoft/1ds-post-js/-/1ds-post-js-3.2.9.tgz", + "integrity": "sha512-D/RtqkQ2Nr4cuoGqmhi5QTmi3cBlxehIThJ1u3BaH9H/YkLNTKEcHZRWTXy14bXheCefNHciLuadg37G2Kekcg==", "requires": { - "@microsoft/1ds-core-js": "3.2.7", - "@microsoft/applicationinsights-shims": "^2.0.1", - "@microsoft/dynamicproto-js": "^1.1.6" + "@microsoft/1ds-core-js": "3.2.9", + "@microsoft/applicationinsights-shims": "^2.0.2", + "@microsoft/dynamicproto-js": "^1.1.7" } }, "@microsoft/applicationinsights-core-js": { - "version": "2.8.8", - "resolved": "https://registry.npmjs.org/@microsoft/applicationinsights-core-js/-/applicationinsights-core-js-2.8.8.tgz", - "integrity": "sha512-SuEkiqXFRWoptonfLxBd/kV9VYz+RbW+cBR/AHL3W6D9DyhctAyrxrtTHd2r6oxZlndAi2L3gHXANSjF/ahqyg==", + "version": "2.8.10", + "resolved": "https://registry.npmjs.org/@microsoft/applicationinsights-core-js/-/applicationinsights-core-js-2.8.10.tgz", + "integrity": "sha512-jQrufDW0+sV8fBhRvzIPNGiCC6dELH+Ug0DM5CfN9757TBqZJz8CSWyDjex39as8+jD0F/8HRU9QdmrVgq5vFg==", "requires": { - "@microsoft/applicationinsights-shims": "2.0.1", - "@microsoft/dynamicproto-js": "^1.1.6" + "@microsoft/applicationinsights-shims": "2.0.2", + "@microsoft/dynamicproto-js": "^1.1.7" } }, "@microsoft/applicationinsights-shims": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@microsoft/applicationinsights-shims/-/applicationinsights-shims-2.0.1.tgz", - "integrity": "sha512-G0MXf6R6HndRbDy9BbEj0zrLeuhwt2nsXk2zKtF0TnYo39KgYqhYC2ayIzKPTm2KAE+xzD7rgyLdZnrcRvt9WQ==" + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@microsoft/applicationinsights-shims/-/applicationinsights-shims-2.0.2.tgz", + "integrity": "sha512-PoHEgsnmcqruLNHZ/amACqdJ6YYQpED0KSRe6J7gIJTtpZC1FfFU9b1fmDKDKtFoUSrPzEh1qzO3kmRZP0betg==" }, "@microsoft/dynamicproto-js": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/@microsoft/dynamicproto-js/-/dynamicproto-js-1.1.7.tgz", - "integrity": "sha512-SK3D3aVt+5vOOccKPnGaJWB5gQ8FuKfjboUJHedMP7gu54HqSCXX5iFXhktGD8nfJb0Go30eDvs/UDoTnR2kOA==" + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/@microsoft/dynamicproto-js/-/dynamicproto-js-1.1.8.tgz", + "integrity": "sha512-j4ZgOZRtX0LTUgKq+4tRQotgwH03HH/mLkYbcgFBBJ9XKTDc4NIGzZeam2UQMzwz+5IVN0SXexNbbsz5B0b/og==" }, "@nodelib/fs.scandir": { "version": "2.1.5", @@ -227,21 +5397,21 @@ "dev": true }, "@types/cacheable-request": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.2.tgz", - "integrity": "sha512-B3xVo+dlKM6nnKTcmm5ZtY/OL8bOAOd2Olee9M1zft65ox50OzjEHW91sDiU9j6cvW8Ejg1/Qkf4xd2kugApUA==", + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.3.tgz", + "integrity": "sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==", "dev": true, "requires": { "@types/http-cache-semantics": "*", - "@types/keyv": "*", + "@types/keyv": "^3.1.4", "@types/node": "*", - "@types/responselike": "*" + "@types/responselike": "^1.0.0" } }, "@types/eslint": { - "version": "8.4.10", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.4.10.tgz", - "integrity": "sha512-Sl/HOqN8NKPmhWo2VBEPm0nvHnu2LL3v9vKo8MEq0EtbJ4eVzGPl41VNPvn5E1i5poMk4/XD8UriLHpJvEP/Nw==", + "version": "8.21.1", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.21.1.tgz", + "integrity": "sha512-rc9K8ZpVjNcLs8Fp0dkozd5Pt2Apk1glO4Vgz8ix1u6yFByxfqo5Yavpy65o+93TAe24jr7v+eSBtFLvOQtCRQ==", "dev": true, "requires": { "@types/estree": "*", @@ -290,9 +5460,9 @@ "dev": true }, "@types/json-schema": { - "version": "7.0.9", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz", - "integrity": "sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==", + "version": "7.0.11", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", + "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", "dev": true }, "@types/keyv": { @@ -323,9 +5493,9 @@ "dev": true }, "@types/node": { - "version": "16.18.11", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.11.tgz", - "integrity": "sha512-3oJbGBUWuS6ahSnEq1eN2XrCyf4YsWI8OyCvo7c64zQJNplk3mO84t53o8lfTk+2ji59g5ycfc6qQ3fdHliHuA==", + "version": "16.18.14", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.14.tgz", + "integrity": "sha512-wvzClDGQXOCVNU4APPopC2KtMYukaF1MN/W3xAmslx22Z4/IF1/izDMekuyoUlwfnDHYCIZGaj7jMwnJKBTxKw==", "dev": true }, "@types/responselike": { @@ -338,9 +5508,9 @@ } }, "@types/selenium-webdriver": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/@types/selenium-webdriver/-/selenium-webdriver-4.1.3.tgz", - "integrity": "sha512-wbLIzr+fG/JT2qGJUo4YU9oObkKI1TqNSxJZkQIlpK2xllJAAZA7+IcybSnC4537qGQEmhCHwWqFN1GC9r8dgw==", + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@types/selenium-webdriver/-/selenium-webdriver-4.1.12.tgz", + "integrity": "sha512-3DxuYHEbzIyUtuICRtxXtJomdOOkBeCbkXAlAPm/h8ArIn/ArWNnVSC6tIj/ECZ/sdxBoI0F/wuwcpxBew3hGw==", "dev": true, "requires": { "@types/ws": "*" @@ -359,9 +5529,9 @@ "dev": true }, "@types/ws": { - "version": "8.5.3", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.3.tgz", - "integrity": "sha512-6YOoWjruKj1uLf3INHH7D3qTXwFfEsg1kf3c0uDdSBJwfa/llkwIjrAGV7j7mVgGNbzTQ3HiHKKDXl6bJPD97w==", + "version": "8.5.4", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.4.tgz", + "integrity": "sha512-zdQDHKUgcX/zBc4GrwsE/7dVdAD8JR4EuiAXiiUhhfyIJXXb2+PrGshFyeXWQPMmmZ2XxgaqclgpIC7eTXc1mg==", "dev": true, "requires": { "@types/node": "*" @@ -383,15 +5553,15 @@ } }, "@vscode/test-electron": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/@vscode/test-electron/-/test-electron-2.2.2.tgz", - "integrity": "sha512-s5d2VtMySvff0UgqkJ0BMCr1es+qREE194EAodGIefq518W53ifvv69e80l9e2MrYJEqUUKwukE/w3H9o15YEw==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@vscode/test-electron/-/test-electron-2.3.0.tgz", + "integrity": "sha512-fwzA9RtazH1GT/sckYlbxu6t5e4VaMXwCVtyLv4UAG0hP6NTfnMaaG25XCfWqlVwFhBMcQXHBCy5dmz2eLUnkw==", "dev": true, "requires": { "http-proxy-agent": "^4.0.1", "https-proxy-agent": "^5.0.0", - "rimraf": "^3.0.2", - "unzipper": "^0.10.11" + "jszip": "^3.10.1", + "semver": "^7.3.8" } }, "@webassemblyjs/ast": { @@ -544,7 +5714,8 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-1.2.0.tgz", "integrity": "sha512-4FB8Tj6xyVkyqjj1OaTqCjXYULB9FMkqQ8yGrZjRDrYh0nOE+7Lhs45WioWQQMV+ceFlE368Ukhe6xdvJM9Egg==", - "dev": true + "dev": true, + "requires": {} }, "@webpack-cli/info": { "version": "1.5.0", @@ -559,7 +5730,8 @@ "version": "1.7.0", "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-1.7.0.tgz", "integrity": "sha512-oxnCNGj88fL+xzV+dacXs44HcDwf1ovs3AuEzvP7mqXw7fQntqIhQ1BRmynh4qEKQSSSRSWVyXRjmTbZIX9V2Q==", - "dev": true + "dev": true, + "requires": {} }, "@xtuc/ieee754": { "version": "1.2.0", @@ -574,16 +5746,17 @@ "dev": true }, "acorn": { - "version": "8.8.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.1.tgz", - "integrity": "sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA==", + "version": "8.8.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", + "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==", "dev": true }, "acorn-import-assertions": { "version": "1.8.0", "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz", "integrity": "sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==", - "dev": true + "dev": true, + "requires": {} }, "agent-base": { "version": "6.0.2", @@ -595,14 +5768,14 @@ } }, "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", "dev": true, "requires": { "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", "uri-js": "^4.2.2" } }, @@ -613,33 +5786,16 @@ "dev": true, "requires": { "ajv": "^8.0.0" - }, - "dependencies": { - "ajv": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", - "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - } - }, - "json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true - } } }, "ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "dev": true + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.3" + } }, "ansi-colors": { "version": "4.1.1", @@ -647,6 +5803,12 @@ "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", "dev": true }, + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true + }, "ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", @@ -657,9 +5819,9 @@ } }, "anymatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", - "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", "dev": true, "requires": { "normalize-path": "^3.0.0", @@ -712,12 +5874,6 @@ "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", "dev": true }, - "big-integer": { - "version": "1.6.51", - "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.51.tgz", - "integrity": "sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg==", - "dev": true - }, "binary": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/binary/-/binary-0.3.0.tgz", @@ -744,12 +5900,6 @@ "safe-buffer": "^5.1.1" } }, - "bluebird": { - "version": "3.4.7", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.4.7.tgz", - "integrity": "sha512-iD3898SR7sWVRHbiQv+sHUtHnMvC1o3nW5rAcqnq3uOn07DSAppZYUkIGslDz6gXC7HfunPe7YVBgoEJASPcHA==", - "dev": true - }, "boolbase": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", @@ -757,13 +5907,11 @@ "dev": true }, "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "balanced-match": "^1.0.0" } }, "braces": { @@ -781,15 +5929,15 @@ "dev": true }, "browserslist": { - "version": "4.21.4", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.4.tgz", - "integrity": "sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw==", + "version": "4.21.5", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.5.tgz", + "integrity": "sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w==", "dev": true, "requires": { - "caniuse-lite": "^1.0.30001400", - "electron-to-chromium": "^1.4.251", - "node-releases": "^2.0.6", - "update-browserslist-db": "^1.0.9" + "caniuse-lite": "^1.0.30001449", + "electron-to-chromium": "^1.4.284", + "node-releases": "^2.0.8", + "update-browserslist-db": "^1.0.10" } }, "buffer": { @@ -836,12 +5984,6 @@ "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", "dev": true }, - "buffer-indexof-polyfill": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/buffer-indexof-polyfill/-/buffer-indexof-polyfill-1.0.2.tgz", - "integrity": "sha512-I7wzHwA3t1/lwXQh+A5PbNvJxgfo5r3xulgpYDB5zckTu/Z9oUK9biouBKQUjEqzaz3HnAT6TYoovmE+GqSf7A==", - "dev": true - }, "buffers": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/buffers/-/buffers-0.1.1.tgz", @@ -892,9 +6034,9 @@ "dev": true }, "caniuse-lite": { - "version": "1.0.30001434", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001434.tgz", - "integrity": "sha512-aOBHrLmTQw//WFa2rcF1If9fa3ypkC1wzqqiKHgfdrXTWcU8C4gKVZT77eQAPWN1APys3+uQ0Df07rKauXGEYA==", + "version": "1.0.30001458", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001458.tgz", + "integrity": "sha512-lQ1VlUUq5q9ro9X+5gOEyH7i3vm+AYVT1WDCVB69XOZ17KZRhnZ9J0Sqz7wTHQaLBJccNCHq8/Ww5LlOIZbB0w==", "dev": true }, "chainsaw": { @@ -1015,40 +6157,6 @@ "string-width": "^4.2.0", "strip-ansi": "^6.0.0", "wrap-ansi": "^7.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true - }, - "string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.1" - } - } } }, "clone-deep": { @@ -1122,47 +6230,6 @@ "normalize-path": "^3.0.0", "schema-utils": "^4.0.0", "serialize-javascript": "^6.0.0" - }, - "dependencies": { - "ajv": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", - "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - } - }, - "ajv-keywords": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", - "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.3" - } - }, - "json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true - }, - "schema-utils": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", - "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", - "dev": true, - "requires": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.8.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.0.0" - } - } } }, "core-util-is": { @@ -1221,9 +6288,9 @@ "dev": true }, "debug": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", - "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dev": true, "requires": { "ms": "2.1.2" @@ -1271,9 +6338,9 @@ "dev": true }, "diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", + "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", "dev": true }, "dir-glob": { @@ -1321,19 +6388,10 @@ "domhandler": "^5.0.1" } }, - "duplexer2": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", - "integrity": "sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==", - "dev": true, - "requires": { - "readable-stream": "^2.0.2" - } - }, "electron-to-chromium": { - "version": "1.4.284", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz", - "integrity": "sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA==", + "version": "1.4.315", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.315.tgz", + "integrity": "sha512-ndBQYz3Eyy3rASjjQ9poMJGoAlsZ/aZnq6GBsGL4w/4sWIAwiUHVSsMuADbxa8WJw7pZ0oxLpGbtoDt4vRTdCg==", "dev": true }, "emoji-regex": { @@ -1352,9 +6410,9 @@ } }, "enhanced-resolve": { - "version": "5.10.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.10.0.tgz", - "integrity": "sha512-T0yTFjdpldGY8PmuXXR0PyQ1ufZpEGiHVrp7zHKB7jdR4qlmZHhONVM5AQOAWXuF/w3dnHbEQVrNptJgt7F+cQ==", + "version": "5.12.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.12.0.tgz", + "integrity": "sha512-QHTXI/sZQmko1cbDoNAa3mJ5qhWUUNAq3vR0/YiD379fWQrcfuoX1+HW2S0MTt7XmoPLapdaDKUtelUSPic7hQ==", "dev": true, "requires": { "graceful-fs": "^4.2.4", @@ -1475,9 +6533,9 @@ "dev": true }, "fast-glob": { - "version": "3.2.11", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz", - "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==", + "version": "3.2.12", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", + "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", "requires": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", @@ -1503,15 +6561,15 @@ "dev": true }, "fastest-levenshtein": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.12.tgz", - "integrity": "sha512-On2N+BpYJ15xIC974QNVuYGMOlEVt4s0EOI3wwMqOmK1fdDY+FN/zltPV8vosq4ad4c/gJ1KHScUn/6AWIgiow==", + "version": "1.0.16", + "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", + "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==", "dev": true }, "fastq": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", - "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", + "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", "requires": { "reusify": "^1.0.4" } @@ -1583,29 +6641,6 @@ "dev": true, "optional": true }, - "fstream": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.12.tgz", - "integrity": "sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "inherits": "~2.0.0", - "mkdirp": ">=0.5 0", - "rimraf": "2" - }, - "dependencies": { - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - } - } - }, "function-bind": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", @@ -1619,9 +6654,9 @@ "dev": true }, "get-intrinsic": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.2.tgz", - "integrity": "sha512-Jfm3OyCxHh9DJyc28qGk+JmfkpO41A4XkneDSujN9MDXrm4oDKdHvndhZ2dN94+ERNfkYJWDclW6k2L/ZGHjXA==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz", + "integrity": "sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==", "dev": true, "requires": { "function-bind": "^1.1.1", @@ -1658,6 +6693,16 @@ "path-is-absolute": "^1.0.0" }, "dependencies": { + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, "minimatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", @@ -1697,9 +6742,9 @@ } }, "got": { - "version": "11.8.5", - "resolved": "https://registry.npmjs.org/got/-/got-11.8.5.tgz", - "integrity": "sha512-o0Je4NvQObAuZPHLFoRSkdG2lTgtcynqymzg2Vupdx6PorhaT5MCbIyXG6d4D94kk8ZG57QeosgdiqfJWhEhlQ==", + "version": "11.8.6", + "resolved": "https://registry.npmjs.org/got/-/got-11.8.6.tgz", + "integrity": "sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==", "dev": true, "requires": { "@sindresorhus/is": "^4.0.0", @@ -1716,9 +6761,9 @@ } }, "graceful-fs": { - "version": "4.2.9", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.9.tgz", - "integrity": "sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ==" + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==" }, "growl": { "version": "1.10.5", @@ -1882,9 +6927,9 @@ } }, "is-core-module": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.1.tgz", - "integrity": "sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA==", + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", + "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", "dev": true, "requires": { "has": "^1.0.3" @@ -1901,6 +6946,12 @@ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==" }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true + }, "is-glob": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", @@ -2007,9 +7058,9 @@ "dev": true }, "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", "dev": true }, "jsonfile": { @@ -2044,9 +7095,9 @@ } }, "keyv": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.0.tgz", - "integrity": "sha512-2YvuMsA+jnFGtBareKqgANOEKe1mk3HKiXu2fRmAfyxG0MJAywNhi5ttWA3PMjl4NmpyjZNbFifR2vNjW1znfA==", + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.2.tgz", + "integrity": "sha512-5MHbFaKn8cNSmVW7BYnijeAVlE4cYA/SVkifVgrh7yotnfhKmjuXpDKjrABLnT0SfHWV21P8ow07OGfRrNDg8g==", "dev": true, "requires": { "json-buffer": "3.0.1" @@ -2082,12 +7133,6 @@ "uc.micro": "^1.0.1" } }, - "listenercount": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/listenercount/-/listenercount-1.0.1.tgz", - "integrity": "sha512-3mk/Zag0+IJxeDrxSgaDPy4zZ3w05PRZeJNnlWhzFz5OkX49J4krc+A8X2d2M69vGMBEX0uyl8M+W+8gH+kBqQ==", - "dev": true - }, "loader-runner": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", @@ -2171,12 +7216,12 @@ "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==" }, "micromatch": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", - "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", "requires": { - "braces": "^3.0.1", - "picomatch": "^2.2.3" + "braces": "^3.0.2", + "picomatch": "^2.3.1" } }, "mime": { @@ -2212,22 +7257,12 @@ "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", "requires": { "brace-expansion": "^2.0.1" - }, - "dependencies": { - "brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "requires": { - "balanced-match": "^1.0.0" - } - } } }, "minimist": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", - "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", "dev": true }, "mkdirp": { @@ -2277,11 +7312,32 @@ "yargs-unparser": "2.0.0" }, "dependencies": { - "diff": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", - "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", - "dev": true + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "debug": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "dev": true, + "requires": { + "ms": "2.1.2" + }, + "dependencies": { + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } + } }, "glob": { "version": "7.2.0", @@ -2322,6 +7378,15 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "dev": true + }, + "serialize-javascript": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", + "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", + "dev": true, + "requires": { + "randombytes": "^2.1.0" + } } } }, @@ -2375,9 +7440,9 @@ "dev": true }, "node-abi": { - "version": "3.24.0", - "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.24.0.tgz", - "integrity": "sha512-YPG3Co0luSu6GwOBsmIdGW6Wx0NyNDLg/hriIyDllVsNwnI6UeqaWShxC3lbH4LtEQUgoLP3XR1ndXiDAWvmRw==", + "version": "3.33.0", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.33.0.tgz", + "integrity": "sha512-7GGVawqyHF4pfd0YFybhv/eM9JwTtPqx0mAanQ146O3FlSh3pA24zf9IRQTOsfTSqXTNzPSP5iagAJ94jjuVog==", "dev": true, "requires": { "semver": "^7.3.5" @@ -2390,9 +7455,9 @@ "dev": true }, "node-releases": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.6.tgz", - "integrity": "sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==", + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.10.tgz", + "integrity": "sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w==", "dev": true }, "normalize-path": { @@ -2426,9 +7491,9 @@ } }, "object-inspect": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", - "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==", + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", "dev": true }, "once": { @@ -2500,9 +7565,9 @@ } }, "parse5": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.1.tgz", - "integrity": "sha512-kwpuwzB+px5WUg9pyK0IcK/shltJN5/OVhQagxhCQNtT9Y9QRZqNY2e1cmbu/paRh5LMnz/oVTVLBpjFmMZhSg==", + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", + "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", "dev": true, "requires": { "entities": "^4.4.0" @@ -2644,9 +7709,9 @@ } }, "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.1.tgz", + "integrity": "sha512-+rQmrWMYGA90yenhTYsLWAsLsqVC8osOw6PKE1HDYiO0gdPeKe/xDHNzIAIn4C91YQ6oenEhfYqqc1883qHbjQ==", "dev": true, "requires": { "inherits": "^2.0.3", @@ -2698,9 +7763,9 @@ } }, "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", + "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", "dev": true }, "qs": { @@ -2762,9 +7827,9 @@ } }, "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", "dev": true, "requires": { "core-util-is": "~1.0.0", @@ -2774,14 +7839,6 @@ "safe-buffer": "~5.1.1", "string_decoder": "~1.1.1", "util-deprecate": "~1.0.1" - }, - "dependencies": { - "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 - } } }, "readdirp": { @@ -2815,12 +7872,12 @@ "dev": true }, "resolve": { - "version": "1.22.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.0.tgz", - "integrity": "sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==", + "version": "1.22.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", + "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", "dev": true, "requires": { - "is-core-module": "^2.8.1", + "is-core-module": "^2.9.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" } @@ -2878,9 +7935,9 @@ } }, "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "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 }, "sanitize-filename": { @@ -2899,25 +7956,26 @@ "dev": true }, "schema-utils": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", - "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", + "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", "dev": true, "requires": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" + "@types/json-schema": "^7.0.9", + "ajv": "^8.8.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.0.0" } }, "selenium-webdriver": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/selenium-webdriver/-/selenium-webdriver-4.4.0.tgz", - "integrity": "sha512-Du+/xfpvNi9zHAeYgXhOWN9yH0hph+cuX+hHDBr7d+SbtQVcfNJwBzLsbdHrB1Wh7MHXFuIkSG88A9TRRQUx3g==", + "version": "4.8.1", + "resolved": "https://registry.npmjs.org/selenium-webdriver/-/selenium-webdriver-4.8.1.tgz", + "integrity": "sha512-p4MtfhCQdcV6xxkS7eI0tQN6+WNReRULLCAuT4RDGkrjfObBNXMJ3WT8XdK+aXTr5nnBKuh+PxIevM0EjJgkxA==", "dev": true, "requires": { "jszip": "^3.10.0", "tmp": "^0.2.1", - "ws": ">=8.7.0" + "ws": ">=8.11.0" } }, "semver": { @@ -2929,9 +7987,9 @@ } }, "serialize-javascript": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", - "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.1.tgz", + "integrity": "sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==", "dev": true, "requires": { "randombytes": "^2.1.0" @@ -3035,14 +8093,26 @@ "dev": true, "requires": { "safe-buffer": "~5.1.0" - }, - "dependencies": { - "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 - } + } + }, + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.1" } }, "strip-eof": { @@ -3135,9 +8205,9 @@ } }, "terser": { - "version": "5.16.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.16.0.tgz", - "integrity": "sha512-KjTV81QKStSfwbNiwlBXfcgMcOloyuRdb62/iLFPGBcVNF4EXjhdYBhYHmbJpiBrVxZhDvltE11j+LBQUxEEJg==", + "version": "5.16.5", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.16.5.tgz", + "integrity": "sha512-qcwfg4+RZa3YvlFh0qjifnzBHjKGNbtDo9yivMqMFDy9Q6FSaQWSB/j1xKhsoUFJIqDOM3TsN6D5xbrMrFcHbg==", "dev": true, "requires": { "@jridgewell/source-map": "^0.3.2", @@ -3157,6 +8227,44 @@ "schema-utils": "^3.1.1", "serialize-javascript": "^6.0.0", "terser": "^5.14.1" + }, + "dependencies": { + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true, + "requires": {} + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + } + } } }, "tmp": { @@ -3201,7 +8309,8 @@ "version": "8.1.0", "resolved": "https://registry.npmjs.org/ts-essentials/-/ts-essentials-8.1.0.tgz", "integrity": "sha512-34xALeQADWRYq9kbtprP4KdpTQ3v3BBIs/U4SpaP+C4++B8ijXY5NnILRJLchQVMzw7YBzKuGMUMrI9uT+ALVw==", - "dev": true + "dev": true, + "requires": {} }, "ts-loader": { "version": "9.4.2", @@ -3218,8 +8327,7 @@ "tslib": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" }, "tslint": { "version": "6.1.3", @@ -3260,6 +8368,16 @@ "sprintf-js": "~1.0.2" } }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, "chalk": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", @@ -3286,6 +8404,12 @@ "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", "dev": true }, + "diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true + }, "escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", @@ -3317,15 +8441,6 @@ "brace-expansion": "^1.1.7" } }, - "mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "dev": true, - "requires": { - "minimist": "^1.2.5" - } - }, "semver": { "version": "5.7.1", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", @@ -3379,9 +8494,9 @@ } }, "typescript": { - "version": "4.9.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.4.tgz", - "integrity": "sha512-Uz+dTXYzxXXbsFpM86Wh3dKCxrQqUcVMxwU54orwlJjOpO3ao8L7j5lH+dWfTwgCwIuM9GQ2kvVotzYJMXTBZg==", + "version": "4.9.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", + "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", "dev": true }, "uc.micro": { @@ -3391,9 +8506,9 @@ "dev": true }, "underscore": { - "version": "1.13.4", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.4.tgz", - "integrity": "sha512-BQFnUDuAQ4Yf/cYY5LNrK9NCJFKriaRbD9uR1fTeXnBeoa97W0i41qkZfGO9pSo8I5KzjAcSY2XYtdf0oKd7KQ==", + "version": "1.13.6", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.6.tgz", + "integrity": "sha512-+A5Sja4HP1M08MaXya7p5LvjuM7K6q/2EaC0+iovj/wOcMsTzMvDFbasi/oSapiwOlt252IqsKqPjCl7huKS0A==", "dev": true }, "universalify": { @@ -3411,24 +8526,6 @@ "mkdirp": "^0.5.1" } }, - "unzipper": { - "version": "0.10.11", - "resolved": "https://registry.npmjs.org/unzipper/-/unzipper-0.10.11.tgz", - "integrity": "sha512-+BrAq2oFqWod5IESRjL3S8baohbevGcVA+teAIOYWM3pDVdseogqbzhhvvmiyQrUNKFUnDMtELW3X8ykbyDCJw==", - "dev": true, - "requires": { - "big-integer": "^1.6.17", - "binary": "~0.3.0", - "bluebird": "~3.4.1", - "buffer-indexof-polyfill": "~1.0.0", - "duplexer2": "~0.1.4", - "fstream": "^1.0.12", - "graceful-fs": "^4.2.2", - "listenercount": "~1.0.1", - "readable-stream": "~2.3.6", - "setimmediate": "~1.0.4" - } - }, "update-browserslist-db": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz", @@ -3472,9 +8569,9 @@ "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==" }, "vsce": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/vsce/-/vsce-2.11.0.tgz", - "integrity": "sha512-pr9Y0va/HCer0tTifeqaUrK24JJSpRd6oLeF/PY6FtrY41e+lwxiAq6jfMXx4ShAZglYg2rFKoKROwa7E7SEqQ==", + "version": "2.15.0", + "resolved": "https://registry.npmjs.org/vsce/-/vsce-2.15.0.tgz", + "integrity": "sha512-P8E9LAZvBCQnoGoizw65JfGvyMqNGlHdlUXD1VAuxtvYAaHBKLBdKPnpy60XKVDAkQCfmMu53g+gq9FM+ydepw==", "dev": true, "requires": { "azure-devops-node-api": "^11.0.1", @@ -3508,6 +8605,16 @@ "color-convert": "^1.9.0" } }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, "chalk": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", @@ -3579,9 +8686,9 @@ } }, "vscode-extension-telemetry-wrapper": { - "version": "0.13.2", - "resolved": "https://registry.npmjs.org/vscode-extension-telemetry-wrapper/-/vscode-extension-telemetry-wrapper-0.13.2.tgz", - "integrity": "sha512-Ika7ws4VlFZuK4hmP7rUYsMe91evjCaRsWbEzxijr2um6S97LKhQxave1yub7XWowErLTk3wZKPZS6aodaYjhw==", + "version": "0.13.3", + "resolved": "https://registry.npmjs.org/vscode-extension-telemetry-wrapper/-/vscode-extension-telemetry-wrapper-0.13.3.tgz", + "integrity": "sha512-k/PbUbH9/xqiMXI2g2RXpDg+4/v08t3NzdPc7HuDPF3A1XcYkgYwsPnS/bqsKZNymSQdbLvVuie6STMxbDX9KQ==", "requires": { "@vscode/extension-telemetry": "^0.6.2", "uuid": "^8.3.2" @@ -3622,7 +8729,8 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/vscode-extension-tester-locators/-/vscode-extension-tester-locators-2.0.0.tgz", "integrity": "sha512-ljmevi7R1K5uCiMpstKydh/sCA9TEiohxLmzX30ZZU5qE/ZNWz/5oLrxTdqN3EcSVW9ZXhExvrQFvHoYZxy9Ng==", - "dev": true + "dev": true, + "requires": {} }, "vscode-tas-client": { "version": "0.1.63", @@ -3672,6 +8780,44 @@ "terser-webpack-plugin": "^5.1.3", "watchpack": "^2.4.0", "webpack-sources": "^3.2.3" + }, + "dependencies": { + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true, + "requires": {} + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + } + } } }, "webpack-cli": { @@ -3780,40 +8926,6 @@ "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true - }, - "string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.1" - } - } } }, "wrappy": { @@ -3823,10 +8935,11 @@ "dev": true }, "ws": { - "version": "8.8.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.8.1.tgz", - "integrity": "sha512-bGy2JzvzkPowEJV++hF07hAD6niYSr0JzBNo/J29WsB57A2r7Wlc1UFcTR9IzrPvuNVO4B8LGqF8qcpsVOhJCA==", - "dev": true + "version": "8.12.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.12.1.tgz", + "integrity": "sha512-1qo+M9Ba+xNhPB+YTWUlK6M17brTut5EXbcBaMRN5pH5dFrXz7lzz1ChFSUq3bOUl8yEvSenhHmYUNJxFzdJew==", + "dev": true, + "requires": {} }, "xml2js": { "version": "0.4.23", @@ -3874,40 +8987,6 @@ "string-width": "^4.2.0", "y18n": "^5.0.5", "yargs-parser": "^20.2.2" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true - }, - "string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.1" - } - } } }, "yargs-parser": { diff --git a/src/tasks/buildArtifact/BuildArtifactTaskProvider.ts b/src/tasks/buildArtifact/BuildArtifactTaskProvider.ts index 45f21e67..d0867fac 100644 --- a/src/tasks/buildArtifact/BuildArtifactTaskProvider.ts +++ b/src/tasks/buildArtifact/BuildArtifactTaskProvider.ts @@ -99,6 +99,9 @@ export class BuildArtifactTaskProvider implements TaskProvider { } public static async resolveExportTask(task: Task, type: string): Promise { + if (!await languageServerApiManager.ready()) { + return task; + } const definition: IExportJarTaskDefinition = task.definition; const folder: WorkspaceFolder = task.scope; const resolvedTask: Task = new Task(definition, folder, task.name, type, @@ -119,6 +122,9 @@ export class BuildArtifactTaskProvider implements TaskProvider { } public async provideTasks(): Promise { + if (!await languageServerApiManager.ready()) { + return undefined; + } const folders: readonly WorkspaceFolder[] = workspace.workspaceFolders || []; if (_.isEmpty(folders)) { return undefined; From 973cff33df0924591e8475adbee58d3b44513f9f Mon Sep 17 00:00:00 2001 From: Shi Chen Date: Wed, 8 Mar 2023 17:37:50 +0800 Subject: [PATCH 143/352] fix: Make export jar task unblock fetch task process (#722) --- extension.bundle.ts | 3 + .../languageServerApiManager.ts | 15 ++- .../BuildArtifactTaskProvider.ts | 109 ++++++++++-------- test/maven-suite/buildArtifact.test.ts | 8 ++ 4 files changed, 82 insertions(+), 53 deletions(-) diff --git a/extension.bundle.ts b/extension.bundle.ts index e0c9a3ba..e192e8ff 100644 --- a/extension.bundle.ts +++ b/extension.bundle.ts @@ -23,5 +23,8 @@ export { DependencyExplorer } from "./src/views/dependencyExplorer"; export { Commands } from "./src/commands"; export { LanguageServerMode } from "./src/languageServerApi/LanguageServerMode"; +// language server api +export { languageServerApiManager } from "./src/languageServerApi/languageServerApiManager"; + // tasks export { BuildTaskProvider, categorizePaths, getFinalPaths } from "./src/tasks/build/buildTaskProvider"; diff --git a/src/languageServerApi/languageServerApiManager.ts b/src/languageServerApi/languageServerApiManager.ts index a5b72402..3aa77e76 100644 --- a/src/languageServerApi/languageServerApiManager.ts +++ b/src/languageServerApi/languageServerApiManager.ts @@ -12,10 +12,10 @@ import { LanguageServerMode } from "./LanguageServerMode"; class LanguageServerApiManager { private extensionApi: any; - private isReady: boolean = false; + private isServerReady: boolean = false; public async ready(): Promise { - if (this.isReady) { + if (this.isServerReady) { return true; } @@ -29,7 +29,7 @@ class LanguageServerApiManager { } await this.extensionApi.serverReady(); - this.isReady = true; + this.isServerReady = true; return true; } @@ -81,6 +81,15 @@ class LanguageServerApiManager { private isApiInitialized(): boolean { return this.extensionApi !== undefined; } + + /** + * Check if the language server is ready in the given timeout. + * @param timeout the timeout in milliseconds to wait + * @returns false if the language server is not ready in the given timeout, otherwise true + */ + public isReady(timeout: number): Promise { + return Promise.race([this.ready(), new Promise((resolve) => setTimeout(() => resolve(false), timeout))]); + } } export const languageServerApiManager: LanguageServerApiManager = new LanguageServerApiManager(); diff --git a/src/tasks/buildArtifact/BuildArtifactTaskProvider.ts b/src/tasks/buildArtifact/BuildArtifactTaskProvider.ts index d0867fac..d5971de2 100644 --- a/src/tasks/buildArtifact/BuildArtifactTaskProvider.ts +++ b/src/tasks/buildArtifact/BuildArtifactTaskProvider.ts @@ -99,30 +99,35 @@ export class BuildArtifactTaskProvider implements TaskProvider { } public static async resolveExportTask(task: Task, type: string): Promise { - if (!await languageServerApiManager.ready()) { + if (!await languageServerApiManager.isReady(1000)) { return task; } const definition: IExportJarTaskDefinition = task.definition; const folder: WorkspaceFolder = task.scope; - const resolvedTask: Task = new Task(definition, folder, task.name, type, - new CustomExecution(async (resolvedDefinition: IExportJarTaskDefinition): Promise => { - const stepMetadata: IStepMetadata = { - entry: undefined, - taskLabel: resolvedDefinition.label || folder.name, - workspaceFolder: folder, - projectList: await Jdtls.getProjects(folder.uri.toString()), - steps: [], - elements: [], - classpaths: [], - }; - return new ExportJarTaskTerminal(resolvedDefinition, stepMetadata); - })); - resolvedTask.presentationOptions.reveal = TaskRevealKind.Never; - return resolvedTask; + try { + const projectList = await Jdtls.getProjects(folder.uri.toString()); + const resolvedTask: Task = new Task(definition, folder, task.name, type, + new CustomExecution(async (resolvedDefinition: IExportJarTaskDefinition): Promise => { + const stepMetadata: IStepMetadata = { + entry: undefined, + taskLabel: resolvedDefinition.label || folder.name, + workspaceFolder: folder, + projectList: projectList, + steps: [], + elements: [], + classpaths: [], + }; + return new ExportJarTaskTerminal(resolvedDefinition, stepMetadata); + })); + resolvedTask.presentationOptions.reveal = TaskRevealKind.Never; + return resolvedTask; + } catch (e) { + return task; + } } public async provideTasks(): Promise { - if (!await languageServerApiManager.ready()) { + if (!await languageServerApiManager.isReady(1000)) { return undefined; } const folders: readonly WorkspaceFolder[] = workspace.workspaceFolders || []; @@ -134,41 +139,45 @@ export class BuildArtifactTaskProvider implements TaskProvider { } this.tasks = []; for (const folder of folders) { - const projectList: INodeData[] = await Jdtls.getProjects(folder.uri.toString()); - const elementList: string[] = []; - if (_.isEmpty(projectList)) { - continue; - } else if (projectList.length === 1) { - elementList.push("${" + ExportJarConstants.COMPILE_OUTPUT + "}", - "${" + ExportJarConstants.DEPENDENCIES + "}"); - } else { - for (const project of projectList) { - elementList.push("${" + ExportJarConstants.COMPILE_OUTPUT + ":" + project.name + "}", - "${" + ExportJarConstants.DEPENDENCIES + ":" + project.name + "}"); + try { + const projectList: INodeData[] = await Jdtls.getProjects(folder.uri.toString()); + const elementList: string[] = []; + if (_.isEmpty(projectList)) { + continue; + } else if (projectList.length === 1) { + elementList.push("${" + ExportJarConstants.COMPILE_OUTPUT + "}", + "${" + ExportJarConstants.DEPENDENCIES + "}"); + } else { + for (const project of projectList) { + elementList.push("${" + ExportJarConstants.COMPILE_OUTPUT + ":" + project.name + "}", + "${" + ExportJarConstants.DEPENDENCIES + ":" + project.name + "}"); + } } + const mainClasses: IMainClassInfo[] = await Jdtls.getMainClasses(folder.uri.toString()); + const defaultDefinition: IExportJarTaskDefinition = { + type: BuildArtifactTaskProvider.exportJarType, + mainClass: (mainClasses.length === 1) ? mainClasses[0].name : undefined, + targetPath: Settings.getExportJarTargetPath(), + elements: elementList, + }; + const defaultTask: Task = new Task(defaultDefinition, folder, folder.name, BuildArtifactTaskProvider.exportJarType, + new CustomExecution(async (resolvedDefinition: IExportJarTaskDefinition): Promise => { + const stepMetadata: IStepMetadata = { + entry: undefined, + taskLabel: resolvedDefinition.label || folder.name, + workspaceFolder: folder, + projectList: projectList, + steps: [], + elements: [], + classpaths: [], + }; + return new ExportJarTaskTerminal(resolvedDefinition, stepMetadata); + }), undefined); + defaultTask.presentationOptions.reveal = TaskRevealKind.Never; + this.tasks.push(defaultTask); + } catch (e) { + continue; } - const mainClasses: IMainClassInfo[] = await Jdtls.getMainClasses(folder.uri.toString()); - const defaultDefinition: IExportJarTaskDefinition = { - type: BuildArtifactTaskProvider.exportJarType, - mainClass: (mainClasses.length === 1) ? mainClasses[0].name : undefined, - targetPath: Settings.getExportJarTargetPath(), - elements: elementList, - }; - const defaultTask: Task = new Task(defaultDefinition, folder, folder.name, BuildArtifactTaskProvider.exportJarType, - new CustomExecution(async (resolvedDefinition: IExportJarTaskDefinition): Promise => { - const stepMetadata: IStepMetadata = { - entry: undefined, - taskLabel: resolvedDefinition.label || folder.name, - workspaceFolder: folder, - projectList: await Jdtls.getProjects(folder.uri.toString()), - steps: [], - elements: [], - classpaths: [], - }; - return new ExportJarTaskTerminal(resolvedDefinition, stepMetadata); - }), undefined); - defaultTask.presentationOptions.reveal = TaskRevealKind.Never; - this.tasks.push(defaultTask); } return this.tasks; } diff --git a/test/maven-suite/buildArtifact.test.ts b/test/maven-suite/buildArtifact.test.ts index e1189f2c..1e4f71cf 100644 --- a/test/maven-suite/buildArtifact.test.ts +++ b/test/maven-suite/buildArtifact.test.ts @@ -7,6 +7,7 @@ import * as fse from "fs-extra"; import { suiteTeardown } from "mocha"; import * as path from "path"; import { Task, TaskEndEvent, tasks, workspace } from "vscode"; +import { languageServerApiManager } from "../../extension.bundle"; import { setupTestEnv } from "../shared"; // tslint:disable: only-arrow-functions @@ -18,7 +19,14 @@ suite("Build Artifact Tests", () => { suiteSetup(setupTestEnv); + test("Should bypass buildArtifact tasks before language server is ready", async function() { + const vscodeTasks: Task[] = await tasks.fetchTasks(); + const buildJarTask: Task | undefined = vscodeTasks.find((t: Task) => t.name === "java (buildArtifact): maven"); + assert.ok(buildJarTask === undefined); + }); + test("Can build jar correctly", async function() { + await languageServerApiManager.ready(); const vscodeTasks: Task[] = await tasks.fetchTasks(); const buildJarTask: Task | undefined = vscodeTasks.find((t: Task) => t.name === "java (buildArtifact): maven"); assert.ok(buildJarTask !== undefined); From 439f14194afba7f0b345dee857a039547d00c958 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 15 Mar 2023 17:16:06 -0700 Subject: [PATCH 144/352] chore(deps-dev): Bump webpack from 5.75.0 to 5.76.0 (#725) Bumps [webpack](https://github.com/webpack/webpack) from 5.75.0 to 5.76.0. - [Release notes](https://github.com/webpack/webpack/releases) - [Commits](https://github.com/webpack/webpack/compare/v5.75.0...v5.76.0) --- updated-dependencies: - dependency-name: webpack dependency-type: direct:development ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 14 +++++++------- package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index 723f17ac..97fa06d5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -35,7 +35,7 @@ "tslint": "^6.1.3", "typescript": "^4.9.4", "vscode-extension-tester": "^4.4.1", - "webpack": "^5.75.0", + "webpack": "^5.76.0", "webpack-cli": "^4.10.0" }, "engines": { @@ -4766,9 +4766,9 @@ } }, "node_modules/webpack": { - "version": "5.75.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.75.0.tgz", - "integrity": "sha512-piaIaoVJlqMsPtX/+3KTTO6jfvrSYgauFVdt8cr9LTHKmcq/AMd4mhzsiP7ZF/PGRNPGA8336jldh9l2Kt2ogQ==", + "version": "5.76.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.76.0.tgz", + "integrity": "sha512-l5sOdYBDunyf72HW8dF23rFtWq/7Zgvt/9ftMof71E/yUb1YLOBmTgA2K4vQthB3kotMrSj609txVE0dnr2fjA==", "dev": true, "dependencies": { "@types/eslint-scope": "^3.7.3", @@ -8751,9 +8751,9 @@ } }, "webpack": { - "version": "5.75.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.75.0.tgz", - "integrity": "sha512-piaIaoVJlqMsPtX/+3KTTO6jfvrSYgauFVdt8cr9LTHKmcq/AMd4mhzsiP7ZF/PGRNPGA8336jldh9l2Kt2ogQ==", + "version": "5.76.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.76.0.tgz", + "integrity": "sha512-l5sOdYBDunyf72HW8dF23rFtWq/7Zgvt/9ftMof71E/yUb1YLOBmTgA2K4vQthB3kotMrSj609txVE0dnr2fjA==", "dev": true, "requires": { "@types/eslint-scope": "^3.7.3", diff --git a/package.json b/package.json index d3192280..70b114bc 100644 --- a/package.json +++ b/package.json @@ -817,7 +817,7 @@ "tslint": "^6.1.3", "typescript": "^4.9.4", "vscode-extension-tester": "^4.4.1", - "webpack": "^5.75.0", + "webpack": "^5.76.0", "webpack-cli": "^4.10.0" }, "dependencies": { From 8fa4046028518141cb3aca11cf878d2c60bfad12 Mon Sep 17 00:00:00 2001 From: Sheng Chen Date: Thu, 23 Mar 2023 15:30:39 +0800 Subject: [PATCH 145/352] chore: Prepare for 0.21.2 (#726) * chore: Update target platform * chore: Prepare for 0.21.2 --------- Signed-off-by: Sheng Chen --- CHANGELOG.md | 5 +++++ jdtls.ext/com.microsoft.jdtls.ext.core/META-INF/MANIFEST.MF | 2 +- jdtls.ext/com.microsoft.jdtls.ext.core/pom.xml | 2 +- .../com.microsoft.jdtls.ext.tp.target | 2 +- jdtls.ext/com.microsoft.jdtls.ext.target/pom.xml | 2 +- jdtls.ext/pom.xml | 2 +- package-lock.json | 4 ++-- package.json | 4 ++-- 8 files changed, 14 insertions(+), 9 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5dd4f7e3..99aaa9c5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,11 @@ All notable changes to the "vscode-java-dependency" extension will be documented The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/) and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html). +## 0.21.2 +### Fixed +- Improve the output of exporting jar tasks. [#699](https://github.com/microsoft/vscode-java-dependency/issues/699) +- Open build tasks action is blocked. [#720](https://github.com/microsoft/vscode-java-dependency/issues/720) + ## 0.21.1 ### Changed - Scan two levels of directories for activation indicators. [PR#681](https://github.com/microsoft/vscode-java-dependency/pull/681) diff --git a/jdtls.ext/com.microsoft.jdtls.ext.core/META-INF/MANIFEST.MF b/jdtls.ext/com.microsoft.jdtls.ext.core/META-INF/MANIFEST.MF index d3fabbde..1e44e6e3 100644 --- a/jdtls.ext/com.microsoft.jdtls.ext.core/META-INF/MANIFEST.MF +++ b/jdtls.ext/com.microsoft.jdtls.ext.core/META-INF/MANIFEST.MF @@ -2,7 +2,7 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: JDTLS EXT Core Bundle-SymbolicName: com.microsoft.jdtls.ext.core;singleton:=true -Bundle-Version: 0.21.1 +Bundle-Version: 0.21.2 Bundle-Activator: com.microsoft.jdtls.ext.core.JdtlsExtActivator Bundle-RequiredExecutionEnvironment: JavaSE-11 Bundle-ActivationPolicy: lazy diff --git a/jdtls.ext/com.microsoft.jdtls.ext.core/pom.xml b/jdtls.ext/com.microsoft.jdtls.ext.core/pom.xml index ca7e4fd5..ed0150c6 100644 --- a/jdtls.ext/com.microsoft.jdtls.ext.core/pom.xml +++ b/jdtls.ext/com.microsoft.jdtls.ext.core/pom.xml @@ -5,7 +5,7 @@ com.microsoft.jdtls.ext jdtls-ext-parent - 0.21.1 + 0.21.2 com.microsoft.jdtls.ext.core eclipse-plugin diff --git a/jdtls.ext/com.microsoft.jdtls.ext.target/com.microsoft.jdtls.ext.tp.target b/jdtls.ext/com.microsoft.jdtls.ext.target/com.microsoft.jdtls.ext.tp.target index 1cb53687..ad9d88b6 100644 --- a/jdtls.ext/com.microsoft.jdtls.ext.target/com.microsoft.jdtls.ext.tp.target +++ b/jdtls.ext/com.microsoft.jdtls.ext.target/com.microsoft.jdtls.ext.tp.target @@ -14,7 +14,7 @@ - + diff --git a/jdtls.ext/com.microsoft.jdtls.ext.target/pom.xml b/jdtls.ext/com.microsoft.jdtls.ext.target/pom.xml index bd1cee50..cd8d3d72 100644 --- a/jdtls.ext/com.microsoft.jdtls.ext.target/pom.xml +++ b/jdtls.ext/com.microsoft.jdtls.ext.target/pom.xml @@ -4,7 +4,7 @@ com.microsoft.jdtls.ext jdtls-ext-parent - 0.21.1 + 0.21.2 com.microsoft.jdtls.ext.tp ${base.name} :: Target Platform diff --git a/jdtls.ext/pom.xml b/jdtls.ext/pom.xml index b1ec9e76..7cb7daa8 100644 --- a/jdtls.ext/pom.xml +++ b/jdtls.ext/pom.xml @@ -4,7 +4,7 @@ com.microsoft.jdtls.ext jdtls-ext-parent ${base.name} :: Parent - 0.21.1 + 0.21.2 pom Java Project Manager diff --git a/package-lock.json b/package-lock.json index 97fa06d5..47488b44 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "vscode-java-dependency", - "version": "0.21.1", + "version": "0.21.2", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "vscode-java-dependency", - "version": "0.21.1", + "version": "0.21.2", "license": "MIT", "dependencies": { "await-lock": "^2.2.2", diff --git a/package.json b/package.json index 70b114bc..bb8ba467 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "vscode-java-dependency", "displayName": "Project Manager for Java", "description": "%description%", - "version": "0.21.1", + "version": "0.21.2", "publisher": "vscjava", "preview": true, "aiKey": "5c642b22-e845-4400-badb-3f8509a70777", @@ -48,7 +48,7 @@ "main": "./main.js", "contributes": { "javaExtensions": [ - "./server/com.microsoft.jdtls.ext.core-0.21.1.jar" + "./server/com.microsoft.jdtls.ext.core-0.21.2.jar" ], "commands": [ { From dbd8d84d709d99c1d9815d797f71556cb4313e5b Mon Sep 17 00:00:00 2001 From: Sheng Chen Date: Mon, 27 Mar 2023 16:59:22 +0800 Subject: [PATCH 146/352] chore: Update dependencies (#727) Signed-off-by: Sheng Chen --- package-lock.json | 188 +++++++++++++++++++++++----------------------- 1 file changed, 94 insertions(+), 94 deletions(-) diff --git a/package-lock.json b/package-lock.json index 47488b44..caefc95b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -335,9 +335,9 @@ } }, "node_modules/@types/eslint": { - "version": "8.21.1", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.21.1.tgz", - "integrity": "sha512-rc9K8ZpVjNcLs8Fp0dkozd5Pt2Apk1glO4Vgz8ix1u6yFByxfqo5Yavpy65o+93TAe24jr7v+eSBtFLvOQtCRQ==", + "version": "8.21.3", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.21.3.tgz", + "integrity": "sha512-fa7GkppZVEByMWGbTtE5MbmXWJTVbrjjaS8K6uQj+XtuuUv1fsuPAxhygfqLmsb/Ufb3CV8deFCpiMfAgi00Sw==", "dev": true, "dependencies": { "@types/estree": "*", @@ -419,9 +419,9 @@ "dev": true }, "node_modules/@types/node": { - "version": "16.18.14", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.14.tgz", - "integrity": "sha512-wvzClDGQXOCVNU4APPopC2KtMYukaF1MN/W3xAmslx22Z4/IF1/izDMekuyoUlwfnDHYCIZGaj7jMwnJKBTxKw==", + "version": "16.18.21", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.21.tgz", + "integrity": "sha512-TassPGd0AEZWA10qcNnXnSNwHlLfSth8XwUaWc3gTSDmBz/rKb613Qw5qRf6o2fdRBrLbsgeC9PMZshobkuUqg==", "dev": true }, "node_modules/@types/responselike": { @@ -434,9 +434,9 @@ } }, "node_modules/@types/selenium-webdriver": { - "version": "4.1.12", - "resolved": "https://registry.npmjs.org/@types/selenium-webdriver/-/selenium-webdriver-4.1.12.tgz", - "integrity": "sha512-3DxuYHEbzIyUtuICRtxXtJomdOOkBeCbkXAlAPm/h8ArIn/ArWNnVSC6tIj/ECZ/sdxBoI0F/wuwcpxBew3hGw==", + "version": "4.1.13", + "resolved": "https://registry.npmjs.org/@types/selenium-webdriver/-/selenium-webdriver-4.1.13.tgz", + "integrity": "sha512-kGpIh7bvu4HGCJXl4PEJ53kzpG4iXlRDd66SNNCfJ58QhFuk9skOm57lVffZap5ChEOJwbge/LJ9IVGVC8EEOg==", "dev": true, "dependencies": { "@types/ws": "*" @@ -1111,9 +1111,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001458", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001458.tgz", - "integrity": "sha512-lQ1VlUUq5q9ro9X+5gOEyH7i3vm+AYVT1WDCVB69XOZ17KZRhnZ9J0Sqz7wTHQaLBJccNCHq8/Ww5LlOIZbB0w==", + "version": "1.0.30001470", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001470.tgz", + "integrity": "sha512-065uNwY6QtHCBOExzbV6m236DDhYCCtPmQUCoQtwkVqzud8v5QPidoMr6CoMkC2nfp6nksjttqWQRRh75LqUmA==", "dev": true, "funding": [ { @@ -1605,9 +1605,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.4.315", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.315.tgz", - "integrity": "sha512-ndBQYz3Eyy3rASjjQ9poMJGoAlsZ/aZnq6GBsGL4w/4sWIAwiUHVSsMuADbxa8WJw7pZ0oxLpGbtoDt4vRTdCg==", + "version": "1.4.340", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.340.tgz", + "integrity": "sha512-zx8hqumOqltKsv/MF50yvdAlPF9S/4PXbyfzJS6ZGhbddGkRegdwImmfSVqCkEziYzrIGZ/TlrzBND4FysfkDg==", "dev": true }, "node_modules/emoji-regex": { @@ -2105,9 +2105,9 @@ } }, "node_modules/graceful-fs": { - "version": "4.2.10", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", - "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==" + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" }, "node_modules/growl": { "version": "1.10.5", @@ -2179,9 +2179,9 @@ "dev": true }, "node_modules/htmlparser2": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.1.tgz", - "integrity": "sha512-4lVbmc1diZC7GUJQtRQ5yBAeUCL1exyMwmForWkRLnwyzWBFxN633SALPMGYaWZvKe9j1pRZJpauvmxENSp/EA==", + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.2.tgz", + "integrity": "sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==", "dev": true, "funding": [ "https://github.com/fb55/htmlparser2?sponsor=1", @@ -2192,9 +2192,9 @@ ], "dependencies": { "domelementtype": "^2.3.0", - "domhandler": "^5.0.2", + "domhandler": "^5.0.3", "domutils": "^3.0.1", - "entities": "^4.3.0" + "entities": "^4.4.0" } }, "node_modules/http-cache-semantics": { @@ -3360,9 +3360,9 @@ } }, "node_modules/prebuild-install/node_modules/readable-stream": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.1.tgz", - "integrity": "sha512-+rQmrWMYGA90yenhTYsLWAsLsqVC8osOw6PKE1HDYiO0gdPeKe/xDHNzIAIn4C91YQ6oenEhfYqqc1883qHbjQ==", + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", "dev": true, "dependencies": { "inherits": "^2.0.3", @@ -3427,9 +3427,9 @@ } }, "node_modules/qs": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", - "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "version": "6.11.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.1.tgz", + "integrity": "sha512-0wsrzgTz/kAVIeuxSjnpGC56rzYtr6JT/2BwEvMaPhFIoYa1aGO8LbzuU1R0uUYQkLpWBTOj0l/CLAJB64J6nQ==", "dev": true, "dependencies": { "side-channel": "^1.0.4" @@ -3717,9 +3717,9 @@ } }, "node_modules/selenium-webdriver": { - "version": "4.8.1", - "resolved": "https://registry.npmjs.org/selenium-webdriver/-/selenium-webdriver-4.8.1.tgz", - "integrity": "sha512-p4MtfhCQdcV6xxkS7eI0tQN6+WNReRULLCAuT4RDGkrjfObBNXMJ3WT8XdK+aXTr5nnBKuh+PxIevM0EjJgkxA==", + "version": "4.8.2", + "resolved": "https://registry.npmjs.org/selenium-webdriver/-/selenium-webdriver-4.8.2.tgz", + "integrity": "sha512-d2dcpDLPcXlBy5qcPtB1B8RYTtj1N+JiHQLViFx3OP+i5hqkAuqTfJEYUh4qNX11S4NvbxjteiwN3OPwK3vPVw==", "dev": true, "dependencies": { "jszip": "^3.10.0", @@ -4043,9 +4043,9 @@ } }, "node_modules/terser": { - "version": "5.16.5", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.16.5.tgz", - "integrity": "sha512-qcwfg4+RZa3YvlFh0qjifnzBHjKGNbtDo9yivMqMFDy9Q6FSaQWSB/j1xKhsoUFJIqDOM3TsN6D5xbrMrFcHbg==", + "version": "5.16.8", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.16.8.tgz", + "integrity": "sha512-QI5g1E/ef7d+PsDifb+a6nnVgC4F22Bg6T0xrBrz6iloVB4PUkkunp6V8nzoOOZJIzjWVdAGqCdlKlhLq/TbIA==", "dev": true, "dependencies": { "@jridgewell/source-map": "^0.3.2", @@ -4061,16 +4061,16 @@ } }, "node_modules/terser-webpack-plugin": { - "version": "5.3.6", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.6.tgz", - "integrity": "sha512-kfLFk+PoLUQIbLmB1+PZDMRSZS99Mp+/MHqDNmMA6tOItzRt+Npe3E+fsMs5mfcM0wCtrrdU387UnV+vnSffXQ==", + "version": "5.3.7", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.7.tgz", + "integrity": "sha512-AfKwIktyP7Cu50xNjXF/6Qb5lBNzYaWpU6YfoX3uZicTx0zTy0stDDCsvjDapKsSDvOeWo5MEq4TmdBy2cNoHw==", "dev": true, "dependencies": { - "@jridgewell/trace-mapping": "^0.3.14", + "@jridgewell/trace-mapping": "^0.3.17", "jest-worker": "^27.4.5", "schema-utils": "^3.1.1", - "serialize-javascript": "^6.0.0", - "terser": "^5.14.1" + "serialize-javascript": "^6.0.1", + "terser": "^5.16.5" }, "engines": { "node": ">= 10.13.0" @@ -4766,9 +4766,9 @@ } }, "node_modules/webpack": { - "version": "5.76.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.76.0.tgz", - "integrity": "sha512-l5sOdYBDunyf72HW8dF23rFtWq/7Zgvt/9ftMof71E/yUb1YLOBmTgA2K4vQthB3kotMrSj609txVE0dnr2fjA==", + "version": "5.76.3", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.76.3.tgz", + "integrity": "sha512-18Qv7uGPU8b2vqGeEEObnfICyw2g39CHlDEK4I7NK13LOur1d0HGmGNKGT58Eluwddpn3oEejwvBPoP4M7/KSA==", "dev": true, "dependencies": { "@types/eslint-scope": "^3.7.3", @@ -5034,9 +5034,9 @@ "dev": true }, "node_modules/ws": { - "version": "8.12.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.12.1.tgz", - "integrity": "sha512-1qo+M9Ba+xNhPB+YTWUlK6M17brTut5EXbcBaMRN5pH5dFrXz7lzz1ChFSUq3bOUl8yEvSenhHmYUNJxFzdJew==", + "version": "8.13.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.13.0.tgz", + "integrity": "sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==", "dev": true, "engines": { "node": ">=10.0.0" @@ -5409,9 +5409,9 @@ } }, "@types/eslint": { - "version": "8.21.1", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.21.1.tgz", - "integrity": "sha512-rc9K8ZpVjNcLs8Fp0dkozd5Pt2Apk1glO4Vgz8ix1u6yFByxfqo5Yavpy65o+93TAe24jr7v+eSBtFLvOQtCRQ==", + "version": "8.21.3", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.21.3.tgz", + "integrity": "sha512-fa7GkppZVEByMWGbTtE5MbmXWJTVbrjjaS8K6uQj+XtuuUv1fsuPAxhygfqLmsb/Ufb3CV8deFCpiMfAgi00Sw==", "dev": true, "requires": { "@types/estree": "*", @@ -5493,9 +5493,9 @@ "dev": true }, "@types/node": { - "version": "16.18.14", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.14.tgz", - "integrity": "sha512-wvzClDGQXOCVNU4APPopC2KtMYukaF1MN/W3xAmslx22Z4/IF1/izDMekuyoUlwfnDHYCIZGaj7jMwnJKBTxKw==", + "version": "16.18.21", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.21.tgz", + "integrity": "sha512-TassPGd0AEZWA10qcNnXnSNwHlLfSth8XwUaWc3gTSDmBz/rKb613Qw5qRf6o2fdRBrLbsgeC9PMZshobkuUqg==", "dev": true }, "@types/responselike": { @@ -5508,9 +5508,9 @@ } }, "@types/selenium-webdriver": { - "version": "4.1.12", - "resolved": "https://registry.npmjs.org/@types/selenium-webdriver/-/selenium-webdriver-4.1.12.tgz", - "integrity": "sha512-3DxuYHEbzIyUtuICRtxXtJomdOOkBeCbkXAlAPm/h8ArIn/ArWNnVSC6tIj/ECZ/sdxBoI0F/wuwcpxBew3hGw==", + "version": "4.1.13", + "resolved": "https://registry.npmjs.org/@types/selenium-webdriver/-/selenium-webdriver-4.1.13.tgz", + "integrity": "sha512-kGpIh7bvu4HGCJXl4PEJ53kzpG4iXlRDd66SNNCfJ58QhFuk9skOm57lVffZap5ChEOJwbge/LJ9IVGVC8EEOg==", "dev": true, "requires": { "@types/ws": "*" @@ -6034,9 +6034,9 @@ "dev": true }, "caniuse-lite": { - "version": "1.0.30001458", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001458.tgz", - "integrity": "sha512-lQ1VlUUq5q9ro9X+5gOEyH7i3vm+AYVT1WDCVB69XOZ17KZRhnZ9J0Sqz7wTHQaLBJccNCHq8/Ww5LlOIZbB0w==", + "version": "1.0.30001470", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001470.tgz", + "integrity": "sha512-065uNwY6QtHCBOExzbV6m236DDhYCCtPmQUCoQtwkVqzud8v5QPidoMr6CoMkC2nfp6nksjttqWQRRh75LqUmA==", "dev": true }, "chainsaw": { @@ -6389,9 +6389,9 @@ } }, "electron-to-chromium": { - "version": "1.4.315", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.315.tgz", - "integrity": "sha512-ndBQYz3Eyy3rASjjQ9poMJGoAlsZ/aZnq6GBsGL4w/4sWIAwiUHVSsMuADbxa8WJw7pZ0oxLpGbtoDt4vRTdCg==", + "version": "1.4.340", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.340.tgz", + "integrity": "sha512-zx8hqumOqltKsv/MF50yvdAlPF9S/4PXbyfzJS6ZGhbddGkRegdwImmfSVqCkEziYzrIGZ/TlrzBND4FysfkDg==", "dev": true }, "emoji-regex": { @@ -6761,9 +6761,9 @@ } }, "graceful-fs": { - "version": "4.2.10", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", - "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==" + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" }, "growl": { "version": "1.10.5", @@ -6814,15 +6814,15 @@ "dev": true }, "htmlparser2": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.1.tgz", - "integrity": "sha512-4lVbmc1diZC7GUJQtRQ5yBAeUCL1exyMwmForWkRLnwyzWBFxN633SALPMGYaWZvKe9j1pRZJpauvmxENSp/EA==", + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.2.tgz", + "integrity": "sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==", "dev": true, "requires": { "domelementtype": "^2.3.0", - "domhandler": "^5.0.2", + "domhandler": "^5.0.3", "domutils": "^3.0.1", - "entities": "^4.3.0" + "entities": "^4.4.0" } }, "http-cache-semantics": { @@ -7709,9 +7709,9 @@ } }, "readable-stream": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.1.tgz", - "integrity": "sha512-+rQmrWMYGA90yenhTYsLWAsLsqVC8osOw6PKE1HDYiO0gdPeKe/xDHNzIAIn4C91YQ6oenEhfYqqc1883qHbjQ==", + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", "dev": true, "requires": { "inherits": "^2.0.3", @@ -7769,9 +7769,9 @@ "dev": true }, "qs": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", - "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "version": "6.11.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.1.tgz", + "integrity": "sha512-0wsrzgTz/kAVIeuxSjnpGC56rzYtr6JT/2BwEvMaPhFIoYa1aGO8LbzuU1R0uUYQkLpWBTOj0l/CLAJB64J6nQ==", "dev": true, "requires": { "side-channel": "^1.0.4" @@ -7968,9 +7968,9 @@ } }, "selenium-webdriver": { - "version": "4.8.1", - "resolved": "https://registry.npmjs.org/selenium-webdriver/-/selenium-webdriver-4.8.1.tgz", - "integrity": "sha512-p4MtfhCQdcV6xxkS7eI0tQN6+WNReRULLCAuT4RDGkrjfObBNXMJ3WT8XdK+aXTr5nnBKuh+PxIevM0EjJgkxA==", + "version": "4.8.2", + "resolved": "https://registry.npmjs.org/selenium-webdriver/-/selenium-webdriver-4.8.2.tgz", + "integrity": "sha512-d2dcpDLPcXlBy5qcPtB1B8RYTtj1N+JiHQLViFx3OP+i5hqkAuqTfJEYUh4qNX11S4NvbxjteiwN3OPwK3vPVw==", "dev": true, "requires": { "jszip": "^3.10.0", @@ -8205,9 +8205,9 @@ } }, "terser": { - "version": "5.16.5", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.16.5.tgz", - "integrity": "sha512-qcwfg4+RZa3YvlFh0qjifnzBHjKGNbtDo9yivMqMFDy9Q6FSaQWSB/j1xKhsoUFJIqDOM3TsN6D5xbrMrFcHbg==", + "version": "5.16.8", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.16.8.tgz", + "integrity": "sha512-QI5g1E/ef7d+PsDifb+a6nnVgC4F22Bg6T0xrBrz6iloVB4PUkkunp6V8nzoOOZJIzjWVdAGqCdlKlhLq/TbIA==", "dev": true, "requires": { "@jridgewell/source-map": "^0.3.2", @@ -8217,16 +8217,16 @@ } }, "terser-webpack-plugin": { - "version": "5.3.6", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.6.tgz", - "integrity": "sha512-kfLFk+PoLUQIbLmB1+PZDMRSZS99Mp+/MHqDNmMA6tOItzRt+Npe3E+fsMs5mfcM0wCtrrdU387UnV+vnSffXQ==", + "version": "5.3.7", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.7.tgz", + "integrity": "sha512-AfKwIktyP7Cu50xNjXF/6Qb5lBNzYaWpU6YfoX3uZicTx0zTy0stDDCsvjDapKsSDvOeWo5MEq4TmdBy2cNoHw==", "dev": true, "requires": { - "@jridgewell/trace-mapping": "^0.3.14", + "@jridgewell/trace-mapping": "^0.3.17", "jest-worker": "^27.4.5", "schema-utils": "^3.1.1", - "serialize-javascript": "^6.0.0", - "terser": "^5.14.1" + "serialize-javascript": "^6.0.1", + "terser": "^5.16.5" }, "dependencies": { "ajv": { @@ -8751,9 +8751,9 @@ } }, "webpack": { - "version": "5.76.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.76.0.tgz", - "integrity": "sha512-l5sOdYBDunyf72HW8dF23rFtWq/7Zgvt/9ftMof71E/yUb1YLOBmTgA2K4vQthB3kotMrSj609txVE0dnr2fjA==", + "version": "5.76.3", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.76.3.tgz", + "integrity": "sha512-18Qv7uGPU8b2vqGeEEObnfICyw2g39CHlDEK4I7NK13LOur1d0HGmGNKGT58Eluwddpn3oEejwvBPoP4M7/KSA==", "dev": true, "requires": { "@types/eslint-scope": "^3.7.3", @@ -8935,9 +8935,9 @@ "dev": true }, "ws": { - "version": "8.12.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.12.1.tgz", - "integrity": "sha512-1qo+M9Ba+xNhPB+YTWUlK6M17brTut5EXbcBaMRN5pH5dFrXz7lzz1ChFSUq3bOUl8yEvSenhHmYUNJxFzdJew==", + "version": "8.13.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.13.0.tgz", + "integrity": "sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==", "dev": true, "requires": {} }, From 7cab0833ca336d0e998bb62b2998d2e14dcb3f3e Mon Sep 17 00:00:00 2001 From: Sheng Chen Date: Tue, 4 Apr 2023 10:06:33 +0800 Subject: [PATCH 147/352] refactor: Use visitor pattern to get the explorer nodes (#729) --------- Signed-off-by: Sheng Chen --- .../jdtls/ext/core/PackageCommand.java | 304 +++++++----------- .../jdtls/ext/core/model/PackageNode.java | 56 +++- .../ext/core/parser/JavaResourceVisitor.java | 109 +++++++ .../jdtls/ext/core/parser/ResourceSet.java | 102 ++++++ .../ext/core/parser/ResourceVisitor.java | 50 +++ src/views/folderNode.ts | 1 + 6 files changed, 428 insertions(+), 194 deletions(-) create mode 100644 jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/parser/JavaResourceVisitor.java create mode 100644 jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/parser/ResourceSet.java create mode 100644 jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/parser/ResourceVisitor.java diff --git a/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/PackageCommand.java b/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/PackageCommand.java index 43cf4f5c..d5839f8f 100644 --- a/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/PackageCommand.java +++ b/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/PackageCommand.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2018 Microsoft Corporation and others. + * Copyright (c) 2018-2023 Microsoft Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at @@ -16,9 +16,9 @@ import java.util.Collections; import java.util.Comparator; import java.util.HashMap; +import java.util.LinkedList; import java.util.List; import java.util.Map; -import java.util.Objects; import java.util.function.BiFunction; import java.util.stream.Collectors; @@ -31,14 +31,12 @@ import org.eclipse.core.resources.IWorkspaceRoot; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.CoreException; -import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.OperationCanceledException; import org.eclipse.core.runtime.Path; import org.eclipse.core.runtime.Status; import org.eclipse.jdt.core.IClassFile; -import org.eclipse.jdt.core.IClasspathAttribute; import org.eclipse.jdt.core.IClasspathEntry; import org.eclipse.jdt.core.IJarEntryResource; import org.eclipse.jdt.core.IJavaElement; @@ -53,7 +51,6 @@ import org.eclipse.jdt.internal.core.JarEntryDirectory; import org.eclipse.jdt.internal.core.JarEntryFile; import org.eclipse.jdt.internal.core.JarEntryResource; -import org.eclipse.jdt.internal.core.JrtPackageFragmentRoot; import org.eclipse.jdt.ls.core.internal.JDTUtils; import org.eclipse.jdt.ls.core.internal.ProjectUtils; import org.eclipse.lsp4j.jsonrpc.json.adapters.CollectionTypeAdapter; @@ -66,6 +63,9 @@ import com.microsoft.jdtls.ext.core.model.PackageRootNode; import com.microsoft.jdtls.ext.core.model.Trie; import com.microsoft.jdtls.ext.core.model.TrieNode; +import com.microsoft.jdtls.ext.core.parser.JavaResourceVisitor; +import com.microsoft.jdtls.ext.core.parser.ResourceSet; +import com.microsoft.jdtls.ext.core.parser.ResourceVisitor; public class PackageCommand { @@ -258,90 +258,89 @@ private static List getParentAncestorNodes(IResource element) throw private static List getContainers(PackageParams query, IProgressMonitor pm) { IJavaProject javaProject = getJavaProject(query.getProjectUri()); if (javaProject != null) { + List children = new LinkedList<>(); + boolean hasReferencedLibraries = false; try { IClasspathEntry[] references = javaProject.getRawClasspath(); - List result = Arrays.stream(references) - .filter(entry -> entry.getEntryKind() != IClasspathEntry.CPE_LIBRARY && entry.getEntryKind() != IClasspathEntry.CPE_VARIABLE) - .map(entry -> PackageNode.createNodeForClasspathEntry(entry, javaProject, NodeKind.CONTAINER)) - .filter(containerNode -> containerNode != null) - .collect(Collectors.toList()); - boolean isReferencedLibrariesExist = Arrays.stream(references) - .anyMatch(entry -> entry.getEntryKind() == IClasspathEntry.CPE_LIBRARY || entry.getEntryKind() == IClasspathEntry.CPE_VARIABLE); - // Invisble project will always have the referenced libraries entry - if (!ProjectUtils.isVisibleProject(javaProject.getProject())) { - result.add(PackageNode.REFERENCED_LIBRARIES_CONTAINER); - } else if (isReferencedLibrariesExist) { - result.add(PackageNode.IMMUTABLE_REFERENCED_LIBRARIES_CONTAINER); + for (IClasspathEntry entry : references) { + if (entry.getEntryKind() != IClasspathEntry.CPE_LIBRARY && entry.getEntryKind() != IClasspathEntry.CPE_VARIABLE) { + children.add(entry); + } else { + hasReferencedLibraries = true; + } } - return result; } catch (CoreException e) { JdtlsExtActivator.logException("Problem load project library ", e); } + + ResourceSet resourceSet = new ResourceSet(children); + ResourceVisitor visitor = new JavaResourceVisitor(javaProject); + resourceSet.accept(visitor); + List result = visitor.getNodes(); + + // Invisble project will always have the referenced libraries entry + if (!ProjectUtils.isVisibleProject(javaProject.getProject())) { + result.add(PackageNode.REFERENCED_LIBRARIES_CONTAINER); + } else if (hasReferencedLibraries) { + result.add(PackageNode.IMMUTABLE_REFERENCED_LIBRARIES_CONTAINER); + } + return result; } return Collections.emptyList(); } private static List getPackageFragmentRoots(PackageParams query, IProgressMonitor pm) { - ArrayList children = new ArrayList<>(); IJavaProject javaProject = getJavaProject(query.getProjectUri()); + if (javaProject == null) { + return Collections.emptyList(); + } - if (javaProject != null) { - try { - IClasspathEntry[] references = javaProject.getRawClasspath(); - IClasspathEntry containerEntry = null; - for (IClasspathEntry reference : references) { - if (reference.getPath().equals(Path.fromPortableString(query.getPath()))) { - containerEntry = reference; - break; - } + List children = new LinkedList<>(); + try { + IClasspathEntry[] references = javaProject.getRawClasspath(); + if (query.getPath().equals(PackageNode.REFERENCED_LIBRARIES_PATH)) { + // Process referenced libraries + children.addAll(Arrays.stream(references) + .filter(entry -> entry.getEntryKind() == IClasspathEntry.CPE_LIBRARY || entry.getEntryKind() == IClasspathEntry.CPE_VARIABLE) + .collect(Collectors.toList())); + } else { + IPackageFragmentRoot[] packageFragmentRoots = findPackageFragmentRoots(javaProject, query); + if (packageFragmentRoots == null) { + return Collections.emptyList(); } - if (containerEntry != null) { - IPackageFragmentRoot[] packageFragmentRoots = javaProject.findPackageFragmentRoots(containerEntry); - for (IPackageFragmentRoot fragmentRoot : packageFragmentRoots) { - PackageRootNode node = PackageNode.createNodeForPackageFragmentRoot(fragmentRoot); - if (StringUtils.isNotBlank(node.getName())) { - node.setHandlerIdentifier(fragmentRoot.getHandleIdentifier()); - if (fragmentRoot instanceof JrtPackageFragmentRoot) { - node.setModuleName(fragmentRoot.getModuleDescription().getElementName()); - } - - IClasspathEntry resolvedClasspathEntry = fragmentRoot.getResolvedClasspathEntry(); - if (resolvedClasspathEntry != null) { - for (IClasspathAttribute attribute : resolvedClasspathEntry.getExtraAttributes()) { - node.setMetaDataValue(attribute.getName(), attribute.getValue()); - } - } - - children.add(node); - } else { - // for invisible project, the package root name may become empty after removing the '_', - // in this case, we skip this root node from showing in the explorer and keep finding its children. - PackageParams subQuery = new PackageParams(NodeKind.PACKAGEROOT, query.getProjectUri(), - query.getPath(), fragmentRoot.getHandleIdentifier()); - List packageNodes = getPackages(subQuery, pm); - children.addAll(packageNodes); - } - } - return children; - } else if (query.getPath().equals(PackageNode.REFERENCED_LIBRARIES_PATH)) { - // Process referenced libraries - List referLibs = Arrays.stream(references).filter(entry -> entry.getEntryKind() == IClasspathEntry.CPE_LIBRARY) - .map(classpath -> PackageNode.createNodeForClasspathEntry(classpath, javaProject, NodeKind.PACKAGEROOT)) - .filter(entry -> entry != null) - .collect(Collectors.toList()); - List referVariables = Arrays.stream(references).filter(entry -> entry.getEntryKind() == IClasspathEntry.CPE_VARIABLE) - .map(classpath -> PackageNode.createNodeForClasspathVariable(classpath)).filter(entry -> entry != null) - .collect(Collectors.toList()); - children.addAll(referLibs); - children.addAll(referVariables); - return children; + + for (IPackageFragmentRoot fragmentRoot : packageFragmentRoots) { + children.add(fragmentRoot); } - } catch (CoreException e) { - JdtlsExtActivator.logException("Problem load project JAR entries ", e); } + } catch (CoreException e) { + JdtlsExtActivator.logException("Problem load project JAR entries ", e); } - return Collections.emptyList(); + ResourceSet resourceSet = new ResourceSet(children); + ResourceVisitor visitor = new JavaResourceVisitor(javaProject); + resourceSet.accept(visitor); + return visitor.getNodes(); + } + + private static IPackageFragmentRoot[] findPackageFragmentRoots(IJavaProject javaProject, PackageParams query) { + try { + IClasspathEntry[] references = javaProject.getRawClasspath(); + IClasspathEntry containerEntry = null; + for (IClasspathEntry reference : references) { + if (reference.getPath().equals(Path.fromPortableString(query.getPath()))) { + containerEntry = reference; + break; + } + } + if (containerEntry != null) { + return javaProject.findPackageFragmentRoots(containerEntry); + } + } catch (CoreException e) { + JdtlsExtActivator.log(e); + } + + return null; } private static List getPackages(PackageParams query, IProgressMonitor pm) { @@ -351,8 +350,11 @@ private static List getPackages(PackageParams query, IProgressMonit throw new CoreException( new Status(IStatus.ERROR, JdtlsExtActivator.PLUGIN_ID, String.format("No package root found for %s", query.getPath()))); } - Object[] result = getPackageFragmentRootContent(packageRoot, query.isHierarchicalView(), pm); - return convertToPackageNode(result, packageRoot, pm); + List result = getPackageFragmentRootContent(packageRoot, query.isHierarchicalView(), pm); + ResourceSet resourceSet = new ResourceSet(result); + ResourceVisitor visitor = new JavaResourceVisitor(packageRoot.getJavaProject()); + resourceSet.accept(visitor); + return visitor.getNodes(); } catch (CoreException e) { JdtlsExtActivator.logException("Problem load project package ", e); } @@ -379,65 +381,53 @@ private static IPackageFragmentRoot getPackageFragmentRootFromQuery(PackageParam } private static List getRootTypes(PackageParams query, IProgressMonitor pm) { + IPackageFragment packageFragment = (IPackageFragment) JavaCore.create(query.getHandlerIdentifier()); + List children = getChildrenForPackage(packageFragment); + ResourceSet resourceSet = new ResourceSet(children); + ResourceVisitor visitor = new JavaResourceVisitor(packageFragment.getJavaProject()); + resourceSet.accept(visitor); + return visitor.getNodes(); + } + + public static List getChildrenForPackage(IPackageFragment packageFragment) { + if (packageFragment == null) { + return Collections.emptyList(); + } + + List children = new LinkedList<>(); try { - IPackageFragment packageFragment = (IPackageFragment) JavaCore.create(query.getHandlerIdentifier()); - if (packageFragment != null) { - List primaryTypes = new ArrayList<>(); - for (IJavaElement element : packageFragment.getChildren()) { - if (element instanceof ITypeRoot) { - // Filter out the inner class files - if (element instanceof IClassFile && element.getElementName().contains("$")) { - continue; - } - IType primaryType = ((ITypeRoot) element).findPrimaryType(); - if (primaryType != null) { - primaryTypes.add(primaryType); - } + for (IJavaElement element : packageFragment.getChildren()) { + if (element instanceof ITypeRoot) { + // Filter out the inner class files + if (element instanceof IClassFile && element.getElementName().contains("$")) { + continue; + } + IType primaryType = ((ITypeRoot) element).findPrimaryType(); + if (primaryType != null) { + children.add(primaryType); } } - Object[] nonJavaResources = packageFragment.getNonJavaResources(); - List rootTypeNodes = primaryTypes.stream() - .map(PackageNode::createNodeForPrimaryType) - .collect(Collectors.toList()); - if (nonJavaResources.length == 0) { - return rootTypeNodes; - } - // when .java files and other .properties files are mixed up - rootTypeNodes.addAll( - Arrays.stream(nonJavaResources).map(resource -> { - if (resource instanceof IFile) { - IFile file = (IFile) resource; - PackageNode item = new PackageNode(file.getName(), file.getFullPath().toPortableString(), NodeKind.FILE); - item.setUri(JDTUtils.getFileURI(file)); - return item; - } else if (resource instanceof IFolder) { - IFolder folder = (IFolder) resource; - PackageNode item = new PackageNode(folder.getName(), folder.getFullPath().toPortableString(), NodeKind.FOLDER); - item.setUri(JDTUtils.getFileURI(folder)); - return item; - } else if (resource instanceof JarEntryFile) { - JarEntryFile file = (JarEntryFile) resource; - PackageNode entry = new PackageNode(file.getName(), file.getFullPath().toPortableString(), NodeKind.FILE); - entry.setUri(ExtUtils.toUri((JarEntryFile) resource)); - return entry; - } - return null; - }).filter(Objects::nonNull).collect(Collectors.toList())); - return rootTypeNodes; } - } catch (CoreException e) { - JdtlsExtActivator.logException("Problem load project classfile list ", e); + + Object[] nonJavaResources = packageFragment.getNonJavaResources(); + for (Object resource : nonJavaResources) { + children.add(resource); + } + } catch (JavaModelException e) { + JdtlsExtActivator.log(e); } - return Collections.emptyList(); + + return children; } private static List getFolderChildren(PackageParams query, IProgressMonitor pm) { try { - IPackageFragmentRoot packageRoot = (IPackageFragmentRoot) JavaCore.create(query.getHandlerIdentifier()); + IPackageFragmentRoot packageRoot = getPackageFragmentRootFromQuery(query); if (packageRoot == null) { throw new CoreException( new Status(IStatus.ERROR, JdtlsExtActivator.PLUGIN_ID, String.format("No package root found for %s", query.getPath()))); } + List children = new LinkedList<>(); if (packageRoot.getKind() == IPackageFragmentRoot.K_BINARY) { Object[] resources = packageRoot.getNonJavaResources(); for (Object resource : resources) { @@ -446,9 +436,9 @@ private static List getFolderChildren(PackageParams query, IProgres } if (resource instanceof JarEntryDirectory) { JarEntryDirectory directory = (JarEntryDirectory) resource; - Object[] children = findJarDirectoryChildren(directory, query.getPath()); + Object[] directoryChildren = findJarDirectoryChildren(directory, query.getPath()); if (children != null) { - return convertToPackageNode(children, null, pm); + children.addAll(Arrays.asList(directoryChildren)); } } } @@ -456,14 +446,19 @@ private static List getFolderChildren(PackageParams query, IProgres IJavaProject javaProject = packageRoot.getJavaProject(); IFolder folder = javaProject.getProject().getFolder(new Path(query.getPath()).makeRelativeTo(javaProject.getProject().getFullPath())); if (folder != null && folder.exists()) { - Object[] children = JavaCore.create(folder) != null ? Arrays.stream(folder.members()).filter(t -> t instanceof IFile).toArray() - : folder.members(); - if (children != null) { - return convertToPackageNode(children, null, pm); - } + boolean isJavaElement = JavaCore.create(folder) != null; + children.addAll(Arrays.stream(folder.members()) + .filter(f -> isJavaElement ? f instanceof IFile : true) + .collect(Collectors.toList()) + ); } } + ResourceSet resourceSet = new ResourceSet(children); + ResourceVisitor visitor = new JavaResourceVisitor(packageRoot.getJavaProject()); + resourceSet.accept(visitor); + return visitor.getNodes(); + } catch (CoreException e) { JdtlsExtActivator.logException("Problem load project classfile list ", e); } @@ -482,7 +477,7 @@ private static List getFolderChildren(PackageParams query, IProgres * @param isHierarchicalView whether the explorer is in hierarchical mode or not * @param pm the progress monitor */ - private static Object[] getPackageFragmentRootContent(IPackageFragmentRoot root, boolean isHierarchicalView, IProgressMonitor pm) throws CoreException { + public static List getPackageFragmentRootContent(IPackageFragmentRoot root, boolean isHierarchicalView, IProgressMonitor pm) throws CoreException { ArrayList result = new ArrayList<>(); if (isHierarchicalView) { Map map = new HashMap<>(); @@ -519,61 +514,6 @@ private static Object[] getPackageFragmentRootContent(IPackageFragmentRoot root, result.add(moduleDescription.getClassFile()); } } - return result.toArray(); - } - - private static List convertToPackageNode(Object[] rootContent, IPackageFragmentRoot packageRoot, - IProgressMonitor pm) throws JavaModelException { - List result = new ArrayList<>(); - for (Object root : rootContent) { - if (root instanceof IPackageFragment) { - IPackageFragment fragment = (IPackageFragment) root; - if (fragment.isDefaultPackage()) { - // directly show root types under default package - PackageParams subQuery = new PackageParams(NodeKind.PACKAGE, packageRoot.getJavaProject().getProject().getLocationURI().toString(), - fragment.getPath().toPortableString(), fragment.getHandleIdentifier()); - List packageNodes = getRootTypes(subQuery, pm); - result.addAll(packageNodes); - } else { - PackageNode entry = PackageNode.createNodeForPackageFragment(fragment); - if (fragment.getResource() != null) { - entry.setUri(fragment.getResource().getLocationURI().toString()); - } else { - entry.setUri(fragment.getPath().toFile().toURI().toString()); - } - result.add(entry); - } - } else if (root instanceof IClassFile) { - IClassFile classFile = (IClassFile) root; - PackageNode entry = new PackageNode(classFile.getElementName(), null, NodeKind.FILE); - entry.setUri(JDTUtils.toUri(classFile)); - result.add(entry); - } else if (root instanceof JarEntryResource) { - PackageNode jarNode = getJarEntryResource((JarEntryResource) root); - if (jarNode != null) { - result.add(jarNode); - } - } else if (root instanceof IFile) { - IFile file = (IFile) root; - PackageNode entry = new PackageNode(file.getName(), file.getFullPath().toPortableString(), NodeKind.FILE); - entry.setUri(JDTUtils.getFileURI(file)); - result.add(entry); - } else if (root instanceof IFolder) { - IFolder folder = (IFolder) root; - String displayName = folder.getName(); - if (packageRoot != null) { - // together with package list, we need to provide full folder name relative to - // package root - IPath path = folder.getFullPath().makeRelativeTo(packageRoot.getPath()); - displayName = StringUtils.replace(path.toPortableString(), "/", "."); - } - - PackageNode entry = new PackageNode(displayName, folder.getFullPath().toPortableString(), NodeKind.FOLDER); - entry.setUri(JDTUtils.getFileURI(folder)); - result.add(entry); - } - } - return result; } diff --git a/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/model/PackageNode.java b/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/model/PackageNode.java index 9dbab874..ec60cd21 100644 --- a/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/model/PackageNode.java +++ b/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/model/PackageNode.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2018 Microsoft Corporation and others. + * Copyright (c) 2018-2023 Microsoft Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at @@ -25,15 +25,18 @@ import org.eclipse.core.resources.IResource; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IPath; +import org.eclipse.jdt.core.IClasspathAttribute; import org.eclipse.jdt.core.IClasspathContainer; import org.eclipse.jdt.core.IClasspathEntry; import org.eclipse.jdt.core.IJavaElement; import org.eclipse.jdt.core.IJavaProject; +import org.eclipse.jdt.core.IModuleDescription; import org.eclipse.jdt.core.IPackageFragment; import org.eclipse.jdt.core.IPackageFragmentRoot; import org.eclipse.jdt.core.IType; import org.eclipse.jdt.core.JavaCore; import org.eclipse.jdt.core.JavaModelException; +import org.eclipse.jdt.internal.core.JrtPackageFragmentRoot; import org.eclipse.jdt.ls.core.internal.JDTUtils; import org.eclipse.jdt.ls.core.internal.ProjectUtils; @@ -176,17 +179,23 @@ public static PackageNode createNodeForProject(IJavaElement javaElement) { return projectNode; } + public static PackageNode createNodeForFile(IFile file) { + PackageNode entry = new PackageNode(file.getName(), file.getFullPath().toPortableString(), NodeKind.FILE); + entry.setUri(JDTUtils.getFileURI(file)); + return entry; + } + + public static PackageNode createNodeForFolder(IFolder folder) { + PackageNode entry = new PackageNode(folder.getName(), folder.getFullPath().toPortableString(), NodeKind.FOLDER); + entry.setUri(JDTUtils.getFileURI(folder)); + return entry; + } + public static PackageNode createNodeForResource(IResource resource) { if (resource instanceof IFile) { - IFile file = (IFile) resource; - PackageNode entry = new PackageNode(file.getName(), file.getFullPath().toPortableString(), NodeKind.FILE); - entry.setUri(JDTUtils.getFileURI(file)); - return entry; + return createNodeForFile((IFile) resource); } else if (resource instanceof IFolder) { - IFolder folder = (IFolder) resource; - PackageNode entry = new PackageNode(folder.getName(), folder.getFullPath().toPortableString(), NodeKind.FOLDER); - entry.setUri(JDTUtils.getFileURI(folder)); - return entry; + return createNodeForFolder((IFolder) resource); } return null; } @@ -194,6 +203,11 @@ public static PackageNode createNodeForResource(IResource resource) { public static PackageNode createNodeForPackageFragment(IPackageFragment packageFragment) { PackageNode fragmentNode = new PackageNode(packageFragment.getElementName(), packageFragment.getPath().toPortableString(), NodeKind.PACKAGE); fragmentNode.setHandlerIdentifier(packageFragment.getHandleIdentifier()); + if (packageFragment.getResource() != null) { + fragmentNode.setUri(packageFragment.getResource().getLocationURI().toString()); + } else { + fragmentNode.setUri(packageFragment.getPath().toFile().toURI().toString()); + } return fragmentNode; } @@ -211,15 +225,16 @@ public static PackageNode createNodeForVirtualContainer(IPackageFragmentRoot pkg } public static PackageRootNode createNodeForPackageFragmentRoot(IPackageFragmentRoot pkgRoot) throws JavaModelException { + PackageRootNode node; String displayName = pkgRoot.getElementName(); boolean isSourcePath = pkgRoot.getKind() == IPackageFragmentRoot.K_SOURCE; if (!isSourcePath) { IClasspathEntry entry = pkgRoot.getRawClasspathEntry(); // Process Referenced Variable if (entry.getEntryKind() == IClasspathEntry.CPE_VARIABLE) { - return createNodeForClasspathVariable(entry); + node = createNodeForClasspathVariable(entry); } else { - return new PackageRootNode(pkgRoot, displayName, NodeKind.PACKAGEROOT); + node = new PackageRootNode(pkgRoot, displayName, NodeKind.PACKAGEROOT); } } else { IJavaProject javaProject = pkgRoot.getJavaProject(); @@ -231,8 +246,25 @@ public static PackageRootNode createNodeForPackageFragmentRoot(IPackageFragmentR relativePath = relativePath.removeFirstSegments(1); // Remove the '_' prefix } displayName = relativePath.toPortableString(); - return new PackageRootNode(pkgRoot, displayName, NodeKind.PACKAGEROOT); + node = new PackageRootNode(pkgRoot, displayName, NodeKind.PACKAGEROOT); } + + node.setHandlerIdentifier(pkgRoot.getHandleIdentifier()); + if (pkgRoot instanceof JrtPackageFragmentRoot) { + IModuleDescription moduleDescription = pkgRoot.getModuleDescription(); + if (moduleDescription != null) { + node.setModuleName(moduleDescription.getElementName()); + } + } + + IClasspathEntry resolvedClasspathEntry = pkgRoot.getResolvedClasspathEntry(); + if (resolvedClasspathEntry != null) { + for (IClasspathAttribute attribute : resolvedClasspathEntry.getExtraAttributes()) { + node.setMetaDataValue(attribute.getName(), attribute.getValue()); + } + } + + return node; } /** diff --git a/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/parser/JavaResourceVisitor.java b/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/parser/JavaResourceVisitor.java new file mode 100644 index 00000000..9d7a4f4e --- /dev/null +++ b/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/parser/JavaResourceVisitor.java @@ -0,0 +1,109 @@ +/******************************************************************************* + * Copyright (c) 2023 Microsoft Corporation and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Microsoft Corporation - initial API and implementation + *******************************************************************************/ + +package com.microsoft.jdtls.ext.core.parser; + +import java.util.LinkedList; +import java.util.List; + +import org.eclipse.core.resources.IFile; +import org.eclipse.core.resources.IFolder; +import org.eclipse.jdt.core.IClassFile; +import org.eclipse.jdt.core.IClasspathEntry; +import org.eclipse.jdt.core.IJarEntryResource; +import org.eclipse.jdt.core.IJavaProject; +import org.eclipse.jdt.core.IPackageFragment; +import org.eclipse.jdt.core.IPackageFragmentRoot; +import org.eclipse.jdt.core.IType; +import org.eclipse.jdt.core.JavaModelException; +import org.eclipse.jdt.ls.core.internal.JDTUtils; + +import com.microsoft.jdtls.ext.core.ExtUtils; +import com.microsoft.jdtls.ext.core.JdtlsExtActivator; +import com.microsoft.jdtls.ext.core.model.NodeKind; +import com.microsoft.jdtls.ext.core.model.PackageNode; + +public class JavaResourceVisitor implements ResourceVisitor { + + private IJavaProject project; + private List nodes; + + public JavaResourceVisitor(IJavaProject project) { + this.project = project; + this.nodes = new LinkedList<>(); + } + + @Override + public void visit(IPackageFragment fragment) { + this.nodes.add(PackageNode.createNodeForPackageFragment(fragment)); + } + + @Override + public void visit(IType type) { + this.nodes.add(PackageNode.createNodeForPrimaryType(type)); + } + + @Override + public void visit(IClassFile classFile) { + PackageNode node = new PackageNode(classFile.getElementName(), null, NodeKind.FILE); + node.setUri(JDTUtils.toUri(classFile)); + this.nodes.add(node); + } + + @Override + public void visit(IFile file) { + this.nodes.add(PackageNode.createNodeForFile(file)); + } + + @Override + public void visit(IFolder folder) { + this.nodes.add(PackageNode.createNodeForFolder(folder)); + } + + @Override + public void visit(IJarEntryResource jarEntryResource) { + NodeKind kind = jarEntryResource.isFile() ? NodeKind.FILE : NodeKind.FOLDER; + PackageNode node = new PackageNode(jarEntryResource.getName(), + jarEntryResource.getFullPath().toPortableString(), kind); + node.setUri(ExtUtils.toUri(jarEntryResource)); + this.nodes.add(node); + } + + @Override + public void visit(IClasspathEntry entry) { + PackageNode node = null; + if (entry.getEntryKind() == IClasspathEntry.CPE_VARIABLE) { + node = PackageNode.createNodeForClasspathVariable(entry); + } else if (entry.getEntryKind() == IClasspathEntry.CPE_LIBRARY) { + node = PackageNode.createNodeForClasspathEntry(entry, this.project, NodeKind.PACKAGEROOT); + } else { + node = PackageNode.createNodeForClasspathEntry(entry, this.project, NodeKind.CONTAINER); + } + + if (node != null) { + this.nodes.add(node); + } + } + + @Override + public void visit(IPackageFragmentRoot packageFragmentRoot) { + try { + this.nodes.add(PackageNode.createNodeForPackageFragmentRoot(packageFragmentRoot)); + } catch (JavaModelException e) { + JdtlsExtActivator.log(e); + } + } + + @Override + public List getNodes() { + return nodes; + } +} diff --git a/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/parser/ResourceSet.java b/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/parser/ResourceSet.java new file mode 100644 index 00000000..f49105fb --- /dev/null +++ b/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/parser/ResourceSet.java @@ -0,0 +1,102 @@ +/******************************************************************************* + * Copyright (c) 2023 Microsoft Corporation and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Microsoft Corporation - initial API and implementation + *******************************************************************************/ + +package com.microsoft.jdtls.ext.core.parser; + +import java.util.List; +import java.util.ListIterator; +import java.util.Objects; + +import org.eclipse.core.resources.IFile; +import org.eclipse.core.resources.IFolder; +import org.eclipse.core.runtime.CoreException; +import org.eclipse.core.runtime.NullProgressMonitor; +import org.eclipse.jdt.core.IClassFile; +import org.eclipse.jdt.core.IClasspathEntry; +import org.eclipse.jdt.core.IJarEntryResource; +import org.eclipse.jdt.core.IJavaProject; +import org.eclipse.jdt.core.IPackageFragment; +import org.eclipse.jdt.core.IPackageFragmentRoot; +import org.eclipse.jdt.core.IType; +import org.eclipse.jdt.ls.core.internal.ProjectUtils; + +import com.microsoft.jdtls.ext.core.JdtlsExtActivator; +import com.microsoft.jdtls.ext.core.PackageCommand; + +// TODO: progress monitor +public class ResourceSet { + + private List resources; + + public ResourceSet(List resources) { + this.resources = resources; + } + + public void accept(ResourceVisitor visitor) { + ListIterator iterator = resources.listIterator(); + while (iterator.hasNext()) { + Object resource = iterator.next(); + if (resource == null) { + continue; + } + + if (resource instanceof IClasspathEntry) { + visitor.visit((IClasspathEntry) resource); + } else if (resource instanceof IPackageFragmentRoot) { + IPackageFragmentRoot pkgRoot = (IPackageFragmentRoot) resource; + IJavaProject javaProject = pkgRoot.getJavaProject(); + if (javaProject == null) { + continue; + } + + // skip invisible project's linked folder and add its children to the iterator. + if (!ProjectUtils.isVisibleProject(javaProject.getProject()) && + Objects.equals(ProjectUtils.WORKSPACE_LINK, pkgRoot.getElementName())) { + try { + List nextObjs = PackageCommand.getPackageFragmentRootContent( + pkgRoot, false, new NullProgressMonitor()); + for (Object nextObj : nextObjs) { + iterator.add(nextObj); + iterator.previous(); + } + } catch (CoreException e) { + JdtlsExtActivator.logException("Failed to get package fragment root content", e); + continue; + } + } else { + visitor.visit(pkgRoot); + } + } else if (resource instanceof IPackageFragment) { + IPackageFragment fragment = (IPackageFragment) resource; + // skil default package and add its children to the iterator. + if (fragment.isDefaultPackage()) { + List nextObjs = PackageCommand.getChildrenForPackage(fragment); + for (Object nextObj : nextObjs) { + iterator.add(nextObj); + iterator.previous(); + } + } else { + visitor.visit(fragment); + } + } else if (resource instanceof IType) { + visitor.visit((IType) resource); + } else if (resource instanceof IClassFile) { + visitor.visit((IClassFile) resource); + } else if (resource instanceof IFile) { + visitor.visit((IFile) resource); + } else if (resource instanceof IFolder) { + visitor.visit((IFolder) resource); + } else if (resource instanceof IJarEntryResource) { + visitor.visit((IJarEntryResource) resource); + } + } + } +} diff --git a/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/parser/ResourceVisitor.java b/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/parser/ResourceVisitor.java new file mode 100644 index 00000000..2030e08a --- /dev/null +++ b/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/parser/ResourceVisitor.java @@ -0,0 +1,50 @@ +/******************************************************************************* + * Copyright (c) 2023 Microsoft Corporation and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Microsoft Corporation - initial API and implementation + *******************************************************************************/ + +package com.microsoft.jdtls.ext.core.parser; + +import java.util.List; + +import org.eclipse.core.resources.IFile; +import org.eclipse.core.resources.IFolder; +import org.eclipse.jdt.core.IClassFile; +import org.eclipse.jdt.core.IClasspathEntry; +import org.eclipse.jdt.core.IJarEntryResource; +import org.eclipse.jdt.core.IPackageFragment; +import org.eclipse.jdt.core.IPackageFragmentRoot; +import org.eclipse.jdt.core.IType; + +import com.microsoft.jdtls.ext.core.model.PackageNode; + +/** + * A visitor to iterate through resources in a project and parse them to + * nodes in the UI. + */ +public interface ResourceVisitor { + + void visit(IClasspathEntry entry); + + void visit(IPackageFragmentRoot packageFragmentRoot); + + void visit(IPackageFragment fragment); + + void visit(IType type); + + void visit(IClassFile classFile); + + void visit(IFile file); + + void visit(IFolder folder); + + void visit(IJarEntryResource jarEntryResource); + + List getNodes(); +} diff --git a/src/views/folderNode.ts b/src/views/folderNode.ts index f17f1e9f..858a26eb 100644 --- a/src/views/folderNode.ts +++ b/src/views/folderNode.ts @@ -20,6 +20,7 @@ export class FolderNode extends DataNode { kind: NodeKind.Folder, projectUri: this._project.uri, path: this.path, + rootPath: this._rootNode.path, handlerIdentifier: this._rootNode.handlerIdentifier, }); } From 61333f2811ec433b4f3d12af98c035057c6ef8d4 Mon Sep 17 00:00:00 2001 From: Sheng Chen Date: Thu, 6 Apr 2023 09:25:58 +0800 Subject: [PATCH 148/352] refactor: Use factory pattern to create explorer nodes (#731) --------- Signed-off-by: Sheng Chen --- .../jdtls/ext/core/PackageCommand.java | 75 +++++++++-------- .../jdtls/ext/core/model/NodeKind.java | 8 +- package.json | 2 +- src/java/nodeData.ts | 8 +- src/views/containerNode.ts | 11 ++- src/views/dataNode.ts | 14 ++-- src/views/folderNode.ts | 19 ++--- src/views/hierarchicalPackageNode.ts | 27 ++---- src/views/hierarchicalPackageRootNode.ts | 45 ++++------ src/views/nodeFactory.ts | 83 ++++++++++++++++++- src/views/packageNode.ts | 19 +---- src/views/packageRootNode.ts | 24 ++---- src/views/projectNode.ts | 40 +++------ src/views/workspaceNode.ts | 8 +- 14 files changed, 200 insertions(+), 183 deletions(-) diff --git a/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/PackageCommand.java b/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/PackageCommand.java index d5839f8f..e34a3cd6 100644 --- a/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/PackageCommand.java +++ b/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/PackageCommand.java @@ -367,17 +367,20 @@ private static IPackageFragmentRoot getPackageFragmentRootFromQuery(PackageParam return packageRoot; } - // jar in Referenced Libraries must be constructed from path - IJavaProject javaProject = getJavaProject(query.getProjectUri()); - if (javaProject != null) { - try { - packageRoot = javaProject.findPackageFragmentRoot(Path.fromPortableString(query.getRootPath())); - } catch (JavaModelException e) { - return null; + if (query.getProjectUri() != null && query.getRootPath() != null) { + // jar in Referenced Libraries must be constructed from path + IJavaProject javaProject = getJavaProject(query.getProjectUri()); + if (javaProject != null) { + try { + return javaProject.findPackageFragmentRoot(Path.fromPortableString(query.getRootPath())); + } catch (JavaModelException e) { + JdtlsExtActivator.log(e); + return null; + } } } - return packageRoot; + return null; } private static List getRootTypes(PackageParams query, IProgressMonitor pm) { @@ -421,41 +424,47 @@ public static List getChildrenForPackage(IPackageFragment packageFragmen } private static List getFolderChildren(PackageParams query, IProgressMonitor pm) { + List children = new LinkedList<>(); + IJavaProject javaProject = null; try { IPackageFragmentRoot packageRoot = getPackageFragmentRootFromQuery(query); - if (packageRoot == null) { - throw new CoreException( - new Status(IStatus.ERROR, JdtlsExtActivator.PLUGIN_ID, String.format("No package root found for %s", query.getPath()))); - } - List children = new LinkedList<>(); - if (packageRoot.getKind() == IPackageFragmentRoot.K_BINARY) { - Object[] resources = packageRoot.getNonJavaResources(); - for (Object resource : resources) { - if (pm.isCanceled()) { - throw new OperationCanceledException(); - } - if (resource instanceof JarEntryDirectory) { - JarEntryDirectory directory = (JarEntryDirectory) resource; - Object[] directoryChildren = findJarDirectoryChildren(directory, query.getPath()); - if (children != null) { - children.addAll(Arrays.asList(directoryChildren)); + if (packageRoot != null) { + if (packageRoot.getKind() == IPackageFragmentRoot.K_BINARY) { + Object[] resources = packageRoot.getNonJavaResources(); + for (Object resource : resources) { + if (pm.isCanceled()) { + throw new OperationCanceledException(); + } + if (resource instanceof JarEntryDirectory) { + JarEntryDirectory directory = (JarEntryDirectory) resource; + Object[] directoryChildren = findJarDirectoryChildren(directory, query.getPath()); + if (children != null) { + children.addAll(Arrays.asList(directoryChildren)); + } } } + } else { + javaProject = packageRoot.getJavaProject(); + IFolder folder = ResourcesPlugin.getWorkspace().getRoot().getFolder(Path.fromPortableString(query.getPath())); + if (folder.exists()) { + boolean isJavaElement = JavaCore.create(folder) != null; + children.addAll(Arrays.stream(folder.members()) + .filter(f -> isJavaElement ? f instanceof IFile : true) + .collect(Collectors.toList()) + ); + } } } else { - IJavaProject javaProject = packageRoot.getJavaProject(); - IFolder folder = javaProject.getProject().getFolder(new Path(query.getPath()).makeRelativeTo(javaProject.getProject().getFullPath())); - if (folder != null && folder.exists()) { - boolean isJavaElement = JavaCore.create(folder) != null; - children.addAll(Arrays.stream(folder.members()) - .filter(f -> isJavaElement ? f instanceof IFile : true) - .collect(Collectors.toList()) - ); + // general resource folder. + IFolder folder = ResourcesPlugin.getWorkspace().getRoot().getFolder(Path.fromPortableString(query.getPath())); + if (folder.exists()) { + children.addAll(Arrays.asList(folder.members())); + javaProject = JavaCore.create(folder.getProject()); } } ResourceSet resourceSet = new ResourceSet(children); - ResourceVisitor visitor = new JavaResourceVisitor(packageRoot.getJavaProject()); + ResourceVisitor visitor = new JavaResourceVisitor(javaProject); resourceSet.accept(visitor); return visitor.getNodes(); diff --git a/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/model/NodeKind.java b/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/model/NodeKind.java index 4211b7f4..21b45be8 100644 --- a/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/model/NodeKind.java +++ b/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/model/NodeKind.java @@ -16,13 +16,13 @@ public enum NodeKind { PROJECT(2), - CONTAINER(3), + PACKAGEROOT(3), - PACKAGEROOT(4), + PACKAGE(4), - PACKAGE(5), + PRIMARYTYPE(5), - PRIMARYTYPE(6), + CONTAINER(6), FOLDER(7), diff --git a/package.json b/package.json index bb8ba467..e8e03f2c 100644 --- a/package.json +++ b/package.json @@ -792,7 +792,7 @@ ] }, "scripts": { - "compile": "tsc -p . && webpack --config webpack.config.js", + "compile": "tsc -p . && webpack --config webpack.config.js --mode development", "watch": "webpack --mode development --watch", "test": "tsc -p . && node ./dist/test/index.js", "test-ui": "tsc -p . && node ./dist/test/ui/index.js", diff --git a/src/java/nodeData.ts b/src/java/nodeData.ts index 7e0f9beb..6f21d783 100644 --- a/src/java/nodeData.ts +++ b/src/java/nodeData.ts @@ -4,10 +4,10 @@ export enum NodeKind { Workspace = 1, Project = 2, - Container = 3, - PackageRoot = 4, - Package = 5, - PrimaryType = 6, + PackageRoot = 3, + Package = 4, + PrimaryType = 5, + Container = 6, Folder = 7, File = 8, } diff --git a/src/views/containerNode.ts b/src/views/containerNode.ts index c85c98d9..9d7b0691 100644 --- a/src/views/containerNode.ts +++ b/src/views/containerNode.ts @@ -8,7 +8,6 @@ import { INodeData, NodeKind } from "../java/nodeData"; import { DataNode } from "./dataNode"; import { ExplorerNode } from "./explorerNode"; import { NodeFactory } from "./nodeFactory"; -import { PackageRootNode } from "./packageRootNode"; import { ProjectNode } from "./projectNode"; export class ContainerNode extends DataNode { @@ -37,15 +36,15 @@ export class ContainerNode extends DataNode { protected async loadData(): Promise { return Jdtls.getPackageData({ kind: NodeKind.Container, projectUri: this._project.uri, path: this.path }); } + protected createChildNodeList(): ExplorerNode[] { - const result: PackageRootNode[] = []; + const result: (ExplorerNode | undefined)[] = []; if (this.nodeData.children && this.nodeData.children.length) { - this.sort(); - this.nodeData.children.forEach((classpathNode) => { - result.push(NodeFactory.createPackageRootNode(classpathNode, this, this._project)); + this.nodeData.children.forEach((nodeData) => { + result.push(NodeFactory.createNode(nodeData, this, this._project)); }); } - return result; + return result.filter((n?: T): n is T => Boolean(n)); } protected get contextValue(): string { diff --git a/src/views/dataNode.ts b/src/views/dataNode.ts index 699d7352..236389e8 100644 --- a/src/views/dataNode.ts +++ b/src/views/dataNode.ts @@ -77,6 +77,7 @@ export abstract class DataNode extends ExplorerNode { const data = await this.loadData(); this._nodeData.children = data; this._childrenNodes = this.createChildNodeList() || []; + this.sort(); return this._childrenNodes; } return this._childrenNodes; @@ -97,12 +98,15 @@ export abstract class DataNode extends ExplorerNode { } protected sort() { - this.nodeData.children?.sort((a: INodeData, b: INodeData) => { - if (a.kind === b.kind) { - return a.name < b.name ? -1 : 1; - } else { - return a.kind - b.kind; + this._childrenNodes.sort((a: ExplorerNode, b: ExplorerNode) => { + if (a instanceof DataNode && b instanceof DataNode) { + if (a.nodeData.kind === b.nodeData.kind) { + return a.nodeData.name < b.nodeData.name ? -1 : 1; + } else { + return a.nodeData.kind - b.nodeData.kind; + } } + return 0; }); } diff --git a/src/views/folderNode.ts b/src/views/folderNode.ts index 858a26eb..609b799b 100644 --- a/src/views/folderNode.ts +++ b/src/views/folderNode.ts @@ -7,11 +7,11 @@ import { Jdtls } from "../java/jdtls"; import { INodeData, NodeKind } from "../java/nodeData"; import { DataNode } from "./dataNode"; import { ExplorerNode } from "./explorerNode"; -import { FileNode } from "./fileNode"; import { ProjectNode } from "./projectNode"; +import { NodeFactory } from "./nodeFactory"; export class FolderNode extends DataNode { - constructor(nodeData: INodeData, parent: DataNode, private _project: ProjectNode, private _rootNode: DataNode) { + constructor(nodeData: INodeData, parent: DataNode, private _project: ProjectNode, private _rootNode?: DataNode) { super(nodeData, parent); } @@ -20,24 +20,19 @@ export class FolderNode extends DataNode { kind: NodeKind.Folder, projectUri: this._project.uri, path: this.path, - rootPath: this._rootNode.path, - handlerIdentifier: this._rootNode.handlerIdentifier, + rootPath: this._rootNode?.path, + handlerIdentifier: this._rootNode?.handlerIdentifier, }); } protected createChildNodeList(): ExplorerNode[] { - const result: ExplorerNode[] = []; + const result: (ExplorerNode | undefined)[] = []; if (this.nodeData.children && this.nodeData.children.length) { - this.sort(); this.nodeData.children.forEach((nodeData) => { - if (nodeData.kind === NodeKind.File) { - result.push(new FileNode(nodeData, this)); - } else if (nodeData.kind === NodeKind.Folder) { - result.push(new FolderNode(nodeData, this, this._project, this._rootNode)); - } + result.push(NodeFactory.createNode(nodeData, this, this._project, this._rootNode)); }); } - return result; + return result.filter((n?: T): n is T => Boolean(n)); } protected get iconPath(): ThemeIcon { diff --git a/src/views/hierarchicalPackageNode.ts b/src/views/hierarchicalPackageNode.ts index 43db37ed..ed0bfaef 100644 --- a/src/views/hierarchicalPackageNode.ts +++ b/src/views/hierarchicalPackageNode.ts @@ -4,15 +4,13 @@ import * as _ from "lodash"; import { TreeItem, TreeItemCollapsibleState } from "vscode"; import { HierarchicalPackageNodeData } from "../java/hierarchicalPackageNodeData"; -import { INodeData, NodeKind } from "../java/nodeData"; +import { INodeData } from "../java/nodeData"; import { explorerLock } from "../utils/Lock"; import { DataNode } from "./dataNode"; import { ExplorerNode } from "./explorerNode"; -import { FileNode } from "./fileNode"; -import { FolderNode } from "./folderNode"; import { PackageNode } from "./packageNode"; -import { PrimaryTypeNode } from "./PrimaryTypeNode"; import { ProjectNode } from "./projectNode"; +import { NodeFactory } from "./nodeFactory"; export class HierarchicalPackageNode extends PackageNode { @@ -38,7 +36,9 @@ export class HierarchicalPackageNode extends PackageNode { this.nodeData.children = data; } } - return this.createChildNodeList(); + this._childrenNodes = this.createChildNodeList() || []; + this.sort(); + return this._childrenNodes; } finally { explorerLock.release(); } @@ -64,24 +64,13 @@ export class HierarchicalPackageNode extends PackageNode { } protected createChildNodeList(): ExplorerNode[] { - const result: ExplorerNode[] = []; + const result: (ExplorerNode | undefined)[] = []; if (this.nodeData.children && this.nodeData.children.length) { - this.sort(); this.nodeData.children.forEach((nodeData) => { - if (nodeData.kind === NodeKind.File) { - result.push(new FileNode(nodeData, this)); - } else if (nodeData instanceof HierarchicalPackageNodeData) { - result.push(new HierarchicalPackageNode(nodeData, this, this._project, this._rootNode)); - } else if (nodeData.kind === NodeKind.PrimaryType) { - if (nodeData.metaData && nodeData.metaData[PrimaryTypeNode.K_TYPE_KIND]) { - result.push(new PrimaryTypeNode(nodeData, this, this._rootNode)); - } - } else if (nodeData.kind === NodeKind.Folder) { - result.push(new FolderNode(nodeData, this, this._project, this._rootNode)); - } + result.push(NodeFactory.createNode(nodeData, this, this._project, this._rootNode)); }); } - return result; + return result.filter((n?: T): n is T => Boolean(n)); } private getHierarchicalNodeData(): HierarchicalPackageNodeData { diff --git a/src/views/hierarchicalPackageRootNode.ts b/src/views/hierarchicalPackageRootNode.ts index ea9db3ab..96cf6a6d 100644 --- a/src/views/hierarchicalPackageRootNode.ts +++ b/src/views/hierarchicalPackageRootNode.ts @@ -5,11 +5,9 @@ import { HierarchicalPackageNodeData } from "../java/hierarchicalPackageNodeData import { INodeData, NodeKind } from "../java/nodeData"; import { DataNode } from "./dataNode"; import { ExplorerNode } from "./explorerNode"; -import { FileNode } from "./fileNode"; -import { FolderNode } from "./folderNode"; import { HierarchicalPackageNode } from "./hierarchicalPackageNode"; +import { NodeFactory } from "./nodeFactory"; import { PackageRootNode } from "./packageRootNode"; -import { PrimaryTypeNode } from "./PrimaryTypeNode"; import { ProjectNode } from "./projectNode"; export class HierarchicalPackageRootNode extends PackageRootNode { @@ -31,36 +29,27 @@ export class HierarchicalPackageRootNode extends PackageRootNode { } protected createChildNodeList(): ExplorerNode[] { - const result: ExplorerNode[] = []; + const result: (ExplorerNode | undefined)[] = []; + const packageData: any[] = []; if (this.nodeData.children && this.nodeData.children.length) { - this.sort(); - this.nodeData.children.forEach((data) => { - if (data.kind === NodeKind.File) { - result.push(new FileNode(data, this)); - } else if (data.kind === NodeKind.Folder) { - result.push(new FolderNode(data, this, this._project, this)); - } else if (data.kind === NodeKind.PrimaryType) { - if (data.metaData && data.metaData[PrimaryTypeNode.K_TYPE_KIND]) { - result.push(new PrimaryTypeNode(data, this, this)); - } + this.nodeData.children.forEach((nodeData) => { + if (nodeData.kind === NodeKind.Package) { + // Invisible project may have an empty named package root (the linked folder), + // in that case, we will skip it. + packageData.push(nodeData); + } else { + result.push(NodeFactory.createNode(nodeData, this, this._project, this)); } }); } - return result.concat(this.getHierarchicalPackageNodes()); - } - - protected getHierarchicalPackageNodes(): ExplorerNode[] { - const hierarchicalPackageNodeData = this.getHierarchicalPackageNodeData(); - return hierarchicalPackageNodeData?.children.map((hierarchicalChildrenNode) => - new HierarchicalPackageNode(hierarchicalChildrenNode, this, this._project, this)) || []; - } - private getHierarchicalPackageNodeData(): HierarchicalPackageNodeData | undefined { - if (this.nodeData.children && this.nodeData.children.length) { - const nodeDataList = this.nodeData.children - .filter((child) => child.kind === NodeKind.Package); - return HierarchicalPackageNodeData.createHierarchicalNodeDataByPackageList(nodeDataList); + if (packageData.length > 0) { + const data: HierarchicalPackageNodeData = HierarchicalPackageNodeData.createHierarchicalNodeDataByPackageList(packageData); + if (data) { + result.push(...data.children.map(d => NodeFactory.createNode(d, this, this._project, this))); + } } - return undefined; + + return result.filter((n?: T): n is T => Boolean(n)); } } diff --git a/src/views/nodeFactory.ts b/src/views/nodeFactory.ts index 3a351b60..43ce77c5 100644 --- a/src/views/nodeFactory.ts +++ b/src/views/nodeFactory.ts @@ -1,16 +1,91 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT license. -import { INodeData } from "../java/nodeData"; +import { sendError } from "vscode-extension-telemetry-wrapper"; +import { INodeData, NodeKind } from "../java/nodeData"; import { Settings } from "../settings"; +import { PrimaryTypeNode } from "./PrimaryTypeNode"; +import { ContainerNode } from "./containerNode"; import { DataNode } from "./dataNode"; +import { ExplorerNode } from "./explorerNode"; +import { FileNode } from "./fileNode"; +import { FolderNode } from "./folderNode"; +import { HierarchicalPackageNode } from "./hierarchicalPackageNode"; import { HierarchicalPackageRootNode } from "./hierarchicalPackageRootNode"; +import { PackageNode } from "./packageNode"; import { PackageRootNode } from "./packageRootNode"; import { ProjectNode } from "./projectNode"; +import { WorkspaceNode } from "./workspaceNode"; +import { HierarchicalPackageNodeData } from "../java/hierarchicalPackageNodeData"; export class NodeFactory { - public static createPackageRootNode(nodeData: INodeData, parent: DataNode, project: ProjectNode): PackageRootNode { - return Settings.isHierarchicalView() ? - new HierarchicalPackageRootNode(nodeData, parent, project) : new PackageRootNode(nodeData, parent, project); + /** + * Factory method to create explorer node. + * @param nodeData INodeData instance. + * @param parent parent of this node. + * @param project project node that this node belongs to. + * @param rootNode package root node that this node belongs to. + */ + public static createNode(nodeData: INodeData, parent?: DataNode, project?: ProjectNode, rootNode?: DataNode): ExplorerNode | undefined { + const isHierarchicalView = Settings.isHierarchicalView(); + try { + switch (nodeData.kind) { + case NodeKind.Workspace: + return new WorkspaceNode(nodeData, parent); + case NodeKind.Project: + return new ProjectNode(nodeData, parent); + case NodeKind.Container: + if (!parent || !project) { + throw new Error("Container node must have parent and project."); + } + + return new ContainerNode(nodeData, parent, project); + case NodeKind.PackageRoot: + if (!parent || !project) { + throw new Error("Package root node must have parent and project."); + } + + if (isHierarchicalView) { + return new HierarchicalPackageRootNode(nodeData, parent, project); + } + return new PackageRootNode(nodeData, parent, project); + case NodeKind.Package: + if (!parent || !project || !rootNode) { + throw new Error("Package node must have parent, project and root."); + } + + if (nodeData instanceof HierarchicalPackageNodeData) { + return new HierarchicalPackageNode(nodeData, parent, project, rootNode); + } + return new PackageNode(nodeData, parent, project, rootNode); + case NodeKind.PrimaryType: + if (nodeData.metaData && nodeData.metaData[PrimaryTypeNode.K_TYPE_KIND]) { + if (!parent) { + throw new Error("Primary type node must have parent."); + } + + return new PrimaryTypeNode(nodeData, parent, rootNode); + } + return undefined; + case NodeKind.Folder: + if (!parent || !project) { + throw new Error("Folder node must have parent and project."); + } + + return new FolderNode(nodeData, parent, project, rootNode); + case NodeKind.File: + if (!parent) { + throw new Error("Folder node must have parent."); + } + + return new FileNode(nodeData, parent); + default: + throw new Error(`Unsupported node kind: ${nodeData.kind}`); + } + } catch (error) { + sendError(new Error(`Unsupported node kind: ${nodeData.kind}`)); + return undefined; + } + } } diff --git a/src/views/packageNode.ts b/src/views/packageNode.ts index 12aebcc6..501b369b 100644 --- a/src/views/packageNode.ts +++ b/src/views/packageNode.ts @@ -9,10 +9,8 @@ import { IPackageRootNodeData, PackageRootKind } from "../java/packageRootNodeDa import { isTest } from "../utility"; import { DataNode } from "./dataNode"; import { ExplorerNode } from "./explorerNode"; -import { FileNode } from "./fileNode"; -import { FolderNode } from "./folderNode"; -import { PrimaryTypeNode } from "./PrimaryTypeNode"; import { ProjectNode } from "./projectNode"; +import { NodeFactory } from "./nodeFactory"; export class PackageNode extends DataNode { constructor(nodeData: INodeData, parent: DataNode, protected _project: ProjectNode, protected _rootNode: DataNode) { @@ -34,22 +32,13 @@ export class PackageNode extends DataNode { } protected createChildNodeList(): ExplorerNode[] { - const result: ExplorerNode[] = []; + const result: (ExplorerNode | undefined)[] = []; if (this.nodeData.children && this.nodeData.children.length) { - this.sort(); this.nodeData.children.forEach((nodeData) => { - if (nodeData.kind === NodeKind.File) { - result.push(new FileNode(nodeData, this)); - } else if (nodeData.kind === NodeKind.PrimaryType) { - if (nodeData.metaData && nodeData.metaData[PrimaryTypeNode.K_TYPE_KIND]) { - result.push(new PrimaryTypeNode(nodeData, this, this._rootNode)); - } - } else if (nodeData.kind === NodeKind.Folder) { - result.push(new FolderNode(nodeData, this, this._project, this._rootNode)); - } + result.push(NodeFactory.createNode(nodeData, this, this._project, this._rootNode)); }); } - return result; + return result.filter((n?: T): n is T => Boolean(n)); } protected get iconPath(): ThemeIcon { diff --git a/src/views/packageRootNode.ts b/src/views/packageRootNode.ts index c91b39e1..8ca4ca19 100644 --- a/src/views/packageRootNode.ts +++ b/src/views/packageRootNode.ts @@ -11,11 +11,8 @@ import { isTest } from "../utility"; import { ContainerNode } from "./containerNode"; import { DataNode } from "./dataNode"; import { ExplorerNode } from "./explorerNode"; -import { FileNode } from "./fileNode"; -import { FolderNode } from "./folderNode"; -import { PackageNode } from "./packageNode"; -import { PrimaryTypeNode } from "./PrimaryTypeNode"; import { ProjectNode } from "./projectNode"; +import { NodeFactory } from "./nodeFactory"; export class PackageRootNode extends DataNode { @@ -38,24 +35,13 @@ export class PackageRootNode extends DataNode { } protected createChildNodeList(): ExplorerNode[] { - const result: ExplorerNode[] = []; + const result: (ExplorerNode | undefined)[] = []; if (this.nodeData.children && this.nodeData.children.length) { - this.sort(); - this.nodeData.children.forEach((data: INodeData) => { - if (data.kind === NodeKind.Package) { - result.push(new PackageNode(data, this, this._project, this)); - } else if (data.kind === NodeKind.File) { - result.push(new FileNode(data, this)); - } else if (data.kind === NodeKind.Folder) { - result.push(new FolderNode(data, this, this._project, this)); - } else if (data.kind === NodeKind.PrimaryType) { - if (data.metaData && data.metaData[PrimaryTypeNode.K_TYPE_KIND]) { - result.push(new PrimaryTypeNode(data, this, this)); - } - } + this.nodeData.children.forEach((nodeData) => { + result.push(NodeFactory.createNode(nodeData, this, this._project, this)); }); } - return result; + return result.filter((n?: T): n is T => Boolean(n)); } protected get description(): string | boolean | undefined { diff --git a/src/views/projectNode.ts b/src/views/projectNode.ts index 1ec431e6..d4b2b79b 100644 --- a/src/views/projectNode.ts +++ b/src/views/projectNode.ts @@ -8,13 +8,10 @@ import { HierarchicalPackageNodeData } from "../java/hierarchicalPackageNodeData import { Jdtls } from "../java/jdtls"; import { INodeData, NodeKind } from "../java/nodeData"; import { Settings } from "../settings"; -import { ContainerNode } from "./containerNode"; import { DataNode } from "./dataNode"; import { ExplorerNode } from "./explorerNode"; import { HierarchicalPackageNode } from "./hierarchicalPackageNode"; import { NodeFactory } from "./nodeFactory"; -import { PackageNode } from "./packageNode"; -import { PrimaryTypeNode } from "./PrimaryTypeNode"; export class ProjectNode extends DataNode { @@ -87,25 +84,14 @@ export class ProjectNode extends DataNode { } protected createChildNodeList(): ExplorerNode[] { - - const result: ExplorerNode[] = []; + const result: (ExplorerNode | undefined)[] = []; const packageData: any[] = []; if (this.nodeData.children && this.nodeData.children.length) { - this.nodeData.children.forEach((data) => { - if (data.kind === NodeKind.Container) { - result.push(new ContainerNode(data, this, this)); - } else if (data.kind === NodeKind.PackageRoot) { - result.push(NodeFactory.createPackageRootNode(data, this, this)); - } else if (data.kind === NodeKind.Package) { - // Invisible project may have an empty named package root, in that case, - // we will skip it. - packageData.push(data); - } else if (data.kind === NodeKind.PrimaryType) { - // For invisible project with empty named package root with a default package, - // types will be the project node's children - if (data.metaData && data.metaData[PrimaryTypeNode.K_TYPE_KIND]) { - result.push(new PrimaryTypeNode(data, this, undefined)); - } + this.nodeData.children.forEach((nodeData) => { + if (nodeData.kind === NodeKind.Package) { + packageData.push(nodeData); + } else { + result.push(NodeFactory.createNode(nodeData, this, this)); } }); } @@ -113,19 +99,15 @@ export class ProjectNode extends DataNode { if (packageData.length > 0) { if (Settings.isHierarchicalView()) { const data: HierarchicalPackageNodeData = HierarchicalPackageNodeData.createHierarchicalNodeDataByPackageList(packageData); - const hierarchicalPackageNodes: HierarchicalPackageNode[] = data === undefined ? [] : data.children.map((hierarchicalChildrenNode) => - new HierarchicalPackageNode(hierarchicalChildrenNode, this, this, this)); - result.push(...hierarchicalPackageNodes); + if (data) { + result.push(...data.children.map(d => NodeFactory.createNode(d, this, this, this))); + } } else { - result.push(...packageData.map((data) => new PackageNode(data, this, this, this))); + result.push(...packageData.map((d) => NodeFactory.createNode(d, this, this, this))); } } - result.sort((a: DataNode, b: DataNode) => { - return b.nodeData.kind - a.nodeData.kind; - }); - - return result; + return result.filter((n?: T): n is T => Boolean(n)); } protected get iconPath(): ThemeIcon { diff --git a/src/views/workspaceNode.ts b/src/views/workspaceNode.ts index a4887acf..4cb8331f 100644 --- a/src/views/workspaceNode.ts +++ b/src/views/workspaceNode.ts @@ -7,7 +7,7 @@ import { Jdtls } from "../java/jdtls"; import { INodeData } from "../java/nodeData"; import { DataNode } from "./dataNode"; import { ExplorerNode } from "./explorerNode"; -import { ProjectNode } from "./projectNode"; +import { NodeFactory } from "./nodeFactory"; export class WorkspaceNode extends DataNode { constructor(nodeData: INodeData, parent?: DataNode) { @@ -22,13 +22,13 @@ export class WorkspaceNode extends DataNode { } protected createChildNodeList(): ExplorerNode[] { - const result: ExplorerNode[] = []; + const result: (ExplorerNode | undefined)[] = []; if (this.nodeData.children && this.nodeData.children.length) { this.nodeData.children.forEach((nodeData) => { - result.push(new ProjectNode(nodeData, this)); + result.push(NodeFactory.createNode(nodeData, this)); }); } - return result; + return result.filter((n?: T): n is T => Boolean(n)); } protected get iconPath(): ThemeIcon { From 15748512d9cbc4553b66d76b572fb5d3a44e892e Mon Sep 17 00:00:00 2001 From: Sheng Chen Date: Mon, 10 Apr 2023 10:36:46 +0800 Subject: [PATCH 149/352] feat: Apply file decorators to project level (#735) Signed-off-by: Sheng Chen --- CHANGELOG.md | 4 ++++ src/views/dataNode.ts | 1 + test/maven-suite/projectView.test.ts | 2 ++ 3 files changed, 7 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 99aaa9c5..83ab0235 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,10 @@ All notable changes to the "vscode-java-dependency" extension will be documented The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/) and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html). +## 0.22.0 +### Added +- Apply file decorators to project level. [#481](https://github.com/microsoft/vscode-java-dependency/issues/481) + ## 0.21.2 ### Fixed - Improve the output of exporting jar tasks. [#699](https://github.com/microsoft/vscode-java-dependency/issues/699) diff --git a/src/views/dataNode.ts b/src/views/dataNode.ts index 236389e8..f08ccc68 100644 --- a/src/views/dataNode.ts +++ b/src/views/dataNode.ts @@ -26,6 +26,7 @@ export abstract class DataNode extends ExplorerNode { item.contextValue = this.computeContextValue(); if (this.uri) { switch (this._nodeData.kind) { + case NodeKind.Project: case NodeKind.PackageRoot: case NodeKind.Package: case NodeKind.PrimaryType: diff --git a/test/maven-suite/projectView.test.ts b/test/maven-suite/projectView.test.ts index 4228aa5f..21071310 100644 --- a/test/maven-suite/projectView.test.ts +++ b/test/maven-suite/projectView.test.ts @@ -65,6 +65,8 @@ suite("Maven Project View Tests", () => { assert.equal(roots?.length, 1, "Number of root node should be 1"); const projectNode = roots![0] as ProjectNode; assert.equal(projectNode.name, "my-app", "Project name should be \"my-app\""); + const projectTreeItem: vscode.TreeItem = await projectNode.getTreeItem(); + assert.ok(projectTreeItem.resourceUri !== undefined, "Project tree item should have resourceUri"); // validate package root/dependency nodes const packageRoots = await projectNode.getChildren(); From 004fdb63b15ad5261f20b04980d9247819bdb7bc Mon Sep 17 00:00:00 2001 From: Sheng Chen Date: Mon, 10 Apr 2023 14:37:33 +0800 Subject: [PATCH 150/352] feat: Display non-java resources in the Project explorer (#730) * feat: Display non-java resources in the Project explorer --------- Signed-off-by: Sheng Chen --- CHANGELOG.md | 1 + .../jdtls/ext/core/PackageCommand.java | 75 ++++++++++++------- .../jdtls/ext/core/parser/ResourceSet.java | 62 +++++++++++++-- src/explorerCommands/rename.ts | 3 + src/syncHandler.ts | 63 ++++++++++------ src/views/projectNode.ts | 23 +----- test/gradle-suite/projectView.test.ts | 13 ++-- test/maven-suite/projectView.test.ts | 36 ++++----- test/simple-suite/projectView.test.ts | 8 +- 9 files changed, 179 insertions(+), 105 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 83ab0235..ce7e306f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0. ## 0.22.0 ### Added +- Display non-Java files in Java Projects explorer. [#145](https://github.com/microsoft/vscode-java-dependency/issues/145) - Apply file decorators to project level. [#481](https://github.com/microsoft/vscode-java-dependency/issues/481) ## 0.21.2 diff --git a/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/PackageCommand.java b/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/PackageCommand.java index e34a3cd6..f91eb429 100644 --- a/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/PackageCommand.java +++ b/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/PackageCommand.java @@ -78,10 +78,10 @@ public class PackageCommand { static { commands = new HashMap<>(); - commands.put(NodeKind.PROJECT, PackageCommand::getContainers); - commands.put(NodeKind.CONTAINER, PackageCommand::getPackageFragmentRoots); - commands.put(NodeKind.PACKAGEROOT, PackageCommand::getPackages); - commands.put(NodeKind.PACKAGE, PackageCommand::getRootTypes); + commands.put(NodeKind.PROJECT, PackageCommand::getProjectChildren); + commands.put(NodeKind.CONTAINER, PackageCommand::getContainerChildren); + commands.put(NodeKind.PACKAGEROOT, PackageCommand::getPackageRootChildren); + commands.put(NodeKind.PACKAGE, PackageCommand::getPackageChildren); commands.put(NodeKind.FOLDER, PackageCommand::getFolderChildren); } @@ -225,10 +225,17 @@ public static List resolvePath(List arguments, IProgressMon * @throws JavaModelException when fails to get path or resource */ private static List getParentAncestorNodes(IResource element) throws JavaModelException { - List nodeList = new ArrayList<>(); - while (element != null) { + List nodeList = new LinkedList<>(); + while (element != null && !(element instanceof IWorkspaceRoot)) { IJavaElement javaElement = JavaCore.create(element); - if (javaElement instanceof IPackageFragmentRoot) { + if (javaElement == null) { + PackageNode entry = PackageNode.createNodeForResource(element); + if (entry != null) { + nodeList.add(0, entry); + } + } else if (javaElement instanceof IJavaProject) { + nodeList.add(0, PackageNode.createNodeForProject(javaElement)); + } else if (javaElement instanceof IPackageFragmentRoot) { IPackageFragmentRoot pkgRoot = (IPackageFragmentRoot) javaElement; nodeList.add(0, new PackageRootNode(pkgRoot, element.getProjectRelativePath().toPortableString(), NodeKind.PACKAGEROOT)); @@ -239,12 +246,6 @@ private static List getParentAncestorNodes(IResource element) throw if (packageFragment.containsJavaResources() || packageFragment.getNonJavaResources().length > 0) { nodeList.add(0, PackageNode.createNodeForPackageFragment(packageFragment)); } - - } else if (javaElement == null) { - PackageNode entry = PackageNode.createNodeForResource(element); - if (entry != null) { - nodeList.add(0, entry); - } } element = element.getParent(); } @@ -255,20 +256,28 @@ private static List getParentAncestorNodes(IResource element) throw /** * Get the class path container list. */ - private static List getContainers(PackageParams query, IProgressMonitor pm) { + private static List getProjectChildren(PackageParams query, IProgressMonitor pm) { IJavaProject javaProject = getJavaProject(query.getProjectUri()); if (javaProject != null) { + refreshLocal(javaProject.getProject(), pm); List children = new LinkedList<>(); boolean hasReferencedLibraries = false; try { IClasspathEntry[] references = javaProject.getRawClasspath(); for (IClasspathEntry entry : references) { - if (entry.getEntryKind() != IClasspathEntry.CPE_LIBRARY && entry.getEntryKind() != IClasspathEntry.CPE_VARIABLE) { + int entryKind = entry.getEntryKind(); + if (entryKind == IClasspathEntry.CPE_SOURCE) { + IPackageFragmentRoot[] packageFragmentRoots = javaProject.findPackageFragmentRoots(entry); + children.addAll(Arrays.asList(packageFragmentRoots)); + } else if (entryKind == IClasspathEntry.CPE_CONTAINER) { children.add(entry); - } else { + } else if (entry.getEntryKind() == IClasspathEntry.CPE_LIBRARY || entry.getEntryKind() == IClasspathEntry.CPE_VARIABLE) { hasReferencedLibraries = true; + } else { + // TODO: handle IClasspathEntry.CPE_PROJECT } } + Collections.addAll(children, javaProject.getNonJavaResources()); } catch (CoreException e) { JdtlsExtActivator.logException("Problem load project library ", e); } @@ -278,7 +287,7 @@ private static List getContainers(PackageParams query, IProgressMon resourceSet.accept(visitor); List result = visitor.getNodes(); - // Invisble project will always have the referenced libraries entry + // Invisible project will always have the referenced libraries entry if (!ProjectUtils.isVisibleProject(javaProject.getProject())) { result.add(PackageNode.REFERENCED_LIBRARIES_CONTAINER); } else if (hasReferencedLibraries) { @@ -289,7 +298,7 @@ private static List getContainers(PackageParams query, IProgressMon return Collections.emptyList(); } - private static List getPackageFragmentRoots(PackageParams query, IProgressMonitor pm) { + private static List getContainerChildren(PackageParams query, IProgressMonitor pm) { IJavaProject javaProject = getJavaProject(query.getProjectUri()); if (javaProject == null) { return Collections.emptyList(); @@ -343,7 +352,7 @@ private static IPackageFragmentRoot[] findPackageFragmentRoots(IJavaProject java return null; } - private static List getPackages(PackageParams query, IProgressMonitor pm) { + private static List getPackageRootChildren(PackageParams query, IProgressMonitor pm) { try { IPackageFragmentRoot packageRoot = getPackageFragmentRootFromQuery(query); if (packageRoot == null) { @@ -351,7 +360,7 @@ private static List getPackages(PackageParams query, IProgressMonit new Status(IStatus.ERROR, JdtlsExtActivator.PLUGIN_ID, String.format("No package root found for %s", query.getPath()))); } List result = getPackageFragmentRootContent(packageRoot, query.isHierarchicalView(), pm); - ResourceSet resourceSet = new ResourceSet(result); + ResourceSet resourceSet = new ResourceSet(result, query.isHierarchicalView()); ResourceVisitor visitor = new JavaResourceVisitor(packageRoot.getJavaProject()); resourceSet.accept(visitor); return visitor.getNodes(); @@ -375,7 +384,6 @@ private static IPackageFragmentRoot getPackageFragmentRootFromQuery(PackageParam return javaProject.findPackageFragmentRoot(Path.fromPortableString(query.getRootPath())); } catch (JavaModelException e) { JdtlsExtActivator.log(e); - return null; } } } @@ -383,20 +391,21 @@ private static IPackageFragmentRoot getPackageFragmentRootFromQuery(PackageParam return null; } - private static List getRootTypes(PackageParams query, IProgressMonitor pm) { + private static List getPackageChildren(PackageParams query, IProgressMonitor pm) { IPackageFragment packageFragment = (IPackageFragment) JavaCore.create(query.getHandlerIdentifier()); - List children = getChildrenForPackage(packageFragment); + List children = getChildrenForPackage(packageFragment, pm); ResourceSet resourceSet = new ResourceSet(children); ResourceVisitor visitor = new JavaResourceVisitor(packageFragment.getJavaProject()); resourceSet.accept(visitor); return visitor.getNodes(); } - public static List getChildrenForPackage(IPackageFragment packageFragment) { + public static List getChildrenForPackage(IPackageFragment packageFragment, IProgressMonitor pm) { if (packageFragment == null) { return Collections.emptyList(); } + refreshLocal(packageFragment.getResource(), pm); List children = new LinkedList<>(); try { for (IJavaElement element : packageFragment.getChildren()) { @@ -412,10 +421,7 @@ public static List getChildrenForPackage(IPackageFragment packageFragmen } } - Object[] nonJavaResources = packageFragment.getNonJavaResources(); - for (Object resource : nonJavaResources) { - children.add(resource); - } + Collections.addAll(children, packageFragment.getNonJavaResources()); } catch (JavaModelException e) { JdtlsExtActivator.log(e); } @@ -458,6 +464,7 @@ private static List getFolderChildren(PackageParams query, IProgres // general resource folder. IFolder folder = ResourcesPlugin.getWorkspace().getRoot().getFolder(Path.fromPortableString(query.getPath())); if (folder.exists()) { + refreshLocal(folder, pm); children.addAll(Arrays.asList(folder.members())); javaProject = JavaCore.create(folder.getProject()); } @@ -488,6 +495,7 @@ private static List getFolderChildren(PackageParams query, IProgres */ public static List getPackageFragmentRootContent(IPackageFragmentRoot root, boolean isHierarchicalView, IProgressMonitor pm) throws CoreException { ArrayList result = new ArrayList<>(); + refreshLocal(root.getResource(), pm); if (isHierarchicalView) { Map map = new HashMap<>(); for (IJavaElement child : root.getChildren()) { @@ -583,4 +591,15 @@ public static IJavaProject getJavaProject(String projectUri) { } return null; } + + private static void refreshLocal(IResource resource, IProgressMonitor monitor) { + if (resource == null || !resource.exists()) { + return; + } + try { + resource.refreshLocal(IResource.DEPTH_ONE, monitor); + } catch (CoreException e) { + JdtlsExtActivator.log(e); + } + } } diff --git a/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/parser/ResourceSet.java b/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/parser/ResourceSet.java index f49105fb..50ba9eba 100644 --- a/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/parser/ResourceSet.java +++ b/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/parser/ResourceSet.java @@ -15,9 +15,13 @@ import java.util.ListIterator; import java.util.Objects; +import org.eclipse.core.internal.utils.FileUtil; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IFolder; +import org.eclipse.core.resources.IProject; +import org.eclipse.core.resources.IResource; import org.eclipse.core.runtime.CoreException; +import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.NullProgressMonitor; import org.eclipse.jdt.core.IClassFile; import org.eclipse.jdt.core.IClasspathEntry; @@ -26,6 +30,7 @@ import org.eclipse.jdt.core.IPackageFragment; import org.eclipse.jdt.core.IPackageFragmentRoot; import org.eclipse.jdt.core.IType; +import org.eclipse.jdt.core.JavaCore; import org.eclipse.jdt.ls.core.internal.ProjectUtils; import com.microsoft.jdtls.ext.core.JdtlsExtActivator; @@ -35,9 +40,15 @@ public class ResourceSet { private List resources; + private boolean isHierarchicalView; public ResourceSet(List resources) { + this(resources, false); + } + + public ResourceSet(List resources, boolean isHierarchicalView) { this.resources = resources; + this.isHierarchicalView = isHierarchicalView; } public void accept(ResourceVisitor visitor) { @@ -58,11 +69,11 @@ public void accept(ResourceVisitor visitor) { } // skip invisible project's linked folder and add its children to the iterator. - if (!ProjectUtils.isVisibleProject(javaProject.getProject()) && + if (ProjectUtils.isUnmanagedFolder(javaProject.getProject()) && Objects.equals(ProjectUtils.WORKSPACE_LINK, pkgRoot.getElementName())) { try { List nextObjs = PackageCommand.getPackageFragmentRootContent( - pkgRoot, false, new NullProgressMonitor()); + pkgRoot, isHierarchicalView, new NullProgressMonitor()); for (Object nextObj : nextObjs) { iterator.add(nextObj); iterator.previous(); @@ -76,9 +87,9 @@ public void accept(ResourceVisitor visitor) { } } else if (resource instanceof IPackageFragment) { IPackageFragment fragment = (IPackageFragment) resource; - // skil default package and add its children to the iterator. + // skip default package and add its children to the iterator. if (fragment.isDefaultPackage()) { - List nextObjs = PackageCommand.getChildrenForPackage(fragment); + List nextObjs = PackageCommand.getChildrenForPackage(fragment, new NullProgressMonitor()); for (Object nextObj : nextObjs) { iterator.add(nextObj); iterator.previous(); @@ -91,12 +102,51 @@ public void accept(ResourceVisitor visitor) { } else if (resource instanceof IClassFile) { visitor.visit((IClassFile) resource); } else if (resource instanceof IFile) { - visitor.visit((IFile) resource); + if (shouldVisit((IFile) resource)) { + visitor.visit((IFile) resource); + } } else if (resource instanceof IFolder) { - visitor.visit((IFolder) resource); + if (shouldVisit((IFolder) resource)) { + visitor.visit((IFolder) resource); + } } else if (resource instanceof IJarEntryResource) { visitor.visit((IJarEntryResource) resource); } } } + + /** + * Check if the IFolder or IFile should be visited. The following conditions will skip visit: + *
        + *
      • the resource is null.
      • + *
      • the resource does not belong to any project.
      • + *
      • the resource is not in the project's real location.
      • + *
      • the resource is a java element.
      • + *
      + */ + private boolean shouldVisit(IResource resource) { + if (resource == null) { + return false; + } + + IProject project = resource.getProject(); + if (project == null) { + return false; + } + + IPath projectRealFolder = ProjectUtils.getProjectRealFolder(project.getProject()); + IPath resourcePath = FileUtil.toPath(resource.getLocationURI()); + // check if the resource stores in the project's real location. + if (!projectRealFolder.isPrefixOf(resourcePath)) { + return false; + } + + // skip linked folder. + if (Objects.equals(projectRealFolder, resourcePath) && + Objects.equals(ProjectUtils.WORKSPACE_LINK, resource.getName())) { + return false; + } + + return JavaCore.create(resource) == null; + } } diff --git a/src/explorerCommands/rename.ts b/src/explorerCommands/rename.ts index 5d4af1b3..9246e7b8 100644 --- a/src/explorerCommands/rename.ts +++ b/src/explorerCommands/rename.ts @@ -71,6 +71,9 @@ function getValueSelection(uri: string): [number, number] | undefined { } function CheckQualifiedInputName(value: string, nodeKind: NodeKind): string { + if (nodeKind === NodeKind.Folder || nodeKind === NodeKind.File) { + return ""; + } const javaValidateMessage = checkJavaQualifiedName(value); if (javaValidateMessage) { diff --git a/src/syncHandler.ts b/src/syncHandler.ts index 6e91547d..031aa190 100644 --- a/src/syncHandler.ts +++ b/src/syncHandler.ts @@ -2,6 +2,7 @@ // Licensed under the MIT license. import * as path from "path"; +import * as fse from "fs-extra"; import { commands, Disposable, FileSystemWatcher, RelativePattern, Uri, workspace } from "vscode"; import { instrumentOperation } from "vscode-extension-telemetry-wrapper"; import { Commands } from "./commands"; @@ -11,6 +12,7 @@ import { Settings } from "./settings"; import { DataNode } from "./views/dataNode"; import { ExplorerNode } from "./views/explorerNode"; import { explorerNodeCache } from "./views/nodeCache/explorerNodeCache"; +import { Jdtls } from "./java/jdtls"; const ENABLE_AUTO_REFRESH: string = "java.view.package.enableAutoRefresh"; const DISABLE_AUTO_REFRESH: string = "java.view.package.disableAutoRefresh"; @@ -47,14 +49,9 @@ class SyncHandler implements Disposable { })); try { - const result: IListCommandResult | undefined = await commands.executeCommand(Commands.EXECUTE_WORKSPACE_COMMAND, - Commands.JAVA_PROJECT_LIST_SOURCE_PATHS); - if (!result || !result.status || !result.data || result.data.length === 0) { - throw new Error("Failed to list the source paths"); - } - - for (const sourcePathData of result.data) { - const normalizedPath: string = Uri.file(sourcePathData.path).fsPath; + const uris = await this.getWatchingUris(); + for (const uri of uris) { + const normalizedPath: string = uri.fsPath; const pattern: RelativePattern = new RelativePattern(normalizedPath, "**/*"); const watcher: FileSystemWatcher = workspace.createFileSystemWatcher(pattern); this.disposables.push(watcher); @@ -67,9 +64,23 @@ class SyncHandler implements Disposable { } } + private async getWatchingUris(): Promise { + return (await Jdtls.getProjectUris()).map((uri) => Uri.parse(uri)); + // TODO: get source path uris if non-java resources are hidden + // const result: IListCommandResult | undefined = await commands.executeCommand(Commands.EXECUTE_WORKSPACE_COMMAND, + // Commands.JAVA_PROJECT_LIST_SOURCE_PATHS); + // if (!result || !result.status || !result.data || result.data.length === 0) { + // throw new Error("Failed to list the source paths"); + // } + + // for (const sourcePathData of result.data) { + // const normalizedPath: string = Uri.file(sourcePathData.path).fsPath; + // } + } + private setupWatchers(watcher: FileSystemWatcher): void { - this.disposables.push(watcher.onDidChange((uri: Uri) => { - if (path.extname(uri.fsPath) !== ".java" || !Settings.showMembers()) { + this.disposables.push(watcher.onDidChange(async (uri: Uri) => { + if (!await this.needRefresh(uri.fsPath)) { return; } const node: DataNode | undefined = explorerNodeCache.getDataNode(uri); @@ -86,6 +97,14 @@ class SyncHandler implements Disposable { } + private async needRefresh(fsPath: string): Promise { + if (Settings.showMembers() && path.extname(fsPath) === ".java") { + return true; + } + + return (await fse.lstat(fsPath)).isDirectory(); + } + private getParentNodeInExplorer(uri: Uri): ExplorerNode | undefined { let node: DataNode | undefined = explorerNodeCache.findBestMatchNodeByUri(uri); @@ -122,17 +141,17 @@ class SyncHandler implements Disposable { } } -interface ISourcePath { - path: string; - displayPath: string; - projectName: string; - projectType: string; -} - -interface IListCommandResult { - status: boolean; - message: string; - data?: ISourcePath[]; -} +// interface ISourcePath { +// path: string; +// displayPath: string; +// projectName: string; +// projectType: string; +// } + +// interface IListCommandResult { +// status: boolean; +// message: string; +// data?: ISourcePath[]; +// } export const syncHandler: SyncHandler = new SyncHandler(); diff --git a/src/views/projectNode.ts b/src/views/projectNode.ts index d4b2b79b..a19ace6d 100644 --- a/src/views/projectNode.ts +++ b/src/views/projectNode.ts @@ -3,7 +3,6 @@ import { ThemeIcon, Uri, workspace } from "vscode"; import { Explorer } from "../constants"; -import { ContainerEntryKind, IContainerNodeData } from "../java/containerNodeData"; import { HierarchicalPackageNodeData } from "../java/hierarchicalPackageNodeData"; import { Jdtls } from "../java/jdtls"; import { INodeData, NodeKind } from "../java/nodeData"; @@ -60,27 +59,7 @@ export class ProjectNode extends DataNode { } protected async loadData(): Promise { - let result: INodeData[] = []; - return Jdtls.getPackageData({ kind: NodeKind.Project, projectUri: this.nodeData.uri }).then((res) => { - const sourceContainer: IContainerNodeData[] = []; - res.forEach((node) => { - const containerNode = node; - if (containerNode.entryKind === ContainerEntryKind.CPE_SOURCE) { - sourceContainer.push(containerNode); - } else { - result.push(node); - } - }); - if (sourceContainer.length > 0) { - return Promise.all(sourceContainer.map((c) => Jdtls.getPackageData({ kind: NodeKind.Container, projectUri: this.uri, path: c.path }))) - .then((rootPackages) => { - result = result.concat(...rootPackages); - return result; - }); - } else { - return result; - } - }); + return Jdtls.getPackageData({ kind: NodeKind.Project, projectUri: this.nodeData.uri }); } protected createChildNodeList(): ExplorerNode[] { diff --git a/test/gradle-suite/projectView.test.ts b/test/gradle-suite/projectView.test.ts index 48fecf0d..ec5a045d 100644 --- a/test/gradle-suite/projectView.test.ts +++ b/test/gradle-suite/projectView.test.ts @@ -2,7 +2,7 @@ // Licensed under the MIT license. import * as assert from "assert"; -import { ContainerNode, contextManager, DependencyExplorer, +import { ContainerNode, contextManager, DataNode, DependencyExplorer, PackageRootNode, PrimaryTypeNode, ProjectNode } from "../../extension.bundle"; import { fsPath, setupTestEnv, Uris } from "../shared"; @@ -21,12 +21,13 @@ suite("Gradle Project View Tests", () => { assert.equal(projectNode.name, "gradle", "Project name should be \"gradle\""); // validate package root/dependency nodes - const packageRoots = await projectNode.getChildren(); - assert.equal(packageRoots.length, 3, "Number of root packages should be 3"); - const mainPackage = packageRoots[0] as PackageRootNode; + const projectChildren = await projectNode.getChildren(); + assert.ok(!!projectChildren.find((c: DataNode) => c.name === "build.gradle")); + assert.ok(!!projectChildren.find((c: DataNode) => c.name === ".vscode")); + const mainPackage = projectChildren[0] as PackageRootNode; assert.equal(mainPackage.name, "src/main/java", "Package name should be \"src/main/java\""); - const systemLibrary = packageRoots[1] as ContainerNode; - const gradleDependency = packageRoots[2] as ContainerNode; + const systemLibrary = projectChildren[1] as ContainerNode; + const gradleDependency = projectChildren[2] as ContainerNode; // only match prefix of system library since JDK version may differ assert.ok(systemLibrary.name.startsWith("JRE System Library"), "Container name should start with JRE System Library"); assert.equal(gradleDependency.name, "Project and External Dependencies", "Container name should be \"Project and External Dependencies\""); diff --git a/test/maven-suite/projectView.test.ts b/test/maven-suite/projectView.test.ts index 21071310..ae73ccd0 100644 --- a/test/maven-suite/projectView.test.ts +++ b/test/maven-suite/projectView.test.ts @@ -5,7 +5,7 @@ import * as assert from "assert"; import * as clipboardy from "clipboardy"; import * as path from "path"; import * as vscode from "vscode"; -import { Commands, ContainerNode, contextManager, DependencyExplorer, IMainClassInfo, +import { Commands, ContainerNode, contextManager, DataNode, DependencyExplorer, FileNode, IMainClassInfo, INodeData, NodeKind, PackageNode, PackageRootNode, PrimaryTypeNode, ProjectNode } from "../../extension.bundle"; import { fsPath, setupTestEnv, Uris } from "../shared"; import { sleep } from "../util"; @@ -26,9 +26,11 @@ suite("Maven Project View Tests", () => { const projectNode = roots![0] as ProjectNode; assert.equal(projectNode.name, "my-app", "Project name should be \"my-app\""); - const packageRoots = await projectNode.getChildren(); - assert.equal(packageRoots.length, 4, "Number of root packages should be 4"); - const mainPackage = packageRoots[0] as PackageRootNode; + const projectChildren = await projectNode.getChildren(); + assert.ok(!!projectChildren.find((c: DataNode) => c.name === "pom.xml")); + assert.ok(!!projectChildren.find((c: DataNode) => c.name === ".vscode")); + assert.equal(projectChildren.length, 8, "Number of children should be 8"); + const mainPackage = projectChildren[0] as PackageRootNode; assert.equal(mainPackage.name, "src/main/java", "Package name should be \"src/main/java\""); const primarySubPackages = await mainPackage.getChildren(); @@ -69,14 +71,15 @@ suite("Maven Project View Tests", () => { assert.ok(projectTreeItem.resourceUri !== undefined, "Project tree item should have resourceUri"); // validate package root/dependency nodes - const packageRoots = await projectNode.getChildren(); - assert.equal(packageRoots.length, 4, "Number of root packages should be 4"); - const mainPackage = packageRoots[0] as PackageRootNode; - const testPackage = packageRoots[1] as PackageRootNode; + const projectChildren = await projectNode.getChildren(); + assert.ok(!!projectChildren.find((c: DataNode) => c.name === "pom.xml")); + assert.ok(!!projectChildren.find((c: DataNode) => c.name === ".vscode")); + const mainPackage = projectChildren[0] as PackageRootNode; + const testPackage = projectChildren[1] as PackageRootNode; assert.equal(mainPackage.name, "src/main/java", "Package name should be \"src/main/java\""); assert.equal(testPackage.name, "src/test/java", "Package name should be \"src/test/java\""); - const systemLibrary = packageRoots[2] as ContainerNode; - const mavenDependency = packageRoots[3] as ContainerNode; + const systemLibrary = projectChildren[2] as ContainerNode; + const mavenDependency = projectChildren[3] as ContainerNode; // only match prefix of system library since JDK version may differ assert.ok(systemLibrary.name.startsWith("JRE System Library"), "Container name should start with JRE System Library"); assert.equal(mavenDependency.name, "Maven Dependencies", "Container name should be \"Maven Dependencies\""); @@ -202,14 +205,13 @@ suite("Maven Project View Tests", () => { const explorer = DependencyExplorer.getInstance(contextManager.context); const projectNode = (await explorer.dataProvider.getChildren())![0] as ProjectNode; - const packageRoots = await projectNode.getChildren(); - const mainPackage = packageRoots[0] as PackageRootNode; + const projectChildren = await projectNode.getChildren(); + const fileNode = projectChildren.find((node: DataNode) => node.nodeData.name === "pom.xml") as FileNode; const paths = await vscode.commands.executeCommand(Commands.EXECUTE_WORKSPACE_COMMAND, - Commands.JAVA_RESOLVEPATH, mainPackage.nodeData.uri); - assert.equal(paths?.length, 3, "paths' length should be 3"); - assert.equal(paths![0].name, "src", "path[0]'s name should be src"); - assert.equal(paths![1].name, "main", "path[1]'s name should be main"); - assert.equal(paths![2].name, "java", "path[2]'s name should be java"); + Commands.JAVA_RESOLVEPATH, fileNode.nodeData.uri); + assert.equal(paths?.length, 2, "paths' length should be 2"); + assert.equal(paths![0].name, projectNode.name); + assert.equal(paths![1].name, fileNode.name); }); test("Can execute command java.project.getMainClasses correctly", async function() { diff --git a/test/simple-suite/projectView.test.ts b/test/simple-suite/projectView.test.ts index ccced02e..862b28d4 100644 --- a/test/simple-suite/projectView.test.ts +++ b/test/simple-suite/projectView.test.ts @@ -21,11 +21,11 @@ suite("Simple Project View Tests", () => { assert.equal(projectNode.name, "1.helloworld", "Project name should be \"1.helloworld\""); // validate package root/dependency nodes - const packageRoots = await projectNode.getChildren(); - assert.equal(packageRoots.length, 2, "Number of root packages should be 2"); - const mainPackage = packageRoots[0] as PackageRootNode; + const projectChildren = await projectNode.getChildren(); + assert.equal(projectChildren.length, 6, "Number of children nodes should be 6"); + const mainPackage = projectChildren[0] as PackageRootNode; assert.equal(mainPackage.name, "src/main/java", "Package name should be \"src/main/java\""); - const systemLibrary = packageRoots[1] as ContainerNode; + const systemLibrary = projectChildren[1] as ContainerNode; // only match prefix of system library since JDK version may differ assert.ok(systemLibrary.name.startsWith("JRE System Library"), "Container name should start with JRE System Library"); From bdc5fa8f35cd6967820052c67ab4160336bdeb0b Mon Sep 17 00:00:00 2001 From: Sheng Chen Date: Mon, 10 Apr 2023 15:34:32 +0800 Subject: [PATCH 151/352] refactor: Simplify the settings change event handling (#737) --- src/settings.ts | 62 ++++++++++------------------- src/views/dependencyDataProvider.ts | 5 --- 2 files changed, 22 insertions(+), 45 deletions(-) diff --git a/src/settings.ts b/src/settings.ts index fc541bb7..08b99213 100644 --- a/src/settings.ts +++ b/src/settings.ts @@ -3,40 +3,32 @@ import { commands, ConfigurationChangeEvent, ExtensionContext, - workspace, WorkspaceConfiguration, + workspace, } from "vscode"; import { instrumentOperationAsVsCodeCommand } from "vscode-extension-telemetry-wrapper"; import { Commands } from "./commands"; import { syncHandler } from "./syncHandler"; +import { contextManager, DependencyExplorer } from "../extension.bundle"; export class Settings { public static initialize(context: ExtensionContext): void { context.subscriptions.push(workspace.onDidChangeConfiguration((e: ConfigurationChangeEvent) => { - if (!e.affectsConfiguration("java.dependency")) { - return; - } - const oldConfig = this._dependencyConfig; - this._dependencyConfig = workspace.getConfiguration("java.dependency"); - for (const listener of this._configurationListeners) { - listener(this._dependencyConfig, oldConfig); - } - })); - this.registerConfigurationListener((updatedConfig, oldConfig) => { - if (updatedConfig.showMembers !== oldConfig.showMembers - || updatedConfig.packagePresentation !== oldConfig.packagePresentation - || (updatedConfig.syncWithFolderExplorer !== oldConfig.syncWithFolderExplorer - && updatedConfig.syncWithFolderExplorer)) { + if ((e.affectsConfiguration("java.dependency.syncWithFolderExplorer") && Settings.syncWithFolderExplorer()) || + e.affectsConfiguration("java.dependency.showMembers") || + e.affectsConfiguration("java.dependency.packagePresentation")) { commands.executeCommand(Commands.VIEW_PACKAGE_INTERNAL_REFRESH); - } else if (updatedConfig.autoRefresh !== oldConfig.autoRefresh) { - syncHandler.updateFileWatcher(updatedConfig.autoRefresh); + } else if (e.affectsConfiguration("java.dependency.autoRefresh")) { + syncHandler.updateFileWatcher(Settings.autoRefresh()); + } else if (e.affectsConfiguration("java.dependency.refreshDelay")) { + // TODO: getInstance() should not have parameter if it means to be a singleton. + DependencyExplorer.getInstance(contextManager.context) + .dataProvider.setRefreshDebounceFunc(Settings.refreshDelay()); } - }); + })); syncHandler.updateFileWatcher(Settings.autoRefresh()); - context.subscriptions.push({ dispose: () => { this._configurationListeners = []; } }); - context.subscriptions.push(instrumentOperationAsVsCodeCommand(Commands.VIEW_PACKAGE_LINKWITHFOLDER, Settings.linkWithFolderCommand)); context.subscriptions.push(instrumentOperationAsVsCodeCommand(Commands.VIEW_PACKAGE_UNLINKWITHFOLDER, Settings.unlinkWithFolderCommand)); @@ -48,24 +40,20 @@ export class Settings { Settings.changeToHierarchicalPackageView)); } - public static registerConfigurationListener(listener: Listener) { - this._configurationListeners.push(listener); - } - public static linkWithFolderCommand(): void { - workspace.getConfiguration().update("java.dependency.syncWithFolderExplorer", true, false); + workspace.getConfiguration("java.dependency").update("syncWithFolderExplorer", true, false); } public static unlinkWithFolderCommand(): void { - workspace.getConfiguration().update("java.dependency.syncWithFolderExplorer", false, false); + workspace.getConfiguration("java.dependency").update("syncWithFolderExplorer", false, false); } public static changeToFlatPackageView(): void { - workspace.getConfiguration().update("java.dependency.packagePresentation", PackagePresentation.Flat, false); + workspace.getConfiguration("java.dependency").update("packagePresentation", PackagePresentation.Flat, false); } public static changeToHierarchicalPackageView(): void { - workspace.getConfiguration().update("java.dependency.packagePresentation", PackagePresentation.Hierarchical, false); + workspace.getConfiguration("java.dependency").update("packagePresentation", PackagePresentation.Hierarchical, false); } public static updateReferencedLibraries(libraries: IReferencedLibraries): void { @@ -77,7 +65,7 @@ export class Settings { if (!updateSetting.exclude && !updateSetting.sources) { updateSetting = libraries.include; } - workspace.getConfiguration().update("java.project.referencedLibraries", updateSetting); + workspace.getConfiguration("java.project").update("referencedLibraries", updateSetting); } public static referencedLibraries(): IReferencedLibraries { @@ -91,33 +79,29 @@ export class Settings { } public static showMembers(): boolean { - return this._dependencyConfig.get("showMembers", false); + return workspace.getConfiguration("java.dependency").get("showMembers", false); } public static autoRefresh(): boolean { - return this._dependencyConfig.get("autoRefresh", true); + return workspace.getConfiguration("java.dependency").get("autoRefresh", true); } public static syncWithFolderExplorer(): boolean { - return this._dependencyConfig.get("syncWithFolderExplorer", true); + return workspace.getConfiguration("java.dependency").get("syncWithFolderExplorer", true); } public static isHierarchicalView(): boolean { - return this._dependencyConfig.get("packagePresentation") === PackagePresentation.Hierarchical; + return workspace.getConfiguration("java.dependency").get("packagePresentation") === PackagePresentation.Hierarchical; } public static refreshDelay(): number { - return this._dependencyConfig.get("refreshDelay", 2000); + return workspace.getConfiguration("java.dependency").get("refreshDelay", 2000); } public static getExportJarTargetPath(): string { // tslint:disable-next-line: no-invalid-template-strings return workspace.getConfiguration("java.project.exportJar").get("targetPath", "${workspaceFolder}/${workspaceFolderBasename}.jar"); } - - private static _dependencyConfig: WorkspaceConfiguration = workspace.getConfiguration("java.dependency"); - - private static _configurationListeners: Listener[] = []; } enum PackagePresentation { @@ -125,8 +109,6 @@ enum PackagePresentation { Hierarchical = "hierarchical", } -type Listener = (updatedConfig: WorkspaceConfiguration, oldConfig: WorkspaceConfiguration) => void; - export interface IReferencedLibraries { include: string[]; exclude: string[]; diff --git a/src/views/dependencyDataProvider.ts b/src/views/dependencyDataProvider.ts index fabee567..e1f87f4c 100644 --- a/src/views/dependencyDataProvider.ts +++ b/src/views/dependencyDataProvider.ts @@ -79,11 +79,6 @@ export class DependencyDataProvider implements TreeDataProvider { commands.executeCommand(Commands.BUILD_PROJECT, Uri.parse(node.uri), true); })); - Settings.registerConfigurationListener((updatedConfig, oldConfig) => { - if (updatedConfig.refreshDelay !== oldConfig.refreshDelay) { - this.setRefreshDebounceFunc(updatedConfig.refreshDelay); - } - }); this.setRefreshDebounceFunc(); } From a1e6cfb7772c1572eabdbe9cd3faeed6aace97ab Mon Sep 17 00:00:00 2001 From: Sheng Chen Date: Mon, 10 Apr 2023 16:26:17 +0800 Subject: [PATCH 152/352] fix: Apply 'files.exclude' to Java Projects explorer (#739) * fix: Apply 'files.exclude' to Java Projects explorer --------- Signed-off-by: Sheng Chen --- CHANGELOG.md | 3 +++ src/java/jdtls.ts | 37 +++++++++++++++++++++++++--- src/settings.ts | 3 ++- test/maven-suite/projectView.test.ts | 7 ++++++ test/maven/.hidden | 0 test/maven/.vscode/settings.json | 5 +++- 6 files changed, 50 insertions(+), 5 deletions(-) create mode 100644 test/maven/.hidden diff --git a/CHANGELOG.md b/CHANGELOG.md index ce7e306f..2a84de39 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,9 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0. - Display non-Java files in Java Projects explorer. [#145](https://github.com/microsoft/vscode-java-dependency/issues/145) - Apply file decorators to project level. [#481](https://github.com/microsoft/vscode-java-dependency/issues/481) +### Fixed +- Apply `files.exclude` to Java Projects explorer. [#214](https://github.com/microsoft/vscode-java-dependency/issues/214) + ## 0.21.2 ### Fixed - Improve the output of exporting jar tasks. [#699](https://github.com/microsoft/vscode-java-dependency/issues/699) diff --git a/src/java/jdtls.ts b/src/java/jdtls.ts index a5674e62..b3fc6424 100644 --- a/src/java/jdtls.ts +++ b/src/java/jdtls.ts @@ -1,7 +1,9 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT license. -import { CancellationToken, commands } from "vscode"; + +import * as minimatch from "minimatch"; +import { CancellationToken, Uri, commands, workspace } from "vscode"; import { Commands, executeJavaLanguageServerCommand } from "../commands"; import { IClasspath } from "../tasks/buildArtifact/IStepMetadata"; import { IMainClassInfo } from "../tasks/buildArtifact/ResolveMainClassExecutor"; @@ -20,8 +22,32 @@ export namespace Jdtls { return commands.executeCommand(Commands.EXECUTE_WORKSPACE_COMMAND, Commands.JAVA_PROJECT_REFRESH_LIB_SERVER, params); } - export async function getPackageData(params: { [key: string]: any }): Promise { - return await commands.executeCommand(Commands.EXECUTE_WORKSPACE_COMMAND, Commands.JAVA_GETPACKAGEDATA, params) || []; + export async function getPackageData(params: IPackageDataParam): Promise { + const uri: Uri | null = !params.projectUri ? null : Uri.parse(params.projectUri); + const excludePatterns: {[key: string]: boolean} | undefined = workspace.getConfiguration("files", uri).get("exclude"); + + let nodeData: INodeData[] = await commands.executeCommand(Commands.EXECUTE_WORKSPACE_COMMAND, + Commands.JAVA_GETPACKAGEDATA, params) || []; + if (excludePatterns && nodeData.length) { + const uriOfChildren: string[] = nodeData.map((node: INodeData) => node.uri).filter(Boolean) as string[]; + const urisToExclude: Set = new Set(); + for (const pattern in excludePatterns) { + if (excludePatterns[pattern]) { + const toExclude: string[] = minimatch.match(uriOfChildren, pattern); + toExclude.forEach((uri: string) => urisToExclude.add(uri)); + } + } + + if (urisToExclude.size) { + nodeData = nodeData.filter((node: INodeData) => { + if (!node.uri) { + return true; + } + return !urisToExclude.has(node.uri); + }) + } + } + return nodeData; } export async function resolvePath(params: string): Promise { @@ -49,3 +75,8 @@ export namespace Jdtls { return >executeJavaLanguageServerCommand(Commands.JAVA_RESOLVE_BUILD_FILES); } } + +interface IPackageDataParam { + projectUri: string | undefined, + [key: string]: any, +} \ No newline at end of file diff --git a/src/settings.ts b/src/settings.ts index 08b99213..c0b9d86c 100644 --- a/src/settings.ts +++ b/src/settings.ts @@ -16,7 +16,8 @@ export class Settings { context.subscriptions.push(workspace.onDidChangeConfiguration((e: ConfigurationChangeEvent) => { if ((e.affectsConfiguration("java.dependency.syncWithFolderExplorer") && Settings.syncWithFolderExplorer()) || e.affectsConfiguration("java.dependency.showMembers") || - e.affectsConfiguration("java.dependency.packagePresentation")) { + e.affectsConfiguration("java.dependency.packagePresentation") || + e.affectsConfiguration("files.exclude")) { commands.executeCommand(Commands.VIEW_PACKAGE_INTERNAL_REFRESH); } else if (e.affectsConfiguration("java.dependency.autoRefresh")) { syncHandler.updateFileWatcher(Settings.autoRefresh()); diff --git a/test/maven-suite/projectView.test.ts b/test/maven-suite/projectView.test.ts index ae73ccd0..11fffebf 100644 --- a/test/maven-suite/projectView.test.ts +++ b/test/maven-suite/projectView.test.ts @@ -223,4 +223,11 @@ suite("Maven Project View Tests", () => { assert.equal(mainClasses![0].name, "com.mycompany.app.App", "mainClasses[0]'s name should be com.mycompany.app.App"); }); + test("Can apply 'files.exclude'", async function() { + const explorer = DependencyExplorer.getInstance(contextManager.context); + + const projectNode = (await explorer.dataProvider.getChildren())![0] as ProjectNode; + const projectChildren = await projectNode.getChildren(); + assert.ok(!projectChildren.find((node: DataNode) => node.nodeData.name === ".hidden")); + }); }); diff --git a/test/maven/.hidden b/test/maven/.hidden new file mode 100644 index 00000000..e69de29b diff --git a/test/maven/.vscode/settings.json b/test/maven/.vscode/settings.json index 66e66c61..ee7bd904 100644 --- a/test/maven/.vscode/settings.json +++ b/test/maven/.vscode/settings.json @@ -1,3 +1,6 @@ { - "java.server.launchMode": "Standard" + "java.server.launchMode": "Standard", + "files.exclude": { + "**/.hidden": true, + } } From ad8a46296ee341bdd0034c1136e25c7b43aec271 Mon Sep 17 00:00:00 2001 From: Sheng Chen Date: Tue, 11 Apr 2023 13:30:04 +0800 Subject: [PATCH 153/352] Give more hints about the project import status (#740) * Give more hints about the project import status - If there is no project available, and the workspace exists error marks, show the error message in the view. --------- Signed-off-by: Sheng Chen --- CHANGELOG.md | 1 + .../com.microsoft.jdtls.ext.core/plugin.xml | 1 + .../jdtls/ext/core/CommandHandler.java | 2 ++ .../jdtls/ext/core/ProjectCommand.java | 24 +++++++++++++++++++ package.json | 9 +++++-- package.nls.json | 3 ++- package.nls.zh-cn.json | 1 + package.nls.zh-tw.json | 1 + src/commands.ts | 2 ++ src/constants.ts | 1 + src/java/jdtls.ts | 4 ++++ src/views/dependencyDataProvider.ts | 9 ++++++- 12 files changed, 54 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2a84de39..b9416af7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0. ### Added - Display non-Java files in Java Projects explorer. [#145](https://github.com/microsoft/vscode-java-dependency/issues/145) - Apply file decorators to project level. [#481](https://github.com/microsoft/vscode-java-dependency/issues/481) +- Give more hints about the project import status. [#580](https://github.com/microsoft/vscode-java-dependency/issues/580) ### Fixed - Apply `files.exclude` to Java Projects explorer. [#214](https://github.com/microsoft/vscode-java-dependency/issues/214) diff --git a/jdtls.ext/com.microsoft.jdtls.ext.core/plugin.xml b/jdtls.ext/com.microsoft.jdtls.ext.core/plugin.xml index 1ae25fe3..0352e983 100644 --- a/jdtls.ext/com.microsoft.jdtls.ext.core/plugin.xml +++ b/jdtls.ext/com.microsoft.jdtls.ext.core/plugin.xml @@ -9,6 +9,7 @@ + arguments, IProgress return ProjectCommand.getMainClasses(arguments, monitor); case "java.project.generateJar": return ProjectCommand.exportJar(arguments, monitor); + case "java.project.checkImportStatus": + return ProjectCommand.checkImportStatus(); default: break; } diff --git a/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/ProjectCommand.java b/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/ProjectCommand.java index a69a93ea..968a1af4 100644 --- a/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/ProjectCommand.java +++ b/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/ProjectCommand.java @@ -29,6 +29,7 @@ import org.apache.commons.lang3.StringUtils; import org.eclipse.core.resources.IFile; +import org.eclipse.core.resources.IMarker; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IResource; import org.eclipse.core.resources.IResourceVisitor; @@ -282,6 +283,29 @@ public static String getModuleName(IJavaProject project) { } } + public static boolean checkImportStatus() { + IProject[] projects = ProjectUtils.getAllProjects(); + for (IProject project : projects) { + if (ProjectsManager.DEFAULT_PROJECT_NAME.equals(project.getName())) { + continue; + } + try { + List markers = ResourceUtils.getErrorMarkers(project); + if (markers != null) { + boolean hasError = markers.stream().anyMatch(m -> { + return m.getAttribute(IMarker.SEVERITY, 0) == IMarker.SEVERITY_ERROR; + }); + if (hasError) { + return true; + } + } + } catch (CoreException e) { + JdtlsExtActivator.log(e); + } + } + return false; + } + private static void reportExportJarMessage(String terminalId, int severity, String message) { if (StringUtils.isNotBlank(message) && StringUtils.isNotBlank(terminalId)) { String readableSeverity = getSeverityString(severity); diff --git a/package.json b/package.json index e8e03f2c..a7ce21fa 100644 --- a/package.json +++ b/package.json @@ -426,12 +426,12 @@ }, { "command": "java.view.package.exportJar", - "when": "view == javaProjectExplorer && java:serverMode == Standard && !java:noJavaProjects", + "when": "view == javaProjectExplorer && java:serverMode == Standard && !java:noJavaProjects && !java:importFailed", "group": "navigation@20" }, { "command": "java.project.build.workspace", - "when": "view == javaProjectExplorer && java:serverMode == Standard && !java:noJavaProjects", + "when": "view == javaProjectExplorer && java:serverMode == Standard && !java:noJavaProjects && !java:importFailed", "group": "navigation@30" }, { @@ -637,6 +637,11 @@ "view": "javaProjectExplorer", "contents": "%viewsWelcome.workbench.installLanguageSupport%", "when": "java:projectManagerActivated && !java:languageSupportInstalled" + }, + { + "view": "javaProjectExplorer", + "contents": "%viewsWelcome.workbench.importFailed%", + "when": "java:importFailed" } ], "taskDefinitions": [ diff --git a/package.nls.json b/package.nls.json index df8d0d19..9873b339 100644 --- a/package.nls.json +++ b/package.nls.json @@ -44,7 +44,8 @@ "taskDefinitions.java.project.build.path.exclude": "The path after '!' will be excluded from the paths to be built.", "taskDefinitions.java.project.build.isFullBuild": "Whether to execute a clean build or not.", "viewsWelcome.workbench.createNewJavaProject": "You can also [open a Java project folder](command:_java.project.open), or create a new Java project by clicking the button below.\n[Create Java Project](command:java.project.create)", - "viewsWelcome.workbench.noJavaProject": "No Java projects found in the current workspace. You can [open a Java project folder](command:_java.project.open), or create a new Java project by clicking the button below.\n[Create Java Project](command:java.project.create)", + "viewsWelcome.workbench.noJavaProject": "No Java projects found in the current workspace. You can [pen a Java project folder](command:_java.project.open), or create a new Java project by clicking the button below.\n[Create Java Project](command:java.project.create)", + "viewsWelcome.workbench.importFailed": "Oops, something went wrong when opening Java projects. Please use the following action for troubleshooting:\n[Open Problems View](command:workbench.panel.markers.view.focus)", "viewsWelcome.workbench.inLightWeightMode": "To view the projects, you can import the projects into workspace.\n[Import Projects](command:java.server.mode.switch?%5B%22Standard%22,true%5D)", "viewsWelcome.workbench.installLanguageSupport": "The Java Projects explorer requires [Extension Pack for Java](command:extension.open?%5B%22vscjava.vscode-java-pack%22%5D) to provide full features.\n[Install](command:java.project.installExtension?%5B%22vscjava.vscode-java-pack%22%5D)" } diff --git a/package.nls.zh-cn.json b/package.nls.zh-cn.json index 741c137f..99fa7448 100644 --- a/package.nls.zh-cn.json +++ b/package.nls.zh-cn.json @@ -45,6 +45,7 @@ "taskDefinitions.java.project.build.isFullBuild": "是否要重新构建项目。", "viewsWelcome.workbench.createNewJavaProject": "您也可以[打开一个 Java 项目目录](command:_java.project.open),或点击下方按钮创建一个新的 Java 项目。\n[创建 Java 项目](command:java.project.create)", "viewsWelcome.workbench.noJavaProject": "当前工作空间未发现 Java 项目,您可以[打开一个 Java 项目目录](command:_java.project.open),或点击下方按钮创建一个新的 Java 项目。\n[创建 Java 项目](command:java.project.create)", + "viewsWelcome.workbench.importFailed": "加载 Java 项目时出现错误,请通过以下方式查看错误相关信息:\n[打开问题视图](command:workbench.panel.markers.view.focus)", "viewsWelcome.workbench.inLightWeightMode": "要浏览项目信息,你可以将项目导入到工作空间中。\n[导入项目](command:java.server.mode.switch?%5B%22Standard%22,true%5D)", "viewsWelcome.workbench.installLanguageSupport": "Java 项目视图需要安装并激活 [Extension Pack for Java](command:extension.open?%5B%22vscjava.vscode-java-pack%22%5D) 以提供完整的功能。\n[安装](command:java.project.installExtension?%5B%22vscjava.vscode-java-pack%22%5D)" } diff --git a/package.nls.zh-tw.json b/package.nls.zh-tw.json index 2a48fb6d..67f8d6c4 100644 --- a/package.nls.zh-tw.json +++ b/package.nls.zh-tw.json @@ -45,6 +45,7 @@ "taskDefinitions.java.project.build.isFullBuild": "是否要重新建置專案。", "viewsWelcome.workbench.createNewJavaProject": "您也可以[開啟一個 Java 專案目錄](command:_java.project.open),或點擊下方按鈕建立一個新的 Java 專案。\n[建立 Java 專案](command:java.project.create)", "viewsWelcome.workbench.noJavaProject": "當前工作區未發現 Java 專案,您可以[開啟一個 Java 專案目錄](command:_java.project.open),或點擊下方按鈕建立一個新的 Java 專案。\n[建立 Java 專案](command:java.project.create)", + "viewsWelcome.workbench.importFailed": "加載 Java 專案時出現錯誤,請通過以下方式查看錯誤相關信息:\n[打開問題視圖](command:workbench.panel.markers.view.focus)", "viewsWelcome.workbench.inLightWeightMode": "若要檢視各專案,你可以將專案匯入到工作區中。\n[匯入專案](command:java.server.mode.switch?%5B%22Standard%22,true%5D)", "viewsWelcome.workbench.installLanguageSupport": "Java 專案視圖需要安裝並啟用 [Extension Pack for Java](command:extension.open?%5B%22vscjava.vscode-java-pack%22%5D) 以提供完整的功能。\n[安裝](command:java.project.installExtension?%5B%22vscjava.vscode-java-pack%22%5D)" } \ No newline at end of file diff --git a/src/commands.ts b/src/commands.ts index 8cf89057..c8b8d641 100644 --- a/src/commands.ts +++ b/src/commands.ts @@ -96,6 +96,8 @@ export namespace Commands { export const JAVA_UPDATE_DEPRECATED_TASK = "java.updateDeprecatedTask"; + export const JAVA_PROJECT_CHECK_IMPORT_STATUS = "java.project.checkImportStatus"; + /** * Commands from Visual Studio Code */ diff --git a/src/constants.ts b/src/constants.ts index bcc8f9a0..df01101c 100644 --- a/src/constants.ts +++ b/src/constants.ts @@ -5,6 +5,7 @@ export namespace Context { export const EXTENSION_ACTIVATED: string = "java:projectManagerActivated"; export const LANGUAGE_SUPPORT_INSTALLED: string = "java:languageSupportInstalled"; export const NO_JAVA_PROJECT: string = "java:noJavaProjects"; + export const IMPORT_FAILED: string = "java:importFailed"; export const WORKSPACE_CONTAINS_BUILD_FILES: string = "java:workspaceContainsBuildFiles"; export const RELOAD_PROJECT_ACTIVE: string = "java:reloadProjectActive"; export const SHOW_DEPRECATED_TASKS: string = "java:showDeprecatedTasks"; diff --git a/src/java/jdtls.ts b/src/java/jdtls.ts index b3fc6424..bdd9a498 100644 --- a/src/java/jdtls.ts +++ b/src/java/jdtls.ts @@ -64,6 +64,10 @@ export namespace Jdtls { mainClass, classpaths, destination, terminalId, token); } + export async function checkImportStatus(): Promise { + return commands.executeCommand(Commands.EXECUTE_WORKSPACE_COMMAND, Commands.JAVA_PROJECT_CHECK_IMPORT_STATUS) || false; + } + export enum CompileWorkspaceStatus { Failed = 0, Succeed = 1, diff --git a/src/views/dependencyDataProvider.ts b/src/views/dependencyDataProvider.ts index e1f87f4c..24676a49 100644 --- a/src/views/dependencyDataProvider.ts +++ b/src/views/dependencyDataProvider.ts @@ -191,7 +191,14 @@ export class DependencyDataProvider implements TreeDataProvider { this._rootItems = rootItems; } } - contextManager.setContextValue(Context.NO_JAVA_PROJECT, _.isEmpty(rootItems)); + if (_.isEmpty(rootItems)) { + const hasJavaError: boolean = await Jdtls.checkImportStatus(); + if (hasJavaError) { + contextManager.setContextValue(Context.IMPORT_FAILED, true); + } else { + contextManager.setContextValue(Context.NO_JAVA_PROJECT, true); + } + } return rootItems; } finally { explorerLock.release(); From dc2908e8c2a906292383a47c285b32abda237a83 Mon Sep 17 00:00:00 2001 From: Sheng Chen Date: Tue, 11 Apr 2023 17:05:25 +0800 Subject: [PATCH 154/352] feat: Re-organize the new class & package commands (#741) * feat: Re-organize the new class & package commands - Group new class and new package commands to the submenu. - Use another command to handle new class creation from the menu bar. - Enable the class and package creation at the source type level. --------- Signed-off-by: Sheng Chen --- package.json | 54 ++++++++++++++++++-------------- package.nls.json | 6 ++-- package.nls.zh-cn.json | 6 ++-- package.nls.zh-tw.json | 6 ++-- src/commands.ts | 2 ++ src/explorerCommands/new.ts | 36 +++++++++++---------- src/extension.ts | 3 +- src/views/PrimaryTypeNode.ts | 55 +++++++++++++++++++++++++++++++++ test/suite/contextValue.test.ts | 8 ++--- 9 files changed, 125 insertions(+), 51 deletions(-) diff --git a/package.json b/package.json index a7ce21fa..291b67bd 100644 --- a/package.json +++ b/package.json @@ -12,7 +12,7 @@ "explorer" ], "engines": { - "vscode": "^1.69.0" + "vscode": "^1.75.0" }, "repository": { "type": "git", @@ -39,10 +39,7 @@ "workspaceContains:settings.gradle.kts", "workspaceContains:*/settings.gradle.kts", "workspaceContains:.classpath", - "workspaceContains:*/.classpath", - "onCommand:_java.project.open", - "onCommand:java.project.create", - "onCommand:java.view.package.newJavaClass" + "workspaceContains:*/.classpath" ], "license": "MIT", "main": "./main.js", @@ -166,6 +163,12 @@ "title": "%contributes.commands.java.view.package.copyRelativeFilePath%", "category": "Java" }, + { + "command": "java.view.menus.file.newJavaClass", + "title": "%contributes.commands.java.view.menus.file.newJavaClass%", + "category": "Java", + "icon": "$(add)" + }, { "command": "java.view.package.newJavaClass", "title": "%contributes.commands.java.view.package.newJavaClass%", @@ -290,7 +293,7 @@ "menus": { "file/newFile": [ { - "command": "java.view.package.newJavaClass" + "command": "java.view.menus.file.newJavaClass" } ], "commandPalette": [ @@ -350,6 +353,10 @@ "command": "java.project.refreshLibraries", "when": "false" }, + { + "command": "java.view.package.newJavaClass", + "when": "false" + }, { "command": "java.view.package.newPackage", "when": "false" @@ -522,8 +529,8 @@ "group": "8_execution@6" }, { - "command": "java.view.package.newJavaClass", - "when": "view == javaProjectExplorer && viewItem =~ /java:(package|packageRoot)(?=.*?\\b\\+source\\b)(?=.*?\\b\\+uri\\b)/", + "submenu": "javaProject.new", + "when": "view == javaProjectExplorer && (viewItem =~ /java:(package|packageRoot)(?=.*?\\b\\+source\\b)(?=.*?\\b\\+uri\\b)/ || viewItem =~ /java:project(?=.*?\\b\\+java\\b)(?=.*?\\b\\+uri\\b)/ || viewItem =~ /java:type(?=.*?\\b\\+source\\b)(?=.*?\\b\\+uri\\b)/)", "group": "1_new@10" }, { @@ -531,26 +538,11 @@ "when": "view == javaProjectExplorer && viewItem =~ /java:project(?=.*?\\b\\+java\\b)(?=.*?\\b\\+uri\\b)/", "group": "inline@add_0" }, - { - "command": "java.view.package.newJavaClass", - "when": "view == javaProjectExplorer && viewItem =~ /java:project(?=.*?\\b\\+java\\b)(?=.*?\\b\\+uri\\b)/", - "group": "1_new@10" - }, { "command": "java.view.package.newJavaClass", "when": "view == javaProjectExplorer && viewItem =~ /java:(package|packageRoot)(?=.*?\\b\\+source\\b)(?=.*?\\b\\+uri\\b)/", "group": "inline@add_0" }, - { - "command": "java.view.package.newPackage", - "when": "view == javaProjectExplorer && viewItem =~ /java:(package|packageRoot)(?=.*?\\b\\+source\\b)(?=.*?\\b\\+uri\\b)/", - "group": "1_new@20" - }, - { - "command": "java.view.package.newPackage", - "when": "view == javaProjectExplorer && viewItem =~ /java:project(?=.*?\\b\\+java\\b)(?=.*?\\b\\+uri\\b)/", - "group": "1_new@20" - }, { "command": "java.project.addLibraries", "alt": "java.project.addLibraryFolders", @@ -594,6 +586,16 @@ "command": "java.project.update", "group": "gradle@10" } + ], + "javaProject.new": [ + { + "command": "java.view.package.newJavaClass", + "group": "new@10" + }, + { + "command": "java.view.package.newPackage", + "group": "new@40" + } ] }, "submenus": [ @@ -604,6 +606,10 @@ { "id": "javaProject.gradle", "label": "Gradle" + }, + { + "id": "javaProject.new", + "label": "%contributes.submenus.javaProject.new%" } ], "views": { @@ -813,7 +819,7 @@ "@types/mocha": "^9.1.1", "@types/node": "^16.18.11", "@types/semver": "^7.3.13", - "@types/vscode": "1.69.0", + "@types/vscode": "1.75.0", "@vscode/test-electron": "^2.2.2", "copy-webpack-plugin": "^11.0.0", "glob": "^7.2.3", diff --git a/package.nls.json b/package.nls.json index 9873b339..507e2eaf 100644 --- a/package.nls.json +++ b/package.nls.json @@ -19,11 +19,13 @@ "contributes.commands.java.view.package.exportJar": "Export Jar...", "contributes.commands.java.view.package.copyFilePath": "Copy Path", "contributes.commands.java.view.package.copyRelativeFilePath": "Copy Relative Path", - "contributes.commands.java.view.package.newJavaClass": "New Java Class", - "contributes.commands.java.view.package.newPackage": "New Package", + "contributes.commands.java.view.package.newJavaClass": "Java Class", + "contributes.commands.java.view.package.newPackage": "Package", "contributes.commands.java.view.package.renameFile": "Rename", "contributes.commands.java.view.package.moveFileToTrash": "Delete", "contributes.commands.java.view.package.deleteFilePermanently": "Delete Permanently", + "contributes.submenus.javaProject.new": "New", + "contributes.commands.java.view.menus.file.newJavaClass": "New Java Class", "configuration.java.dependency.showMembers": "Show the members in the explorer", "configuration.java.dependency.syncWithFolderExplorer": "Synchronize Java Projects explorer selection with folder explorer", "configuration.java.dependency.autoRefresh": "Synchronize Java Projects explorer with changes", diff --git a/package.nls.zh-cn.json b/package.nls.zh-cn.json index 99fa7448..75a45a6d 100644 --- a/package.nls.zh-cn.json +++ b/package.nls.zh-cn.json @@ -19,11 +19,13 @@ "contributes.commands.java.view.package.exportJar": "导出到 Jar 文件...", "contributes.commands.java.view.package.copyFilePath": "复制路径", "contributes.commands.java.view.package.copyRelativeFilePath": "复制相对路径", - "contributes.commands.java.view.package.newJavaClass": "创建 Java 类", - "contributes.commands.java.view.package.newPackage": "创建包", + "contributes.commands.java.view.package.newJavaClass": "Java 类", + "contributes.commands.java.view.package.newPackage": "包", "contributes.commands.java.view.package.renameFile": "重命名", "contributes.commands.java.view.package.moveFileToTrash": "删除", "contributes.commands.java.view.package.deleteFilePermanently": "永久删除", + "contributes.submenus.javaProject.new": "创建", + "contributes.commands.java.view.menus.file.newJavaClass": "创建 Java 类", "configuration.java.dependency.showMembers": "在 Java 项目管理器中显示成员", "configuration.java.dependency.syncWithFolderExplorer": "在 Java 项目管理器中同步关联当前打开的文件", "configuration.java.dependency.autoRefresh": "在 Java 项目管理器中自动同步修改", diff --git a/package.nls.zh-tw.json b/package.nls.zh-tw.json index 67f8d6c4..461bfa00 100644 --- a/package.nls.zh-tw.json +++ b/package.nls.zh-tw.json @@ -19,11 +19,13 @@ "contributes.commands.java.view.package.exportJar": "匯出成 Jar 檔案...", "contributes.commands.java.view.package.copyFilePath": "複製路徑", "contributes.commands.java.view.package.copyRelativeFilePath": "複製相對路徑", - "contributes.commands.java.view.package.newJavaClass": "建立 Java 類別", - "contributes.commands.java.view.package.newPackage": "建立套件", + "contributes.commands.java.view.package.newJavaClass": "Java 類別", + "contributes.commands.java.view.package.newPackage": "套件", "contributes.commands.java.view.package.renameFile": "重新命名", "contributes.commands.java.view.package.moveFileToTrash": "刪除", "contributes.commands.java.view.package.deleteFilePermanently": "永久刪除", + "contributes.submenus.javaProject.new": "建立", + "contributes.commands.java.view.menus.file.newJavaClass": "建立 Java 類別", "configuration.java.dependency.showMembers": "在 Java 專案管理員中顯示成員", "configuration.java.dependency.syncWithFolderExplorer": "在 Java 專案管理員中同步關聯當前開啟的檔案", "configuration.java.dependency.autoRefresh": "在 Java 專案管理員中自動同步修改", diff --git a/src/commands.ts b/src/commands.ts index c8b8d641..0542cda1 100644 --- a/src/commands.ts +++ b/src/commands.ts @@ -46,6 +46,8 @@ export namespace Commands { export const VIEW_PACKAGE_REVEAL_IN_PROJECT_EXPLORER = "java.view.package.revealInProjectExplorer"; + export const VIEW_MENUS_FILE_NEW_JAVA_CLASS = "java.view.menus.file.newJavaClass"; + export const JAVA_PROJECT_OPEN = "_java.project.open"; export const JAVA_PROJECT_CREATE = "java.project.create"; diff --git a/src/explorerCommands/new.ts b/src/explorerCommands/new.ts index ba93aeb4..2e17bd62 100644 --- a/src/explorerCommands/new.ts +++ b/src/explorerCommands/new.ts @@ -5,26 +5,19 @@ import * as fse from "fs-extra"; import * as path from "path"; import { commands, Extension, extensions, languages, QuickPickItem, SnippetString, TextEditor, Uri, window, workspace, WorkspaceEdit, WorkspaceFolder } from "vscode"; -import { sendInfo } from "vscode-extension-telemetry-wrapper"; -import { Commands } from "../../extension.bundle"; +import { Commands, PrimaryTypeNode } from "../../extension.bundle"; import { ExtensionName } from "../constants"; import { NodeKind } from "../java/nodeData"; import { DataNode } from "../views/dataNode"; import { resourceRoots } from "../views/packageRootNode"; import { checkJavaQualifiedName } from "./utility"; +// TODO: separate to two function to handle creation from menu bar and explorer. export async function newJavaClass(node?: DataNode): Promise { let packageFsPath: string | undefined; if (!node) { - // from the new file menu entry - sendInfo("", { - triggerNewFileFrom: "menuBar", - }); packageFsPath = await inferPackageFsPath(); } else { - sendInfo("", { - triggerNewFileFrom: "projectExplorer", - }); if (!node?.uri || !canCreateClass(node)) { return; } @@ -209,6 +202,19 @@ export async function newPackage(node?: DataNode): Promise { } else if (nodeKind === NodeKind.Package) { defaultValue = node.nodeData.name + "."; packageRootPath = getPackageRootPath(Uri.parse(node.uri).fsPath, node.nodeData.name); + } else if (nodeKind === NodeKind.PrimaryType) { + const primaryTypeNode = node; + packageRootPath = primaryTypeNode.getPackageRootPath(); + if (packageRootPath === "") { + window.showErrorMessage("Failed to get the package root path."); + return; + } + const packagePath = await getPackageFsPath(node); + if (!packagePath) { + window.showErrorMessage("Failed to get the package path."); + return; + } + defaultValue = path.relative(packageRootPath, packagePath).replace(/[\\\/]/g, ".") + "."; } else { return; } @@ -239,14 +245,12 @@ export async function newPackage(node?: DataNode): Promise { await fse.ensureDir(getNewPackagePath(packageRootPath, packageName)); } +/** + * Check if the create package command is available for the given node. + * Currently the check logic is the same as the create class command. + */ function canCreatePackage(node: DataNode): boolean { - if (node.nodeData.kind === NodeKind.Project || - node.nodeData.kind === NodeKind.PackageRoot || - node.nodeData.kind === NodeKind.Package) { - return true; - } - - return false; + return canCreateClass(node); } function getPackageRootPath(packageFsPath: string, packageName: string): string { diff --git a/src/extension.ts b/src/extension.ts index 35eb624e..4f4ad709 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -19,6 +19,7 @@ import { DependencyExplorer } from "./views/dependencyExplorer"; import { DiagnosticProvider } from "./tasks/buildArtifact/migration/DiagnosticProvider"; import { setContextForDeprecatedTasks, updateExportTaskType } from "./tasks/buildArtifact/migration/utils"; import { CodeActionProvider } from "./tasks/buildArtifact/migration/CodeActionProvider"; +import { newJavaClass } from "./explorerCommands/new"; export async function activate(context: ExtensionContext): Promise { contextManager.initialize(context); @@ -46,7 +47,7 @@ async function activateExtension(_operationId: string, context: ExtensionContext context.subscriptions.push(tasks.registerTaskProvider(DeprecatedExportJarTaskProvider.type, new DeprecatedExportJarTaskProvider())); context.subscriptions.push(tasks.registerTaskProvider(BuildArtifactTaskProvider.exportJarType, new BuildArtifactTaskProvider())); context.subscriptions.push(tasks.registerTaskProvider(BuildTaskProvider.type, new BuildTaskProvider())); - + context.subscriptions.push(instrumentOperationAsVsCodeCommand(Commands.VIEW_MENUS_FILE_NEW_JAVA_CLASS, newJavaClass)); context.subscriptions.push(window.onDidChangeActiveTextEditor((e: TextEditor | undefined) => { setContextForReloadProject(e?.document); })); diff --git a/src/views/PrimaryTypeNode.ts b/src/views/PrimaryTypeNode.ts index 0f0e6693..e7182337 100644 --- a/src/views/PrimaryTypeNode.ts +++ b/src/views/PrimaryTypeNode.ts @@ -11,6 +11,8 @@ import { isTest } from "../utility"; import { DataNode } from "./dataNode"; import { DocumentSymbolNode } from "./documentSymbolNode"; import { ExplorerNode } from "./explorerNode"; +import { ProjectNode } from "./projectNode"; +import { IPackageRootNodeData, PackageRootKind } from "../java/packageRootNodeData"; export class PrimaryTypeNode extends DataNode { @@ -20,6 +22,19 @@ export class PrimaryTypeNode extends DataNode { super(nodeData, parent); } + public getPackageRootPath(): string { + if (this._rootNode?.uri) { + return Uri.parse(this._rootNode.uri).fsPath; + } + + const unmanagedFolder = this.getUnmanagedFolderAncestor(); + if (unmanagedFolder?.uri) { + return Uri.parse(unmanagedFolder.uri).fsPath; + } + + return ""; + } + protected async loadData(): Promise { if (!this.hasChildren() || !this.nodeData.uri) { return undefined; @@ -107,6 +122,46 @@ export class PrimaryTypeNode extends DataNode { contextValue += "+test"; } + if (this.belongsToSourceRoot() || this.getUnmanagedFolderAncestor()) { + contextValue += "+source"; + } + return contextValue; } + + /** + * Check if the type belongs to a source root. Following conditions can cause the + * result to be false: + * - The type belongs to a jar package + * - The type belongs to an unmanaged folder with '.' as its source root. + */ + private belongsToSourceRoot(): boolean { + const rootNodeData = this._rootNode?.nodeData; + if (!rootNodeData) { + return false; + } + + const data = rootNodeData; + if (data.entryKind === PackageRootKind.K_SOURCE) { + return true; + } + + return false; + } + + /** + * @returns ProjectNode if the current node is under an unmanaged folder, + * otherwise undefined. + */ + private getUnmanagedFolderAncestor(): ProjectNode | undefined { + let ancestor = this.getParent(); + while (ancestor && !(ancestor instanceof ProjectNode)) { + ancestor = ancestor.getParent(); + } + if (ancestor?.isUnmanagedFolder()) { + return ancestor; + } + + return undefined; + } } diff --git a/test/suite/contextValue.test.ts b/test/suite/contextValue.test.ts index 9fa1e1d5..061dde48 100644 --- a/test/suite/contextValue.test.ts +++ b/test/suite/contextValue.test.ts @@ -89,19 +89,19 @@ suite("Context Value Tests", () => { }); test("test class type node", async function() { - assert.ok(/java:type(?=.*?\b\+class\b)(?=.*?\b\+uri\b)/.test((await classType.getTreeItem()).contextValue || "")); + assert.ok(/java:type(?=.*?\b\+class\b)(?=.*?\b\+source\b)(?=.*?\b\+uri\b)/.test((await classType.getTreeItem()).contextValue || "")); }); test("test test-class type node", async function() { - assert.ok(/java:type(?=.*?\b\+class\b)(?=.*?\b\+test\b)(?=.*?\b\+uri\b)/.test((await testClassType.getTreeItem()).contextValue || "")); + assert.ok(/java:type(?=.*?\b\+class\b)(?=.*?\b\+test\b)(?=.*?\b\+source\b)(?=.*?\b\+uri\b)/.test((await testClassType.getTreeItem()).contextValue || "")); }); test("test enum type node", async function() { - assert.ok(/java:type(?=.*?\b\+enum\b)(?=.*?\b\+uri\b)/.test((await enumType.getTreeItem()).contextValue || "")); + assert.ok(/java:type(?=.*?\b\+enum\b)(?=.*?\b\+source\b)(?=.*?\b\+uri\b)/.test((await enumType.getTreeItem()).contextValue || "")); }); test("test interface type node", async function() { - assert.ok(/java:type(?=.*?\b\+interface\b)(?=.*?\b\+uri\b)/.test((await interfaceType.getTreeItem()).contextValue || "")); + assert.ok(/java:type(?=.*?\b\+interface\b)(?=.*?\b\+source\b)(?=.*?\b\+uri\b)/.test((await interfaceType.getTreeItem()).contextValue || "")); }); test("test folder node", async function() { From 169e166424bbc0eff43d9dced7d3a0678363b561 Mon Sep 17 00:00:00 2001 From: Sheng Chen Date: Wed, 12 Apr 2023 15:21:00 +0800 Subject: [PATCH 155/352] feat: Support creating new files/folders in Java Project explorer (#742) --- CHANGELOG.md | 1 + package.json | 37 +++++++++++- package.nls.json | 2 + package.nls.zh-cn.json | 2 + package.nls.zh-tw.json | 2 + src/commands.ts | 4 ++ src/explorerCommands/new.ts | 103 ++++++++++++++++++++++++++++++++ src/views/PrimaryTypeNode.ts | 25 -------- src/views/dependencyExplorer.ts | 8 ++- test/suite/contextValue.test.ts | 8 +-- 10 files changed, 159 insertions(+), 33 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b9416af7..6dffbd0d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0. - Display non-Java files in Java Projects explorer. [#145](https://github.com/microsoft/vscode-java-dependency/issues/145) - Apply file decorators to project level. [#481](https://github.com/microsoft/vscode-java-dependency/issues/481) - Give more hints about the project import status. [#580](https://github.com/microsoft/vscode-java-dependency/issues/580) +- Support creating files and folders in Java Projects explorer. [#598](https://github.com/microsoft/vscode-java-dependency/issues/598) ### Fixed - Apply `files.exclude` to Java Projects explorer. [#214](https://github.com/microsoft/vscode-java-dependency/issues/214) diff --git a/package.json b/package.json index 291b67bd..b77b08ae 100644 --- a/package.json +++ b/package.json @@ -180,6 +180,18 @@ "title": "%contributes.commands.java.view.package.newPackage%", "category": "Java" }, + { + "command": "java.view.package.newFile", + "title": "%contributes.commands.java.view.package.newFile%", + "category": "Java", + "icon": "$(new-file)" + }, + { + "command": "java.view.package.newFolder", + "title": "%contributes.commands.java.view.package.newFolder%", + "category": "Java", + "icon": "$(new-folder)" + }, { "command": "java.view.package.moveFileToTrash", "title": "%contributes.commands.java.view.package.moveFileToTrash%", @@ -361,6 +373,14 @@ "command": "java.view.package.newPackage", "when": "false" }, + { + "command": "java.view.package.newFile", + "when": "false" + }, + { + "command": "java.view.package.newFolder", + "when": "false" + }, { "command": "java.view.package.renameFile", "when": "false" @@ -530,7 +550,7 @@ }, { "submenu": "javaProject.new", - "when": "view == javaProjectExplorer && (viewItem =~ /java:(package|packageRoot)(?=.*?\\b\\+source\\b)(?=.*?\\b\\+uri\\b)/ || viewItem =~ /java:project(?=.*?\\b\\+java\\b)(?=.*?\\b\\+uri\\b)/ || viewItem =~ /java:type(?=.*?\\b\\+source\\b)(?=.*?\\b\\+uri\\b)/)", + "when": "view == javaProjectExplorer && viewItem =~ /java(?!:container)(?!:jar)(?!.*?\\b\\+binary\\b)(?=.*?\\b\\+uri\\b)/", "group": "1_new@10" }, { @@ -590,11 +610,22 @@ "javaProject.new": [ { "command": "java.view.package.newJavaClass", - "group": "new@10" + "group": "new@10", + "when": "view == javaProjectExplorer && (viewItem =~ /java:(package|packageRoot)(?=.*?\\b\\+source\\b)/ || viewItem =~ /java:project(?=.*?\\b\\+java\\b)/ || viewItem =~ /java:type/)" }, { "command": "java.view.package.newPackage", - "group": "new@40" + "group": "new@20", + "when": "view == javaProjectExplorer && (viewItem =~ /java:(package|packageRoot)(?=.*?\\b\\+source\\b)/ || viewItem =~ /java:project(?=.*?\\b\\+java\\b)/ || viewItem =~ /java:type/)" + }, + { + "command": "java.view.package.newFile", + "group": "new@30" + }, + { + "command": "java.view.package.newFolder", + "group": "new@40", + "when": "view == javaProjectExplorer && (viewItem =~ /java:(file|folder|project)/ || viewItem =~ /java:(packageRoot)(?=.*?\\b\\+resource\\b)/)" } ] }, diff --git a/package.nls.json b/package.nls.json index 507e2eaf..75eae2c5 100644 --- a/package.nls.json +++ b/package.nls.json @@ -21,6 +21,8 @@ "contributes.commands.java.view.package.copyRelativeFilePath": "Copy Relative Path", "contributes.commands.java.view.package.newJavaClass": "Java Class", "contributes.commands.java.view.package.newPackage": "Package", + "contributes.commands.java.view.package.newFile": "File", + "contributes.commands.java.view.package.newFolder": "Folder", "contributes.commands.java.view.package.renameFile": "Rename", "contributes.commands.java.view.package.moveFileToTrash": "Delete", "contributes.commands.java.view.package.deleteFilePermanently": "Delete Permanently", diff --git a/package.nls.zh-cn.json b/package.nls.zh-cn.json index 75a45a6d..3898a11b 100644 --- a/package.nls.zh-cn.json +++ b/package.nls.zh-cn.json @@ -21,6 +21,8 @@ "contributes.commands.java.view.package.copyRelativeFilePath": "复制相对路径", "contributes.commands.java.view.package.newJavaClass": "Java 类", "contributes.commands.java.view.package.newPackage": "包", + "contributes.commands.java.view.package.newFile": "文件", + "contributes.commands.java.view.package.newFolder": "文件夹", "contributes.commands.java.view.package.renameFile": "重命名", "contributes.commands.java.view.package.moveFileToTrash": "删除", "contributes.commands.java.view.package.deleteFilePermanently": "永久删除", diff --git a/package.nls.zh-tw.json b/package.nls.zh-tw.json index 461bfa00..a8151127 100644 --- a/package.nls.zh-tw.json +++ b/package.nls.zh-tw.json @@ -21,6 +21,8 @@ "contributes.commands.java.view.package.copyRelativeFilePath": "複製相對路徑", "contributes.commands.java.view.package.newJavaClass": "Java 類別", "contributes.commands.java.view.package.newPackage": "套件", + "contributes.commands.java.view.package.newFile": "檔案", + "contributes.commands.java.view.package.newFolder": "資料夾", "contributes.commands.java.view.package.renameFile": "重新命名", "contributes.commands.java.view.package.moveFileToTrash": "刪除", "contributes.commands.java.view.package.deleteFilePermanently": "永久刪除", diff --git a/src/commands.ts b/src/commands.ts index 0542cda1..baf3151d 100644 --- a/src/commands.ts +++ b/src/commands.ts @@ -46,6 +46,10 @@ export namespace Commands { export const VIEW_PACKAGE_REVEAL_IN_PROJECT_EXPLORER = "java.view.package.revealInProjectExplorer"; + export const VIEW_PACKAGE_NEW_FILE = "java.view.package.newFile"; + + export const VIEW_PACKAGE_NEW_FOLDER = "java.view.package.newFolder"; + export const VIEW_MENUS_FILE_NEW_JAVA_CLASS = "java.view.menus.file.newJavaClass"; export const JAVA_PROJECT_OPEN = "_java.project.open"; diff --git a/src/explorerCommands/new.ts b/src/explorerCommands/new.ts index 2e17bd62..45837ce0 100644 --- a/src/explorerCommands/new.ts +++ b/src/explorerCommands/new.ts @@ -11,6 +11,7 @@ import { NodeKind } from "../java/nodeData"; import { DataNode } from "../views/dataNode"; import { resourceRoots } from "../views/packageRootNode"; import { checkJavaQualifiedName } from "./utility"; +import { sendError, setUserError } from "vscode-extension-telemetry-wrapper"; // TODO: separate to two function to handle creation from menu bar and explorer. export async function newJavaClass(node?: DataNode): Promise { @@ -278,3 +279,105 @@ interface ISourcePath { projectName: string; projectType: string; } + +export async function newFile(node: DataNode): Promise { + const basePath = getBasePath(node); + if (!basePath) { + window.showErrorMessage("The selected node is invalid."); + return; + } + + const fileName: string | undefined = await window.showInputBox({ + placeHolder: "Input the file name", + ignoreFocusOut: true, + validateInput: async (value: string): Promise => { + return validateNewFileFolder(basePath, value); + }, + }); + + if (!fileName) { + return; + } + + // any continues separator will be deduplicated. + const relativePath = fileName.replace(/[/\\]+/g, path.sep); + const newFilePath = path.join(basePath, relativePath); + await createFile(newFilePath); +} + +async function createFile(newFilePath: string) { + fse.createFile(newFilePath, async (err: Error) => { + if (err) { + setUserError(err); + sendError(err); + const choice = await window.showErrorMessage( + err.message || "Failed to create file: " + path.basename(newFilePath), + "Retry" + ); + if (choice === "Retry") { + await createFile(newFilePath); + } + } else { + window.showTextDocument(Uri.file(newFilePath)); + } + }); +} + +export async function newFolder(node: DataNode): Promise { + const basePath = getBasePath(node); + if (!basePath) { + window.showErrorMessage("The selected node is invalid."); + return; + } + + const folderName: string | undefined = await window.showInputBox({ + placeHolder: "Input the folder name", + ignoreFocusOut: true, + validateInput: async (value: string): Promise => { + return validateNewFileFolder(basePath, value); + }, + }); + + if (!folderName) { + return; + } + + // any continues separator will be deduplicated. + const relativePath = folderName.replace(/[/\\]+/g, path.sep); + const newFolderPath = path.join(basePath, relativePath); + fse.mkdirs(newFolderPath); +} + +async function validateNewFileFolder(basePath: string, relativePath: string): Promise { + relativePath = relativePath.replace(/[/\\]+/g, path.sep); + if (await fse.pathExists(path.join(basePath, relativePath))) { + return "A file or folder already exists in the target location."; + } + + return ""; +} + +function getBasePath(node: DataNode): string | undefined { + if (!node.uri) { + return undefined; + } + + const uri: Uri = Uri.parse(node.uri); + if (uri.scheme !== "file") { + return undefined; + } + + const nodeKind = node.nodeData.kind; + switch (nodeKind) { + case NodeKind.Project: + case NodeKind.PackageRoot: + case NodeKind.Package: + case NodeKind.Folder: + return Uri.parse(node.uri!).fsPath; + case NodeKind.PrimaryType: + case NodeKind.File: + return path.dirname(Uri.parse(node.uri).fsPath); + default: + return undefined; + } +} diff --git a/src/views/PrimaryTypeNode.ts b/src/views/PrimaryTypeNode.ts index e7182337..3b5540ca 100644 --- a/src/views/PrimaryTypeNode.ts +++ b/src/views/PrimaryTypeNode.ts @@ -12,7 +12,6 @@ import { DataNode } from "./dataNode"; import { DocumentSymbolNode } from "./documentSymbolNode"; import { ExplorerNode } from "./explorerNode"; import { ProjectNode } from "./projectNode"; -import { IPackageRootNodeData, PackageRootKind } from "../java/packageRootNodeData"; export class PrimaryTypeNode extends DataNode { @@ -122,33 +121,9 @@ export class PrimaryTypeNode extends DataNode { contextValue += "+test"; } - if (this.belongsToSourceRoot() || this.getUnmanagedFolderAncestor()) { - contextValue += "+source"; - } - return contextValue; } - /** - * Check if the type belongs to a source root. Following conditions can cause the - * result to be false: - * - The type belongs to a jar package - * - The type belongs to an unmanaged folder with '.' as its source root. - */ - private belongsToSourceRoot(): boolean { - const rootNodeData = this._rootNode?.nodeData; - if (!rootNodeData) { - return false; - } - - const data = rootNodeData; - if (data.entryKind === PackageRootKind.K_SOURCE) { - return true; - } - - return false; - } - /** * @returns ProjectNode if the current node is under an unmanaged folder, * otherwise undefined. diff --git a/src/views/dependencyExplorer.ts b/src/views/dependencyExplorer.ts index 117fe031..3e401df3 100644 --- a/src/views/dependencyExplorer.ts +++ b/src/views/dependencyExplorer.ts @@ -12,7 +12,7 @@ import { import { instrumentOperationAsVsCodeCommand, sendInfo } from "vscode-extension-telemetry-wrapper"; import { Commands } from "../commands"; import { deleteFiles } from "../explorerCommands/delete"; -import { newJavaClass, newPackage } from "../explorerCommands/new"; +import { newFile, newFolder, newJavaClass, newPackage } from "../explorerCommands/new"; import { renameFile } from "../explorerCommands/rename"; import { getCmdNode } from "../explorerCommands/utility"; import { Jdtls } from "../java/jdtls"; @@ -110,6 +110,12 @@ export class DependencyExplorer implements Disposable { instrumentOperationAsVsCodeCommand(Commands.VIEW_PACKAGE_NEW_JAVA_CLASS, async (node?: DataNode) => { newJavaClass(node); }), + instrumentOperationAsVsCodeCommand(Commands.VIEW_PACKAGE_NEW_FILE, async (node: DataNode) => { + newFile(node); + }), + instrumentOperationAsVsCodeCommand(Commands.VIEW_PACKAGE_NEW_FOLDER, async (node: DataNode) => { + newFolder(node); + }), instrumentOperationAsVsCodeCommand(Commands.VIEW_PACKAGE_NEW_JAVA_PACKAGE, async (node?: DataNode) => { let cmdNode = getCmdNode(this._dependencyViewer.selection, node); if (!cmdNode) { diff --git a/test/suite/contextValue.test.ts b/test/suite/contextValue.test.ts index 061dde48..9fa1e1d5 100644 --- a/test/suite/contextValue.test.ts +++ b/test/suite/contextValue.test.ts @@ -89,19 +89,19 @@ suite("Context Value Tests", () => { }); test("test class type node", async function() { - assert.ok(/java:type(?=.*?\b\+class\b)(?=.*?\b\+source\b)(?=.*?\b\+uri\b)/.test((await classType.getTreeItem()).contextValue || "")); + assert.ok(/java:type(?=.*?\b\+class\b)(?=.*?\b\+uri\b)/.test((await classType.getTreeItem()).contextValue || "")); }); test("test test-class type node", async function() { - assert.ok(/java:type(?=.*?\b\+class\b)(?=.*?\b\+test\b)(?=.*?\b\+source\b)(?=.*?\b\+uri\b)/.test((await testClassType.getTreeItem()).contextValue || "")); + assert.ok(/java:type(?=.*?\b\+class\b)(?=.*?\b\+test\b)(?=.*?\b\+uri\b)/.test((await testClassType.getTreeItem()).contextValue || "")); }); test("test enum type node", async function() { - assert.ok(/java:type(?=.*?\b\+enum\b)(?=.*?\b\+source\b)(?=.*?\b\+uri\b)/.test((await enumType.getTreeItem()).contextValue || "")); + assert.ok(/java:type(?=.*?\b\+enum\b)(?=.*?\b\+uri\b)/.test((await enumType.getTreeItem()).contextValue || "")); }); test("test interface type node", async function() { - assert.ok(/java:type(?=.*?\b\+interface\b)(?=.*?\b\+source\b)(?=.*?\b\+uri\b)/.test((await interfaceType.getTreeItem()).contextValue || "")); + assert.ok(/java:type(?=.*?\b\+interface\b)(?=.*?\b\+uri\b)/.test((await interfaceType.getTreeItem()).contextValue || "")); }); test("test folder node", async function() { From e5565db7f0ff16ee488c7059d1dcf4cfb1034dd7 Mon Sep 17 00:00:00 2001 From: Sheng Chen Date: Wed, 12 Apr 2023 16:03:25 +0800 Subject: [PATCH 156/352] feat: Show non Java Projects in the Java Projects explorer (#744) * feat: Show non Java Projects in the Java Projects explorer --------- Signed-off-by: Sheng Chen --- CHANGELOG.md | 4 +- extension.bundle.ts | 3 + .../jdtls/ext/core/PackageCommand.java | 70 ++++++++++++------- .../jdtls/ext/core/ProjectCommand.java | 17 ++++- src/java/jdtls.ts | 7 +- test/maven-suite/projectView.test.ts | 10 ++- 6 files changed, 73 insertions(+), 38 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6dffbd0d..5e863c5b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,10 +7,10 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0. ## 0.22.0 ### Added - Display non-Java files in Java Projects explorer. [#145](https://github.com/microsoft/vscode-java-dependency/issues/145) +- Show non Java Projects in the Java Projects explorer. [#736](https://github.com/microsoft/vscode-java-dependency/issues/736) +- Support creating files and folders in Java Projects explorer. [#598](https://github.com/microsoft/vscode-java-dependency/issues/598) - Apply file decorators to project level. [#481](https://github.com/microsoft/vscode-java-dependency/issues/481) - Give more hints about the project import status. [#580](https://github.com/microsoft/vscode-java-dependency/issues/580) -- Support creating files and folders in Java Projects explorer. [#598](https://github.com/microsoft/vscode-java-dependency/issues/598) - ### Fixed - Apply `files.exclude` to Java Projects explorer. [#214](https://github.com/microsoft/vscode-java-dependency/issues/214) diff --git a/extension.bundle.ts b/extension.bundle.ts index e192e8ff..e07cf41e 100644 --- a/extension.bundle.ts +++ b/extension.bundle.ts @@ -28,3 +28,6 @@ export { languageServerApiManager } from "./src/languageServerApi/languageServer // tasks export { BuildTaskProvider, categorizePaths, getFinalPaths } from "./src/tasks/build/buildTaskProvider"; + +// delegate commands +export { Jdtls } from "./src/java/jdtls"; diff --git a/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/PackageCommand.java b/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/PackageCommand.java index f91eb429..e58af4d4 100644 --- a/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/PackageCommand.java +++ b/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/PackageCommand.java @@ -19,6 +19,7 @@ import java.util.LinkedList; import java.util.List; import java.util.Map; +import java.util.Set; import java.util.function.BiFunction; import java.util.stream.Collectors; @@ -31,6 +32,7 @@ import org.eclipse.core.resources.IWorkspaceRoot; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.CoreException; +import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.OperationCanceledException; @@ -257,18 +259,22 @@ private static List getParentAncestorNodes(IResource element) throw * Get the class path container list. */ private static List getProjectChildren(PackageParams query, IProgressMonitor pm) { - IJavaProject javaProject = getJavaProject(query.getProjectUri()); - if (javaProject != null) { - refreshLocal(javaProject.getProject(), pm); - List children = new LinkedList<>(); - boolean hasReferencedLibraries = false; - try { + IProject project = getProject(query.getProjectUri()); + if (project == null) { + JdtlsExtActivator.logError("Failed to find project at: " + query.getProjectUri()); + } + + List children = new LinkedList<>(); + boolean hasReferencedLibraries = false; + IJavaProject javaProject = JavaCore.create(project); + try { + if (ProjectUtils.isJavaProject(project) && javaProject != null) { + refreshLocal(javaProject.getProject(), pm); IClasspathEntry[] references = javaProject.getRawClasspath(); for (IClasspathEntry entry : references) { int entryKind = entry.getEntryKind(); if (entryKind == IClasspathEntry.CPE_SOURCE) { - IPackageFragmentRoot[] packageFragmentRoots = javaProject.findPackageFragmentRoots(entry); - children.addAll(Arrays.asList(packageFragmentRoots)); + Collections.addAll(children, javaProject.findPackageFragmentRoots(entry)); } else if (entryKind == IClasspathEntry.CPE_CONTAINER) { children.add(entry); } else if (entry.getEntryKind() == IClasspathEntry.CPE_LIBRARY || entry.getEntryKind() == IClasspathEntry.CPE_VARIABLE) { @@ -278,24 +284,32 @@ private static List getProjectChildren(PackageParams query, IProgre } } Collections.addAll(children, javaProject.getNonJavaResources()); - } catch (CoreException e) { - JdtlsExtActivator.logException("Problem load project library ", e); + } else { + Set projectPaths = Arrays.stream(ProjectUtils.getAllProjects()) + .map(IProject::getLocation).collect(Collectors.toSet()); + IResource[] members = project.members(); + for (IResource member : members) { + if (!projectPaths.contains(member.getLocation())) { + children.add(member); + } + } } + } catch (CoreException e) { + JdtlsExtActivator.logException("Problem load project library ", e); + } - ResourceSet resourceSet = new ResourceSet(children); - ResourceVisitor visitor = new JavaResourceVisitor(javaProject); - resourceSet.accept(visitor); - List result = visitor.getNodes(); + ResourceSet resourceSet = new ResourceSet(children); + ResourceVisitor visitor = new JavaResourceVisitor(javaProject); + resourceSet.accept(visitor); + List result = visitor.getNodes(); - // Invisible project will always have the referenced libraries entry - if (!ProjectUtils.isVisibleProject(javaProject.getProject())) { - result.add(PackageNode.REFERENCED_LIBRARIES_CONTAINER); - } else if (hasReferencedLibraries) { - result.add(PackageNode.IMMUTABLE_REFERENCED_LIBRARIES_CONTAINER); - } - return result; + // Invisible project will always have the referenced libraries entry + if (!ProjectUtils.isVisibleProject(project)) { + result.add(PackageNode.REFERENCED_LIBRARIES_CONTAINER); + } else if (hasReferencedLibraries) { + result.add(PackageNode.IMMUTABLE_REFERENCED_LIBRARIES_CONTAINER); } - return Collections.emptyList(); + return result; } private static List getContainerChildren(PackageParams query, IProgressMonitor pm) { @@ -567,7 +581,7 @@ private static Object[] findJarDirectoryChildren(JarEntryDirectory directory, St return null; } - public static IJavaProject getJavaProject(String projectUri) { + public static IProject getProject(String projectUri) { IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot(); IContainer[] containers = root.findContainersForLocationURI(JDTUtils.toURI(projectUri)); @@ -576,8 +590,7 @@ public static IJavaProject getJavaProject(String projectUri) { } // For multi-module scenario, findContainersForLocationURI API may return a container array, - // need filter out non-Java project and put the result from the nearest project in front. - containers = Arrays.stream(containers).filter(c -> ProjectUtils.isJavaProject(c.getProject())).toArray(IContainer[]::new); + // put the result from the nearest project in front. Arrays.sort(containers, (Comparator) (IContainer a, IContainer b) -> { return a.getFullPath().toPortableString().length() - b.getFullPath().toPortableString().length(); }); @@ -587,11 +600,16 @@ public static IJavaProject getJavaProject(String projectUri) { if (!project.exists()) { return null; } - return JavaCore.create(project); + return project; } return null; } + public static IJavaProject getJavaProject(String projectUri) { + IProject project = getProject(projectUri); + return JavaCore.create(project); + } + private static void refreshLocal(IResource resource, IProgressMonitor monitor) { if (resource == null || !resource.exists()) { return; diff --git a/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/ProjectCommand.java b/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/ProjectCommand.java index 968a1af4..bb708f28 100644 --- a/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/ProjectCommand.java +++ b/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/ProjectCommand.java @@ -18,6 +18,7 @@ import java.io.FileOutputStream; import java.io.IOException; import java.util.ArrayList; +import java.util.Arrays; import java.util.HashSet; import java.util.List; import java.util.Objects; @@ -98,10 +99,20 @@ public static List listProjects(List arguments, IProgressMo String workspaceUri = (String) arguments.get(0); IPath workspaceFolderPath = ResourceUtils.canonicalFilePathFromURI(workspaceUri); - IJavaProject[] javaProjects = ProjectUtils.getJavaProjects(); + IProject[] projects; + boolean includeNonJava = false; + if (arguments.size() > 1) { + includeNonJava = (boolean) arguments.get(1); + } + if (includeNonJava) { + projects = ProjectUtils.getAllProjects(); + } else { + projects = Arrays.stream(ProjectUtils.getJavaProjects()) + .map(IJavaProject::getProject).toArray(IProject[]::new); + } + ArrayList children = new ArrayList<>(); - for (IJavaProject javaProject : javaProjects) { - IProject project = javaProject.getProject(); + for (IProject project : projects) { if (!project.isAccessible() || project.getLocation() == null) { continue; } diff --git a/src/java/jdtls.ts b/src/java/jdtls.ts index bdd9a498..ad7c228b 100644 --- a/src/java/jdtls.ts +++ b/src/java/jdtls.ts @@ -11,7 +11,12 @@ import { INodeData } from "./nodeData"; export namespace Jdtls { export async function getProjects(params: string): Promise { - return await commands.executeCommand(Commands.EXECUTE_WORKSPACE_COMMAND, Commands.JAVA_PROJECT_LIST, params) || []; + return await commands.executeCommand( + Commands.EXECUTE_WORKSPACE_COMMAND, + Commands.JAVA_PROJECT_LIST, + params, + true /*includeNonJavaProjects*/ + ) || []; } export async function getProjectUris(): Promise { diff --git a/test/maven-suite/projectView.test.ts b/test/maven-suite/projectView.test.ts index 11fffebf..03a4fe6e 100644 --- a/test/maven-suite/projectView.test.ts +++ b/test/maven-suite/projectView.test.ts @@ -5,8 +5,8 @@ import * as assert from "assert"; import * as clipboardy from "clipboardy"; import * as path from "path"; import * as vscode from "vscode"; -import { Commands, ContainerNode, contextManager, DataNode, DependencyExplorer, FileNode, IMainClassInfo, - INodeData, NodeKind, PackageNode, PackageRootNode, PrimaryTypeNode, ProjectNode } from "../../extension.bundle"; +import { Commands, ContainerNode, contextManager, DataNode, DependencyExplorer, FileNode, + INodeData, Jdtls, NodeKind, PackageNode, PackageRootNode, PrimaryTypeNode, ProjectNode } from "../../extension.bundle"; import { fsPath, setupTestEnv, Uris } from "../shared"; import { sleep } from "../util"; @@ -175,8 +175,7 @@ suite("Maven Project View Tests", () => { test("Can execute command java.project.list correctly", async function() { const workspaceFolders = vscode.workspace.workspaceFolders; assert.ok(workspaceFolders, `There should be valid workspace folders`); - const projects = await vscode.commands.executeCommand(Commands.EXECUTE_WORKSPACE_COMMAND, - Commands.JAVA_PROJECT_LIST, workspaceFolders![0].uri.toString()); + const projects = await Jdtls.getProjects(workspaceFolders![0].uri.toString()); assert.equal(projects?.length, 1, "project's length should be 1"); assert.equal(projects![0].name, "my-app", "project should be my-app"); }); @@ -217,8 +216,7 @@ suite("Maven Project View Tests", () => { test("Can execute command java.project.getMainClasses correctly", async function() { const workspaceFolders = vscode.workspace.workspaceFolders; assert.ok(workspaceFolders, `There should be valid workspace folders`); - const mainClasses = await vscode.commands.executeCommand(Commands.EXECUTE_WORKSPACE_COMMAND, - Commands.JAVA_PROJECT_GETMAINCLASSES, workspaceFolders![0].uri.toString()); + const mainClasses = await Jdtls.getMainClasses(workspaceFolders![0].uri.toString()); assert.equal(mainClasses?.length, 1, "mainClasses' length should be 1"); assert.equal(mainClasses![0].name, "com.mycompany.app.App", "mainClasses[0]'s name should be com.mycompany.app.App"); }); From b3c85657968f3752d7082c2697b3a2aea7e12224 Mon Sep 17 00:00:00 2001 From: Sheng Chen Date: Wed, 12 Apr 2023 20:24:10 +0800 Subject: [PATCH 157/352] fix: Show 'module-info.java' at source roots (#745) --- CHANGELOG.md | 4 +- .../jdtls/ext/core/PackageCommand.java | 5 ++- .../ext/core/parser/JavaResourceVisitor.java | 8 ++++ .../jdtls/ext/core/parser/ResourceSet.java | 3 ++ .../ext/core/parser/ResourceVisitor.java | 3 ++ test/maven-suite/projectView.test.ts | 38 ++++++++++++------- test/maven/pom.xml | 4 ++ test/maven/src/main/java/module-info.java | 4 ++ 8 files changed, 53 insertions(+), 16 deletions(-) create mode 100644 test/maven/src/main/java/module-info.java diff --git a/CHANGELOG.md b/CHANGELOG.md index 5e863c5b..6a6d37c6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,12 +7,14 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0. ## 0.22.0 ### Added - Display non-Java files in Java Projects explorer. [#145](https://github.com/microsoft/vscode-java-dependency/issues/145) -- Show non Java Projects in the Java Projects explorer. [#736](https://github.com/microsoft/vscode-java-dependency/issues/736) +- Show non Java projects in the Java Projects explorer. [#736](https://github.com/microsoft/vscode-java-dependency/issues/736) - Support creating files and folders in Java Projects explorer. [#598](https://github.com/microsoft/vscode-java-dependency/issues/598) - Apply file decorators to project level. [#481](https://github.com/microsoft/vscode-java-dependency/issues/481) - Give more hints about the project import status. [#580](https://github.com/microsoft/vscode-java-dependency/issues/580) ### Fixed - Apply `files.exclude` to Java Projects explorer. [#214](https://github.com/microsoft/vscode-java-dependency/issues/214) +- Empty packages will not appear sometimes. [#600](https://github.com/microsoft/vscode-java-dependency/issues/600) +- Show `module-info.java` at source roots. [698](https://github.com/microsoft/vscode-java-dependency/issues/698) ## 0.21.2 ### Fixed diff --git a/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/PackageCommand.java b/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/PackageCommand.java index e58af4d4..ae6731ef 100644 --- a/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/PackageCommand.java +++ b/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/PackageCommand.java @@ -540,9 +540,10 @@ public static List getPackageFragmentRootContent(IPackageFragmentRoot ro IModuleDescription moduleDescription = root.getModuleDescription(); if (moduleDescription != null) { - IClassFile moduleInfo = moduleDescription.getClassFile(); - if (moduleInfo != null) { + if (moduleDescription.getClassFile() != null) { result.add(moduleDescription.getClassFile()); + } else if (moduleDescription.getCompilationUnit() != null) { + result.add(moduleDescription.getCompilationUnit()); } } return result; diff --git a/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/parser/JavaResourceVisitor.java b/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/parser/JavaResourceVisitor.java index 9d7a4f4e..92ea8338 100644 --- a/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/parser/JavaResourceVisitor.java +++ b/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/parser/JavaResourceVisitor.java @@ -18,6 +18,7 @@ import org.eclipse.core.resources.IFolder; import org.eclipse.jdt.core.IClassFile; import org.eclipse.jdt.core.IClasspathEntry; +import org.eclipse.jdt.core.ICompilationUnit; import org.eclipse.jdt.core.IJarEntryResource; import org.eclipse.jdt.core.IJavaProject; import org.eclipse.jdt.core.IPackageFragment; @@ -58,6 +59,13 @@ public void visit(IClassFile classFile) { this.nodes.add(node); } + @Override + public void visit(ICompilationUnit compilationUnit) { + PackageNode node = new PackageNode(compilationUnit.getElementName(), null, NodeKind.FILE); + node.setUri(JDTUtils.toUri(compilationUnit)); + this.nodes.add(node); + } + @Override public void visit(IFile file) { this.nodes.add(PackageNode.createNodeForFile(file)); diff --git a/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/parser/ResourceSet.java b/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/parser/ResourceSet.java index 50ba9eba..dde7eec5 100644 --- a/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/parser/ResourceSet.java +++ b/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/parser/ResourceSet.java @@ -25,6 +25,7 @@ import org.eclipse.core.runtime.NullProgressMonitor; import org.eclipse.jdt.core.IClassFile; import org.eclipse.jdt.core.IClasspathEntry; +import org.eclipse.jdt.core.ICompilationUnit; import org.eclipse.jdt.core.IJarEntryResource; import org.eclipse.jdt.core.IJavaProject; import org.eclipse.jdt.core.IPackageFragment; @@ -101,6 +102,8 @@ public void accept(ResourceVisitor visitor) { visitor.visit((IType) resource); } else if (resource instanceof IClassFile) { visitor.visit((IClassFile) resource); + } else if (resource instanceof ICompilationUnit) { + visitor.visit((ICompilationUnit) resource); } else if (resource instanceof IFile) { if (shouldVisit((IFile) resource)) { visitor.visit((IFile) resource); diff --git a/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/parser/ResourceVisitor.java b/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/parser/ResourceVisitor.java index 2030e08a..cb0cbf45 100644 --- a/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/parser/ResourceVisitor.java +++ b/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/parser/ResourceVisitor.java @@ -17,6 +17,7 @@ import org.eclipse.core.resources.IFolder; import org.eclipse.jdt.core.IClassFile; import org.eclipse.jdt.core.IClasspathEntry; +import org.eclipse.jdt.core.ICompilationUnit; import org.eclipse.jdt.core.IJarEntryResource; import org.eclipse.jdt.core.IPackageFragment; import org.eclipse.jdt.core.IPackageFragmentRoot; @@ -40,6 +41,8 @@ public interface ResourceVisitor { void visit(IClassFile classFile); + void visit(ICompilationUnit compilationUnit); + void visit(IFile file); void visit(IFolder folder); diff --git a/test/maven-suite/projectView.test.ts b/test/maven-suite/projectView.test.ts index 03a4fe6e..52bbcb8b 100644 --- a/test/maven-suite/projectView.test.ts +++ b/test/maven-suite/projectView.test.ts @@ -33,11 +33,14 @@ suite("Maven Project View Tests", () => { const mainPackage = projectChildren[0] as PackageRootNode; assert.equal(mainPackage.name, "src/main/java", "Package name should be \"src/main/java\""); - const primarySubPackages = await mainPackage.getChildren(); - assert.equal(primarySubPackages.length, 1, "Number of primary subpackages should be 1"); - const primarySubPackage = primarySubPackages[0] as PackageNode; + const mainSourceSetChildren = await mainPackage.getChildren(); + assert.equal(mainSourceSetChildren.length, 2, "Number of primary subpackages should be 2"); + const primarySubPackage = mainSourceSetChildren[0] as DataNode; assert.equal(primarySubPackage.name, "com.mycompany", "Name of primary subpackage should be \"com.mycompany\""); + const moduleInfo = mainSourceSetChildren[1] as DataNode; + assert.equal(moduleInfo.name, "module-info.java"); + const secondarySubPackages = await primarySubPackage.getChildren(); assert.equal(secondarySubPackages.length, 2, "Number of secondary subpackages should be 1"); const firstSecondarySubPackage = secondarySubPackages[0] as PackageNode; @@ -85,15 +88,23 @@ suite("Maven Project View Tests", () => { assert.equal(mavenDependency.name, "Maven Dependencies", "Container name should be \"Maven Dependencies\""); // validate package nodes - const mainSubPackages = await mainPackage.getChildren(); - const testSubPackages = await testPackage.getChildren(); - assert.equal(mainSubPackages.length, 2, "Number of main sub packages should be 2"); - assert.equal(testSubPackages.length, 1, "Number of test sub packages should be 1"); - const firstMainSubPackage = mainSubPackages[0] as PackageNode; - const secondMainSubPackage = mainSubPackages[1] as PackageNode; - const testSubPackage = testSubPackages[0] as PackageNode; + const mainSourceSetChildren = await mainPackage.getChildren(); + assert.equal(mainSourceSetChildren.length, 3, "Number of main source set children should be 3"); + + const firstMainSubPackage = mainSourceSetChildren[0] as DataNode; assert.equal(firstMainSubPackage.name, "com.mycompany.app", "Name of first main subpackage should be \"com.mycompany.app\""); + + const secondMainSubPackage = mainSourceSetChildren[1] as DataNode; assert.equal(secondMainSubPackage.name, "com.mycompany.app1", "Name of second main subpackage should be \"com.mycompany.app1\""); + + const moduleInfo = mainSourceSetChildren[2] as DataNode; + assert.equal(moduleInfo.name, "module-info.java"); + + const testSourceSetChildren = await testPackage.getChildren(); + assert.equal(testSourceSetChildren.length, 1, "Number of test sub packages should be 1"); + const testSubPackage = testSourceSetChildren[0] as PackageNode; + + assert.equal(testSubPackage.name, "com.mycompany.app", "Name of test subpackage should be \"com.mycompany.app\""); // validate innermost layer nodes @@ -195,9 +206,10 @@ suite("Maven Project View Tests", () => { path: mainPackage.nodeData.name, handlerIdentifier: mainPackage.nodeData.handlerIdentifier, }); - assert.equal(packages?.length, 2, "packages' length should be 2"); - assert.equal(packages![0].name, "com.mycompany.app", "package[0]'s name should be com.mycompany.app"); - assert.equal(packages![1].name, "com.mycompany.app1", "package[1]'s name should be com.mycompany.app1"); + assert.equal(packages?.length, 3, "packages' length should be 3"); + assert.equal(packages![0].name, "com.mycompany.app"); + assert.equal(packages![1].name, "com.mycompany.app1"); + assert.equal(packages![2].name, "module-info.java"); }); test("Can execute command java.resolvePath correctly", async function() { diff --git a/test/maven/pom.xml b/test/maven/pom.xml index f7b730f5..737919d4 100644 --- a/test/maven/pom.xml +++ b/test/maven/pom.xml @@ -7,6 +7,10 @@ 1.0-SNAPSHOT my-app http://maven.apache.org + + 17 + 17 + junit diff --git a/test/maven/src/main/java/module-info.java b/test/maven/src/main/java/module-info.java new file mode 100644 index 00000000..31434166 --- /dev/null +++ b/test/maven/src/main/java/module-info.java @@ -0,0 +1,4 @@ +module my.app { + exports com.mycompany.app1; + exports com.mycompany.app; +} From a3abd05e3c0b3f24d7a26ab38e5bd3f9ac2da593 Mon Sep 17 00:00:00 2001 From: Sheng Chen Date: Thu, 13 Apr 2023 14:21:55 +0800 Subject: [PATCH 158/352] fix: Better handling the import error hint (#747) --- .../jdtls/ext/core/ProjectCommand.java | 22 +++++++++++-------- src/views/dependencyDataProvider.ts | 13 ++++++----- 2 files changed, 20 insertions(+), 15 deletions(-) diff --git a/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/ProjectCommand.java b/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/ProjectCommand.java index bb708f28..b9cfa067 100644 --- a/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/ProjectCommand.java +++ b/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/ProjectCommand.java @@ -296,25 +296,29 @@ public static String getModuleName(IJavaProject project) { public static boolean checkImportStatus() { IProject[] projects = ProjectUtils.getAllProjects(); + boolean hasError = false; for (IProject project : projects) { if (ProjectsManager.DEFAULT_PROJECT_NAME.equals(project.getName())) { continue; } + + // if a Java project found, we think it as success import now. + if (ProjectUtils.isJavaProject(project)) { + return false; + } + try { - List markers = ResourceUtils.getErrorMarkers(project); - if (markers != null) { - boolean hasError = markers.stream().anyMatch(m -> { - return m.getAttribute(IMarker.SEVERITY, 0) == IMarker.SEVERITY_ERROR; - }); - if (hasError) { - return true; - } + int maxProblemSeverity = project.findMaxProblemSeverity(null, true, IResource.DEPTH_ONE); + if (maxProblemSeverity == IMarker.SEVERITY_ERROR) { + hasError = true; + break; } } catch (CoreException e) { JdtlsExtActivator.log(e); } } - return false; + + return hasError; } private static void reportExportJarMessage(String terminalId, int severity, String message) { diff --git a/src/views/dependencyDataProvider.ts b/src/views/dependencyDataProvider.ts index 24676a49..00f0827f 100644 --- a/src/views/dependencyDataProvider.ts +++ b/src/views/dependencyDataProvider.ts @@ -173,6 +173,12 @@ export class DependencyDataProvider implements TreeDataProvider { return this._rootItems; } + const hasJavaError: boolean = await Jdtls.checkImportStatus(); + if (hasJavaError) { + contextManager.setContextValue(Context.IMPORT_FAILED, true); + return []; + } + const rootItems: ExplorerNode[] = []; const folders = workspace.workspaceFolders; if (folders && folders.length) { @@ -192,12 +198,7 @@ export class DependencyDataProvider implements TreeDataProvider { } } if (_.isEmpty(rootItems)) { - const hasJavaError: boolean = await Jdtls.checkImportStatus(); - if (hasJavaError) { - contextManager.setContextValue(Context.IMPORT_FAILED, true); - } else { - contextManager.setContextValue(Context.NO_JAVA_PROJECT, true); - } + contextManager.setContextValue(Context.NO_JAVA_PROJECT, true); } return rootItems; } finally { From 960dcf0b8d2d76353b12c9c0a61eaab926fbe96a Mon Sep 17 00:00:00 2001 From: Sheng Chen Date: Fri, 14 Apr 2023 12:34:24 +0800 Subject: [PATCH 159/352] feat: Introduce a setting to control whether non-Java resources should be filtered (#749) * feat: Introduce a setting to control whether non-Java resources should be filtered --- CHANGELOG.md | 3 ++- .../jdtls/ext/core/ProjectCommand.java | 6 ++--- package-lock.json | 16 +++++++------- package.json | 22 +++++++++++++++++++ package.nls.json | 3 +++ package.nls.zh-cn.json | 3 +++ src/commands.ts | 2 ++ src/java/jdtls.ts | 13 +++++++++-- src/settings.ts | 22 ++++++++++++++++++- src/views/dependencyExplorer.ts | 18 +++++++++++++++ test/maven-suite/projectView.test.ts | 12 ++++++++++ 11 files changed, 105 insertions(+), 15 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6a6d37c6..91883ca9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,7 +7,8 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0. ## 0.22.0 ### Added - Display non-Java files in Java Projects explorer. [#145](https://github.com/microsoft/vscode-java-dependency/issues/145) -- Show non Java projects in the Java Projects explorer. [#736](https://github.com/microsoft/vscode-java-dependency/issues/736) +- Show non-Java projects in the Java Projects explorer. [#736](https://github.com/microsoft/vscode-java-dependency/issues/736) +- Introduce a setting: `java.project.explorer.filters` to control whether non-Java resources show in Java Projects explorer. [#751](https://github.com/microsoft/vscode-java-dependency/issues/751) - Support creating files and folders in Java Projects explorer. [#598](https://github.com/microsoft/vscode-java-dependency/issues/598) - Apply file decorators to project level. [#481](https://github.com/microsoft/vscode-java-dependency/issues/481) - Give more hints about the project import status. [#580](https://github.com/microsoft/vscode-java-dependency/issues/580) diff --git a/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/ProjectCommand.java b/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/ProjectCommand.java index b9cfa067..1c89a202 100644 --- a/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/ProjectCommand.java +++ b/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/ProjectCommand.java @@ -100,11 +100,11 @@ public static List listProjects(List arguments, IProgressMo IPath workspaceFolderPath = ResourceUtils.canonicalFilePathFromURI(workspaceUri); IProject[] projects; - boolean includeNonJava = false; + boolean filterNonJava = false; if (arguments.size() > 1) { - includeNonJava = (boolean) arguments.get(1); + filterNonJava = (boolean) arguments.get(1); } - if (includeNonJava) { + if (!filterNonJava) { projects = ProjectUtils.getAllProjects(); } else { projects = Arrays.stream(ProjectUtils.getJavaProjects()) diff --git a/package-lock.json b/package-lock.json index caefc95b..2b66c71d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -26,7 +26,7 @@ "@types/mocha": "^9.1.1", "@types/node": "^16.18.11", "@types/semver": "^7.3.13", - "@types/vscode": "1.69.0", + "@types/vscode": "1.75.0", "@vscode/test-electron": "^2.2.2", "copy-webpack-plugin": "^11.0.0", "glob": "^7.2.3", @@ -39,7 +39,7 @@ "webpack-cli": "^4.10.0" }, "engines": { - "vscode": "^1.69.0" + "vscode": "^1.75.0" } }, "node_modules/@babel/code-frame": { @@ -449,9 +449,9 @@ "dev": true }, "node_modules/@types/vscode": { - "version": "1.69.0", - "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.69.0.tgz", - "integrity": "sha512-RlzDAnGqUoo9wS6d4tthNyAdZLxOIddLiX3djMoWk29jFfSA1yJbIwr0epBYqqYarWB6s2Z+4VaZCQ80Jaa3kA==", + "version": "1.75.0", + "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.75.0.tgz", + "integrity": "sha512-SAr0PoOhJS6FUq5LjNr8C/StBKALZwDVm3+U4pjF/3iYkt3GioJOPV/oB1Sf1l7lROe4TgrMyL5N1yaEgTWycw==", "dev": true }, "node_modules/@types/ws": { @@ -5523,9 +5523,9 @@ "dev": true }, "@types/vscode": { - "version": "1.69.0", - "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.69.0.tgz", - "integrity": "sha512-RlzDAnGqUoo9wS6d4tthNyAdZLxOIddLiX3djMoWk29jFfSA1yJbIwr0epBYqqYarWB6s2Z+4VaZCQ80Jaa3kA==", + "version": "1.75.0", + "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.75.0.tgz", + "integrity": "sha512-SAr0PoOhJS6FUq5LjNr8C/StBKALZwDVm3+U4pjF/3iYkt3GioJOPV/oB1Sf1l7lROe4TgrMyL5N1yaEgTWycw==", "dev": true }, "@types/ws": { diff --git a/package.json b/package.json index b77b08ae..d0364c7a 100644 --- a/package.json +++ b/package.json @@ -142,6 +142,11 @@ "light": "icons/light/icon-link.svg" } }, + { + "command": "java.project.explorer.configureFilters", + "title": "%contributes.commands.java.project.explorer.configureFilters%", + "category": "Java" + }, { "command": "java.view.package.revealFileInOS", "title": "%contributes.commands.java.view.package.revealFileInOS%", @@ -258,6 +263,18 @@ ], "markdownDescription": "%configuration.java.project.exportJar.targetPath.customization%", "default": "${workspaceFolder}/${workspaceFolderBasename}.jar" + }, + "java.project.explorer.filters": { + "type": "object", + "description": "%configuration.java.project.explorer.filters%", + "default": {}, + "properties": { + "nonJavaResources": { + "type": "boolean", + "description": "%configuration.java.project.explorer.filters.nonJavaResources%", + "default": false + } + } } } }, @@ -481,6 +498,11 @@ "when": "view == javaProjectExplorer && java:serverMode == Standard && config.java.dependency.syncWithFolderExplorer == true", "group": "overflow_10@20" }, + { + "command": "java.project.explorer.configureFilters", + "when": "view == javaProjectExplorer && java:serverMode == Standard", + "group": "overflow_10@30" + }, { "command": "java.project.clean.workspace", "when": "view == javaProjectExplorer && java:serverMode == Standard && !java:noJavaProjects", diff --git a/package.nls.json b/package.nls.json index 75eae2c5..75b3d84a 100644 --- a/package.nls.json +++ b/package.nls.json @@ -15,6 +15,7 @@ "contributes.commands.java.view.package.changeToHierarchicalPackageView":"Hierarchical View", "contributes.commands.java.view.package.linkWithFolderExplorer":"Synchronize with Editor", "contributes.commands.java.view.package.unlinkWithFolderExplorer":"Desynchronize with Editor", + "contributes.commands.java.project.explorer.configureFilters": "Configure Filters", "contributes.commands.java.view.package.revealFileInOS": "Reveal in Explorer", "contributes.commands.java.view.package.exportJar": "Export Jar...", "contributes.commands.java.view.package.copyFilePath": "Copy Path", @@ -33,6 +34,8 @@ "configuration.java.dependency.autoRefresh": "Synchronize Java Projects explorer with changes", "configuration.java.dependency.refreshDelay": "The delay time (ms) the auto refresh is invoked when changes are detected", "configuration.java.dependency.packagePresentation": "Package presentation mode: flat or hierarchical", + "configuration.java.project.explorer.filters": "Filters for the Java Projects explorer.", + "configuration.java.project.explorer.filters.nonJavaResources": "Specify whether non-Java resources will be filtered out.", "configuration.java.project.exportJar.targetPath.customization": "The output path of the exported jar. Leave it empty if you want to manually pick the output location.", "configuration.java.project.exportJar.targetPath.workspaceFolder": "Export the jar file into the workspace folder. Its name is the same as the folder's.", "configuration.java.project.exportJar.targetPath.select": "Select output location manually when exporting the jar file.", diff --git a/package.nls.zh-cn.json b/package.nls.zh-cn.json index 3898a11b..4a49bb8f 100644 --- a/package.nls.zh-cn.json +++ b/package.nls.zh-cn.json @@ -15,6 +15,7 @@ "contributes.commands.java.view.package.changeToHierarchicalPackageView":"层级显示", "contributes.commands.java.view.package.linkWithFolderExplorer":"启用编辑器关联", "contributes.commands.java.view.package.unlinkWithFolderExplorer":"关闭编辑器关联", + "contributes.commands.java.project.explorer.configureFilters": "设置过滤器", "contributes.commands.java.view.package.revealFileInOS": "打开所在的文件夹", "contributes.commands.java.view.package.exportJar": "导出到 Jar 文件...", "contributes.commands.java.view.package.copyFilePath": "复制路径", @@ -33,6 +34,8 @@ "configuration.java.dependency.autoRefresh": "在 Java 项目管理器中自动同步修改", "configuration.java.dependency.refreshDelay": "控制 Java 项目管理器刷新的延迟时间 (毫秒)", "configuration.java.dependency.packagePresentation": "Java 包显示方式: 平行显示或者分层显示", + "configuration.java.project.explorer.filters": "设置 Java 项目管理器要过滤的内容。", + "configuration.java.project.explorer.filters.nonJavaResources": "是否需要过滤非 Java 资源。", "configuration.java.project.exportJar.targetPath.customization": "导出 Jar 文件的路径。您可以将此选项置为空串来手动选择 jar 文件的导出路径。", "configuration.java.project.exportJar.targetPath.workspaceFolder": "导出 Jar 文件到工作空间文件夹下。Jar 文件的名称和工作空间文件夹的名称相同。", "configuration.java.project.exportJar.targetPath.select": "在导出 Jar 文件时手动选择输出目录。", diff --git a/src/commands.ts b/src/commands.ts index baf3151d..5fc09b3e 100644 --- a/src/commands.ts +++ b/src/commands.ts @@ -18,6 +18,8 @@ export namespace Commands { export const VIEW_PACKAGE_UNLINKWITHFOLDER = "java.view.package.unlinkWithFolderExplorer"; + export const JAVA_PROJECT_EXPLORER_CONFIGURE_FILTERS = "java.project.explorer.configureFilters"; + export const VIEW_PACKAGE_REFRESH = "java.view.package.refresh"; export const VIEW_PACKAGE_INTERNAL_REFRESH = "_java.view.package.internal.refresh"; diff --git a/src/java/jdtls.ts b/src/java/jdtls.ts index ad7c228b..1c07f194 100644 --- a/src/java/jdtls.ts +++ b/src/java/jdtls.ts @@ -7,7 +7,8 @@ import { CancellationToken, Uri, commands, workspace } from "vscode"; import { Commands, executeJavaLanguageServerCommand } from "../commands"; import { IClasspath } from "../tasks/buildArtifact/IStepMetadata"; import { IMainClassInfo } from "../tasks/buildArtifact/ResolveMainClassExecutor"; -import { INodeData } from "./nodeData"; +import { INodeData, NodeKind } from "./nodeData"; +import { Settings } from "../settings"; export namespace Jdtls { export async function getProjects(params: string): Promise { @@ -15,7 +16,7 @@ export namespace Jdtls { Commands.EXECUTE_WORKSPACE_COMMAND, Commands.JAVA_PROJECT_LIST, params, - true /*includeNonJavaProjects*/ + Settings.nonJavaResourcesFiltered() ) || []; } @@ -33,6 +34,14 @@ export namespace Jdtls { let nodeData: INodeData[] = await commands.executeCommand(Commands.EXECUTE_WORKSPACE_COMMAND, Commands.JAVA_GETPACKAGEDATA, params) || []; + + // check filter settings. + if (Settings.nonJavaResourcesFiltered()) { + nodeData = nodeData.filter((data: INodeData) => { + return data.kind !== NodeKind.Folder && data.kind !== NodeKind.File; + }); + } + if (excludePatterns && nodeData.length) { const uriOfChildren: string[] = nodeData.map((node: INodeData) => node.uri).filter(Boolean) as string[]; const urisToExclude: Set = new Set(); diff --git a/src/settings.ts b/src/settings.ts index c0b9d86c..35dd9b86 100644 --- a/src/settings.ts +++ b/src/settings.ts @@ -2,7 +2,7 @@ // Licensed under the MIT license. import { - commands, ConfigurationChangeEvent, ExtensionContext, + commands, ConfigurationChangeEvent, ConfigurationTarget, ExtensionContext, workspace, } from "vscode"; import { instrumentOperationAsVsCodeCommand } from "vscode-extension-telemetry-wrapper"; @@ -17,6 +17,7 @@ export class Settings { if ((e.affectsConfiguration("java.dependency.syncWithFolderExplorer") && Settings.syncWithFolderExplorer()) || e.affectsConfiguration("java.dependency.showMembers") || e.affectsConfiguration("java.dependency.packagePresentation") || + e.affectsConfiguration("java.project.explorer.filters") || e.affectsConfiguration("files.exclude")) { commands.executeCommand(Commands.VIEW_PACKAGE_INTERNAL_REFRESH); } else if (e.affectsConfiguration("java.dependency.autoRefresh")) { @@ -57,6 +58,13 @@ export class Settings { workspace.getConfiguration("java.dependency").update("packagePresentation", PackagePresentation.Hierarchical, false); } + public static switchNonJavaResourceFilter(enabled: boolean): void { + workspace.getConfiguration("java.project.explorer").update( + "filters", + { nonJavaResources: enabled }, + ConfigurationTarget.Workspace); + } + public static updateReferencedLibraries(libraries: IReferencedLibraries): void { let updateSetting: string[] | Partial = { include: libraries.include, @@ -103,6 +111,14 @@ export class Settings { // tslint:disable-next-line: no-invalid-template-strings return workspace.getConfiguration("java.project.exportJar").get("targetPath", "${workspaceFolder}/${workspaceFolderBasename}.jar"); } + + /** + * Get whether non-Java resources should be filtered in the explorer. + */ + public static nonJavaResourcesFiltered(): boolean { + const filter: IExplorerFilter = workspace.getConfiguration("java.project.explorer").get("filters", {}); + return !!filter.nonJavaResources; + } } enum PackagePresentation { @@ -115,3 +131,7 @@ export interface IReferencedLibraries { exclude: string[]; sources: { [binary: string]: string }; } + +interface IExplorerFilter { + nonJavaResources?: boolean +} diff --git a/src/views/dependencyExplorer.ts b/src/views/dependencyExplorer.ts index 3e401df3..12e19690 100644 --- a/src/views/dependencyExplorer.ts +++ b/src/views/dependencyExplorer.ts @@ -90,6 +90,24 @@ export class DependencyExplorer implements Disposable { this.reveal(uri, false /*force to reveal even the sync setting is turned off*/); }), + instrumentOperationAsVsCodeCommand(Commands.JAVA_PROJECT_EXPLORER_CONFIGURE_FILTERS, async () => { + const filters = await window.showQuickPick( + [{ + label: "Non-Java resources", + picked: Settings.nonJavaResourcesFiltered(), + }], + { + placeHolder: "Select filters to apply to the Java Projects Explorer", + canPickMany: true, + ignoreFocusOut: true, + } + ); + if (!filters) { + return; + } + + Settings.switchNonJavaResourceFilter(filters.some((filter) => filter.label === "Non-Java resources")); + }), ); // register telemetry events diff --git a/test/maven-suite/projectView.test.ts b/test/maven-suite/projectView.test.ts index 52bbcb8b..b56dfde0 100644 --- a/test/maven-suite/projectView.test.ts +++ b/test/maven-suite/projectView.test.ts @@ -240,4 +240,16 @@ suite("Maven Project View Tests", () => { const projectChildren = await projectNode.getChildren(); assert.ok(!projectChildren.find((node: DataNode) => node.nodeData.name === ".hidden")); }); + + test("Can apply 'java.project.explorer.filters.nonJavaResources'", async function() { + await vscode.workspace.getConfiguration("java.project.explorer").update( + "filters", + { nonJavaResources:true } + ); + const explorer = DependencyExplorer.getInstance(contextManager.context); + + const projectNode = (await explorer.dataProvider.getChildren())![0] as ProjectNode; + const projectChildren = await projectNode.getChildren(); + assert.equal(projectChildren.length, 4); + }); }); From 4309418383050a3bd2cd280bcc3bd79676ffa367 Mon Sep 17 00:00:00 2001 From: Sheng Chen Date: Fri, 14 Apr 2023 13:59:39 +0800 Subject: [PATCH 160/352] chore: Update VS Code engine version to 1.77.0 (#753) --- package-lock.json | 16 ++++++++-------- package.json | 4 ++-- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/package-lock.json b/package-lock.json index 2b66c71d..d386068b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -26,7 +26,7 @@ "@types/mocha": "^9.1.1", "@types/node": "^16.18.11", "@types/semver": "^7.3.13", - "@types/vscode": "1.75.0", + "@types/vscode": "1.77.0", "@vscode/test-electron": "^2.2.2", "copy-webpack-plugin": "^11.0.0", "glob": "^7.2.3", @@ -39,7 +39,7 @@ "webpack-cli": "^4.10.0" }, "engines": { - "vscode": "^1.75.0" + "vscode": "^1.77.0" } }, "node_modules/@babel/code-frame": { @@ -449,9 +449,9 @@ "dev": true }, "node_modules/@types/vscode": { - "version": "1.75.0", - "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.75.0.tgz", - "integrity": "sha512-SAr0PoOhJS6FUq5LjNr8C/StBKALZwDVm3+U4pjF/3iYkt3GioJOPV/oB1Sf1l7lROe4TgrMyL5N1yaEgTWycw==", + "version": "1.77.0", + "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.77.0.tgz", + "integrity": "sha512-MWFN5R7a33n8eJZJmdVlifjig3LWUNRrPeO1xemIcZ0ae0TEQuRc7G2xV0LUX78RZFECY1plYBn+dP/Acc3L0Q==", "dev": true }, "node_modules/@types/ws": { @@ -5523,9 +5523,9 @@ "dev": true }, "@types/vscode": { - "version": "1.75.0", - "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.75.0.tgz", - "integrity": "sha512-SAr0PoOhJS6FUq5LjNr8C/StBKALZwDVm3+U4pjF/3iYkt3GioJOPV/oB1Sf1l7lROe4TgrMyL5N1yaEgTWycw==", + "version": "1.77.0", + "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.77.0.tgz", + "integrity": "sha512-MWFN5R7a33n8eJZJmdVlifjig3LWUNRrPeO1xemIcZ0ae0TEQuRc7G2xV0LUX78RZFECY1plYBn+dP/Acc3L0Q==", "dev": true }, "@types/ws": { diff --git a/package.json b/package.json index d0364c7a..6ebf1469 100644 --- a/package.json +++ b/package.json @@ -12,7 +12,7 @@ "explorer" ], "engines": { - "vscode": "^1.75.0" + "vscode": "^1.77.0" }, "repository": { "type": "git", @@ -872,7 +872,7 @@ "@types/mocha": "^9.1.1", "@types/node": "^16.18.11", "@types/semver": "^7.3.13", - "@types/vscode": "1.75.0", + "@types/vscode": "1.77.0", "@vscode/test-electron": "^2.2.2", "copy-webpack-plugin": "^11.0.0", "glob": "^7.2.3", From 100b67772eb9fb288d0de1f9411164d748754eab Mon Sep 17 00:00:00 2001 From: Sheng Chen Date: Fri, 14 Apr 2023 14:24:26 +0800 Subject: [PATCH 161/352] fix: Display compilation units which does not have a primary type (#752) Co-authored-by: Shi Chen --- CHANGELOG.md | 3 ++- .../jdtls/ext/core/PackageCommand.java | 23 +++++++------------ .../jdtls/ext/core/model/NodeKind.java | 10 +++++--- .../jdtls/ext/core/model/PackageNode.java | 4 ++++ .../ext/core/parser/JavaResourceVisitor.java | 13 +++++++++-- src/java/nodeData.ts | 8 ++++--- src/views/dataNode.ts | 2 ++ src/views/nodeFactory.ts | 2 ++ test/maven-suite/projectView.test.ts | 16 +++++++------ .../java/com/mycompany/app/package-info.java | 1 + 10 files changed, 51 insertions(+), 31 deletions(-) create mode 100644 test/maven/src/main/java/com/mycompany/app/package-info.java diff --git a/CHANGELOG.md b/CHANGELOG.md index 91883ca9..3ba58350 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -15,7 +15,8 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0. ### Fixed - Apply `files.exclude` to Java Projects explorer. [#214](https://github.com/microsoft/vscode-java-dependency/issues/214) - Empty packages will not appear sometimes. [#600](https://github.com/microsoft/vscode-java-dependency/issues/600) -- Show `module-info.java` at source roots. [698](https://github.com/microsoft/vscode-java-dependency/issues/698) +- Show `module-info.java` at source roots. [#698](https://github.com/microsoft/vscode-java-dependency/issues/698) +- Show Java files which does not have a primary type in the Java Projects explorer. [#748](https://github.com/microsoft/vscode-java-dependency/issues/748) ## 0.21.2 ### Fixed diff --git a/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/PackageCommand.java b/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/PackageCommand.java index ae6731ef..68088c90 100644 --- a/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/PackageCommand.java +++ b/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/PackageCommand.java @@ -43,7 +43,6 @@ import org.eclipse.jdt.core.IJarEntryResource; import org.eclipse.jdt.core.IJavaElement; import org.eclipse.jdt.core.IJavaProject; -import org.eclipse.jdt.core.IModuleDescription; import org.eclipse.jdt.core.IPackageFragment; import org.eclipse.jdt.core.IPackageFragmentRoot; import org.eclipse.jdt.core.IType; @@ -230,12 +229,7 @@ private static List getParentAncestorNodes(IResource element) throw List nodeList = new LinkedList<>(); while (element != null && !(element instanceof IWorkspaceRoot)) { IJavaElement javaElement = JavaCore.create(element); - if (javaElement == null) { - PackageNode entry = PackageNode.createNodeForResource(element); - if (entry != null) { - nodeList.add(0, entry); - } - } else if (javaElement instanceof IJavaProject) { + if (javaElement instanceof IJavaProject) { nodeList.add(0, PackageNode.createNodeForProject(javaElement)); } else if (javaElement instanceof IPackageFragmentRoot) { IPackageFragmentRoot pkgRoot = (IPackageFragmentRoot) javaElement; @@ -248,6 +242,11 @@ private static List getParentAncestorNodes(IResource element) throw if (packageFragment.containsJavaResources() || packageFragment.getNonJavaResources().length > 0) { nodeList.add(0, PackageNode.createNodeForPackageFragment(packageFragment)); } + } else if (javaElement == null) { + PackageNode entry = PackageNode.createNodeForResource(element); + if (entry != null) { + nodeList.add(0, entry); + } } element = element.getParent(); } @@ -431,6 +430,8 @@ public static List getChildrenForPackage(IPackageFragment packageFragmen IType primaryType = ((ITypeRoot) element).findPrimaryType(); if (primaryType != null) { children.add(primaryType); + } else { + children.add(element); } } } @@ -538,14 +539,6 @@ public static List getPackageFragmentRootContent(IPackageFragmentRoot ro Object[] nonJavaResources = root.getNonJavaResources(); Collections.addAll(result, nonJavaResources); - IModuleDescription moduleDescription = root.getModuleDescription(); - if (moduleDescription != null) { - if (moduleDescription.getClassFile() != null) { - result.add(moduleDescription.getClassFile()); - } else if (moduleDescription.getCompilationUnit() != null) { - result.add(moduleDescription.getCompilationUnit()); - } - } return result; } diff --git a/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/model/NodeKind.java b/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/model/NodeKind.java index 21b45be8..093738f3 100644 --- a/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/model/NodeKind.java +++ b/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/model/NodeKind.java @@ -22,11 +22,15 @@ public enum NodeKind { PRIMARYTYPE(5), - CONTAINER(6), + COMPILATIONUNIT(6), - FOLDER(7), + CLASSFILE(7), - FILE(8); + CONTAINER(8), + + FOLDER(9), + + FILE(10); private final int value; diff --git a/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/model/PackageNode.java b/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/model/PackageNode.java index ec60cd21..618b391d 100644 --- a/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/model/PackageNode.java +++ b/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/model/PackageNode.java @@ -363,6 +363,10 @@ public String getPath() { return path; } + public void setPath(String path) { + this.path = path; + } + public NodeKind getKind() { return kind; } diff --git a/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/parser/JavaResourceVisitor.java b/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/parser/JavaResourceVisitor.java index 92ea8338..f436f00e 100644 --- a/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/parser/JavaResourceVisitor.java +++ b/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/parser/JavaResourceVisitor.java @@ -16,6 +16,7 @@ import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IFolder; +import org.eclipse.core.resources.IResource; import org.eclipse.jdt.core.IClassFile; import org.eclipse.jdt.core.IClasspathEntry; import org.eclipse.jdt.core.ICompilationUnit; @@ -54,15 +55,23 @@ public void visit(IType type) { @Override public void visit(IClassFile classFile) { - PackageNode node = new PackageNode(classFile.getElementName(), null, NodeKind.FILE); + PackageNode node = new PackageNode(classFile.getElementName(), null, NodeKind.CLASSFILE); node.setUri(JDTUtils.toUri(classFile)); + IResource resource = classFile.getResource(); + if (resource != null) { + node.setPath(resource.getFullPath().toPortableString()); + } this.nodes.add(node); } @Override public void visit(ICompilationUnit compilationUnit) { - PackageNode node = new PackageNode(compilationUnit.getElementName(), null, NodeKind.FILE); + PackageNode node = new PackageNode(compilationUnit.getElementName(), null, NodeKind.COMPILATIONUNIT); node.setUri(JDTUtils.toUri(compilationUnit)); + IResource resource = compilationUnit.getResource(); + if (resource != null) { + node.setPath(resource.getFullPath().toPortableString()); + } this.nodes.add(node); } diff --git a/src/java/nodeData.ts b/src/java/nodeData.ts index 6f21d783..e2c35a46 100644 --- a/src/java/nodeData.ts +++ b/src/java/nodeData.ts @@ -7,9 +7,11 @@ export enum NodeKind { PackageRoot = 3, Package = 4, PrimaryType = 5, - Container = 6, - Folder = 7, - File = 8, + CompilationUnit = 6, + ClassFile = 7, + Container = 8, + Folder = 9, + File = 10, } export enum TypeKind { diff --git a/src/views/dataNode.ts b/src/views/dataNode.ts index f08ccc68..21be07a7 100644 --- a/src/views/dataNode.ts +++ b/src/views/dataNode.ts @@ -30,6 +30,8 @@ export abstract class DataNode extends ExplorerNode { case NodeKind.PackageRoot: case NodeKind.Package: case NodeKind.PrimaryType: + case NodeKind.CompilationUnit: + case NodeKind.ClassFile: case NodeKind.Folder: case NodeKind.File: item.resourceUri = Uri.parse(this.uri); diff --git a/src/views/nodeFactory.ts b/src/views/nodeFactory.ts index 43ce77c5..7706477e 100644 --- a/src/views/nodeFactory.ts +++ b/src/views/nodeFactory.ts @@ -73,6 +73,8 @@ export class NodeFactory { } return new FolderNode(nodeData, parent, project, rootNode); + case NodeKind.CompilationUnit: + case NodeKind.ClassFile: case NodeKind.File: if (!parent) { throw new Error("Folder node must have parent."); diff --git a/test/maven-suite/projectView.test.ts b/test/maven-suite/projectView.test.ts index b56dfde0..31a10d4c 100644 --- a/test/maven-suite/projectView.test.ts +++ b/test/maven-suite/projectView.test.ts @@ -50,13 +50,14 @@ suite("Maven Project View Tests", () => { // validate innermost layer nodes const classes = await firstSecondarySubPackage.getChildren(); - assert.equal(classes.length, 3, "Number of main classes of first package should be 3"); + assert.equal(classes.length, 4, "Number of main classes of first package should be 4"); const firstClass = classes[0] as PrimaryTypeNode; const secondClass = classes[1] as PrimaryTypeNode; const thirdClass = classes[2] as PrimaryTypeNode; assert.equal(firstClass.name, "App", "Name of first class should be \"App\""); assert.equal(secondClass.name, "AppToDelete", "Name of second class should be \"AppToDelete\""); assert.equal(thirdClass.name, "AppToRename", "Name of third class should be \"AppToRename\""); + assert.equal((classes[3] as DataNode).name, "package-info.java"); }); test("Can node render correctly in flat view", async function() { @@ -110,7 +111,7 @@ suite("Maven Project View Tests", () => { // validate innermost layer nodes const mainClasses = await firstMainSubPackage.getChildren(); const testClasses = await testSubPackage.getChildren(); - assert.equal(mainClasses.length, 3, "Number of main classes of first package should be 3"); + assert.equal(mainClasses.length, 4, "Number of main classes of first package should be 4"); assert.equal(testClasses.length, 1, "Number of test classes should be 1"); const firstMainClass = mainClasses[0] as PrimaryTypeNode; const secondMainClass = mainClasses[1] as PrimaryTypeNode; @@ -119,6 +120,7 @@ suite("Maven Project View Tests", () => { assert.equal(firstMainClass.name, "App", "Name of first class should be \"App\""); assert.equal(secondMainClass.name, "AppToDelete", "Name of second class should be \"AppToDelete\""); assert.equal(thirdMainClass.name, "AppToRename", "Name of third class should be \"AppToRename\""); + assert.equal((mainClasses[3] as DataNode).name, "package-info.java"); assert.equal(testClass.name, "AppTest", "Name of test class should be \"AppTest\""); }); @@ -205,11 +207,11 @@ suite("Maven Project View Tests", () => { projectUri: workspaceFolders![0].uri.toString(), path: mainPackage.nodeData.name, handlerIdentifier: mainPackage.nodeData.handlerIdentifier, - }); - assert.equal(packages?.length, 3, "packages' length should be 3"); - assert.equal(packages![0].name, "com.mycompany.app"); - assert.equal(packages![1].name, "com.mycompany.app1"); - assert.equal(packages![2].name, "module-info.java"); + }) || []; + assert.equal(packages.length, 3, "packages' length should be 3"); + assert.ok(packages.filter((p) => { + return !["com.mycompany.app", "com.mycompany.app1", "module-info.java"].includes(p.name); + }).length === 0); }); test("Can execute command java.resolvePath correctly", async function() { diff --git a/test/maven/src/main/java/com/mycompany/app/package-info.java b/test/maven/src/main/java/com/mycompany/app/package-info.java new file mode 100644 index 00000000..1e03c11b --- /dev/null +++ b/test/maven/src/main/java/com/mycompany/app/package-info.java @@ -0,0 +1 @@ +package com.mycompany.app; From 3b75af221bb3d5f0d64d772b67cafaafe3d4fa96 Mon Sep 17 00:00:00 2001 From: Sheng Chen Date: Fri, 14 Apr 2023 16:31:35 +0800 Subject: [PATCH 162/352] feat: Support create different kind of resources from inline new button. (#754) --- package.json | 19 ++++++++----- package.nls.json | 1 + package.nls.zh-cn.json | 1 + package.nls.zh-tw.json | 1 + src/commands.ts | 2 ++ src/explorerCommands/new.ts | 48 +++++++++++++++++++++++++++++++++ src/views/dependencyExplorer.ts | 5 +++- 7 files changed, 69 insertions(+), 8 deletions(-) diff --git a/package.json b/package.json index 6ebf1469..5cc552a3 100644 --- a/package.json +++ b/package.json @@ -168,6 +168,12 @@ "title": "%contributes.commands.java.view.package.copyRelativeFilePath%", "category": "Java" }, + { + "command": "java.view.package.new", + "title": "%contributes.commands.java.view.package.new%", + "category": "Java", + "icon": "$(add)" + }, { "command": "java.view.menus.file.newJavaClass", "title": "%contributes.commands.java.view.menus.file.newJavaClass%", @@ -382,6 +388,10 @@ "command": "java.project.refreshLibraries", "when": "false" }, + { + "command": "java.view.package.new", + "when": "false" + }, { "command": "java.view.package.newJavaClass", "when": "false" @@ -576,13 +586,8 @@ "group": "1_new@10" }, { - "command": "java.view.package.newJavaClass", - "when": "view == javaProjectExplorer && viewItem =~ /java:project(?=.*?\\b\\+java\\b)(?=.*?\\b\\+uri\\b)/", - "group": "inline@add_0" - }, - { - "command": "java.view.package.newJavaClass", - "when": "view == javaProjectExplorer && viewItem =~ /java:(package|packageRoot)(?=.*?\\b\\+source\\b)(?=.*?\\b\\+uri\\b)/", + "command": "java.view.package.new", + "when": "view == javaProjectExplorer && viewItem =~ /java(?!:container)(?!:jar)(?!.*?\\b\\+binary\\b)(?=.*?\\b\\+uri\\b)/", "group": "inline@add_0" }, { diff --git a/package.nls.json b/package.nls.json index 75b3d84a..b390d80d 100644 --- a/package.nls.json +++ b/package.nls.json @@ -20,6 +20,7 @@ "contributes.commands.java.view.package.exportJar": "Export Jar...", "contributes.commands.java.view.package.copyFilePath": "Copy Path", "contributes.commands.java.view.package.copyRelativeFilePath": "Copy Relative Path", + "contributes.commands.java.view.package.new": "New...", "contributes.commands.java.view.package.newJavaClass": "Java Class", "contributes.commands.java.view.package.newPackage": "Package", "contributes.commands.java.view.package.newFile": "File", diff --git a/package.nls.zh-cn.json b/package.nls.zh-cn.json index 4a49bb8f..a6729722 100644 --- a/package.nls.zh-cn.json +++ b/package.nls.zh-cn.json @@ -20,6 +20,7 @@ "contributes.commands.java.view.package.exportJar": "导出到 Jar 文件...", "contributes.commands.java.view.package.copyFilePath": "复制路径", "contributes.commands.java.view.package.copyRelativeFilePath": "复制相对路径", + "contributes.commands.java.view.package.new": "创建...", "contributes.commands.java.view.package.newJavaClass": "Java 类", "contributes.commands.java.view.package.newPackage": "包", "contributes.commands.java.view.package.newFile": "文件", diff --git a/package.nls.zh-tw.json b/package.nls.zh-tw.json index a8151127..fd27c378 100644 --- a/package.nls.zh-tw.json +++ b/package.nls.zh-tw.json @@ -19,6 +19,7 @@ "contributes.commands.java.view.package.exportJar": "匯出成 Jar 檔案...", "contributes.commands.java.view.package.copyFilePath": "複製路徑", "contributes.commands.java.view.package.copyRelativeFilePath": "複製相對路徑", + "contributes.commands.java.view.package.new": "建立...", "contributes.commands.java.view.package.newJavaClass": "Java 類別", "contributes.commands.java.view.package.newPackage": "套件", "contributes.commands.java.view.package.newFile": "檔案", diff --git a/src/commands.ts b/src/commands.ts index 5fc09b3e..1976893a 100644 --- a/src/commands.ts +++ b/src/commands.ts @@ -36,6 +36,8 @@ export namespace Commands { export const EXPORT_JAR_REPORT = "java.view.package.exportJarReport"; + export const VIEW_PACKAGE_NEW = "java.view.package.new"; + export const VIEW_PACKAGE_NEW_JAVA_CLASS = "java.view.package.newJavaClass"; export const VIEW_PACKAGE_NEW_JAVA_PACKAGE = "java.view.package.newPackage"; diff --git a/src/explorerCommands/new.ts b/src/explorerCommands/new.ts index 45837ce0..509439db 100644 --- a/src/explorerCommands/new.ts +++ b/src/explorerCommands/new.ts @@ -13,6 +13,54 @@ import { resourceRoots } from "../views/packageRootNode"; import { checkJavaQualifiedName } from "./utility"; import { sendError, setUserError } from "vscode-extension-telemetry-wrapper"; +export async function newResource(node: DataNode): Promise { + const availableTypes: string[] = []; + // add options for Java nodes + if (node.nodeData.kind === NodeKind.Project || + (node.nodeData.kind === NodeKind.PackageRoot && !resourceRoots.includes(node.nodeData.name)) || + node.nodeData.kind === NodeKind.Package || + node.nodeData.kind === NodeKind.PrimaryType || + node.nodeData.kind === NodeKind.CompilationUnit) { + availableTypes.push("$(symbol-class) Java Class", "$(symbol-namespace) Package"); + } + + // add new file option + availableTypes.push("$(file) File"); + + // add new folder option + if (node.nodeData.kind === NodeKind.Project || + (node.nodeData.kind === NodeKind.PackageRoot && resourceRoots.includes(node.nodeData.name)) || + node.nodeData.kind === NodeKind.Folder || + node.nodeData.kind === NodeKind.File) { + availableTypes.push("$(folder) Folder"); + } + + const type = await window.showQuickPick( + availableTypes, + { + placeHolder: "Select resource type to create.", + ignoreFocusOut: true, + } + ); + + switch (type) { + case "$(symbol-class) Java Class": + await newJavaClass(node); + break; + case "$(symbol-namespace) Package": + await newPackage(node); + break; + case "$(file) File": + await newFile(node); + break; + case "$(folder) Folder": + await newFolder(node); + break; + default: + break; + } +} + // TODO: separate to two function to handle creation from menu bar and explorer. export async function newJavaClass(node?: DataNode): Promise { let packageFsPath: string | undefined; diff --git a/src/views/dependencyExplorer.ts b/src/views/dependencyExplorer.ts index 12e19690..6d1d0a17 100644 --- a/src/views/dependencyExplorer.ts +++ b/src/views/dependencyExplorer.ts @@ -12,7 +12,7 @@ import { import { instrumentOperationAsVsCodeCommand, sendInfo } from "vscode-extension-telemetry-wrapper"; import { Commands } from "../commands"; import { deleteFiles } from "../explorerCommands/delete"; -import { newFile, newFolder, newJavaClass, newPackage } from "../explorerCommands/new"; +import { newFile, newFolder, newJavaClass, newPackage, newResource } from "../explorerCommands/new"; import { renameFile } from "../explorerCommands/rename"; import { getCmdNode } from "../explorerCommands/utility"; import { Jdtls } from "../java/jdtls"; @@ -125,6 +125,9 @@ export class DependencyExplorer implements Disposable { // register keybinding commands context.subscriptions.push( + instrumentOperationAsVsCodeCommand(Commands.VIEW_PACKAGE_NEW, async (node: DataNode) => { + newResource(node); + }), instrumentOperationAsVsCodeCommand(Commands.VIEW_PACKAGE_NEW_JAVA_CLASS, async (node?: DataNode) => { newJavaClass(node); }), From b304e48da2463a3d81633c66713d8a0505cd1483 Mon Sep 17 00:00:00 2001 From: Sheng Chen Date: Fri, 21 Apr 2023 12:57:25 +0800 Subject: [PATCH 163/352] fix: Change the setting 'java.project.explorer.filters' to 'java.project.explorer.showNonJavaResources' (#755) --- CHANGELOG.md | 3 +-- package.json | 33 +++++++++++++++------------- package.nls.json | 6 ++--- package.nls.zh-cn.json | 6 ++--- src/commands.ts | 4 +++- src/settings.ts | 16 +++++--------- src/views/dependencyExplorer.ts | 22 +++++-------------- test/maven-suite/projectView.test.ts | 6 ++--- 8 files changed, 42 insertions(+), 54 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3ba58350..0ecb5aa8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,14 +8,13 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0. ### Added - Display non-Java files in Java Projects explorer. [#145](https://github.com/microsoft/vscode-java-dependency/issues/145) - Show non-Java projects in the Java Projects explorer. [#736](https://github.com/microsoft/vscode-java-dependency/issues/736) -- Introduce a setting: `java.project.explorer.filters` to control whether non-Java resources show in Java Projects explorer. [#751](https://github.com/microsoft/vscode-java-dependency/issues/751) +- Introduce a setting: `java.project.explorer.showNonJavaResources` to control whether non-Java resources show in Java Projects explorer. [#751](https://github.com/microsoft/vscode-java-dependency/issues/751) - Support creating files and folders in Java Projects explorer. [#598](https://github.com/microsoft/vscode-java-dependency/issues/598) - Apply file decorators to project level. [#481](https://github.com/microsoft/vscode-java-dependency/issues/481) - Give more hints about the project import status. [#580](https://github.com/microsoft/vscode-java-dependency/issues/580) ### Fixed - Apply `files.exclude` to Java Projects explorer. [#214](https://github.com/microsoft/vscode-java-dependency/issues/214) - Empty packages will not appear sometimes. [#600](https://github.com/microsoft/vscode-java-dependency/issues/600) -- Show `module-info.java` at source roots. [#698](https://github.com/microsoft/vscode-java-dependency/issues/698) - Show Java files which does not have a primary type in the Java Projects explorer. [#748](https://github.com/microsoft/vscode-java-dependency/issues/748) ## 0.21.2 diff --git a/package.json b/package.json index 5cc552a3..a69a3e1c 100644 --- a/package.json +++ b/package.json @@ -143,8 +143,13 @@ } }, { - "command": "java.project.explorer.configureFilters", - "title": "%contributes.commands.java.project.explorer.configureFilters%", + "command": "java.project.explorer.showNonJavaResources", + "title": "%contributes.commands.java.project.explorer.showNonJavaResources%", + "category": "Java" + }, + { + "command": "java.project.explorer.hideNonJavaResources", + "title": "%contributes.commands.java.project.explorer.hideNonJavaResources%", "category": "Java" }, { @@ -270,17 +275,10 @@ "markdownDescription": "%configuration.java.project.exportJar.targetPath.customization%", "default": "${workspaceFolder}/${workspaceFolderBasename}.jar" }, - "java.project.explorer.filters": { - "type": "object", - "description": "%configuration.java.project.explorer.filters%", - "default": {}, - "properties": { - "nonJavaResources": { - "type": "boolean", - "description": "%configuration.java.project.explorer.filters.nonJavaResources%", - "default": false - } - } + "java.project.explorer.showNonJavaResources": { + "type": "boolean", + "description": "%configuration.java.project.explorer.showNonJavaResources%", + "default": true } } }, @@ -509,8 +507,13 @@ "group": "overflow_10@20" }, { - "command": "java.project.explorer.configureFilters", - "when": "view == javaProjectExplorer && java:serverMode == Standard", + "command": "java.project.explorer.showNonJavaResources", + "when": "view == javaProjectExplorer && java:serverMode == Standard && !config.java.project.explorer.showNonJavaResources", + "group": "overflow_10@30" + }, + { + "command": "java.project.explorer.hideNonJavaResources", + "when": "view == javaProjectExplorer && java:serverMode == Standard && config.java.project.explorer.showNonJavaResources", "group": "overflow_10@30" }, { diff --git a/package.nls.json b/package.nls.json index b390d80d..f02c36ff 100644 --- a/package.nls.json +++ b/package.nls.json @@ -15,7 +15,8 @@ "contributes.commands.java.view.package.changeToHierarchicalPackageView":"Hierarchical View", "contributes.commands.java.view.package.linkWithFolderExplorer":"Synchronize with Editor", "contributes.commands.java.view.package.unlinkWithFolderExplorer":"Desynchronize with Editor", - "contributes.commands.java.project.explorer.configureFilters": "Configure Filters", + "contributes.commands.java.project.explorer.showNonJavaResources": "Show Non-Java Resources", + "contributes.commands.java.project.explorer.hideNonJavaResources": "Hide Non-Java Resources", "contributes.commands.java.view.package.revealFileInOS": "Reveal in Explorer", "contributes.commands.java.view.package.exportJar": "Export Jar...", "contributes.commands.java.view.package.copyFilePath": "Copy Path", @@ -35,8 +36,7 @@ "configuration.java.dependency.autoRefresh": "Synchronize Java Projects explorer with changes", "configuration.java.dependency.refreshDelay": "The delay time (ms) the auto refresh is invoked when changes are detected", "configuration.java.dependency.packagePresentation": "Package presentation mode: flat or hierarchical", - "configuration.java.project.explorer.filters": "Filters for the Java Projects explorer.", - "configuration.java.project.explorer.filters.nonJavaResources": "Specify whether non-Java resources will be filtered out.", + "configuration.java.project.explorer.showNonJavaResources": "When enabled, the explorer shows non-Java resources.", "configuration.java.project.exportJar.targetPath.customization": "The output path of the exported jar. Leave it empty if you want to manually pick the output location.", "configuration.java.project.exportJar.targetPath.workspaceFolder": "Export the jar file into the workspace folder. Its name is the same as the folder's.", "configuration.java.project.exportJar.targetPath.select": "Select output location manually when exporting the jar file.", diff --git a/package.nls.zh-cn.json b/package.nls.zh-cn.json index a6729722..4234ad53 100644 --- a/package.nls.zh-cn.json +++ b/package.nls.zh-cn.json @@ -15,7 +15,8 @@ "contributes.commands.java.view.package.changeToHierarchicalPackageView":"层级显示", "contributes.commands.java.view.package.linkWithFolderExplorer":"启用编辑器关联", "contributes.commands.java.view.package.unlinkWithFolderExplorer":"关闭编辑器关联", - "contributes.commands.java.project.explorer.configureFilters": "设置过滤器", + "contributes.commands.java.project.explorer.showNonJavaResources": "显示非 Java 资源", + "contributes.commands.java.project.explorer.hideNonJavaResources": "隐藏非 Java 资源", "contributes.commands.java.view.package.revealFileInOS": "打开所在的文件夹", "contributes.commands.java.view.package.exportJar": "导出到 Jar 文件...", "contributes.commands.java.view.package.copyFilePath": "复制路径", @@ -35,8 +36,7 @@ "configuration.java.dependency.autoRefresh": "在 Java 项目管理器中自动同步修改", "configuration.java.dependency.refreshDelay": "控制 Java 项目管理器刷新的延迟时间 (毫秒)", "configuration.java.dependency.packagePresentation": "Java 包显示方式: 平行显示或者分层显示", - "configuration.java.project.explorer.filters": "设置 Java 项目管理器要过滤的内容。", - "configuration.java.project.explorer.filters.nonJavaResources": "是否需要过滤非 Java 资源。", + "configuration.java.project.explorer.showNonJavaResources": "启用时 Java 项目管理器将显示非 Java 资源。", "configuration.java.project.exportJar.targetPath.customization": "导出 Jar 文件的路径。您可以将此选项置为空串来手动选择 jar 文件的导出路径。", "configuration.java.project.exportJar.targetPath.workspaceFolder": "导出 Jar 文件到工作空间文件夹下。Jar 文件的名称和工作空间文件夹的名称相同。", "configuration.java.project.exportJar.targetPath.select": "在导出 Jar 文件时手动选择输出目录。", diff --git a/src/commands.ts b/src/commands.ts index 1976893a..c64f0f37 100644 --- a/src/commands.ts +++ b/src/commands.ts @@ -18,7 +18,9 @@ export namespace Commands { export const VIEW_PACKAGE_UNLINKWITHFOLDER = "java.view.package.unlinkWithFolderExplorer"; - export const JAVA_PROJECT_EXPLORER_CONFIGURE_FILTERS = "java.project.explorer.configureFilters"; + export const JAVA_PROJECT_EXPLORER_SHOW_NONJAVA_RESOURCES = "java.project.explorer.showNonJavaResources"; + + export const JAVA_PROJECT_EXPLORER_HIDE_NONJAVA_RESOURCES = "java.project.explorer.hideNonJavaResources"; export const VIEW_PACKAGE_REFRESH = "java.view.package.refresh"; diff --git a/src/settings.ts b/src/settings.ts index 35dd9b86..bea8e7c2 100644 --- a/src/settings.ts +++ b/src/settings.ts @@ -17,7 +17,7 @@ export class Settings { if ((e.affectsConfiguration("java.dependency.syncWithFolderExplorer") && Settings.syncWithFolderExplorer()) || e.affectsConfiguration("java.dependency.showMembers") || e.affectsConfiguration("java.dependency.packagePresentation") || - e.affectsConfiguration("java.project.explorer.filters") || + e.affectsConfiguration("java.project.explorer.showNonJavaResources") || e.affectsConfiguration("files.exclude")) { commands.executeCommand(Commands.VIEW_PACKAGE_INTERNAL_REFRESH); } else if (e.affectsConfiguration("java.dependency.autoRefresh")) { @@ -60,9 +60,10 @@ export class Settings { public static switchNonJavaResourceFilter(enabled: boolean): void { workspace.getConfiguration("java.project.explorer").update( - "filters", - { nonJavaResources: enabled }, - ConfigurationTarget.Workspace); + "showNonJavaResources", + enabled, + ConfigurationTarget.Workspace + ); } public static updateReferencedLibraries(libraries: IReferencedLibraries): void { @@ -116,8 +117,7 @@ export class Settings { * Get whether non-Java resources should be filtered in the explorer. */ public static nonJavaResourcesFiltered(): boolean { - const filter: IExplorerFilter = workspace.getConfiguration("java.project.explorer").get("filters", {}); - return !!filter.nonJavaResources; + return !workspace.getConfiguration("java.project.explorer").get("showNonJavaResources", true); } } @@ -131,7 +131,3 @@ export interface IReferencedLibraries { exclude: string[]; sources: { [binary: string]: string }; } - -interface IExplorerFilter { - nonJavaResources?: boolean -} diff --git a/src/views/dependencyExplorer.ts b/src/views/dependencyExplorer.ts index 6d1d0a17..90384d14 100644 --- a/src/views/dependencyExplorer.ts +++ b/src/views/dependencyExplorer.ts @@ -90,23 +90,11 @@ export class DependencyExplorer implements Disposable { this.reveal(uri, false /*force to reveal even the sync setting is turned off*/); }), - instrumentOperationAsVsCodeCommand(Commands.JAVA_PROJECT_EXPLORER_CONFIGURE_FILTERS, async () => { - const filters = await window.showQuickPick( - [{ - label: "Non-Java resources", - picked: Settings.nonJavaResourcesFiltered(), - }], - { - placeHolder: "Select filters to apply to the Java Projects Explorer", - canPickMany: true, - ignoreFocusOut: true, - } - ); - if (!filters) { - return; - } - - Settings.switchNonJavaResourceFilter(filters.some((filter) => filter.label === "Non-Java resources")); + instrumentOperationAsVsCodeCommand(Commands.JAVA_PROJECT_EXPLORER_SHOW_NONJAVA_RESOURCES, async () => { + Settings.switchNonJavaResourceFilter(true); + }), + instrumentOperationAsVsCodeCommand(Commands.JAVA_PROJECT_EXPLORER_HIDE_NONJAVA_RESOURCES, async () => { + Settings.switchNonJavaResourceFilter(false); }), ); diff --git a/test/maven-suite/projectView.test.ts b/test/maven-suite/projectView.test.ts index 31a10d4c..cdb69132 100644 --- a/test/maven-suite/projectView.test.ts +++ b/test/maven-suite/projectView.test.ts @@ -243,10 +243,10 @@ suite("Maven Project View Tests", () => { assert.ok(!projectChildren.find((node: DataNode) => node.nodeData.name === ".hidden")); }); - test("Can apply 'java.project.explorer.filters.nonJavaResources'", async function() { + test("Can apply 'java.project.explorer.showNonJavaResources'", async function() { await vscode.workspace.getConfiguration("java.project.explorer").update( - "filters", - { nonJavaResources:true } + "showNonJavaResources", + false ); const explorer = DependencyExplorer.getInstance(contextManager.context); From 3512b8bddbcecfeea0c05b7135e9b346ae3dab2e Mon Sep 17 00:00:00 2001 From: Sheng Chen Date: Sun, 23 Apr 2023 10:13:51 +0800 Subject: [PATCH 164/352] chore: Prepare for 0.22.0 (#756) * chore: Prepare for 0.22.0 --------- Signed-off-by: Sheng Chen --- CHANGELOG.md | 4 + README.md | 6 +- .../META-INF/MANIFEST.MF | 2 +- .../com.microsoft.jdtls.ext.core/pom.xml | 2 +- .../com.microsoft.jdtls.ext.target/pom.xml | 2 +- jdtls.ext/pom.xml | 2 +- package-lock.json | 954 ++++++++++-------- package.json | 6 +- test/ui/index.ts | 2 +- 9 files changed, 567 insertions(+), 413 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0ecb5aa8..b652e59c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,10 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0. - Support creating files and folders in Java Projects explorer. [#598](https://github.com/microsoft/vscode-java-dependency/issues/598) - Apply file decorators to project level. [#481](https://github.com/microsoft/vscode-java-dependency/issues/481) - Give more hints about the project import status. [#580](https://github.com/microsoft/vscode-java-dependency/issues/580) + +### Changed +- Improve workflow of creating resources from Java Projects explorer. [PR#741](https://github.com/microsoft/vscode-java-dependency/pull/741), [PR#754](https://github.com/microsoft/vscode-java-dependency/pull/754) + ### Fixed - Apply `files.exclude` to Java Projects explorer. [#214](https://github.com/microsoft/vscode-java-dependency/issues/214) - Empty packages will not appear sometimes. [#600](https://github.com/microsoft/vscode-java-dependency/issues/600) diff --git a/README.md b/README.md index f7c99e07..6fb9faac 100644 --- a/README.md +++ b/README.md @@ -57,9 +57,8 @@ You can tell that the glob pattern is supported. And here's more - you can incl ## Requirements -- JDK (version 11 or later) -- VS Code (version 1.44.0 or later) -- [Language Support for Java by Red Hat](https://marketplace.visualstudio.com/items?itemName=redhat.java) (version 0.32.0 or later) +- VS Code (version 1.77.0+) +- [Language Support for Java by Red Hat](https://marketplace.visualstudio.com/items?itemName=redhat.java) ## Settings @@ -72,6 +71,7 @@ You can tell that the glob pattern is supported. And here's more - you can incl | `java.dependency.refreshDelay` | The delay time (ms) the auto refresh is invoked when changes are detected. | `2000ms` | | `java.dependency.packagePresentation` | Specify how to display the package. Supported values are: `flat`, `hierarchical`.| `flat` | | `java.project.exportJar.targetPath` | The output path of export jar. When this setting is **empty** , a file explorer will pop up to let the user select the output location.| `${workspaceFolder}/${workspaceFolderBasename}.jar` | +| `java.project.explorer.showNonJavaResources` | When enabled, the explorer shows non-Java resources. | `true` | ## Contribution diff --git a/jdtls.ext/com.microsoft.jdtls.ext.core/META-INF/MANIFEST.MF b/jdtls.ext/com.microsoft.jdtls.ext.core/META-INF/MANIFEST.MF index 1e44e6e3..1882047f 100644 --- a/jdtls.ext/com.microsoft.jdtls.ext.core/META-INF/MANIFEST.MF +++ b/jdtls.ext/com.microsoft.jdtls.ext.core/META-INF/MANIFEST.MF @@ -2,7 +2,7 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: JDTLS EXT Core Bundle-SymbolicName: com.microsoft.jdtls.ext.core;singleton:=true -Bundle-Version: 0.21.2 +Bundle-Version: 0.22.0 Bundle-Activator: com.microsoft.jdtls.ext.core.JdtlsExtActivator Bundle-RequiredExecutionEnvironment: JavaSE-11 Bundle-ActivationPolicy: lazy diff --git a/jdtls.ext/com.microsoft.jdtls.ext.core/pom.xml b/jdtls.ext/com.microsoft.jdtls.ext.core/pom.xml index ed0150c6..3ca8bdff 100644 --- a/jdtls.ext/com.microsoft.jdtls.ext.core/pom.xml +++ b/jdtls.ext/com.microsoft.jdtls.ext.core/pom.xml @@ -5,7 +5,7 @@ com.microsoft.jdtls.ext jdtls-ext-parent - 0.21.2 + 0.22.0 com.microsoft.jdtls.ext.core eclipse-plugin diff --git a/jdtls.ext/com.microsoft.jdtls.ext.target/pom.xml b/jdtls.ext/com.microsoft.jdtls.ext.target/pom.xml index cd8d3d72..60352575 100644 --- a/jdtls.ext/com.microsoft.jdtls.ext.target/pom.xml +++ b/jdtls.ext/com.microsoft.jdtls.ext.target/pom.xml @@ -4,7 +4,7 @@ com.microsoft.jdtls.ext jdtls-ext-parent - 0.21.2 + 0.22.0 com.microsoft.jdtls.ext.tp ${base.name} :: Target Platform diff --git a/jdtls.ext/pom.xml b/jdtls.ext/pom.xml index 7cb7daa8..73dc9946 100644 --- a/jdtls.ext/pom.xml +++ b/jdtls.ext/pom.xml @@ -4,7 +4,7 @@ com.microsoft.jdtls.ext jdtls-ext-parent ${base.name} :: Parent - 0.21.2 + 0.22.0 pom Java Project Manager diff --git a/package-lock.json b/package-lock.json index d386068b..d11ac93e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "vscode-java-dependency", - "version": "0.21.2", + "version": "0.22.0", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "vscode-java-dependency", - "version": "0.21.2", + "version": "0.22.0", "license": "MIT", "dependencies": { "await-lock": "^2.2.2", @@ -34,7 +34,7 @@ "ts-loader": "^9.4.2", "tslint": "^6.1.3", "typescript": "^4.9.4", - "vscode-extension-tester": "^4.4.1", + "vscode-extension-tester": "^5.5.2", "webpack": "^5.76.0", "webpack-cli": "^4.10.0" }, @@ -496,6 +496,154 @@ "node": ">=16" } }, + "node_modules/@vscode/vsce": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/@vscode/vsce/-/vsce-2.19.0.tgz", + "integrity": "sha512-dAlILxC5ggOutcvJY24jxz913wimGiUrHaPkk16Gm9/PGFbz1YezWtrXsTKUtJws4fIlpX2UIlVlVESWq8lkfQ==", + "dev": true, + "dependencies": { + "azure-devops-node-api": "^11.0.1", + "chalk": "^2.4.2", + "cheerio": "^1.0.0-rc.9", + "commander": "^6.1.0", + "glob": "^7.0.6", + "hosted-git-info": "^4.0.2", + "jsonc-parser": "^3.2.0", + "leven": "^3.1.0", + "markdown-it": "^12.3.2", + "mime": "^1.3.4", + "minimatch": "^3.0.3", + "parse-semver": "^1.1.1", + "read": "^1.0.7", + "semver": "^5.1.0", + "tmp": "^0.2.1", + "typed-rest-client": "^1.8.4", + "url-join": "^4.0.1", + "xml2js": "^0.5.0", + "yauzl": "^2.3.1", + "yazl": "^2.2.2" + }, + "bin": { + "vsce": "vsce" + }, + "engines": { + "node": ">= 14" + }, + "optionalDependencies": { + "keytar": "^7.7.0" + } + }, + "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, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@vscode/vsce/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==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "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, + "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, + "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 + }, + "node_modules/@vscode/vsce/node_modules/commander": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz", + "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "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, + "engines": { + "node": ">=0.8.0" + } + }, + "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, + "engines": { + "node": ">=4" + } + }, + "node_modules/@vscode/vsce/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@vscode/vsce/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "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, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/@webassemblyjs/ast": { "version": "1.11.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz", @@ -886,7 +1034,8 @@ "type": "consulting", "url": "https://feross.org/support" } - ] + ], + "optional": true }, "node_modules/binary": { "version": "0.3.0", @@ -998,6 +1147,7 @@ "url": "https://feross.org/support" } ], + "optional": true, "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.1.13" @@ -1340,9 +1490,9 @@ "dev": true }, "node_modules/compare-versions": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-3.6.0.tgz", - "integrity": "sha512-W6Af2Iw1z4CB7q4uU4hv646dW9GQuBM+YpC0UvUCWSD8w90SJjp+ujJuXaEMtAXBtSqGfMPuFOVn4/+FlaqfBA==", + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-5.0.3.tgz", + "integrity": "sha512-4UZlZP8Z99MGEY+Ovg/uJxJuvoXuN4M6B3hKaiackiHrgzQFEe3diJi1mf1PNHbFujM7FvLrK2bpgIaImbtZ1A==", "dev": true }, "node_modules/concat-map": { @@ -1507,6 +1657,7 @@ "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", "dev": true, + "optional": true, "engines": { "node": ">=4.0.0" } @@ -1525,6 +1676,7 @@ "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.1.tgz", "integrity": "sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==", "dev": true, + "optional": true, "engines": { "node": ">=8" } @@ -1639,9 +1791,9 @@ } }, "node_modules/entities": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.4.0.tgz", - "integrity": "sha512-oYp7156SP8LkeGD0GF85ad1X9Ai79WtRsZ2gxJqtBuzH+98YUV6jkHEKlZkMbcrjJjIVJNIDP/3WL9wQkoPbWA==", + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", "dev": true, "engines": { "node": ">=0.12" @@ -1789,6 +1941,7 @@ "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==", "dev": true, + "optional": true, "engines": { "node": ">=6" } @@ -1999,7 +2152,8 @@ "version": "0.0.0", "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==", - "dev": true + "dev": true, + "optional": true }, "node_modules/glob": { "version": "7.2.3", @@ -2173,10 +2327,13 @@ } }, "node_modules/hpagent": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/hpagent/-/hpagent-0.1.2.tgz", - "integrity": "sha512-ePqFXHtSQWAFXYmj+JtOTHr84iNrII4/QRlAAPPE+zqnKy4xJo7Ie1Y4kC7AdB+LxLxSTTzBMASsEcy0q8YyvQ==", - "dev": true + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/hpagent/-/hpagent-1.2.0.tgz", + "integrity": "sha512-A91dYTeIB6NoXG+PxTQpCCDDnfHsW9kc06Lvpu1TEe9gnd6ZFeiBoRO9JvzEv6xK7EX97/dUE8g/vBMTqTS3CA==", + "dev": true, + "engines": { + "node": ">=14" + } }, "node_modules/htmlparser2": { "version": "8.0.2", @@ -2261,7 +2418,8 @@ "type": "consulting", "url": "https://feross.org/support" } - ] + ], + "optional": true }, "node_modules/ignore": { "version": "5.2.4", @@ -2316,7 +2474,8 @@ "version": "1.3.8", "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "dev": true + "dev": true, + "optional": true }, "node_modules/interpret": { "version": "2.2.0", @@ -2527,6 +2686,12 @@ "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", "dev": true }, + "node_modules/jsonc-parser": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", + "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==", + "dev": true + }, "node_modules/jsonfile": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", @@ -2556,6 +2721,7 @@ "integrity": "sha512-VPD8mtVtm5JNtA2AErl6Chp06JBfy7diFQ7TQQhdpWOl6MrCRB+eRbvAZUsbGQS9kiMq0coJsy0W0vHpDCkWsQ==", "dev": true, "hasInstallScript": true, + "optional": true, "dependencies": { "node-addon-api": "^4.3.0", "prebuild-install": "^7.0.1" @@ -2806,7 +2972,8 @@ "version": "0.5.3", "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", - "dev": true + "dev": true, + "optional": true }, "node_modules/mocha": { "version": "9.2.2", @@ -2944,19 +3111,34 @@ } }, "node_modules/monaco-page-objects": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/monaco-page-objects/-/monaco-page-objects-2.0.1.tgz", - "integrity": "sha512-OL2vzqA0YkKozdEEwj3fBYyJsv2jWZrG8nlKfho5epe//FQ7sY7QzaJ8OtfBD5mYGT7mwV1O649A/E33D5H6kA==", + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/monaco-page-objects/-/monaco-page-objects-3.5.1.tgz", + "integrity": "sha512-iuxvHxROB4HPqQ1hTIliHzU271GrnWWVQoWn78yjsYgMY2gktfJTFhumaXyQ+ASw/N0Zqp18FW4AFKe5Tq8+Ew==", "dev": true, "dependencies": { "clipboardy": "^2.3.0", "clone-deep": "^4.0.1", - "compare-versions": "^3.5.1", - "fs-extra": "^10.0.0", - "ts-essentials": "^8.0.0" + "compare-versions": "^5.0.1", + "fs-extra": "^11.1.0", + "ts-essentials": "^9.3.1" }, "peerDependencies": { - "selenium-webdriver": "^4.2.0" + "selenium-webdriver": "^4.6.1", + "typescript": ">=4.6.2" + } + }, + "node_modules/monaco-page-objects/node_modules/fs-extra": { + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.1.1.tgz", + "integrity": "sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" } }, "node_modules/ms": { @@ -2987,7 +3169,8 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz", "integrity": "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==", - "dev": true + "dev": true, + "optional": true }, "node_modules/neo-async": { "version": "2.6.2", @@ -3002,10 +3185,11 @@ "dev": true }, "node_modules/node-abi": { - "version": "3.33.0", - "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.33.0.tgz", - "integrity": "sha512-7GGVawqyHF4pfd0YFybhv/eM9JwTtPqx0mAanQ146O3FlSh3pA24zf9IRQTOsfTSqXTNzPSP5iagAJ94jjuVog==", + "version": "3.40.0", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.40.0.tgz", + "integrity": "sha512-zNy02qivjjRosswoYmPi8hIKJRr8MpQyeKT6qlcq/OnOgA3Rhoae+IYOqsM9V5+JnHWmxKnWOT2GxvtqdtOCXA==", "dev": true, + "optional": true, "dependencies": { "semver": "^7.3.5" }, @@ -3017,7 +3201,8 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-4.3.0.tgz", "integrity": "sha512-73sE9+3UaLYYFmDsFZnqCInzPyh3MqIwZO9cw58yIqAZhONrrabrYyYe3TuIqtIiOuTXVhsGau8hcrhhwSsDIQ==", - "dev": true + "dev": true, + "optional": true }, "node_modules/node-releases": { "version": "2.0.10", @@ -3327,6 +3512,7 @@ "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.1.tgz", "integrity": "sha512-jAXscXWMcCK8GgCoHOfIr0ODh5ai8mj63L2nWrjuAgXE6tDyYGnx4/8o/rCgU+B4JSyZBKbeZqzhtwtC3ovxjw==", "dev": true, + "optional": true, "dependencies": { "detect-libc": "^2.0.0", "expand-template": "^2.0.3", @@ -3353,6 +3539,7 @@ "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", "dev": true, + "optional": true, "dependencies": { "buffer": "^5.5.0", "inherits": "^2.0.4", @@ -3364,6 +3551,7 @@ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", "dev": true, + "optional": true, "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -3378,6 +3566,7 @@ "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==", "dev": true, + "optional": true, "dependencies": { "chownr": "^1.1.1", "mkdirp-classic": "^0.5.2", @@ -3390,6 +3579,7 @@ "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", "dev": true, + "optional": true, "dependencies": { "bl": "^4.0.3", "end-of-stream": "^1.4.1", @@ -3486,6 +3676,7 @@ "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", "dev": true, + "optional": true, "dependencies": { "deep-extend": "^0.6.0", "ini": "~1.3.0", @@ -3501,6 +3692,7 @@ "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", "dev": true, + "optional": true, "engines": { "node": ">=0.10.0" } @@ -3717,14 +3909,14 @@ } }, "node_modules/selenium-webdriver": { - "version": "4.8.2", - "resolved": "https://registry.npmjs.org/selenium-webdriver/-/selenium-webdriver-4.8.2.tgz", - "integrity": "sha512-d2dcpDLPcXlBy5qcPtB1B8RYTtj1N+JiHQLViFx3OP+i5hqkAuqTfJEYUh4qNX11S4NvbxjteiwN3OPwK3vPVw==", + "version": "4.9.0", + "resolved": "https://registry.npmjs.org/selenium-webdriver/-/selenium-webdriver-4.9.0.tgz", + "integrity": "sha512-QGaPoREo7sgOVhTiAvCasoi1f4ruTaJDtp0RKNFIbfyns5smK5+iCwnRTIPXb0R3CAYdaqUXd6BHduh37DorzQ==", "dev": true, "dependencies": { - "jszip": "^3.10.0", + "jszip": "^3.10.1", "tmp": "^0.2.1", - "ws": ">=8.11.0" + "ws": ">=8.13.0" }, "engines": { "node": ">= 14.20.0" @@ -3830,7 +4022,8 @@ "type": "consulting", "url": "https://feross.org/support" } - ] + ], + "optional": true }, "node_modules/simple-get": { "version": "4.0.1", @@ -3851,6 +4044,7 @@ "url": "https://feross.org/support" } ], + "optional": true, "dependencies": { "decompress-response": "^6.0.0", "once": "^1.3.1", @@ -4191,12 +4385,12 @@ } }, "node_modules/ts-essentials": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/ts-essentials/-/ts-essentials-8.1.0.tgz", - "integrity": "sha512-34xALeQADWRYq9kbtprP4KdpTQ3v3BBIs/U4SpaP+C4++B8ijXY5NnILRJLchQVMzw7YBzKuGMUMrI9uT+ALVw==", + "version": "9.3.1", + "resolved": "https://registry.npmjs.org/ts-essentials/-/ts-essentials-9.3.1.tgz", + "integrity": "sha512-9CChSvQMyVRo29Vb1A2jbs+LKo3d/bAf+ndSaX0T8cEiy/HChVaRN/HY5DqUryZ8hZ6uol9bEgCnGmnDbwBR9Q==", "dev": true, "peerDependencies": { - "typescript": ">=4.0.0" + "typescript": ">=4.1.0" } }, "node_modules/ts-loader": { @@ -4413,6 +4607,7 @@ "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", "dev": true, + "optional": true, "dependencies": { "safe-buffer": "^5.0.1" }, @@ -4535,210 +4730,98 @@ "uuid": "dist/bin/uuid" } }, - "node_modules/vsce": { - "version": "2.15.0", - "resolved": "https://registry.npmjs.org/vsce/-/vsce-2.15.0.tgz", - "integrity": "sha512-P8E9LAZvBCQnoGoizw65JfGvyMqNGlHdlUXD1VAuxtvYAaHBKLBdKPnpy60XKVDAkQCfmMu53g+gq9FM+ydepw==", - "deprecated": "vsce has been renamed to @vscode/vsce. Install using @vscode/vsce instead.", - "dev": true, + "node_modules/vscode-extension-telemetry-wrapper": { + "version": "0.13.3", + "resolved": "https://registry.npmjs.org/vscode-extension-telemetry-wrapper/-/vscode-extension-telemetry-wrapper-0.13.3.tgz", + "integrity": "sha512-k/PbUbH9/xqiMXI2g2RXpDg+4/v08t3NzdPc7HuDPF3A1XcYkgYwsPnS/bqsKZNymSQdbLvVuie6STMxbDX9KQ==", "dependencies": { - "azure-devops-node-api": "^11.0.1", - "chalk": "^2.4.2", - "cheerio": "^1.0.0-rc.9", - "commander": "^6.1.0", - "glob": "^7.0.6", - "hosted-git-info": "^4.0.2", - "keytar": "^7.7.0", - "leven": "^3.1.0", - "markdown-it": "^12.3.2", - "mime": "^1.3.4", - "minimatch": "^3.0.3", - "parse-semver": "^1.1.1", - "read": "^1.0.7", - "semver": "^5.1.0", - "tmp": "^0.2.1", - "typed-rest-client": "^1.8.4", - "url-join": "^4.0.1", - "xml2js": "^0.4.23", - "yauzl": "^2.3.1", - "yazl": "^2.2.2" - }, - "bin": { - "vsce": "vsce" + "@vscode/extension-telemetry": "^0.6.2", + "uuid": "^8.3.2" }, "engines": { - "node": ">= 14" + "vscode": "^1.14.0" } }, - "node_modules/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, - "dependencies": { - "color-convert": "^1.9.0" + "node_modules/vscode-extension-tester": { + "version": "5.5.2", + "resolved": "https://registry.npmjs.org/vscode-extension-tester/-/vscode-extension-tester-5.5.2.tgz", + "integrity": "sha512-+vRgJ7vdH5vsoF1kD4T7c0urxp5KETXuSeNvJcvsT+hBlWABdBjPHvyydtK7SQmcPKB4DtmsZVH2s2UX1+4GiA==", + "dev": true, + "dependencies": { + "@types/selenium-webdriver": "^4.1.12", + "@vscode/vsce": "^2.18.0", + "commander": "^10.0.0", + "compare-versions": "^5.0.1", + "fs-extra": "^11.1.0", + "glob": "^8.1.0", + "got": "^11.8.6", + "hpagent": "^1.2.0", + "js-yaml": "^4.1.0", + "monaco-page-objects": "^3.5.1", + "sanitize-filename": "^1.6.3", + "selenium-webdriver": "^4.8.1", + "targz": "^1.0.1", + "unzip-stream": "^0.3.1", + "vscode-extension-tester-locators": "^3.4.1" }, - "engines": { - "node": ">=4" + "bin": { + "extest": "out/cli.js" + }, + "peerDependencies": { + "mocha": ">=5.2.0", + "typescript": ">=4.6.2" } }, - "node_modules/vsce/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==", + "node_modules/vscode-extension-tester-locators": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/vscode-extension-tester-locators/-/vscode-extension-tester-locators-3.4.1.tgz", + "integrity": "sha512-RgkEsj4VKCe3Ft+agMtgMIEq93m+W8Bwlb3jrTKE8+mr/HSrzJL+p09jIz0HVdC9SCbChWaxMDyRli696Ex/5A==", "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "peerDependencies": { + "monaco-page-objects": "^3.5.0", + "selenium-webdriver": "^4.6.1" } }, - "node_modules/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==", + "node_modules/vscode-extension-tester/node_modules/commander": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", + "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", "dev": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, "engines": { - "node": ">=4" + "node": ">=14" } }, - "node_modules/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, - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/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 - }, - "node_modules/vsce/node_modules/commander": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz", - "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==", - "dev": true, - "engines": { - "node": ">= 6" - } - }, - "node_modules/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, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/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, - "engines": { - "node": ">=4" - } - }, - "node_modules/vsce/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "node_modules/vscode-extension-tester/node_modules/fs-extra": { + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.1.1.tgz", + "integrity": "sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ==", "dev": true, "dependencies": { - "brace-expansion": "^1.1.7" + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" }, "engines": { - "node": "*" - } - }, - "node_modules/vsce/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true, - "bin": { - "semver": "bin/semver" + "node": ">=14.14" } }, - "node_modules/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==", + "node_modules/vscode-extension-tester/node_modules/glob": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", + "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", "dev": true, "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/vscode-extension-telemetry-wrapper": { - "version": "0.13.3", - "resolved": "https://registry.npmjs.org/vscode-extension-telemetry-wrapper/-/vscode-extension-telemetry-wrapper-0.13.3.tgz", - "integrity": "sha512-k/PbUbH9/xqiMXI2g2RXpDg+4/v08t3NzdPc7HuDPF3A1XcYkgYwsPnS/bqsKZNymSQdbLvVuie6STMxbDX9KQ==", - "dependencies": { - "@vscode/extension-telemetry": "^0.6.2", - "uuid": "^8.3.2" + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" }, "engines": { - "vscode": "^1.14.0" - } - }, - "node_modules/vscode-extension-tester": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/vscode-extension-tester/-/vscode-extension-tester-4.4.1.tgz", - "integrity": "sha512-CaxWk41sX1Q9rycFCN6GRmNzjY3DJl5dxVknbLxVbjeR9g0Qam+dIajVQIeHsdUVEKJdfPCA8xbpJOyl/bUFnA==", - "dev": true, - "dependencies": { - "@types/selenium-webdriver": "^4.1.1", - "commander": "^8.0.0", - "compare-versions": "^3.6.0", - "fs-extra": "^10.0.0", - "glob": "^7.1.7", - "got": "^11.8.2", - "hpagent": "^0.1.2", - "js-yaml": "^4.1.0", - "monaco-page-objects": "^2.0.1", - "sanitize-filename": "^1.6.3", - "selenium-webdriver": "^4.2.0", - "targz": "^1.0.1", - "unzip-stream": "^0.3.0", - "vsce": "^2.3.0", - "vscode-extension-tester-locators": "^2.0.0" - }, - "bin": { - "extest": "out/cli.js" + "node": ">=12" }, - "peerDependencies": { - "mocha": ">=5.2.0" - } - }, - "node_modules/vscode-extension-tester-locators": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/vscode-extension-tester-locators/-/vscode-extension-tester-locators-2.0.0.tgz", - "integrity": "sha512-ljmevi7R1K5uCiMpstKydh/sCA9TEiohxLmzX30ZZU5qE/ZNWz/5oLrxTdqN3EcSVW9ZXhExvrQFvHoYZxy9Ng==", - "dev": true, - "peerDependencies": { - "monaco-page-objects": "^2.0.0", - "selenium-webdriver": "^4.2.0" - } - }, - "node_modules/vscode-extension-tester/node_modules/commander": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", - "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", - "dev": true, - "engines": { - "node": ">= 12" + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, "node_modules/vscode-tas-client": { @@ -5055,9 +5138,9 @@ } }, "node_modules/xml2js": { - "version": "0.4.23", - "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz", - "integrity": "sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==", + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.5.0.tgz", + "integrity": "sha512-drPFnkQJik/O+uPKpqSgr22mpuFHqKdbS835iAQrUC73L2F5WkboIRd63ai/2Yg6I1jzifPFKH2NTK+cfglkIA==", "dev": true, "dependencies": { "sax": ">=0.6.0", @@ -5564,6 +5647,124 @@ "semver": "^7.3.8" } }, + "@vscode/vsce": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/@vscode/vsce/-/vsce-2.19.0.tgz", + "integrity": "sha512-dAlILxC5ggOutcvJY24jxz913wimGiUrHaPkk16Gm9/PGFbz1YezWtrXsTKUtJws4fIlpX2UIlVlVESWq8lkfQ==", + "dev": true, + "requires": { + "azure-devops-node-api": "^11.0.1", + "chalk": "^2.4.2", + "cheerio": "^1.0.0-rc.9", + "commander": "^6.1.0", + "glob": "^7.0.6", + "hosted-git-info": "^4.0.2", + "jsonc-parser": "^3.2.0", + "keytar": "^7.7.0", + "leven": "^3.1.0", + "markdown-it": "^12.3.2", + "mime": "^1.3.4", + "minimatch": "^3.0.3", + "parse-semver": "^1.1.1", + "read": "^1.0.7", + "semver": "^5.1.0", + "tmp": "^0.2.1", + "typed-rest-client": "^1.8.4", + "url-join": "^4.0.1", + "xml2js": "^0.5.0", + "yauzl": "^2.3.1", + "yazl": "^2.2.2" + }, + "dependencies": { + "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, + "requires": { + "color-convert": "^1.9.0" + } + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "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, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "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, + "requires": { + "color-name": "1.1.3" + } + }, + "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 + }, + "commander": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz", + "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==", + "dev": true + }, + "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 + }, + "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 + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + }, + "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, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, "@webassemblyjs/ast": { "version": "1.11.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz", @@ -5872,7 +6073,8 @@ "version": "1.5.1", "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "dev": true + "dev": true, + "optional": true }, "binary": { "version": "0.3.0", @@ -5945,6 +6147,7 @@ "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", "dev": true, + "optional": true, "requires": { "base64-js": "^1.3.1", "ieee754": "^1.1.13" @@ -6207,9 +6410,9 @@ "dev": true }, "compare-versions": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-3.6.0.tgz", - "integrity": "sha512-W6Af2Iw1z4CB7q4uU4hv646dW9GQuBM+YpC0UvUCWSD8w90SJjp+ujJuXaEMtAXBtSqGfMPuFOVn4/+FlaqfBA==", + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-5.0.3.tgz", + "integrity": "sha512-4UZlZP8Z99MGEY+Ovg/uJxJuvoXuN4M6B3hKaiackiHrgzQFEe3diJi1mf1PNHbFujM7FvLrK2bpgIaImbtZ1A==", "dev": true }, "concat-map": { @@ -6323,7 +6526,8 @@ "version": "0.6.0", "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", - "dev": true + "dev": true, + "optional": true }, "defer-to-connect": { "version": "2.0.1", @@ -6335,7 +6539,8 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.1.tgz", "integrity": "sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==", - "dev": true + "dev": true, + "optional": true }, "diff": { "version": "5.0.0", @@ -6420,9 +6625,9 @@ } }, "entities": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.4.0.tgz", - "integrity": "sha512-oYp7156SP8LkeGD0GF85ad1X9Ai79WtRsZ2gxJqtBuzH+98YUV6jkHEKlZkMbcrjJjIVJNIDP/3WL9wQkoPbWA==", + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", "dev": true }, "envinfo": { @@ -6524,7 +6729,8 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==", - "dev": true + "dev": true, + "optional": true }, "fast-deep-equal": { "version": "3.1.3", @@ -6677,7 +6883,8 @@ "version": "0.0.0", "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==", - "dev": true + "dev": true, + "optional": true }, "glob": { "version": "7.2.3", @@ -6808,9 +7015,9 @@ } }, "hpagent": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/hpagent/-/hpagent-0.1.2.tgz", - "integrity": "sha512-ePqFXHtSQWAFXYmj+JtOTHr84iNrII4/QRlAAPPE+zqnKy4xJo7Ie1Y4kC7AdB+LxLxSTTzBMASsEcy0q8YyvQ==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/hpagent/-/hpagent-1.2.0.tgz", + "integrity": "sha512-A91dYTeIB6NoXG+PxTQpCCDDnfHsW9kc06Lvpu1TEe9gnd6ZFeiBoRO9JvzEv6xK7EX97/dUE8g/vBMTqTS3CA==", "dev": true }, "htmlparser2": { @@ -6866,7 +7073,8 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "dev": true + "dev": true, + "optional": true }, "ignore": { "version": "5.2.4", @@ -6909,7 +7117,8 @@ "version": "1.3.8", "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "dev": true + "dev": true, + "optional": true }, "interpret": { "version": "2.2.0", @@ -7063,6 +7272,12 @@ "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", "dev": true }, + "jsonc-parser": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", + "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==", + "dev": true + }, "jsonfile": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", @@ -7089,6 +7304,7 @@ "resolved": "https://registry.npmjs.org/keytar/-/keytar-7.9.0.tgz", "integrity": "sha512-VPD8mtVtm5JNtA2AErl6Chp06JBfy7diFQ7TQQhdpWOl6MrCRB+eRbvAZUsbGQS9kiMq0coJsy0W0vHpDCkWsQ==", "dev": true, + "optional": true, "requires": { "node-addon-api": "^4.3.0", "prebuild-install": "^7.0.1" @@ -7278,7 +7494,8 @@ "version": "0.5.3", "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", - "dev": true + "dev": true, + "optional": true }, "mocha": { "version": "9.2.2", @@ -7391,16 +7608,29 @@ } }, "monaco-page-objects": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/monaco-page-objects/-/monaco-page-objects-2.0.1.tgz", - "integrity": "sha512-OL2vzqA0YkKozdEEwj3fBYyJsv2jWZrG8nlKfho5epe//FQ7sY7QzaJ8OtfBD5mYGT7mwV1O649A/E33D5H6kA==", + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/monaco-page-objects/-/monaco-page-objects-3.5.1.tgz", + "integrity": "sha512-iuxvHxROB4HPqQ1hTIliHzU271GrnWWVQoWn78yjsYgMY2gktfJTFhumaXyQ+ASw/N0Zqp18FW4AFKe5Tq8+Ew==", "dev": true, "requires": { "clipboardy": "^2.3.0", "clone-deep": "^4.0.1", - "compare-versions": "^3.5.1", - "fs-extra": "^10.0.0", - "ts-essentials": "^8.0.0" + "compare-versions": "^5.0.1", + "fs-extra": "^11.1.0", + "ts-essentials": "^9.3.1" + }, + "dependencies": { + "fs-extra": { + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.1.1.tgz", + "integrity": "sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + } + } } }, "ms": { @@ -7425,7 +7655,8 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz", "integrity": "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==", - "dev": true + "dev": true, + "optional": true }, "neo-async": { "version": "2.6.2", @@ -7440,10 +7671,11 @@ "dev": true }, "node-abi": { - "version": "3.33.0", - "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.33.0.tgz", - "integrity": "sha512-7GGVawqyHF4pfd0YFybhv/eM9JwTtPqx0mAanQ146O3FlSh3pA24zf9IRQTOsfTSqXTNzPSP5iagAJ94jjuVog==", + "version": "3.40.0", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.40.0.tgz", + "integrity": "sha512-zNy02qivjjRosswoYmPi8hIKJRr8MpQyeKT6qlcq/OnOgA3Rhoae+IYOqsM9V5+JnHWmxKnWOT2GxvtqdtOCXA==", "dev": true, + "optional": true, "requires": { "semver": "^7.3.5" } @@ -7452,7 +7684,8 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-4.3.0.tgz", "integrity": "sha512-73sE9+3UaLYYFmDsFZnqCInzPyh3MqIwZO9cw58yIqAZhONrrabrYyYe3TuIqtIiOuTXVhsGau8hcrhhwSsDIQ==", - "dev": true + "dev": true, + "optional": true }, "node-releases": { "version": "2.0.10", @@ -7682,6 +7915,7 @@ "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.1.tgz", "integrity": "sha512-jAXscXWMcCK8GgCoHOfIr0ODh5ai8mj63L2nWrjuAgXE6tDyYGnx4/8o/rCgU+B4JSyZBKbeZqzhtwtC3ovxjw==", "dev": true, + "optional": true, "requires": { "detect-libc": "^2.0.0", "expand-template": "^2.0.3", @@ -7702,6 +7936,7 @@ "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", "dev": true, + "optional": true, "requires": { "buffer": "^5.5.0", "inherits": "^2.0.4", @@ -7713,6 +7948,7 @@ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", "dev": true, + "optional": true, "requires": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -7724,6 +7960,7 @@ "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==", "dev": true, + "optional": true, "requires": { "chownr": "^1.1.1", "mkdirp-classic": "^0.5.2", @@ -7736,6 +7973,7 @@ "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", "dev": true, + "optional": true, "requires": { "bl": "^4.0.3", "end-of-stream": "^1.4.1", @@ -7802,6 +8040,7 @@ "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", "dev": true, + "optional": true, "requires": { "deep-extend": "^0.6.0", "ini": "~1.3.0", @@ -7813,7 +8052,8 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", - "dev": true + "dev": true, + "optional": true } } }, @@ -7968,14 +8208,14 @@ } }, "selenium-webdriver": { - "version": "4.8.2", - "resolved": "https://registry.npmjs.org/selenium-webdriver/-/selenium-webdriver-4.8.2.tgz", - "integrity": "sha512-d2dcpDLPcXlBy5qcPtB1B8RYTtj1N+JiHQLViFx3OP+i5hqkAuqTfJEYUh4qNX11S4NvbxjteiwN3OPwK3vPVw==", + "version": "4.9.0", + "resolved": "https://registry.npmjs.org/selenium-webdriver/-/selenium-webdriver-4.9.0.tgz", + "integrity": "sha512-QGaPoREo7sgOVhTiAvCasoi1f4ruTaJDtp0RKNFIbfyns5smK5+iCwnRTIPXb0R3CAYdaqUXd6BHduh37DorzQ==", "dev": true, "requires": { - "jszip": "^3.10.0", + "jszip": "^3.10.1", "tmp": "^0.2.1", - "ws": ">=8.11.0" + "ws": ">=8.13.0" } }, "semver": { @@ -8046,13 +8286,15 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", - "dev": true + "dev": true, + "optional": true }, "simple-get": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz", "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==", "dev": true, + "optional": true, "requires": { "decompress-response": "^6.0.0", "once": "^1.3.1", @@ -8306,9 +8548,9 @@ } }, "ts-essentials": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/ts-essentials/-/ts-essentials-8.1.0.tgz", - "integrity": "sha512-34xALeQADWRYq9kbtprP4KdpTQ3v3BBIs/U4SpaP+C4++B8ijXY5NnILRJLchQVMzw7YBzKuGMUMrI9uT+ALVw==", + "version": "9.3.1", + "resolved": "https://registry.npmjs.org/ts-essentials/-/ts-essentials-9.3.1.tgz", + "integrity": "sha512-9CChSvQMyVRo29Vb1A2jbs+LKo3d/bAf+ndSaX0T8cEiy/HChVaRN/HY5DqUryZ8hZ6uol9bEgCnGmnDbwBR9Q==", "dev": true, "requires": {} }, @@ -8478,6 +8720,7 @@ "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", "dev": true, + "optional": true, "requires": { "safe-buffer": "^5.0.1" } @@ -8568,123 +8811,6 @@ "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==" }, - "vsce": { - "version": "2.15.0", - "resolved": "https://registry.npmjs.org/vsce/-/vsce-2.15.0.tgz", - "integrity": "sha512-P8E9LAZvBCQnoGoizw65JfGvyMqNGlHdlUXD1VAuxtvYAaHBKLBdKPnpy60XKVDAkQCfmMu53g+gq9FM+ydepw==", - "dev": true, - "requires": { - "azure-devops-node-api": "^11.0.1", - "chalk": "^2.4.2", - "cheerio": "^1.0.0-rc.9", - "commander": "^6.1.0", - "glob": "^7.0.6", - "hosted-git-info": "^4.0.2", - "keytar": "^7.7.0", - "leven": "^3.1.0", - "markdown-it": "^12.3.2", - "mime": "^1.3.4", - "minimatch": "^3.0.3", - "parse-semver": "^1.1.1", - "read": "^1.0.7", - "semver": "^5.1.0", - "tmp": "^0.2.1", - "typed-rest-client": "^1.8.4", - "url-join": "^4.0.1", - "xml2js": "^0.4.23", - "yauzl": "^2.3.1", - "yazl": "^2.2.2" - }, - "dependencies": { - "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, - "requires": { - "color-convert": "^1.9.0" - } - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "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, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "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, - "requires": { - "color-name": "1.1.3" - } - }, - "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 - }, - "commander": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz", - "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==", - "dev": true - }, - "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 - }, - "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 - }, - "minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - }, - "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, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, "vscode-extension-telemetry-wrapper": { "version": "0.13.3", "resolved": "https://registry.npmjs.org/vscode-extension-telemetry-wrapper/-/vscode-extension-telemetry-wrapper-0.13.3.tgz", @@ -8695,40 +8821,64 @@ } }, "vscode-extension-tester": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/vscode-extension-tester/-/vscode-extension-tester-4.4.1.tgz", - "integrity": "sha512-CaxWk41sX1Q9rycFCN6GRmNzjY3DJl5dxVknbLxVbjeR9g0Qam+dIajVQIeHsdUVEKJdfPCA8xbpJOyl/bUFnA==", - "dev": true, - "requires": { - "@types/selenium-webdriver": "^4.1.1", - "commander": "^8.0.0", - "compare-versions": "^3.6.0", - "fs-extra": "^10.0.0", - "glob": "^7.1.7", - "got": "^11.8.2", - "hpagent": "^0.1.2", + "version": "5.5.2", + "resolved": "https://registry.npmjs.org/vscode-extension-tester/-/vscode-extension-tester-5.5.2.tgz", + "integrity": "sha512-+vRgJ7vdH5vsoF1kD4T7c0urxp5KETXuSeNvJcvsT+hBlWABdBjPHvyydtK7SQmcPKB4DtmsZVH2s2UX1+4GiA==", + "dev": true, + "requires": { + "@types/selenium-webdriver": "^4.1.12", + "@vscode/vsce": "^2.18.0", + "commander": "^10.0.0", + "compare-versions": "^5.0.1", + "fs-extra": "^11.1.0", + "glob": "^8.1.0", + "got": "^11.8.6", + "hpagent": "^1.2.0", "js-yaml": "^4.1.0", - "monaco-page-objects": "^2.0.1", + "monaco-page-objects": "^3.5.1", "sanitize-filename": "^1.6.3", - "selenium-webdriver": "^4.2.0", + "selenium-webdriver": "^4.8.1", "targz": "^1.0.1", - "unzip-stream": "^0.3.0", - "vsce": "^2.3.0", - "vscode-extension-tester-locators": "^2.0.0" + "unzip-stream": "^0.3.1", + "vscode-extension-tester-locators": "^3.4.1" }, "dependencies": { "commander": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", - "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", + "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", "dev": true + }, + "fs-extra": { + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.1.1.tgz", + "integrity": "sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + } + }, + "glob": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", + "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + } } } }, "vscode-extension-tester-locators": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/vscode-extension-tester-locators/-/vscode-extension-tester-locators-2.0.0.tgz", - "integrity": "sha512-ljmevi7R1K5uCiMpstKydh/sCA9TEiohxLmzX30ZZU5qE/ZNWz/5oLrxTdqN3EcSVW9ZXhExvrQFvHoYZxy9Ng==", + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/vscode-extension-tester-locators/-/vscode-extension-tester-locators-3.4.1.tgz", + "integrity": "sha512-RgkEsj4VKCe3Ft+agMtgMIEq93m+W8Bwlb3jrTKE8+mr/HSrzJL+p09jIz0HVdC9SCbChWaxMDyRli696Ex/5A==", "dev": true, "requires": {} }, @@ -8942,9 +9092,9 @@ "requires": {} }, "xml2js": { - "version": "0.4.23", - "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz", - "integrity": "sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==", + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.5.0.tgz", + "integrity": "sha512-drPFnkQJik/O+uPKpqSgr22mpuFHqKdbS835iAQrUC73L2F5WkboIRd63ai/2Yg6I1jzifPFKH2NTK+cfglkIA==", "dev": true, "requires": { "sax": ">=0.6.0", diff --git a/package.json b/package.json index a69a3e1c..f6b973d0 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "vscode-java-dependency", "displayName": "Project Manager for Java", "description": "%description%", - "version": "0.21.2", + "version": "0.22.0", "publisher": "vscjava", "preview": true, "aiKey": "5c642b22-e845-4400-badb-3f8509a70777", @@ -45,7 +45,7 @@ "main": "./main.js", "contributes": { "javaExtensions": [ - "./server/com.microsoft.jdtls.ext.core-0.21.2.jar" + "./server/com.microsoft.jdtls.ext.core-0.22.0.jar" ], "commands": [ { @@ -888,7 +888,7 @@ "ts-loader": "^9.4.2", "tslint": "^6.1.3", "typescript": "^4.9.4", - "vscode-extension-tester": "^4.4.1", + "vscode-extension-tester": "^5.5.2", "webpack": "^5.76.0", "webpack-cli": "^4.10.0" }, diff --git a/test/ui/index.ts b/test/ui/index.ts index 9c3f6500..09de28d9 100644 --- a/test/ui/index.ts +++ b/test/ui/index.ts @@ -26,7 +26,7 @@ async function main(): Promise { await exTester.installFromMarketplace("redhat.java"); await exTester.downloadChromeDriver(version); await exTester.setupRequirements({vscodeVersion: version}); - process.exit(await exTester.runTests(testPath, {vscodeVersion: version})); + process.exit(await exTester.runTests(testPath, {vscodeVersion: version, resources: []})); } catch (err) { console.log(err); process.exit(1); From 572b6d2d7f405defb4143ab34cd5f1f43623eee9 Mon Sep 17 00:00:00 2001 From: Dusan Balek Date: Wed, 26 Apr 2023 15:00:48 +0200 Subject: [PATCH 165/352] feat: Support create Micronaut projects (#757) --------- Co-authored-by: Sheng Chen --- src/controllers/projectController.ts | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/controllers/projectController.ts b/src/controllers/projectController.ts index 8d0aac1f..e9a81dbd 100644 --- a/src/controllers/projectController.ts +++ b/src/controllers/projectController.ts @@ -95,6 +95,7 @@ enum ProjectType { Quarkus = "Quarkus", MicroProfile = "MicroProfile", JavaFX = "JavaFX", + Micronaut = "Micronaut", } async function ensureExtension(typeName: string, metaData: IProjectTypeMetadata): Promise { @@ -250,4 +251,13 @@ const projectTypes: IProjectType[] = [ }], }, }, + { + displayName: "Micronaut", + metadata: { + type: ProjectType.Micronaut, + extensionId: "oracle-labs-graalvm.micronaut", + extensionName: "GraalVM Tools for Micronaut", + createCommandId: "extension.micronaut.createProject", + }, + }, ]; From cec81496af9d24765fd5fde72a21530d4c24df1f Mon Sep 17 00:00:00 2001 From: Jeremy Fiel <32110157+jeremyfiel@users.noreply.github.com> Date: Thu, 27 Apr 2023 20:35:29 -0400 Subject: [PATCH 166/352] fix: spelling mistake in package.nls.json (#760) --- package.nls.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.nls.json b/package.nls.json index f02c36ff..28064de7 100644 --- a/package.nls.json +++ b/package.nls.json @@ -52,7 +52,7 @@ "taskDefinitions.java.project.build.path.exclude": "The path after '!' will be excluded from the paths to be built.", "taskDefinitions.java.project.build.isFullBuild": "Whether to execute a clean build or not.", "viewsWelcome.workbench.createNewJavaProject": "You can also [open a Java project folder](command:_java.project.open), or create a new Java project by clicking the button below.\n[Create Java Project](command:java.project.create)", - "viewsWelcome.workbench.noJavaProject": "No Java projects found in the current workspace. You can [pen a Java project folder](command:_java.project.open), or create a new Java project by clicking the button below.\n[Create Java Project](command:java.project.create)", + "viewsWelcome.workbench.noJavaProject": "No Java projects found in the current workspace. You can [open a Java project folder](command:_java.project.open), or create a new Java project by clicking the button below.\n[Create Java Project](command:java.project.create)", "viewsWelcome.workbench.importFailed": "Oops, something went wrong when opening Java projects. Please use the following action for troubleshooting:\n[Open Problems View](command:workbench.panel.markers.view.focus)", "viewsWelcome.workbench.inLightWeightMode": "To view the projects, you can import the projects into workspace.\n[Import Projects](command:java.server.mode.switch?%5B%22Standard%22,true%5D)", "viewsWelcome.workbench.installLanguageSupport": "The Java Projects explorer requires [Extension Pack for Java](command:extension.open?%5B%22vscjava.vscode-java-pack%22%5D) to provide full features.\n[Install](command:java.project.installExtension?%5B%22vscjava.vscode-java-pack%22%5D)" From 4118f94bba51d756193702b0ecaaa3c01ebc76b0 Mon Sep 17 00:00:00 2001 From: Dusan Balek Date: Thu, 18 May 2023 08:09:54 +0200 Subject: [PATCH 167/352] feat: Support create Graal Cloud Native projects. (#765) --- src/controllers/projectController.ts | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/controllers/projectController.ts b/src/controllers/projectController.ts index e9a81dbd..267cae3c 100644 --- a/src/controllers/projectController.ts +++ b/src/controllers/projectController.ts @@ -96,6 +96,7 @@ enum ProjectType { MicroProfile = "MicroProfile", JavaFX = "JavaFX", Micronaut = "Micronaut", + GCN = "GCN", } async function ensureExtension(typeName: string, metaData: IProjectTypeMetadata): Promise { @@ -260,4 +261,13 @@ const projectTypes: IProjectType[] = [ createCommandId: "extension.micronaut.createProject", }, }, + { + displayName: "Graal Cloud Native", + metadata: { + type: ProjectType.GCN, + extensionId: "oracle-labs-graalvm.gcn", + extensionName: "Graal Cloud Native Tools", + createCommandId: "gcn.createGcnProject", + }, + }, ]; From 4299903d83699c0a9ac773b64172a29e947bbdc9 Mon Sep 17 00:00:00 2001 From: Sheng Chen Date: Mon, 29 May 2023 10:38:04 +0800 Subject: [PATCH 168/352] chore: Prepare for 0.23.0 (#769) Signed-off-by: Sheng Chen --- CHANGELOG.md | 8 ++++++++ .../com.microsoft.jdtls.ext.core/META-INF/MANIFEST.MF | 2 +- jdtls.ext/com.microsoft.jdtls.ext.core/pom.xml | 2 +- jdtls.ext/com.microsoft.jdtls.ext.target/pom.xml | 2 +- jdtls.ext/pom.xml | 2 +- package-lock.json | 4 ++-- package.json | 4 ++-- 7 files changed, 16 insertions(+), 8 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b652e59c..6976d02d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,14 @@ All notable changes to the "vscode-java-dependency" extension will be documented The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/) and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html). +## 0.23.0 +### Added +- Support creating Micronaut projects. [#713](https://github.com/microsoft/vscode-java-dependency/issues/713), contributed by [@dbalek](https://github.com/dbalek) +- Support creating Craal Cloud Native projects. [PR#765](https://github.com/microsoft/vscode-java-dependency/pull/765), contributed by [@dbalek](https://github.com/dbalek) + +### Fixed +- Fix spelling mistake in welcome view. [PR#760](https://github.com/microsoft/vscode-java-dependency/pull/760), contributed by [@jeremyfiel](https://github.com/jeremyfiel) + ## 0.22.0 ### Added - Display non-Java files in Java Projects explorer. [#145](https://github.com/microsoft/vscode-java-dependency/issues/145) diff --git a/jdtls.ext/com.microsoft.jdtls.ext.core/META-INF/MANIFEST.MF b/jdtls.ext/com.microsoft.jdtls.ext.core/META-INF/MANIFEST.MF index 1882047f..a67802fb 100644 --- a/jdtls.ext/com.microsoft.jdtls.ext.core/META-INF/MANIFEST.MF +++ b/jdtls.ext/com.microsoft.jdtls.ext.core/META-INF/MANIFEST.MF @@ -2,7 +2,7 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: JDTLS EXT Core Bundle-SymbolicName: com.microsoft.jdtls.ext.core;singleton:=true -Bundle-Version: 0.22.0 +Bundle-Version: 0.23.0 Bundle-Activator: com.microsoft.jdtls.ext.core.JdtlsExtActivator Bundle-RequiredExecutionEnvironment: JavaSE-11 Bundle-ActivationPolicy: lazy diff --git a/jdtls.ext/com.microsoft.jdtls.ext.core/pom.xml b/jdtls.ext/com.microsoft.jdtls.ext.core/pom.xml index 3ca8bdff..b15b42d1 100644 --- a/jdtls.ext/com.microsoft.jdtls.ext.core/pom.xml +++ b/jdtls.ext/com.microsoft.jdtls.ext.core/pom.xml @@ -5,7 +5,7 @@ com.microsoft.jdtls.ext jdtls-ext-parent - 0.22.0 + 0.23.0 com.microsoft.jdtls.ext.core eclipse-plugin diff --git a/jdtls.ext/com.microsoft.jdtls.ext.target/pom.xml b/jdtls.ext/com.microsoft.jdtls.ext.target/pom.xml index 60352575..edb1356f 100644 --- a/jdtls.ext/com.microsoft.jdtls.ext.target/pom.xml +++ b/jdtls.ext/com.microsoft.jdtls.ext.target/pom.xml @@ -4,7 +4,7 @@ com.microsoft.jdtls.ext jdtls-ext-parent - 0.22.0 + 0.23.0 com.microsoft.jdtls.ext.tp ${base.name} :: Target Platform diff --git a/jdtls.ext/pom.xml b/jdtls.ext/pom.xml index 73dc9946..09874c64 100644 --- a/jdtls.ext/pom.xml +++ b/jdtls.ext/pom.xml @@ -4,7 +4,7 @@ com.microsoft.jdtls.ext jdtls-ext-parent ${base.name} :: Parent - 0.22.0 + 0.23.0 pom Java Project Manager diff --git a/package-lock.json b/package-lock.json index d11ac93e..ded37b2f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "vscode-java-dependency", - "version": "0.22.0", + "version": "0.23.0", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "vscode-java-dependency", - "version": "0.22.0", + "version": "0.23.0", "license": "MIT", "dependencies": { "await-lock": "^2.2.2", diff --git a/package.json b/package.json index f6b973d0..a5d03956 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "vscode-java-dependency", "displayName": "Project Manager for Java", "description": "%description%", - "version": "0.22.0", + "version": "0.23.0", "publisher": "vscjava", "preview": true, "aiKey": "5c642b22-e845-4400-badb-3f8509a70777", @@ -45,7 +45,7 @@ "main": "./main.js", "contributes": { "javaExtensions": [ - "./server/com.microsoft.jdtls.ext.core-0.22.0.jar" + "./server/com.microsoft.jdtls.ext.core-0.23.0.jar" ], "commands": [ { From ffe38aad8e96b37ceffd8d9188b451cf8ba5e722 Mon Sep 17 00:00:00 2001 From: Sheng Chen Date: Mon, 29 May 2023 13:15:18 +0800 Subject: [PATCH 169/352] fix: Cannot open file explorer from welcome view. (#771) Signed-off-by: Sheng Chen --- CHANGELOG.md | 1 + package.json | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6976d02d..23941f5b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0. ### Fixed - Fix spelling mistake in welcome view. [PR#760](https://github.com/microsoft/vscode-java-dependency/pull/760), contributed by [@jeremyfiel](https://github.com/jeremyfiel) +- Cannot open file explorer from welcome view. [#770](https://github.com/microsoft/vscode-java-dependency/issues/770) ## 0.22.0 ### Added diff --git a/package.json b/package.json index a5d03956..1502dbdc 100644 --- a/package.json +++ b/package.json @@ -39,7 +39,8 @@ "workspaceContains:settings.gradle.kts", "workspaceContains:*/settings.gradle.kts", "workspaceContains:.classpath", - "workspaceContains:*/.classpath" + "workspaceContains:*/.classpath", + "onCommand:_java.project.open" ], "license": "MIT", "main": "./main.js", From 9c3b27faa3fae3f404fa254e1cbf636ab647ec6f Mon Sep 17 00:00:00 2001 From: Sheng Chen Date: Thu, 1 Jun 2023 17:03:04 +0800 Subject: [PATCH 170/352] chore: Update dependencies (#772) Signed-off-by: Sheng Chen --- package-lock.json | 1361 +++++++++++++++++++++++---------------------- 1 file changed, 711 insertions(+), 650 deletions(-) diff --git a/package-lock.json b/package-lock.json index ded37b2f..f68051e1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -43,9 +43,9 @@ } }, "node_modules/@babel/code-frame": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", - "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", + "version": "7.21.4", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.21.4.tgz", + "integrity": "sha512-LYvhNKfwWSPpocw8GI7gpK2nq3HSDuEPC/uSYaALSJu9xjsalaaYFOq0Pwt5KmVqwEbZlDu81aLXwBOmD/Fv9g==", "dev": true, "dependencies": { "@babel/highlight": "^7.18.6" @@ -158,9 +158,9 @@ } }, "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", - "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", + "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", "dev": true, "dependencies": { "@jridgewell/set-array": "^1.0.1", @@ -190,9 +190,9 @@ } }, "node_modules/@jridgewell/source-map": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.2.tgz", - "integrity": "sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw==", + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.3.tgz", + "integrity": "sha512-b+fsZXeLYi9fEULmfBrhxn4IrPlINf8fiNarzTof004v3lFdntdwa9PF7vFJqm3mg7s+ScJMxXaE3Acp1irZcg==", "dev": true, "dependencies": { "@jridgewell/gen-mapping": "^0.3.0", @@ -206,9 +206,9 @@ "dev": true }, "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.17", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz", - "integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==", + "version": "0.3.18", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz", + "integrity": "sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==", "dev": true, "dependencies": { "@jridgewell/resolve-uri": "3.1.0", @@ -216,32 +216,32 @@ } }, "node_modules/@microsoft/1ds-core-js": { - "version": "3.2.9", - "resolved": "https://registry.npmjs.org/@microsoft/1ds-core-js/-/1ds-core-js-3.2.9.tgz", - "integrity": "sha512-3pCfM2TzHn3gU9pxHztduKcVRdb/nzruvPFfHPZD0IM0mb0h6TGo2isELF3CTMahTx50RAC51ojNIw2/7VRkOg==", + "version": "3.2.12", + "resolved": "https://registry.npmjs.org/@microsoft/1ds-core-js/-/1ds-core-js-3.2.12.tgz", + "integrity": "sha512-cHpxZZ+pbtOyqFMFB/c1COpaOE3VPFU6phYVHVvOA9DvoeMZfI/Xrxaj7B/vfq4MmkiE7nOAPhv5ZRn+i6OogA==", "dependencies": { - "@microsoft/applicationinsights-core-js": "2.8.10", + "@microsoft/applicationinsights-core-js": "2.8.14", "@microsoft/applicationinsights-shims": "^2.0.2", "@microsoft/dynamicproto-js": "^1.1.7" } }, "node_modules/@microsoft/1ds-post-js": { - "version": "3.2.9", - "resolved": "https://registry.npmjs.org/@microsoft/1ds-post-js/-/1ds-post-js-3.2.9.tgz", - "integrity": "sha512-D/RtqkQ2Nr4cuoGqmhi5QTmi3cBlxehIThJ1u3BaH9H/YkLNTKEcHZRWTXy14bXheCefNHciLuadg37G2Kekcg==", + "version": "3.2.12", + "resolved": "https://registry.npmjs.org/@microsoft/1ds-post-js/-/1ds-post-js-3.2.12.tgz", + "integrity": "sha512-vhIVYg4FzBfwtM8tBqDUq3xU+cFu6SQ7biuJHtQpd5PVjDgvAovVOMRF1khsZE/k2rttRRBpmBgNEqG3Ptoysw==", "dependencies": { - "@microsoft/1ds-core-js": "3.2.9", + "@microsoft/1ds-core-js": "3.2.12", "@microsoft/applicationinsights-shims": "^2.0.2", "@microsoft/dynamicproto-js": "^1.1.7" } }, "node_modules/@microsoft/applicationinsights-core-js": { - "version": "2.8.10", - "resolved": "https://registry.npmjs.org/@microsoft/applicationinsights-core-js/-/applicationinsights-core-js-2.8.10.tgz", - "integrity": "sha512-jQrufDW0+sV8fBhRvzIPNGiCC6dELH+Ug0DM5CfN9757TBqZJz8CSWyDjex39as8+jD0F/8HRU9QdmrVgq5vFg==", + "version": "2.8.14", + "resolved": "https://registry.npmjs.org/@microsoft/applicationinsights-core-js/-/applicationinsights-core-js-2.8.14.tgz", + "integrity": "sha512-XacWUHdjSHMUwdngMZBp0oiCBifD56CQK2Egu2PiBiF4xu2AO2yNCtWSXsQX2g5OkEhVwaEjfa/aH3WbpYxB1g==", "dependencies": { "@microsoft/applicationinsights-shims": "2.0.2", - "@microsoft/dynamicproto-js": "^1.1.7" + "@microsoft/dynamicproto-js": "^1.1.9" }, "peerDependencies": { "tslib": "*" @@ -253,9 +253,9 @@ "integrity": "sha512-PoHEgsnmcqruLNHZ/amACqdJ6YYQpED0KSRe6J7gIJTtpZC1FfFU9b1fmDKDKtFoUSrPzEh1qzO3kmRZP0betg==" }, "node_modules/@microsoft/dynamicproto-js": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/@microsoft/dynamicproto-js/-/dynamicproto-js-1.1.8.tgz", - "integrity": "sha512-j4ZgOZRtX0LTUgKq+4tRQotgwH03HH/mLkYbcgFBBJ9XKTDc4NIGzZeam2UQMzwz+5IVN0SXexNbbsz5B0b/og==" + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/@microsoft/dynamicproto-js/-/dynamicproto-js-1.1.9.tgz", + "integrity": "sha512-n1VPsljTSkthsAFYdiWfC+DKzK2WwcRp83Y1YAqdX552BstvsDjft9YXppjUzp11BPsapDoO1LDgrDB0XVsfNQ==" }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", @@ -335,9 +335,9 @@ } }, "node_modules/@types/eslint": { - "version": "8.21.3", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.21.3.tgz", - "integrity": "sha512-fa7GkppZVEByMWGbTtE5MbmXWJTVbrjjaS8K6uQj+XtuuUv1fsuPAxhygfqLmsb/Ufb3CV8deFCpiMfAgi00Sw==", + "version": "8.40.0", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.40.0.tgz", + "integrity": "sha512-nbq2mvc/tBrK9zQQuItvjJl++GTN5j06DaPtp3hZCpngmG6Q3xoyEmd0TwZI0gAy/G1X0zhGBbr2imsGFdFV0g==", "dev": true, "dependencies": { "@types/estree": "*", @@ -355,9 +355,9 @@ } }, "node_modules/@types/estree": { - "version": "0.0.51", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz", - "integrity": "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.1.tgz", + "integrity": "sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA==", "dev": true }, "node_modules/@types/fs-extra": { @@ -386,9 +386,9 @@ "dev": true }, "node_modules/@types/json-schema": { - "version": "7.0.11", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", - "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", + "version": "7.0.12", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.12.tgz", + "integrity": "sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==", "dev": true }, "node_modules/@types/keyv": { @@ -401,9 +401,9 @@ } }, "node_modules/@types/lodash": { - "version": "4.14.191", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.191.tgz", - "integrity": "sha512-BdZ5BCCvho3EIXw6wUCXHe7rS53AIDPLE+JzwgT+OsJk53oBfbSmZZ7CX4VaRoN78N+TJpFi9QPlfIVNmJYWxQ==", + "version": "4.14.195", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.195.tgz", + "integrity": "sha512-Hwx9EUgdwf2GLarOjQp5ZH8ZmblzcbTBC2wtQWNKARBSxM9ezRIAUpeDTgoQRAFB0+8CNWXVA9+MaSOzOF3nPg==", "dev": true }, "node_modules/@types/minimatch": { @@ -419,9 +419,9 @@ "dev": true }, "node_modules/@types/node": { - "version": "16.18.21", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.21.tgz", - "integrity": "sha512-TassPGd0AEZWA10qcNnXnSNwHlLfSth8XwUaWc3gTSDmBz/rKb613Qw5qRf6o2fdRBrLbsgeC9PMZshobkuUqg==", + "version": "16.18.34", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.34.tgz", + "integrity": "sha512-VmVm7gXwhkUimRfBwVI1CHhwp86jDWR04B5FGebMMyxV90SlCmFujwUHrxTD4oO+SOYU86SoxvhgeRQJY7iXFg==", "dev": true }, "node_modules/@types/responselike": { @@ -434,18 +434,18 @@ } }, "node_modules/@types/selenium-webdriver": { - "version": "4.1.13", - "resolved": "https://registry.npmjs.org/@types/selenium-webdriver/-/selenium-webdriver-4.1.13.tgz", - "integrity": "sha512-kGpIh7bvu4HGCJXl4PEJ53kzpG4iXlRDd66SNNCfJ58QhFuk9skOm57lVffZap5ChEOJwbge/LJ9IVGVC8EEOg==", + "version": "4.1.15", + "resolved": "https://registry.npmjs.org/@types/selenium-webdriver/-/selenium-webdriver-4.1.15.tgz", + "integrity": "sha512-oQ15G3q3EZ0dS049SB/5zx2tQkIS2kmDQWC/TSfAHJYKvXLZoUiLaPXnfSwbLP8Q5lcJeu5oYjKVSEV0t3H6Bg==", "dev": true, "dependencies": { "@types/ws": "*" } }, "node_modules/@types/semver": { - "version": "7.3.13", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.3.13.tgz", - "integrity": "sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw==", + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.0.tgz", + "integrity": "sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw==", "dev": true }, "node_modules/@types/vscode": { @@ -482,9 +482,9 @@ } }, "node_modules/@vscode/test-electron": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@vscode/test-electron/-/test-electron-2.3.0.tgz", - "integrity": "sha512-fwzA9RtazH1GT/sckYlbxu6t5e4VaMXwCVtyLv4UAG0hP6NTfnMaaG25XCfWqlVwFhBMcQXHBCy5dmz2eLUnkw==", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/@vscode/test-electron/-/test-electron-2.3.2.tgz", + "integrity": "sha512-CRfQIs5Wi5Ok5SUCC3PTvRRXa74LD43cSXHC8EuNlmHHEPaJa/AGrv76brcA1hVSxrdja9tiYwp95Lq8kwY0tw==", "dev": true, "dependencies": { "http-proxy-agent": "^4.0.1", @@ -645,148 +645,148 @@ } }, "node_modules/@webassemblyjs/ast": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz", - "integrity": "sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.6.tgz", + "integrity": "sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==", "dev": true, "dependencies": { - "@webassemblyjs/helper-numbers": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1" + "@webassemblyjs/helper-numbers": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6" } }, "node_modules/@webassemblyjs/floating-point-hex-parser": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz", - "integrity": "sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz", + "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==", "dev": true }, "node_modules/@webassemblyjs/helper-api-error": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz", - "integrity": "sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", + "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==", "dev": true }, "node_modules/@webassemblyjs/helper-buffer": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz", - "integrity": "sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.6.tgz", + "integrity": "sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA==", "dev": true }, "node_modules/@webassemblyjs/helper-numbers": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz", - "integrity": "sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", + "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", "dev": true, "dependencies": { - "@webassemblyjs/floating-point-hex-parser": "1.11.1", - "@webassemblyjs/helper-api-error": "1.11.1", + "@webassemblyjs/floating-point-hex-parser": "1.11.6", + "@webassemblyjs/helper-api-error": "1.11.6", "@xtuc/long": "4.2.2" } }, "node_modules/@webassemblyjs/helper-wasm-bytecode": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz", - "integrity": "sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", + "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==", "dev": true }, "node_modules/@webassemblyjs/helper-wasm-section": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz", - "integrity": "sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.6.tgz", + "integrity": "sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g==", "dev": true, "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1" + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6" } }, "node_modules/@webassemblyjs/ieee754": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz", - "integrity": "sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz", + "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==", "dev": true, "dependencies": { "@xtuc/ieee754": "^1.2.0" } }, "node_modules/@webassemblyjs/leb128": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.1.tgz", - "integrity": "sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz", + "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==", "dev": true, "dependencies": { "@xtuc/long": "4.2.2" } }, "node_modules/@webassemblyjs/utf8": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.1.tgz", - "integrity": "sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz", + "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==", "dev": true }, "node_modules/@webassemblyjs/wasm-edit": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz", - "integrity": "sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.6.tgz", + "integrity": "sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw==", "dev": true, "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/helper-wasm-section": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1", - "@webassemblyjs/wasm-opt": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1", - "@webassemblyjs/wast-printer": "1.11.1" + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/helper-wasm-section": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6", + "@webassemblyjs/wasm-opt": "1.11.6", + "@webassemblyjs/wasm-parser": "1.11.6", + "@webassemblyjs/wast-printer": "1.11.6" } }, "node_modules/@webassemblyjs/wasm-gen": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz", - "integrity": "sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.6.tgz", + "integrity": "sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA==", "dev": true, "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/ieee754": "1.11.1", - "@webassemblyjs/leb128": "1.11.1", - "@webassemblyjs/utf8": "1.11.1" + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" } }, "node_modules/@webassemblyjs/wasm-opt": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz", - "integrity": "sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.6.tgz", + "integrity": "sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g==", "dev": true, "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1" + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6", + "@webassemblyjs/wasm-parser": "1.11.6" } }, "node_modules/@webassemblyjs/wasm-parser": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz", - "integrity": "sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.6.tgz", + "integrity": "sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ==", "dev": true, "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-api-error": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/ieee754": "1.11.1", - "@webassemblyjs/leb128": "1.11.1", - "@webassemblyjs/utf8": "1.11.1" + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-api-error": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" } }, "node_modules/@webassemblyjs/wast-printer": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz", - "integrity": "sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.6.tgz", + "integrity": "sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A==", "dev": true, "dependencies": { - "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/ast": "1.11.6", "@xtuc/long": "4.2.2" } }, @@ -851,9 +851,9 @@ } }, "node_modules/acorn-import-assertions": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz", - "integrity": "sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz", + "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==", "dev": true, "peerDependencies": { "acorn": "^8" @@ -1060,13 +1060,30 @@ } }, "node_modules/bl": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.3.tgz", - "integrity": "sha512-pvcNpa0UU69UT341rO6AYy4FVAIkUHuZXRIWbq+zHnsVcRzDDjIAhGuuYoi0d//cwIwtt4pkpKycWEfjdV+vww==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", "dev": true, + "optional": true, "dependencies": { - "readable-stream": "^2.3.5", - "safe-buffer": "^5.1.1" + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "node_modules/bl/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "optional": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" } }, "node_modules/boolbase": { @@ -1101,9 +1118,9 @@ "dev": true }, "node_modules/browserslist": { - "version": "4.21.5", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.5.tgz", - "integrity": "sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w==", + "version": "4.21.7", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.7.tgz", + "integrity": "sha512-BauCXrQ7I2ftSqd2mvKHGo85XR0u7Ru3C/Hxsy/0TkfCtjrmAbPdzLGasmoiBxplpDXlPvdjX9u7srIMfgasNA==", "dev": true, "funding": [ { @@ -1113,13 +1130,17 @@ { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" } ], "dependencies": { - "caniuse-lite": "^1.0.30001449", - "electron-to-chromium": "^1.4.284", - "node-releases": "^2.0.8", - "update-browserslist-db": "^1.0.10" + "caniuse-lite": "^1.0.30001489", + "electron-to-chromium": "^1.4.411", + "node-releases": "^2.0.12", + "update-browserslist-db": "^1.0.11" }, "bin": { "browserslist": "cli.js" @@ -1261,9 +1282,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001470", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001470.tgz", - "integrity": "sha512-065uNwY6QtHCBOExzbV6m236DDhYCCtPmQUCoQtwkVqzud8v5QPidoMr6CoMkC2nfp6nksjttqWQRRh75LqUmA==", + "version": "1.0.30001492", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001492.tgz", + "integrity": "sha512-2efF8SAZwgAX1FJr87KWhvuJxnGJKOnctQa8xLOskAXNXq8oiuqgl6u1kk3fFpsp3GgvzlRjiK1sl63hNtFADw==", "dev": true, "funding": [ { @@ -1273,6 +1294,10 @@ { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" } ] }, @@ -1478,9 +1503,9 @@ "dev": true }, "node_modules/colorette": { - "version": "2.0.19", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.19.tgz", - "integrity": "sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==", + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", "dev": true }, "node_modules/commander": { @@ -1743,23 +1768,23 @@ } }, "node_modules/domutils": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.0.1.tgz", - "integrity": "sha512-z08c1l761iKhDFtfXO04C7kTdPBLi41zwOZl00WS8b5eiaebNpY00HKbztwBq+e3vyqWNwWF3mP9YLUeqIrF+Q==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz", + "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==", "dev": true, "dependencies": { "dom-serializer": "^2.0.0", "domelementtype": "^2.3.0", - "domhandler": "^5.0.1" + "domhandler": "^5.0.3" }, "funding": { "url": "https://github.com/fb55/domutils?sponsor=1" } }, "node_modules/electron-to-chromium": { - "version": "1.4.340", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.340.tgz", - "integrity": "sha512-zx8hqumOqltKsv/MF50yvdAlPF9S/4PXbyfzJS6ZGhbddGkRegdwImmfSVqCkEziYzrIGZ/TlrzBND4FysfkDg==", + "version": "1.4.416", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.416.tgz", + "integrity": "sha512-AUYh0XDTb2vrj0rj82jb3P9hHSyzQNdTPYWZIhPdCOui7/vpme7+HTE07BE5jwuqg/34TZ8ktlRz6GImJ4IXjA==", "dev": true }, "node_modules/emoji-regex": { @@ -1778,9 +1803,9 @@ } }, "node_modules/enhanced-resolve": { - "version": "5.12.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.12.0.tgz", - "integrity": "sha512-QHTXI/sZQmko1cbDoNAa3mJ5qhWUUNAq3vR0/YiD379fWQrcfuoX1+HW2S0MTt7XmoPLapdaDKUtelUSPic7hQ==", + "version": "5.14.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.14.1.tgz", + "integrity": "sha512-Vklwq2vDKtl0y/vtwjSesgJ5MYS7Etuk5txS8VdKL4AOS1aUlD96zqIfsOSLQsdv3xgMRbtkWM8eG9XDfKUPow==", "dev": true, "dependencies": { "graceful-fs": "^4.2.4", @@ -1815,9 +1840,9 @@ } }, "node_modules/es-module-lexer": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.9.3.tgz", - "integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.2.1.tgz", + "integrity": "sha512-9978wrXM50Y4rTMmW5kXIC09ZdXQZqkE4mxhwkd8VbzsGkXGPgV4zWuqQJgCEzYngdo2dYDa0l8xhX4fkSwJSg==", "dev": true }, "node_modules/escalade": { @@ -2120,13 +2145,14 @@ } }, "node_modules/get-intrinsic": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz", - "integrity": "sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", + "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", "dev": true, "dependencies": { "function-bind": "^1.1.1", "has": "^1.0.3", + "has-proto": "^1.0.1", "has-symbols": "^1.0.3" }, "funding": { @@ -2216,9 +2242,9 @@ } }, "node_modules/globby": { - "version": "13.1.3", - "resolved": "https://registry.npmjs.org/globby/-/globby-13.1.3.tgz", - "integrity": "sha512-8krCNHXvlCgHDpegPzleMq07yMYTO2sXKASmZmquEYWEmCx6J5UTRbp5RwMJkTJGtcQ44YpiUYUiN0b9mzy8Bw==", + "version": "13.1.4", + "resolved": "https://registry.npmjs.org/globby/-/globby-13.1.4.tgz", + "integrity": "sha512-iui/IiiW+QrJ1X1hKH5qwlMQyv34wJAYwH1vrf8b9kBA4sNiif3gKsMHa+BrdnOpEudWjpotfa7LrTzB1ERS/g==", "dependencies": { "dir-glob": "^3.0.1", "fast-glob": "^3.2.11", @@ -2293,6 +2319,18 @@ "node": ">=8" } }, + "node_modules/has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/has-symbols": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", @@ -2499,9 +2537,9 @@ } }, "node_modules/is-core-module": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", - "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.1.tgz", + "integrity": "sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg==", "dev": true, "dependencies": { "has": "^1.0.3" @@ -3111,9 +3149,9 @@ } }, "node_modules/monaco-page-objects": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/monaco-page-objects/-/monaco-page-objects-3.5.1.tgz", - "integrity": "sha512-iuxvHxROB4HPqQ1hTIliHzU271GrnWWVQoWn78yjsYgMY2gktfJTFhumaXyQ+ASw/N0Zqp18FW4AFKe5Tq8+Ew==", + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/monaco-page-objects/-/monaco-page-objects-3.6.0.tgz", + "integrity": "sha512-hMhILl3pc73+FHdnQ1No9I4WqfQsbvTdwHeGL0oZC2rjSp6zn+MJpJqVLRyppJYvSWC0RXJENMgUKunzqrKBPg==", "dev": true, "dependencies": { "clipboardy": "^2.3.0", @@ -3185,9 +3223,9 @@ "dev": true }, "node_modules/node-abi": { - "version": "3.40.0", - "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.40.0.tgz", - "integrity": "sha512-zNy02qivjjRosswoYmPi8hIKJRr8MpQyeKT6qlcq/OnOgA3Rhoae+IYOqsM9V5+JnHWmxKnWOT2GxvtqdtOCXA==", + "version": "3.43.0", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.43.0.tgz", + "integrity": "sha512-QB0MMv+tn9Ur2DtJrc8y09n0n6sw88CyDniWSX2cHW10goQXYPK9ZpFJOktDS4ron501edPX6h9i7Pg+RnH5nQ==", "dev": true, "optional": true, "dependencies": { @@ -3205,9 +3243,9 @@ "optional": true }, "node_modules/node-releases": { - "version": "2.0.10", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.10.tgz", - "integrity": "sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w==", + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.12.tgz", + "integrity": "sha512-QzsYKWhXTWx8h1kIvqfnC++o0pEmpRQA/aenALsL2F4pqNVr7YzcdMlDij5WBnwftRbJCNJL/O7zdKaxKPHqgQ==", "dev": true }, "node_modules/normalize-path": { @@ -3534,63 +3572,6 @@ "node": ">=10" } }, - "node_modules/prebuild-install/node_modules/bl": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", - "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", - "dev": true, - "optional": true, - "dependencies": { - "buffer": "^5.5.0", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" - } - }, - "node_modules/prebuild-install/node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "dev": true, - "optional": true, - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/prebuild-install/node_modules/tar-fs": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", - "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==", - "dev": true, - "optional": true, - "dependencies": { - "chownr": "^1.1.1", - "mkdirp-classic": "^0.5.2", - "pump": "^3.0.0", - "tar-stream": "^2.1.4" - } - }, - "node_modules/prebuild-install/node_modules/tar-stream": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", - "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", - "dev": true, - "optional": true, - "dependencies": { - "bl": "^4.0.3", - "end-of-stream": "^1.4.1", - "fs-constants": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^3.1.1" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/process-nextick-args": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", @@ -3617,9 +3598,9 @@ } }, "node_modules/qs": { - "version": "6.11.1", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.1.tgz", - "integrity": "sha512-0wsrzgTz/kAVIeuxSjnpGC56rzYtr6JT/2BwEvMaPhFIoYa1aGO8LbzuU1R0uUYQkLpWBTOj0l/CLAJB64J6nQ==", + "version": "6.11.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.2.tgz", + "integrity": "sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==", "dev": true, "dependencies": { "side-channel": "^1.0.4" @@ -3767,12 +3748,12 @@ } }, "node_modules/resolve": { - "version": "1.22.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", - "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", + "version": "1.22.2", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz", + "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==", "dev": true, "dependencies": { - "is-core-module": "^2.9.0", + "is-core-module": "^2.11.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, @@ -3890,15 +3871,15 @@ "dev": true }, "node_modules/schema-utils": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", - "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.1.tgz", + "integrity": "sha512-lELhBAAly9NowEsX0yZBlw9ahZG+sK/1RJ21EpzdYHKEs13Vku3LJ+MIPhh4sMs0oCCeufZQEQbMekiA4vuVIQ==", "dev": true, "dependencies": { "@types/json-schema": "^7.0.9", - "ajv": "^8.8.0", + "ajv": "^8.9.0", "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.0.0" + "ajv-keywords": "^5.1.0" }, "engines": { "node": ">= 12.13.0" @@ -3909,9 +3890,9 @@ } }, "node_modules/selenium-webdriver": { - "version": "4.9.0", - "resolved": "https://registry.npmjs.org/selenium-webdriver/-/selenium-webdriver-4.9.0.tgz", - "integrity": "sha512-QGaPoREo7sgOVhTiAvCasoi1f4ruTaJDtp0RKNFIbfyns5smK5+iCwnRTIPXb0R3CAYdaqUXd6BHduh37DorzQ==", + "version": "4.9.2", + "resolved": "https://registry.npmjs.org/selenium-webdriver/-/selenium-webdriver-4.9.2.tgz", + "integrity": "sha512-0gDswAgVn6qbCYckZetQQvQK9tWW1r7LaumhiqY1/Wl/7JEWG0JANsTbZKnmGc3+cUU76zAi5/p0P8LUweXlig==", "dev": true, "dependencies": { "jszip": "^3.10.1", @@ -3923,9 +3904,9 @@ } }, "node_modules/semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "version": "7.5.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz", + "integrity": "sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==", "dependencies": { "lru-cache": "^6.0.0" }, @@ -4180,18 +4161,70 @@ } }, "node_modules/tar-fs": { - "version": "1.16.3", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-1.16.3.tgz", - "integrity": "sha512-NvCeXpYx7OsmOh8zIOP/ebG55zZmxLE0etfWRbWok+q2Qo8x/vOR/IJT1taADXPe+jsiu9axDb3X4B+iIgNlKw==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", + "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==", "dev": true, + "optional": true, "dependencies": { - "chownr": "^1.0.1", - "mkdirp": "^0.5.1", - "pump": "^1.0.0", - "tar-stream": "^1.1.2" + "chownr": "^1.1.1", + "mkdirp-classic": "^0.5.2", + "pump": "^3.0.0", + "tar-stream": "^2.1.4" + } + }, + "node_modules/tar-stream": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", + "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", + "dev": true, + "optional": true, + "dependencies": { + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/tar-stream/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "optional": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/targz": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/targz/-/targz-1.0.1.tgz", + "integrity": "sha512-6q4tP9U55mZnRuMTBqnqc3nwYQY3kv+QthCFZuMk+Tn1qYUnMPmL/JZ/mzgXINzFpSqfU+242IFmFU9VPvqaQw==", + "dev": true, + "dependencies": { + "tar-fs": "^1.8.1" } }, - "node_modules/tar-fs/node_modules/pump": { + "node_modules/targz/node_modules/bl": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.3.tgz", + "integrity": "sha512-pvcNpa0UU69UT341rO6AYy4FVAIkUHuZXRIWbq+zHnsVcRzDDjIAhGuuYoi0d//cwIwtt4pkpKycWEfjdV+vww==", + "dev": true, + "dependencies": { + "readable-stream": "^2.3.5", + "safe-buffer": "^5.1.1" + } + }, + "node_modules/targz/node_modules/pump": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/pump/-/pump-1.0.3.tgz", "integrity": "sha512-8k0JupWme55+9tCVE+FS5ULT3K6AbgqrGa58lTT49RpyfwwcGedHqaC5LlQNdEAumn/wFsu6aPwkuPMioy8kqw==", @@ -4201,7 +4234,19 @@ "once": "^1.3.1" } }, - "node_modules/tar-stream": { + "node_modules/targz/node_modules/tar-fs": { + "version": "1.16.3", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-1.16.3.tgz", + "integrity": "sha512-NvCeXpYx7OsmOh8zIOP/ebG55zZmxLE0etfWRbWok+q2Qo8x/vOR/IJT1taADXPe+jsiu9axDb3X4B+iIgNlKw==", + "dev": true, + "dependencies": { + "chownr": "^1.0.1", + "mkdirp": "^0.5.1", + "pump": "^1.0.0", + "tar-stream": "^1.1.2" + } + }, + "node_modules/targz/node_modules/tar-stream": { "version": "1.6.2", "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.6.2.tgz", "integrity": "sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A==", @@ -4219,15 +4264,6 @@ "node": ">= 0.8.0" } }, - "node_modules/targz": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/targz/-/targz-1.0.1.tgz", - "integrity": "sha512-6q4tP9U55mZnRuMTBqnqc3nwYQY3kv+QthCFZuMk+Tn1qYUnMPmL/JZ/mzgXINzFpSqfU+242IFmFU9VPvqaQw==", - "dev": true, - "dependencies": { - "tar-fs": "^1.8.1" - } - }, "node_modules/tas-client": { "version": "0.1.58", "resolved": "https://registry.npmjs.org/tas-client/-/tas-client-0.1.58.tgz", @@ -4237,9 +4273,9 @@ } }, "node_modules/terser": { - "version": "5.16.8", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.16.8.tgz", - "integrity": "sha512-QI5g1E/ef7d+PsDifb+a6nnVgC4F22Bg6T0xrBrz6iloVB4PUkkunp6V8nzoOOZJIzjWVdAGqCdlKlhLq/TbIA==", + "version": "5.17.6", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.17.6.tgz", + "integrity": "sha512-V8QHcs8YuyLkLHsJO5ucyff1ykrLVsR4dNnS//L5Y3NiSXpbK1J+WMVUs67eI0KTxs9JtHhgEQpXQVHlHI92DQ==", "dev": true, "dependencies": { "@jridgewell/source-map": "^0.3.2", @@ -4255,16 +4291,16 @@ } }, "node_modules/terser-webpack-plugin": { - "version": "5.3.7", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.7.tgz", - "integrity": "sha512-AfKwIktyP7Cu50xNjXF/6Qb5lBNzYaWpU6YfoX3uZicTx0zTy0stDDCsvjDapKsSDvOeWo5MEq4TmdBy2cNoHw==", + "version": "5.3.9", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.9.tgz", + "integrity": "sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA==", "dev": true, "dependencies": { "@jridgewell/trace-mapping": "^0.3.17", "jest-worker": "^27.4.5", "schema-utils": "^3.1.1", "serialize-javascript": "^6.0.1", - "terser": "^5.16.5" + "terser": "^5.16.8" }, "engines": { "node": ">= 10.13.0" @@ -4320,9 +4356,9 @@ "dev": true }, "node_modules/terser-webpack-plugin/node_modules/schema-utils": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", - "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.2.tgz", + "integrity": "sha512-pvjEHOgWc9OWA/f/DE3ohBWTD6EleVLf7iFUkoSwAxttdBhB9QUebQgxER2kWueOvRJXPHNnyrvvh9eZINB8Eg==", "dev": true, "dependencies": { "@types/json-schema": "^7.0.8", @@ -4385,18 +4421,18 @@ } }, "node_modules/ts-essentials": { - "version": "9.3.1", - "resolved": "https://registry.npmjs.org/ts-essentials/-/ts-essentials-9.3.1.tgz", - "integrity": "sha512-9CChSvQMyVRo29Vb1A2jbs+LKo3d/bAf+ndSaX0T8cEiy/HChVaRN/HY5DqUryZ8hZ6uol9bEgCnGmnDbwBR9Q==", + "version": "9.3.2", + "resolved": "https://registry.npmjs.org/ts-essentials/-/ts-essentials-9.3.2.tgz", + "integrity": "sha512-JxKJzuWqH1MmH4ZFHtJzGEhkfN3QvVR3C3w+4BIoWeoY68UVVoA2Np/Bca9z0IPSErVCWhv439aT0We4Dks8kQ==", "dev": true, "peerDependencies": { "typescript": ">=4.1.0" } }, "node_modules/ts-loader": { - "version": "9.4.2", - "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.4.2.tgz", - "integrity": "sha512-OmlC4WVmFv5I0PpaxYb+qGeGOdm5giHU7HwDDUjw59emP2UYMHy9fFSDcYgSNoH8sXcj4hGCSEhlDZ9ULeDraA==", + "version": "9.4.3", + "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.4.3.tgz", + "integrity": "sha512-n3hBnm6ozJYzwiwt5YRiJZkzktftRpMiBApHaJPoWLA+qetQBAXkHqCLM6nwSdRDimqVtA5ocIkcTRLMTt7yzA==", "dev": true, "dependencies": { "chalk": "^4.1.0", @@ -4670,9 +4706,9 @@ } }, "node_modules/update-browserslist-db": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz", - "integrity": "sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==", + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz", + "integrity": "sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==", "dev": true, "funding": [ { @@ -4682,6 +4718,10 @@ { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" } ], "dependencies": { @@ -4689,7 +4729,7 @@ "picocolors": "^1.0.0" }, "bin": { - "browserslist-lint": "cli.js" + "update-browserslist-db": "cli.js" }, "peerDependencies": { "browserslist": ">= 4.21.0" @@ -4743,9 +4783,9 @@ } }, "node_modules/vscode-extension-tester": { - "version": "5.5.2", - "resolved": "https://registry.npmjs.org/vscode-extension-tester/-/vscode-extension-tester-5.5.2.tgz", - "integrity": "sha512-+vRgJ7vdH5vsoF1kD4T7c0urxp5KETXuSeNvJcvsT+hBlWABdBjPHvyydtK7SQmcPKB4DtmsZVH2s2UX1+4GiA==", + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/vscode-extension-tester/-/vscode-extension-tester-5.6.0.tgz", + "integrity": "sha512-HOhjeV4tY8kb1ieBjC+ThWSZfhcpxgpSDpZa0d+G6vsA5xOwRsNQQFk26SKlv+IkSD5kSzrxh665+xSMGECsdQ==", "dev": true, "dependencies": { "@types/selenium-webdriver": "^4.1.12", @@ -4757,12 +4797,12 @@ "got": "^11.8.6", "hpagent": "^1.2.0", "js-yaml": "^4.1.0", - "monaco-page-objects": "^3.5.1", + "monaco-page-objects": "^3.6.0", "sanitize-filename": "^1.6.3", "selenium-webdriver": "^4.8.1", "targz": "^1.0.1", "unzip-stream": "^0.3.1", - "vscode-extension-tester-locators": "^3.4.1" + "vscode-extension-tester-locators": "^3.4.2" }, "bin": { "extest": "out/cli.js" @@ -4773,12 +4813,12 @@ } }, "node_modules/vscode-extension-tester-locators": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/vscode-extension-tester-locators/-/vscode-extension-tester-locators-3.4.1.tgz", - "integrity": "sha512-RgkEsj4VKCe3Ft+agMtgMIEq93m+W8Bwlb3jrTKE8+mr/HSrzJL+p09jIz0HVdC9SCbChWaxMDyRli696Ex/5A==", + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/vscode-extension-tester-locators/-/vscode-extension-tester-locators-3.4.2.tgz", + "integrity": "sha512-ytJkUTDJ9Wj7pJgg3ocHXkTAQO90XY3YzqSFZkB6t96H0osAvjP26MYqB6QMNG9AA6w34hLJRPBscadi35f4LA==", "dev": true, "peerDependencies": { - "monaco-page-objects": "^3.5.0", + "monaco-page-objects": "^3.6.0", "selenium-webdriver": "^4.6.1" } }, @@ -4849,22 +4889,22 @@ } }, "node_modules/webpack": { - "version": "5.76.3", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.76.3.tgz", - "integrity": "sha512-18Qv7uGPU8b2vqGeEEObnfICyw2g39CHlDEK4I7NK13LOur1d0HGmGNKGT58Eluwddpn3oEejwvBPoP4M7/KSA==", + "version": "5.85.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.85.0.tgz", + "integrity": "sha512-7gazTiYqwo5OSqwH1tigLDL2r3qDeP2dOKYgd+LlXpsUMqDTklg6tOghexqky0/+6QY38kb/R/uRPUleuL43zg==", "dev": true, "dependencies": { "@types/eslint-scope": "^3.7.3", - "@types/estree": "^0.0.51", - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/wasm-edit": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1", + "@types/estree": "^1.0.0", + "@webassemblyjs/ast": "^1.11.5", + "@webassemblyjs/wasm-edit": "^1.11.5", + "@webassemblyjs/wasm-parser": "^1.11.5", "acorn": "^8.7.1", - "acorn-import-assertions": "^1.7.6", + "acorn-import-assertions": "^1.9.0", "browserslist": "^4.14.5", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.10.0", - "es-module-lexer": "^0.9.0", + "enhanced-resolve": "^5.14.1", + "es-module-lexer": "^1.2.1", "eslint-scope": "5.1.1", "events": "^3.2.0", "glob-to-regexp": "^0.4.1", @@ -4873,9 +4913,9 @@ "loader-runner": "^4.2.0", "mime-types": "^2.1.27", "neo-async": "^2.6.2", - "schema-utils": "^3.1.0", + "schema-utils": "^3.1.2", "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.1.3", + "terser-webpack-plugin": "^5.3.7", "watchpack": "^2.4.0", "webpack-sources": "^3.2.3" }, @@ -4996,9 +5036,9 @@ } }, "node_modules/webpack-merge": { - "version": "5.8.0", - "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.8.0.tgz", - "integrity": "sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q==", + "version": "5.9.0", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.9.0.tgz", + "integrity": "sha512-6NbRQw4+Sy50vYNTw7EyOn41OZItPiXB8GNv3INSoe3PSFaHJEz3SHTrYVaRm2LilNGnFUzh0FAwqPEmU/CwDg==", "dev": true, "dependencies": { "clone-deep": "^4.0.1", @@ -5049,9 +5089,9 @@ "dev": true }, "node_modules/webpack/node_modules/schema-utils": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", - "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.2.tgz", + "integrity": "sha512-pvjEHOgWc9OWA/f/DE3ohBWTD6EleVLf7iFUkoSwAxttdBhB9QUebQgxER2kWueOvRJXPHNnyrvvh9eZINB8Eg==", "dev": true, "dependencies": { "@types/json-schema": "^7.0.8", @@ -5082,9 +5122,9 @@ } }, "node_modules/wildcard": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.0.tgz", - "integrity": "sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz", + "integrity": "sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==", "dev": true }, "node_modules/workerpool": { @@ -5258,9 +5298,9 @@ }, "dependencies": { "@babel/code-frame": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", - "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", + "version": "7.21.4", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.21.4.tgz", + "integrity": "sha512-LYvhNKfwWSPpocw8GI7gpK2nq3HSDuEPC/uSYaALSJu9xjsalaaYFOq0Pwt5KmVqwEbZlDu81aLXwBOmD/Fv9g==", "dev": true, "requires": { "@babel/highlight": "^7.18.6" @@ -5348,9 +5388,9 @@ "dev": true }, "@jridgewell/gen-mapping": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", - "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", + "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", "dev": true, "requires": { "@jridgewell/set-array": "^1.0.1", @@ -5371,9 +5411,9 @@ "dev": true }, "@jridgewell/source-map": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.2.tgz", - "integrity": "sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw==", + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.3.tgz", + "integrity": "sha512-b+fsZXeLYi9fEULmfBrhxn4IrPlINf8fiNarzTof004v3lFdntdwa9PF7vFJqm3mg7s+ScJMxXaE3Acp1irZcg==", "dev": true, "requires": { "@jridgewell/gen-mapping": "^0.3.0", @@ -5387,9 +5427,9 @@ "dev": true }, "@jridgewell/trace-mapping": { - "version": "0.3.17", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz", - "integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==", + "version": "0.3.18", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz", + "integrity": "sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==", "dev": true, "requires": { "@jridgewell/resolve-uri": "3.1.0", @@ -5397,32 +5437,32 @@ } }, "@microsoft/1ds-core-js": { - "version": "3.2.9", - "resolved": "https://registry.npmjs.org/@microsoft/1ds-core-js/-/1ds-core-js-3.2.9.tgz", - "integrity": "sha512-3pCfM2TzHn3gU9pxHztduKcVRdb/nzruvPFfHPZD0IM0mb0h6TGo2isELF3CTMahTx50RAC51ojNIw2/7VRkOg==", + "version": "3.2.12", + "resolved": "https://registry.npmjs.org/@microsoft/1ds-core-js/-/1ds-core-js-3.2.12.tgz", + "integrity": "sha512-cHpxZZ+pbtOyqFMFB/c1COpaOE3VPFU6phYVHVvOA9DvoeMZfI/Xrxaj7B/vfq4MmkiE7nOAPhv5ZRn+i6OogA==", "requires": { - "@microsoft/applicationinsights-core-js": "2.8.10", + "@microsoft/applicationinsights-core-js": "2.8.14", "@microsoft/applicationinsights-shims": "^2.0.2", "@microsoft/dynamicproto-js": "^1.1.7" } }, "@microsoft/1ds-post-js": { - "version": "3.2.9", - "resolved": "https://registry.npmjs.org/@microsoft/1ds-post-js/-/1ds-post-js-3.2.9.tgz", - "integrity": "sha512-D/RtqkQ2Nr4cuoGqmhi5QTmi3cBlxehIThJ1u3BaH9H/YkLNTKEcHZRWTXy14bXheCefNHciLuadg37G2Kekcg==", + "version": "3.2.12", + "resolved": "https://registry.npmjs.org/@microsoft/1ds-post-js/-/1ds-post-js-3.2.12.tgz", + "integrity": "sha512-vhIVYg4FzBfwtM8tBqDUq3xU+cFu6SQ7biuJHtQpd5PVjDgvAovVOMRF1khsZE/k2rttRRBpmBgNEqG3Ptoysw==", "requires": { - "@microsoft/1ds-core-js": "3.2.9", + "@microsoft/1ds-core-js": "3.2.12", "@microsoft/applicationinsights-shims": "^2.0.2", "@microsoft/dynamicproto-js": "^1.1.7" } }, "@microsoft/applicationinsights-core-js": { - "version": "2.8.10", - "resolved": "https://registry.npmjs.org/@microsoft/applicationinsights-core-js/-/applicationinsights-core-js-2.8.10.tgz", - "integrity": "sha512-jQrufDW0+sV8fBhRvzIPNGiCC6dELH+Ug0DM5CfN9757TBqZJz8CSWyDjex39as8+jD0F/8HRU9QdmrVgq5vFg==", + "version": "2.8.14", + "resolved": "https://registry.npmjs.org/@microsoft/applicationinsights-core-js/-/applicationinsights-core-js-2.8.14.tgz", + "integrity": "sha512-XacWUHdjSHMUwdngMZBp0oiCBifD56CQK2Egu2PiBiF4xu2AO2yNCtWSXsQX2g5OkEhVwaEjfa/aH3WbpYxB1g==", "requires": { "@microsoft/applicationinsights-shims": "2.0.2", - "@microsoft/dynamicproto-js": "^1.1.7" + "@microsoft/dynamicproto-js": "^1.1.9" } }, "@microsoft/applicationinsights-shims": { @@ -5431,9 +5471,9 @@ "integrity": "sha512-PoHEgsnmcqruLNHZ/amACqdJ6YYQpED0KSRe6J7gIJTtpZC1FfFU9b1fmDKDKtFoUSrPzEh1qzO3kmRZP0betg==" }, "@microsoft/dynamicproto-js": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/@microsoft/dynamicproto-js/-/dynamicproto-js-1.1.8.tgz", - "integrity": "sha512-j4ZgOZRtX0LTUgKq+4tRQotgwH03HH/mLkYbcgFBBJ9XKTDc4NIGzZeam2UQMzwz+5IVN0SXexNbbsz5B0b/og==" + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/@microsoft/dynamicproto-js/-/dynamicproto-js-1.1.9.tgz", + "integrity": "sha512-n1VPsljTSkthsAFYdiWfC+DKzK2WwcRp83Y1YAqdX552BstvsDjft9YXppjUzp11BPsapDoO1LDgrDB0XVsfNQ==" }, "@nodelib/fs.scandir": { "version": "2.1.5", @@ -5492,9 +5532,9 @@ } }, "@types/eslint": { - "version": "8.21.3", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.21.3.tgz", - "integrity": "sha512-fa7GkppZVEByMWGbTtE5MbmXWJTVbrjjaS8K6uQj+XtuuUv1fsuPAxhygfqLmsb/Ufb3CV8deFCpiMfAgi00Sw==", + "version": "8.40.0", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.40.0.tgz", + "integrity": "sha512-nbq2mvc/tBrK9zQQuItvjJl++GTN5j06DaPtp3hZCpngmG6Q3xoyEmd0TwZI0gAy/G1X0zhGBbr2imsGFdFV0g==", "dev": true, "requires": { "@types/estree": "*", @@ -5512,9 +5552,9 @@ } }, "@types/estree": { - "version": "0.0.51", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz", - "integrity": "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.1.tgz", + "integrity": "sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA==", "dev": true }, "@types/fs-extra": { @@ -5543,9 +5583,9 @@ "dev": true }, "@types/json-schema": { - "version": "7.0.11", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", - "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", + "version": "7.0.12", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.12.tgz", + "integrity": "sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==", "dev": true }, "@types/keyv": { @@ -5558,9 +5598,9 @@ } }, "@types/lodash": { - "version": "4.14.191", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.191.tgz", - "integrity": "sha512-BdZ5BCCvho3EIXw6wUCXHe7rS53AIDPLE+JzwgT+OsJk53oBfbSmZZ7CX4VaRoN78N+TJpFi9QPlfIVNmJYWxQ==", + "version": "4.14.195", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.195.tgz", + "integrity": "sha512-Hwx9EUgdwf2GLarOjQp5ZH8ZmblzcbTBC2wtQWNKARBSxM9ezRIAUpeDTgoQRAFB0+8CNWXVA9+MaSOzOF3nPg==", "dev": true }, "@types/minimatch": { @@ -5576,9 +5616,9 @@ "dev": true }, "@types/node": { - "version": "16.18.21", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.21.tgz", - "integrity": "sha512-TassPGd0AEZWA10qcNnXnSNwHlLfSth8XwUaWc3gTSDmBz/rKb613Qw5qRf6o2fdRBrLbsgeC9PMZshobkuUqg==", + "version": "16.18.34", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.34.tgz", + "integrity": "sha512-VmVm7gXwhkUimRfBwVI1CHhwp86jDWR04B5FGebMMyxV90SlCmFujwUHrxTD4oO+SOYU86SoxvhgeRQJY7iXFg==", "dev": true }, "@types/responselike": { @@ -5591,18 +5631,18 @@ } }, "@types/selenium-webdriver": { - "version": "4.1.13", - "resolved": "https://registry.npmjs.org/@types/selenium-webdriver/-/selenium-webdriver-4.1.13.tgz", - "integrity": "sha512-kGpIh7bvu4HGCJXl4PEJ53kzpG4iXlRDd66SNNCfJ58QhFuk9skOm57lVffZap5ChEOJwbge/LJ9IVGVC8EEOg==", + "version": "4.1.15", + "resolved": "https://registry.npmjs.org/@types/selenium-webdriver/-/selenium-webdriver-4.1.15.tgz", + "integrity": "sha512-oQ15G3q3EZ0dS049SB/5zx2tQkIS2kmDQWC/TSfAHJYKvXLZoUiLaPXnfSwbLP8Q5lcJeu5oYjKVSEV0t3H6Bg==", "dev": true, "requires": { "@types/ws": "*" } }, "@types/semver": { - "version": "7.3.13", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.3.13.tgz", - "integrity": "sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw==", + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.0.tgz", + "integrity": "sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw==", "dev": true }, "@types/vscode": { @@ -5636,9 +5676,9 @@ } }, "@vscode/test-electron": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@vscode/test-electron/-/test-electron-2.3.0.tgz", - "integrity": "sha512-fwzA9RtazH1GT/sckYlbxu6t5e4VaMXwCVtyLv4UAG0hP6NTfnMaaG25XCfWqlVwFhBMcQXHBCy5dmz2eLUnkw==", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/@vscode/test-electron/-/test-electron-2.3.2.tgz", + "integrity": "sha512-CRfQIs5Wi5Ok5SUCC3PTvRRXa74LD43cSXHC8EuNlmHHEPaJa/AGrv76brcA1hVSxrdja9tiYwp95Lq8kwY0tw==", "dev": true, "requires": { "http-proxy-agent": "^4.0.1", @@ -5766,148 +5806,148 @@ } }, "@webassemblyjs/ast": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz", - "integrity": "sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.6.tgz", + "integrity": "sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==", "dev": true, "requires": { - "@webassemblyjs/helper-numbers": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1" + "@webassemblyjs/helper-numbers": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6" } }, "@webassemblyjs/floating-point-hex-parser": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz", - "integrity": "sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz", + "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==", "dev": true }, "@webassemblyjs/helper-api-error": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz", - "integrity": "sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", + "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==", "dev": true }, "@webassemblyjs/helper-buffer": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz", - "integrity": "sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.6.tgz", + "integrity": "sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA==", "dev": true }, "@webassemblyjs/helper-numbers": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz", - "integrity": "sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", + "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", "dev": true, "requires": { - "@webassemblyjs/floating-point-hex-parser": "1.11.1", - "@webassemblyjs/helper-api-error": "1.11.1", + "@webassemblyjs/floating-point-hex-parser": "1.11.6", + "@webassemblyjs/helper-api-error": "1.11.6", "@xtuc/long": "4.2.2" } }, "@webassemblyjs/helper-wasm-bytecode": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz", - "integrity": "sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", + "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==", "dev": true }, "@webassemblyjs/helper-wasm-section": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz", - "integrity": "sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.6.tgz", + "integrity": "sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1" + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6" } }, "@webassemblyjs/ieee754": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz", - "integrity": "sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz", + "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==", "dev": true, "requires": { "@xtuc/ieee754": "^1.2.0" } }, "@webassemblyjs/leb128": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.1.tgz", - "integrity": "sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz", + "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==", "dev": true, "requires": { "@xtuc/long": "4.2.2" } }, "@webassemblyjs/utf8": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.1.tgz", - "integrity": "sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz", + "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==", "dev": true }, "@webassemblyjs/wasm-edit": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz", - "integrity": "sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.6.tgz", + "integrity": "sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/helper-wasm-section": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1", - "@webassemblyjs/wasm-opt": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1", - "@webassemblyjs/wast-printer": "1.11.1" + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/helper-wasm-section": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6", + "@webassemblyjs/wasm-opt": "1.11.6", + "@webassemblyjs/wasm-parser": "1.11.6", + "@webassemblyjs/wast-printer": "1.11.6" } }, "@webassemblyjs/wasm-gen": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz", - "integrity": "sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.6.tgz", + "integrity": "sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/ieee754": "1.11.1", - "@webassemblyjs/leb128": "1.11.1", - "@webassemblyjs/utf8": "1.11.1" + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" } }, "@webassemblyjs/wasm-opt": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz", - "integrity": "sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.6.tgz", + "integrity": "sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1" + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6", + "@webassemblyjs/wasm-parser": "1.11.6" } }, "@webassemblyjs/wasm-parser": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz", - "integrity": "sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.6.tgz", + "integrity": "sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-api-error": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/ieee754": "1.11.1", - "@webassemblyjs/leb128": "1.11.1", - "@webassemblyjs/utf8": "1.11.1" + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-api-error": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" } }, "@webassemblyjs/wast-printer": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz", - "integrity": "sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.6.tgz", + "integrity": "sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/ast": "1.11.6", "@xtuc/long": "4.2.2" } }, @@ -5953,9 +5993,9 @@ "dev": true }, "acorn-import-assertions": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz", - "integrity": "sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz", + "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==", "dev": true, "requires": {} }, @@ -6093,13 +6133,29 @@ "dev": true }, "bl": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.3.tgz", - "integrity": "sha512-pvcNpa0UU69UT341rO6AYy4FVAIkUHuZXRIWbq+zHnsVcRzDDjIAhGuuYoi0d//cwIwtt4pkpKycWEfjdV+vww==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", "dev": true, + "optional": true, "requires": { - "readable-stream": "^2.3.5", - "safe-buffer": "^5.1.1" + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "optional": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } } }, "boolbase": { @@ -6131,15 +6187,15 @@ "dev": true }, "browserslist": { - "version": "4.21.5", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.5.tgz", - "integrity": "sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w==", + "version": "4.21.7", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.7.tgz", + "integrity": "sha512-BauCXrQ7I2ftSqd2mvKHGo85XR0u7Ru3C/Hxsy/0TkfCtjrmAbPdzLGasmoiBxplpDXlPvdjX9u7srIMfgasNA==", "dev": true, "requires": { - "caniuse-lite": "^1.0.30001449", - "electron-to-chromium": "^1.4.284", - "node-releases": "^2.0.8", - "update-browserslist-db": "^1.0.10" + "caniuse-lite": "^1.0.30001489", + "electron-to-chromium": "^1.4.411", + "node-releases": "^2.0.12", + "update-browserslist-db": "^1.0.11" } }, "buffer": { @@ -6237,9 +6293,9 @@ "dev": true }, "caniuse-lite": { - "version": "1.0.30001470", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001470.tgz", - "integrity": "sha512-065uNwY6QtHCBOExzbV6m236DDhYCCtPmQUCoQtwkVqzud8v5QPidoMr6CoMkC2nfp6nksjttqWQRRh75LqUmA==", + "version": "1.0.30001492", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001492.tgz", + "integrity": "sha512-2efF8SAZwgAX1FJr87KWhvuJxnGJKOnctQa8xLOskAXNXq8oiuqgl6u1kk3fFpsp3GgvzlRjiK1sl63hNtFADw==", "dev": true }, "chainsaw": { @@ -6398,9 +6454,9 @@ "dev": true }, "colorette": { - "version": "2.0.19", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.19.tgz", - "integrity": "sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==", + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", "dev": true }, "commander": { @@ -6583,20 +6639,20 @@ } }, "domutils": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.0.1.tgz", - "integrity": "sha512-z08c1l761iKhDFtfXO04C7kTdPBLi41zwOZl00WS8b5eiaebNpY00HKbztwBq+e3vyqWNwWF3mP9YLUeqIrF+Q==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz", + "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==", "dev": true, "requires": { "dom-serializer": "^2.0.0", "domelementtype": "^2.3.0", - "domhandler": "^5.0.1" + "domhandler": "^5.0.3" } }, "electron-to-chromium": { - "version": "1.4.340", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.340.tgz", - "integrity": "sha512-zx8hqumOqltKsv/MF50yvdAlPF9S/4PXbyfzJS6ZGhbddGkRegdwImmfSVqCkEziYzrIGZ/TlrzBND4FysfkDg==", + "version": "1.4.416", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.416.tgz", + "integrity": "sha512-AUYh0XDTb2vrj0rj82jb3P9hHSyzQNdTPYWZIhPdCOui7/vpme7+HTE07BE5jwuqg/34TZ8ktlRz6GImJ4IXjA==", "dev": true }, "emoji-regex": { @@ -6615,9 +6671,9 @@ } }, "enhanced-resolve": { - "version": "5.12.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.12.0.tgz", - "integrity": "sha512-QHTXI/sZQmko1cbDoNAa3mJ5qhWUUNAq3vR0/YiD379fWQrcfuoX1+HW2S0MTt7XmoPLapdaDKUtelUSPic7hQ==", + "version": "5.14.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.14.1.tgz", + "integrity": "sha512-Vklwq2vDKtl0y/vtwjSesgJ5MYS7Etuk5txS8VdKL4AOS1aUlD96zqIfsOSLQsdv3xgMRbtkWM8eG9XDfKUPow==", "dev": true, "requires": { "graceful-fs": "^4.2.4", @@ -6637,9 +6693,9 @@ "dev": true }, "es-module-lexer": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.9.3.tgz", - "integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.2.1.tgz", + "integrity": "sha512-9978wrXM50Y4rTMmW5kXIC09ZdXQZqkE4mxhwkd8VbzsGkXGPgV4zWuqQJgCEzYngdo2dYDa0l8xhX4fkSwJSg==", "dev": true }, "escalade": { @@ -6860,13 +6916,14 @@ "dev": true }, "get-intrinsic": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz", - "integrity": "sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", + "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", "dev": true, "requires": { "function-bind": "^1.1.1", "has": "^1.0.3", + "has-proto": "^1.0.1", "has-symbols": "^1.0.3" } }, @@ -6937,9 +6994,9 @@ "dev": true }, "globby": { - "version": "13.1.3", - "resolved": "https://registry.npmjs.org/globby/-/globby-13.1.3.tgz", - "integrity": "sha512-8krCNHXvlCgHDpegPzleMq07yMYTO2sXKASmZmquEYWEmCx6J5UTRbp5RwMJkTJGtcQ44YpiUYUiN0b9mzy8Bw==", + "version": "13.1.4", + "resolved": "https://registry.npmjs.org/globby/-/globby-13.1.4.tgz", + "integrity": "sha512-iui/IiiW+QrJ1X1hKH5qwlMQyv34wJAYwH1vrf8b9kBA4sNiif3gKsMHa+BrdnOpEudWjpotfa7LrTzB1ERS/g==", "requires": { "dir-glob": "^3.0.1", "fast-glob": "^3.2.11", @@ -6993,6 +7050,12 @@ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, + "has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "dev": true + }, "has-symbols": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", @@ -7136,9 +7199,9 @@ } }, "is-core-module": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", - "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.1.tgz", + "integrity": "sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg==", "dev": true, "requires": { "has": "^1.0.3" @@ -7608,9 +7671,9 @@ } }, "monaco-page-objects": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/monaco-page-objects/-/monaco-page-objects-3.5.1.tgz", - "integrity": "sha512-iuxvHxROB4HPqQ1hTIliHzU271GrnWWVQoWn78yjsYgMY2gktfJTFhumaXyQ+ASw/N0Zqp18FW4AFKe5Tq8+Ew==", + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/monaco-page-objects/-/monaco-page-objects-3.6.0.tgz", + "integrity": "sha512-hMhILl3pc73+FHdnQ1No9I4WqfQsbvTdwHeGL0oZC2rjSp6zn+MJpJqVLRyppJYvSWC0RXJENMgUKunzqrKBPg==", "dev": true, "requires": { "clipboardy": "^2.3.0", @@ -7671,9 +7734,9 @@ "dev": true }, "node-abi": { - "version": "3.40.0", - "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.40.0.tgz", - "integrity": "sha512-zNy02qivjjRosswoYmPi8hIKJRr8MpQyeKT6qlcq/OnOgA3Rhoae+IYOqsM9V5+JnHWmxKnWOT2GxvtqdtOCXA==", + "version": "3.43.0", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.43.0.tgz", + "integrity": "sha512-QB0MMv+tn9Ur2DtJrc8y09n0n6sw88CyDniWSX2cHW10goQXYPK9ZpFJOktDS4ron501edPX6h9i7Pg+RnH5nQ==", "dev": true, "optional": true, "requires": { @@ -7688,9 +7751,9 @@ "optional": true }, "node-releases": { - "version": "2.0.10", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.10.tgz", - "integrity": "sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w==", + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.12.tgz", + "integrity": "sha512-QzsYKWhXTWx8h1kIvqfnC++o0pEmpRQA/aenALsL2F4pqNVr7YzcdMlDij5WBnwftRbJCNJL/O7zdKaxKPHqgQ==", "dev": true }, "normalize-path": { @@ -7929,59 +7992,6 @@ "simple-get": "^4.0.0", "tar-fs": "^2.0.0", "tunnel-agent": "^0.6.0" - }, - "dependencies": { - "bl": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", - "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", - "dev": true, - "optional": true, - "requires": { - "buffer": "^5.5.0", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" - } - }, - "readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "dev": true, - "optional": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - }, - "tar-fs": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", - "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==", - "dev": true, - "optional": true, - "requires": { - "chownr": "^1.1.1", - "mkdirp-classic": "^0.5.2", - "pump": "^3.0.0", - "tar-stream": "^2.1.4" - } - }, - "tar-stream": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", - "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", - "dev": true, - "optional": true, - "requires": { - "bl": "^4.0.3", - "end-of-stream": "^1.4.1", - "fs-constants": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^3.1.1" - } - } } }, "process-nextick-args": { @@ -8007,9 +8017,9 @@ "dev": true }, "qs": { - "version": "6.11.1", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.1.tgz", - "integrity": "sha512-0wsrzgTz/kAVIeuxSjnpGC56rzYtr6JT/2BwEvMaPhFIoYa1aGO8LbzuU1R0uUYQkLpWBTOj0l/CLAJB64J6nQ==", + "version": "6.11.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.2.tgz", + "integrity": "sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==", "dev": true, "requires": { "side-channel": "^1.0.4" @@ -8112,12 +8122,12 @@ "dev": true }, "resolve": { - "version": "1.22.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", - "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", + "version": "1.22.2", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz", + "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==", "dev": true, "requires": { - "is-core-module": "^2.9.0", + "is-core-module": "^2.11.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" } @@ -8196,21 +8206,21 @@ "dev": true }, "schema-utils": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", - "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.1.tgz", + "integrity": "sha512-lELhBAAly9NowEsX0yZBlw9ahZG+sK/1RJ21EpzdYHKEs13Vku3LJ+MIPhh4sMs0oCCeufZQEQbMekiA4vuVIQ==", "dev": true, "requires": { "@types/json-schema": "^7.0.9", - "ajv": "^8.8.0", + "ajv": "^8.9.0", "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.0.0" + "ajv-keywords": "^5.1.0" } }, "selenium-webdriver": { - "version": "4.9.0", - "resolved": "https://registry.npmjs.org/selenium-webdriver/-/selenium-webdriver-4.9.0.tgz", - "integrity": "sha512-QGaPoREo7sgOVhTiAvCasoi1f4ruTaJDtp0RKNFIbfyns5smK5+iCwnRTIPXb0R3CAYdaqUXd6BHduh37DorzQ==", + "version": "4.9.2", + "resolved": "https://registry.npmjs.org/selenium-webdriver/-/selenium-webdriver-4.9.2.tgz", + "integrity": "sha512-0gDswAgVn6qbCYckZetQQvQK9tWW1r7LaumhiqY1/Wl/7JEWG0JANsTbZKnmGc3+cUU76zAi5/p0P8LUweXlig==", "dev": true, "requires": { "jszip": "^3.10.1", @@ -8219,9 +8229,9 @@ } }, "semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "version": "7.5.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz", + "integrity": "sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==", "requires": { "lru-cache": "^6.0.0" } @@ -8391,42 +8401,44 @@ "dev": true }, "tar-fs": { - "version": "1.16.3", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-1.16.3.tgz", - "integrity": "sha512-NvCeXpYx7OsmOh8zIOP/ebG55zZmxLE0etfWRbWok+q2Qo8x/vOR/IJT1taADXPe+jsiu9axDb3X4B+iIgNlKw==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", + "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==", "dev": true, + "optional": true, "requires": { - "chownr": "^1.0.1", - "mkdirp": "^0.5.1", - "pump": "^1.0.0", - "tar-stream": "^1.1.2" - }, - "dependencies": { - "pump": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/pump/-/pump-1.0.3.tgz", - "integrity": "sha512-8k0JupWme55+9tCVE+FS5ULT3K6AbgqrGa58lTT49RpyfwwcGedHqaC5LlQNdEAumn/wFsu6aPwkuPMioy8kqw==", - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - } + "chownr": "^1.1.1", + "mkdirp-classic": "^0.5.2", + "pump": "^3.0.0", + "tar-stream": "^2.1.4" } }, "tar-stream": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.6.2.tgz", - "integrity": "sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", + "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", "dev": true, + "optional": true, "requires": { - "bl": "^1.0.0", - "buffer-alloc": "^1.2.0", - "end-of-stream": "^1.0.0", + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", "fs-constants": "^1.0.0", - "readable-stream": "^2.3.0", - "to-buffer": "^1.1.1", - "xtend": "^4.0.0" + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "optional": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } } }, "targz": { @@ -8436,6 +8448,55 @@ "dev": true, "requires": { "tar-fs": "^1.8.1" + }, + "dependencies": { + "bl": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.3.tgz", + "integrity": "sha512-pvcNpa0UU69UT341rO6AYy4FVAIkUHuZXRIWbq+zHnsVcRzDDjIAhGuuYoi0d//cwIwtt4pkpKycWEfjdV+vww==", + "dev": true, + "requires": { + "readable-stream": "^2.3.5", + "safe-buffer": "^5.1.1" + } + }, + "pump": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/pump/-/pump-1.0.3.tgz", + "integrity": "sha512-8k0JupWme55+9tCVE+FS5ULT3K6AbgqrGa58lTT49RpyfwwcGedHqaC5LlQNdEAumn/wFsu6aPwkuPMioy8kqw==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "tar-fs": { + "version": "1.16.3", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-1.16.3.tgz", + "integrity": "sha512-NvCeXpYx7OsmOh8zIOP/ebG55zZmxLE0etfWRbWok+q2Qo8x/vOR/IJT1taADXPe+jsiu9axDb3X4B+iIgNlKw==", + "dev": true, + "requires": { + "chownr": "^1.0.1", + "mkdirp": "^0.5.1", + "pump": "^1.0.0", + "tar-stream": "^1.1.2" + } + }, + "tar-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.6.2.tgz", + "integrity": "sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A==", + "dev": true, + "requires": { + "bl": "^1.0.0", + "buffer-alloc": "^1.2.0", + "end-of-stream": "^1.0.0", + "fs-constants": "^1.0.0", + "readable-stream": "^2.3.0", + "to-buffer": "^1.1.1", + "xtend": "^4.0.0" + } + } } }, "tas-client": { @@ -8447,9 +8508,9 @@ } }, "terser": { - "version": "5.16.8", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.16.8.tgz", - "integrity": "sha512-QI5g1E/ef7d+PsDifb+a6nnVgC4F22Bg6T0xrBrz6iloVB4PUkkunp6V8nzoOOZJIzjWVdAGqCdlKlhLq/TbIA==", + "version": "5.17.6", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.17.6.tgz", + "integrity": "sha512-V8QHcs8YuyLkLHsJO5ucyff1ykrLVsR4dNnS//L5Y3NiSXpbK1J+WMVUs67eI0KTxs9JtHhgEQpXQVHlHI92DQ==", "dev": true, "requires": { "@jridgewell/source-map": "^0.3.2", @@ -8459,16 +8520,16 @@ } }, "terser-webpack-plugin": { - "version": "5.3.7", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.7.tgz", - "integrity": "sha512-AfKwIktyP7Cu50xNjXF/6Qb5lBNzYaWpU6YfoX3uZicTx0zTy0stDDCsvjDapKsSDvOeWo5MEq4TmdBy2cNoHw==", + "version": "5.3.9", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.9.tgz", + "integrity": "sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA==", "dev": true, "requires": { "@jridgewell/trace-mapping": "^0.3.17", "jest-worker": "^27.4.5", "schema-utils": "^3.1.1", "serialize-javascript": "^6.0.1", - "terser": "^5.16.5" + "terser": "^5.16.8" }, "dependencies": { "ajv": { @@ -8497,9 +8558,9 @@ "dev": true }, "schema-utils": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", - "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.2.tgz", + "integrity": "sha512-pvjEHOgWc9OWA/f/DE3ohBWTD6EleVLf7iFUkoSwAxttdBhB9QUebQgxER2kWueOvRJXPHNnyrvvh9eZINB8Eg==", "dev": true, "requires": { "@types/json-schema": "^7.0.8", @@ -8548,16 +8609,16 @@ } }, "ts-essentials": { - "version": "9.3.1", - "resolved": "https://registry.npmjs.org/ts-essentials/-/ts-essentials-9.3.1.tgz", - "integrity": "sha512-9CChSvQMyVRo29Vb1A2jbs+LKo3d/bAf+ndSaX0T8cEiy/HChVaRN/HY5DqUryZ8hZ6uol9bEgCnGmnDbwBR9Q==", + "version": "9.3.2", + "resolved": "https://registry.npmjs.org/ts-essentials/-/ts-essentials-9.3.2.tgz", + "integrity": "sha512-JxKJzuWqH1MmH4ZFHtJzGEhkfN3QvVR3C3w+4BIoWeoY68UVVoA2Np/Bca9z0IPSErVCWhv439aT0We4Dks8kQ==", "dev": true, "requires": {} }, "ts-loader": { - "version": "9.4.2", - "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.4.2.tgz", - "integrity": "sha512-OmlC4WVmFv5I0PpaxYb+qGeGOdm5giHU7HwDDUjw59emP2UYMHy9fFSDcYgSNoH8sXcj4hGCSEhlDZ9ULeDraA==", + "version": "9.4.3", + "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.4.3.tgz", + "integrity": "sha512-n3hBnm6ozJYzwiwt5YRiJZkzktftRpMiBApHaJPoWLA+qetQBAXkHqCLM6nwSdRDimqVtA5ocIkcTRLMTt7yzA==", "dev": true, "requires": { "chalk": "^4.1.0", @@ -8770,9 +8831,9 @@ } }, "update-browserslist-db": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz", - "integrity": "sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==", + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz", + "integrity": "sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==", "dev": true, "requires": { "escalade": "^3.1.1", @@ -8821,9 +8882,9 @@ } }, "vscode-extension-tester": { - "version": "5.5.2", - "resolved": "https://registry.npmjs.org/vscode-extension-tester/-/vscode-extension-tester-5.5.2.tgz", - "integrity": "sha512-+vRgJ7vdH5vsoF1kD4T7c0urxp5KETXuSeNvJcvsT+hBlWABdBjPHvyydtK7SQmcPKB4DtmsZVH2s2UX1+4GiA==", + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/vscode-extension-tester/-/vscode-extension-tester-5.6.0.tgz", + "integrity": "sha512-HOhjeV4tY8kb1ieBjC+ThWSZfhcpxgpSDpZa0d+G6vsA5xOwRsNQQFk26SKlv+IkSD5kSzrxh665+xSMGECsdQ==", "dev": true, "requires": { "@types/selenium-webdriver": "^4.1.12", @@ -8835,12 +8896,12 @@ "got": "^11.8.6", "hpagent": "^1.2.0", "js-yaml": "^4.1.0", - "monaco-page-objects": "^3.5.1", + "monaco-page-objects": "^3.6.0", "sanitize-filename": "^1.6.3", "selenium-webdriver": "^4.8.1", "targz": "^1.0.1", "unzip-stream": "^0.3.1", - "vscode-extension-tester-locators": "^3.4.1" + "vscode-extension-tester-locators": "^3.4.2" }, "dependencies": { "commander": { @@ -8876,9 +8937,9 @@ } }, "vscode-extension-tester-locators": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/vscode-extension-tester-locators/-/vscode-extension-tester-locators-3.4.1.tgz", - "integrity": "sha512-RgkEsj4VKCe3Ft+agMtgMIEq93m+W8Bwlb3jrTKE8+mr/HSrzJL+p09jIz0HVdC9SCbChWaxMDyRli696Ex/5A==", + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/vscode-extension-tester-locators/-/vscode-extension-tester-locators-3.4.2.tgz", + "integrity": "sha512-ytJkUTDJ9Wj7pJgg3ocHXkTAQO90XY3YzqSFZkB6t96H0osAvjP26MYqB6QMNG9AA6w34hLJRPBscadi35f4LA==", "dev": true, "requires": {} }, @@ -8901,22 +8962,22 @@ } }, "webpack": { - "version": "5.76.3", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.76.3.tgz", - "integrity": "sha512-18Qv7uGPU8b2vqGeEEObnfICyw2g39CHlDEK4I7NK13LOur1d0HGmGNKGT58Eluwddpn3oEejwvBPoP4M7/KSA==", + "version": "5.85.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.85.0.tgz", + "integrity": "sha512-7gazTiYqwo5OSqwH1tigLDL2r3qDeP2dOKYgd+LlXpsUMqDTklg6tOghexqky0/+6QY38kb/R/uRPUleuL43zg==", "dev": true, "requires": { "@types/eslint-scope": "^3.7.3", - "@types/estree": "^0.0.51", - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/wasm-edit": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1", + "@types/estree": "^1.0.0", + "@webassemblyjs/ast": "^1.11.5", + "@webassemblyjs/wasm-edit": "^1.11.5", + "@webassemblyjs/wasm-parser": "^1.11.5", "acorn": "^8.7.1", - "acorn-import-assertions": "^1.7.6", + "acorn-import-assertions": "^1.9.0", "browserslist": "^4.14.5", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.10.0", - "es-module-lexer": "^0.9.0", + "enhanced-resolve": "^5.14.1", + "es-module-lexer": "^1.2.1", "eslint-scope": "5.1.1", "events": "^3.2.0", "glob-to-regexp": "^0.4.1", @@ -8925,9 +8986,9 @@ "loader-runner": "^4.2.0", "mime-types": "^2.1.27", "neo-async": "^2.6.2", - "schema-utils": "^3.1.0", + "schema-utils": "^3.1.2", "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.1.3", + "terser-webpack-plugin": "^5.3.7", "watchpack": "^2.4.0", "webpack-sources": "^3.2.3" }, @@ -8958,9 +9019,9 @@ "dev": true }, "schema-utils": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", - "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.2.tgz", + "integrity": "sha512-pvjEHOgWc9OWA/f/DE3ohBWTD6EleVLf7iFUkoSwAxttdBhB9QUebQgxER2kWueOvRJXPHNnyrvvh9eZINB8Eg==", "dev": true, "requires": { "@types/json-schema": "^7.0.8", @@ -9031,9 +9092,9 @@ } }, "webpack-merge": { - "version": "5.8.0", - "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.8.0.tgz", - "integrity": "sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q==", + "version": "5.9.0", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.9.0.tgz", + "integrity": "sha512-6NbRQw4+Sy50vYNTw7EyOn41OZItPiXB8GNv3INSoe3PSFaHJEz3SHTrYVaRm2LilNGnFUzh0FAwqPEmU/CwDg==", "dev": true, "requires": { "clone-deep": "^4.0.1", @@ -9056,9 +9117,9 @@ } }, "wildcard": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.0.tgz", - "integrity": "sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz", + "integrity": "sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==", "dev": true }, "workerpool": { From 35ba49e56dbe8ef54c2bbfb86727bed9fc7d7ce8 Mon Sep 17 00:00:00 2001 From: Sheng Chen Date: Fri, 21 Jul 2023 15:08:59 +0800 Subject: [PATCH 171/352] build: Update dependencies to fix CI (#779) Signed-off-by: Sheng Chen --- .../com.microsoft.jdtls.ext.tp.target | 6 +- package-lock.json | 1470 ++++++++--------- test/maven-suite/projectView.test.ts | 82 +- 3 files changed, 766 insertions(+), 792 deletions(-) diff --git a/jdtls.ext/com.microsoft.jdtls.ext.target/com.microsoft.jdtls.ext.tp.target b/jdtls.ext/com.microsoft.jdtls.ext.target/com.microsoft.jdtls.ext.tp.target index ad9d88b6..fe9ad64a 100644 --- a/jdtls.ext/com.microsoft.jdtls.ext.target/com.microsoft.jdtls.ext.tp.target +++ b/jdtls.ext/com.microsoft.jdtls.ext.target/com.microsoft.jdtls.ext.tp.target @@ -14,18 +14,18 @@ - + - + - + diff --git a/package-lock.json b/package-lock.json index f68051e1..515dd5ac 100644 --- a/package-lock.json +++ b/package-lock.json @@ -43,33 +43,33 @@ } }, "node_modules/@babel/code-frame": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.21.4.tgz", - "integrity": "sha512-LYvhNKfwWSPpocw8GI7gpK2nq3HSDuEPC/uSYaALSJu9xjsalaaYFOq0Pwt5KmVqwEbZlDu81aLXwBOmD/Fv9g==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.5.tgz", + "integrity": "sha512-Xmwn266vad+6DAqEB2A6V/CcZVp62BbwVmcOJc2RPuwih1kw02TjQvWVWlcKGbBPd+8/0V5DEkOcizRGYsspYQ==", "dev": true, "dependencies": { - "@babel/highlight": "^7.18.6" + "@babel/highlight": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.19.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", - "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz", + "integrity": "sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/highlight": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", - "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.5.tgz", + "integrity": "sha512-BSKlD1hgnedS5XRnGOljZawtag7H1yPfQp0tdNJCHoH6AZ+Pcm9VvkrK59/Yy593Ypg0zMxH2BxD1VPYUQ7UIw==", "dev": true, "dependencies": { - "@babel/helper-validator-identifier": "^7.18.6", + "@babel/helper-validator-identifier": "^7.22.5", "chalk": "^2.0.0", "js-tokens": "^4.0.0" }, @@ -190,9 +190,9 @@ } }, "node_modules/@jridgewell/source-map": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.3.tgz", - "integrity": "sha512-b+fsZXeLYi9fEULmfBrhxn4IrPlINf8fiNarzTof004v3lFdntdwa9PF7vFJqm3mg7s+ScJMxXaE3Acp1irZcg==", + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.5.tgz", + "integrity": "sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==", "dev": true, "dependencies": { "@jridgewell/gen-mapping": "^0.3.0", @@ -290,27 +290,27 @@ } }, "node_modules/@sindresorhus/is": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", - "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==", + "version": "5.5.2", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-5.5.2.tgz", + "integrity": "sha512-8ZMK+V6YpeZFfW6hU9uAeWVuq8v3t7BaG276gIO+kVqnAcLrHCXdFUOf7kgouyfAarkZtuavIqY3RsXTsTWviw==", "dev": true, "engines": { - "node": ">=10" + "node": ">=14.16" }, "funding": { "url": "https://github.com/sindresorhus/is?sponsor=1" } }, "node_modules/@szmarczak/http-timer": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.6.tgz", - "integrity": "sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-5.0.1.tgz", + "integrity": "sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==", "dev": true, "dependencies": { - "defer-to-connect": "^2.0.0" + "defer-to-connect": "^2.0.1" }, "engines": { - "node": ">=10" + "node": ">=14.16" } }, "node_modules/@tootallnate/once": { @@ -322,22 +322,10 @@ "node": ">= 6" } }, - "node_modules/@types/cacheable-request": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.3.tgz", - "integrity": "sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==", - "dev": true, - "dependencies": { - "@types/http-cache-semantics": "*", - "@types/keyv": "^3.1.4", - "@types/node": "*", - "@types/responselike": "^1.0.0" - } - }, "node_modules/@types/eslint": { - "version": "8.40.0", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.40.0.tgz", - "integrity": "sha512-nbq2mvc/tBrK9zQQuItvjJl++GTN5j06DaPtp3hZCpngmG6Q3xoyEmd0TwZI0gAy/G1X0zhGBbr2imsGFdFV0g==", + "version": "8.44.0", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.44.0.tgz", + "integrity": "sha512-gsF+c/0XOguWgaOgvFs+xnnRqt9GwgTvIks36WpE6ueeI4KCEHHd8K/CKHqhOqrJKsYH8m27kRzQEvWXAwXUTw==", "dev": true, "dependencies": { "@types/estree": "*", @@ -391,15 +379,6 @@ "integrity": "sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==", "dev": true }, - "node_modules/@types/keyv": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.4.tgz", - "integrity": "sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, "node_modules/@types/lodash": { "version": "4.14.195", "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.195.tgz", @@ -419,20 +398,11 @@ "dev": true }, "node_modules/@types/node": { - "version": "16.18.34", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.34.tgz", - "integrity": "sha512-VmVm7gXwhkUimRfBwVI1CHhwp86jDWR04B5FGebMMyxV90SlCmFujwUHrxTD4oO+SOYU86SoxvhgeRQJY7iXFg==", + "version": "16.18.38", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.38.tgz", + "integrity": "sha512-6sfo1qTulpVbkxECP+AVrHV9OoJqhzCsfTNp5NIG+enM4HyM3HvZCO798WShIXBN0+QtDIcutJCjsVYnQP5rIQ==", "dev": true }, - "node_modules/@types/responselike": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.0.tgz", - "integrity": "sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, "node_modules/@types/selenium-webdriver": { "version": "4.1.15", "resolved": "https://registry.npmjs.org/@types/selenium-webdriver/-/selenium-webdriver-4.1.15.tgz", @@ -455,9 +425,9 @@ "dev": true }, "node_modules/@types/ws": { - "version": "8.5.4", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.4.tgz", - "integrity": "sha512-zdQDHKUgcX/zBc4GrwsE/7dVdAD8JR4EuiAXiiUhhfyIJXXb2+PrGshFyeXWQPMmmZ2XxgaqclgpIC7eTXc1mg==", + "version": "8.5.5", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.5.tgz", + "integrity": "sha512-lwhs8hktwxSjf9UaZ9tG5M03PGogvFaH8gUgLNbN9HKIg0dvv6q+gkSuJ8HN4/VbyxkuLzCjlN7GquQ0gUJfIg==", "dev": true, "dependencies": { "@types/node": "*" @@ -482,9 +452,9 @@ } }, "node_modules/@vscode/test-electron": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/@vscode/test-electron/-/test-electron-2.3.2.tgz", - "integrity": "sha512-CRfQIs5Wi5Ok5SUCC3PTvRRXa74LD43cSXHC8EuNlmHHEPaJa/AGrv76brcA1hVSxrdja9tiYwp95Lq8kwY0tw==", + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/@vscode/test-electron/-/test-electron-2.3.3.tgz", + "integrity": "sha512-hgXCkDP0ibboF1K6seqQYyHAzCURgTwHS/6QU7slhwznDLwsRwg9bhfw1CZdyUEw8vvCmlrKWnd7BlQnI0BC4w==", "dev": true, "dependencies": { "http-proxy-agent": "^4.0.1", @@ -624,9 +594,9 @@ } }, "node_modules/@vscode/vsce/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", "dev": true, "bin": { "semver": "bin/semver" @@ -839,9 +809,9 @@ "dev": true }, "node_modules/acorn": { - "version": "8.8.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", - "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==", + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", + "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", "dev": true, "bin": { "acorn": "bin/acorn" @@ -1037,6 +1007,15 @@ ], "optional": true }, + "node_modules/big-integer": { + "version": "1.6.51", + "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.51.tgz", + "integrity": "sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg==", + "dev": true, + "engines": { + "node": ">=0.6" + } + }, "node_modules/binary": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/binary/-/binary-0.3.0.tgz", @@ -1086,6 +1065,12 @@ "node": ">= 6" } }, + "node_modules/bluebird": { + "version": "3.4.7", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.4.7.tgz", + "integrity": "sha512-iD3898SR7sWVRHbiQv+sHUtHnMvC1o3nW5rAcqnq3uOn07DSAppZYUkIGslDz6gXC7HfunPe7YVBgoEJASPcHA==", + "dev": true + }, "node_modules/boolbase": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", @@ -1118,9 +1103,9 @@ "dev": true }, "node_modules/browserslist": { - "version": "4.21.7", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.7.tgz", - "integrity": "sha512-BauCXrQ7I2ftSqd2mvKHGo85XR0u7Ru3C/Hxsy/0TkfCtjrmAbPdzLGasmoiBxplpDXlPvdjX9u7srIMfgasNA==", + "version": "4.21.9", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.9.tgz", + "integrity": "sha512-M0MFoZzbUrRU4KNfCrDLnvyE7gub+peetoTid3TBIqtunaDJyXlwhakT+/VkvSXcfIzFfK/nkCs4nmyTmxdNSg==", "dev": true, "funding": [ { @@ -1137,8 +1122,8 @@ } ], "dependencies": { - "caniuse-lite": "^1.0.30001489", - "electron-to-chromium": "^1.4.411", + "caniuse-lite": "^1.0.30001503", + "electron-to-chromium": "^1.4.431", "node-releases": "^2.0.12", "update-browserslist-db": "^1.0.11" }, @@ -1211,6 +1196,15 @@ "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", "dev": true }, + "node_modules/buffer-indexof-polyfill": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/buffer-indexof-polyfill/-/buffer-indexof-polyfill-1.0.2.tgz", + "integrity": "sha512-I7wzHwA3t1/lwXQh+A5PbNvJxgfo5r3xulgpYDB5zckTu/Z9oUK9biouBKQUjEqzaz3HnAT6TYoovmE+GqSf7A==", + "dev": true, + "engines": { + "node": ">=0.10" + } + }, "node_modules/buffers": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/buffers/-/buffers-0.1.1.tgz", @@ -1230,30 +1224,30 @@ } }, "node_modules/cacheable-lookup": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz", - "integrity": "sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-7.0.0.tgz", + "integrity": "sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w==", "dev": true, "engines": { - "node": ">=10.6.0" + "node": ">=14.16" } }, "node_modules/cacheable-request": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.2.tgz", - "integrity": "sha512-pouW8/FmiPQbuGpkXQ9BAPv/Mo5xDGANgSNXzTzJ8DrKGuXOssM4wIQRjfanNRh3Yu5cfYPvcorqbhg2KIJtew==", + "version": "10.2.12", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-10.2.12.tgz", + "integrity": "sha512-qtWGB5kn2OLjx47pYUkWicyOpK1vy9XZhq8yRTXOy+KAmjjESSRLx6SiExnnaGGUP1NM6/vmygMu0fGylNh9tw==", "dev": true, "dependencies": { - "clone-response": "^1.0.2", - "get-stream": "^5.1.0", - "http-cache-semantics": "^4.0.0", - "keyv": "^4.0.0", - "lowercase-keys": "^2.0.0", - "normalize-url": "^6.0.1", - "responselike": "^2.0.0" + "@types/http-cache-semantics": "^4.0.1", + "get-stream": "^6.0.1", + "http-cache-semantics": "^4.1.1", + "keyv": "^4.5.2", + "mimic-response": "^4.0.0", + "normalize-url": "^8.0.0", + "responselike": "^3.0.0" }, "engines": { - "node": ">=8" + "node": ">=14.16" } }, "node_modules/call-bind": { @@ -1282,9 +1276,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001492", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001492.tgz", - "integrity": "sha512-2efF8SAZwgAX1FJr87KWhvuJxnGJKOnctQa8xLOskAXNXq8oiuqgl6u1kk3fFpsp3GgvzlRjiK1sl63hNtFADw==", + "version": "1.0.30001517", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001517.tgz", + "integrity": "sha512-Vdhm5S11DaFVLlyiKu4hiUTkpZu+y1KA/rZZqVQfOD5YdDT/eQKlkt7NaE0WGOFgX32diqt9MiP9CAiFeRklaA==", "dev": true, "funding": [ { @@ -1434,17 +1428,20 @@ } }, "node_modules/clipboardy": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/clipboardy/-/clipboardy-2.3.0.tgz", - "integrity": "sha512-mKhiIL2DrQIsuXMgBgnfEHOZOryC7kY7YO//TN6c63wlEm3NG5tz+YgY5rVi29KCmq/QQjKYvM7a19+MDOTHOQ==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/clipboardy/-/clipboardy-3.0.0.tgz", + "integrity": "sha512-Su+uU5sr1jkUy1sGRpLKjKrvEOVXgSgiSInwa/qeID6aJ07yh+5NWc3h2QfjHjBnfX4LhtFcuAWKUsJ3r+fjbg==", "dev": true, "dependencies": { - "arch": "^2.1.1", - "execa": "^1.0.0", - "is-wsl": "^2.1.1" + "arch": "^2.2.0", + "execa": "^5.1.1", + "is-wsl": "^2.2.0" }, "engines": { - "node": ">=8" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/cliui": { @@ -1472,18 +1469,6 @@ "node": ">=6" } }, - "node_modules/clone-response": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.3.tgz", - "integrity": "sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==", - "dev": true, - "dependencies": { - "mimic-response": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -1557,40 +1542,17 @@ "dev": true }, "node_modules/cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", "dev": true, "dependencies": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" }, "engines": { - "node": ">=4.8" - } - }, - "node_modules/cross-spawn/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true, - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/cross-spawn/node_modules/which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "which": "bin/which" + "node": ">= 8" } }, "node_modules/css-select": { @@ -1697,9 +1659,9 @@ } }, "node_modules/detect-libc": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.1.tgz", - "integrity": "sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.2.tgz", + "integrity": "sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw==", "dev": true, "optional": true, "engines": { @@ -1781,10 +1743,19 @@ "url": "https://github.com/fb55/domutils?sponsor=1" } }, + "node_modules/duplexer2": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", + "integrity": "sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==", + "dev": true, + "dependencies": { + "readable-stream": "^2.0.2" + } + }, "node_modules/electron-to-chromium": { - "version": "1.4.416", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.416.tgz", - "integrity": "sha512-AUYh0XDTb2vrj0rj82jb3P9hHSyzQNdTPYWZIhPdCOui7/vpme7+HTE07BE5jwuqg/34TZ8ktlRz6GImJ4IXjA==", + "version": "1.4.467", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.467.tgz", + "integrity": "sha512-2qI70O+rR4poYeF2grcuS/bCps5KJh6y1jtZMDDEteyKJQrzLOEhFyXCLcHW6DTBjKjWkk26JhWoAi+Ux9A0fg==", "dev": true }, "node_modules/emoji-regex": { @@ -1803,9 +1774,9 @@ } }, "node_modules/enhanced-resolve": { - "version": "5.14.1", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.14.1.tgz", - "integrity": "sha512-Vklwq2vDKtl0y/vtwjSesgJ5MYS7Etuk5txS8VdKL4AOS1aUlD96zqIfsOSLQsdv3xgMRbtkWM8eG9XDfKUPow==", + "version": "5.15.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz", + "integrity": "sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==", "dev": true, "dependencies": { "graceful-fs": "^4.2.4", @@ -1828,9 +1799,9 @@ } }, "node_modules/envinfo": { - "version": "7.8.1", - "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.8.1.tgz", - "integrity": "sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw==", + "version": "7.10.0", + "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.10.0.tgz", + "integrity": "sha512-ZtUjZO6l5mwTHvc1L9+1q5p/R3wTopcfqMW8r5t8SJSKqeVI/LtajORwRFEKpEFuekjD0VBjwu1HMxL4UalIRw==", "dev": true, "bin": { "envinfo": "dist/cli.js" @@ -1840,9 +1811,9 @@ } }, "node_modules/es-module-lexer": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.2.1.tgz", - "integrity": "sha512-9978wrXM50Y4rTMmW5kXIC09ZdXQZqkE4mxhwkd8VbzsGkXGPgV4zWuqQJgCEzYngdo2dYDa0l8xhX4fkSwJSg==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.3.0.tgz", + "integrity": "sha512-vZK7T0N2CBmBOixhmjdqx2gWVbFZ4DXZ/NyRMZVlJXPa7CyFS+/a4QQsDGDQy9ZfEzxFuNEsMLeQJnKP2p5/JA==", "dev": true }, "node_modules/escalade": { @@ -1932,33 +1903,26 @@ } }, "node_modules/execa": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", - "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", "dev": true, "dependencies": { - "cross-spawn": "^6.0.0", - "get-stream": "^4.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" }, "engines": { - "node": ">=6" - } - }, - "node_modules/execa/node_modules/get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", - "dev": true, - "dependencies": { - "pump": "^3.0.0" + "node": ">=10" }, - "engines": { - "node": ">=6" + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" } }, "node_modules/expand-template": { @@ -1978,9 +1942,9 @@ "dev": true }, "node_modules/fast-glob": { - "version": "3.2.12", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", - "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.0.tgz", + "integrity": "sha512-ChDuvbOypPuNjO8yIDf36x7BlZX1smcUMTTcyoIjycexOxd6DFsKsg21qVBzEmr3G7fUKIRy2/psii+CIUt7FA==", "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", @@ -2090,6 +2054,15 @@ } } }, + "node_modules/form-data-encoder": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-2.1.4.tgz", + "integrity": "sha512-yDYSgNMraqvnxiEXO4hi88+YZxaHC6QKzb5N84iRCTDeRO7ZALpir/lVmf/uXUhnwUr2O4HU8s/n6x+yNjQkHw==", + "dev": true, + "engines": { + "node": ">= 14.17" + } + }, "node_modules/fs-constants": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", @@ -2129,6 +2102,33 @@ "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } }, + "node_modules/fstream": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.12.tgz", + "integrity": "sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "inherits": "~2.0.0", + "mkdirp": ">=0.5 0", + "rimraf": "2" + }, + "engines": { + "node": ">=0.6" + } + }, + "node_modules/fstream/node_modules/rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, "node_modules/function-bind": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", @@ -2160,15 +2160,12 @@ } }, "node_modules/get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", "dev": true, - "dependencies": { - "pump": "^3.0.0" - }, "engines": { - "node": ">=8" + "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -2242,13 +2239,13 @@ } }, "node_modules/globby": { - "version": "13.1.4", - "resolved": "https://registry.npmjs.org/globby/-/globby-13.1.4.tgz", - "integrity": "sha512-iui/IiiW+QrJ1X1hKH5qwlMQyv34wJAYwH1vrf8b9kBA4sNiif3gKsMHa+BrdnOpEudWjpotfa7LrTzB1ERS/g==", + "version": "13.2.2", + "resolved": "https://registry.npmjs.org/globby/-/globby-13.2.2.tgz", + "integrity": "sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==", "dependencies": { "dir-glob": "^3.0.1", - "fast-glob": "^3.2.11", - "ignore": "^5.2.0", + "fast-glob": "^3.3.0", + "ignore": "^5.2.4", "merge2": "^1.4.1", "slash": "^4.0.0" }, @@ -2260,25 +2257,25 @@ } }, "node_modules/got": { - "version": "11.8.6", - "resolved": "https://registry.npmjs.org/got/-/got-11.8.6.tgz", - "integrity": "sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==", + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/got/-/got-13.0.0.tgz", + "integrity": "sha512-XfBk1CxOOScDcMr9O1yKkNaQyy865NbYs+F7dr4H0LZMVgCj2Le59k6PqbNHoL5ToeaEQUYh6c6yMfVcc6SJxA==", "dev": true, "dependencies": { - "@sindresorhus/is": "^4.0.0", - "@szmarczak/http-timer": "^4.0.5", - "@types/cacheable-request": "^6.0.1", - "@types/responselike": "^1.0.0", - "cacheable-lookup": "^5.0.3", - "cacheable-request": "^7.0.2", + "@sindresorhus/is": "^5.2.0", + "@szmarczak/http-timer": "^5.0.1", + "cacheable-lookup": "^7.0.0", + "cacheable-request": "^10.2.8", "decompress-response": "^6.0.0", - "http2-wrapper": "^1.0.0-beta.5.2", - "lowercase-keys": "^2.0.0", - "p-cancelable": "^2.0.0", - "responselike": "^2.0.0" + "form-data-encoder": "^2.1.2", + "get-stream": "^6.0.1", + "http2-wrapper": "^2.1.10", + "lowercase-keys": "^3.0.0", + "p-cancelable": "^3.0.0", + "responselike": "^3.0.0" }, "engines": { - "node": ">=10.19.0" + "node": ">=16" }, "funding": { "url": "https://github.com/sindresorhus/got?sponsor=1" @@ -2413,13 +2410,13 @@ } }, "node_modules/http2-wrapper": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-1.0.3.tgz", - "integrity": "sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-2.2.0.tgz", + "integrity": "sha512-kZB0wxMo0sh1PehyjJUWRFEd99KC5TLjZ2cULC4f9iqJBAmKQQXEICjxl5iPJRwP40dpeHFqqhm7tYCvODpqpQ==", "dev": true, "dependencies": { "quick-lru": "^5.1.1", - "resolve-alpn": "^1.0.0" + "resolve-alpn": "^1.2.0" }, "engines": { "node": ">=10.19.0" @@ -2438,6 +2435,15 @@ "node": ">= 6" } }, + "node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true, + "engines": { + "node": ">=10.17.0" + } + }, "node_modules/ieee754": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", @@ -2621,12 +2627,15 @@ } }, "node_modules/is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", "dev": true, "engines": { - "node": ">=0.10.0" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/is-unicode-supported": { @@ -2766,9 +2775,9 @@ } }, "node_modules/keyv": { - "version": "4.5.2", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.2.tgz", - "integrity": "sha512-5MHbFaKn8cNSmVW7BYnijeAVlE4cYA/SVkifVgrh7yotnfhKmjuXpDKjrABLnT0SfHWV21P8ow07OGfRrNDg8g==", + "version": "4.5.3", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.3.tgz", + "integrity": "sha512-QCiSav9WaX1PgETJ+SpNnx2PRRapJ/oRSXM4VO5OGYGSjrxbKPVFVhB3l2OCbLCk329N8qyAtsJjSjvVBWzEug==", "dev": true, "dependencies": { "json-buffer": "3.0.1" @@ -2810,6 +2819,12 @@ "uc.micro": "^1.0.1" } }, + "node_modules/listenercount": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/listenercount/-/listenercount-1.0.1.tgz", + "integrity": "sha512-3mk/Zag0+IJxeDrxSgaDPy4zZ3w05PRZeJNnlWhzFz5OkX49J4krc+A8X2d2M69vGMBEX0uyl8M+W+8gH+kBqQ==", + "dev": true + }, "node_modules/loader-runner": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", @@ -2856,12 +2871,15 @@ } }, "node_modules/lowercase-keys": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", - "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-3.0.0.tgz", + "integrity": "sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==", "dev": true, "engines": { - "node": ">=8" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/lru-cache": { @@ -2965,13 +2983,25 @@ "node": ">= 0.6" } }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, "node_modules/mimic-response": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", - "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-4.0.0.tgz", + "integrity": "sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg==", "dev": true, "engines": { - "node": ">=4" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/minimatch": { @@ -3149,16 +3179,16 @@ } }, "node_modules/monaco-page-objects": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/monaco-page-objects/-/monaco-page-objects-3.6.0.tgz", - "integrity": "sha512-hMhILl3pc73+FHdnQ1No9I4WqfQsbvTdwHeGL0oZC2rjSp6zn+MJpJqVLRyppJYvSWC0RXJENMgUKunzqrKBPg==", + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/monaco-page-objects/-/monaco-page-objects-3.8.0.tgz", + "integrity": "sha512-/bsrTHul7KsZ1SmdQFHIdVZTU2Nr+odGpxZAJddWxanX1uEAreqE4H758wI9Ie3mZLFO798lPjv2zaUAi+kDFw==", "dev": true, "dependencies": { - "clipboardy": "^2.3.0", + "clipboardy": "^3.0.0", "clone-deep": "^4.0.1", - "compare-versions": "^5.0.1", - "fs-extra": "^11.1.0", - "ts-essentials": "^9.3.1" + "compare-versions": "^5.0.3", + "fs-extra": "^11.1.1", + "ts-essentials": "^9.3.2" }, "peerDependencies": { "selenium-webdriver": "^4.6.1", @@ -3216,16 +3246,10 @@ "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", "dev": true }, - "node_modules/nice-try": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", - "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", - "dev": true - }, "node_modules/node-abi": { - "version": "3.43.0", - "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.43.0.tgz", - "integrity": "sha512-QB0MMv+tn9Ur2DtJrc8y09n0n6sw88CyDniWSX2cHW10goQXYPK9ZpFJOktDS4ron501edPX6h9i7Pg+RnH5nQ==", + "version": "3.45.0", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.45.0.tgz", + "integrity": "sha512-iwXuFrMAcFVi/ZoZiqq8BzAdsLw9kxDfTC0HMyjXfSL/6CSDAGD5UmR7azrAgWV1zKYq7dUUMj4owusBWKLsiQ==", "dev": true, "optional": true, "dependencies": { @@ -3243,9 +3267,9 @@ "optional": true }, "node_modules/node-releases": { - "version": "2.0.12", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.12.tgz", - "integrity": "sha512-QzsYKWhXTWx8h1kIvqfnC++o0pEmpRQA/aenALsL2F4pqNVr7YzcdMlDij5WBnwftRbJCNJL/O7zdKaxKPHqgQ==", + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz", + "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==", "dev": true }, "node_modules/normalize-path": { @@ -3258,27 +3282,27 @@ } }, "node_modules/normalize-url": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", - "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-8.0.0.tgz", + "integrity": "sha512-uVFpKhj5MheNBJRTiMZ9pE/7hD1QTeEvugSJW/OmLzAp78PB5O6adfMNTvmfKhXBkvCzC+rqifWcVYpGFwTjnw==", "dev": true, "engines": { - "node": ">=10" + "node": ">=14.16" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/npm-run-path": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", - "integrity": "sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", "dev": true, "dependencies": { - "path-key": "^2.0.0" + "path-key": "^3.0.0" }, "engines": { - "node": ">=4" + "node": ">=8" } }, "node_modules/nth-check": { @@ -3311,22 +3335,28 @@ "wrappy": "1" } }, - "node_modules/p-cancelable": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz", - "integrity": "sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==", + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", "dev": true, + "dependencies": { + "mimic-fn": "^2.1.0" + }, "engines": { - "node": ">=8" + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==", + "node_modules/p-cancelable": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-3.0.0.tgz", + "integrity": "sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==", "dev": true, "engines": { - "node": ">=4" + "node": ">=12.20" } }, "node_modules/p-limit": { @@ -3384,9 +3414,9 @@ } }, "node_modules/parse-semver/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", "dev": true, "bin": { "semver": "bin/semver" @@ -3436,12 +3466,12 @@ } }, "node_modules/path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", "dev": true, "engines": { - "node": ">=4" + "node": ">=8" } }, "node_modules/path-parse": { @@ -3583,6 +3613,7 @@ "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", "dev": true, + "optional": true, "dependencies": { "end-of-stream": "^1.1.0", "once": "^1.3.1" @@ -3792,12 +3823,15 @@ } }, "node_modules/responselike": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.1.tgz", - "integrity": "sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-3.0.0.tgz", + "integrity": "sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg==", "dev": true, "dependencies": { - "lowercase-keys": "^2.0.0" + "lowercase-keys": "^3.0.0" + }, + "engines": { + "node": ">=14.16" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -3871,9 +3905,9 @@ "dev": true }, "node_modules/schema-utils": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.1.tgz", - "integrity": "sha512-lELhBAAly9NowEsX0yZBlw9ahZG+sK/1RJ21EpzdYHKEs13Vku3LJ+MIPhh4sMs0oCCeufZQEQbMekiA4vuVIQ==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", + "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", "dev": true, "dependencies": { "@types/json-schema": "^7.0.9", @@ -3890,9 +3924,9 @@ } }, "node_modules/selenium-webdriver": { - "version": "4.9.2", - "resolved": "https://registry.npmjs.org/selenium-webdriver/-/selenium-webdriver-4.9.2.tgz", - "integrity": "sha512-0gDswAgVn6qbCYckZetQQvQK9tWW1r7LaumhiqY1/Wl/7JEWG0JANsTbZKnmGc3+cUU76zAi5/p0P8LUweXlig==", + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/selenium-webdriver/-/selenium-webdriver-4.10.0.tgz", + "integrity": "sha512-hSQPw6jgc+ej/UEcdQPG/iBwwMeCEgZr9HByY/J8ToyXztEqXzU9aLsIyrlj1BywBcStO4JQK/zMUWWrV8+riA==", "dev": true, "dependencies": { "jszip": "^3.10.1", @@ -3904,9 +3938,9 @@ } }, "node_modules/semver": { - "version": "7.5.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz", - "integrity": "sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dependencies": { "lru-cache": "^6.0.0" }, @@ -3945,24 +3979,24 @@ } }, "node_modules/shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "dev": true, "dependencies": { - "shebang-regex": "^1.0.0" + "shebang-regex": "^3.0.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, "node_modules/shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true, "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, "node_modules/side-channel": { @@ -4103,13 +4137,13 @@ "node": ">=8" } }, - "node_modules/strip-eof": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", - "integrity": "sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q==", + "node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", "dev": true, "engines": { - "node": ">=0.10.0" + "node": ">=6" } }, "node_modules/strip-json-comments": { @@ -4273,13 +4307,13 @@ } }, "node_modules/terser": { - "version": "5.17.6", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.17.6.tgz", - "integrity": "sha512-V8QHcs8YuyLkLHsJO5ucyff1ykrLVsR4dNnS//L5Y3NiSXpbK1J+WMVUs67eI0KTxs9JtHhgEQpXQVHlHI92DQ==", + "version": "5.19.1", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.19.1.tgz", + "integrity": "sha512-27hxBUVdV6GoNg1pKQ7Z5cbR6V9txPVyBA+FQw3BaZ1Wuzvztce5p156DaP0NVZNrMZZ+6iG9Syf7WgMNKDg2Q==", "dev": true, "dependencies": { - "@jridgewell/source-map": "^0.3.2", - "acorn": "^8.5.0", + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.8.2", "commander": "^2.20.0", "source-map-support": "~0.5.20" }, @@ -4356,9 +4390,9 @@ "dev": true }, "node_modules/terser-webpack-plugin/node_modules/schema-utils": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.2.tgz", - "integrity": "sha512-pvjEHOgWc9OWA/f/DE3ohBWTD6EleVLf7iFUkoSwAxttdBhB9QUebQgxER2kWueOvRJXPHNnyrvvh9eZINB8Eg==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", "dev": true, "dependencies": { "@types/json-schema": "^7.0.8", @@ -4430,9 +4464,9 @@ } }, "node_modules/ts-loader": { - "version": "9.4.3", - "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.4.3.tgz", - "integrity": "sha512-n3hBnm6ozJYzwiwt5YRiJZkzktftRpMiBApHaJPoWLA+qetQBAXkHqCLM6nwSdRDimqVtA5ocIkcTRLMTt7yzA==", + "version": "9.4.4", + "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.4.4.tgz", + "integrity": "sha512-MLukxDHBl8OJ5Dk3y69IsKVFRA/6MwzEqBgh+OXMPB/OD01KQuWPFd1WAQP8a5PeSCAxfnkhiuWqfmFJzJQt9w==", "dev": true, "dependencies": { "chalk": "^4.1.0", @@ -4597,9 +4631,9 @@ } }, "node_modules/tslint/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", "dev": true, "bin": { "semver": "bin/semver" @@ -4652,9 +4686,9 @@ } }, "node_modules/typed-rest-client": { - "version": "1.8.9", - "resolved": "https://registry.npmjs.org/typed-rest-client/-/typed-rest-client-1.8.9.tgz", - "integrity": "sha512-uSmjE38B80wjL85UFX3sTYEUlvZ1JgCRhsWj/fJ4rZ0FqDUFoIuodtiVeE+cUqiVTOKPdKrp/sdftD15MDek6g==", + "version": "1.8.11", + "resolved": "https://registry.npmjs.org/typed-rest-client/-/typed-rest-client-1.8.11.tgz", + "integrity": "sha512-5UvfMpd1oelmUPRbbaVnq+rHP7ng2cE4qoQkQeAqxRL6PklkxsM0g32/HL0yfvruK6ojQ5x8EE+HF4YV6DtuCA==", "dev": true, "dependencies": { "qs": "^6.9.1", @@ -4695,14 +4729,22 @@ "node": ">= 10.0.0" } }, - "node_modules/unzip-stream": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/unzip-stream/-/unzip-stream-0.3.1.tgz", - "integrity": "sha512-RzaGXLNt+CW+T41h1zl6pGz3EaeVhYlK+rdAap+7DxW5kqsqePO8kRtWPaCiVqdhZc86EctSPVYNix30YOMzmw==", + "node_modules/unzipper": { + "version": "0.10.14", + "resolved": "https://registry.npmjs.org/unzipper/-/unzipper-0.10.14.tgz", + "integrity": "sha512-ti4wZj+0bQTiX2KmKWuwj7lhV+2n//uXEotUmGuQqrbVZSEGFMbI68+c6JCQ8aAmUWYvtHEz2A8K6wXvueR/6g==", "dev": true, "dependencies": { - "binary": "^0.3.0", - "mkdirp": "^0.5.1" + "big-integer": "^1.6.17", + "binary": "~0.3.0", + "bluebird": "~3.4.1", + "buffer-indexof-polyfill": "~1.0.0", + "duplexer2": "~0.1.4", + "fstream": "^1.0.12", + "graceful-fs": "^4.2.2", + "listenercount": "~1.0.1", + "readable-stream": "~2.3.6", + "setimmediate": "~1.0.4" } }, "node_modules/update-browserslist-db": { @@ -4783,26 +4825,26 @@ } }, "node_modules/vscode-extension-tester": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/vscode-extension-tester/-/vscode-extension-tester-5.6.0.tgz", - "integrity": "sha512-HOhjeV4tY8kb1ieBjC+ThWSZfhcpxgpSDpZa0d+G6vsA5xOwRsNQQFk26SKlv+IkSD5kSzrxh665+xSMGECsdQ==", + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/vscode-extension-tester/-/vscode-extension-tester-5.8.0.tgz", + "integrity": "sha512-DMOSmxXnrREWqLXYYq+Au53n6/BAVbKbOPxAm7bmpuvMCyF6lKJk9olEsbbVMTugkIToLaafsh4LSq47bTgeHQ==", "dev": true, "dependencies": { "@types/selenium-webdriver": "^4.1.12", - "@vscode/vsce": "^2.18.0", - "commander": "^10.0.0", + "@vscode/vsce": "^2.19.0", + "commander": "^11.0.0", "compare-versions": "^5.0.1", "fs-extra": "^11.1.0", "glob": "^8.1.0", - "got": "^11.8.6", + "got": "^13.0.0", "hpagent": "^1.2.0", "js-yaml": "^4.1.0", - "monaco-page-objects": "^3.6.0", + "monaco-page-objects": "^3.8.0", "sanitize-filename": "^1.6.3", - "selenium-webdriver": "^4.8.1", + "selenium-webdriver": "^4.10.0", "targz": "^1.0.1", - "unzip-stream": "^0.3.1", - "vscode-extension-tester-locators": "^3.4.2" + "unzipper": "^0.10.14", + "vscode-extension-tester-locators": "^3.6.0" }, "bin": { "extest": "out/cli.js" @@ -4813,22 +4855,22 @@ } }, "node_modules/vscode-extension-tester-locators": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/vscode-extension-tester-locators/-/vscode-extension-tester-locators-3.4.2.tgz", - "integrity": "sha512-ytJkUTDJ9Wj7pJgg3ocHXkTAQO90XY3YzqSFZkB6t96H0osAvjP26MYqB6QMNG9AA6w34hLJRPBscadi35f4LA==", + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/vscode-extension-tester-locators/-/vscode-extension-tester-locators-3.6.0.tgz", + "integrity": "sha512-RjQf5XL33dJORl9ck5X0vhAHf93TOONPE4nb9nai/pDM15nYcD1TqMyzRGl/XxHpvBu/bP8MV/bHfCT6b8w2cQ==", "dev": true, "peerDependencies": { - "monaco-page-objects": "^3.6.0", + "monaco-page-objects": "^3.8.0", "selenium-webdriver": "^4.6.1" } }, "node_modules/vscode-extension-tester/node_modules/commander": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", - "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-11.0.0.tgz", + "integrity": "sha512-9HMlXtt/BNoYr8ooyjjNRdIilOTkVJXB+GhxMTtOKwk0R4j4lS4NpjuqmRxroBfnfTSHQIHQB7wryHhXarNjmQ==", "dev": true, "engines": { - "node": ">=14" + "node": ">=16" } }, "node_modules/vscode-extension-tester/node_modules/fs-extra": { @@ -4889,9 +4931,9 @@ } }, "node_modules/webpack": { - "version": "5.85.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.85.0.tgz", - "integrity": "sha512-7gazTiYqwo5OSqwH1tigLDL2r3qDeP2dOKYgd+LlXpsUMqDTklg6tOghexqky0/+6QY38kb/R/uRPUleuL43zg==", + "version": "5.88.2", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.88.2.tgz", + "integrity": "sha512-JmcgNZ1iKj+aiR0OvTYtWQqJwq37Pf683dY9bVORwVbUrDhLhdn/PlO2sHsFHPkj7sHNQF3JwaAkp49V+Sq1tQ==", "dev": true, "dependencies": { "@types/eslint-scope": "^3.7.3", @@ -4903,7 +4945,7 @@ "acorn-import-assertions": "^1.9.0", "browserslist": "^4.14.5", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.14.1", + "enhanced-resolve": "^5.15.0", "es-module-lexer": "^1.2.1", "eslint-scope": "5.1.1", "events": "^3.2.0", @@ -4913,7 +4955,7 @@ "loader-runner": "^4.2.0", "mime-types": "^2.1.27", "neo-async": "^2.6.2", - "schema-utils": "^3.1.2", + "schema-utils": "^3.2.0", "tapable": "^2.1.1", "terser-webpack-plugin": "^5.3.7", "watchpack": "^2.4.0", @@ -4991,50 +5033,6 @@ "node": ">= 10" } }, - "node_modules/webpack-cli/node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/webpack-cli/node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/webpack-cli/node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/webpack-cli/node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/webpack-merge": { "version": "5.9.0", "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.9.0.tgz", @@ -5089,9 +5087,9 @@ "dev": true }, "node_modules/webpack/node_modules/schema-utils": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.2.tgz", - "integrity": "sha512-pvjEHOgWc9OWA/f/DE3ohBWTD6EleVLf7iFUkoSwAxttdBhB9QUebQgxER2kWueOvRJXPHNnyrvvh9eZINB8Eg==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", "dev": true, "dependencies": { "@types/json-schema": "^7.0.8", @@ -5298,27 +5296,27 @@ }, "dependencies": { "@babel/code-frame": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.21.4.tgz", - "integrity": "sha512-LYvhNKfwWSPpocw8GI7gpK2nq3HSDuEPC/uSYaALSJu9xjsalaaYFOq0Pwt5KmVqwEbZlDu81aLXwBOmD/Fv9g==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.5.tgz", + "integrity": "sha512-Xmwn266vad+6DAqEB2A6V/CcZVp62BbwVmcOJc2RPuwih1kw02TjQvWVWlcKGbBPd+8/0V5DEkOcizRGYsspYQ==", "dev": true, "requires": { - "@babel/highlight": "^7.18.6" + "@babel/highlight": "^7.22.5" } }, "@babel/helper-validator-identifier": { - "version": "7.19.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", - "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz", + "integrity": "sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==", "dev": true }, "@babel/highlight": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", - "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.5.tgz", + "integrity": "sha512-BSKlD1hgnedS5XRnGOljZawtag7H1yPfQp0tdNJCHoH6AZ+Pcm9VvkrK59/Yy593Ypg0zMxH2BxD1VPYUQ7UIw==", "dev": true, "requires": { - "@babel/helper-validator-identifier": "^7.18.6", + "@babel/helper-validator-identifier": "^7.22.5", "chalk": "^2.0.0", "js-tokens": "^4.0.0" }, @@ -5411,9 +5409,9 @@ "dev": true }, "@jridgewell/source-map": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.3.tgz", - "integrity": "sha512-b+fsZXeLYi9fEULmfBrhxn4IrPlINf8fiNarzTof004v3lFdntdwa9PF7vFJqm3mg7s+ScJMxXaE3Acp1irZcg==", + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.5.tgz", + "integrity": "sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==", "dev": true, "requires": { "@jridgewell/gen-mapping": "^0.3.0", @@ -5499,18 +5497,18 @@ } }, "@sindresorhus/is": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", - "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==", + "version": "5.5.2", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-5.5.2.tgz", + "integrity": "sha512-8ZMK+V6YpeZFfW6hU9uAeWVuq8v3t7BaG276gIO+kVqnAcLrHCXdFUOf7kgouyfAarkZtuavIqY3RsXTsTWviw==", "dev": true }, "@szmarczak/http-timer": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.6.tgz", - "integrity": "sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-5.0.1.tgz", + "integrity": "sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==", "dev": true, "requires": { - "defer-to-connect": "^2.0.0" + "defer-to-connect": "^2.0.1" } }, "@tootallnate/once": { @@ -5519,22 +5517,10 @@ "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", "dev": true }, - "@types/cacheable-request": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.3.tgz", - "integrity": "sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==", - "dev": true, - "requires": { - "@types/http-cache-semantics": "*", - "@types/keyv": "^3.1.4", - "@types/node": "*", - "@types/responselike": "^1.0.0" - } - }, "@types/eslint": { - "version": "8.40.0", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.40.0.tgz", - "integrity": "sha512-nbq2mvc/tBrK9zQQuItvjJl++GTN5j06DaPtp3hZCpngmG6Q3xoyEmd0TwZI0gAy/G1X0zhGBbr2imsGFdFV0g==", + "version": "8.44.0", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.44.0.tgz", + "integrity": "sha512-gsF+c/0XOguWgaOgvFs+xnnRqt9GwgTvIks36WpE6ueeI4KCEHHd8K/CKHqhOqrJKsYH8m27kRzQEvWXAwXUTw==", "dev": true, "requires": { "@types/estree": "*", @@ -5588,15 +5574,6 @@ "integrity": "sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==", "dev": true }, - "@types/keyv": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.4.tgz", - "integrity": "sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, "@types/lodash": { "version": "4.14.195", "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.195.tgz", @@ -5616,20 +5593,11 @@ "dev": true }, "@types/node": { - "version": "16.18.34", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.34.tgz", - "integrity": "sha512-VmVm7gXwhkUimRfBwVI1CHhwp86jDWR04B5FGebMMyxV90SlCmFujwUHrxTD4oO+SOYU86SoxvhgeRQJY7iXFg==", + "version": "16.18.38", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.38.tgz", + "integrity": "sha512-6sfo1qTulpVbkxECP+AVrHV9OoJqhzCsfTNp5NIG+enM4HyM3HvZCO798WShIXBN0+QtDIcutJCjsVYnQP5rIQ==", "dev": true }, - "@types/responselike": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.0.tgz", - "integrity": "sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, "@types/selenium-webdriver": { "version": "4.1.15", "resolved": "https://registry.npmjs.org/@types/selenium-webdriver/-/selenium-webdriver-4.1.15.tgz", @@ -5652,9 +5620,9 @@ "dev": true }, "@types/ws": { - "version": "8.5.4", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.4.tgz", - "integrity": "sha512-zdQDHKUgcX/zBc4GrwsE/7dVdAD8JR4EuiAXiiUhhfyIJXXb2+PrGshFyeXWQPMmmZ2XxgaqclgpIC7eTXc1mg==", + "version": "8.5.5", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.5.tgz", + "integrity": "sha512-lwhs8hktwxSjf9UaZ9tG5M03PGogvFaH8gUgLNbN9HKIg0dvv6q+gkSuJ8HN4/VbyxkuLzCjlN7GquQ0gUJfIg==", "dev": true, "requires": { "@types/node": "*" @@ -5676,9 +5644,9 @@ } }, "@vscode/test-electron": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/@vscode/test-electron/-/test-electron-2.3.2.tgz", - "integrity": "sha512-CRfQIs5Wi5Ok5SUCC3PTvRRXa74LD43cSXHC8EuNlmHHEPaJa/AGrv76brcA1hVSxrdja9tiYwp95Lq8kwY0tw==", + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/@vscode/test-electron/-/test-electron-2.3.3.tgz", + "integrity": "sha512-hgXCkDP0ibboF1K6seqQYyHAzCURgTwHS/6QU7slhwznDLwsRwg9bhfw1CZdyUEw8vvCmlrKWnd7BlQnI0BC4w==", "dev": true, "requires": { "http-proxy-agent": "^4.0.1", @@ -5789,9 +5757,9 @@ } }, "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", "dev": true }, "supports-color": { @@ -5987,9 +5955,9 @@ "dev": true }, "acorn": { - "version": "8.8.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", - "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==", + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", + "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", "dev": true }, "acorn-import-assertions": { @@ -6116,6 +6084,12 @@ "dev": true, "optional": true }, + "big-integer": { + "version": "1.6.51", + "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.51.tgz", + "integrity": "sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg==", + "dev": true + }, "binary": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/binary/-/binary-0.3.0.tgz", @@ -6158,6 +6132,12 @@ } } }, + "bluebird": { + "version": "3.4.7", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.4.7.tgz", + "integrity": "sha512-iD3898SR7sWVRHbiQv+sHUtHnMvC1o3nW5rAcqnq3uOn07DSAppZYUkIGslDz6gXC7HfunPe7YVBgoEJASPcHA==", + "dev": true + }, "boolbase": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", @@ -6187,13 +6167,13 @@ "dev": true }, "browserslist": { - "version": "4.21.7", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.7.tgz", - "integrity": "sha512-BauCXrQ7I2ftSqd2mvKHGo85XR0u7Ru3C/Hxsy/0TkfCtjrmAbPdzLGasmoiBxplpDXlPvdjX9u7srIMfgasNA==", + "version": "4.21.9", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.9.tgz", + "integrity": "sha512-M0MFoZzbUrRU4KNfCrDLnvyE7gub+peetoTid3TBIqtunaDJyXlwhakT+/VkvSXcfIzFfK/nkCs4nmyTmxdNSg==", "dev": true, "requires": { - "caniuse-lite": "^1.0.30001489", - "electron-to-chromium": "^1.4.411", + "caniuse-lite": "^1.0.30001503", + "electron-to-chromium": "^1.4.431", "node-releases": "^2.0.12", "update-browserslist-db": "^1.0.11" } @@ -6243,6 +6223,12 @@ "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", "dev": true }, + "buffer-indexof-polyfill": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/buffer-indexof-polyfill/-/buffer-indexof-polyfill-1.0.2.tgz", + "integrity": "sha512-I7wzHwA3t1/lwXQh+A5PbNvJxgfo5r3xulgpYDB5zckTu/Z9oUK9biouBKQUjEqzaz3HnAT6TYoovmE+GqSf7A==", + "dev": true + }, "buffers": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/buffers/-/buffers-0.1.1.tgz", @@ -6256,24 +6242,24 @@ "dev": true }, "cacheable-lookup": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz", - "integrity": "sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-7.0.0.tgz", + "integrity": "sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w==", "dev": true }, "cacheable-request": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.2.tgz", - "integrity": "sha512-pouW8/FmiPQbuGpkXQ9BAPv/Mo5xDGANgSNXzTzJ8DrKGuXOssM4wIQRjfanNRh3Yu5cfYPvcorqbhg2KIJtew==", + "version": "10.2.12", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-10.2.12.tgz", + "integrity": "sha512-qtWGB5kn2OLjx47pYUkWicyOpK1vy9XZhq8yRTXOy+KAmjjESSRLx6SiExnnaGGUP1NM6/vmygMu0fGylNh9tw==", "dev": true, "requires": { - "clone-response": "^1.0.2", - "get-stream": "^5.1.0", - "http-cache-semantics": "^4.0.0", - "keyv": "^4.0.0", - "lowercase-keys": "^2.0.0", - "normalize-url": "^6.0.1", - "responselike": "^2.0.0" + "@types/http-cache-semantics": "^4.0.1", + "get-stream": "^6.0.1", + "http-cache-semantics": "^4.1.1", + "keyv": "^4.5.2", + "mimic-response": "^4.0.0", + "normalize-url": "^8.0.0", + "responselike": "^3.0.0" } }, "call-bind": { @@ -6293,9 +6279,9 @@ "dev": true }, "caniuse-lite": { - "version": "1.0.30001492", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001492.tgz", - "integrity": "sha512-2efF8SAZwgAX1FJr87KWhvuJxnGJKOnctQa8xLOskAXNXq8oiuqgl6u1kk3fFpsp3GgvzlRjiK1sl63hNtFADw==", + "version": "1.0.30001517", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001517.tgz", + "integrity": "sha512-Vdhm5S11DaFVLlyiKu4hiUTkpZu+y1KA/rZZqVQfOD5YdDT/eQKlkt7NaE0WGOFgX32diqt9MiP9CAiFeRklaA==", "dev": true }, "chainsaw": { @@ -6397,14 +6383,14 @@ "dev": true }, "clipboardy": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/clipboardy/-/clipboardy-2.3.0.tgz", - "integrity": "sha512-mKhiIL2DrQIsuXMgBgnfEHOZOryC7kY7YO//TN6c63wlEm3NG5tz+YgY5rVi29KCmq/QQjKYvM7a19+MDOTHOQ==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/clipboardy/-/clipboardy-3.0.0.tgz", + "integrity": "sha512-Su+uU5sr1jkUy1sGRpLKjKrvEOVXgSgiSInwa/qeID6aJ07yh+5NWc3h2QfjHjBnfX4LhtFcuAWKUsJ3r+fjbg==", "dev": true, "requires": { - "arch": "^2.1.1", - "execa": "^1.0.0", - "is-wsl": "^2.1.1" + "arch": "^2.2.0", + "execa": "^5.1.1", + "is-wsl": "^2.2.0" } }, "cliui": { @@ -6429,15 +6415,6 @@ "shallow-clone": "^3.0.0" } }, - "clone-response": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.3.tgz", - "integrity": "sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==", - "dev": true, - "requires": { - "mimic-response": "^1.0.0" - } - }, "color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -6498,33 +6475,14 @@ "dev": true }, "cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", "dev": true, "requires": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - }, - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - } + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" } }, "css-select": { @@ -6592,9 +6550,9 @@ "dev": true }, "detect-libc": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.1.tgz", - "integrity": "sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.2.tgz", + "integrity": "sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw==", "dev": true, "optional": true }, @@ -6649,10 +6607,19 @@ "domhandler": "^5.0.3" } }, + "duplexer2": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", + "integrity": "sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==", + "dev": true, + "requires": { + "readable-stream": "^2.0.2" + } + }, "electron-to-chromium": { - "version": "1.4.416", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.416.tgz", - "integrity": "sha512-AUYh0XDTb2vrj0rj82jb3P9hHSyzQNdTPYWZIhPdCOui7/vpme7+HTE07BE5jwuqg/34TZ8ktlRz6GImJ4IXjA==", + "version": "1.4.467", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.467.tgz", + "integrity": "sha512-2qI70O+rR4poYeF2grcuS/bCps5KJh6y1jtZMDDEteyKJQrzLOEhFyXCLcHW6DTBjKjWkk26JhWoAi+Ux9A0fg==", "dev": true }, "emoji-regex": { @@ -6671,9 +6638,9 @@ } }, "enhanced-resolve": { - "version": "5.14.1", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.14.1.tgz", - "integrity": "sha512-Vklwq2vDKtl0y/vtwjSesgJ5MYS7Etuk5txS8VdKL4AOS1aUlD96zqIfsOSLQsdv3xgMRbtkWM8eG9XDfKUPow==", + "version": "5.15.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz", + "integrity": "sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==", "dev": true, "requires": { "graceful-fs": "^4.2.4", @@ -6687,15 +6654,15 @@ "dev": true }, "envinfo": { - "version": "7.8.1", - "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.8.1.tgz", - "integrity": "sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw==", + "version": "7.10.0", + "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.10.0.tgz", + "integrity": "sha512-ZtUjZO6l5mwTHvc1L9+1q5p/R3wTopcfqMW8r5t8SJSKqeVI/LtajORwRFEKpEFuekjD0VBjwu1HMxL4UalIRw==", "dev": true }, "es-module-lexer": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.2.1.tgz", - "integrity": "sha512-9978wrXM50Y4rTMmW5kXIC09ZdXQZqkE4mxhwkd8VbzsGkXGPgV4zWuqQJgCEzYngdo2dYDa0l8xhX4fkSwJSg==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.3.0.tgz", + "integrity": "sha512-vZK7T0N2CBmBOixhmjdqx2gWVbFZ4DXZ/NyRMZVlJXPa7CyFS+/a4QQsDGDQy9ZfEzxFuNEsMLeQJnKP2p5/JA==", "dev": true }, "escalade": { @@ -6756,29 +6723,20 @@ "dev": true }, "execa": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", - "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", "dev": true, "requires": { - "cross-spawn": "^6.0.0", - "get-stream": "^4.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" - }, - "dependencies": { - "get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", - "dev": true, - "requires": { - "pump": "^3.0.0" - } - } + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" } }, "expand-template": { @@ -6795,9 +6753,9 @@ "dev": true }, "fast-glob": { - "version": "3.2.12", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", - "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.0.tgz", + "integrity": "sha512-ChDuvbOypPuNjO8yIDf36x7BlZX1smcUMTTcyoIjycexOxd6DFsKsg21qVBzEmr3G7fUKIRy2/psii+CIUt7FA==", "requires": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", @@ -6874,6 +6832,12 @@ "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==" }, + "form-data-encoder": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-2.1.4.tgz", + "integrity": "sha512-yDYSgNMraqvnxiEXO4hi88+YZxaHC6QKzb5N84iRCTDeRO7ZALpir/lVmf/uXUhnwUr2O4HU8s/n6x+yNjQkHw==", + "dev": true + }, "fs-constants": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", @@ -6903,6 +6867,29 @@ "dev": true, "optional": true }, + "fstream": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.12.tgz", + "integrity": "sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "inherits": "~2.0.0", + "mkdirp": ">=0.5 0", + "rimraf": "2" + }, + "dependencies": { + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + } + } + }, "function-bind": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", @@ -6928,13 +6915,10 @@ } }, "get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", - "dev": true, - "requires": { - "pump": "^3.0.0" - } + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true }, "github-from-package": { "version": "0.0.0", @@ -6994,34 +6978,34 @@ "dev": true }, "globby": { - "version": "13.1.4", - "resolved": "https://registry.npmjs.org/globby/-/globby-13.1.4.tgz", - "integrity": "sha512-iui/IiiW+QrJ1X1hKH5qwlMQyv34wJAYwH1vrf8b9kBA4sNiif3gKsMHa+BrdnOpEudWjpotfa7LrTzB1ERS/g==", + "version": "13.2.2", + "resolved": "https://registry.npmjs.org/globby/-/globby-13.2.2.tgz", + "integrity": "sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==", "requires": { "dir-glob": "^3.0.1", - "fast-glob": "^3.2.11", - "ignore": "^5.2.0", + "fast-glob": "^3.3.0", + "ignore": "^5.2.4", "merge2": "^1.4.1", "slash": "^4.0.0" } }, "got": { - "version": "11.8.6", - "resolved": "https://registry.npmjs.org/got/-/got-11.8.6.tgz", - "integrity": "sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==", + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/got/-/got-13.0.0.tgz", + "integrity": "sha512-XfBk1CxOOScDcMr9O1yKkNaQyy865NbYs+F7dr4H0LZMVgCj2Le59k6PqbNHoL5ToeaEQUYh6c6yMfVcc6SJxA==", "dev": true, "requires": { - "@sindresorhus/is": "^4.0.0", - "@szmarczak/http-timer": "^4.0.5", - "@types/cacheable-request": "^6.0.1", - "@types/responselike": "^1.0.0", - "cacheable-lookup": "^5.0.3", - "cacheable-request": "^7.0.2", + "@sindresorhus/is": "^5.2.0", + "@szmarczak/http-timer": "^5.0.1", + "cacheable-lookup": "^7.0.0", + "cacheable-request": "^10.2.8", "decompress-response": "^6.0.0", - "http2-wrapper": "^1.0.0-beta.5.2", - "lowercase-keys": "^2.0.0", - "p-cancelable": "^2.0.0", - "responselike": "^2.0.0" + "form-data-encoder": "^2.1.2", + "get-stream": "^6.0.1", + "http2-wrapper": "^2.1.10", + "lowercase-keys": "^3.0.0", + "p-cancelable": "^3.0.0", + "responselike": "^3.0.0" } }, "graceful-fs": { @@ -7113,13 +7097,13 @@ } }, "http2-wrapper": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-1.0.3.tgz", - "integrity": "sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-2.2.0.tgz", + "integrity": "sha512-kZB0wxMo0sh1PehyjJUWRFEd99KC5TLjZ2cULC4f9iqJBAmKQQXEICjxl5iPJRwP40dpeHFqqhm7tYCvODpqpQ==", "dev": true, "requires": { "quick-lru": "^5.1.1", - "resolve-alpn": "^1.0.0" + "resolve-alpn": "^1.2.0" } }, "https-proxy-agent": { @@ -7132,6 +7116,12 @@ "debug": "4" } }, + "human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true + }, "ieee754": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", @@ -7253,9 +7243,9 @@ } }, "is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", "dev": true }, "is-unicode-supported": { @@ -7374,9 +7364,9 @@ } }, "keyv": { - "version": "4.5.2", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.2.tgz", - "integrity": "sha512-5MHbFaKn8cNSmVW7BYnijeAVlE4cYA/SVkifVgrh7yotnfhKmjuXpDKjrABLnT0SfHWV21P8ow07OGfRrNDg8g==", + "version": "4.5.3", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.3.tgz", + "integrity": "sha512-QCiSav9WaX1PgETJ+SpNnx2PRRapJ/oRSXM4VO5OGYGSjrxbKPVFVhB3l2OCbLCk329N8qyAtsJjSjvVBWzEug==", "dev": true, "requires": { "json-buffer": "3.0.1" @@ -7412,6 +7402,12 @@ "uc.micro": "^1.0.1" } }, + "listenercount": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/listenercount/-/listenercount-1.0.1.tgz", + "integrity": "sha512-3mk/Zag0+IJxeDrxSgaDPy4zZ3w05PRZeJNnlWhzFz5OkX49J4krc+A8X2d2M69vGMBEX0uyl8M+W+8gH+kBqQ==", + "dev": true + }, "loader-runner": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", @@ -7443,9 +7439,9 @@ } }, "lowercase-keys": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", - "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-3.0.0.tgz", + "integrity": "sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==", "dev": true }, "lru-cache": { @@ -7524,10 +7520,16 @@ "mime-db": "1.52.0" } }, + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true + }, "mimic-response": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", - "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-4.0.0.tgz", + "integrity": "sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg==", "dev": true }, "minimatch": { @@ -7671,16 +7673,16 @@ } }, "monaco-page-objects": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/monaco-page-objects/-/monaco-page-objects-3.6.0.tgz", - "integrity": "sha512-hMhILl3pc73+FHdnQ1No9I4WqfQsbvTdwHeGL0oZC2rjSp6zn+MJpJqVLRyppJYvSWC0RXJENMgUKunzqrKBPg==", + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/monaco-page-objects/-/monaco-page-objects-3.8.0.tgz", + "integrity": "sha512-/bsrTHul7KsZ1SmdQFHIdVZTU2Nr+odGpxZAJddWxanX1uEAreqE4H758wI9Ie3mZLFO798lPjv2zaUAi+kDFw==", "dev": true, "requires": { - "clipboardy": "^2.3.0", + "clipboardy": "^3.0.0", "clone-deep": "^4.0.1", - "compare-versions": "^5.0.1", - "fs-extra": "^11.1.0", - "ts-essentials": "^9.3.1" + "compare-versions": "^5.0.3", + "fs-extra": "^11.1.1", + "ts-essentials": "^9.3.2" }, "dependencies": { "fs-extra": { @@ -7727,16 +7729,10 @@ "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", "dev": true }, - "nice-try": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", - "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", - "dev": true - }, "node-abi": { - "version": "3.43.0", - "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.43.0.tgz", - "integrity": "sha512-QB0MMv+tn9Ur2DtJrc8y09n0n6sw88CyDniWSX2cHW10goQXYPK9ZpFJOktDS4ron501edPX6h9i7Pg+RnH5nQ==", + "version": "3.45.0", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.45.0.tgz", + "integrity": "sha512-iwXuFrMAcFVi/ZoZiqq8BzAdsLw9kxDfTC0HMyjXfSL/6CSDAGD5UmR7azrAgWV1zKYq7dUUMj4owusBWKLsiQ==", "dev": true, "optional": true, "requires": { @@ -7751,9 +7747,9 @@ "optional": true }, "node-releases": { - "version": "2.0.12", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.12.tgz", - "integrity": "sha512-QzsYKWhXTWx8h1kIvqfnC++o0pEmpRQA/aenALsL2F4pqNVr7YzcdMlDij5WBnwftRbJCNJL/O7zdKaxKPHqgQ==", + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz", + "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==", "dev": true }, "normalize-path": { @@ -7763,18 +7759,18 @@ "dev": true }, "normalize-url": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", - "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-8.0.0.tgz", + "integrity": "sha512-uVFpKhj5MheNBJRTiMZ9pE/7hD1QTeEvugSJW/OmLzAp78PB5O6adfMNTvmfKhXBkvCzC+rqifWcVYpGFwTjnw==", "dev": true }, "npm-run-path": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", - "integrity": "sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", "dev": true, "requires": { - "path-key": "^2.0.0" + "path-key": "^3.0.0" } }, "nth-check": { @@ -7801,16 +7797,19 @@ "wrappy": "1" } }, - "p-cancelable": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz", - "integrity": "sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==", - "dev": true + "onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "requires": { + "mimic-fn": "^2.1.0" + } }, - "p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==", + "p-cancelable": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-3.0.0.tgz", + "integrity": "sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==", "dev": true }, "p-limit": { @@ -7853,9 +7852,9 @@ }, "dependencies": { "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", "dev": true } } @@ -7892,9 +7891,9 @@ "dev": true }, "path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", "dev": true }, "path-parse": { @@ -8005,6 +8004,7 @@ "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", "dev": true, + "optional": true, "requires": { "end-of-stream": "^1.1.0", "once": "^1.3.1" @@ -8154,12 +8154,12 @@ "dev": true }, "responselike": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.1.tgz", - "integrity": "sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-3.0.0.tgz", + "integrity": "sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg==", "dev": true, "requires": { - "lowercase-keys": "^2.0.0" + "lowercase-keys": "^3.0.0" } }, "reusify": { @@ -8206,9 +8206,9 @@ "dev": true }, "schema-utils": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.1.tgz", - "integrity": "sha512-lELhBAAly9NowEsX0yZBlw9ahZG+sK/1RJ21EpzdYHKEs13Vku3LJ+MIPhh4sMs0oCCeufZQEQbMekiA4vuVIQ==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", + "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", "dev": true, "requires": { "@types/json-schema": "^7.0.9", @@ -8218,9 +8218,9 @@ } }, "selenium-webdriver": { - "version": "4.9.2", - "resolved": "https://registry.npmjs.org/selenium-webdriver/-/selenium-webdriver-4.9.2.tgz", - "integrity": "sha512-0gDswAgVn6qbCYckZetQQvQK9tWW1r7LaumhiqY1/Wl/7JEWG0JANsTbZKnmGc3+cUU76zAi5/p0P8LUweXlig==", + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/selenium-webdriver/-/selenium-webdriver-4.10.0.tgz", + "integrity": "sha512-hSQPw6jgc+ej/UEcdQPG/iBwwMeCEgZr9HByY/J8ToyXztEqXzU9aLsIyrlj1BywBcStO4JQK/zMUWWrV8+riA==", "dev": true, "requires": { "jszip": "^3.10.1", @@ -8229,9 +8229,9 @@ } }, "semver": { - "version": "7.5.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz", - "integrity": "sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "requires": { "lru-cache": "^6.0.0" } @@ -8261,18 +8261,18 @@ } }, "shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "dev": true, "requires": { - "shebang-regex": "^1.0.0" + "shebang-regex": "^3.0.0" } }, "shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true }, "side-channel": { @@ -8367,10 +8367,10 @@ "ansi-regex": "^5.0.1" } }, - "strip-eof": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", - "integrity": "sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q==", + "strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", "dev": true }, "strip-json-comments": { @@ -8508,13 +8508,13 @@ } }, "terser": { - "version": "5.17.6", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.17.6.tgz", - "integrity": "sha512-V8QHcs8YuyLkLHsJO5ucyff1ykrLVsR4dNnS//L5Y3NiSXpbK1J+WMVUs67eI0KTxs9JtHhgEQpXQVHlHI92DQ==", + "version": "5.19.1", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.19.1.tgz", + "integrity": "sha512-27hxBUVdV6GoNg1pKQ7Z5cbR6V9txPVyBA+FQw3BaZ1Wuzvztce5p156DaP0NVZNrMZZ+6iG9Syf7WgMNKDg2Q==", "dev": true, "requires": { - "@jridgewell/source-map": "^0.3.2", - "acorn": "^8.5.0", + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.8.2", "commander": "^2.20.0", "source-map-support": "~0.5.20" } @@ -8558,9 +8558,9 @@ "dev": true }, "schema-utils": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.2.tgz", - "integrity": "sha512-pvjEHOgWc9OWA/f/DE3ohBWTD6EleVLf7iFUkoSwAxttdBhB9QUebQgxER2kWueOvRJXPHNnyrvvh9eZINB8Eg==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", "dev": true, "requires": { "@types/json-schema": "^7.0.8", @@ -8616,9 +8616,9 @@ "requires": {} }, "ts-loader": { - "version": "9.4.3", - "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.4.3.tgz", - "integrity": "sha512-n3hBnm6ozJYzwiwt5YRiJZkzktftRpMiBApHaJPoWLA+qetQBAXkHqCLM6nwSdRDimqVtA5ocIkcTRLMTt7yzA==", + "version": "9.4.4", + "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.4.4.tgz", + "integrity": "sha512-MLukxDHBl8OJ5Dk3y69IsKVFRA/6MwzEqBgh+OXMPB/OD01KQuWPFd1WAQP8a5PeSCAxfnkhiuWqfmFJzJQt9w==", "dev": true, "requires": { "chalk": "^4.1.0", @@ -8745,9 +8745,9 @@ } }, "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", "dev": true }, "supports-color": { @@ -8787,9 +8787,9 @@ } }, "typed-rest-client": { - "version": "1.8.9", - "resolved": "https://registry.npmjs.org/typed-rest-client/-/typed-rest-client-1.8.9.tgz", - "integrity": "sha512-uSmjE38B80wjL85UFX3sTYEUlvZ1JgCRhsWj/fJ4rZ0FqDUFoIuodtiVeE+cUqiVTOKPdKrp/sdftD15MDek6g==", + "version": "1.8.11", + "resolved": "https://registry.npmjs.org/typed-rest-client/-/typed-rest-client-1.8.11.tgz", + "integrity": "sha512-5UvfMpd1oelmUPRbbaVnq+rHP7ng2cE4qoQkQeAqxRL6PklkxsM0g32/HL0yfvruK6ojQ5x8EE+HF4YV6DtuCA==", "dev": true, "requires": { "qs": "^6.9.1", @@ -8820,14 +8820,22 @@ "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==" }, - "unzip-stream": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/unzip-stream/-/unzip-stream-0.3.1.tgz", - "integrity": "sha512-RzaGXLNt+CW+T41h1zl6pGz3EaeVhYlK+rdAap+7DxW5kqsqePO8kRtWPaCiVqdhZc86EctSPVYNix30YOMzmw==", + "unzipper": { + "version": "0.10.14", + "resolved": "https://registry.npmjs.org/unzipper/-/unzipper-0.10.14.tgz", + "integrity": "sha512-ti4wZj+0bQTiX2KmKWuwj7lhV+2n//uXEotUmGuQqrbVZSEGFMbI68+c6JCQ8aAmUWYvtHEz2A8K6wXvueR/6g==", "dev": true, "requires": { - "binary": "^0.3.0", - "mkdirp": "^0.5.1" + "big-integer": "^1.6.17", + "binary": "~0.3.0", + "bluebird": "~3.4.1", + "buffer-indexof-polyfill": "~1.0.0", + "duplexer2": "~0.1.4", + "fstream": "^1.0.12", + "graceful-fs": "^4.2.2", + "listenercount": "~1.0.1", + "readable-stream": "~2.3.6", + "setimmediate": "~1.0.4" } }, "update-browserslist-db": { @@ -8882,32 +8890,32 @@ } }, "vscode-extension-tester": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/vscode-extension-tester/-/vscode-extension-tester-5.6.0.tgz", - "integrity": "sha512-HOhjeV4tY8kb1ieBjC+ThWSZfhcpxgpSDpZa0d+G6vsA5xOwRsNQQFk26SKlv+IkSD5kSzrxh665+xSMGECsdQ==", + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/vscode-extension-tester/-/vscode-extension-tester-5.8.0.tgz", + "integrity": "sha512-DMOSmxXnrREWqLXYYq+Au53n6/BAVbKbOPxAm7bmpuvMCyF6lKJk9olEsbbVMTugkIToLaafsh4LSq47bTgeHQ==", "dev": true, "requires": { "@types/selenium-webdriver": "^4.1.12", - "@vscode/vsce": "^2.18.0", - "commander": "^10.0.0", + "@vscode/vsce": "^2.19.0", + "commander": "^11.0.0", "compare-versions": "^5.0.1", "fs-extra": "^11.1.0", "glob": "^8.1.0", - "got": "^11.8.6", + "got": "^13.0.0", "hpagent": "^1.2.0", "js-yaml": "^4.1.0", - "monaco-page-objects": "^3.6.0", + "monaco-page-objects": "^3.8.0", "sanitize-filename": "^1.6.3", - "selenium-webdriver": "^4.8.1", + "selenium-webdriver": "^4.10.0", "targz": "^1.0.1", - "unzip-stream": "^0.3.1", - "vscode-extension-tester-locators": "^3.4.2" + "unzipper": "^0.10.14", + "vscode-extension-tester-locators": "^3.6.0" }, "dependencies": { "commander": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", - "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-11.0.0.tgz", + "integrity": "sha512-9HMlXtt/BNoYr8ooyjjNRdIilOTkVJXB+GhxMTtOKwk0R4j4lS4NpjuqmRxroBfnfTSHQIHQB7wryHhXarNjmQ==", "dev": true }, "fs-extra": { @@ -8937,9 +8945,9 @@ } }, "vscode-extension-tester-locators": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/vscode-extension-tester-locators/-/vscode-extension-tester-locators-3.4.2.tgz", - "integrity": "sha512-ytJkUTDJ9Wj7pJgg3ocHXkTAQO90XY3YzqSFZkB6t96H0osAvjP26MYqB6QMNG9AA6w34hLJRPBscadi35f4LA==", + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/vscode-extension-tester-locators/-/vscode-extension-tester-locators-3.6.0.tgz", + "integrity": "sha512-RjQf5XL33dJORl9ck5X0vhAHf93TOONPE4nb9nai/pDM15nYcD1TqMyzRGl/XxHpvBu/bP8MV/bHfCT6b8w2cQ==", "dev": true, "requires": {} }, @@ -8962,9 +8970,9 @@ } }, "webpack": { - "version": "5.85.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.85.0.tgz", - "integrity": "sha512-7gazTiYqwo5OSqwH1tigLDL2r3qDeP2dOKYgd+LlXpsUMqDTklg6tOghexqky0/+6QY38kb/R/uRPUleuL43zg==", + "version": "5.88.2", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.88.2.tgz", + "integrity": "sha512-JmcgNZ1iKj+aiR0OvTYtWQqJwq37Pf683dY9bVORwVbUrDhLhdn/PlO2sHsFHPkj7sHNQF3JwaAkp49V+Sq1tQ==", "dev": true, "requires": { "@types/eslint-scope": "^3.7.3", @@ -8976,7 +8984,7 @@ "acorn-import-assertions": "^1.9.0", "browserslist": "^4.14.5", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.14.1", + "enhanced-resolve": "^5.15.0", "es-module-lexer": "^1.2.1", "eslint-scope": "5.1.1", "events": "^3.2.0", @@ -8986,7 +8994,7 @@ "loader-runner": "^4.2.0", "mime-types": "^2.1.27", "neo-async": "^2.6.2", - "schema-utils": "^3.1.2", + "schema-utils": "^3.2.0", "tapable": "^2.1.1", "terser-webpack-plugin": "^5.3.7", "watchpack": "^2.4.0", @@ -9019,9 +9027,9 @@ "dev": true }, "schema-utils": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.2.tgz", - "integrity": "sha512-pvjEHOgWc9OWA/f/DE3ohBWTD6EleVLf7iFUkoSwAxttdBhB9QUebQgxER2kWueOvRJXPHNnyrvvh9eZINB8Eg==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", "dev": true, "requires": { "@types/json-schema": "^7.0.8", @@ -9056,38 +9064,6 @@ "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", "dev": true - }, - "cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "requires": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - } - }, - "path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true - }, - "shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "requires": { - "shebang-regex": "^3.0.0" - } - }, - "shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true } } }, diff --git a/test/maven-suite/projectView.test.ts b/test/maven-suite/projectView.test.ts index cdb69132..91c5db09 100644 --- a/test/maven-suite/projectView.test.ts +++ b/test/maven-suite/projectView.test.ts @@ -2,13 +2,10 @@ // Licensed under the MIT license. import * as assert from "assert"; -import * as clipboardy from "clipboardy"; -import * as path from "path"; import * as vscode from "vscode"; import { Commands, ContainerNode, contextManager, DataNode, DependencyExplorer, FileNode, INodeData, Jdtls, NodeKind, PackageNode, PackageRootNode, PrimaryTypeNode, ProjectNode } from "../../extension.bundle"; import { fsPath, setupTestEnv, Uris } from "../shared"; -import { sleep } from "../util"; // tslint:disable: only-arrow-functions suite("Maven Project View Tests", () => { @@ -145,45 +142,46 @@ suite("Maven Project View Tests", () => { assert.equal(fsPath(testClass), Uris.MAVEN_TEST_CLASS, "Test class uri incorrect"); }); - test("Can execute command java.view.package.copyFilePath correctly", async function() { - const explorer = DependencyExplorer.getInstance(contextManager.context); - - const projectNode = (await explorer.dataProvider.getChildren())![0] as ProjectNode; - const packageRoots = await projectNode.getChildren(); - const mainPackage = packageRoots[0] as PackageRootNode; - const mainSubPackage = (await mainPackage.getChildren())[0] as PackageNode; - const mainClass = (await mainSubPackage.getChildren())[0] as PrimaryTypeNode; - - await vscode.commands.executeCommand(Commands.VIEW_PACKAGE_COPY_FILE_PATH, mainClass); - await sleep(1000); - const content = await clipboardy.read(); - const contentUri = vscode.Uri.file(content); - const dataUri = mainClass.nodeData.uri; - assert.ok(dataUri, `Class node should have correct uri`); - const expectedUri = vscode.Uri.parse(dataUri!); - assert.equal(contentUri.fsPath, expectedUri.fsPath, `File path should be copied correctly`); - }); - - test("Can execute command java.view.package.copyRelativeFilePath correctly", async function() { - const explorer = DependencyExplorer.getInstance(contextManager.context); - - const projectNode = (await explorer.dataProvider.getChildren())![0] as ProjectNode; - const packageRoots = await projectNode.getChildren(); - const mainPackage = packageRoots[0] as PackageRootNode; - const mainSubPackage = (await mainPackage.getChildren())[0] as PackageNode; - const mainClass = (await mainSubPackage.getChildren())[0] as PrimaryTypeNode; - - await vscode.commands.executeCommand(Commands.VIEW_PACKAGE_COPY_RELATIVE_FILE_PATH, mainClass); - await sleep(1000); - const content = await clipboardy.read(); - const dataUri = mainClass.nodeData.uri; - assert.ok(dataUri, `Class node should have correct uri`); - const expectedUri = vscode.Uri.parse(dataUri!); - const workspaceFolders = vscode.workspace.workspaceFolders; - assert.ok(workspaceFolders, `There should be valid workspace folders`); - const relativePath = path.relative(workspaceFolders![0].uri.fsPath, expectedUri.fsPath); - assert.equal(content, relativePath, `Relative file path should be copied correctly`); - }); + // TODO: ignored until we convert the project into ESM + // See: https://gist.github.com/sindresorhus/a39789f98801d908bbc7ff3ecc99d99c + // test("Can execute command java.view.package.copyFilePath correctly", async function() { + // const explorer = DependencyExplorer.getInstance(contextManager.context); + + // const projectNode = (await explorer.dataProvider.getChildren())![0] as ProjectNode; + // const packageRoots = await projectNode.getChildren(); + // const mainPackage = packageRoots[0] as PackageRootNode; + // const mainSubPackage = (await mainPackage.getChildren())[0] as PackageNode; + // const mainClass = (await mainSubPackage.getChildren())[0] as PrimaryTypeNode; + + // await vscode.commands.executeCommand(Commands.VIEW_PACKAGE_COPY_FILE_PATH, mainClass); + // await sleep(1000); + // const content = await clipboard.read(); + // const contentUri = vscode.Uri.file(content); + // const dataUri = mainClass.nodeData.uri; + // assert.ok(dataUri, `Class node should have correct uri`); + // const expectedUri = vscode.Uri.parse(dataUri!); + // assert.equal(contentUri.fsPath, expectedUri.fsPath, `File path should be copied correctly`); + // }); + // test("Can execute command java.view.package.copyRelativeFilePath correctly", async function() { + // const explorer = DependencyExplorer.getInstance(contextManager.context); + + // const projectNode = (await explorer.dataProvider.getChildren())![0] as ProjectNode; + // const packageRoots = await projectNode.getChildren(); + // const mainPackage = packageRoots[0] as PackageRootNode; + // const mainSubPackage = (await mainPackage.getChildren())[0] as PackageNode; + // const mainClass = (await mainSubPackage.getChildren())[0] as PrimaryTypeNode; + + // await vscode.commands.executeCommand(Commands.VIEW_PACKAGE_COPY_RELATIVE_FILE_PATH, mainClass); + // await sleep(1000); + // const content = await clipboard.read(); + // const dataUri = mainClass.nodeData.uri; + // assert.ok(dataUri, `Class node should have correct uri`); + // const expectedUri = vscode.Uri.parse(dataUri!); + // const workspaceFolders = vscode.workspace.workspaceFolders; + // assert.ok(workspaceFolders, `There should be valid workspace folders`); + // const relativePath = path.relative(workspaceFolders![0].uri.fsPath, expectedUri.fsPath); + // assert.equal(content, relativePath, `Relative file path should be copied correctly`); + // }); test("Can execute command java.project.list correctly", async function() { const workspaceFolders = vscode.workspace.workspaceFolders; From 7d8a9db4e3687fec0ca748fb5e16fa5115738fa9 Mon Sep 17 00:00:00 2001 From: Sheng Chen Date: Wed, 2 Aug 2023 13:28:27 +0800 Subject: [PATCH 172/352] build:Remove preview flag (#780) Signed-off-by: Sheng Chen --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 1502dbdc..bcc8a879 100644 --- a/package.json +++ b/package.json @@ -4,7 +4,7 @@ "description": "%description%", "version": "0.23.0", "publisher": "vscjava", - "preview": true, + "preview": false, "aiKey": "5c642b22-e845-4400-badb-3f8509a70777", "keywords": [ "java", From f4a3eb915e3a02357bd6d65685a26960346bfc53 Mon Sep 17 00:00:00 2001 From: Sheng Chen Date: Thu, 3 Aug 2023 15:19:19 +0800 Subject: [PATCH 173/352] build: Prepare for 0.23.1 (#782) --- CHANGELOG.md | 4 ++++ jdtls.ext/com.microsoft.jdtls.ext.core/META-INF/MANIFEST.MF | 2 +- jdtls.ext/com.microsoft.jdtls.ext.core/pom.xml | 2 +- jdtls.ext/com.microsoft.jdtls.ext.target/pom.xml | 2 +- jdtls.ext/pom.xml | 2 +- package-lock.json | 4 ++-- package.json | 4 ++-- 7 files changed, 12 insertions(+), 8 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 23941f5b..188fe709 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,10 @@ All notable changes to the "vscode-java-dependency" extension will be documented The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/) and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html). +## 0.23.1 +### Removed +- Removed marketplace preview flag. [PR#780](https://github.com/microsoft/vscode-java-dependency/pull/780) + ## 0.23.0 ### Added - Support creating Micronaut projects. [#713](https://github.com/microsoft/vscode-java-dependency/issues/713), contributed by [@dbalek](https://github.com/dbalek) diff --git a/jdtls.ext/com.microsoft.jdtls.ext.core/META-INF/MANIFEST.MF b/jdtls.ext/com.microsoft.jdtls.ext.core/META-INF/MANIFEST.MF index a67802fb..55fe75a8 100644 --- a/jdtls.ext/com.microsoft.jdtls.ext.core/META-INF/MANIFEST.MF +++ b/jdtls.ext/com.microsoft.jdtls.ext.core/META-INF/MANIFEST.MF @@ -2,7 +2,7 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: JDTLS EXT Core Bundle-SymbolicName: com.microsoft.jdtls.ext.core;singleton:=true -Bundle-Version: 0.23.0 +Bundle-Version: 0.23.1 Bundle-Activator: com.microsoft.jdtls.ext.core.JdtlsExtActivator Bundle-RequiredExecutionEnvironment: JavaSE-11 Bundle-ActivationPolicy: lazy diff --git a/jdtls.ext/com.microsoft.jdtls.ext.core/pom.xml b/jdtls.ext/com.microsoft.jdtls.ext.core/pom.xml index b15b42d1..be3ff1f4 100644 --- a/jdtls.ext/com.microsoft.jdtls.ext.core/pom.xml +++ b/jdtls.ext/com.microsoft.jdtls.ext.core/pom.xml @@ -5,7 +5,7 @@ com.microsoft.jdtls.ext jdtls-ext-parent - 0.23.0 + 0.23.1 com.microsoft.jdtls.ext.core eclipse-plugin diff --git a/jdtls.ext/com.microsoft.jdtls.ext.target/pom.xml b/jdtls.ext/com.microsoft.jdtls.ext.target/pom.xml index edb1356f..fde7e0b0 100644 --- a/jdtls.ext/com.microsoft.jdtls.ext.target/pom.xml +++ b/jdtls.ext/com.microsoft.jdtls.ext.target/pom.xml @@ -4,7 +4,7 @@ com.microsoft.jdtls.ext jdtls-ext-parent - 0.23.0 + 0.23.1 com.microsoft.jdtls.ext.tp ${base.name} :: Target Platform diff --git a/jdtls.ext/pom.xml b/jdtls.ext/pom.xml index 09874c64..44549af8 100644 --- a/jdtls.ext/pom.xml +++ b/jdtls.ext/pom.xml @@ -4,7 +4,7 @@ com.microsoft.jdtls.ext jdtls-ext-parent ${base.name} :: Parent - 0.23.0 + 0.23.1 pom Java Project Manager diff --git a/package-lock.json b/package-lock.json index 515dd5ac..f6d6c3c8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "vscode-java-dependency", - "version": "0.23.0", + "version": "0.23.1", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "vscode-java-dependency", - "version": "0.23.0", + "version": "0.23.1", "license": "MIT", "dependencies": { "await-lock": "^2.2.2", diff --git a/package.json b/package.json index bcc8a879..f2a82249 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "vscode-java-dependency", "displayName": "Project Manager for Java", "description": "%description%", - "version": "0.23.0", + "version": "0.23.1", "publisher": "vscjava", "preview": false, "aiKey": "5c642b22-e845-4400-badb-3f8509a70777", @@ -46,7 +46,7 @@ "main": "./main.js", "contributes": { "javaExtensions": [ - "./server/com.microsoft.jdtls.ext.core-0.23.0.jar" + "./server/com.microsoft.jdtls.ext.core-0.23.1.jar" ], "commands": [ { From 903b88c227071e1d61319fd464af7b8e55f323e0 Mon Sep 17 00:00:00 2001 From: Sheng Chen Date: Fri, 25 Aug 2023 10:27:53 +0800 Subject: [PATCH 174/352] fix: Improve wording. (#785) Signed-off-by: Sheng Chen --- README.md | 2 +- package.nls.json | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 6fb9faac..6506e78b 100644 --- a/README.md +++ b/README.md @@ -66,7 +66,7 @@ You can tell that the glob pattern is supported. And here's more - you can incl | Setting Name | Description | Default Value | |---|---|---| | `java.dependency.showMembers` | Specify whether to show the members in the Java Projects explorer. | `false` | -| `java.dependency.syncWithFolderExplorer` | Specify whether to sync the folder with Java Projects explorer when browsing files. | `true` | +| `java.dependency.syncWithFolderExplorer` | Specify whether to link Java Projects Explorer with the active editor. | `true` | | `java.dependency.autoRefresh` | Specify whether to automatically sync the change from editor to the Java Projects explorer. | `true` | | `java.dependency.refreshDelay` | The delay time (ms) the auto refresh is invoked when changes are detected. | `2000ms` | | `java.dependency.packagePresentation` | Specify how to display the package. Supported values are: `flat`, `hierarchical`.| `flat` | diff --git a/package.nls.json b/package.nls.json index 28064de7..19c20d8d 100644 --- a/package.nls.json +++ b/package.nls.json @@ -13,8 +13,8 @@ "contributes.commands.java.view.package.revealInProjectExplorer": "Reveal in Java Project Explorer", "contributes.commands.java.view.package.changeToFlatPackageView":"Flat View", "contributes.commands.java.view.package.changeToHierarchicalPackageView":"Hierarchical View", - "contributes.commands.java.view.package.linkWithFolderExplorer":"Synchronize with Editor", - "contributes.commands.java.view.package.unlinkWithFolderExplorer":"Desynchronize with Editor", + "contributes.commands.java.view.package.linkWithFolderExplorer":"Link with Editor", + "contributes.commands.java.view.package.unlinkWithFolderExplorer":"Unlink with Editor", "contributes.commands.java.project.explorer.showNonJavaResources": "Show Non-Java Resources", "contributes.commands.java.project.explorer.hideNonJavaResources": "Hide Non-Java Resources", "contributes.commands.java.view.package.revealFileInOS": "Reveal in Explorer", @@ -32,7 +32,7 @@ "contributes.submenus.javaProject.new": "New", "contributes.commands.java.view.menus.file.newJavaClass": "New Java Class", "configuration.java.dependency.showMembers": "Show the members in the explorer", - "configuration.java.dependency.syncWithFolderExplorer": "Synchronize Java Projects explorer selection with folder explorer", + "configuration.java.dependency.syncWithFolderExplorer": "Link Java Projects Explorer with the active editor", "configuration.java.dependency.autoRefresh": "Synchronize Java Projects explorer with changes", "configuration.java.dependency.refreshDelay": "The delay time (ms) the auto refresh is invoked when changes are detected", "configuration.java.dependency.packagePresentation": "Package presentation mode: flat or hierarchical", From 2ba3227264d9c0967d409bebac9bbf9fb07e9d67 Mon Sep 17 00:00:00 2001 From: Sheng Chen Date: Tue, 29 Aug 2023 14:58:41 +0800 Subject: [PATCH 175/352] feat: Support showing Gradle sub-menu for BSP Gradle projects (#786) Signed-off-by: Sheng Chen --- package.json | 4 ++-- src/views/projectNode.ts | 10 +++++----- test/suite/contextValue.test.ts | 13 +++++++++++++ 3 files changed, 20 insertions(+), 7 deletions(-) diff --git a/package.json b/package.json index f2a82249..7e1aaf66 100644 --- a/package.json +++ b/package.json @@ -617,12 +617,12 @@ }, { "submenu": "javaProject.maven", - "when": "view == javaProjectExplorer && viewItem =~ /java:project(?=.*?\\b\\+uri\\b)(?=.*?\\b\\+(maven)\\b)/", + "when": "view == javaProjectExplorer && viewItem =~ /java:project(?=.*?\\b\\+uri\\b)(?=.*?\\b\\+maven\\b)/", "group": "9_configuration@10" }, { "submenu": "javaProject.gradle", - "when": "view == javaProjectExplorer && viewItem =~ /java:project(?=.*?\\b\\+uri\\b)(?=.*?\\b\\+(gradle)\\b)/", + "when": "view == javaProjectExplorer && viewItem =~ /java:project(?=.*?\\b\\+uri\\b)(?=.*?\\b\\+(?:bsp-)?gradle\\b)/", "group": "9_configuration@10" } ], diff --git a/src/views/projectNode.ts b/src/views/projectNode.ts index a19ace6d..2d127fb0 100644 --- a/src/views/projectNode.ts +++ b/src/views/projectNode.ts @@ -14,10 +14,6 @@ import { NodeFactory } from "./nodeFactory"; export class ProjectNode extends DataNode { - constructor(nodeData: INodeData, parent?: DataNode) { - super(nodeData, parent); - } - public async revealPaths(paths: INodeData[]): Promise { if (!this.uri) { return undefined; @@ -65,7 +61,7 @@ export class ProjectNode extends DataNode { protected createChildNodeList(): ExplorerNode[] { const result: (ExplorerNode | undefined)[] = []; const packageData: any[] = []; - if (this.nodeData.children && this.nodeData.children.length) { + if (this.nodeData.children?.length) { this.nodeData.children.forEach((nodeData) => { if (nodeData.kind === NodeKind.Package) { packageData.push(nodeData); @@ -123,6 +119,8 @@ function getProjectType(natureId: string): string { return ReadableNature.Maven; case NatureId.Gradle: return ReadableNature.Gradle; + case NatureId.BspGradle: + return ReadableNature.BspGradle; case NatureId.UnmanagedFolder: return ReadableNature.UnmanagedFolder; default: @@ -133,6 +131,7 @@ function getProjectType(natureId: string): string { enum NatureId { Maven = "org.eclipse.m2e.core.maven2Nature", Gradle = "org.eclipse.buildship.core.gradleprojectnature", + BspGradle = "com.microsoft.gradle.bs.importer.GradleBuildServerProjectNature", UnmanagedFolder = "org.eclipse.jdt.ls.core.unmanagedFolder", Java = "org.eclipse.jdt.core.javanature", } @@ -140,6 +139,7 @@ enum NatureId { enum ReadableNature { Maven = "maven", Gradle = "gradle", + BspGradle = "bsp-gradle", UnmanagedFolder = "unmanagedFolder", Java = "java", } diff --git a/test/suite/contextValue.test.ts b/test/suite/contextValue.test.ts index 9fa1e1d5..3cb04022 100644 --- a/test/suite/contextValue.test.ts +++ b/test/suite/contextValue.test.ts @@ -28,6 +28,10 @@ suite("Context Value Tests", () => { assert.ok(/java:project(?=.*?\b\+java\b)(?=.*?\b\+gradle\b)(?=.*?\b\+uri\b)/.test((await gradleProject.getTreeItem()).contextValue || "")); }); + test("test BSP Gradle project node", async function() { + assert.ok(/java:project(?=.*?\b\+java\b)(?=.*?\b\+bsp-gradle\b)(?=.*?\b\+uri\b)/.test((await bspGradleProject.getTreeItem()).contextValue || "")); + }); + test("test unmanaged folder node", async function() { assert.ok(/java:project(?=.*?\b\+java\b)(?=.*?\b\+unmanagedFolder\b)(?=.*?\b\+uri\b)/ .test((await unmanagedFolder.getTreeItem()).contextValue || "")); @@ -134,6 +138,15 @@ const gradleProject: ProjectNode = new ProjectNode({ }, }, workspace); +const bspGradleProject: ProjectNode = new ProjectNode({ + name: "bspGradleProject", + uri: Uri.file(__dirname).toString(), + kind: NodeKind.Project, + metaData: { + NatureId: ["org.eclipse.jdt.core.javanature", "com.microsoft.gradle.bs.importer.GradleBuildServerProjectNature"], + }, +}, workspace); + const unmanagedFolder: ProjectNode = new ProjectNode({ name: "unmanagedFolder", uri: Uri.file(__dirname).toString(), From 0ec45cc2f67fc31ddefeb7b50680170441d83735 Mon Sep 17 00:00:00 2001 From: Dusan Balek Date: Thu, 28 Sep 2023 03:17:41 +0200 Subject: [PATCH 176/352] fix: Modified to follow changed extension names. (#790) --- src/controllers/projectController.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/controllers/projectController.ts b/src/controllers/projectController.ts index 267cae3c..6b394ea2 100644 --- a/src/controllers/projectController.ts +++ b/src/controllers/projectController.ts @@ -257,7 +257,7 @@ const projectTypes: IProjectType[] = [ metadata: { type: ProjectType.Micronaut, extensionId: "oracle-labs-graalvm.micronaut", - extensionName: "GraalVM Tools for Micronaut", + extensionName: "Micronaut® Launch", createCommandId: "extension.micronaut.createProject", }, }, @@ -266,7 +266,7 @@ const projectTypes: IProjectType[] = [ metadata: { type: ProjectType.GCN, extensionId: "oracle-labs-graalvm.gcn", - extensionName: "Graal Cloud Native Tools", + extensionName: "Graal Cloud Native Launcher", createCommandId: "gcn.createGcnProject", }, }, From b3d964bc24f23bcaf8fd42e8640ad4b83081bec0 Mon Sep 17 00:00:00 2001 From: Frederik Claus Date: Sun, 8 Oct 2023 03:40:48 +0200 Subject: [PATCH 177/352] Fixes java.getPackageData for modules with long name (#791) Signed-off-by: Frederik Claus Co-authored-by: Sheng Chen --- .vscode/launch.json | 22 +- .../jdtls/ext/core/PackageCommand.java | 31 +- package-lock.json | 156 ++++---- package.json | 6 +- src/java/jdtls.ts | 8 +- .../BuildArtifactTaskProvider.ts | 4 +- src/views/nodeFactory.ts | 2 +- test/index.ts | 12 + test/maven-suite/projectView.test.ts | 18 +- test/maven/.vscode/settings.json | 13 + test/multi-module-suite/index.ts | 41 +++ test/multi-module-suite/projectView.test.ts | 25 ++ test/multi-module/.vscode/settings.json | 4 + test/multi-module/level1/pom.xml | 21 ++ test/multi-module/pom.xml | 12 + .../src/main/java/fvclaus/App.java | 13 + .../src/test/java/fvclaus/AppTest.java | 38 ++ test/shared.ts | 15 +- test/ui/command.test.ts | 336 +++++++++++------- webpack.config.js | 1 + 20 files changed, 538 insertions(+), 240 deletions(-) create mode 100644 test/multi-module-suite/index.ts create mode 100644 test/multi-module-suite/projectView.test.ts create mode 100644 test/multi-module/.vscode/settings.json create mode 100644 test/multi-module/level1/pom.xml create mode 100644 test/multi-module/pom.xml create mode 100644 test/multi-module/src/main/java/fvclaus/App.java create mode 100644 test/multi-module/src/test/java/fvclaus/AppTest.java diff --git a/.vscode/launch.json b/.vscode/launch.json index 2f331a2d..98391691 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -92,6 +92,20 @@ "outFiles": [ "${workspaceFolder}/dist/**/*.js" ], "preLaunchTask": "npm: compile" }, + { + "name": "Extension Tests - Multi Module Project", + "type": "extensionHost", + "request": "launch", + "runtimeExecutable": "${execPath}", + "args": [ + "${workspaceFolder}/test/multi-module/", + "--extensionDevelopmentPath=${workspaceFolder}", + "--extensionTestsPath=${workspaceFolder}/dist/test/multi-module-suite/index" + ], + "sourceMaps": true, + "outFiles": [ "${workspaceFolder}/dist/**/*.js" ], + "preLaunchTask": "npm: compile" + }, { "name": "Debug UI Command Tests", "type": "node", @@ -99,11 +113,15 @@ "program": "${workspaceFolder}/node_modules/vscode-extension-tester/out/cli.js", "args": [ "setup-and-run", + // If not set, will use the current version of vscode. Find a way not to hardcode this value. + "--code_version=1.77.0", "${workspaceFolder}/dist/test/ui/command.test.js", ], + // To debug the test code, you must set --mode=development inside the vscode:prepublish task. Find a better way to do this. + "sourceMaps": true, + "outFiles": [ "${workspaceFolder}/dist/**/*.js" ], "console": "integratedTerminal", - "internalConsoleOptions": "neverOpen", - "preLaunchTask": "npm: compile" + // No need to compile the code, vscode:prepublish task that compiles the code is run by vscode-extension-tester }, ] } diff --git a/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/PackageCommand.java b/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/PackageCommand.java index 68088c90..e2f35f3b 100644 --- a/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/PackageCommand.java +++ b/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/PackageCommand.java @@ -14,11 +14,11 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; -import java.util.Comparator; import java.util.HashMap; import java.util.LinkedList; import java.util.List; import java.util.Map; +import java.util.Optional; import java.util.Set; import java.util.function.BiFunction; import java.util.stream.Collectors; @@ -577,26 +577,21 @@ private static Object[] findJarDirectoryChildren(JarEntryDirectory directory, St public static IProject getProject(String projectUri) { IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot(); - IContainer[] containers = root.findContainersForLocationURI(JDTUtils.toURI(projectUri)); + URI uri = JDTUtils.toURI(projectUri); + IContainer[] containers = root.findContainersForLocationURI(uri); - if (containers.length == 0) { - return null; - } - - // For multi-module scenario, findContainersForLocationURI API may return a container array, - // put the result from the nearest project in front. - Arrays.sort(containers, (Comparator) (IContainer a, IContainer b) -> { - return a.getFullPath().toPortableString().length() - b.getFullPath().toPortableString().length(); - }); - - for (IContainer container : containers) { - IProject project = container.getProject(); - if (!project.exists()) { - return null; + Optional maybeProject = Arrays.stream(containers).filter(container -> container instanceof IProject).findFirst(); + if (maybeProject.isPresent()) { + return (IProject) maybeProject.get(); + } else { + if (containers.length == 0) { + throw new IllegalArgumentException(String.format("Did not find container for URI %s", projectUri)); } - return project; + + // This must be an invisible project. + // There might be more than one way to access it, but all containers should link to the same project. + return containers[0].getProject(); } - return null; } public static IJavaProject getJavaProject(String projectUri) { diff --git a/package-lock.json b/package-lock.json index f6d6c3c8..0d1a48fa 100644 --- a/package-lock.json +++ b/package-lock.json @@ -34,7 +34,7 @@ "ts-loader": "^9.4.2", "tslint": "^6.1.3", "typescript": "^4.9.4", - "vscode-extension-tester": "^5.5.2", + "vscode-extension-tester": "^5.9.1", "webpack": "^5.76.0", "webpack-cli": "^4.10.0" }, @@ -467,15 +467,15 @@ } }, "node_modules/@vscode/vsce": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/@vscode/vsce/-/vsce-2.19.0.tgz", - "integrity": "sha512-dAlILxC5ggOutcvJY24jxz913wimGiUrHaPkk16Gm9/PGFbz1YezWtrXsTKUtJws4fIlpX2UIlVlVESWq8lkfQ==", + "version": "2.21.0", + "resolved": "https://registry.npmjs.org/@vscode/vsce/-/vsce-2.21.0.tgz", + "integrity": "sha512-KuxYqScqUY/duJbkj9eE2tN2X/WJoGAy54hHtxT3ZBkM6IzrOg7H7CXGUPBxNlmqku2w/cAjOUSrgIHlzz0mbA==", "dev": true, "dependencies": { "azure-devops-node-api": "^11.0.1", "chalk": "^2.4.2", "cheerio": "^1.0.0-rc.9", - "commander": "^6.1.0", + "commander": "^6.2.1", "glob": "^7.0.6", "hosted-git-info": "^4.0.2", "jsonc-parser": "^3.2.0", @@ -485,7 +485,7 @@ "minimatch": "^3.0.3", "parse-semver": "^1.1.1", "read": "^1.0.7", - "semver": "^5.1.0", + "semver": "^7.5.2", "tmp": "^0.2.1", "typed-rest-client": "^1.8.4", "url-join": "^4.0.1", @@ -593,15 +593,6 @@ "node": "*" } }, - "node_modules/@vscode/vsce/node_modules/semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", - "dev": true, - "bin": { - "semver": "bin/semver" - } - }, "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", @@ -1500,9 +1491,9 @@ "dev": true }, "node_modules/compare-versions": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-5.0.3.tgz", - "integrity": "sha512-4UZlZP8Z99MGEY+Ovg/uJxJuvoXuN4M6B3hKaiackiHrgzQFEe3diJi1mf1PNHbFujM7FvLrK2bpgIaImbtZ1A==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-6.1.0.tgz", + "integrity": "sha512-LNZQXhqUvqUTotpZ00qLSaify3b4VFD588aRr8MKFw4CMUr98ytzCW5wDH5qx/DEY5kCDXcbcRuCqL0szEf2tg==", "dev": true }, "node_modules/concat-map": { @@ -3179,14 +3170,14 @@ } }, "node_modules/monaco-page-objects": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/monaco-page-objects/-/monaco-page-objects-3.8.0.tgz", - "integrity": "sha512-/bsrTHul7KsZ1SmdQFHIdVZTU2Nr+odGpxZAJddWxanX1uEAreqE4H758wI9Ie3mZLFO798lPjv2zaUAi+kDFw==", + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/monaco-page-objects/-/monaco-page-objects-3.9.1.tgz", + "integrity": "sha512-Y/haEkl0U5MPH2krk6hyOpSqUdzqY9VIW4NPz48i6QHP1hSCInW2ffXl1zisStv0vBWBrDr8hu5n6Q1i7z99PQ==", "dev": true, "dependencies": { "clipboardy": "^3.0.0", "clone-deep": "^4.0.1", - "compare-versions": "^5.0.3", + "compare-versions": "^6.1.0", "fs-extra": "^11.1.1", "ts-essentials": "^9.3.2" }, @@ -3247,9 +3238,9 @@ "dev": true }, "node_modules/node-abi": { - "version": "3.45.0", - "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.45.0.tgz", - "integrity": "sha512-iwXuFrMAcFVi/ZoZiqq8BzAdsLw9kxDfTC0HMyjXfSL/6CSDAGD5UmR7azrAgWV1zKYq7dUUMj4owusBWKLsiQ==", + "version": "3.47.0", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.47.0.tgz", + "integrity": "sha512-2s6B2CWZM//kPgwnuI0KrYwNjfdByE25zvAaEpq9IH4zcNsarH8Ihu/UuX6XMPEogDAxkuUFeZn60pXNHAqn3A==", "dev": true, "optional": true, "dependencies": { @@ -4455,12 +4446,17 @@ } }, "node_modules/ts-essentials": { - "version": "9.3.2", - "resolved": "https://registry.npmjs.org/ts-essentials/-/ts-essentials-9.3.2.tgz", - "integrity": "sha512-JxKJzuWqH1MmH4ZFHtJzGEhkfN3QvVR3C3w+4BIoWeoY68UVVoA2Np/Bca9z0IPSErVCWhv439aT0We4Dks8kQ==", + "version": "9.4.0", + "resolved": "https://registry.npmjs.org/ts-essentials/-/ts-essentials-9.4.0.tgz", + "integrity": "sha512-s4BzWZmTh926caZO7XF7MMbwCn1BioT3s3r9hT8ARnwW//30OD0XioEsMyq3ORAHP/deN4Zkst2ZvxXmL+tG6g==", "dev": true, "peerDependencies": { "typescript": ">=4.1.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, "node_modules/ts-loader": { @@ -4825,26 +4821,26 @@ } }, "node_modules/vscode-extension-tester": { - "version": "5.8.0", - "resolved": "https://registry.npmjs.org/vscode-extension-tester/-/vscode-extension-tester-5.8.0.tgz", - "integrity": "sha512-DMOSmxXnrREWqLXYYq+Au53n6/BAVbKbOPxAm7bmpuvMCyF6lKJk9olEsbbVMTugkIToLaafsh4LSq47bTgeHQ==", + "version": "5.9.1", + "resolved": "https://registry.npmjs.org/vscode-extension-tester/-/vscode-extension-tester-5.9.1.tgz", + "integrity": "sha512-dWUUZWiLbjch9yXrdd1GH/LdjZodn4FbNDraffFyON1qEIVio0Z3hwUunKmLBNFQWRseCJfFs5peBqoF5bGo0g==", "dev": true, "dependencies": { - "@types/selenium-webdriver": "^4.1.12", - "@vscode/vsce": "^2.19.0", + "@types/selenium-webdriver": "^4.1.15", + "@vscode/vsce": "^2.20.1", "commander": "^11.0.0", - "compare-versions": "^5.0.1", + "compare-versions": "^6.1.0", "fs-extra": "^11.1.0", "glob": "^8.1.0", "got": "^13.0.0", "hpagent": "^1.2.0", "js-yaml": "^4.1.0", - "monaco-page-objects": "^3.8.0", + "monaco-page-objects": "^3.9.1", "sanitize-filename": "^1.6.3", - "selenium-webdriver": "^4.10.0", + "selenium-webdriver": "4.10.0", "targz": "^1.0.1", "unzipper": "^0.10.14", - "vscode-extension-tester-locators": "^3.6.0" + "vscode-extension-tester-locators": "^3.7.1" }, "bin": { "extest": "out/cli.js" @@ -4855,12 +4851,12 @@ } }, "node_modules/vscode-extension-tester-locators": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/vscode-extension-tester-locators/-/vscode-extension-tester-locators-3.6.0.tgz", - "integrity": "sha512-RjQf5XL33dJORl9ck5X0vhAHf93TOONPE4nb9nai/pDM15nYcD1TqMyzRGl/XxHpvBu/bP8MV/bHfCT6b8w2cQ==", + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/vscode-extension-tester-locators/-/vscode-extension-tester-locators-3.7.1.tgz", + "integrity": "sha512-My+ZTH2PM0g9JwWw49E+SfBMFLSjBdv6YpjekUFpzhCWK0mH+BjRC0gtINr+x2+KuVZVhsO82oSivBa1d7ZJvg==", "dev": true, "peerDependencies": { - "monaco-page-objects": "^3.8.0", + "monaco-page-objects": "^3.9.1", "selenium-webdriver": "^4.6.1" } }, @@ -5155,9 +5151,9 @@ "dev": true }, "node_modules/ws": { - "version": "8.13.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.13.0.tgz", - "integrity": "sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==", + "version": "8.14.2", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.14.2.tgz", + "integrity": "sha512-wEBG1ftX4jcglPxgFCMJmZ2PLtSbJ2Peg6TmpJFTbe9GZYOQCDPdMYu/Tm0/bGZkw8paZnJY45J4K2PZrLYq8g==", "dev": true, "engines": { "node": ">=10.0.0" @@ -5656,15 +5652,15 @@ } }, "@vscode/vsce": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/@vscode/vsce/-/vsce-2.19.0.tgz", - "integrity": "sha512-dAlILxC5ggOutcvJY24jxz913wimGiUrHaPkk16Gm9/PGFbz1YezWtrXsTKUtJws4fIlpX2UIlVlVESWq8lkfQ==", + "version": "2.21.0", + "resolved": "https://registry.npmjs.org/@vscode/vsce/-/vsce-2.21.0.tgz", + "integrity": "sha512-KuxYqScqUY/duJbkj9eE2tN2X/WJoGAy54hHtxT3ZBkM6IzrOg7H7CXGUPBxNlmqku2w/cAjOUSrgIHlzz0mbA==", "dev": true, "requires": { "azure-devops-node-api": "^11.0.1", "chalk": "^2.4.2", "cheerio": "^1.0.0-rc.9", - "commander": "^6.1.0", + "commander": "^6.2.1", "glob": "^7.0.6", "hosted-git-info": "^4.0.2", "jsonc-parser": "^3.2.0", @@ -5675,7 +5671,7 @@ "minimatch": "^3.0.3", "parse-semver": "^1.1.1", "read": "^1.0.7", - "semver": "^5.1.0", + "semver": "^7.5.2", "tmp": "^0.2.1", "typed-rest-client": "^1.8.4", "url-join": "^4.0.1", @@ -5756,12 +5752,6 @@ "brace-expansion": "^1.1.7" } }, - "semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", - "dev": true - }, "supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", @@ -6443,9 +6433,9 @@ "dev": true }, "compare-versions": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-5.0.3.tgz", - "integrity": "sha512-4UZlZP8Z99MGEY+Ovg/uJxJuvoXuN4M6B3hKaiackiHrgzQFEe3diJi1mf1PNHbFujM7FvLrK2bpgIaImbtZ1A==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-6.1.0.tgz", + "integrity": "sha512-LNZQXhqUvqUTotpZ00qLSaify3b4VFD588aRr8MKFw4CMUr98ytzCW5wDH5qx/DEY5kCDXcbcRuCqL0szEf2tg==", "dev": true }, "concat-map": { @@ -7673,14 +7663,14 @@ } }, "monaco-page-objects": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/monaco-page-objects/-/monaco-page-objects-3.8.0.tgz", - "integrity": "sha512-/bsrTHul7KsZ1SmdQFHIdVZTU2Nr+odGpxZAJddWxanX1uEAreqE4H758wI9Ie3mZLFO798lPjv2zaUAi+kDFw==", + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/monaco-page-objects/-/monaco-page-objects-3.9.1.tgz", + "integrity": "sha512-Y/haEkl0U5MPH2krk6hyOpSqUdzqY9VIW4NPz48i6QHP1hSCInW2ffXl1zisStv0vBWBrDr8hu5n6Q1i7z99PQ==", "dev": true, "requires": { "clipboardy": "^3.0.0", "clone-deep": "^4.0.1", - "compare-versions": "^5.0.3", + "compare-versions": "^6.1.0", "fs-extra": "^11.1.1", "ts-essentials": "^9.3.2" }, @@ -7730,9 +7720,9 @@ "dev": true }, "node-abi": { - "version": "3.45.0", - "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.45.0.tgz", - "integrity": "sha512-iwXuFrMAcFVi/ZoZiqq8BzAdsLw9kxDfTC0HMyjXfSL/6CSDAGD5UmR7azrAgWV1zKYq7dUUMj4owusBWKLsiQ==", + "version": "3.47.0", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.47.0.tgz", + "integrity": "sha512-2s6B2CWZM//kPgwnuI0KrYwNjfdByE25zvAaEpq9IH4zcNsarH8Ihu/UuX6XMPEogDAxkuUFeZn60pXNHAqn3A==", "dev": true, "optional": true, "requires": { @@ -8609,9 +8599,9 @@ } }, "ts-essentials": { - "version": "9.3.2", - "resolved": "https://registry.npmjs.org/ts-essentials/-/ts-essentials-9.3.2.tgz", - "integrity": "sha512-JxKJzuWqH1MmH4ZFHtJzGEhkfN3QvVR3C3w+4BIoWeoY68UVVoA2Np/Bca9z0IPSErVCWhv439aT0We4Dks8kQ==", + "version": "9.4.0", + "resolved": "https://registry.npmjs.org/ts-essentials/-/ts-essentials-9.4.0.tgz", + "integrity": "sha512-s4BzWZmTh926caZO7XF7MMbwCn1BioT3s3r9hT8ARnwW//30OD0XioEsMyq3ORAHP/deN4Zkst2ZvxXmL+tG6g==", "dev": true, "requires": {} }, @@ -8890,26 +8880,26 @@ } }, "vscode-extension-tester": { - "version": "5.8.0", - "resolved": "https://registry.npmjs.org/vscode-extension-tester/-/vscode-extension-tester-5.8.0.tgz", - "integrity": "sha512-DMOSmxXnrREWqLXYYq+Au53n6/BAVbKbOPxAm7bmpuvMCyF6lKJk9olEsbbVMTugkIToLaafsh4LSq47bTgeHQ==", + "version": "5.9.1", + "resolved": "https://registry.npmjs.org/vscode-extension-tester/-/vscode-extension-tester-5.9.1.tgz", + "integrity": "sha512-dWUUZWiLbjch9yXrdd1GH/LdjZodn4FbNDraffFyON1qEIVio0Z3hwUunKmLBNFQWRseCJfFs5peBqoF5bGo0g==", "dev": true, "requires": { - "@types/selenium-webdriver": "^4.1.12", - "@vscode/vsce": "^2.19.0", + "@types/selenium-webdriver": "^4.1.15", + "@vscode/vsce": "^2.20.1", "commander": "^11.0.0", - "compare-versions": "^5.0.1", + "compare-versions": "^6.1.0", "fs-extra": "^11.1.0", "glob": "^8.1.0", "got": "^13.0.0", "hpagent": "^1.2.0", "js-yaml": "^4.1.0", - "monaco-page-objects": "^3.8.0", + "monaco-page-objects": "^3.9.1", "sanitize-filename": "^1.6.3", - "selenium-webdriver": "^4.10.0", + "selenium-webdriver": "4.10.0", "targz": "^1.0.1", "unzipper": "^0.10.14", - "vscode-extension-tester-locators": "^3.6.0" + "vscode-extension-tester-locators": "^3.7.1" }, "dependencies": { "commander": { @@ -8945,9 +8935,9 @@ } }, "vscode-extension-tester-locators": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/vscode-extension-tester-locators/-/vscode-extension-tester-locators-3.6.0.tgz", - "integrity": "sha512-RjQf5XL33dJORl9ck5X0vhAHf93TOONPE4nb9nai/pDM15nYcD1TqMyzRGl/XxHpvBu/bP8MV/bHfCT6b8w2cQ==", + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/vscode-extension-tester-locators/-/vscode-extension-tester-locators-3.7.1.tgz", + "integrity": "sha512-My+ZTH2PM0g9JwWw49E+SfBMFLSjBdv6YpjekUFpzhCWK0mH+BjRC0gtINr+x2+KuVZVhsO82oSivBa1d7ZJvg==", "dev": true, "requires": {} }, @@ -9122,9 +9112,9 @@ "dev": true }, "ws": { - "version": "8.13.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.13.0.tgz", - "integrity": "sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==", + "version": "8.14.2", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.14.2.tgz", + "integrity": "sha512-wEBG1ftX4jcglPxgFCMJmZ2PLtSbJ2Peg6TmpJFTbe9GZYOQCDPdMYu/Tm0/bGZkw8paZnJY45J4K2PZrLYq8g==", "dev": true, "requires": {} }, diff --git a/package.json b/package.json index 7e1aaf66..65a5d054 100644 --- a/package.json +++ b/package.json @@ -867,8 +867,8 @@ "scripts": { "compile": "tsc -p . && webpack --config webpack.config.js --mode development", "watch": "webpack --mode development --watch", - "test": "tsc -p . && node ./dist/test/index.js", - "test-ui": "tsc -p . && node ./dist/test/ui/index.js", + "test": "tsc -p . && webpack --config webpack.config.js --mode development && node ./dist/test/index.js", + "test-ui": "tsc -p . && webpack --config webpack.config.js --mode development && node ./dist/test/ui/index.js", "build-server": "node scripts/buildJdtlsExt.js", "vscode:prepublish": "tsc -p ./ && webpack --mode production", "tslint": "tslint -t verbose --project tsconfig.json" @@ -889,7 +889,7 @@ "ts-loader": "^9.4.2", "tslint": "^6.1.3", "typescript": "^4.9.4", - "vscode-extension-tester": "^5.5.2", + "vscode-extension-tester": "^5.9.1", "webpack": "^5.76.0", "webpack-cli": "^4.10.0" }, diff --git a/src/java/jdtls.ts b/src/java/jdtls.ts index 1c07f194..c1388253 100644 --- a/src/java/jdtls.ts +++ b/src/java/jdtls.ts @@ -48,7 +48,7 @@ export namespace Jdtls { for (const pattern in excludePatterns) { if (excludePatterns[pattern]) { const toExclude: string[] = minimatch.match(uriOfChildren, pattern); - toExclude.forEach((uri: string) => urisToExclude.add(uri)); + toExclude.forEach((uriToExclude: string) => urisToExclude.add(uriToExclude)); } } @@ -58,7 +58,7 @@ export namespace Jdtls { return true; } return !urisToExclude.has(node.uri); - }) + }); } } return nodeData; @@ -95,6 +95,6 @@ export namespace Jdtls { } interface IPackageDataParam { - projectUri: string | undefined, - [key: string]: any, + projectUri: string | undefined; + [key: string]: any; } \ No newline at end of file diff --git a/src/tasks/buildArtifact/BuildArtifactTaskProvider.ts b/src/tasks/buildArtifact/BuildArtifactTaskProvider.ts index d5971de2..3fc0cb47 100644 --- a/src/tasks/buildArtifact/BuildArtifactTaskProvider.ts +++ b/src/tasks/buildArtifact/BuildArtifactTaskProvider.ts @@ -112,7 +112,7 @@ export class BuildArtifactTaskProvider implements TaskProvider { entry: undefined, taskLabel: resolvedDefinition.label || folder.name, workspaceFolder: folder, - projectList: projectList, + projectList, steps: [], elements: [], classpaths: [], @@ -166,7 +166,7 @@ export class BuildArtifactTaskProvider implements TaskProvider { entry: undefined, taskLabel: resolvedDefinition.label || folder.name, workspaceFolder: folder, - projectList: projectList, + projectList, steps: [], elements: [], classpaths: [], diff --git a/src/views/nodeFactory.ts b/src/views/nodeFactory.ts index 7706477e..460241db 100644 --- a/src/views/nodeFactory.ts +++ b/src/views/nodeFactory.ts @@ -88,6 +88,6 @@ export class NodeFactory { sendError(new Error(`Unsupported node kind: ${nodeData.kind}`)); return undefined; } - + } } diff --git a/test/index.ts b/test/index.ts index 69934a3f..66d0b20a 100644 --- a/test/index.ts +++ b/test/index.ts @@ -82,6 +82,18 @@ async function main(): Promise { ], }); + + // Run multi module test + await runTests({ + vscodeExecutablePath, + extensionDevelopmentPath, + extensionTestsPath: path.resolve(__dirname, "./multi-module-suite"), + launchArgs: [ + path.join(__dirname, "..", "..", "test", "multi-module"), + `--user-data-dir=${userDir}`, + ], + }); + process.exit(0); } catch (err) { diff --git a/test/maven-suite/projectView.test.ts b/test/maven-suite/projectView.test.ts index 91c5db09..f6863758 100644 --- a/test/maven-suite/projectView.test.ts +++ b/test/maven-suite/projectView.test.ts @@ -5,7 +5,7 @@ import * as assert from "assert"; import * as vscode from "vscode"; import { Commands, ContainerNode, contextManager, DataNode, DependencyExplorer, FileNode, INodeData, Jdtls, NodeKind, PackageNode, PackageRootNode, PrimaryTypeNode, ProjectNode } from "../../extension.bundle"; -import { fsPath, setupTestEnv, Uris } from "../shared"; +import { fsPath, printNodes, setupTestEnv, Uris } from "../shared"; // tslint:disable: only-arrow-functions suite("Maven Project View Tests", () => { @@ -26,7 +26,7 @@ suite("Maven Project View Tests", () => { const projectChildren = await projectNode.getChildren(); assert.ok(!!projectChildren.find((c: DataNode) => c.name === "pom.xml")); assert.ok(!!projectChildren.find((c: DataNode) => c.name === ".vscode")); - assert.equal(projectChildren.length, 8, "Number of children should be 8"); + assert.equal(projectChildren.length, 8, `Number of children should be 8, but was ${projectChildren.length}.\n${printNodes(projectChildren)}`); const mainPackage = projectChildren[0] as PackageRootNode; assert.equal(mainPackage.name, "src/main/java", "Package name should be \"src/main/java\""); @@ -101,8 +101,8 @@ suite("Maven Project View Tests", () => { const testSourceSetChildren = await testPackage.getChildren(); assert.equal(testSourceSetChildren.length, 1, "Number of test sub packages should be 1"); const testSubPackage = testSourceSetChildren[0] as PackageNode; - - + + assert.equal(testSubPackage.name, "com.mycompany.app", "Name of test subpackage should be \"com.mycompany.app\""); // validate innermost layer nodes @@ -252,4 +252,14 @@ suite("Maven Project View Tests", () => { const projectChildren = await projectNode.getChildren(); assert.equal(projectChildren.length, 4); }); + + teardown(async () => { + // Restore default settings. Some tests might alter them and others depend on a specific setting. + // Not resetting to the default settings will also show the file as changed in the source control view. + await vscode.workspace.getConfiguration("java.project.explorer").update( + "showNonJavaResources", + true + ); + await vscode.workspace.getConfiguration("java.dependency").update("packagePresentation", "flat"); + }); }); diff --git a/test/maven/.vscode/settings.json b/test/maven/.vscode/settings.json index ee7bd904..d70f7c04 100644 --- a/test/maven/.vscode/settings.json +++ b/test/maven/.vscode/settings.json @@ -1,6 +1,19 @@ { "java.server.launchMode": "Standard", + "java.dependency.packagePresentation": "flat", + "java.dependency.autoRefresh": true, + "java.dependency.syncWithFolderExplorer": true, + "java.project.explorer.showNonJavaResources": true, + // The test code does not expect a .classpath, .settings and .project file to be created. + // If the test is run on a developer machine, the user settings will be inherited and it might be set there. + "java.import.generatesMetadataFilesAtProjectRoot": false, "files.exclude": { "**/.hidden": true, + // Overwrite user settings, if they exist + "**/.classpath": false, + "**/.factorypath": false, + "**/.project": false, + "**/.settings": false, + "**/target": false } } diff --git a/test/multi-module-suite/index.ts b/test/multi-module-suite/index.ts new file mode 100644 index 00000000..3e503ad8 --- /dev/null +++ b/test/multi-module-suite/index.ts @@ -0,0 +1,41 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT license. + +import * as glob from "glob"; +import * as Mocha from "mocha"; +import * as path from "path"; + +export function run(): Promise { + // Create the mocha test + const mocha = new Mocha({ + ui: "tdd", + color: true, + timeout: 1 * 60 * 1000, + }); + + const testsRoot = __dirname; + + return new Promise((c, e) => { + glob("**/**.test.js", { cwd: testsRoot }, (err, files) => { + if (err) { + return e(err); + } + + // Add files to the test suite + files.forEach((f) => mocha.addFile(path.resolve(testsRoot, f))); + + try { + // Run the mocha test + mocha.run((failures) => { + if (failures > 0) { + e(new Error(`${failures} tests failed.`)); + } else { + c(); + } + }); + } catch (err) { + e(err); + } + }); + }); +} diff --git a/test/multi-module-suite/projectView.test.ts b/test/multi-module-suite/projectView.test.ts new file mode 100644 index 00000000..e54e9336 --- /dev/null +++ b/test/multi-module-suite/projectView.test.ts @@ -0,0 +1,25 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT license. + +import * as assert from "assert"; +import { contextManager, DependencyExplorer, + FileNode, + ProjectNode } from "../../extension.bundle"; +import { printNodes, setupTestEnv } from "../shared"; + +// tslint:disable: only-arrow-functions +suite("Multi Module Tests", () => { + + suiteSetup(setupTestEnv); + + test("Can open module with name equal or longer than folder name correctly", async function() { + const explorer = DependencyExplorer.getInstance(contextManager.context); + + const roots = await explorer.dataProvider.getChildren(); + const nestedProjectNode = roots?.find(project => + project instanceof ProjectNode && project.name === 'de.myorg.myservice.level1') as ProjectNode; + + const projectChildren = await nestedProjectNode.getChildren(); + assert.ok(!!projectChildren.find(child => child instanceof FileNode && child.path?.endsWith('level1/pom.xml'), `Expected to find FileNode with level1 pom.xml in:\n${printNodes(projectChildren)}`)); + }); +}); diff --git a/test/multi-module/.vscode/settings.json b/test/multi-module/.vscode/settings.json new file mode 100644 index 00000000..1759e992 --- /dev/null +++ b/test/multi-module/.vscode/settings.json @@ -0,0 +1,4 @@ +{ + "java.dependency.packagePresentation": "flat", + "java.import.generatesMetadataFilesAtProjectRoot": false +} \ No newline at end of file diff --git a/test/multi-module/level1/pom.xml b/test/multi-module/level1/pom.xml new file mode 100644 index 00000000..a70a0c09 --- /dev/null +++ b/test/multi-module/level1/pom.xml @@ -0,0 +1,21 @@ + + 4.0.0 + + fvclaus + de.myorg.myservice + 1.0-SNAPSHOT + + de.myorg.myservice.level1 + jar + 1.0-SNAPSHOT + http://maven.apache.org + + + junit + junit + 3.8.1 + test + + + \ No newline at end of file diff --git a/test/multi-module/pom.xml b/test/multi-module/pom.xml new file mode 100644 index 00000000..731fc1ea --- /dev/null +++ b/test/multi-module/pom.xml @@ -0,0 +1,12 @@ + + 4.0.0 + fvclaus + de.myorg.myservice + pom + 1.0-SNAPSHOT + http://maven.apache.org + + level1 + + diff --git a/test/multi-module/src/main/java/fvclaus/App.java b/test/multi-module/src/main/java/fvclaus/App.java new file mode 100644 index 00000000..9225dba0 --- /dev/null +++ b/test/multi-module/src/main/java/fvclaus/App.java @@ -0,0 +1,13 @@ +package fvclaus; + +/** + * Hello world! + * + */ +public class App +{ + public static void main( String[] args ) + { + System.out.println( "Hello World!" ); + } +} diff --git a/test/multi-module/src/test/java/fvclaus/AppTest.java b/test/multi-module/src/test/java/fvclaus/AppTest.java new file mode 100644 index 00000000..1b28eaa3 --- /dev/null +++ b/test/multi-module/src/test/java/fvclaus/AppTest.java @@ -0,0 +1,38 @@ +package fvclaus; + +import junit.framework.Test; +import junit.framework.TestCase; +import junit.framework.TestSuite; + +/** + * Unit test for simple App. + */ +public class AppTest + extends TestCase +{ + /** + * Create the test case + * + * @param testName name of the test case + */ + public AppTest( String testName ) + { + super( testName ); + } + + /** + * @return the suite of tests being tested + */ + public static Test suite() + { + return new TestSuite( AppTest.class ); + } + + /** + * Rigourous Test :-) + */ + public void testApp() + { + assertTrue( true ); + } +} diff --git a/test/shared.ts b/test/shared.ts index a984c392..92c01e3b 100644 --- a/test/shared.ts +++ b/test/shared.ts @@ -3,7 +3,8 @@ import * as path from "path"; import { extensions, Uri } from "vscode"; -import { DataNode } from "../extension.bundle"; +import { DataNode, PackageNode } from "../extension.bundle"; +import { ExplorerNode } from "../src/views/explorerNode"; export namespace Uris { // Simple Project @@ -42,3 +43,15 @@ export async function setupTestEnv() { await extensions.getExtension("redhat.java")!.activate(); await extensions.getExtension("vscjava.vscode-java-dependency")!.activate(); } + +export function printNodes(nodes: ExplorerNode[]) { + return nodes.map(node => { + if (node instanceof DataNode) { + return `DataNode: ${node.name}`; + } + if (node instanceof PackageNode) { + return `PackageNode: ${node.name}`; + } + return `UnknownNode: ${node.constructor.name}`; + }).join('\n'); +} diff --git a/test/ui/command.test.ts b/test/ui/command.test.ts index a7e72b76..083fd8ab 100644 --- a/test/ui/command.test.ts +++ b/test/ui/command.test.ts @@ -3,10 +3,10 @@ import * as assert from "assert"; import * as fse from "fs-extra"; -import { platform } from "os"; +import { platform, tmpdir } from "os"; import * as path from "path"; import * as seleniumWebdriver from "selenium-webdriver"; -import { EditorView, InputBox, ModalDialog, SideBarView, TextEditor, TreeItem, VSBrowser, Workbench } from "vscode-extension-tester"; +import { ActivityBar, By, InputBox, ModalDialog, SideBarView, StatusBar, TextEditor, TreeItem, VSBrowser, ViewSection, Workbench } from "vscode-extension-tester"; import { sleep } from "../util"; // tslint:disable: only-arrow-functions @@ -14,47 +14,72 @@ const newProjectName = "helloworld"; const testFolder = path.join(__dirname, "..", "..", "..", "test"); const mavenProjectPath = path.join(testFolder, "maven"); const invisibleProjectPath = path.join(testFolder, "invisible"); -const targetPath = path.join(testFolder, "newProject"); + +// async function pauseInPipeline(timeInMs: number): Promise { +// if (process.env.GITHUB_ACTIONS) { +// return sleep(timeInMs); +// } else { +// return Promise.resolve(); +// } +// } describe("Command Tests", function() { - let browser: VSBrowser; this.timeout(2 * 60 * 1000 /*ms*/); + const mavenProjectTmpFolders: string[] = []; + let currentProjectPath: string | undefined; - before(async function() { - browser = VSBrowser.instance; - sleep(5000); - }); + function createTmpProjectFolder(projectName: string) { + const tmpFolder = fse.mkdtempSync(path.join(tmpdir(), 'vscode-java-dependency-ui-test')); + // Keep the folder name. + const projectFolder = path.join(tmpFolder, projectName); + fse.mkdirSync(projectFolder); + mavenProjectTmpFolders.push(tmpFolder); + return projectFolder; + } - beforeEach(async function() { - await sleep(5000); - }); + async function openProject(projectPath: string) { + const projectFolder = createTmpProjectFolder(path.basename(projectPath)); + // Copy to avoid restoring after each test run to revert changes done during the test. + fse.copySync(projectPath, projectFolder); + await VSBrowser.instance.openResources(projectFolder); + currentProjectPath = projectFolder; + await ensureExplorerIsOpen(); + } - it("Test open maven project", async function() { - await browser.openResources(mavenProjectPath); - // Close welcome editors - let editorView = new EditorView(); - let editorGroups = await editorView.getEditorGroups(); - for (const editorGroup of editorGroups) { - await editorGroup.closeAllEditors(); + async function waitForLanguageServerReady() { + const statusBar = new StatusBar(); + while (true) { + const language = await statusBar.getCurrentLanguage(); + if (language === 'Java') { + break; + } } - const settingsEditor = await new Workbench().openSettings(); - const refreshSetting = await settingsEditor.findSetting("Auto Refresh", "Java", "Dependency"); - await refreshSetting.setValue(true); - const viewSetting = await settingsEditor.findSetting("Package Presentation", "Java", "Dependency"); - await viewSetting.setValue("flat"); - // Close setting editor - editorView = new EditorView(); - editorGroups = await editorView.getEditorGroups(); - for (const editorGroup of editorGroups) { - await editorGroup.closeAllEditors(); + while (true) { + try { + const languageStatus = await statusBar.findElement(By.xpath('//*[@id="status.languageStatus"]')); + await languageStatus.click(); + await languageStatus.findElement(By.xpath(`//div[contains(@class, 'context-view')]//div[contains(@class, 'hover-language-status')]//span[contains(@class, 'codicon-thumbsup')]`)); + break; + } catch (e) { + await sleep(100); + } } - await sleep(1000); - const fileSections = await new SideBarView().getContent().getSections(); - await fileSections[0].collapse(); - await sleep(60 * 1000 /*ms*/); + } + + before(async function() { + await openProject(mavenProjectPath); + await openFile('App.java'); + await waitForLanguageServerReady(); }); + after(async function() { + mavenProjectTmpFolders.forEach(mavenProjectTmpFolder => { + fse.rmSync(mavenProjectTmpFolder, {force: true, recursive: true}); + }); + }); + + it("Test javaProjectExplorer.focus", async function() { await new Workbench().executeCommand("javaProjectExplorer.focus"); const section = await new SideBarView().getContent().getSection("Java Projects"); @@ -62,20 +87,9 @@ describe("Command Tests", function() { }); (platform() === "darwin" ? it.skip : it)("Test java.view.package.linkWithFolderExplorer", async function() { - const fileSections = await new SideBarView().getContent().getSections(); - await fileSections[0].expand(); - const srcNode = await fileSections[0].findItem("src") as TreeItem; - await srcNode.expand(); - const folderNode = await fileSections[0].findItem("main") as TreeItem; - await folderNode.expand(); - const subFolderNode = await fileSections[0].findItem("app") as TreeItem; - await subFolderNode.expand(); - const fileNode = await fileSections[0].findItem("App.java") as TreeItem; - await fileNode.click(); + await openFile('App.java'); await sleep(1000); - await fileSections[0].collapse(); - const section = await new SideBarView().getContent().getSection("Java Projects"); - await section.expand(); + const [, section] = await expandInJavaProjects('my-app'); const packageNode = await section.findItem("com.mycompany.app") as TreeItem; assert.ok(await packageNode.isExpanded(), `Package node "com.mycompany.app" should be expanded`); const classNode = await section.findItem("App") as TreeItem; @@ -84,30 +98,24 @@ describe("Command Tests", function() { }); (platform() === "darwin" ? it.skip : it)("Test java.view.package.unLinkWithFolderExplorer", async function() { - const section = await new SideBarView().getContent().getSection("Java Projects"); - const moreActions = await section.moreActions(); - const desynchronize = await moreActions?.getItem("Desynchronize with Editor"); - await desynchronize?.click(); - const fileSections = await new SideBarView().getContent().getSections(); - await fileSections[0].expand(); - const fileNode = await fileSections[0].findItem("App.java") as TreeItem; - await fileNode.click(); + const [, section] = await expandInJavaProjects('my-app'); + await section.click(); + let moreActions = await section.moreActions(); + const desynchronize = await moreActions!.getItem("Unlink with Editor"); + await desynchronize!.click(); + await openFile('App.java'); await sleep(1000); - await fileSections[0].collapse(); - await section.expand(); const packageNode = await section.findItem("com.mycompany.app") as TreeItem; assert.ok(!await packageNode.isExpanded(), `Package "com.mycompany.app" should not be expanded`); + moreActions = await section.moreActions(); + const link = await moreActions!.getItem("Link with Editor"); + await link!.click(); }); it("Test java.view.package.newJavaClass", async function() { - const section = await new SideBarView().getContent().getSection("Java Projects"); - const item = await section.findItem("my-app") as TreeItem; - assert.ok(item, `Project "my-app" should be found`); - await item.click(); - const button = await item.getActionButton("New Java Class"); - assert.ok(button, `Button "New Java Class" should be found`); - await button!.click(); - let inputBox = await InputBox.create(); + let inputBox = await createJavaResource(); + const javaClassQuickPick = await inputBox.findQuickPick("Java Class"); + await javaClassQuickPick!.click(); assert.ok(await inputBox.getPlaceHolder() === "Choose a source folder", `InputBox "Choose a source folder" should appear`); const quickPick = await inputBox.findQuickPick("src/main/java"); assert.ok(quickPick, `Quickpick item "src/main/java" should be found`); @@ -120,22 +128,16 @@ describe("Command Tests", function() { const editor = new TextEditor(); await editor.save(); assert.ok(await editor.getTitle() === "App2.java", `Editor's title should be "App2.java"`); - assert.ok(await fse.pathExists(path.join(mavenProjectPath, "src", "main", "java", "App2.java")), `"App2.java" should be created in correct path`); - await fse.remove(path.join(mavenProjectPath, "src", "main", "java", "App2.java")); + assert.ok(await fse.pathExists(path.join(currentProjectPath!, "src", "main", "java", "App2.java")), `"App2.java" should be created in correct path`); }); (platform() === "darwin" ? it.skip : it)("Test java.view.package.newPackage", async function() { // The current UI test framework doesn't support mac title bar and context menus. // See: https://github.com/redhat-developer/vscode-extension-tester#requirements // So we dismiss some UI tests on mac. - const section = await new SideBarView().getContent().getSection("Java Projects"); - const item = await section.findItem("my-app") as TreeItem; - await item.click(); - const contextMenu = await item.openContextMenu(); - const newPackageItem = await contextMenu.getItem("New Package"); - assert.ok(newPackageItem, `"New Package" should be found in context menu`); - await newPackageItem!.click(); - let inputBox = await InputBox.create(); + let inputBox = await createJavaResource(); + const packageQuickPick = await inputBox.findQuickPick('Package'); + await packageQuickPick!.click(); const quickPick = await inputBox.findQuickPick("src/main/java"); assert.ok(quickPick, `"src/main/java" should be found in quickpick items`); await quickPick!.click(); @@ -143,35 +145,34 @@ describe("Command Tests", function() { await inputBox.setText("com.mycompany.app2"); await inputBox.confirm(); await sleep(1000); - assert.ok(await fse.pathExists(path.join(mavenProjectPath, "src", "main", "java", "com", "mycompany", "app2")), `New package should be created in correct path`); - await fse.remove(path.join(mavenProjectPath, "src", "main", "java", "com", "mycompany", "app2")); + assert.ok(await fse.pathExists(path.join(currentProjectPath!, "src", "main", "java", "com", "mycompany", "app2")), `New package should be created in correct path`); }); (platform() === "darwin" ? it.skip : it)("Test java.view.package.revealInProjectExplorer", async function() { - const fileExplorerSections = await new SideBarView().getContent().getSections(); - await fileExplorerSections[0].expand(); + // Make sure App.java is not currently revealed in Java Projects const section = await new SideBarView().getContent().getSection("Java Projects"); - const packageNode = await section.findItem("com.mycompany.app") as TreeItem; - await packageNode.click(); - await packageNode.collapse(); - const srcNode = await fileExplorerSections[0].findItem("src") as TreeItem; - await srcNode.expand(); - const folderNode = await fileExplorerSections[0].findItem("main") as TreeItem; - await folderNode.expand(); - const fileNode = await fileExplorerSections[0].findItem("App.java") as TreeItem; - const menu = await fileNode.openContextMenu(); - const revealItem = await menu.getItem("Reveal in Java Project Explorer"); + const item = await section.findItem("my-app") as TreeItem; + await item.collapse(); + const [fileSection, fileNode] = await openAppJavaSourceCode(); + await fileNode.openContextMenu(); + // menu.getItem(label) does not work. I did not investigate this further. + // This is a global selector on purpose. The context-menu is located near the root node. + const revealItem = await fileNode.findElement(By.xpath(`//div[contains(@class, 'context-view')]//a[@role='menuitem' and span[contains(text(), 'Reveal in Java Project Explorer')]]`)); + // const revealItem = await menu.getItem("Reveal in Java Project Explorer"); assert.ok(revealItem, `Item "Reveal in Java Project Explorer" should be found in context menu`); await revealItem!.click(); const classNode = await section.findItem("App") as TreeItem; assert.ok(await classNode.isDisplayed(), `Class Node "App" should be revealed`); - await fileExplorerSections[0].collapse(); + await fileSection.collapse(); }); (platform() === "darwin" ? it.skip : it)("Test java.view.package.renameFile", async function() { - const section = await new SideBarView().getContent().getSection("Java Projects"); - await section.click(); + // Collapse file section to make sure that the AppToRename tree item fits in the current viewport. + // .findItem will only find tree items in the current viewport. + await collapseFileSection(); + const section = await expandMainCodeInJavaProjects(); const classNode = await section.findItem("AppToRename") as TreeItem; + assert.ok(classNode, `AppToRename.java should be found`); await classNode.click(); const menu = await classNode.openContextMenu(); const renameItem = await menu.getItem("Rename"); @@ -197,11 +198,18 @@ describe("Command Tests", function() { }); (platform() === "darwin" ? it.skip : it)("Test java.view.package.moveFileToTrash", async function() { - const section = await new SideBarView().getContent().getSection("Java Projects"); + // Collapse file section to make sure that the AppToRename tree item fits in the current viewport. + // .findItem will only find tree items in the current viewport. + await collapseFileSection(); + const section = await expandMainCodeInJavaProjects(); const classNode = await section.findItem("AppToDelete") as TreeItem; await classNode.click(); const menu = await classNode.openContextMenu(); - const deleteItem = await menu.getItem("Delete"); + let deleteItem = await menu.getItem("Delete"); + // Not sure why sometimes one is visible and other times the other. + if (deleteItem === undefined) { + deleteItem = await menu.getItem("Delete Permanently"); + } assert.ok(deleteItem, `"Delete" item should be found`); await deleteItem!.click(); const dialog = new ModalDialog(); @@ -213,58 +221,48 @@ describe("Command Tests", function() { } } await sleep(1000); - assert.ok(!await fse.pathExists(path.join(mavenProjectPath, "src", "main", "java", "AppToDelete.java")), `The source file "AppToDelete.java" should be deleted`); + assert.ok(!await fse.pathExists(path.join(currentProjectPath!, "src", "main", "java", "AppToDelete.java")), `The source file "AppToDelete.java" should be deleted`); }); it("Test change to invisible project", async function() { - await browser.openResources(invisibleProjectPath); + await openProject(invisibleProjectPath); await sleep(1000); - const fileExplorerSections = await new SideBarView().getContent().getSections(); - const folderNode = await fileExplorerSections[0].findItem("src") as TreeItem; - await folderNode.expand(); - const fileNode = await fileExplorerSections[0].findItem("App.java") as TreeItem; - await fileNode.click(); - await sleep(60 * 1000 /*ms*/); + await openFile('App.java'); + await waitForLanguageServerReady(); const fileSections = await new SideBarView().getContent().getSections(); await fileSections[0].collapse(); await new Workbench().executeCommand("javaProjectExplorer.focus"); }); it("Test java.project.addLibraries", async function() { - const section = await new SideBarView().getContent().getSection("Java Projects"); - const projectItem = await section.findItem("invisible") as TreeItem; - await projectItem.expand(); - await sleep(1000); - let referencedItem = await section.findItem("Referenced Libraries") as TreeItem; + // tslint:disable-next-line:prefer-const + let [referencedItem, section] = await expandInJavaProjects('invisible', 'Referenced Libraries'); await referencedItem.click(); - const buttons = await referencedItem.getActionButtons(); - await buttons[0].click(); + await clickActionButton(referencedItem, `Add Jar Libraries to Project Classpath...`); const input = await InputBox.create(); await input.setText(path.join(invisibleProjectPath, "libSource", "simple.jar")); await input.confirm(); await sleep(5000); referencedItem = await section.findItem("Referenced Libraries") as TreeItem; await referencedItem.expand(); - const simpleItem = await section.findItem("simple.jar") as TreeItem; + let simpleItem = await section.findItem("simple.jar") as TreeItem; assert.ok(simpleItem, `Library "simple.jar" should be found`); await simpleItem.click(); - const libraryButtons = await simpleItem.getActionButtons(); - await libraryButtons[0].click(); + await clickActionButton(simpleItem, 'Remove from Project Classpath'); await sleep(5000); + simpleItem = await section.findItem("simple.jar") as TreeItem; + assert.ok(!simpleItem, `Library "simple.jar" should not be found`); }); it("Test java.project.addLibraryFolders", async function() { - const section = await new SideBarView().getContent().getSection("Java Projects"); - const projectItem = await section.findItem("invisible") as TreeItem; - await projectItem.expand(); - await sleep(1000); - let referencedItem = await section.findItem("Referenced Libraries") as TreeItem; + // tslint:disable-next-line:prefer-const + let [referencedItem, section] = await expandInJavaProjects('invisible', 'Referenced Libraries'); await referencedItem.click(); - const buttons = await referencedItem.getActionButtons(); - await buttons[0].getDriver().actions() + const button = await getActionButton(referencedItem, `Add Jar Libraries to Project Classpath...`); + await button.getDriver().actions() // .mouseMove(buttons[0]) .keyDown(seleniumWebdriver.Key.ALT) - .click(buttons[0]) + .click(button) .keyUp(seleniumWebdriver.Key.ALT) .perform(); await sleep(5000); @@ -278,7 +276,8 @@ describe("Command Tests", function() { }); it("Test java.project.create", async function() { - await fse.ensureDir(targetPath); + const projectFolder = createTmpProjectFolder("newProject"); + await fse.ensureDir(projectFolder); await new Workbench().executeCommand("java.project.create"); let inputBox = await InputBox.create(); const picks = await inputBox.getQuickPicks(); @@ -286,14 +285,107 @@ describe("Command Tests", function() { await picks[0].select(); await sleep(3000); inputBox = await InputBox.create(); - await inputBox.setText(targetPath); + await inputBox.setText(projectFolder); await inputBox.confirm(); await sleep(3000); inputBox = await InputBox.create(); await inputBox.setText(newProjectName); await inputBox.confirm(); await sleep(5000); - assert.ok(await fse.pathExists(path.join(targetPath, newProjectName, "src", "App.java")), `The template source file should be created`); - assert.ok(await fse.pathExists(path.join(targetPath, newProjectName, "README.md")), `The template README file should be created`); + assert.ok(await fse.pathExists(path.join(projectFolder, newProjectName, "src", "App.java")), `The template source file should be created`); + assert.ok(await fse.pathExists(path.join(projectFolder, newProjectName, "README.md")), `The template README file should be created`); }); + + }); + +async function collapseFileSection() { + const fileSections = await new SideBarView().getContent().getSections(); + await fileSections[0].collapse(); +} + +async function expandMainCodeInJavaProjects() { + const section = await new SideBarView().getContent().getSection("Java Projects"); + await section.click(); + const appNode = await section.findItem("my-app") as TreeItem; + await appNode.expand(); + const srcFolderNode = await section.findItem('src/main/java') as TreeItem; + await srcFolderNode.expand(); + const packageNode = await section.findItem("com.mycompany.app") as TreeItem; + await packageNode.expand(); + return section; +} + +async function expandInJavaProjects(label: string, ...otherLabels: string[]): Promise<[TreeItem, ViewSection]> { + // Collapse file section to make sure that the AppToRename tree item fits in the current viewport. + // .findItem will only find tree items in the current viewport. + await collapseFileSection(); + const section = await new SideBarView().getContent().getSection("Java Projects"); + await section.click(); + let lastNode = await section.findItem(label) as TreeItem; + await lastNode.expand(); + for (const otherLabel of otherLabels) { + lastNode = await section.findItem(otherLabel) as TreeItem; + await lastNode.expand(); + } + return [lastNode, section]; +} + +async function openFile(filename: string) { + await new Workbench().executeCommand('workbench.action.quickOpen'); + const fileInputBox = await InputBox.create(); + await fileInputBox.setText(filename); + await fileInputBox.confirm(); +} + +async function openAppJavaSourceCode(): Promise<[ViewSection, TreeItem]> { + const fileSections = await new SideBarView().getContent().getSections(); + await fileSections[0].expand(); + const srcNode = await fileSections[0].findItem("src") as TreeItem; + await srcNode.expand(); + const folderNode = await fileSections[0].findItem("main") as TreeItem; + await folderNode.expand(); + const subFolderNode = await fileSections[0].findItem("com") as TreeItem; + await subFolderNode.expand(); + const appFolderNode = await fileSections[0].findItem("app") as TreeItem; + await appFolderNode.expand(); + const fileNode = await fileSections[0].findItem("App.java") as TreeItem; + await fileNode.click(); + return [fileSections[0], fileNode]; +} + +async function createJavaResource() { + await collapseFileSection(); + const section = await new SideBarView().getContent().getSection("Java Projects"); + const item = await section.findItem("my-app") as TreeItem; + assert.ok(item, `Project "my-app" should be found`); + await item.click(); + await clickActionButton(item, 'New...'); + const inputBox = await InputBox.create(); + assert.ok(await inputBox.getPlaceHolder() === "Select resource type to create.", + `InputBox "Select resource type to create" should appear.`); + return inputBox; +} + +async function clickActionButton(item: TreeItem, label: string) { + const button = await getActionButton(item, label); + await button.click(); +} + +async function getActionButton(item: TreeItem, label: string) { + // Using item.getActionButton('New...') throws an error: + // tslint:disable-next-line:max-line-length + // "no such element: Unable to locate element: {\"method\":\"xpath\",\"selector\":\".//a[contains(@class, 'action-label') and @role='button' and @title='New...']\"} + // This should be filled as an issue (I haven't find one). + // The problem is the @title='New...' which should be @aria-label='New...' for vscode 1.77.0 (and probably above). + return item.findElement(By.xpath(`.//a[contains(@class, 'action-label') and @role='button' and contains(@aria-label, '${label}')]`)); +} + +async function ensureExplorerIsOpen() { + const control = await new ActivityBar().getViewControl('Explorer'); + if (control === undefined) { + throw new Error(`Explorer control should not be null.`); + } + await control.openView(); +} + diff --git a/webpack.config.js b/webpack.config.js index 8c079ea0..ead14fd8 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -37,6 +37,7 @@ const config = { ], externals: { vscode: "commonjs vscode", // the vscode-module is created on-the-fly and must be excluded. Add other modules that cannot be webpack'ed, 📖 -> https://webpack.js.org/configuration/externals/ + 'applicationinsights-native-metrics': 'commonjs applicationinsights-native-metrics' // https://github.com/microsoft/vscode-extension-telemetry/issues/41#issuecomment-598852991 }, devtool: 'source-map', resolve: { // support reading TypeScript and JavaScript files, 📖 -> https://github.com/TypeStrong/ts-loader From 73c73def0e4684bccdae45a6f9561c18de6cff39 Mon Sep 17 00:00:00 2001 From: Sheng Chen Date: Thu, 26 Oct 2023 22:58:20 -0700 Subject: [PATCH 178/352] build: Prepare for 0.23.2 (#796) --- CHANGELOG.md | 7 +++++++ .../com.microsoft.jdtls.ext.core/META-INF/MANIFEST.MF | 2 +- jdtls.ext/com.microsoft.jdtls.ext.core/pom.xml | 2 +- jdtls.ext/com.microsoft.jdtls.ext.target/pom.xml | 2 +- jdtls.ext/pom.xml | 2 +- package-lock.json | 4 ++-- package.json | 4 ++-- 7 files changed, 15 insertions(+), 8 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 188fe709..409fea51 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,13 @@ All notable changes to the "vscode-java-dependency" extension will be documented The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/) and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html). +## 0.23.2 +### Fixed +- Improve wording in Java Projects view. [PR#785](https://github.com/microsoft/vscode-java-dependency/pull/785) +- Support showing Gradle sub-menu for projects imported by Gradle build server. [PR#786](https://github.com/microsoft/vscode-java-dependency/pull/786) +- Update extension names in creating Java projects menu. [PR#790](https://github.com/microsoft/vscode-java-dependency/pull/790) +- Maven multi-module project doesn't correctly open modules. [#766](https://github.com/microsoft/vscode-java-dependency/issues/766) + ## 0.23.1 ### Removed - Removed marketplace preview flag. [PR#780](https://github.com/microsoft/vscode-java-dependency/pull/780) diff --git a/jdtls.ext/com.microsoft.jdtls.ext.core/META-INF/MANIFEST.MF b/jdtls.ext/com.microsoft.jdtls.ext.core/META-INF/MANIFEST.MF index 55fe75a8..431b9f8c 100644 --- a/jdtls.ext/com.microsoft.jdtls.ext.core/META-INF/MANIFEST.MF +++ b/jdtls.ext/com.microsoft.jdtls.ext.core/META-INF/MANIFEST.MF @@ -2,7 +2,7 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: JDTLS EXT Core Bundle-SymbolicName: com.microsoft.jdtls.ext.core;singleton:=true -Bundle-Version: 0.23.1 +Bundle-Version: 0.23.2 Bundle-Activator: com.microsoft.jdtls.ext.core.JdtlsExtActivator Bundle-RequiredExecutionEnvironment: JavaSE-11 Bundle-ActivationPolicy: lazy diff --git a/jdtls.ext/com.microsoft.jdtls.ext.core/pom.xml b/jdtls.ext/com.microsoft.jdtls.ext.core/pom.xml index be3ff1f4..5c6a1e6b 100644 --- a/jdtls.ext/com.microsoft.jdtls.ext.core/pom.xml +++ b/jdtls.ext/com.microsoft.jdtls.ext.core/pom.xml @@ -5,7 +5,7 @@ com.microsoft.jdtls.ext jdtls-ext-parent - 0.23.1 + 0.23.2 com.microsoft.jdtls.ext.core eclipse-plugin diff --git a/jdtls.ext/com.microsoft.jdtls.ext.target/pom.xml b/jdtls.ext/com.microsoft.jdtls.ext.target/pom.xml index fde7e0b0..cd0f9290 100644 --- a/jdtls.ext/com.microsoft.jdtls.ext.target/pom.xml +++ b/jdtls.ext/com.microsoft.jdtls.ext.target/pom.xml @@ -4,7 +4,7 @@ com.microsoft.jdtls.ext jdtls-ext-parent - 0.23.1 + 0.23.2 com.microsoft.jdtls.ext.tp ${base.name} :: Target Platform diff --git a/jdtls.ext/pom.xml b/jdtls.ext/pom.xml index 44549af8..48344633 100644 --- a/jdtls.ext/pom.xml +++ b/jdtls.ext/pom.xml @@ -4,7 +4,7 @@ com.microsoft.jdtls.ext jdtls-ext-parent ${base.name} :: Parent - 0.23.1 + 0.23.2 pom Java Project Manager diff --git a/package-lock.json b/package-lock.json index 0d1a48fa..e5eb40fc 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "vscode-java-dependency", - "version": "0.23.1", + "version": "0.23.2", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "vscode-java-dependency", - "version": "0.23.1", + "version": "0.23.2", "license": "MIT", "dependencies": { "await-lock": "^2.2.2", diff --git a/package.json b/package.json index 65a5d054..e8669558 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "vscode-java-dependency", "displayName": "Project Manager for Java", "description": "%description%", - "version": "0.23.1", + "version": "0.23.2", "publisher": "vscjava", "preview": false, "aiKey": "5c642b22-e845-4400-badb-3f8509a70777", @@ -46,7 +46,7 @@ "main": "./main.js", "contributes": { "javaExtensions": [ - "./server/com.microsoft.jdtls.ext.core-0.23.1.jar" + "./server/com.microsoft.jdtls.ext.core-0.23.2.jar" ], "commands": [ { From 54d8b0c1ace5969c77d713830153ffc277139a07 Mon Sep 17 00:00:00 2001 From: Sheng Chen Date: Thu, 26 Oct 2023 23:39:29 -0700 Subject: [PATCH 179/352] Update changelog (#797) --- CHANGELOG.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 409fea51..d7e20470 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,8 +8,8 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0. ### Fixed - Improve wording in Java Projects view. [PR#785](https://github.com/microsoft/vscode-java-dependency/pull/785) - Support showing Gradle sub-menu for projects imported by Gradle build server. [PR#786](https://github.com/microsoft/vscode-java-dependency/pull/786) -- Update extension names in creating Java projects menu. [PR#790](https://github.com/microsoft/vscode-java-dependency/pull/790) -- Maven multi-module project doesn't correctly open modules. [#766](https://github.com/microsoft/vscode-java-dependency/issues/766) +- Update extension names in creating Java projects menu. [PR#790](https://github.com/microsoft/vscode-java-dependency/pull/790), contributed by [@dbalek](https://github.com/dbalek) +- Maven multi-module project doesn't correctly open modules. [#766](https://github.com/microsoft/vscode-java-dependency/issues/766), contributed by [@fvclaus](https://github.com/fvclaus) ## 0.23.1 ### Removed From 1b9a90317cd701d0147fec1435f5a092eabab5a3 Mon Sep 17 00:00:00 2001 From: Sheng Chen Date: Tue, 7 Nov 2023 16:20:45 -0800 Subject: [PATCH 180/352] build: Update to tycho@4.0.3 and maven@3.9.3 (#798) Signed-off-by: Sheng Chen --- jdtls.ext/.mvn/wrapper/maven-wrapper.properties | 2 +- jdtls.ext/pom.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/jdtls.ext/.mvn/wrapper/maven-wrapper.properties b/jdtls.ext/.mvn/wrapper/maven-wrapper.properties index 56bb0164..9e0264d0 100644 --- a/jdtls.ext/.mvn/wrapper/maven-wrapper.properties +++ b/jdtls.ext/.mvn/wrapper/maven-wrapper.properties @@ -1 +1 @@ -distributionUrl=https://repo1.maven.org/maven2/org/apache/maven/apache-maven/3.5.0/apache-maven-3.5.0-bin.zip \ No newline at end of file +distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.9.3/apache-maven-3.9.3-bin.zip \ No newline at end of file diff --git a/jdtls.ext/pom.xml b/jdtls.ext/pom.xml index 48344633..940c3a66 100644 --- a/jdtls.ext/pom.xml +++ b/jdtls.ext/pom.xml @@ -9,7 +9,7 @@ Java Project Manager UTF-8 - 2.7.2 + 4.0.3 ${basedir} From b8e402fdb6b75bc699a848fd0eb8b247964fe2c4 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 13 Nov 2023 16:28:43 +0800 Subject: [PATCH 181/352] chore(deps): Bump axios and vscode-tas-client (#799) Bumps [axios](https://github.com/axios/axios) to 1.6.1 and updates ancestor dependency vscode-tas-client. These dependencies need to be updated together. Updates `axios` from 0.26.1 to 1.6.1 - [Release notes](https://github.com/axios/axios/releases) - [Changelog](https://github.com/axios/axios/blob/v1.x/CHANGELOG.md) - [Commits](https://github.com/axios/axios/compare/v0.26.1...v1.6.1) Updates `vscode-tas-client` from 0.1.63 to 0.1.75 --- updated-dependencies: - dependency-name: axios dependency-type: indirect - dependency-name: vscode-tas-client dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 147 ++++++++++++++++++++++++++++++++++------------ package.json | 2 +- 2 files changed, 112 insertions(+), 37 deletions(-) diff --git a/package-lock.json b/package-lock.json index e5eb40fc..ea42e4d9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -16,7 +16,7 @@ "minimatch": "^5.1.6", "semver": "^7.3.8", "vscode-extension-telemetry-wrapper": "^0.13.2", - "vscode-tas-client": "^0.1.63" + "vscode-tas-client": "^0.1.75" }, "devDependencies": { "@types/fs-extra": "^9.0.13", @@ -949,17 +949,24 @@ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", "dev": true }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, "node_modules/await-lock": { "version": "2.2.2", "resolved": "https://registry.npmjs.org/await-lock/-/await-lock-2.2.2.tgz", "integrity": "sha512-aDczADvlvTGajTDjcjpJMqRkOF6Qdz3YbPZm/PyW6tKPkx2hlYBzxMhEywM/tU72HrVZjgl5VCdRuMlA7pZ8Gw==" }, "node_modules/axios": { - "version": "0.26.1", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.26.1.tgz", - "integrity": "sha512-fPwcX4EvnSHuInCMItEhAGnaSEXRBjtzh9fOtsE6E1G6p7vl7edEeZe11QHf18+6+9gR5PbKV/sGKNaD8YaMeA==", + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.1.tgz", + "integrity": "sha512-vfBmhDpKafglh0EldBEbVuoe7DyAavGSLWhuSm5ZSEKQnHhBf0xAAwybbNH1IkrJNGnS/VG4I5yxig1pCEXE4g==", "dependencies": { - "follow-redirects": "^1.14.8" + "follow-redirects": "^1.15.0", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" } }, "node_modules/azure-devops-node-api": { @@ -1484,6 +1491,17 @@ "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", "dev": true }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/commander": { "version": "2.20.3", "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", @@ -1649,6 +1667,14 @@ "node": ">=10" } }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "engines": { + "node": ">=0.4.0" + } + }, "node_modules/detect-libc": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.2.tgz", @@ -2027,9 +2053,9 @@ } }, "node_modules/follow-redirects": { - "version": "1.15.2", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", - "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", + "version": "1.15.3", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.3.tgz", + "integrity": "sha512-1VzOtuEM8pC9SFU1E+8KfTjZyMztRsgEfwQl44z8A25uy13jSzTj6dyK2Df52iV0vgHCfBwLhDWevLn95w5v6Q==", "funding": [ { "type": "individual", @@ -2045,6 +2071,19 @@ } } }, + "node_modules/form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/form-data-encoder": { "version": "2.1.4", "resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-2.1.4.tgz", @@ -2957,7 +2996,6 @@ "version": "1.52.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "dev": true, "engines": { "node": ">= 0.6" } @@ -2966,7 +3004,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, "dependencies": { "mime-db": "1.52.0" }, @@ -3599,6 +3636,11 @@ "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", "dev": true }, + "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==" + }, "node_modules/pump": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", @@ -4290,11 +4332,11 @@ } }, "node_modules/tas-client": { - "version": "0.1.58", - "resolved": "https://registry.npmjs.org/tas-client/-/tas-client-0.1.58.tgz", - "integrity": "sha512-fOWii4wQXuo9Zl0oXgvjBzZWzKc5MmUR6XQWX93WU2c1SaP1plPo/zvXP8kpbZ9fvegFOHdapszYqMTRq/SRtg==", + "version": "0.1.73", + "resolved": "https://registry.npmjs.org/tas-client/-/tas-client-0.1.73.tgz", + "integrity": "sha512-UDdUF9kV2hYdlv+7AgqP2kXarVSUhjK7tg1BUflIRGEgND0/QoNpN64rcEuhEcM8AIbW65yrCopJWqRhLZ3m8w==", "dependencies": { - "axios": "^0.26.1" + "axios": "^1.6.1" } }, "node_modules/terser": { @@ -4903,11 +4945,11 @@ } }, "node_modules/vscode-tas-client": { - "version": "0.1.63", - "resolved": "https://registry.npmjs.org/vscode-tas-client/-/vscode-tas-client-0.1.63.tgz", - "integrity": "sha512-TY5TPyibzi6rNmuUB7eRVqpzLzNfQYrrIl/0/F8ukrrbzOrKVvS31hM3urE+tbaVrnT+TMYXL16GhX57vEowhA==", + "version": "0.1.75", + "resolved": "https://registry.npmjs.org/vscode-tas-client/-/vscode-tas-client-0.1.75.tgz", + "integrity": "sha512-/+ALFWPI4U3obeRvLFSt39guT7P9bZQrkmcLoiS+2HtzJ/7iPKNt5Sj+XTiitGlPYVFGFc0plxX8AAp6Uxs0xQ==", "dependencies": { - "tas-client": "0.1.58" + "tas-client": "0.1.73" }, "engines": { "vscode": "^1.19.1" @@ -6039,17 +6081,24 @@ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", "dev": true }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, "await-lock": { "version": "2.2.2", "resolved": "https://registry.npmjs.org/await-lock/-/await-lock-2.2.2.tgz", "integrity": "sha512-aDczADvlvTGajTDjcjpJMqRkOF6Qdz3YbPZm/PyW6tKPkx2hlYBzxMhEywM/tU72HrVZjgl5VCdRuMlA7pZ8Gw==" }, "axios": { - "version": "0.26.1", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.26.1.tgz", - "integrity": "sha512-fPwcX4EvnSHuInCMItEhAGnaSEXRBjtzh9fOtsE6E1G6p7vl7edEeZe11QHf18+6+9gR5PbKV/sGKNaD8YaMeA==", + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.1.tgz", + "integrity": "sha512-vfBmhDpKafglh0EldBEbVuoe7DyAavGSLWhuSm5ZSEKQnHhBf0xAAwybbNH1IkrJNGnS/VG4I5yxig1pCEXE4g==", "requires": { - "follow-redirects": "^1.14.8" + "follow-redirects": "^1.15.0", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" } }, "azure-devops-node-api": { @@ -6426,6 +6475,14 @@ "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", "dev": true }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "requires": { + "delayed-stream": "~1.0.0" + } + }, "commander": { "version": "2.20.3", "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", @@ -6539,6 +6596,11 @@ "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", "dev": true }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==" + }, "detect-libc": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.2.tgz", @@ -6818,9 +6880,19 @@ "dev": true }, "follow-redirects": { - "version": "1.15.2", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", - "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==" + "version": "1.15.3", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.3.tgz", + "integrity": "sha512-1VzOtuEM8pC9SFU1E+8KfTjZyMztRsgEfwQl44z8A25uy13jSzTj6dyK2Df52iV0vgHCfBwLhDWevLn95w5v6Q==" + }, + "form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + } }, "form-data-encoder": { "version": "2.1.4", @@ -7498,14 +7570,12 @@ "mime-db": { "version": "1.52.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "dev": true + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" }, "mime-types": { "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, "requires": { "mime-db": "1.52.0" } @@ -7989,6 +8059,11 @@ "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", "dev": true }, + "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==" + }, "pump": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", @@ -8490,11 +8565,11 @@ } }, "tas-client": { - "version": "0.1.58", - "resolved": "https://registry.npmjs.org/tas-client/-/tas-client-0.1.58.tgz", - "integrity": "sha512-fOWii4wQXuo9Zl0oXgvjBzZWzKc5MmUR6XQWX93WU2c1SaP1plPo/zvXP8kpbZ9fvegFOHdapszYqMTRq/SRtg==", + "version": "0.1.73", + "resolved": "https://registry.npmjs.org/tas-client/-/tas-client-0.1.73.tgz", + "integrity": "sha512-UDdUF9kV2hYdlv+7AgqP2kXarVSUhjK7tg1BUflIRGEgND0/QoNpN64rcEuhEcM8AIbW65yrCopJWqRhLZ3m8w==", "requires": { - "axios": "^0.26.1" + "axios": "^1.6.1" } }, "terser": { @@ -8942,11 +9017,11 @@ "requires": {} }, "vscode-tas-client": { - "version": "0.1.63", - "resolved": "https://registry.npmjs.org/vscode-tas-client/-/vscode-tas-client-0.1.63.tgz", - "integrity": "sha512-TY5TPyibzi6rNmuUB7eRVqpzLzNfQYrrIl/0/F8ukrrbzOrKVvS31hM3urE+tbaVrnT+TMYXL16GhX57vEowhA==", + "version": "0.1.75", + "resolved": "https://registry.npmjs.org/vscode-tas-client/-/vscode-tas-client-0.1.75.tgz", + "integrity": "sha512-/+ALFWPI4U3obeRvLFSt39guT7P9bZQrkmcLoiS+2HtzJ/7iPKNt5Sj+XTiitGlPYVFGFc0plxX8AAp6Uxs0xQ==", "requires": { - "tas-client": "0.1.58" + "tas-client": "0.1.73" } }, "watchpack": { diff --git a/package.json b/package.json index e8669558..aba8da47 100644 --- a/package.json +++ b/package.json @@ -901,6 +901,6 @@ "minimatch": "^5.1.6", "semver": "^7.3.8", "vscode-extension-telemetry-wrapper": "^0.13.2", - "vscode-tas-client": "^0.1.63" + "vscode-tas-client": "^0.1.75" } } From 69268d938cfb40fc2963455f5687d83e5343e4d6 Mon Sep 17 00:00:00 2001 From: Jinbo Wang Date: Fri, 24 Nov 2023 10:34:18 +0800 Subject: [PATCH 182/352] ux: Rephrase the menu names for new Java file command (#800) --- .../com.microsoft.jdtls.ext.tp.target | 5 +---- package.nls.json | 8 ++++---- package.nls.zh-cn.json | 6 +++--- package.nls.zh-tw.json | 6 +++--- src/explorerCommands/new.ts | 2 +- test/ui/command.test.ts | 2 +- 6 files changed, 13 insertions(+), 16 deletions(-) diff --git a/jdtls.ext/com.microsoft.jdtls.ext.target/com.microsoft.jdtls.ext.tp.target b/jdtls.ext/com.microsoft.jdtls.ext.target/com.microsoft.jdtls.ext.tp.target index fe9ad64a..830e17e6 100644 --- a/jdtls.ext/com.microsoft.jdtls.ext.target/com.microsoft.jdtls.ext.tp.target +++ b/jdtls.ext/com.microsoft.jdtls.ext.target/com.microsoft.jdtls.ext.tp.target @@ -14,11 +14,8 @@ - - - - + diff --git a/package.nls.json b/package.nls.json index 19c20d8d..c876d1f8 100644 --- a/package.nls.json +++ b/package.nls.json @@ -22,15 +22,15 @@ "contributes.commands.java.view.package.copyFilePath": "Copy Path", "contributes.commands.java.view.package.copyRelativeFilePath": "Copy Relative Path", "contributes.commands.java.view.package.new": "New...", - "contributes.commands.java.view.package.newJavaClass": "Java Class", - "contributes.commands.java.view.package.newPackage": "Package", - "contributes.commands.java.view.package.newFile": "File", + "contributes.commands.java.view.package.newJavaClass": "Java Class...", + "contributes.commands.java.view.package.newPackage": "Package...", + "contributes.commands.java.view.package.newFile": "File...", "contributes.commands.java.view.package.newFolder": "Folder", "contributes.commands.java.view.package.renameFile": "Rename", "contributes.commands.java.view.package.moveFileToTrash": "Delete", "contributes.commands.java.view.package.deleteFilePermanently": "Delete Permanently", "contributes.submenus.javaProject.new": "New", - "contributes.commands.java.view.menus.file.newJavaClass": "New Java Class", + "contributes.commands.java.view.menus.file.newJavaClass": "New Java File", "configuration.java.dependency.showMembers": "Show the members in the explorer", "configuration.java.dependency.syncWithFolderExplorer": "Link Java Projects Explorer with the active editor", "configuration.java.dependency.autoRefresh": "Synchronize Java Projects explorer with changes", diff --git a/package.nls.zh-cn.json b/package.nls.zh-cn.json index 4234ad53..ed5f3403 100644 --- a/package.nls.zh-cn.json +++ b/package.nls.zh-cn.json @@ -22,9 +22,9 @@ "contributes.commands.java.view.package.copyFilePath": "复制路径", "contributes.commands.java.view.package.copyRelativeFilePath": "复制相对路径", "contributes.commands.java.view.package.new": "创建...", - "contributes.commands.java.view.package.newJavaClass": "Java 类", - "contributes.commands.java.view.package.newPackage": "包", - "contributes.commands.java.view.package.newFile": "文件", + "contributes.commands.java.view.package.newJavaClass": "Java 类...", + "contributes.commands.java.view.package.newPackage": "包...", + "contributes.commands.java.view.package.newFile": "文件...", "contributes.commands.java.view.package.newFolder": "文件夹", "contributes.commands.java.view.package.renameFile": "重命名", "contributes.commands.java.view.package.moveFileToTrash": "删除", diff --git a/package.nls.zh-tw.json b/package.nls.zh-tw.json index fd27c378..94ac2499 100644 --- a/package.nls.zh-tw.json +++ b/package.nls.zh-tw.json @@ -20,9 +20,9 @@ "contributes.commands.java.view.package.copyFilePath": "複製路徑", "contributes.commands.java.view.package.copyRelativeFilePath": "複製相對路徑", "contributes.commands.java.view.package.new": "建立...", - "contributes.commands.java.view.package.newJavaClass": "Java 類別", - "contributes.commands.java.view.package.newPackage": "套件", - "contributes.commands.java.view.package.newFile": "檔案", + "contributes.commands.java.view.package.newJavaClass": "Java 類別...", + "contributes.commands.java.view.package.newPackage": "套件...", + "contributes.commands.java.view.package.newFile": "檔案...", "contributes.commands.java.view.package.newFolder": "資料夾", "contributes.commands.java.view.package.renameFile": "重新命名", "contributes.commands.java.view.package.moveFileToTrash": "刪除", diff --git a/src/explorerCommands/new.ts b/src/explorerCommands/new.ts index 509439db..bc835034 100644 --- a/src/explorerCommands/new.ts +++ b/src/explorerCommands/new.ts @@ -82,7 +82,7 @@ export async function newJavaClass(node?: DataNode): Promise { } const className: string | undefined = await window.showInputBox({ - placeHolder: "Input the class name", + placeHolder: "Enter the Java file name for class/interface/enum/record/@interface", ignoreFocusOut: true, validateInput: async (value: string): Promise => { const checkMessage: string = checkJavaQualifiedName(value); diff --git a/test/ui/command.test.ts b/test/ui/command.test.ts index 083fd8ab..7894907a 100644 --- a/test/ui/command.test.ts +++ b/test/ui/command.test.ts @@ -121,7 +121,7 @@ describe("Command Tests", function() { assert.ok(quickPick, `Quickpick item "src/main/java" should be found`); await quickPick!.click(); inputBox = await InputBox.create(); - assert.ok(await inputBox.getPlaceHolder() === "Input the class name", `InputBox "Input the class name" should appear`); + assert.ok(await inputBox.getPlaceHolder() === "Enter the Java file name for class/interface/enum/record/@interface", `InputBox "Enter the Java file name" should appear`); await inputBox.setText("App2"); await inputBox.confirm(); await sleep(1000); From a0dcf41bca18d9019796a5d6bb42bbebc269ba44 Mon Sep 17 00:00:00 2001 From: Jinbo Wang Date: Wed, 29 Nov 2023 16:57:08 +0800 Subject: [PATCH 183/352] feat: Improve the user experience of new Java file. (#801) --- ThirdPartyNotices.txt | 13 + .../jdtls/ext/core/model/PackageNode.java | 55 ++-- package-lock.json | 17 ++ package.json | 84 +++++- package.nls.json | 9 +- package.nls.zh-cn.json | 9 +- package.nls.zh-tw.json | 4 +- src/commands.ts | 15 + src/explorerCommands/new.ts | 261 ++++++++++++++++-- src/extension.ts | 4 +- src/views/PrimaryTypeNode.ts | 5 + src/views/dependencyExplorer.ts | 19 +- src/views/packageNode.ts | 3 + src/views/packageRootNode.ts | 3 + src/views/projectNode.ts | 3 + test/ui/command.test.ts | 4 +- 16 files changed, 455 insertions(+), 53 deletions(-) diff --git a/ThirdPartyNotices.txt b/ThirdPartyNotices.txt index 86dfa178..de26a4ca 100644 --- a/ThirdPartyNotices.txt +++ b/ThirdPartyNotices.txt @@ -13,6 +13,7 @@ This project incorporates components from the projects listed below. The origina 6. jprichardson/node-fs-extra (https://github.com/jprichardson/node-fs-extra) 7. lodash/lodash (https://github.com/lodash/lodash) 8. sindresorhus/globby (https://github.com/sindresorhus/globby) +9. tcort/fmtr (https://github.com/tcort/fmtr) %% Apache Commons Lang NOTICES AND INFORMATION BEGIN HERE ========================================= @@ -571,3 +572,15 @@ The above copyright notice and this permission notice shall be included in all c THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ========================================= END OF sindresorhus/globby NOTICES AND INFORMATION + +%% tcort/fmtr NOTICES AND INFORMATION BEGIN HERE +========================================= +ISC License + +Copyright (c) 2015-2021 Thomas Cort linuxgeek@gmail.com + +Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +========================================= +END OF tcort/fmtr NOTICES AND INFORMATION diff --git a/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/model/PackageNode.java b/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/model/PackageNode.java index 618b391d..f945bfd0 100644 --- a/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/model/PackageNode.java +++ b/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/model/PackageNode.java @@ -36,6 +36,8 @@ import org.eclipse.jdt.core.IType; import org.eclipse.jdt.core.JavaCore; import org.eclipse.jdt.core.JavaModelException; +import org.eclipse.jdt.internal.compiler.classfmt.ClassFileConstants; +import org.eclipse.jdt.internal.compiler.impl.CompilerOptions; import org.eclipse.jdt.internal.core.JrtPackageFragmentRoot; import org.eclipse.jdt.ls.core.internal.JDTUtils; import org.eclipse.jdt.ls.core.internal.ProjectUtils; @@ -68,9 +70,11 @@ public class PackageNode { public static final String REFERENCED_LIBRARIES_PATH = "REFERENCED_LIBRARIES_PATH"; private static final String REFERENCED_LIBRARIES_CONTAINER_NAME = "Referenced Libraries"; private static final String IMMUTABLE_REFERENCED_LIBRARIES_CONTAINER_NAME = "Referenced Libraries (Read-only)"; - public static final ContainerNode REFERENCED_LIBRARIES_CONTAINER = new ContainerNode(REFERENCED_LIBRARIES_CONTAINER_NAME, REFERENCED_LIBRARIES_PATH, + public static final ContainerNode REFERENCED_LIBRARIES_CONTAINER = new ContainerNode( + REFERENCED_LIBRARIES_CONTAINER_NAME, REFERENCED_LIBRARIES_PATH, NodeKind.CONTAINER, IClasspathEntry.CPE_CONTAINER); - public static final ContainerNode IMMUTABLE_REFERENCED_LIBRARIES_CONTAINER = new ContainerNode(IMMUTABLE_REFERENCED_LIBRARIES_CONTAINER_NAME, + public static final ContainerNode IMMUTABLE_REFERENCED_LIBRARIES_CONTAINER = new ContainerNode( + IMMUTABLE_REFERENCED_LIBRARIES_CONTAINER_NAME, REFERENCED_LIBRARIES_PATH, NodeKind.CONTAINER, IClasspathEntry.CPE_CONTAINER); /** @@ -85,6 +89,8 @@ public class PackageNode { */ private static final String UNMANAGED_FOLDER_NATURE_ID = "org.eclipse.jdt.ls.core.unmanagedFolder"; + private static final String MAX_SOURCE_VERSION = "MaxSourceVersion"; + /** * The name of the PackageNode. */ @@ -164,7 +170,8 @@ public static PackageNode createNodeForProject(IJavaElement javaElement) { return null; } IProject proj = javaElement.getJavaProject().getProject(); - PackageNode projectNode = new PackageNode(proj.getName(), proj.getFullPath().toPortableString(), NodeKind.PROJECT); + PackageNode projectNode = new PackageNode(proj.getName(), proj.getFullPath().toPortableString(), + NodeKind.PROJECT); projectNode.setUri(ProjectUtils.getProjectRealFolder(proj).toFile().toURI().toString()); try { List natureIds = new ArrayList<>(Arrays.asList(proj.getDescription().getNatureIds())); @@ -173,6 +180,10 @@ public static PackageNode createNodeForProject(IJavaElement javaElement) { projectNode.setMetaDataValue(UNMANAGED_FOLDER_INNER_PATH, proj.getLocationURI().toString()); } projectNode.setMetaDataValue(NATURE_ID, natureIds); + String sourceVersion = javaElement.getJavaProject().getOption(JavaCore.COMPILER_SOURCE, true); + int jdkLevel = (int) (CompilerOptions.versionToJdkLevel(sourceVersion, true) >>> 16); + int majorVersion = Math.max(0, jdkLevel - ClassFileConstants.MAJOR_VERSION_0); + projectNode.setMetaDataValue(MAX_SOURCE_VERSION, majorVersion); } catch (CoreException e) { // do nothing } @@ -201,7 +212,8 @@ public static PackageNode createNodeForResource(IResource resource) { } public static PackageNode createNodeForPackageFragment(IPackageFragment packageFragment) { - PackageNode fragmentNode = new PackageNode(packageFragment.getElementName(), packageFragment.getPath().toPortableString(), NodeKind.PACKAGE); + PackageNode fragmentNode = new PackageNode(packageFragment.getElementName(), + packageFragment.getPath().toPortableString(), NodeKind.PACKAGE); fragmentNode.setHandlerIdentifier(packageFragment.getHandleIdentifier()); if (packageFragment.getResource() != null) { fragmentNode.setUri(packageFragment.getResource().getLocationURI().toString()); @@ -215,16 +227,19 @@ public static PackageNode createNodeForVirtualContainer(IPackageFragmentRoot pkg IClasspathEntry entry = pkgRoot.getRawClasspathEntry(); IClasspathContainer container = JavaCore.getClasspathContainer(entry.getPath(), pkgRoot.getJavaProject()); PackageNode containerNode = null; - if (entry.getEntryKind() == IClasspathEntry.CPE_LIBRARY || entry.getEntryKind() == IClasspathEntry.CPE_VARIABLE) { + if (entry.getEntryKind() == IClasspathEntry.CPE_LIBRARY + || entry.getEntryKind() == IClasspathEntry.CPE_VARIABLE) { containerNode = REFERENCED_LIBRARIES_CONTAINER; } else { - containerNode = new ContainerNode(container.getDescription(), container.getPath().toPortableString(), NodeKind.CONTAINER, entry.getEntryKind()); + containerNode = new ContainerNode(container.getDescription(), container.getPath().toPortableString(), + NodeKind.CONTAINER, entry.getEntryKind()); } return containerNode; } - public static PackageRootNode createNodeForPackageFragmentRoot(IPackageFragmentRoot pkgRoot) throws JavaModelException { + public static PackageRootNode createNodeForPackageFragmentRoot(IPackageFragmentRoot pkgRoot) + throws JavaModelException { PackageRootNode node; String displayName = pkgRoot.getElementName(); boolean isSourcePath = pkgRoot.getKind() == IPackageFragmentRoot.K_SOURCE; @@ -271,14 +286,16 @@ public static PackageRootNode createNodeForPackageFragmentRoot(IPackageFragmentR * Get the correspond node of classpath, it may be container or a package root. * * @param classpathEntry - * classpath entry + * classpath entry * @param javaProject - * correspond java project + * correspond java project * @param nodeKind - * could be CONTAINER or PACKAGEROOT(for referenced libraries) + * could be CONTAINER or PACKAGEROOT(for referenced + * libraries) * @return correspond PackageNode of classpath entry */ - public static PackageNode createNodeForClasspathEntry(IClasspathEntry classpathEntry, IJavaProject javaProject, NodeKind nodeKind) { + public static PackageNode createNodeForClasspathEntry(IClasspathEntry classpathEntry, IJavaProject javaProject, + NodeKind nodeKind) { try { IClasspathEntry entry = JavaCore.getResolvedClasspathEntry(classpathEntry); IClasspathContainer container = JavaCore.getClasspathContainer(entry.getPath(), javaProject); @@ -289,17 +306,18 @@ public static PackageNode createNodeForClasspathEntry(IClasspathEntry classpathE if (container != null) { PackageNode node = null; if (nodeKind == NodeKind.CONTAINER) { - node = new ContainerNode(container.getDescription(), container.getPath().toPortableString(), nodeKind, entry.getEntryKind()); + node = new ContainerNode(container.getDescription(), container.getPath().toPortableString(), + nodeKind, entry.getEntryKind()); final URI containerURI = ExtUtils.getContainerURI(javaProject, container); node.setUri(containerURI != null ? containerURI.toString() : null); } else if (nodeKind == NodeKind.PACKAGEROOT) { // ClasspathEntry for referenced jar files // Use package name as package root name String[] pathSegments = container.getPath().segments(); node = new PackageRootNode( - pathSegments[pathSegments.length - 1], - container.getPath().toPortableString(), - container.getPath().toFile().toURI().toString(), - nodeKind, IPackageFragmentRoot.K_BINARY); + pathSegments[pathSegments.length - 1], + container.getPath().toPortableString(), + container.getPath().toFile().toURI().toString(), + nodeKind, IPackageFragmentRoot.K_BINARY); } return node; } @@ -310,7 +328,8 @@ public static PackageNode createNodeForClasspathEntry(IClasspathEntry classpathE } public static PackageNode createNodeForPrimaryType(IType type) { - PackageNode primaryTypeNode = new PackageNode(type.getElementName(), type.getPath().toPortableString(), NodeKind.PRIMARYTYPE); + PackageNode primaryTypeNode = new PackageNode(type.getElementName(), type.getPath().toPortableString(), + NodeKind.PRIMARYTYPE); try { if (type.isEnum()) { @@ -332,7 +351,7 @@ public static PackageNode createNodeForPrimaryType(IType type) { * Get correspond node of referenced variable. * * @param classpathEntry - * referenced variable's classpath entry + * referenced variable's classpath entry * @return correspond package node */ public static PackageRootNode createNodeForClasspathVariable(IClasspathEntry classpathEntry) { diff --git a/package-lock.json b/package-lock.json index ea42e4d9..64d6a4da 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,6 +10,7 @@ "license": "MIT", "dependencies": { "await-lock": "^2.2.2", + "fmtr": "^1.1.4", "fs-extra": "^10.1.0", "globby": "^13.1.3", "lodash": "^4.17.21", @@ -2052,6 +2053,14 @@ "flat": "cli.js" } }, + "node_modules/fmtr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/fmtr/-/fmtr-1.1.4.tgz", + "integrity": "sha512-5qCv7eLlkR7LUDrcQdx0vGFo8tLgwFtO0JHkX9xfQm+DNnXpk9zQNSIldKlZ2VPZBwxTM9GB1esyeQuxhCVvmQ==", + "dependencies": { + "lodash": "^4.17.21" + } + }, "node_modules/follow-redirects": { "version": "1.15.3", "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.3.tgz", @@ -6879,6 +6888,14 @@ "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", "dev": true }, + "fmtr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/fmtr/-/fmtr-1.1.4.tgz", + "integrity": "sha512-5qCv7eLlkR7LUDrcQdx0vGFo8tLgwFtO0JHkX9xfQm+DNnXpk9zQNSIldKlZ2VPZBwxTM9GB1esyeQuxhCVvmQ==", + "requires": { + "lodash": "^4.17.21" + } + }, "follow-redirects": { "version": "1.15.3", "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.3.tgz", diff --git a/package.json b/package.json index aba8da47..0770e28e 100644 --- a/package.json +++ b/package.json @@ -192,6 +192,36 @@ "category": "Java", "icon": "$(add)" }, + { + "command": "java.view.package.newJavaInterface", + "title": "%contributes.commands.java.view.package.newJavaInterface%", + "category": "Java", + "icon": "$(add)" + }, + { + "command": "java.view.package.newJavaEnum", + "title": "%contributes.commands.java.view.package.newJavaEnum%", + "category": "Java", + "icon": "$(add)" + }, + { + "command": "java.view.package.newJavaRecord", + "title": "%contributes.commands.java.view.package.newJavaRecord%", + "category": "Java", + "icon": "$(add)" + }, + { + "command": "java.view.package.newJavaAnnotation", + "title": "%contributes.commands.java.view.package.newJavaAnnotation%", + "category": "Java", + "icon": "$(add)" + }, + { + "command": "java.view.package.newJavaAbstractClass", + "title": "%contributes.commands.java.view.package.newJavaAbstractClass%", + "category": "Java", + "icon": "$(add)" + }, { "command": "java.view.package.newPackage", "title": "%contributes.commands.java.view.package.newPackage%", @@ -395,6 +425,26 @@ "command": "java.view.package.newJavaClass", "when": "false" }, + { + "command": "java.view.package.newJavaInterface", + "when": "false" + }, + { + "command": "java.view.package.newJavaEnum", + "when": "false" + }, + { + "command": "java.view.package.newJavaRecord", + "when": "false" + }, + { + "command": "java.view.package.newJavaAnnotation", + "when": "false" + }, + { + "command": "java.view.package.newJavaAbstractClass", + "when": "false" + }, { "command": "java.view.package.newPackage", "when": "false" @@ -641,21 +691,46 @@ "javaProject.new": [ { "command": "java.view.package.newJavaClass", - "group": "new@10", + "group": "new1@10", + "when": "view == javaProjectExplorer && (viewItem =~ /java:(package|packageRoot)(?=.*?\\b\\+source\\b)/ || viewItem =~ /java:project(?=.*?\\b\\+java\\b)/ || viewItem =~ /java:type/)" + }, + { + "command": "java.view.package.newJavaInterface", + "group": "new1@11", + "when": "view == javaProjectExplorer && (viewItem =~ /java:(package|packageRoot)(?=.*?\\b\\+source\\b)/ || viewItem =~ /java:project(?=.*?\\b\\+java\\b)/ || viewItem =~ /java:type/)" + }, + { + "command": "java.view.package.newJavaEnum", + "group": "new1@12", + "when": "view == javaProjectExplorer && (viewItem =~ /java:(package|packageRoot)(?=.*?\\b\\+source\\b)/ || viewItem =~ /java:project(?=.*?\\b\\+java\\b)/ || viewItem =~ /java:type/)" + }, + { + "command": "java.view.package.newJavaRecord", + "group": "new1@13", + "when": "view == javaProjectExplorer && (viewItem =~ /java:(package|packageRoot)(?=.*?\\b\\+source\\b)/ || viewItem =~ /java:project(?=.*?\\b\\+java\\b)/ || viewItem =~ /java:type/) && viewItem =~ /java:.*\\+allowRecord\\b/" + }, + { + "command": "java.view.package.newJavaAnnotation", + "group": "new1@14", + "when": "view == javaProjectExplorer && (viewItem =~ /java:(package|packageRoot)(?=.*?\\b\\+source\\b)/ || viewItem =~ /java:project(?=.*?\\b\\+java\\b)/ || viewItem =~ /java:type/)" + }, + { + "command": "java.view.package.newJavaAbstractClass", + "group": "new1@15", "when": "view == javaProjectExplorer && (viewItem =~ /java:(package|packageRoot)(?=.*?\\b\\+source\\b)/ || viewItem =~ /java:project(?=.*?\\b\\+java\\b)/ || viewItem =~ /java:type/)" }, { "command": "java.view.package.newPackage", - "group": "new@20", + "group": "new1@20", "when": "view == javaProjectExplorer && (viewItem =~ /java:(package|packageRoot)(?=.*?\\b\\+source\\b)/ || viewItem =~ /java:project(?=.*?\\b\\+java\\b)/ || viewItem =~ /java:type/)" }, { "command": "java.view.package.newFile", - "group": "new@30" + "group": "new2@30" }, { "command": "java.view.package.newFolder", - "group": "new@40", + "group": "new2@40", "when": "view == javaProjectExplorer && (viewItem =~ /java:(file|folder|project)/ || viewItem =~ /java:(packageRoot)(?=.*?\\b\\+resource\\b)/)" } ] @@ -895,6 +970,7 @@ }, "dependencies": { "await-lock": "^2.2.2", + "fmtr": "^1.1.4", "fs-extra": "^10.1.0", "globby": "^13.1.3", "lodash": "^4.17.21", diff --git a/package.nls.json b/package.nls.json index c876d1f8..1cf98d01 100644 --- a/package.nls.json +++ b/package.nls.json @@ -22,10 +22,15 @@ "contributes.commands.java.view.package.copyFilePath": "Copy Path", "contributes.commands.java.view.package.copyRelativeFilePath": "Copy Relative Path", "contributes.commands.java.view.package.new": "New...", - "contributes.commands.java.view.package.newJavaClass": "Java Class...", + "contributes.commands.java.view.package.newJavaClass": "Class...", + "contributes.commands.java.view.package.newJavaInterface": "Interface...", + "contributes.commands.java.view.package.newJavaEnum": "Enum...", + "contributes.commands.java.view.package.newJavaRecord": "Record...", + "contributes.commands.java.view.package.newJavaAnnotation": "Annotation...", + "contributes.commands.java.view.package.newJavaAbstractClass": "Abstract Class...", "contributes.commands.java.view.package.newPackage": "Package...", "contributes.commands.java.view.package.newFile": "File...", - "contributes.commands.java.view.package.newFolder": "Folder", + "contributes.commands.java.view.package.newFolder": "Folder...", "contributes.commands.java.view.package.renameFile": "Rename", "contributes.commands.java.view.package.moveFileToTrash": "Delete", "contributes.commands.java.view.package.deleteFilePermanently": "Delete Permanently", diff --git a/package.nls.zh-cn.json b/package.nls.zh-cn.json index ed5f3403..f9253872 100644 --- a/package.nls.zh-cn.json +++ b/package.nls.zh-cn.json @@ -22,10 +22,15 @@ "contributes.commands.java.view.package.copyFilePath": "复制路径", "contributes.commands.java.view.package.copyRelativeFilePath": "复制相对路径", "contributes.commands.java.view.package.new": "创建...", - "contributes.commands.java.view.package.newJavaClass": "Java 类...", + "contributes.commands.java.view.package.newJavaClass": "类...", + "contributes.commands.java.view.package.newJavaInterface": "接口类型...", + "contributes.commands.java.view.package.newJavaEnum": "枚举类型...", + "contributes.commands.java.view.package.newJavaRecord": "记录类型...", + "contributes.commands.java.view.package.newJavaAnnotation": "注解类型...", + "contributes.commands.java.view.package.newJavaAbstractClass": "抽象类型...", "contributes.commands.java.view.package.newPackage": "包...", "contributes.commands.java.view.package.newFile": "文件...", - "contributes.commands.java.view.package.newFolder": "文件夹", + "contributes.commands.java.view.package.newFolder": "文件夹...", "contributes.commands.java.view.package.renameFile": "重命名", "contributes.commands.java.view.package.moveFileToTrash": "删除", "contributes.commands.java.view.package.deleteFilePermanently": "永久删除", diff --git a/package.nls.zh-tw.json b/package.nls.zh-tw.json index 94ac2499..c40519b6 100644 --- a/package.nls.zh-tw.json +++ b/package.nls.zh-tw.json @@ -20,10 +20,10 @@ "contributes.commands.java.view.package.copyFilePath": "複製路徑", "contributes.commands.java.view.package.copyRelativeFilePath": "複製相對路徑", "contributes.commands.java.view.package.new": "建立...", - "contributes.commands.java.view.package.newJavaClass": "Java 類別...", + "contributes.commands.java.view.package.newJavaClass": "類別...", "contributes.commands.java.view.package.newPackage": "套件...", "contributes.commands.java.view.package.newFile": "檔案...", - "contributes.commands.java.view.package.newFolder": "資料夾", + "contributes.commands.java.view.package.newFolder": "資料夾...", "contributes.commands.java.view.package.renameFile": "重新命名", "contributes.commands.java.view.package.moveFileToTrash": "刪除", "contributes.commands.java.view.package.deleteFilePermanently": "永久刪除", diff --git a/src/commands.ts b/src/commands.ts index c64f0f37..2e449862 100644 --- a/src/commands.ts +++ b/src/commands.ts @@ -42,6 +42,16 @@ export namespace Commands { export const VIEW_PACKAGE_NEW_JAVA_CLASS = "java.view.package.newJavaClass"; + export const VIEW_PACKAGE_NEW_JAVA_INTERFACE = "java.view.package.newJavaInterface"; + + export const VIEW_PACKAGE_NEW_JAVA_ENUM = "java.view.package.newJavaEnum"; + + export const VIEW_PACKAGE_NEW_JAVA_RECORD = "java.view.package.newJavaRecord"; + + export const VIEW_PACKAGE_NEW_JAVA_ANNOTATION = "java.view.package.newJavaAnnotation"; + + export const VIEW_PACKAGE_NEW_JAVA_ABSTRACT_CLASS = "java.view.package.newJavaAbstractClass"; + export const VIEW_PACKAGE_NEW_JAVA_PACKAGE = "java.view.package.newPackage"; export const VIEW_PACKAGE_RENAME_FILE = "java.view.package.renameFile"; @@ -133,6 +143,11 @@ export namespace Commands { export const GET_ALL_PROJECTS = "java.project.getAll"; export const BUILD_PROJECT = "java.project.build"; + + /** + * Get the project settings + */ + export const GET_PROJECT_SETTINGS = 'java.project.getSettings'; } export function executeJavaLanguageServerCommand(...rest: any[]) { diff --git a/src/explorerCommands/new.ts b/src/explorerCommands/new.ts index bc835034..248f57e1 100644 --- a/src/explorerCommands/new.ts +++ b/src/explorerCommands/new.ts @@ -2,8 +2,9 @@ // Licensed under the MIT license. import * as fse from "fs-extra"; +import { userInfo } from "os"; import * as path from "path"; -import { commands, Extension, extensions, languages, QuickPickItem, SnippetString, TextEditor, Uri, +import { commands, Extension, extensions, languages, Position, QuickPickItem, QuickPickItemKind, SnippetString, TextEditor, Uri, window, workspace, WorkspaceEdit, WorkspaceFolder } from "vscode"; import { Commands, PrimaryTypeNode } from "../../extension.bundle"; import { ExtensionName } from "../constants"; @@ -13,26 +14,87 @@ import { resourceRoots } from "../views/packageRootNode"; import { checkJavaQualifiedName } from "./utility"; import { sendError, setUserError } from "vscode-extension-telemetry-wrapper"; +// tslint:disable no-var-requires +const stringInterpolate = require("fmtr"); + +export class JavaType { + public static readonly CLASS: JavaType = new JavaType("Class", "class", "$(symbol-class)"); + public static readonly INTERFACE: JavaType = new JavaType("Interface", "interface", "$(symbol-interface)"); + public static readonly ENUM: JavaType = new JavaType("Enum", "enum", "$(symbol-enum)"); + public static readonly RECORD: JavaType = new JavaType("Record", "record", "$(symbol-class)"); + public static readonly ANNOTATION: JavaType = new JavaType("Annotation", "@interface", "$(symbol-interface)"); + public static readonly ABSTRACT_CLASS: JavaType = new JavaType("Abstract Class", "abstract class", "$(symbol-class)"); + + public static readonly ALL: JavaType[] = [ + JavaType.CLASS, + JavaType.INTERFACE, + JavaType.ENUM, + JavaType.RECORD, + JavaType.ANNOTATION, + JavaType.ABSTRACT_CLASS, + ]; + + public static fromDisplayName(label: string): JavaType | undefined { + if (label?.startsWith("$")) { + return JavaType.ALL.find((javaType) => `${javaType.icon} ${javaType.label}` === label); + } + + return JavaType.ALL.find((javaType) => javaType.label === label); + } + + public static getDisplayNames(includeIcon: boolean, includeRecord?: boolean): string[] { + return JavaType.ALL + .filter((javaType) => includeRecord || javaType !== JavaType.RECORD) + .map((javaType) => { + if (includeIcon) { + return `${javaType.icon} ${javaType.label}`; + } else { + return javaType.label; + } + }); + } + + private constructor(public readonly label: string, public readonly keyword: string, + public readonly icon: string) { + } +} + export async function newResource(node: DataNode): Promise { - const availableTypes: string[] = []; + const availableTypes: QuickPickItem[] = []; // add options for Java nodes if (node.nodeData.kind === NodeKind.Project || (node.nodeData.kind === NodeKind.PackageRoot && !resourceRoots.includes(node.nodeData.name)) || node.nodeData.kind === NodeKind.Package || node.nodeData.kind === NodeKind.PrimaryType || node.nodeData.kind === NodeKind.CompilationUnit) { - availableTypes.push("$(symbol-class) Java Class", "$(symbol-namespace) Package"); + const allowRecord = node.computeContextValue()?.includes("+allowRecord"); + availableTypes.push(...JavaType.getDisplayNames(true, allowRecord).map((label) => { + return { + label, + }; + })); + availableTypes.push({ + label: "$(symbol-namespace) Package", + }); } + availableTypes.push({ + label: "", + kind: QuickPickItemKind.Separator, + }); // add new file option - availableTypes.push("$(file) File"); + availableTypes.push({ + label: "$(file) File", + }); // add new folder option if (node.nodeData.kind === NodeKind.Project || (node.nodeData.kind === NodeKind.PackageRoot && resourceRoots.includes(node.nodeData.name)) || node.nodeData.kind === NodeKind.Folder || node.nodeData.kind === NodeKind.File) { - availableTypes.push("$(folder) Folder"); + availableTypes.push({ + label: "$(folder) Folder", + }); } const type = await window.showQuickPick( @@ -43,10 +105,7 @@ export async function newResource(node: DataNode): Promise { } ); - switch (type) { - case "$(symbol-class) Java Class": - await newJavaClass(node); - break; + switch (type?.label) { case "$(symbol-namespace) Package": await newPackage(node); break; @@ -57,12 +116,40 @@ export async function newResource(node: DataNode): Promise { await newFolder(node); break; default: + const javaType = JavaType.fromDisplayName(type?.label || ""); + if (javaType) { + await newJavaFileWithSpecificType(javaType, node); + } break; } } -// TODO: separate to two function to handle creation from menu bar and explorer. -export async function newJavaClass(node?: DataNode): Promise { +// Create a new Java file from the menu bar. +export async function newJavaFile(): Promise { + const packageFsPath: string | undefined = await inferPackageFsPath(); + if (packageFsPath === undefined) { + // User canceled + return; + } else if (packageFsPath.length === 0) { + return newUntitledJavaFile(); + } + + const includeRecord = !(await isVersionLessThan(Uri.file(packageFsPath).toString(), 16)); + const supportedTypes: string[] = JavaType.getDisplayNames(true, includeRecord); + const typeName: string | undefined = await window.showQuickPick(supportedTypes, + { + placeHolder: "Select the Java type you want to create", + ignoreFocusOut: true, + }); + if (!typeName) { + return; + } + + newJavaFile0(packageFsPath, JavaType.fromDisplayName(typeName)); +} + +// Create a new Java file from the context menu of Java Projects view. +export async function newJavaFileWithSpecificType(javaType: JavaType, node?: DataNode): Promise { let packageFsPath: string | undefined; if (!node) { packageFsPath = await inferPackageFsPath(); @@ -70,10 +157,8 @@ export async function newJavaClass(node?: DataNode): Promise { if (!node?.uri || !canCreateClass(node)) { return; } - packageFsPath = await getPackageFsPath(node); } - if (packageFsPath === undefined) { // User canceled return; @@ -81,8 +166,16 @@ export async function newJavaClass(node?: DataNode): Promise { return newUntitledJavaFile(); } + newJavaFile0(packageFsPath, javaType); +} + +async function newJavaFile0(packageFsPath: string, javaType: JavaType | undefined) { + if (!javaType) { + return; + } + const className: string | undefined = await window.showInputBox({ - placeHolder: "Enter the Java file name for class/interface/enum/record/@interface", + placeHolder: `Input the ${javaType.label.toLowerCase()} name`, ignoreFocusOut: true, validateInput: async (value: string): Promise => { const checkMessage: string = checkJavaQualifiedName(value); @@ -102,12 +195,86 @@ export async function newJavaClass(node?: DataNode): Promise { return; } - // `workspace.applyEdit()` will trigger a workspace file event, and let the - // vscode-java extension to handle the type: class, interface or enum. - const workspaceEdit: WorkspaceEdit = new WorkspaceEdit(); const fsPath: string = getNewFilePath(packageFsPath, className); - workspaceEdit.createFile(Uri.file(fsPath)); - workspace.applyEdit(workspaceEdit); + const packageName = await resolvePackageName(fsPath); + await newJavaFileWithContents(fsPath, javaType, packageName); +} + +// New File implementation is copied from +// https://github.com/redhat-developer/vscode-java/blob/86bf3ae02f4f457184e6cc217f20240f9882dde9/src/fileEventHandler.ts#L66 +async function newJavaFileWithContents(fsPath: string, javaType: JavaType, packageName: string) { + const snippets: string[] = []; + const formatNumber = (num: number) => num > 9 ? String(num) : `0${num}`; + const typeName: string = resolveTypeName(fsPath); + const isPackageInfo = typeName === 'package-info'; + const isModuleInfo = typeName === 'module-info'; + const date = new Date(); + const context: any = { + fileName: path.basename(fsPath), + packageName: "", + typeName, + user: userInfo().username, + date: date.toLocaleDateString(undefined, {month: "short", day: "2-digit", year: "numeric"}), + time: date.toLocaleTimeString(), + year: date.getFullYear(), + month: formatNumber(date.getMonth() + 1), + shortmonth: date.toLocaleDateString(undefined, {month: "short"}), + day: formatNumber(date.getDate()), + hour: formatNumber(date.getHours()), + minute: formatNumber(date.getMinutes()), + }; + + if (!isModuleInfo) { + context.packageName = packageName; + } + + const fileHeader = workspace.getConfiguration('java').get("templates.fileHeader"); + if (fileHeader && fileHeader.length) { + for (const template of fileHeader) { + snippets.push(stringInterpolate(template, context)); + } + } + + if (!isModuleInfo) { + if (context.packageName) { + snippets.push(`package ${context.packageName};`); + snippets.push(""); + } + } + + if (!isPackageInfo) { + const typeComment = workspace.getConfiguration('java').get("templates.typeComment"); + if (typeComment && typeComment.length) { + for (const template of typeComment) { + snippets.push(stringInterpolate(template, context)); + } + } + + if (isModuleInfo) { + snippets.push(`module {`); + } else { + snippets.push(`public ${javaType.keyword} ${typeName}${javaType === JavaType.RECORD ? "()" : ""} {`); + } + snippets.push(""); + snippets.push("}"); + snippets.push(""); + } + + const workspaceEdit: WorkspaceEdit = new WorkspaceEdit(); + const fsUri: Uri = Uri.file(fsPath); + workspaceEdit.createFile(fsUri); + workspaceEdit.insert(fsUri, new Position(0, 0), snippets.join("\n")); + await workspace.applyEdit(workspaceEdit); + const editor = await window.showTextDocument(fsUri); + if (editor) { + editor.document.save(); + } +} + +function resolveTypeName(filePath: string): string { + const fileName: string = path.basename(filePath); + const extName: string = path.extname(fileName); + return fileName.substring(0, fileName.length - extName.length); } async function newUntitledJavaFile(): Promise { @@ -186,6 +353,62 @@ function canCreateClass(node: DataNode): boolean { return false; } +const COMPLIANCE = "org.eclipse.jdt.core.compiler.compliance"; +async function isVersionLessThan(fileUri: string, targetVersion: number): Promise { + let projectSettings: any = {}; + try { + projectSettings = await commands.executeCommand( + Commands.EXECUTE_WORKSPACE_COMMAND, Commands.GET_PROJECT_SETTINGS, fileUri, [ COMPLIANCE ]); + } catch (err) { + // do nothing. + } + + let javaVersion = 0; + let complianceVersion = projectSettings[COMPLIANCE]; + if (complianceVersion) { + // Ignore '1.' prefix for legacy Java versions + if (complianceVersion.startsWith('1.')) { + complianceVersion = complianceVersion.substring(2); + } + + // look into the interesting bits now + const regexp = /\d+/g; + const match = regexp.exec(complianceVersion); + if (match) { + javaVersion = parseInt(match[0], 10); + } + } + + return javaVersion < targetVersion; +} + +async function resolvePackageName(filePath: string): Promise { + let sourcePaths: string[] = []; + const result: IListCommandResult = + await commands.executeCommand(Commands.EXECUTE_WORKSPACE_COMMAND, Commands.LIST_SOURCEPATHS); + if (result && result.data && result.data.length) { + sourcePaths = result.data.map((sourcePath) => sourcePath.path).sort((a, b) => b.length - a.length); + } + + if (!sourcePaths || !sourcePaths.length) { + return ""; + } + + for (const sourcePath of sourcePaths) { + if (isPrefix(sourcePath, filePath)) { + const relative = path.relative(sourcePath, path.dirname(filePath)); + return relative.replace(/[/\\]/g, "."); + } + } + + return ""; +} + +function isPrefix(parentPath: string, filePath: string): boolean { + const relative = path.relative(parentPath, filePath); + return !relative || (!relative.startsWith('..') && !path.isAbsolute(relative)); +} + async function getPackageFsPath(node: DataNode): Promise { if (node.nodeData.kind === NodeKind.Project) { const childrenNodes: DataNode[] = await node.getChildren() as DataNode[]; diff --git a/src/extension.ts b/src/extension.ts index 4f4ad709..b9b1d0d7 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -19,7 +19,7 @@ import { DependencyExplorer } from "./views/dependencyExplorer"; import { DiagnosticProvider } from "./tasks/buildArtifact/migration/DiagnosticProvider"; import { setContextForDeprecatedTasks, updateExportTaskType } from "./tasks/buildArtifact/migration/utils"; import { CodeActionProvider } from "./tasks/buildArtifact/migration/CodeActionProvider"; -import { newJavaClass } from "./explorerCommands/new"; +import { newJavaFile } from "./explorerCommands/new"; export async function activate(context: ExtensionContext): Promise { contextManager.initialize(context); @@ -47,7 +47,7 @@ async function activateExtension(_operationId: string, context: ExtensionContext context.subscriptions.push(tasks.registerTaskProvider(DeprecatedExportJarTaskProvider.type, new DeprecatedExportJarTaskProvider())); context.subscriptions.push(tasks.registerTaskProvider(BuildArtifactTaskProvider.exportJarType, new BuildArtifactTaskProvider())); context.subscriptions.push(tasks.registerTaskProvider(BuildTaskProvider.type, new BuildTaskProvider())); - context.subscriptions.push(instrumentOperationAsVsCodeCommand(Commands.VIEW_MENUS_FILE_NEW_JAVA_CLASS, newJavaClass)); + context.subscriptions.push(instrumentOperationAsVsCodeCommand(Commands.VIEW_MENUS_FILE_NEW_JAVA_CLASS, newJavaFile)); context.subscriptions.push(window.onDidChangeActiveTextEditor((e: TextEditor | undefined) => { setContextForReloadProject(e?.document); })); diff --git a/src/views/PrimaryTypeNode.ts b/src/views/PrimaryTypeNode.ts index 3b5540ca..8ee95223 100644 --- a/src/views/PrimaryTypeNode.ts +++ b/src/views/PrimaryTypeNode.ts @@ -121,6 +121,11 @@ export class PrimaryTypeNode extends DataNode { contextValue += "+test"; } + if (this._rootNode?.getParent() instanceof ProjectNode + && (this._rootNode.getParent() as ProjectNode).nodeData?.metaData?.MaxSourceVersion >= 16) { + contextValue += "+allowRecord"; + } + return contextValue; } diff --git a/src/views/dependencyExplorer.ts b/src/views/dependencyExplorer.ts index 90384d14..af248add 100644 --- a/src/views/dependencyExplorer.ts +++ b/src/views/dependencyExplorer.ts @@ -12,7 +12,7 @@ import { import { instrumentOperationAsVsCodeCommand, sendInfo } from "vscode-extension-telemetry-wrapper"; import { Commands } from "../commands"; import { deleteFiles } from "../explorerCommands/delete"; -import { newFile, newFolder, newJavaClass, newPackage, newResource } from "../explorerCommands/new"; +import { JavaType, newFile, newFolder, newJavaFileWithSpecificType, newPackage, newResource } from "../explorerCommands/new"; import { renameFile } from "../explorerCommands/rename"; import { getCmdNode } from "../explorerCommands/utility"; import { Jdtls } from "../java/jdtls"; @@ -117,7 +117,22 @@ export class DependencyExplorer implements Disposable { newResource(node); }), instrumentOperationAsVsCodeCommand(Commands.VIEW_PACKAGE_NEW_JAVA_CLASS, async (node?: DataNode) => { - newJavaClass(node); + newJavaFileWithSpecificType(JavaType.CLASS, node); + }), + instrumentOperationAsVsCodeCommand(Commands.VIEW_PACKAGE_NEW_JAVA_INTERFACE, async (node?: DataNode) => { + newJavaFileWithSpecificType(JavaType.INTERFACE, node); + }), + instrumentOperationAsVsCodeCommand(Commands.VIEW_PACKAGE_NEW_JAVA_ENUM, async (node?: DataNode) => { + newJavaFileWithSpecificType(JavaType.ENUM, node); + }), + instrumentOperationAsVsCodeCommand(Commands.VIEW_PACKAGE_NEW_JAVA_RECORD, async (node?: DataNode) => { + newJavaFileWithSpecificType(JavaType.RECORD, node); + }), + instrumentOperationAsVsCodeCommand(Commands.VIEW_PACKAGE_NEW_JAVA_ANNOTATION, async (node?: DataNode) => { + newJavaFileWithSpecificType(JavaType.ANNOTATION, node); + }), + instrumentOperationAsVsCodeCommand(Commands.VIEW_PACKAGE_NEW_JAVA_ABSTRACT_CLASS, async (node?: DataNode) => { + newJavaFileWithSpecificType(JavaType.ABSTRACT_CLASS, node); }), instrumentOperationAsVsCodeCommand(Commands.VIEW_PACKAGE_NEW_FILE, async (node: DataNode) => { newFile(node); diff --git a/src/views/packageNode.ts b/src/views/packageNode.ts index 501b369b..a6151435 100644 --- a/src/views/packageNode.ts +++ b/src/views/packageNode.ts @@ -50,6 +50,9 @@ export class PackageNode extends DataNode { let contextValue: string = Explorer.ContextValueType.Package; if (parentData.entryKind === PackageRootKind.K_SOURCE || parentData.kind === NodeKind.Project) { contextValue += "+source"; + if (this._project.nodeData.metaData?.MaxSourceVersion >= 16) { + contextValue += "+allowRecord"; + } } else if (parentData.entryKind === PackageRootKind.K_BINARY) { contextValue += "+binary"; } diff --git a/src/views/packageRootNode.ts b/src/views/packageRootNode.ts index 8ca4ca19..a4951a28 100644 --- a/src/views/packageRootNode.ts +++ b/src/views/packageRootNode.ts @@ -76,6 +76,9 @@ export class PackageRootNode extends DataNode { } else { contextValue += "+source"; } + if (this._project.nodeData.metaData?.MaxSourceVersion >= 16) { + contextValue += "+allowRecord"; + } return contextValue; } } diff --git a/src/views/projectNode.ts b/src/views/projectNode.ts index 2d127fb0..f48ef75a 100644 --- a/src/views/projectNode.ts +++ b/src/views/projectNode.ts @@ -96,6 +96,9 @@ export class ProjectNode extends DataNode { const attributeString: string = getProjectTypeAttributes(natureIds); contextValue += attributeString; } + if (this.nodeData.metaData?.MaxSourceVersion >= 16) { + contextValue += "+allowRecord"; + } return contextValue; } } diff --git a/test/ui/command.test.ts b/test/ui/command.test.ts index 7894907a..37efdaee 100644 --- a/test/ui/command.test.ts +++ b/test/ui/command.test.ts @@ -114,14 +114,14 @@ describe("Command Tests", function() { it("Test java.view.package.newJavaClass", async function() { let inputBox = await createJavaResource(); - const javaClassQuickPick = await inputBox.findQuickPick("Java Class"); + const javaClassQuickPick = await inputBox.findQuickPick(0); await javaClassQuickPick!.click(); assert.ok(await inputBox.getPlaceHolder() === "Choose a source folder", `InputBox "Choose a source folder" should appear`); const quickPick = await inputBox.findQuickPick("src/main/java"); assert.ok(quickPick, `Quickpick item "src/main/java" should be found`); await quickPick!.click(); inputBox = await InputBox.create(); - assert.ok(await inputBox.getPlaceHolder() === "Enter the Java file name for class/interface/enum/record/@interface", `InputBox "Enter the Java file name" should appear`); + assert.ok(await inputBox.getPlaceHolder() === "Input the class name", `InputBox "Input the class name" should appear`); await inputBox.setText("App2"); await inputBox.confirm(); await sleep(1000); From 465fb8e89eca28ac9b05562491cdf43e364baa23 Mon Sep 17 00:00:00 2001 From: Sheng Chen Date: Wed, 29 Nov 2023 03:19:15 -0800 Subject: [PATCH 184/352] feat: Register the project delete event (#802) Signed-off-by: Sheng Chen --- src/languageServerApi/languageServerApiManager.ts | 9 +++++++++ src/views/dependencyDataProvider.ts | 4 +--- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/src/languageServerApi/languageServerApiManager.ts b/src/languageServerApi/languageServerApiManager.ts index 3aa77e76..494c08a4 100644 --- a/src/languageServerApi/languageServerApiManager.ts +++ b/src/languageServerApi/languageServerApiManager.ts @@ -65,6 +65,15 @@ class LanguageServerApiManager { })); } + if (extensionApi.onDidProjectsDelete) { + const onDidProjectsDelete: Event = extensionApi.onDidProjectsDelete; + contextManager.context.subscriptions.push(onDidProjectsDelete(() => { + commands.executeCommand(Commands.VIEW_PACKAGE_INTERNAL_REFRESH, /* debounce = */true); + syncHandler.updateFileWatcher(Settings.autoRefresh()); + })); + + } + if (this.extensionApi?.serverMode === LanguageServerMode.LightWeight) { if (extensionApi.onDidServerModeChange) { const onDidServerModeChange: Event = extensionApi.onDidServerModeChange; diff --git a/src/views/dependencyDataProvider.ts b/src/views/dependencyDataProvider.ts index 00f0827f..72c4cf55 100644 --- a/src/views/dependencyDataProvider.ts +++ b/src/views/dependencyDataProvider.ts @@ -197,9 +197,7 @@ export class DependencyDataProvider implements TreeDataProvider { this._rootItems = rootItems; } } - if (_.isEmpty(rootItems)) { - contextManager.setContextValue(Context.NO_JAVA_PROJECT, true); - } + contextManager.setContextValue(Context.NO_JAVA_PROJECT, _.isEmpty(rootItems)); return rootItems; } finally { explorerLock.release(); From f2368711a58456de61dda5598896b102122bef88 Mon Sep 17 00:00:00 2001 From: Sheng Chen Date: Wed, 29 Nov 2023 22:05:05 -0800 Subject: [PATCH 185/352] build: Prepare for 0.23.3 (#803) Signed-off-by: Sheng Chen --- CHANGELOG.md | 7 +++++++ .../com.microsoft.jdtls.ext.core/META-INF/MANIFEST.MF | 2 +- jdtls.ext/com.microsoft.jdtls.ext.core/pom.xml | 2 +- jdtls.ext/com.microsoft.jdtls.ext.target/pom.xml | 2 +- jdtls.ext/pom.xml | 2 +- package-lock.json | 4 ++-- package.json | 4 ++-- 7 files changed, 15 insertions(+), 8 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d7e20470..bdd43677 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,13 @@ All notable changes to the "vscode-java-dependency" extension will be documented The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/) and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html). +## 0.23.3 +### Added +- Register the project delete event. [PR#802](https://github.com/microsoft/vscode-java-dependency/pull/802) + +### Changed +- Improve the user experience of creating Java files. [PR#801](https://github.com/microsoft/vscode-java-dependency/pull/801), [PR#800](https://github.com/microsoft/vscode-java-dependency/pull/800). + ## 0.23.2 ### Fixed - Improve wording in Java Projects view. [PR#785](https://github.com/microsoft/vscode-java-dependency/pull/785) diff --git a/jdtls.ext/com.microsoft.jdtls.ext.core/META-INF/MANIFEST.MF b/jdtls.ext/com.microsoft.jdtls.ext.core/META-INF/MANIFEST.MF index 431b9f8c..679be742 100644 --- a/jdtls.ext/com.microsoft.jdtls.ext.core/META-INF/MANIFEST.MF +++ b/jdtls.ext/com.microsoft.jdtls.ext.core/META-INF/MANIFEST.MF @@ -2,7 +2,7 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: JDTLS EXT Core Bundle-SymbolicName: com.microsoft.jdtls.ext.core;singleton:=true -Bundle-Version: 0.23.2 +Bundle-Version: 0.23.3 Bundle-Activator: com.microsoft.jdtls.ext.core.JdtlsExtActivator Bundle-RequiredExecutionEnvironment: JavaSE-11 Bundle-ActivationPolicy: lazy diff --git a/jdtls.ext/com.microsoft.jdtls.ext.core/pom.xml b/jdtls.ext/com.microsoft.jdtls.ext.core/pom.xml index 5c6a1e6b..b46547f6 100644 --- a/jdtls.ext/com.microsoft.jdtls.ext.core/pom.xml +++ b/jdtls.ext/com.microsoft.jdtls.ext.core/pom.xml @@ -5,7 +5,7 @@ com.microsoft.jdtls.ext jdtls-ext-parent - 0.23.2 + 0.23.3 com.microsoft.jdtls.ext.core eclipse-plugin diff --git a/jdtls.ext/com.microsoft.jdtls.ext.target/pom.xml b/jdtls.ext/com.microsoft.jdtls.ext.target/pom.xml index cd0f9290..533221c5 100644 --- a/jdtls.ext/com.microsoft.jdtls.ext.target/pom.xml +++ b/jdtls.ext/com.microsoft.jdtls.ext.target/pom.xml @@ -4,7 +4,7 @@ com.microsoft.jdtls.ext jdtls-ext-parent - 0.23.2 + 0.23.3 com.microsoft.jdtls.ext.tp ${base.name} :: Target Platform diff --git a/jdtls.ext/pom.xml b/jdtls.ext/pom.xml index 940c3a66..7048b79d 100644 --- a/jdtls.ext/pom.xml +++ b/jdtls.ext/pom.xml @@ -4,7 +4,7 @@ com.microsoft.jdtls.ext jdtls-ext-parent ${base.name} :: Parent - 0.23.2 + 0.23.3 pom Java Project Manager diff --git a/package-lock.json b/package-lock.json index 64d6a4da..2c5a1e19 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "vscode-java-dependency", - "version": "0.23.2", + "version": "0.23.3", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "vscode-java-dependency", - "version": "0.23.2", + "version": "0.23.3", "license": "MIT", "dependencies": { "await-lock": "^2.2.2", diff --git a/package.json b/package.json index 0770e28e..4a9cad09 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "vscode-java-dependency", "displayName": "Project Manager for Java", "description": "%description%", - "version": "0.23.2", + "version": "0.23.3", "publisher": "vscjava", "preview": false, "aiKey": "5c642b22-e845-4400-badb-3f8509a70777", @@ -46,7 +46,7 @@ "main": "./main.js", "contributes": { "javaExtensions": [ - "./server/com.microsoft.jdtls.ext.core-0.23.2.jar" + "./server/com.microsoft.jdtls.ext.core-0.23.3.jar" ], "commands": [ { From c7a4296cb3093fa6ffde3a9f95c2f23a1e836931 Mon Sep 17 00:00:00 2001 From: Jinbo Wang Date: Fri, 5 Jan 2024 14:49:59 +0800 Subject: [PATCH 186/352] Contribute 'New Java Project...' command to File/NewFile and File Explorer menus (#809) * Contribute 'New Java Project...' command to File/NewFile menus * Expose 'New Java Project...' command to File Explorer context menu --- .../com.microsoft.jdtls.ext.tp.target | 2 +- package-lock.json | 18 +++--- package.json | 62 ++++++++++++++++++- package.nls.json | 5 +- package.nls.zh-cn.json | 5 +- package.nls.zh-tw.json | 5 +- src/commands.ts | 10 +++ src/controllers/projectController.ts | 19 +++++- test/ui/command.test.ts | 7 +-- 9 files changed, 108 insertions(+), 25 deletions(-) diff --git a/jdtls.ext/com.microsoft.jdtls.ext.target/com.microsoft.jdtls.ext.tp.target b/jdtls.ext/com.microsoft.jdtls.ext.target/com.microsoft.jdtls.ext.tp.target index 830e17e6..e23d62a0 100644 --- a/jdtls.ext/com.microsoft.jdtls.ext.target/com.microsoft.jdtls.ext.tp.target +++ b/jdtls.ext/com.microsoft.jdtls.ext.target/com.microsoft.jdtls.ext.tp.target @@ -15,7 +15,7 @@ - + diff --git a/package-lock.json b/package-lock.json index 2c5a1e19..9e6019e6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -28,7 +28,7 @@ "@types/node": "^16.18.11", "@types/semver": "^7.3.13", "@types/vscode": "1.77.0", - "@vscode/test-electron": "^2.2.2", + "@vscode/test-electron": "^2.3.8", "copy-webpack-plugin": "^11.0.0", "glob": "^7.2.3", "mocha": "^9.2.2", @@ -453,15 +453,15 @@ } }, "node_modules/@vscode/test-electron": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/@vscode/test-electron/-/test-electron-2.3.3.tgz", - "integrity": "sha512-hgXCkDP0ibboF1K6seqQYyHAzCURgTwHS/6QU7slhwznDLwsRwg9bhfw1CZdyUEw8vvCmlrKWnd7BlQnI0BC4w==", + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/@vscode/test-electron/-/test-electron-2.3.8.tgz", + "integrity": "sha512-b4aZZsBKtMGdDljAsOPObnAi7+VWIaYl3ylCz1jTs+oV6BZ4TNHcVNC3xUn0azPeszBmwSBDQYfFESIaUQnrOg==", "dev": true, "dependencies": { "http-proxy-agent": "^4.0.1", "https-proxy-agent": "^5.0.0", "jszip": "^3.10.1", - "semver": "^7.3.8" + "semver": "^7.5.2" }, "engines": { "node": ">=16" @@ -5691,15 +5691,15 @@ } }, "@vscode/test-electron": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/@vscode/test-electron/-/test-electron-2.3.3.tgz", - "integrity": "sha512-hgXCkDP0ibboF1K6seqQYyHAzCURgTwHS/6QU7slhwznDLwsRwg9bhfw1CZdyUEw8vvCmlrKWnd7BlQnI0BC4w==", + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/@vscode/test-electron/-/test-electron-2.3.8.tgz", + "integrity": "sha512-b4aZZsBKtMGdDljAsOPObnAi7+VWIaYl3ylCz1jTs+oV6BZ4TNHcVNC3xUn0azPeszBmwSBDQYfFESIaUQnrOg==", "dev": true, "requires": { "http-proxy-agent": "^4.0.1", "https-proxy-agent": "^5.0.0", "jszip": "^3.10.1", - "semver": "^7.3.8" + "semver": "^7.5.2" } }, "@vscode/vsce": { diff --git a/package.json b/package.json index 4a9cad09..ace47608 100644 --- a/package.json +++ b/package.json @@ -55,6 +55,36 @@ "category": "Java", "icon": "$(add)" }, + { + "command": "_java.project.create.from.menus.file", + "title": "%contributes.commands.java.project.new%", + "category": "Java", + "icon": "$(add)" + }, + { + "command": "_java.project.create.from.fileexplorer.menu", + "title": "%contributes.commands.java.project.new%", + "category": "Java", + "icon": "$(add)" + }, + { + "command": "_java.project.create.from.fileexplorer.welcome", + "title": "%contributes.commands.java.project.create%", + "category": "Java", + "icon": "$(add)" + }, + { + "command": "_java.project.create.from.javaprojectexplorer.welcome", + "title": "%contributes.commands.java.project.create%", + "category": "Java", + "icon": "$(add)" + }, + { + "command": "_java.project.create.from.javaprojectexplorer", + "title": "%contributes.commands.java.project.create%", + "category": "Java", + "icon": "$(add)" + }, { "command": "java.project.addLibraries", "title": "%contributes.commands.java.project.addLibraries%", @@ -358,6 +388,9 @@ "file/newFile": [ { "command": "java.view.menus.file.newJavaClass" + }, + { + "command": "_java.project.create.from.menus.file" } ], "commandPalette": [ @@ -488,6 +521,26 @@ { "command": "java.view.package.revealInProjectExplorer", "when": "false" + }, + { + "command": "_java.project.create.from.menus.file", + "when": "false" + }, + { + "command": "_java.project.create.from.fileexplorer.menu", + "when": "false" + }, + { + "command": "_java.project.create.from.fileexplorer.welcome", + "when": "false" + }, + { + "command": "_java.project.create.from.javaprojectexplorer.welcome", + "when": "false" + }, + { + "command": "_java.project.create.from.javaprojectexplorer", + "when": "false" } ], "explorer/context": [ @@ -500,6 +553,11 @@ "command": "java.view.package.revealInProjectExplorer", "when": "resourceExtname == .java && java:serverMode == Standard", "group": "navigation@100" + }, + { + "command": "_java.project.create.from.fileexplorer.menu", + "when": "explorerResourceIsFolder", + "group": "navigation@10" } ], "editor/title": [ @@ -523,7 +581,7 @@ ], "view/title": [ { - "command": "java.project.create", + "command": "_java.project.create.from.javaprojectexplorer", "when": "view == javaProjectExplorer", "group": "navigation@10" }, @@ -957,7 +1015,7 @@ "@types/node": "^16.18.11", "@types/semver": "^7.3.13", "@types/vscode": "1.77.0", - "@vscode/test-electron": "^2.2.2", + "@vscode/test-electron": "^2.3.8", "copy-webpack-plugin": "^11.0.0", "glob": "^7.2.3", "mocha": "^9.2.2", diff --git a/package.nls.json b/package.nls.json index 1cf98d01..adf5b5cb 100644 --- a/package.nls.json +++ b/package.nls.json @@ -1,6 +1,7 @@ { "description": "Manage Java projects in Visual Studio Code", "contributes.commands.java.project.create": "Create Java Project...", + "contributes.commands.java.project.new": "New Java Project...", "contributes.commands.java.project.addLibraries": "Add Jar Libraries to Project Classpath...", "contributes.commands.java.project.addLibraryFolders": "Add Library Folders to Project Classpath...", "contributes.commands.java.project.removeLibrary": "Remove from Project Classpath", @@ -56,8 +57,8 @@ "taskDefinitions.java.project.build.path.workspace": "All the projects in workspace.", "taskDefinitions.java.project.build.path.exclude": "The path after '!' will be excluded from the paths to be built.", "taskDefinitions.java.project.build.isFullBuild": "Whether to execute a clean build or not.", - "viewsWelcome.workbench.createNewJavaProject": "You can also [open a Java project folder](command:_java.project.open), or create a new Java project by clicking the button below.\n[Create Java Project](command:java.project.create)", - "viewsWelcome.workbench.noJavaProject": "No Java projects found in the current workspace. You can [open a Java project folder](command:_java.project.open), or create a new Java project by clicking the button below.\n[Create Java Project](command:java.project.create)", + "viewsWelcome.workbench.createNewJavaProject": "You can also [open a Java project folder](command:_java.project.open), or create a new Java project by clicking the button below.\n[Create Java Project](command:_java.project.create.from.fileexplorer.welcome)", + "viewsWelcome.workbench.noJavaProject": "No Java projects found in the current workspace. You can [open a Java project folder](command:_java.project.open), or create a new Java project by clicking the button below.\n[Create Java Project](command:_java.project.create.from.javaprojectexplorer.welcome)", "viewsWelcome.workbench.importFailed": "Oops, something went wrong when opening Java projects. Please use the following action for troubleshooting:\n[Open Problems View](command:workbench.panel.markers.view.focus)", "viewsWelcome.workbench.inLightWeightMode": "To view the projects, you can import the projects into workspace.\n[Import Projects](command:java.server.mode.switch?%5B%22Standard%22,true%5D)", "viewsWelcome.workbench.installLanguageSupport": "The Java Projects explorer requires [Extension Pack for Java](command:extension.open?%5B%22vscjava.vscode-java-pack%22%5D) to provide full features.\n[Install](command:java.project.installExtension?%5B%22vscjava.vscode-java-pack%22%5D)" diff --git a/package.nls.zh-cn.json b/package.nls.zh-cn.json index f9253872..c962108c 100644 --- a/package.nls.zh-cn.json +++ b/package.nls.zh-cn.json @@ -1,6 +1,7 @@ { "description": "在 Visual Studio Code 中管理 Java 项目", "contributes.commands.java.project.create": "创建 Java 项目...", + "contributes.commands.java.project.new": "创建 Java 项目...", "contributes.commands.java.project.addLibraries": "添加 Jar 文件至项目 Classpath...", "contributes.commands.java.project.addLibraryFolders": "添加文件夹至项目 Classpath...", "contributes.commands.java.project.removeLibrary": "从项目 Classpath 中移除", @@ -56,8 +57,8 @@ "taskDefinitions.java.project.build.path.workspace": "工作空间中的所有项目。", "taskDefinitions.java.project.build.path.exclude": "'!' 后的路径将会从待构建项目路径中移除。", "taskDefinitions.java.project.build.isFullBuild": "是否要重新构建项目。", - "viewsWelcome.workbench.createNewJavaProject": "您也可以[打开一个 Java 项目目录](command:_java.project.open),或点击下方按钮创建一个新的 Java 项目。\n[创建 Java 项目](command:java.project.create)", - "viewsWelcome.workbench.noJavaProject": "当前工作空间未发现 Java 项目,您可以[打开一个 Java 项目目录](command:_java.project.open),或点击下方按钮创建一个新的 Java 项目。\n[创建 Java 项目](command:java.project.create)", + "viewsWelcome.workbench.createNewJavaProject": "您也可以[打开一个 Java 项目目录](command:_java.project.open),或点击下方按钮创建一个新的 Java 项目。\n[创建 Java 项目](command:_java.project.create.from.fileexplorer.welcome)", + "viewsWelcome.workbench.noJavaProject": "当前工作空间未发现 Java 项目,您可以[打开一个 Java 项目目录](command:_java.project.open),或点击下方按钮创建一个新的 Java 项目。\n[创建 Java 项目](command:_java.project.create.from.javaprojectexplorer.welcome)", "viewsWelcome.workbench.importFailed": "加载 Java 项目时出现错误,请通过以下方式查看错误相关信息:\n[打开问题视图](command:workbench.panel.markers.view.focus)", "viewsWelcome.workbench.inLightWeightMode": "要浏览项目信息,你可以将项目导入到工作空间中。\n[导入项目](command:java.server.mode.switch?%5B%22Standard%22,true%5D)", "viewsWelcome.workbench.installLanguageSupport": "Java 项目视图需要安装并激活 [Extension Pack for Java](command:extension.open?%5B%22vscjava.vscode-java-pack%22%5D) 以提供完整的功能。\n[安装](command:java.project.installExtension?%5B%22vscjava.vscode-java-pack%22%5D)" diff --git a/package.nls.zh-tw.json b/package.nls.zh-tw.json index c40519b6..e5de9002 100644 --- a/package.nls.zh-tw.json +++ b/package.nls.zh-tw.json @@ -1,6 +1,7 @@ { "description": "在 Visual Studio Code 中管理 Java 專案", "contributes.commands.java.project.create": "建立 Java 專案...", + "contributes.commands.java.project.new": "建立 Java 專案...", "contributes.commands.java.project.addLibraries": "新增 Jar 檔案至專案 Classpath...", "contributes.commands.java.project.addLibraryFolders": "新增資料夾至專案 Classpath...", "contributes.commands.java.project.removeLibrary": "從專案 Classpath 中移除", @@ -48,8 +49,8 @@ "taskDefinitions.java.project.build.path.workspace": "工作區中的所有專案。", "taskDefinitions.java.project.build.path.exclude": "'!' 後的路徑將會從待建置專案路徑中移除。", "taskDefinitions.java.project.build.isFullBuild": "是否要重新建置專案。", - "viewsWelcome.workbench.createNewJavaProject": "您也可以[開啟一個 Java 專案目錄](command:_java.project.open),或點擊下方按鈕建立一個新的 Java 專案。\n[建立 Java 專案](command:java.project.create)", - "viewsWelcome.workbench.noJavaProject": "當前工作區未發現 Java 專案,您可以[開啟一個 Java 專案目錄](command:_java.project.open),或點擊下方按鈕建立一個新的 Java 專案。\n[建立 Java 專案](command:java.project.create)", + "viewsWelcome.workbench.createNewJavaProject": "您也可以[開啟一個 Java 專案目錄](command:_java.project.open),或點擊下方按鈕建立一個新的 Java 專案。\n[建立 Java 專案](command:_java.project.create.from.fileexplorer.welcome)", + "viewsWelcome.workbench.noJavaProject": "當前工作區未發現 Java 專案,您可以[開啟一個 Java 專案目錄](command:_java.project.open),或點擊下方按鈕建立一個新的 Java 專案。\n[建立 Java 專案](command:_java.project.create.from.javaprojectexplorer.welcome)", "viewsWelcome.workbench.importFailed": "加載 Java 專案時出現錯誤,請通過以下方式查看錯誤相關信息:\n[打開問題視圖](command:workbench.panel.markers.view.focus)", "viewsWelcome.workbench.inLightWeightMode": "若要檢視各專案,你可以將專案匯入到工作區中。\n[匯入專案](command:java.server.mode.switch?%5B%22Standard%22,true%5D)", "viewsWelcome.workbench.installLanguageSupport": "Java 專案視圖需要安裝並啟用 [Extension Pack for Java](command:extension.open?%5B%22vscjava.vscode-java-pack%22%5D) 以提供完整的功能。\n[安裝](command:java.project.installExtension?%5B%22vscjava.vscode-java-pack%22%5D)" diff --git a/src/commands.ts b/src/commands.ts index 2e449862..e84a5fe9 100644 --- a/src/commands.ts +++ b/src/commands.ts @@ -72,6 +72,16 @@ export namespace Commands { export const JAVA_PROJECT_CREATE = "java.project.create"; + export const JAVA_PROJECT_CREATE_FROM_MENUS_FILE = "_java.project.create.from.menus.file"; + + export const JAVA_PROJECT_CREATE_FROM_FILEEXPLORER_MENU = "_java.project.create.from.fileexplorer.menu"; + + export const JAVA_PROJECT_CREATE_FROM_FILEEXPLORER_WELCOME = "_java.project.create.from.fileexplorer.welcome"; + + export const JAVA_PROJECT_CREATE_FROM_JAVAPROJECTEXPLORER_WELCOME = "_java.project.create.from.javaprojectexplorer.welcome"; + + export const JAVA_PROJECT_CREATE_FROM_JAVAPROJECTEXPLORER = "_java.project.create.from.javaprojectexplorer"; + export const JAVA_PROJECT_ADD_LIBRARIES = "java.project.addLibraries"; export const JAVA_PROJECT_ADD_LIBRARY_FOLDERS = "java.project.addLibraryFolders"; diff --git a/src/controllers/projectController.ts b/src/controllers/projectController.ts index 6b394ea2..f560c424 100644 --- a/src/controllers/projectController.ts +++ b/src/controllers/projectController.ts @@ -16,7 +16,17 @@ export class ProjectController implements Disposable { public constructor(public readonly context: ExtensionContext) { this.disposable = Disposable.from( - instrumentOperationAsVsCodeCommand(Commands.JAVA_PROJECT_CREATE, () => this.createJavaProject()), + instrumentOperationAsVsCodeCommand(Commands.JAVA_PROJECT_CREATE, () => this.createJavaProject("command")), + instrumentOperationAsVsCodeCommand(Commands.JAVA_PROJECT_CREATE_FROM_MENUS_FILE, + () => this.createJavaProject("menus.file")), + instrumentOperationAsVsCodeCommand(Commands.JAVA_PROJECT_CREATE_FROM_FILEEXPLORER_MENU, + () => this.createJavaProject("fileexplorer.menu")), + instrumentOperationAsVsCodeCommand(Commands.JAVA_PROJECT_CREATE_FROM_FILEEXPLORER_WELCOME, + () => this.createJavaProject("fileexplorer.welcome")), + instrumentOperationAsVsCodeCommand(Commands.JAVA_PROJECT_CREATE_FROM_JAVAPROJECTEXPLORER_WELCOME, + () => this.createJavaProject("javaprojectexplorer.welcome")), + instrumentOperationAsVsCodeCommand(Commands.JAVA_PROJECT_CREATE_FROM_JAVAPROJECTEXPLORER, + () => this.createJavaProject("javaprojectexplorer")), instrumentOperationAsVsCodeCommand(Commands.JAVA_PROJECT_OPEN, () => this.openJavaProject()), instrumentOperationAsVsCodeCommand(Commands.INSTALL_EXTENSION, (extensionId: string) => { commands.executeCommand("workbench.extensions.installExtension", extensionId); @@ -40,7 +50,7 @@ export class ProjectController implements Disposable { return commands.executeCommand(Commands.WORKBENCH_ACTION_FILES_OPENFILEFOLDER); } - public async createJavaProject() { + public async createJavaProject(triggerFrom : string) { const items: IProjectTypeQuickPick[] = projectTypes.map((type: IProjectType) => { return { label: type.displayName, @@ -56,7 +66,10 @@ export class ProjectController implements Disposable { if (!choice || !await ensureExtension(choice.label, choice.metadata)) { return; } - sendInfo("", {projectCreationType: choice.metadata.type}); + sendInfo("", { + projectCreationType: choice.metadata.type, + triggerfrom: triggerFrom, + }); if (choice.metadata.type === ProjectType.NoBuildTool) { await scaffoldSimpleProject(this.context); } else if (choice.metadata.createCommandId && choice.metadata.createCommandArgs) { diff --git a/test/ui/command.test.ts b/test/ui/command.test.ts index 37efdaee..8178f00a 100644 --- a/test/ui/command.test.ts +++ b/test/ui/command.test.ts @@ -6,7 +6,7 @@ import * as fse from "fs-extra"; import { platform, tmpdir } from "os"; import * as path from "path"; import * as seleniumWebdriver from "selenium-webdriver"; -import { ActivityBar, By, InputBox, ModalDialog, SideBarView, StatusBar, TextEditor, TreeItem, VSBrowser, ViewSection, Workbench } from "vscode-extension-tester"; +import { ActivityBar, By, InputBox, ModalDialog, SideBarView, StatusBar, TextEditor, TreeItem, VSBrowser, ViewSection, Workbench } from "vscode-extension-tester"; import { sleep } from "../util"; // tslint:disable: only-arrow-functions @@ -57,9 +57,8 @@ describe("Command Tests", function() { } while (true) { try { - const languageStatus = await statusBar.findElement(By.xpath('//*[@id="status.languageStatus"]')); - await languageStatus.click(); - await languageStatus.findElement(By.xpath(`//div[contains(@class, 'context-view')]//div[contains(@class, 'hover-language-status')]//span[contains(@class, 'codicon-thumbsup')]`)); + const serverStatus = await statusBar.findElement(By.xpath('//*[@id="redhat.java.java.serverStatus"]')); + await serverStatus.findElement(By.xpath('//a[contains(@class, "statusbar-item-label")]//span[contains(@class, "codicon-thumbsup")]')); break; } catch (e) { await sleep(100); From a7df4304c6e21565cd17a699330bb4deecd88f03 Mon Sep 17 00:00:00 2001 From: Jinbo Wang Date: Fri, 5 Jan 2024 16:10:54 +0800 Subject: [PATCH 187/352] fix: Update vscode-extension-tester to 7.0.0 & minimum vscode version to 1.83.1 (#810) - Update vscode-extension-tester to 7.0.0 & minimum vscode version to 1.83.1. - Use node 16 to run ui test. --- .github/workflows/linuxUI.yml | 2 +- .github/workflows/windowsUI.yml | 2 +- .vscode/launch.json | 2 +- README.md | 2 +- package-lock.json | 1225 +++++++++++++++++++++++-------- package.json | 6 +- test/ui/command.test.ts | 36 +- 7 files changed, 953 insertions(+), 322 deletions(-) diff --git a/.github/workflows/linuxUI.yml b/.github/workflows/linuxUI.yml index 82a984aa..0fb228c7 100644 --- a/.github/workflows/linuxUI.yml +++ b/.github/workflows/linuxUI.yml @@ -29,7 +29,7 @@ jobs: - name: Setup Node.js environment uses: actions/setup-node@v2 with: - node-version: 14 + node-version: 16 - name: Install Node.js modules run: npm install diff --git a/.github/workflows/windowsUI.yml b/.github/workflows/windowsUI.yml index 9e779896..be506d36 100644 --- a/.github/workflows/windowsUI.yml +++ b/.github/workflows/windowsUI.yml @@ -22,7 +22,7 @@ jobs: - name: Setup Node.js environment uses: actions/setup-node@v2 with: - node-version: 14 + node-version: 16 - name: Install Node.js modules run: npm install diff --git a/.vscode/launch.json b/.vscode/launch.json index 98391691..57261f9f 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -114,7 +114,7 @@ "args": [ "setup-and-run", // If not set, will use the current version of vscode. Find a way not to hardcode this value. - "--code_version=1.77.0", + "--code_version=1.83.1", "${workspaceFolder}/dist/test/ui/command.test.js", ], // To debug the test code, you must set --mode=development inside the vscode:prepublish task. Find a better way to do this. diff --git a/README.md b/README.md index 6506e78b..805b8e76 100644 --- a/README.md +++ b/README.md @@ -57,7 +57,7 @@ You can tell that the glob pattern is supported. And here's more - you can incl ## Requirements -- VS Code (version 1.77.0+) +- VS Code (version 1.83.1+) - [Language Support for Java by Red Hat](https://marketplace.visualstudio.com/items?itemName=redhat.java) diff --git a/package-lock.json b/package-lock.json index 9e6019e6..84d54efa 100644 --- a/package-lock.json +++ b/package-lock.json @@ -27,7 +27,7 @@ "@types/mocha": "^9.1.1", "@types/node": "^16.18.11", "@types/semver": "^7.3.13", - "@types/vscode": "1.77.0", + "@types/vscode": "1.83.1", "@vscode/test-electron": "^2.3.8", "copy-webpack-plugin": "^11.0.0", "glob": "^7.2.3", @@ -35,12 +35,12 @@ "ts-loader": "^9.4.2", "tslint": "^6.1.3", "typescript": "^4.9.4", - "vscode-extension-tester": "^5.9.1", + "vscode-extension-tester": "^7.0.0", "webpack": "^5.76.0", "webpack-cli": "^4.10.0" }, "engines": { - "vscode": "^1.77.0" + "vscode": "^1.83.1" } }, "node_modules/@babel/code-frame": { @@ -158,6 +158,102 @@ "node": ">=10.0.0" } }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dev": true, + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true + }, + "node_modules/@isaacs/cliui/node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, "node_modules/@jridgewell/gen-mapping": { "version": "0.3.3", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", @@ -290,6 +386,16 @@ "node": ">= 8" } }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "dev": true, + "optional": true, + "engines": { + "node": ">=14" + } + }, "node_modules/@sindresorhus/is": { "version": "5.5.2", "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-5.5.2.tgz", @@ -405,9 +511,9 @@ "dev": true }, "node_modules/@types/selenium-webdriver": { - "version": "4.1.15", - "resolved": "https://registry.npmjs.org/@types/selenium-webdriver/-/selenium-webdriver-4.1.15.tgz", - "integrity": "sha512-oQ15G3q3EZ0dS049SB/5zx2tQkIS2kmDQWC/TSfAHJYKvXLZoUiLaPXnfSwbLP8Q5lcJeu5oYjKVSEV0t3H6Bg==", + "version": "4.1.21", + "resolved": "https://registry.npmjs.org/@types/selenium-webdriver/-/selenium-webdriver-4.1.21.tgz", + "integrity": "sha512-QGURnImvxYlIQz5DVhvHdqpYNLBjhJ2Vm+cnQI2G9QZzkWlZm0LkLcvDcHp+qE6N2KBz4CeuvXgPO7W3XQ0Tyw==", "dev": true, "dependencies": { "@types/ws": "*" @@ -420,15 +526,15 @@ "dev": true }, "node_modules/@types/vscode": { - "version": "1.77.0", - "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.77.0.tgz", - "integrity": "sha512-MWFN5R7a33n8eJZJmdVlifjig3LWUNRrPeO1xemIcZ0ae0TEQuRc7G2xV0LUX78RZFECY1plYBn+dP/Acc3L0Q==", + "version": "1.83.1", + "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.83.1.tgz", + "integrity": "sha512-BHu51NaNKOtDf3BOonY3sKFFmZKEpRkzqkZVpSYxowLbs5JqjOQemYFob7Gs5rpxE5tiGhfpnMpcdF/oKrLg4w==", "dev": true }, "node_modules/@types/ws": { - "version": "8.5.5", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.5.tgz", - "integrity": "sha512-lwhs8hktwxSjf9UaZ9tG5M03PGogvFaH8gUgLNbN9HKIg0dvv6q+gkSuJ8HN4/VbyxkuLzCjlN7GquQ0gUJfIg==", + "version": "8.5.10", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.10.tgz", + "integrity": "sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A==", "dev": true, "dependencies": { "@types/node": "*" @@ -468,9 +574,9 @@ } }, "node_modules/@vscode/vsce": { - "version": "2.21.0", - "resolved": "https://registry.npmjs.org/@vscode/vsce/-/vsce-2.21.0.tgz", - "integrity": "sha512-KuxYqScqUY/duJbkj9eE2tN2X/WJoGAy54hHtxT3ZBkM6IzrOg7H7CXGUPBxNlmqku2w/cAjOUSrgIHlzz0mbA==", + "version": "2.22.0", + "resolved": "https://registry.npmjs.org/@vscode/vsce/-/vsce-2.22.0.tgz", + "integrity": "sha512-8df4uJiM3C6GZ2Sx/KilSKVxsetrTBBIUb3c0W4B1EWHcddioVs5mkyDKtMNP0khP/xBILVSzlXxhV+nm2rC9A==", "dev": true, "dependencies": { "azure-devops-node-api": "^11.0.1", @@ -924,26 +1030,6 @@ "node": ">= 8" } }, - "node_modules/arch": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/arch/-/arch-2.2.0.tgz", - "integrity": "sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==", - "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" - } - ] - }, "node_modules/argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", @@ -1250,13 +1336,14 @@ } }, "node_modules/call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.5.tgz", + "integrity": "sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==", "dev": true, "dependencies": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.1", + "set-function-length": "^1.1.1" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -1427,17 +1514,17 @@ } }, "node_modules/clipboardy": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/clipboardy/-/clipboardy-3.0.0.tgz", - "integrity": "sha512-Su+uU5sr1jkUy1sGRpLKjKrvEOVXgSgiSInwa/qeID6aJ07yh+5NWc3h2QfjHjBnfX4LhtFcuAWKUsJ3r+fjbg==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/clipboardy/-/clipboardy-4.0.0.tgz", + "integrity": "sha512-5mOlNS0mhX0707P2I0aZ2V/cmHUEO/fL7VFLqszkhUsxt7RwnmrInf/eEQKlf5GzvYeHIjT+Ov1HRfNmymlG0w==", "dev": true, "dependencies": { - "arch": "^2.2.0", - "execa": "^5.1.1", - "is-wsl": "^2.2.0" + "execa": "^8.0.1", + "is-wsl": "^3.1.0", + "is64bit": "^2.0.0" }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -1668,6 +1755,20 @@ "node": ">=10" } }, + "node_modules/define-data-property": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.1.tgz", + "integrity": "sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.2.1", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", @@ -1770,6 +1871,12 @@ "readable-stream": "^2.0.2" } }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true + }, "node_modules/electron-to-chromium": { "version": "1.4.467", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.467.tgz", @@ -1921,28 +2028,40 @@ } }, "node_modules/execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz", + "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==", "dev": true, "dependencies": { "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", + "get-stream": "^8.0.1", + "human-signals": "^5.0.0", + "is-stream": "^3.0.0", "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" + "npm-run-path": "^5.1.0", + "onetime": "^6.0.0", + "signal-exit": "^4.1.0", + "strip-final-newline": "^3.0.0" }, "engines": { - "node": ">=10" + "node": ">=16.17" }, "funding": { "url": "https://github.com/sindresorhus/execa?sponsor=1" } }, + "node_modules/execa/node_modules/get-stream": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz", + "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==", + "dev": true, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/expand-template": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", @@ -2080,6 +2199,22 @@ } } }, + "node_modules/foreground-child": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz", + "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/form-data": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", @@ -2169,10 +2304,13 @@ } }, "node_modules/function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, "node_modules/get-caller-file": { "version": "2.0.5", @@ -2184,15 +2322,15 @@ } }, "node_modules/get-intrinsic": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", - "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.2.tgz", + "integrity": "sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==", "dev": true, "dependencies": { - "function-bind": "^1.1.1", - "has": "^1.0.3", + "function-bind": "^1.1.2", "has-proto": "^1.0.1", - "has-symbols": "^1.0.3" + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -2295,6 +2433,18 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/got": { "version": "13.0.0", "resolved": "https://registry.npmjs.org/got/-/got-13.0.0.tgz", @@ -2355,6 +2505,18 @@ "node": ">=8" } }, + "node_modules/has-property-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz", + "integrity": "sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.2.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/has-proto": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", @@ -2379,6 +2541,18 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/hasown": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", + "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/he": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", @@ -2475,12 +2649,12 @@ } }, "node_modules/human-signals": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz", + "integrity": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==", "dev": true, "engines": { - "node": ">=10.17.0" + "node": ">=16.17.0" } }, "node_modules/ieee754": { @@ -2594,15 +2768,15 @@ } }, "node_modules/is-docker": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", - "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", + "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", "dev": true, "bin": { "is-docker": "cli.js" }, "engines": { - "node": ">=8" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -2636,6 +2810,24 @@ "node": ">=0.10.0" } }, + "node_modules/is-inside-container": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz", + "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==", + "dev": true, + "dependencies": { + "is-docker": "^3.0.0" + }, + "bin": { + "is-inside-container": "cli.js" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", @@ -2666,12 +2858,12 @@ } }, "node_modules/is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", + "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", "dev": true, "engines": { - "node": ">=8" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -2690,15 +2882,33 @@ } }, "node_modules/is-wsl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", - "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.0.tgz", + "integrity": "sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==", "dev": true, "dependencies": { - "is-docker": "^2.0.0" + "is-inside-container": "^1.0.0" }, "engines": { - "node": ">=8" + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is64bit": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is64bit/-/is64bit-2.0.0.tgz", + "integrity": "sha512-jv+8jaWCl0g2lSBkNSVXdzfBA0npK1HGC2KtWM9FumFRoGS94g3NbCCLVnCYHLjp4GrW2KZeeSTMo5ddtznmGw==", + "dev": true, + "dependencies": { + "system-architecture": "^0.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/isarray": { @@ -2722,6 +2932,24 @@ "node": ">=0.10.0" } }, + "node_modules/jackspeak": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz", + "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==", + "dev": true, + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, "node_modules/jest-worker": { "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", @@ -3021,12 +3249,15 @@ } }, "node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", + "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", "dev": true, "engines": { - "node": ">=6" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/mimic-response": { @@ -3061,6 +3292,15 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/minipass": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", + "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", + "dev": true, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, "node_modules/mkdirp": { "version": "0.5.6", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", @@ -3216,16 +3456,16 @@ } }, "node_modules/monaco-page-objects": { - "version": "3.9.1", - "resolved": "https://registry.npmjs.org/monaco-page-objects/-/monaco-page-objects-3.9.1.tgz", - "integrity": "sha512-Y/haEkl0U5MPH2krk6hyOpSqUdzqY9VIW4NPz48i6QHP1hSCInW2ffXl1zisStv0vBWBrDr8hu5n6Q1i7z99PQ==", + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/monaco-page-objects/-/monaco-page-objects-3.12.0.tgz", + "integrity": "sha512-JiA24MmjeilFUumMtch9v/nzHWFt1TgMt9oRYmQJ7BwOFucFFxU+ksNmEwp5Je3b3tn1F+gDI3A1QwEhdOxXOg==", "dev": true, "dependencies": { - "clipboardy": "^3.0.0", + "clipboardy": "^4.0.0", "clone-deep": "^4.0.1", "compare-versions": "^6.1.0", - "fs-extra": "^11.1.1", - "ts-essentials": "^9.3.2" + "fs-extra": "^11.2.0", + "ts-essentials": "^9.4.1" }, "peerDependencies": { "selenium-webdriver": "^4.6.1", @@ -3233,9 +3473,9 @@ } }, "node_modules/monaco-page-objects/node_modules/fs-extra": { - "version": "11.1.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.1.1.tgz", - "integrity": "sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ==", + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", + "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", "dev": true, "dependencies": { "graceful-fs": "^4.2.0", @@ -3284,9 +3524,9 @@ "dev": true }, "node_modules/node-abi": { - "version": "3.47.0", - "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.47.0.tgz", - "integrity": "sha512-2s6B2CWZM//kPgwnuI0KrYwNjfdByE25zvAaEpq9IH4zcNsarH8Ihu/UuX6XMPEogDAxkuUFeZn60pXNHAqn3A==", + "version": "3.54.0", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.54.0.tgz", + "integrity": "sha512-p7eGEiQil0YUV3ItH4/tBb781L5impVmmx2E9FRKF7d18XXzp4PGT2tdYMFY6wQqgxD0IwNZOiSJ0/K0fSi/OA==", "dev": true, "optional": true, "dependencies": { @@ -3331,15 +3571,30 @@ } }, "node_modules/npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.2.0.tgz", + "integrity": "sha512-W4/tgAXFqFA0iL7fk0+uQ3g7wkL8xJmx3XdK0VGb4cHW//eZTtKGvFBBoRKVTpY7n6ze4NL9ly7rgXcHufqXKg==", "dev": true, "dependencies": { - "path-key": "^3.0.0" + "path-key": "^4.0.0" }, "engines": { - "node": ">=8" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/npm-run-path/node_modules/path-key": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", + "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/nth-check": { @@ -3355,9 +3610,9 @@ } }, "node_modules/object-inspect": { - "version": "1.12.3", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", - "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", + "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", "dev": true, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -3373,15 +3628,15 @@ } }, "node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", + "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", "dev": true, "dependencies": { - "mimic-fn": "^2.1.0" + "mimic-fn": "^4.0.0" }, "engines": { - "node": ">=6" + "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -3517,6 +3772,31 @@ "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", "dev": true }, + "node_modules/path-scurry": { + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.1.tgz", + "integrity": "sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==", + "dev": true, + "dependencies": { + "lru-cache": "^9.1.1 || ^10.0.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.1.0.tgz", + "integrity": "sha512-/1clY/ui8CzjKFyjdvwPWJUYKiFVXG2I2cY0ssG7h4+hwk+XOIX7ZSG9Q7TW8TW3Kp3BUSqgFWBLgL4PJ+Blag==", + "dev": true, + "engines": { + "node": "14 || >=16.14" + } + }, "node_modules/path-type": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", @@ -3941,9 +4221,9 @@ } }, "node_modules/sax": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.3.0.tgz", + "integrity": "sha512-0s+oAmw9zLl1V1cS9BtZN7JAd0cW5e0QH4W3LWEK6a4LaLEA2OTpGYWDY+6XasBLtz6wkm3u1xRw95mRuJ59WA==", "dev": true }, "node_modules/schema-utils": { @@ -3966,14 +4246,14 @@ } }, "node_modules/selenium-webdriver": { - "version": "4.10.0", - "resolved": "https://registry.npmjs.org/selenium-webdriver/-/selenium-webdriver-4.10.0.tgz", - "integrity": "sha512-hSQPw6jgc+ej/UEcdQPG/iBwwMeCEgZr9HByY/J8ToyXztEqXzU9aLsIyrlj1BywBcStO4JQK/zMUWWrV8+riA==", + "version": "4.16.0", + "resolved": "https://registry.npmjs.org/selenium-webdriver/-/selenium-webdriver-4.16.0.tgz", + "integrity": "sha512-IbqpRpfGE7JDGgXHJeWuCqT/tUqnLvZ14csSwt+S8o4nJo3RtQoE9VR4jB47tP/A8ArkYsh/THuMY6kyRP6kuA==", "dev": true, "dependencies": { "jszip": "^3.10.1", "tmp": "^0.2.1", - "ws": ">=8.13.0" + "ws": ">=8.14.2" }, "engines": { "node": ">= 14.20.0" @@ -4002,6 +4282,21 @@ "randombytes": "^2.1.0" } }, + "node_modules/set-function-length": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.1.1.tgz", + "integrity": "sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ==", + "dev": true, + "dependencies": { + "define-data-property": "^1.1.1", + "get-intrinsic": "^1.2.1", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/setimmediate": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", @@ -4056,10 +4351,16 @@ } }, "node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } }, "node_modules/simple-concat": { "version": "1.0.1", @@ -4167,6 +4468,21 @@ "node": ">=8" } }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", @@ -4179,13 +4495,29 @@ "node": ">=8" } }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", + "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", "dev": true, "engines": { - "node": ">=6" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/strip-json-comments": { @@ -4227,6 +4559,18 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/system-architecture": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/system-architecture/-/system-architecture-0.1.0.tgz", + "integrity": "sha512-ulAk51I9UVUyJgxlv9M6lFot2WP3e7t8Kz9+IS6D4rVba1tR9kON+Ey69f+1R4Q8cd45Lod6a4IcJIxnzGc/zA==", + "dev": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/tapable": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", @@ -4497,9 +4841,9 @@ } }, "node_modules/ts-essentials": { - "version": "9.4.0", - "resolved": "https://registry.npmjs.org/ts-essentials/-/ts-essentials-9.4.0.tgz", - "integrity": "sha512-s4BzWZmTh926caZO7XF7MMbwCn1BioT3s3r9hT8ARnwW//30OD0XioEsMyq3ORAHP/deN4Zkst2ZvxXmL+tG6g==", + "version": "9.4.1", + "resolved": "https://registry.npmjs.org/ts-essentials/-/ts-essentials-9.4.1.tgz", + "integrity": "sha512-oke0rI2EN9pzHsesdmrOrnqv1eQODmJpd/noJjwj2ZPC3Z4N2wbjrOEqnsEgmvlO2+4fBb0a794DCna2elEVIQ==", "dev": true, "peerDependencies": { "typescript": ">=4.1.0" @@ -4872,26 +5216,26 @@ } }, "node_modules/vscode-extension-tester": { - "version": "5.9.1", - "resolved": "https://registry.npmjs.org/vscode-extension-tester/-/vscode-extension-tester-5.9.1.tgz", - "integrity": "sha512-dWUUZWiLbjch9yXrdd1GH/LdjZodn4FbNDraffFyON1qEIVio0Z3hwUunKmLBNFQWRseCJfFs5peBqoF5bGo0g==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/vscode-extension-tester/-/vscode-extension-tester-7.0.0.tgz", + "integrity": "sha512-ICl/ITfPZnvx9ofY2gcOg5ZndQo3MSGu6iNa2TdkPLysAYnm5H/hY3IrmwqQqjXI+id+kcxoZMB/SZlsBlxiVw==", "dev": true, "dependencies": { - "@types/selenium-webdriver": "^4.1.15", - "@vscode/vsce": "^2.20.1", - "commander": "^11.0.0", + "@types/selenium-webdriver": "^4.1.21", + "@vscode/vsce": "^2.22.0", + "commander": "^11.1.0", "compare-versions": "^6.1.0", - "fs-extra": "^11.1.0", - "glob": "^8.1.0", + "fs-extra": "^11.2.0", + "glob": "^10.3.10", "got": "^13.0.0", "hpagent": "^1.2.0", "js-yaml": "^4.1.0", - "monaco-page-objects": "^3.9.1", + "monaco-page-objects": "^3.12.0", "sanitize-filename": "^1.6.3", - "selenium-webdriver": "4.10.0", + "selenium-webdriver": "^4.16.0", "targz": "^1.0.1", "unzipper": "^0.10.14", - "vscode-extension-tester-locators": "^3.7.1" + "vscode-extension-tester-locators": "^3.10.0" }, "bin": { "extest": "out/cli.js" @@ -4902,28 +5246,28 @@ } }, "node_modules/vscode-extension-tester-locators": { - "version": "3.7.1", - "resolved": "https://registry.npmjs.org/vscode-extension-tester-locators/-/vscode-extension-tester-locators-3.7.1.tgz", - "integrity": "sha512-My+ZTH2PM0g9JwWw49E+SfBMFLSjBdv6YpjekUFpzhCWK0mH+BjRC0gtINr+x2+KuVZVhsO82oSivBa1d7ZJvg==", + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/vscode-extension-tester-locators/-/vscode-extension-tester-locators-3.10.0.tgz", + "integrity": "sha512-smhCxci1FtaK1ZHVnRtrnv+5YIDAFPkXBWRkyKzrf7CBA4Zpg5hleLKipEVEygBj/MrFCW4oYexqti9hOJX3bw==", "dev": true, "peerDependencies": { - "monaco-page-objects": "^3.9.1", + "monaco-page-objects": "^3.12.0", "selenium-webdriver": "^4.6.1" } }, "node_modules/vscode-extension-tester/node_modules/commander": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-11.0.0.tgz", - "integrity": "sha512-9HMlXtt/BNoYr8ooyjjNRdIilOTkVJXB+GhxMTtOKwk0R4j4lS4NpjuqmRxroBfnfTSHQIHQB7wryHhXarNjmQ==", + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-11.1.0.tgz", + "integrity": "sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==", "dev": true, "engines": { "node": ">=16" } }, "node_modules/vscode-extension-tester/node_modules/fs-extra": { - "version": "11.1.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.1.1.tgz", - "integrity": "sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ==", + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", + "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", "dev": true, "dependencies": { "graceful-fs": "^4.2.0", @@ -4935,19 +5279,37 @@ } }, "node_modules/vscode-extension-tester/node_modules/glob": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", - "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", + "version": "10.3.10", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", + "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", "dev": true, "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^5.0.1", - "once": "^1.3.0" + "foreground-child": "^3.1.0", + "jackspeak": "^2.3.5", + "minimatch": "^9.0.1", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", + "path-scurry": "^1.10.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" }, "engines": { - "node": ">=12" + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/vscode-extension-tester/node_modules/minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" }, "funding": { "url": "https://github.com/sponsors/isaacs" @@ -5195,6 +5557,24 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", @@ -5202,9 +5582,9 @@ "dev": true }, "node_modules/ws": { - "version": "8.14.2", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.14.2.tgz", - "integrity": "sha512-wEBG1ftX4jcglPxgFCMJmZ2PLtSbJ2Peg6TmpJFTbe9GZYOQCDPdMYu/Tm0/bGZkw8paZnJY45J4K2PZrLYq8g==", + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.16.0.tgz", + "integrity": "sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ==", "dev": true, "engines": { "node": ">=10.0.0" @@ -5432,6 +5812,71 @@ "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", "dev": true }, + "@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dev": true, + "requires": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true + }, + "ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true + }, + "emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true + }, + "string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "requires": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + } + }, + "strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "requires": { + "ansi-regex": "^6.0.1" + } + }, + "wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dev": true, + "requires": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + } + } + } + }, "@jridgewell/gen-mapping": { "version": "0.3.3", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", @@ -5543,6 +5988,13 @@ "fastq": "^1.6.0" } }, + "@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "dev": true, + "optional": true + }, "@sindresorhus/is": { "version": "5.5.2", "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-5.5.2.tgz", @@ -5646,9 +6098,9 @@ "dev": true }, "@types/selenium-webdriver": { - "version": "4.1.15", - "resolved": "https://registry.npmjs.org/@types/selenium-webdriver/-/selenium-webdriver-4.1.15.tgz", - "integrity": "sha512-oQ15G3q3EZ0dS049SB/5zx2tQkIS2kmDQWC/TSfAHJYKvXLZoUiLaPXnfSwbLP8Q5lcJeu5oYjKVSEV0t3H6Bg==", + "version": "4.1.21", + "resolved": "https://registry.npmjs.org/@types/selenium-webdriver/-/selenium-webdriver-4.1.21.tgz", + "integrity": "sha512-QGURnImvxYlIQz5DVhvHdqpYNLBjhJ2Vm+cnQI2G9QZzkWlZm0LkLcvDcHp+qE6N2KBz4CeuvXgPO7W3XQ0Tyw==", "dev": true, "requires": { "@types/ws": "*" @@ -5661,15 +6113,15 @@ "dev": true }, "@types/vscode": { - "version": "1.77.0", - "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.77.0.tgz", - "integrity": "sha512-MWFN5R7a33n8eJZJmdVlifjig3LWUNRrPeO1xemIcZ0ae0TEQuRc7G2xV0LUX78RZFECY1plYBn+dP/Acc3L0Q==", + "version": "1.83.1", + "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.83.1.tgz", + "integrity": "sha512-BHu51NaNKOtDf3BOonY3sKFFmZKEpRkzqkZVpSYxowLbs5JqjOQemYFob7Gs5rpxE5tiGhfpnMpcdF/oKrLg4w==", "dev": true }, "@types/ws": { - "version": "8.5.5", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.5.tgz", - "integrity": "sha512-lwhs8hktwxSjf9UaZ9tG5M03PGogvFaH8gUgLNbN9HKIg0dvv6q+gkSuJ8HN4/VbyxkuLzCjlN7GquQ0gUJfIg==", + "version": "8.5.10", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.10.tgz", + "integrity": "sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A==", "dev": true, "requires": { "@types/node": "*" @@ -5703,9 +6155,9 @@ } }, "@vscode/vsce": { - "version": "2.21.0", - "resolved": "https://registry.npmjs.org/@vscode/vsce/-/vsce-2.21.0.tgz", - "integrity": "sha512-KuxYqScqUY/duJbkj9eE2tN2X/WJoGAy54hHtxT3ZBkM6IzrOg7H7CXGUPBxNlmqku2w/cAjOUSrgIHlzz0mbA==", + "version": "2.22.0", + "resolved": "https://registry.npmjs.org/@vscode/vsce/-/vsce-2.22.0.tgz", + "integrity": "sha512-8df4uJiM3C6GZ2Sx/KilSKVxsetrTBBIUb3c0W4B1EWHcddioVs5mkyDKtMNP0khP/xBILVSzlXxhV+nm2rC9A==", "dev": true, "requires": { "azure-devops-node-api": "^11.0.1", @@ -6078,12 +6530,6 @@ "picomatch": "^2.0.4" } }, - "arch": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/arch/-/arch-2.2.0.tgz", - "integrity": "sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==", - "dev": true - }, "argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", @@ -6311,13 +6757,14 @@ } }, "call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.5.tgz", + "integrity": "sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==", "dev": true, "requires": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.1", + "set-function-length": "^1.1.1" } }, "camelcase": { @@ -6431,14 +6878,14 @@ "dev": true }, "clipboardy": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/clipboardy/-/clipboardy-3.0.0.tgz", - "integrity": "sha512-Su+uU5sr1jkUy1sGRpLKjKrvEOVXgSgiSInwa/qeID6aJ07yh+5NWc3h2QfjHjBnfX4LhtFcuAWKUsJ3r+fjbg==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/clipboardy/-/clipboardy-4.0.0.tgz", + "integrity": "sha512-5mOlNS0mhX0707P2I0aZ2V/cmHUEO/fL7VFLqszkhUsxt7RwnmrInf/eEQKlf5GzvYeHIjT+Ov1HRfNmymlG0w==", "dev": true, "requires": { - "arch": "^2.2.0", - "execa": "^5.1.1", - "is-wsl": "^2.2.0" + "execa": "^8.0.1", + "is-wsl": "^3.1.0", + "is64bit": "^2.0.0" } }, "cliui": { @@ -6605,6 +7052,17 @@ "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", "dev": true }, + "define-data-property": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.1.tgz", + "integrity": "sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==", + "dev": true, + "requires": { + "get-intrinsic": "^1.2.1", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.0" + } + }, "delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", @@ -6677,6 +7135,12 @@ "readable-stream": "^2.0.2" } }, + "eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true + }, "electron-to-chromium": { "version": "1.4.467", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.467.tgz", @@ -6784,20 +7248,28 @@ "dev": true }, "execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz", + "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==", "dev": true, "requires": { "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", + "get-stream": "^8.0.1", + "human-signals": "^5.0.0", + "is-stream": "^3.0.0", "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" + "npm-run-path": "^5.1.0", + "onetime": "^6.0.0", + "signal-exit": "^4.1.0", + "strip-final-newline": "^3.0.0" + }, + "dependencies": { + "get-stream": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz", + "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==", + "dev": true + } } }, "expand-template": { @@ -6901,6 +7373,16 @@ "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.3.tgz", "integrity": "sha512-1VzOtuEM8pC9SFU1E+8KfTjZyMztRsgEfwQl44z8A25uy13jSzTj6dyK2Df52iV0vgHCfBwLhDWevLn95w5v6Q==" }, + "foreground-child": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz", + "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" + } + }, "form-data": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", @@ -6970,9 +7452,9 @@ } }, "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", "dev": true }, "get-caller-file": { @@ -6982,15 +7464,15 @@ "dev": true }, "get-intrinsic": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", - "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.2.tgz", + "integrity": "sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==", "dev": true, "requires": { - "function-bind": "^1.1.1", - "has": "^1.0.3", + "function-bind": "^1.1.2", "has-proto": "^1.0.1", - "has-symbols": "^1.0.3" + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" } }, "get-stream": { @@ -7068,6 +7550,15 @@ "slash": "^4.0.0" } }, + "gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dev": true, + "requires": { + "get-intrinsic": "^1.1.3" + } + }, "got": { "version": "13.0.0", "resolved": "https://registry.npmjs.org/got/-/got-13.0.0.tgz", @@ -7113,6 +7604,15 @@ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, + "has-property-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz", + "integrity": "sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==", + "dev": true, + "requires": { + "get-intrinsic": "^1.2.2" + } + }, "has-proto": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", @@ -7125,6 +7625,15 @@ "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", "dev": true }, + "hasown": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", + "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", + "dev": true, + "requires": { + "function-bind": "^1.1.2" + } + }, "he": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", @@ -7196,9 +7705,9 @@ } }, "human-signals": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz", + "integrity": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==", "dev": true }, "ieee754": { @@ -7277,9 +7786,9 @@ } }, "is-docker": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", - "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", + "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", "dev": true }, "is-extglob": { @@ -7301,6 +7810,15 @@ "is-extglob": "^2.1.1" } }, + "is-inside-container": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz", + "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==", + "dev": true, + "requires": { + "is-docker": "^3.0.0" + } + }, "is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", @@ -7322,9 +7840,9 @@ } }, "is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", + "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", "dev": true }, "is-unicode-supported": { @@ -7334,12 +7852,21 @@ "dev": true }, "is-wsl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", - "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.0.tgz", + "integrity": "sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==", + "dev": true, + "requires": { + "is-inside-container": "^1.0.0" + } + }, + "is64bit": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is64bit/-/is64bit-2.0.0.tgz", + "integrity": "sha512-jv+8jaWCl0g2lSBkNSVXdzfBA0npK1HGC2KtWM9FumFRoGS94g3NbCCLVnCYHLjp4GrW2KZeeSTMo5ddtznmGw==", "dev": true, "requires": { - "is-docker": "^2.0.0" + "system-architecture": "^0.1.0" } }, "isarray": { @@ -7360,6 +7887,16 @@ "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", "dev": true }, + "jackspeak": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz", + "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==", + "dev": true, + "requires": { + "@isaacs/cliui": "^8.0.2", + "@pkgjs/parseargs": "^0.11.0" + } + }, "jest-worker": { "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", @@ -7598,9 +8135,9 @@ } }, "mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", + "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", "dev": true }, "mimic-response": { @@ -7623,6 +8160,12 @@ "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", "dev": true }, + "minipass": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", + "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", + "dev": true + }, "mkdirp": { "version": "0.5.6", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", @@ -7750,22 +8293,22 @@ } }, "monaco-page-objects": { - "version": "3.9.1", - "resolved": "https://registry.npmjs.org/monaco-page-objects/-/monaco-page-objects-3.9.1.tgz", - "integrity": "sha512-Y/haEkl0U5MPH2krk6hyOpSqUdzqY9VIW4NPz48i6QHP1hSCInW2ffXl1zisStv0vBWBrDr8hu5n6Q1i7z99PQ==", + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/monaco-page-objects/-/monaco-page-objects-3.12.0.tgz", + "integrity": "sha512-JiA24MmjeilFUumMtch9v/nzHWFt1TgMt9oRYmQJ7BwOFucFFxU+ksNmEwp5Je3b3tn1F+gDI3A1QwEhdOxXOg==", "dev": true, "requires": { - "clipboardy": "^3.0.0", + "clipboardy": "^4.0.0", "clone-deep": "^4.0.1", "compare-versions": "^6.1.0", - "fs-extra": "^11.1.1", - "ts-essentials": "^9.3.2" + "fs-extra": "^11.2.0", + "ts-essentials": "^9.4.1" }, "dependencies": { "fs-extra": { - "version": "11.1.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.1.1.tgz", - "integrity": "sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ==", + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", + "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", "dev": true, "requires": { "graceful-fs": "^4.2.0", @@ -7807,9 +8350,9 @@ "dev": true }, "node-abi": { - "version": "3.47.0", - "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.47.0.tgz", - "integrity": "sha512-2s6B2CWZM//kPgwnuI0KrYwNjfdByE25zvAaEpq9IH4zcNsarH8Ihu/UuX6XMPEogDAxkuUFeZn60pXNHAqn3A==", + "version": "3.54.0", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.54.0.tgz", + "integrity": "sha512-p7eGEiQil0YUV3ItH4/tBb781L5impVmmx2E9FRKF7d18XXzp4PGT2tdYMFY6wQqgxD0IwNZOiSJ0/K0fSi/OA==", "dev": true, "optional": true, "requires": { @@ -7842,12 +8385,20 @@ "dev": true }, "npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.2.0.tgz", + "integrity": "sha512-W4/tgAXFqFA0iL7fk0+uQ3g7wkL8xJmx3XdK0VGb4cHW//eZTtKGvFBBoRKVTpY7n6ze4NL9ly7rgXcHufqXKg==", "dev": true, "requires": { - "path-key": "^3.0.0" + "path-key": "^4.0.0" + }, + "dependencies": { + "path-key": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", + "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", + "dev": true + } } }, "nth-check": { @@ -7860,9 +8411,9 @@ } }, "object-inspect": { - "version": "1.12.3", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", - "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", + "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", "dev": true }, "once": { @@ -7875,12 +8426,12 @@ } }, "onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", + "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", "dev": true, "requires": { - "mimic-fn": "^2.1.0" + "mimic-fn": "^4.0.0" } }, "p-cancelable": { @@ -7979,6 +8530,24 @@ "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", "dev": true }, + "path-scurry": { + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.1.tgz", + "integrity": "sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==", + "dev": true, + "requires": { + "lru-cache": "^9.1.1 || ^10.0.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "dependencies": { + "lru-cache": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.1.0.tgz", + "integrity": "sha512-/1clY/ui8CzjKFyjdvwPWJUYKiFVXG2I2cY0ssG7h4+hwk+XOIX7ZSG9Q7TW8TW3Kp3BUSqgFWBLgL4PJ+Blag==", + "dev": true + } + } + }, "path-type": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", @@ -8282,9 +8851,9 @@ } }, "sax": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.3.0.tgz", + "integrity": "sha512-0s+oAmw9zLl1V1cS9BtZN7JAd0cW5e0QH4W3LWEK6a4LaLEA2OTpGYWDY+6XasBLtz6wkm3u1xRw95mRuJ59WA==", "dev": true }, "schema-utils": { @@ -8300,14 +8869,14 @@ } }, "selenium-webdriver": { - "version": "4.10.0", - "resolved": "https://registry.npmjs.org/selenium-webdriver/-/selenium-webdriver-4.10.0.tgz", - "integrity": "sha512-hSQPw6jgc+ej/UEcdQPG/iBwwMeCEgZr9HByY/J8ToyXztEqXzU9aLsIyrlj1BywBcStO4JQK/zMUWWrV8+riA==", + "version": "4.16.0", + "resolved": "https://registry.npmjs.org/selenium-webdriver/-/selenium-webdriver-4.16.0.tgz", + "integrity": "sha512-IbqpRpfGE7JDGgXHJeWuCqT/tUqnLvZ14csSwt+S8o4nJo3RtQoE9VR4jB47tP/A8ArkYsh/THuMY6kyRP6kuA==", "dev": true, "requires": { "jszip": "^3.10.1", "tmp": "^0.2.1", - "ws": ">=8.13.0" + "ws": ">=8.14.2" } }, "semver": { @@ -8327,6 +8896,18 @@ "randombytes": "^2.1.0" } }, + "set-function-length": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.1.1.tgz", + "integrity": "sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ==", + "dev": true, + "requires": { + "define-data-property": "^1.1.1", + "get-intrinsic": "^1.2.1", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.0" + } + }, "setimmediate": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", @@ -8369,9 +8950,9 @@ } }, "signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", "dev": true }, "simple-concat": { @@ -8440,6 +9021,17 @@ "strip-ansi": "^6.0.1" } }, + "string-width-cjs": { + "version": "npm:string-width@4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, "strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", @@ -8449,10 +9041,19 @@ "ansi-regex": "^5.0.1" } }, + "strip-ansi-cjs": { + "version": "npm:strip-ansi@6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.1" + } + }, "strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", + "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", "dev": true }, "strip-json-comments": { @@ -8476,6 +9077,12 @@ "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", "dev": true }, + "system-architecture": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/system-architecture/-/system-architecture-0.1.0.tgz", + "integrity": "sha512-ulAk51I9UVUyJgxlv9M6lFot2WP3e7t8Kz9+IS6D4rVba1tR9kON+Ey69f+1R4Q8cd45Lod6a4IcJIxnzGc/zA==", + "dev": true + }, "tapable": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", @@ -8691,9 +9298,9 @@ } }, "ts-essentials": { - "version": "9.4.0", - "resolved": "https://registry.npmjs.org/ts-essentials/-/ts-essentials-9.4.0.tgz", - "integrity": "sha512-s4BzWZmTh926caZO7XF7MMbwCn1BioT3s3r9hT8ARnwW//30OD0XioEsMyq3ORAHP/deN4Zkst2ZvxXmL+tG6g==", + "version": "9.4.1", + "resolved": "https://registry.npmjs.org/ts-essentials/-/ts-essentials-9.4.1.tgz", + "integrity": "sha512-oke0rI2EN9pzHsesdmrOrnqv1eQODmJpd/noJjwj2ZPC3Z4N2wbjrOEqnsEgmvlO2+4fBb0a794DCna2elEVIQ==", "dev": true, "requires": {} }, @@ -8972,38 +9579,38 @@ } }, "vscode-extension-tester": { - "version": "5.9.1", - "resolved": "https://registry.npmjs.org/vscode-extension-tester/-/vscode-extension-tester-5.9.1.tgz", - "integrity": "sha512-dWUUZWiLbjch9yXrdd1GH/LdjZodn4FbNDraffFyON1qEIVio0Z3hwUunKmLBNFQWRseCJfFs5peBqoF5bGo0g==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/vscode-extension-tester/-/vscode-extension-tester-7.0.0.tgz", + "integrity": "sha512-ICl/ITfPZnvx9ofY2gcOg5ZndQo3MSGu6iNa2TdkPLysAYnm5H/hY3IrmwqQqjXI+id+kcxoZMB/SZlsBlxiVw==", "dev": true, "requires": { - "@types/selenium-webdriver": "^4.1.15", - "@vscode/vsce": "^2.20.1", - "commander": "^11.0.0", + "@types/selenium-webdriver": "^4.1.21", + "@vscode/vsce": "^2.22.0", + "commander": "^11.1.0", "compare-versions": "^6.1.0", - "fs-extra": "^11.1.0", - "glob": "^8.1.0", + "fs-extra": "^11.2.0", + "glob": "^10.3.10", "got": "^13.0.0", "hpagent": "^1.2.0", "js-yaml": "^4.1.0", - "monaco-page-objects": "^3.9.1", + "monaco-page-objects": "^3.12.0", "sanitize-filename": "^1.6.3", - "selenium-webdriver": "4.10.0", + "selenium-webdriver": "^4.16.0", "targz": "^1.0.1", "unzipper": "^0.10.14", - "vscode-extension-tester-locators": "^3.7.1" + "vscode-extension-tester-locators": "^3.10.0" }, "dependencies": { "commander": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-11.0.0.tgz", - "integrity": "sha512-9HMlXtt/BNoYr8ooyjjNRdIilOTkVJXB+GhxMTtOKwk0R4j4lS4NpjuqmRxroBfnfTSHQIHQB7wryHhXarNjmQ==", + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-11.1.0.tgz", + "integrity": "sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==", "dev": true }, "fs-extra": { - "version": "11.1.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.1.1.tgz", - "integrity": "sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ==", + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", + "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", "dev": true, "requires": { "graceful-fs": "^4.2.0", @@ -9012,24 +9619,33 @@ } }, "glob": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", - "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", + "version": "10.3.10", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", + "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", "dev": true, "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^5.0.1", - "once": "^1.3.0" + "foreground-child": "^3.1.0", + "jackspeak": "^2.3.5", + "minimatch": "^9.0.1", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", + "path-scurry": "^1.10.1" + } + }, + "minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "dev": true, + "requires": { + "brace-expansion": "^2.0.1" } } } }, "vscode-extension-tester-locators": { - "version": "3.7.1", - "resolved": "https://registry.npmjs.org/vscode-extension-tester-locators/-/vscode-extension-tester-locators-3.7.1.tgz", - "integrity": "sha512-My+ZTH2PM0g9JwWw49E+SfBMFLSjBdv6YpjekUFpzhCWK0mH+BjRC0gtINr+x2+KuVZVhsO82oSivBa1d7ZJvg==", + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/vscode-extension-tester-locators/-/vscode-extension-tester-locators-3.10.0.tgz", + "integrity": "sha512-smhCxci1FtaK1ZHVnRtrnv+5YIDAFPkXBWRkyKzrf7CBA4Zpg5hleLKipEVEygBj/MrFCW4oYexqti9hOJX3bw==", "dev": true, "requires": {} }, @@ -9197,6 +9813,17 @@ "strip-ansi": "^6.0.0" } }, + "wrap-ansi-cjs": { + "version": "npm:wrap-ansi@7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + }, "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", @@ -9204,9 +9831,9 @@ "dev": true }, "ws": { - "version": "8.14.2", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.14.2.tgz", - "integrity": "sha512-wEBG1ftX4jcglPxgFCMJmZ2PLtSbJ2Peg6TmpJFTbe9GZYOQCDPdMYu/Tm0/bGZkw8paZnJY45J4K2PZrLYq8g==", + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.16.0.tgz", + "integrity": "sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ==", "dev": true, "requires": {} }, diff --git a/package.json b/package.json index ace47608..c6e89fbb 100644 --- a/package.json +++ b/package.json @@ -12,7 +12,7 @@ "explorer" ], "engines": { - "vscode": "^1.77.0" + "vscode": "^1.83.1" }, "repository": { "type": "git", @@ -1014,7 +1014,7 @@ "@types/mocha": "^9.1.1", "@types/node": "^16.18.11", "@types/semver": "^7.3.13", - "@types/vscode": "1.77.0", + "@types/vscode": "1.83.1", "@vscode/test-electron": "^2.3.8", "copy-webpack-plugin": "^11.0.0", "glob": "^7.2.3", @@ -1022,7 +1022,7 @@ "ts-loader": "^9.4.2", "tslint": "^6.1.3", "typescript": "^4.9.4", - "vscode-extension-tester": "^5.9.1", + "vscode-extension-tester": "^7.0.0", "webpack": "^5.76.0", "webpack-cli": "^4.10.0" }, diff --git a/test/ui/command.test.ts b/test/ui/command.test.ts index 8178f00a..d9f28cd0 100644 --- a/test/ui/command.test.ts +++ b/test/ui/command.test.ts @@ -13,7 +13,9 @@ import { sleep } from "../util"; const newProjectName = "helloworld"; const testFolder = path.join(__dirname, "..", "..", "..", "test"); const mavenProjectPath = path.join(testFolder, "maven"); +const mavenJavaFilePath = path.join("src", "main", "java", "com", "mycompany", "app", "App.java"); const invisibleProjectPath = path.join(testFolder, "invisible"); +const invisibleJavaFilePath = path.join("src", "App.java"); // async function pauseInPipeline(timeInMs: number): Promise { // if (process.env.GITHUB_ACTIONS) { @@ -28,6 +30,7 @@ describe("Command Tests", function() { this.timeout(2 * 60 * 1000 /*ms*/); const mavenProjectTmpFolders: string[] = []; let currentProjectPath: string | undefined; + let statusBar: StatusBar; function createTmpProjectFolder(projectName: string) { const tmpFolder = fse.mkdtempSync(path.join(tmpdir(), 'vscode-java-dependency-ui-test')); @@ -47,8 +50,16 @@ describe("Command Tests", function() { await ensureExplorerIsOpen(); } + async function openFile(filePath: string) { + statusBar = new StatusBar(); + if (path.isAbsolute(filePath)) { + await VSBrowser.instance.openResources(filePath); + } else { + await VSBrowser.instance.openResources(path.join(currentProjectPath!, filePath)); + } + } + async function waitForLanguageServerReady() { - const statusBar = new StatusBar(); while (true) { const language = await statusBar.getCurrentLanguage(); if (language === 'Java') { @@ -57,8 +68,9 @@ describe("Command Tests", function() { } while (true) { try { - const serverStatus = await statusBar.findElement(By.xpath('//*[@id="redhat.java.java.serverStatus"]')); - await serverStatus.findElement(By.xpath('//a[contains(@class, "statusbar-item-label")]//span[contains(@class, "codicon-thumbsup")]')); + const languageStatus = await statusBar.findElement(By.xpath('//*[@id="status.languageStatus"]')); + await languageStatus.click(); + await languageStatus.findElement(By.xpath(`//div[contains(@class, 'context-view')]//div[contains(@class, 'hover-language-status')]//span[contains(@class, 'codicon-thumbsup')]`)); break; } catch (e) { await sleep(100); @@ -68,7 +80,7 @@ describe("Command Tests", function() { before(async function() { await openProject(mavenProjectPath); - await openFile('App.java'); + await openFile(mavenJavaFilePath); await waitForLanguageServerReady(); }); @@ -86,7 +98,7 @@ describe("Command Tests", function() { }); (platform() === "darwin" ? it.skip : it)("Test java.view.package.linkWithFolderExplorer", async function() { - await openFile('App.java'); + await openFile(mavenJavaFilePath); await sleep(1000); const [, section] = await expandInJavaProjects('my-app'); const packageNode = await section.findItem("com.mycompany.app") as TreeItem; @@ -102,7 +114,7 @@ describe("Command Tests", function() { let moreActions = await section.moreActions(); const desynchronize = await moreActions!.getItem("Unlink with Editor"); await desynchronize!.click(); - await openFile('App.java'); + await openFile(mavenJavaFilePath); await sleep(1000); const packageNode = await section.findItem("com.mycompany.app") as TreeItem; assert.ok(!await packageNode.isExpanded(), `Package "com.mycompany.app" should not be expanded`); @@ -225,8 +237,7 @@ describe("Command Tests", function() { it("Test change to invisible project", async function() { await openProject(invisibleProjectPath); - await sleep(1000); - await openFile('App.java'); + await openFile(invisibleJavaFilePath); await waitForLanguageServerReady(); const fileSections = await new SideBarView().getContent().getSections(); await fileSections[0].collapse(); @@ -330,13 +341,6 @@ async function expandInJavaProjects(label: string, ...otherLabels: string[]): Pr return [lastNode, section]; } -async function openFile(filename: string) { - await new Workbench().executeCommand('workbench.action.quickOpen'); - const fileInputBox = await InputBox.create(); - await fileInputBox.setText(filename); - await fileInputBox.confirm(); -} - async function openAppJavaSourceCode(): Promise<[ViewSection, TreeItem]> { const fileSections = await new SideBarView().getContent().getSections(); await fileSections[0].expand(); @@ -376,7 +380,7 @@ async function getActionButton(item: TreeItem, label: string) { // tslint:disable-next-line:max-line-length // "no such element: Unable to locate element: {\"method\":\"xpath\",\"selector\":\".//a[contains(@class, 'action-label') and @role='button' and @title='New...']\"} // This should be filled as an issue (I haven't find one). - // The problem is the @title='New...' which should be @aria-label='New...' for vscode 1.77.0 (and probably above). + // The problem is the @title='New...' which should be @aria-label='New...' for vscode 1.83.1 (and probably above). return item.findElement(By.xpath(`.//a[contains(@class, 'action-label') and @role='button' and contains(@aria-label, '${label}')]`)); } From dbe5c6553f4d04d5d74ce375d5c30caf06f41164 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 11 Jan 2024 12:59:22 +0800 Subject: [PATCH 188/352] chore(deps): Bump follow-redirects from 1.15.3 to 1.15.4 (#813) Bumps [follow-redirects](https://github.com/follow-redirects/follow-redirects) from 1.15.3 to 1.15.4. - [Release notes](https://github.com/follow-redirects/follow-redirects/releases) - [Commits](https://github.com/follow-redirects/follow-redirects/compare/v1.15.3...v1.15.4) --- updated-dependencies: - dependency-name: follow-redirects dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index 84d54efa..6ea15152 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2181,9 +2181,9 @@ } }, "node_modules/follow-redirects": { - "version": "1.15.3", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.3.tgz", - "integrity": "sha512-1VzOtuEM8pC9SFU1E+8KfTjZyMztRsgEfwQl44z8A25uy13jSzTj6dyK2Df52iV0vgHCfBwLhDWevLn95w5v6Q==", + "version": "1.15.4", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.4.tgz", + "integrity": "sha512-Cr4D/5wlrb0z9dgERpUL3LrmPKVDsETIJhaCMeDfuFYcqa5bldGV6wBsAN6X/vxlXQtFBMrXdXxdL8CbDTGniw==", "funding": [ { "type": "individual", @@ -7369,9 +7369,9 @@ } }, "follow-redirects": { - "version": "1.15.3", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.3.tgz", - "integrity": "sha512-1VzOtuEM8pC9SFU1E+8KfTjZyMztRsgEfwQl44z8A25uy13jSzTj6dyK2Df52iV0vgHCfBwLhDWevLn95w5v6Q==" + "version": "1.15.4", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.4.tgz", + "integrity": "sha512-Cr4D/5wlrb0z9dgERpUL3LrmPKVDsETIJhaCMeDfuFYcqa5bldGV6wBsAN6X/vxlXQtFBMrXdXxdL8CbDTGniw==" }, "foreground-child": { "version": "3.1.1", From 666ac401322ab1b5d635b0ec7d85aa704c30e76d Mon Sep 17 00:00:00 2001 From: Sheng Chen Date: Mon, 15 Jan 2024 13:20:55 +0800 Subject: [PATCH 189/352] build: Migrate to 1ES pipeline (#814) Signed-off-by: sheche --- .azure-pipelines/ci.yml | 78 +++++++++++++++++++++++ .azure-pipelines/nightly.yml | 118 +++++++++++++++++++++++++++++++++++ .azure-pipelines/rc.yml | 106 +++++++++++++++++++++++++++++++ .vscodeignore | 1 + 4 files changed, 303 insertions(+) create mode 100644 .azure-pipelines/ci.yml create mode 100644 .azure-pipelines/nightly.yml create mode 100644 .azure-pipelines/rc.yml diff --git a/.azure-pipelines/ci.yml b/.azure-pipelines/ci.yml new file mode 100644 index 00000000..492d6665 --- /dev/null +++ b/.azure-pipelines/ci.yml @@ -0,0 +1,78 @@ +name: $(Date:yyyyMMdd).$(Rev:r) +variables: + - name: Codeql.Enabled + value: true +resources: + repositories: + - repository: self + type: git + ref: refs/heads/main + - repository: 1esPipelines + type: git + name: 1ESPipelineTemplates/1ESPipelineTemplates + ref: refs/tags/release +trigger: + branches: + include: + - main +extends: + template: v1/1ES.Unofficial.PipelineTemplate.yml@1esPipelines + parameters: + pool: + os: linux + name: 1ES_JavaTooling_Pool + image: 1ES_JavaTooling_Ubuntu-2004 + sdl: + sourceAnalysisPool: + name: 1ES_JavaTooling_Pool + image: 1ES_JavaTooling_Windows_2022 + os: windows + customBuildTags: + - MigrationTooling-mseng-VSJava-9020-Tool + stages: + - stage: Build + jobs: + - job: Job_1 + displayName: CI + templateContext: + outputs: + - output: pipelineArtifact + artifactName: extension + targetPath: $(Build.ArtifactStagingDirectory) + displayName: "Publish Artifact: extension" + steps: + - checkout: self + fetchTags: false + - task: JavaToolInstaller@0 + displayName: Use Java 17 + inputs: + versionSpec: "17" + jdkArchitectureOption: x64 + jdkSourceOption: PreInstalled + - task: NodeTool@0 + displayName: Use Node 16.x + inputs: + versionSpec: 16.x + - task: Npm@1 + displayName: npm install + inputs: + verbose: true + - task: Npm@1 + displayName: npm run build-server + inputs: + command: custom + verbose: false + customCommand: run build-server + - task: Bash@3 + displayName: vsce package + inputs: + targetType: inline + script: |- + cd $(Build.SourcesDirectory) + + npx @vscode/vsce@latest package + - task: CopyFiles@2 + displayName: "Copy Files to: $(Build.ArtifactStagingDirectory)" + inputs: + Contents: "*.vsix" + TargetFolder: $(Build.ArtifactStagingDirectory) diff --git a/.azure-pipelines/nightly.yml b/.azure-pipelines/nightly.yml new file mode 100644 index 00000000..bc920bd1 --- /dev/null +++ b/.azure-pipelines/nightly.yml @@ -0,0 +1,118 @@ +name: $(Date:yyyyMMdd).$(Rev:r) +variables: + - name: Codeql.Enabled + value: true +schedules: + - cron: 0 0 * * * + branches: + include: + - refs/heads/main +resources: + repositories: + - repository: self + type: git + ref: refs/heads/main + - repository: 1esPipelines + type: git + name: 1ESPipelineTemplates/1ESPipelineTemplates + ref: refs/tags/release +trigger: none +extends: + template: v1/1ES.Official.PipelineTemplate.yml@1esPipelines + parameters: + pool: + os: linux + name: 1ES_JavaTooling_Pool + image: 1ES_JavaTooling_Ubuntu-2004 + sdl: + sourceAnalysisPool: + name: 1ES_JavaTooling_Pool + image: 1ES_JavaTooling_Windows_2022 + os: windows + customBuildTags: + - MigrationTooling-mseng-VSJava-13463-Tool + stages: + - stage: Build + jobs: + - job: Job_1 + displayName: Agent job 1 + templateContext: + outputs: + - output: pipelineArtifact + artifactName: extension + targetPath: $(Build.ArtifactStagingDirectory) + displayName: "Publish Artifact: extension" + steps: + - checkout: self + clean: true + fetchTags: true + - task: NodeTool@0 + displayName: Use Node 16.x + inputs: + versionSpec: 16.x + - task: JavaToolInstaller@0 + displayName: Use Java 17 + inputs: + versionSpec: "17" + jdkArchitectureOption: x64 + jdkSourceOption: PreInstalled + - task: Npm@1 + displayName: npm install + inputs: + verbose: false + - task: Bash@3 + displayName: npx gulp build_server + inputs: + targetType: inline + script: |- + # Build the jars to the server folder. + npm run build-server + - task: SFP.build-tasks.custom-build-task-1.EsrpCodeSigning@2 + displayName: ESRP CodeSigning + inputs: + ConnectedServiceName: vscjavaci_codesign + FolderPath: server + Pattern: com.microsoft.jdtls.ext.*.jar + signConfigType: inlineSignParams + inlineOperation: |- + [ + { + "KeyCode" : "CP-447347-Java", + "OperationCode" : "JavaSign", + "Parameters" : { + "SigAlg" : "SHA256withRSA", + "Timestamp" : "-tsa http://sha256timestamp.ws.digicert.com/sha256/timestamp" + }, + "ToolName" : "sign", + "ToolVersion" : "1.0" + }, + { + "KeyCode" : "CP-447347-Java", + "OperationCode" : "JavaVerify", + "Parameters" : {}, + "ToolName" : "sign", + "ToolVersion" : "1.0" + } + ] + - task: Bash@3 + displayName: Replace AI key + inputs: + targetType: inline + script: npx json@9.0.6 -I -f package.json -e "this.aiKey=\"$AI_KEY\"" + - task: Bash@3 + displayName: Bash Script + inputs: + targetType: inline + script: |- + node ./scripts/prepare-nightly-build.js + mv ./package.insiders.json ./package.json + - task: Bash@3 + displayName: vsce package --pre-release + inputs: + targetType: inline + script: npx @vscode/vsce@latest package --pre-release + - task: CopyFiles@2 + displayName: "Copy Files to: $(Build.ArtifactStagingDirectory)" + inputs: + Contents: "*.vsix" + TargetFolder: $(Build.ArtifactStagingDirectory) diff --git a/.azure-pipelines/rc.yml b/.azure-pipelines/rc.yml new file mode 100644 index 00000000..2168ff37 --- /dev/null +++ b/.azure-pipelines/rc.yml @@ -0,0 +1,106 @@ +name: $(Date:yyyyMMdd).$(Rev:r) +variables: + - name: Codeql.Enabled + value: true +resources: + repositories: + - repository: self + type: git + ref: refs/heads/main + - repository: 1esPipelines + type: git + name: 1ESPipelineTemplates/1ESPipelineTemplates + ref: refs/tags/release +trigger: none +extends: + template: v1/1ES.Official.PipelineTemplate.yml@1esPipelines + parameters: + pool: + os: linux + name: 1ES_JavaTooling_Pool + image: 1ES_JavaTooling_Ubuntu-2004 + sdl: + sourceAnalysisPool: + name: 1ES_JavaTooling_Pool + image: 1ES_JavaTooling_Windows_2022 + os: windows + customBuildTags: + - MigrationTooling-mseng-VSJava-9019-Tool + stages: + - stage: Build + jobs: + - job: Job_1 + displayName: RC + templateContext: + outputs: + - output: pipelineArtifact + artifactName: extension + targetPath: $(Build.ArtifactStagingDirectory) + displayName: "Publish Artifact: extension" + steps: + - checkout: self + clean: true + fetchTags: true + - task: NodeTool@0 + displayName: Use Node 16.x + inputs: + versionSpec: 16.x + - task: JavaToolInstaller@0 + displayName: Use Java 17 + inputs: + versionSpec: "17" + jdkArchitectureOption: x64 + jdkSourceOption: PreInstalled + - task: Npm@1 + displayName: npm install + inputs: + verbose: false + - task: Bash@3 + displayName: npx gulp build_server + inputs: + targetType: inline + script: |- + # Build the jars to the server folder. + npm run build-server + - task: SFP.build-tasks.custom-build-task-1.EsrpCodeSigning@2 + displayName: ESRP CodeSigning + inputs: + ConnectedServiceName: vscjavaci_codesign + FolderPath: server + Pattern: com.microsoft.jdtls.ext.*.jar + signConfigType: inlineSignParams + inlineOperation: |- + [ + { + "KeyCode" : "CP-447347-Java", + "OperationCode" : "JavaSign", + "Parameters" : { + "SigAlg" : "SHA256withRSA", + "Timestamp" : "-tsa http://sha256timestamp.ws.digicert.com/sha256/timestamp" + }, + "ToolName" : "sign", + "ToolVersion" : "1.0" + }, + { + "KeyCode" : "CP-447347-Java", + "OperationCode" : "JavaVerify", + "Parameters" : {}, + "ToolName" : "sign", + "ToolVersion" : "1.0" + } + ] + - task: Bash@3 + displayName: Replace AI key + inputs: + targetType: inline + script: npx json@9.0.6 -I -f package.json -e "this.aiKey=\"$AI_KEY\"" + - task: Bash@3 + displayName: vsce package + inputs: + targetType: inline + script: npx @vscode/vsce@latest package + - task: CopyFiles@2 + displayName: "Copy Files to: $(Build.ArtifactStagingDirectory)" + inputs: + Contents: "*.vsix" + TargetFolder: $(Build.ArtifactStagingDirectory) diff --git a/.vscodeignore b/.vscodeignore index ef0d51ac..8a6df51d 100644 --- a/.vscodeignore +++ b/.vscodeignore @@ -17,6 +17,7 @@ scripts extension.bundle.ts javaConfig.json .github/** +.azure-pipelines/** images test-resources From 6b8d8eea18ce5eb29811bab84622cee2ea067541 Mon Sep 17 00:00:00 2001 From: Sheng Chen Date: Tue, 30 Jan 2024 15:30:36 +0800 Subject: [PATCH 190/352] build: Prepare for 0.23.4 (#815) --- CHANGELOG.md | 4 ++++ jdtls.ext/com.microsoft.jdtls.ext.core/META-INF/MANIFEST.MF | 2 +- jdtls.ext/com.microsoft.jdtls.ext.core/pom.xml | 2 +- jdtls.ext/com.microsoft.jdtls.ext.target/pom.xml | 2 +- jdtls.ext/pom.xml | 2 +- package-lock.json | 4 ++-- package.json | 4 ++-- 7 files changed, 12 insertions(+), 8 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index bdd43677..25d677d8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,10 @@ All notable changes to the "vscode-java-dependency" extension will be documented The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/) and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html). +## 0.23.4 +### Added +- Contribute 'New Java Project...' command to `File` > `New File...` and File Explorer menus. [PR#809](https://github.com/microsoft/vscode-java-dependency/pull/809) + ## 0.23.3 ### Added - Register the project delete event. [PR#802](https://github.com/microsoft/vscode-java-dependency/pull/802) diff --git a/jdtls.ext/com.microsoft.jdtls.ext.core/META-INF/MANIFEST.MF b/jdtls.ext/com.microsoft.jdtls.ext.core/META-INF/MANIFEST.MF index 679be742..fb297f05 100644 --- a/jdtls.ext/com.microsoft.jdtls.ext.core/META-INF/MANIFEST.MF +++ b/jdtls.ext/com.microsoft.jdtls.ext.core/META-INF/MANIFEST.MF @@ -2,7 +2,7 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: JDTLS EXT Core Bundle-SymbolicName: com.microsoft.jdtls.ext.core;singleton:=true -Bundle-Version: 0.23.3 +Bundle-Version: 0.23.4 Bundle-Activator: com.microsoft.jdtls.ext.core.JdtlsExtActivator Bundle-RequiredExecutionEnvironment: JavaSE-11 Bundle-ActivationPolicy: lazy diff --git a/jdtls.ext/com.microsoft.jdtls.ext.core/pom.xml b/jdtls.ext/com.microsoft.jdtls.ext.core/pom.xml index b46547f6..7e457058 100644 --- a/jdtls.ext/com.microsoft.jdtls.ext.core/pom.xml +++ b/jdtls.ext/com.microsoft.jdtls.ext.core/pom.xml @@ -5,7 +5,7 @@ com.microsoft.jdtls.ext jdtls-ext-parent - 0.23.3 + 0.23.4 com.microsoft.jdtls.ext.core eclipse-plugin diff --git a/jdtls.ext/com.microsoft.jdtls.ext.target/pom.xml b/jdtls.ext/com.microsoft.jdtls.ext.target/pom.xml index 533221c5..4ff5920a 100644 --- a/jdtls.ext/com.microsoft.jdtls.ext.target/pom.xml +++ b/jdtls.ext/com.microsoft.jdtls.ext.target/pom.xml @@ -4,7 +4,7 @@ com.microsoft.jdtls.ext jdtls-ext-parent - 0.23.3 + 0.23.4 com.microsoft.jdtls.ext.tp ${base.name} :: Target Platform diff --git a/jdtls.ext/pom.xml b/jdtls.ext/pom.xml index 7048b79d..58d1839f 100644 --- a/jdtls.ext/pom.xml +++ b/jdtls.ext/pom.xml @@ -4,7 +4,7 @@ com.microsoft.jdtls.ext jdtls-ext-parent ${base.name} :: Parent - 0.23.3 + 0.23.4 pom Java Project Manager diff --git a/package-lock.json b/package-lock.json index 6ea15152..dd0cb22d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "vscode-java-dependency", - "version": "0.23.3", + "version": "0.23.4", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "vscode-java-dependency", - "version": "0.23.3", + "version": "0.23.4", "license": "MIT", "dependencies": { "await-lock": "^2.2.2", diff --git a/package.json b/package.json index c6e89fbb..30096a82 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "vscode-java-dependency", "displayName": "Project Manager for Java", "description": "%description%", - "version": "0.23.3", + "version": "0.23.4", "publisher": "vscjava", "preview": false, "aiKey": "5c642b22-e845-4400-badb-3f8509a70777", @@ -46,7 +46,7 @@ "main": "./main.js", "contributes": { "javaExtensions": [ - "./server/com.microsoft.jdtls.ext.core-0.23.3.jar" + "./server/com.microsoft.jdtls.ext.core-0.23.4.jar" ], "commands": [ { From dd8845caaf3fb268c79ddbb62e94d65231809232 Mon Sep 17 00:00:00 2001 From: Jinbo Wang Date: Fri, 23 Feb 2024 13:28:34 +0800 Subject: [PATCH 191/352] Add 'New Java File' menu to file explorer & adjust the existing file explorer menu order (#820) --- .azure-pipelines/nightly.yml | 2 +- .azure-pipelines/rc.yml | 2 +- package.json | 47 +++++++++++++++++++-- src/explorerCommands/new.ts | 74 +++++++++++++++++++++++++++++---- src/views/dependencyExplorer.ts | 12 +++--- 5 files changed, 117 insertions(+), 20 deletions(-) diff --git a/.azure-pipelines/nightly.yml b/.azure-pipelines/nightly.yml index bc920bd1..f7892014 100644 --- a/.azure-pipelines/nightly.yml +++ b/.azure-pipelines/nightly.yml @@ -70,7 +70,7 @@ extends: - task: SFP.build-tasks.custom-build-task-1.EsrpCodeSigning@2 displayName: ESRP CodeSigning inputs: - ConnectedServiceName: vscjavaci_codesign + ConnectedServiceName: vscjavaci_esrp_codesign FolderPath: server Pattern: com.microsoft.jdtls.ext.*.jar signConfigType: inlineSignParams diff --git a/.azure-pipelines/rc.yml b/.azure-pipelines/rc.yml index 2168ff37..671854a9 100644 --- a/.azure-pipelines/rc.yml +++ b/.azure-pipelines/rc.yml @@ -65,7 +65,7 @@ extends: - task: SFP.build-tasks.custom-build-task-1.EsrpCodeSigning@2 displayName: ESRP CodeSigning inputs: - ConnectedServiceName: vscjavaci_codesign + ConnectedServiceName: vscjavaci_esrp_codesign FolderPath: server Pattern: com.microsoft.jdtls.ext.*.jar signConfigType: inlineSignParams diff --git a/package.json b/package.json index 30096a82..f1289931 100644 --- a/package.json +++ b/package.json @@ -547,17 +547,22 @@ { "command": "java.view.package.revealInProjectExplorer", "when": "resourceFilename =~ /(.*\\.gradle)|(.*\\.gradle\\.kts)|(pom\\.xml)$/ && java:serverMode == Standard", - "group": "navigation@100" + "group": "1_javaactions" }, { "command": "java.view.package.revealInProjectExplorer", "when": "resourceExtname == .java && java:serverMode == Standard", - "group": "navigation@100" + "group": "1_javaactions" }, { "command": "_java.project.create.from.fileexplorer.menu", "when": "explorerResourceIsFolder", - "group": "navigation@10" + "group": "1_javaactions" + }, + { + "submenu": "javaProject.newJavaFile", + "when": "explorerResourceIsFolder", + "group": "1_javaactions" } ], "editor/title": [ @@ -791,6 +796,38 @@ "group": "new2@40", "when": "view == javaProjectExplorer && (viewItem =~ /java:(file|folder|project)/ || viewItem =~ /java:(packageRoot)(?=.*?\\b\\+resource\\b)/)" } + ], + "javaProject.newJavaFile": [ + { + "command": "java.view.package.newJavaClass", + "group": "new@10", + "when": "explorerResourceIsFolder" + }, + { + "command": "java.view.package.newJavaInterface", + "group": "new@20", + "when": "explorerResourceIsFolder" + }, + { + "command": "java.view.package.newJavaEnum", + "group": "new@30", + "when": "explorerResourceIsFolder" + }, + { + "command": "java.view.package.newJavaRecord", + "group": "new@40", + "when": "explorerResourceIsFolder" + }, + { + "command": "java.view.package.newJavaAnnotation", + "group": "new@50", + "when": "explorerResourceIsFolder" + }, + { + "command": "java.view.package.newJavaAbstractClass", + "group": "new@60", + "when": "explorerResourceIsFolder" + } ] }, "submenus": [ @@ -805,6 +842,10 @@ { "id": "javaProject.new", "label": "%contributes.submenus.javaProject.new%" + }, + { + "id": "javaProject.newJavaFile", + "label": "%contributes.commands.java.view.menus.file.newJavaClass%" } ], "views": { diff --git a/src/explorerCommands/new.ts b/src/explorerCommands/new.ts index 248f57e1..736c49c7 100644 --- a/src/explorerCommands/new.ts +++ b/src/explorerCommands/new.ts @@ -12,7 +12,7 @@ import { NodeKind } from "../java/nodeData"; import { DataNode } from "../views/dataNode"; import { resourceRoots } from "../views/packageRootNode"; import { checkJavaQualifiedName } from "./utility"; -import { sendError, setUserError } from "vscode-extension-telemetry-wrapper"; +import { sendError, sendInfo, setUserError } from "vscode-extension-telemetry-wrapper"; // tslint:disable no-var-requires const stringInterpolate = require("fmtr"); @@ -134,7 +134,7 @@ export async function newJavaFile(): Promise { return newUntitledJavaFile(); } - const includeRecord = !(await isVersionLessThan(Uri.file(packageFsPath).toString(), 16)); + const includeRecord = isLanguageServerReady() && !(await isVersionLessThan(Uri.file(packageFsPath).toString(), 16)); const supportedTypes: string[] = JavaType.getDisplayNames(true, includeRecord); const typeName: string | undefined = await window.showQuickPick(supportedTypes, { @@ -148,12 +148,18 @@ export async function newJavaFile(): Promise { newJavaFile0(packageFsPath, JavaType.fromDisplayName(typeName)); } -// Create a new Java file from the context menu of Java Projects view. -export async function newJavaFileWithSpecificType(javaType: JavaType, node?: DataNode): Promise { +// Create a new Java file from the context menu of Java Projects view or File Explorer. +export async function newJavaFileWithSpecificType(javaType: JavaType, node?: DataNode | Uri): Promise { + sendInfo("", { + "triggernewfilefrom": (node instanceof Uri && node?.fsPath) ? "fileExplorer" : "javaProjectExplorer", + "javatype": javaType.label, + }); let packageFsPath: string | undefined; if (!node) { packageFsPath = await inferPackageFsPath(); - } else { + } else if (node instanceof Uri && node?.fsPath) { // File Explorer + packageFsPath = node?.fsPath; + } else if (node instanceof DataNode) { // Java Projects view if (!node?.uri || !canCreateClass(node)) { return; } @@ -292,19 +298,27 @@ async function newUntitledJavaFile(): Promise { textEditor.insertSnippet(new SnippetString(snippets.join("\n"))); } -async function inferPackageFsPath(): Promise { +function isLanguageServerReady(): boolean { const javaLanguageSupport: Extension | undefined = extensions.getExtension(ExtensionName.JAVA_LANGUAGE_SUPPORT); if (!javaLanguageSupport || !javaLanguageSupport.isActive) { - return ""; + return false; } const extensionApi: any = javaLanguageSupport.exports; if (!extensionApi) { - return ""; + return false; } if (extensionApi.serverMode !== "Standard" || extensionApi.status !== "Started") { - return ""; + return false; + } + + return true; +} + +async function inferPackageFsPath(): Promise { + if (!isLanguageServerReady()) { + return getPackageFsPathFromActiveEditor(); } let sourcePaths: string[] | undefined; @@ -342,6 +356,25 @@ async function inferPackageFsPath(): Promise { return ""; } +function getPackageFsPathFromActiveEditor() { + if (!window.activeTextEditor) { + return ""; + } + + const fileUri: Uri = window.activeTextEditor.document.uri; + const workspaceFolder: WorkspaceFolder | undefined = workspace.getWorkspaceFolder(fileUri); + if (!workspaceFolder) { + return ""; + } + + const filePath: string = window.activeTextEditor.document.uri.fsPath; + if (filePath.endsWith(".java")) { + return path.dirname(filePath); + } + + return ""; +} + function canCreateClass(node: DataNode): boolean { if (node.nodeData.kind === NodeKind.Project || node.nodeData.kind === NodeKind.PackageRoot || @@ -383,6 +416,10 @@ async function isVersionLessThan(fileUri: string, targetVersion: number): Promis } async function resolvePackageName(filePath: string): Promise { + if (!isLanguageServerReady()) { + return guessPackageName(filePath); + } + let sourcePaths: string[] = []; const result: IListCommandResult = await commands.executeCommand(Commands.EXECUTE_WORKSPACE_COMMAND, Commands.LIST_SOURCEPATHS); @@ -404,6 +441,25 @@ async function resolvePackageName(filePath: string): Promise { return ""; } +function guessPackageName(filePath: string): string { + const packagePath: string = path.dirname(filePath); + const knownSourcePathPrefixes: string[] = [ + "src/main/java/", + "src/test/java/", + "src\\main\\java\\", + "src\\test\\java\\", + ]; + + for (const prefix of knownSourcePathPrefixes) { + const index: number = packagePath.lastIndexOf(prefix); + if (index > -1) { + return packagePath.substring(index + prefix.length).replace(/[\\\/]/g, "."); + } + } + + return ""; +} + function isPrefix(parentPath: string, filePath: string): boolean { const relative = path.relative(parentPath, filePath); return !relative || (!relative.startsWith('..') && !path.isAbsolute(relative)); diff --git a/src/views/dependencyExplorer.ts b/src/views/dependencyExplorer.ts index af248add..8841b4d8 100644 --- a/src/views/dependencyExplorer.ts +++ b/src/views/dependencyExplorer.ts @@ -116,22 +116,22 @@ export class DependencyExplorer implements Disposable { instrumentOperationAsVsCodeCommand(Commands.VIEW_PACKAGE_NEW, async (node: DataNode) => { newResource(node); }), - instrumentOperationAsVsCodeCommand(Commands.VIEW_PACKAGE_NEW_JAVA_CLASS, async (node?: DataNode) => { + instrumentOperationAsVsCodeCommand(Commands.VIEW_PACKAGE_NEW_JAVA_CLASS, async (node?: DataNode | Uri) => { newJavaFileWithSpecificType(JavaType.CLASS, node); }), - instrumentOperationAsVsCodeCommand(Commands.VIEW_PACKAGE_NEW_JAVA_INTERFACE, async (node?: DataNode) => { + instrumentOperationAsVsCodeCommand(Commands.VIEW_PACKAGE_NEW_JAVA_INTERFACE, async (node?: DataNode | Uri) => { newJavaFileWithSpecificType(JavaType.INTERFACE, node); }), - instrumentOperationAsVsCodeCommand(Commands.VIEW_PACKAGE_NEW_JAVA_ENUM, async (node?: DataNode) => { + instrumentOperationAsVsCodeCommand(Commands.VIEW_PACKAGE_NEW_JAVA_ENUM, async (node?: DataNode | Uri) => { newJavaFileWithSpecificType(JavaType.ENUM, node); }), - instrumentOperationAsVsCodeCommand(Commands.VIEW_PACKAGE_NEW_JAVA_RECORD, async (node?: DataNode) => { + instrumentOperationAsVsCodeCommand(Commands.VIEW_PACKAGE_NEW_JAVA_RECORD, async (node?: DataNode | Uri) => { newJavaFileWithSpecificType(JavaType.RECORD, node); }), - instrumentOperationAsVsCodeCommand(Commands.VIEW_PACKAGE_NEW_JAVA_ANNOTATION, async (node?: DataNode) => { + instrumentOperationAsVsCodeCommand(Commands.VIEW_PACKAGE_NEW_JAVA_ANNOTATION, async (node?: DataNode | Uri) => { newJavaFileWithSpecificType(JavaType.ANNOTATION, node); }), - instrumentOperationAsVsCodeCommand(Commands.VIEW_PACKAGE_NEW_JAVA_ABSTRACT_CLASS, async (node?: DataNode) => { + instrumentOperationAsVsCodeCommand(Commands.VIEW_PACKAGE_NEW_JAVA_ABSTRACT_CLASS, async (node?: DataNode | Uri) => { newJavaFileWithSpecificType(JavaType.ABSTRACT_CLASS, node); }), instrumentOperationAsVsCodeCommand(Commands.VIEW_PACKAGE_NEW_FILE, async (node: DataNode) => { From cbf13db16a7f15bb3c412fafeaebcca13e528d6a Mon Sep 17 00:00:00 2001 From: Jinbo Wang Date: Wed, 28 Feb 2024 12:06:55 +0800 Subject: [PATCH 192/352] Prepare release for 0.23.5 (#821) --- CHANGELOG.md | 7 +++++++ .../com.microsoft.jdtls.ext.core/META-INF/MANIFEST.MF | 2 +- jdtls.ext/com.microsoft.jdtls.ext.core/pom.xml | 2 +- jdtls.ext/com.microsoft.jdtls.ext.target/pom.xml | 2 +- jdtls.ext/pom.xml | 2 +- package-lock.json | 4 ++-- package.json | 4 ++-- 7 files changed, 15 insertions(+), 8 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 25d677d8..b4c55930 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,13 @@ All notable changes to the "vscode-java-dependency" extension will be documented The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/) and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html). +## 0.23.5 +### Added +- Add 'New Java File' menu to File Explorer. [PR#820](https://github.com/microsoft/vscode-java-dependency/pull/820). + +### Changed +- Adjust the existing File Explorer menu order. [PR#820](https://github.com/microsoft/vscode-java-dependency/pull/820). + ## 0.23.4 ### Added - Contribute 'New Java Project...' command to `File` > `New File...` and File Explorer menus. [PR#809](https://github.com/microsoft/vscode-java-dependency/pull/809) diff --git a/jdtls.ext/com.microsoft.jdtls.ext.core/META-INF/MANIFEST.MF b/jdtls.ext/com.microsoft.jdtls.ext.core/META-INF/MANIFEST.MF index fb297f05..49b634c8 100644 --- a/jdtls.ext/com.microsoft.jdtls.ext.core/META-INF/MANIFEST.MF +++ b/jdtls.ext/com.microsoft.jdtls.ext.core/META-INF/MANIFEST.MF @@ -2,7 +2,7 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: JDTLS EXT Core Bundle-SymbolicName: com.microsoft.jdtls.ext.core;singleton:=true -Bundle-Version: 0.23.4 +Bundle-Version: 0.23.5 Bundle-Activator: com.microsoft.jdtls.ext.core.JdtlsExtActivator Bundle-RequiredExecutionEnvironment: JavaSE-11 Bundle-ActivationPolicy: lazy diff --git a/jdtls.ext/com.microsoft.jdtls.ext.core/pom.xml b/jdtls.ext/com.microsoft.jdtls.ext.core/pom.xml index 7e457058..71a5e1cd 100644 --- a/jdtls.ext/com.microsoft.jdtls.ext.core/pom.xml +++ b/jdtls.ext/com.microsoft.jdtls.ext.core/pom.xml @@ -5,7 +5,7 @@ com.microsoft.jdtls.ext jdtls-ext-parent - 0.23.4 + 0.23.5 com.microsoft.jdtls.ext.core eclipse-plugin diff --git a/jdtls.ext/com.microsoft.jdtls.ext.target/pom.xml b/jdtls.ext/com.microsoft.jdtls.ext.target/pom.xml index 4ff5920a..61c4f57f 100644 --- a/jdtls.ext/com.microsoft.jdtls.ext.target/pom.xml +++ b/jdtls.ext/com.microsoft.jdtls.ext.target/pom.xml @@ -4,7 +4,7 @@ com.microsoft.jdtls.ext jdtls-ext-parent - 0.23.4 + 0.23.5 com.microsoft.jdtls.ext.tp ${base.name} :: Target Platform diff --git a/jdtls.ext/pom.xml b/jdtls.ext/pom.xml index 58d1839f..035b28f9 100644 --- a/jdtls.ext/pom.xml +++ b/jdtls.ext/pom.xml @@ -4,7 +4,7 @@ com.microsoft.jdtls.ext jdtls-ext-parent ${base.name} :: Parent - 0.23.4 + 0.23.5 pom Java Project Manager diff --git a/package-lock.json b/package-lock.json index dd0cb22d..d25d56db 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "vscode-java-dependency", - "version": "0.23.4", + "version": "0.23.5", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "vscode-java-dependency", - "version": "0.23.4", + "version": "0.23.5", "license": "MIT", "dependencies": { "await-lock": "^2.2.2", diff --git a/package.json b/package.json index f1289931..ccbf7149 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "vscode-java-dependency", "displayName": "Project Manager for Java", "description": "%description%", - "version": "0.23.4", + "version": "0.23.5", "publisher": "vscjava", "preview": false, "aiKey": "5c642b22-e845-4400-badb-3f8509a70777", @@ -46,7 +46,7 @@ "main": "./main.js", "contributes": { "javaExtensions": [ - "./server/com.microsoft.jdtls.ext.core-0.23.4.jar" + "./server/com.microsoft.jdtls.ext.core-0.23.5.jar" ], "commands": [ { From 9b8fe7e4e6cf1e3d10fa87c7ae3c66cfd757d53e Mon Sep 17 00:00:00 2001 From: Sheng Chen Date: Thu, 29 Feb 2024 04:08:53 -0800 Subject: [PATCH 193/352] fix: Permission issue of no-response bot (#822) Signed-off-by: sheche --- .github/workflows/no-response.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/workflows/no-response.yml b/.github/workflows/no-response.yml index 2cd00744..a29ebc24 100644 --- a/.github/workflows/no-response.yml +++ b/.github/workflows/no-response.yml @@ -13,8 +13,10 @@ on: jobs: noResponse: runs-on: ubuntu-latest + permissions: + issues: write steps: - - uses: lee-dohm/no-response@v0.5.0 + - uses: lee-dohm/no-response@9bb0a4b5e6a45046f00353d5de7d90fb8bd773bb with: token: ${{ github.token }} daysUntilClose: 14 From e1b43a9ab8ca34a65a4385b6870f8c5b45faece9 Mon Sep 17 00:00:00 2001 From: Sheng Chen Date: Mon, 4 Mar 2024 15:37:34 +0800 Subject: [PATCH 194/352] build: Update ADO pipeline definitions (#823) Signed-off-by: Sheng Chen --- .azure-pipelines/nightly.yml | 30 ++++++++++++++++++++++++------ .azure-pipelines/rc.yml | 30 ++++++++++++++++++++++++------ 2 files changed, 48 insertions(+), 12 deletions(-) diff --git a/.azure-pipelines/nightly.yml b/.azure-pipelines/nightly.yml index f7892014..4dd6e40d 100644 --- a/.azure-pipelines/nightly.yml +++ b/.azure-pipelines/nightly.yml @@ -21,9 +21,9 @@ extends: template: v1/1ES.Official.PipelineTemplate.yml@1esPipelines parameters: pool: - os: linux name: 1ES_JavaTooling_Pool - image: 1ES_JavaTooling_Ubuntu-2004 + image: 1ES_JavaTooling_Windows_2022 + os: windows sdl: sourceAnalysisPool: name: 1ES_JavaTooling_Pool @@ -94,11 +94,10 @@ extends: "ToolVersion" : "1.0" } ] - - task: Bash@3 - displayName: Replace AI key + - task: CmdLine@2 + displayName: Replace AI Key inputs: - targetType: inline - script: npx json@9.0.6 -I -f package.json -e "this.aiKey=\"$AI_KEY\"" + script: npx json@9.0.6 -I -f package.json -e "this.aiKey=\"%AI_KEY%\"" - task: Bash@3 displayName: Bash Script inputs: @@ -111,6 +110,25 @@ extends: inputs: targetType: inline script: npx @vscode/vsce@latest package --pre-release + ### Copy files for APIScan + - task: CopyFiles@2 + displayName: "Copy Files for APIScan" + inputs: + Contents: "*.vsix" + TargetFolder: $(Agent.TempDirectory)/APIScanFiles + condition: and(succeeded(), ne(variables['DisableAPIScan'], 'true')) + ### Run latest version of APIScan listed at https://www.1eswiki.com/wiki/APIScan_Build_Task + - task: APIScan@2 + displayName: Run APIScan + inputs: + softwareFolder: $(Agent.TempDirectory)/APIScanFiles + softwareName: "vscode-java-dependency" + softwareVersionNum: "$(Build.BuildId)" + isLargeApp: false + toolVersion: "Latest" + condition: and(succeeded(), ne(variables['DisableAPIScan'], 'true')) + env: + AzureServicesAuthConnectionString: runAs=App;AppId=$(ApiScanClientId);TenantId=$(ApiScanTenant);AppKey=$(ApiScanSecret) - task: CopyFiles@2 displayName: "Copy Files to: $(Build.ArtifactStagingDirectory)" inputs: diff --git a/.azure-pipelines/rc.yml b/.azure-pipelines/rc.yml index 671854a9..3745e081 100644 --- a/.azure-pipelines/rc.yml +++ b/.azure-pipelines/rc.yml @@ -16,9 +16,9 @@ extends: template: v1/1ES.Official.PipelineTemplate.yml@1esPipelines parameters: pool: - os: linux name: 1ES_JavaTooling_Pool - image: 1ES_JavaTooling_Ubuntu-2004 + image: 1ES_JavaTooling_Windows_2022 + os: windows sdl: sourceAnalysisPool: name: 1ES_JavaTooling_Pool @@ -89,16 +89,34 @@ extends: "ToolVersion" : "1.0" } ] - - task: Bash@3 - displayName: Replace AI key + - task: CmdLine@2 + displayName: Replace AI Key inputs: - targetType: inline - script: npx json@9.0.6 -I -f package.json -e "this.aiKey=\"$AI_KEY\"" + script: npx json@9.0.6 -I -f package.json -e "this.aiKey=\"%AI_KEY%\"" - task: Bash@3 displayName: vsce package inputs: targetType: inline script: npx @vscode/vsce@latest package + ### Copy files for APIScan + - task: CopyFiles@2 + displayName: "Copy Files for APIScan" + inputs: + Contents: "*.vsix" + TargetFolder: $(Agent.TempDirectory)/APIScanFiles + condition: and(succeeded(), ne(variables['DisableAPIScan'], 'true')) + ### Run latest version of APIScan listed at https://www.1eswiki.com/wiki/APIScan_Build_Task + - task: APIScan@2 + displayName: Run APIScan + inputs: + softwareFolder: $(Agent.TempDirectory)/APIScanFiles + softwareName: "vscode-java-dependency" + softwareVersionNum: "$(Build.BuildId)" + isLargeApp: false + toolVersion: "Latest" + condition: and(succeeded(), ne(variables['DisableAPIScan'], 'true')) + env: + AzureServicesAuthConnectionString: runAs=App;AppId=$(ApiScanClientId);TenantId=$(ApiScanTenant);AppKey=$(ApiScanSecret) - task: CopyFiles@2 displayName: "Copy Files to: $(Build.ArtifactStagingDirectory)" inputs: From 0201283562ee3af9a24fccace15c0f466e92ed43 Mon Sep 17 00:00:00 2001 From: Sheng Chen Date: Mon, 18 Mar 2024 10:27:16 +0800 Subject: [PATCH 195/352] build: Update target platform (#825) Signed-off-by: Sheng Chen --- .../com.microsoft.jdtls.ext.tp.target | 21 +++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/jdtls.ext/com.microsoft.jdtls.ext.target/com.microsoft.jdtls.ext.tp.target b/jdtls.ext/com.microsoft.jdtls.ext.target/com.microsoft.jdtls.ext.tp.target index e23d62a0..76fe1b37 100644 --- a/jdtls.ext/com.microsoft.jdtls.ext.target/com.microsoft.jdtls.ext.tp.target +++ b/jdtls.ext/com.microsoft.jdtls.ext.target/com.microsoft.jdtls.ext.tp.target @@ -2,10 +2,6 @@ - - - - @@ -14,16 +10,29 @@ + + + - + - + + + + + org.apache.commons + commons-lang3 + 3.14.0 + jar + + + From d7b002d34ae50bb52ad2c098b87db5b41330adc0 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 18 Mar 2024 12:48:13 +0800 Subject: [PATCH 196/352] chore(deps): Bump follow-redirects from 1.15.4 to 1.15.6 (#824) Bumps [follow-redirects](https://github.com/follow-redirects/follow-redirects) from 1.15.4 to 1.15.6. - [Release notes](https://github.com/follow-redirects/follow-redirects/releases) - [Commits](https://github.com/follow-redirects/follow-redirects/compare/v1.15.4...v1.15.6) --- updated-dependencies: - dependency-name: follow-redirects dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Sheng Chen --- package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index d25d56db..0c09d5bc 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2181,9 +2181,9 @@ } }, "node_modules/follow-redirects": { - "version": "1.15.4", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.4.tgz", - "integrity": "sha512-Cr4D/5wlrb0z9dgERpUL3LrmPKVDsETIJhaCMeDfuFYcqa5bldGV6wBsAN6X/vxlXQtFBMrXdXxdL8CbDTGniw==", + "version": "1.15.6", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", + "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==", "funding": [ { "type": "individual", @@ -7369,9 +7369,9 @@ } }, "follow-redirects": { - "version": "1.15.4", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.4.tgz", - "integrity": "sha512-Cr4D/5wlrb0z9dgERpUL3LrmPKVDsETIJhaCMeDfuFYcqa5bldGV6wBsAN6X/vxlXQtFBMrXdXxdL8CbDTGniw==" + "version": "1.15.6", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", + "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==" }, "foreground-child": { "version": "3.1.1", From cf6a5a289b8a1f7c9adeee644b0ea46554169225 Mon Sep 17 00:00:00 2001 From: Sheng Chen Date: Thu, 21 Mar 2024 15:47:10 +0800 Subject: [PATCH 197/352] fix: Referenced Libraries container should be immutable for build tool projects (#826) Signed-off-by: Sheng Chen --- .../src/com/microsoft/jdtls/ext/core/PackageCommand.java | 6 ++---- .../src/com/microsoft/jdtls/ext/core/model/PackageNode.java | 4 ---- src/views/containerNode.ts | 3 ++- src/views/packageRootNode.ts | 3 ++- test/suite/contextValue.test.ts | 4 ++-- 5 files changed, 8 insertions(+), 12 deletions(-) diff --git a/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/PackageCommand.java b/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/PackageCommand.java index e2f35f3b..1bb2e99b 100644 --- a/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/PackageCommand.java +++ b/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/PackageCommand.java @@ -303,10 +303,8 @@ private static List getProjectChildren(PackageParams query, IProgre List result = visitor.getNodes(); // Invisible project will always have the referenced libraries entry - if (!ProjectUtils.isVisibleProject(project)) { + if (!ProjectUtils.isVisibleProject(project) || hasReferencedLibraries) { result.add(PackageNode.REFERENCED_LIBRARIES_CONTAINER); - } else if (hasReferencedLibraries) { - result.add(PackageNode.IMMUTABLE_REFERENCED_LIBRARIES_CONTAINER); } return result; } @@ -589,7 +587,7 @@ public static IProject getProject(String projectUri) { } // This must be an invisible project. - // There might be more than one way to access it, but all containers should link to the same project. + // There might be more than one way to access it, but all containers should link to the same project. return containers[0].getProject(); } } diff --git a/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/model/PackageNode.java b/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/model/PackageNode.java index f945bfd0..7f146d8d 100644 --- a/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/model/PackageNode.java +++ b/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/model/PackageNode.java @@ -69,13 +69,9 @@ public class PackageNode { public static final String REFERENCED_LIBRARIES_PATH = "REFERENCED_LIBRARIES_PATH"; private static final String REFERENCED_LIBRARIES_CONTAINER_NAME = "Referenced Libraries"; - private static final String IMMUTABLE_REFERENCED_LIBRARIES_CONTAINER_NAME = "Referenced Libraries (Read-only)"; public static final ContainerNode REFERENCED_LIBRARIES_CONTAINER = new ContainerNode( REFERENCED_LIBRARIES_CONTAINER_NAME, REFERENCED_LIBRARIES_PATH, NodeKind.CONTAINER, IClasspathEntry.CPE_CONTAINER); - public static final ContainerNode IMMUTABLE_REFERENCED_LIBRARIES_CONTAINER = new ContainerNode( - IMMUTABLE_REFERENCED_LIBRARIES_CONTAINER_NAME, - REFERENCED_LIBRARIES_PATH, NodeKind.CONTAINER, IClasspathEntry.CPE_CONTAINER); /** * Nature Id for the IProject. diff --git a/src/views/containerNode.ts b/src/views/containerNode.ts index 9d7b0691..0245514c 100644 --- a/src/views/containerNode.ts +++ b/src/views/containerNode.ts @@ -27,7 +27,8 @@ export class ContainerNode extends DataNode { return ContainerType.Maven; } else if (containerPath.startsWith(ContainerPath.Gradle)) { return ContainerType.Gradle; - } else if (containerPath.startsWith(ContainerPath.ReferencedLibrary)) { + } else if (containerPath.startsWith(ContainerPath.ReferencedLibrary) && this._project.isUnmanagedFolder()) { + // currently, we only support editing referenced libraries in unmanaged folders return ContainerType.ReferencedLibrary; } return ContainerType.Unknown; diff --git a/src/views/packageRootNode.ts b/src/views/packageRootNode.ts index a4951a28..63de2c65 100644 --- a/src/views/packageRootNode.ts +++ b/src/views/packageRootNode.ts @@ -59,7 +59,8 @@ export class PackageRootNode extends DataNode { if (data.entryKind === PackageRootKind.K_BINARY) { contextValue = Explorer.ContextValueType.Jar; const parent = this.getParent(); - if (parent.path?.startsWith("REFERENCED_LIBRARIES_PATH")) { + // currently, we only support editing referenced libraries in unmanaged folders + if (parent.path?.startsWith("REFERENCED_LIBRARIES_PATH") && this._project.isUnmanagedFolder()) { contextValue += "+referencedLibrary"; } return contextValue; diff --git a/test/suite/contextValue.test.ts b/test/suite/contextValue.test.ts index 3cb04022..34639bbc 100644 --- a/test/suite/contextValue.test.ts +++ b/test/suite/contextValue.test.ts @@ -182,7 +182,7 @@ const referencedLibrariesContainer: ContainerNode = new ContainerNode({ uri: Uri.file(__dirname).toString(), kind: NodeKind.Container, path: "REFERENCED_LIBRARIES_PATH", -}, mavenProject, mavenProject); +}, mavenProject, unmanagedFolder); const sourceRoot: PackageRootNode = new PackageRootNode({ name: "src/main/java", @@ -220,7 +220,7 @@ const referencedLibraryJar: PackageRootNode = new PackageRootNode({ uri: Uri.file(__dirname).toString(), kind: NodeKind.PackageRoot, entryKind: PackageRootKind.K_BINARY, -} as INodeData, referencedLibrariesContainer, mavenProject); +} as INodeData, referencedLibrariesContainer, unmanagedFolder); const sourcePackage: PackageNode = new PackageNode({ name: "com.microsoft.java", From 21f2f1233b5badd17fb7dfbf228218623e36e3c7 Mon Sep 17 00:00:00 2001 From: Sheng Chen Date: Mon, 25 Mar 2024 13:40:26 +0800 Subject: [PATCH 198/352] build: Prepare for 0.23.6 (#827) --- CHANGELOG.md | 4 ++++ jdtls.ext/com.microsoft.jdtls.ext.core/META-INF/MANIFEST.MF | 2 +- jdtls.ext/com.microsoft.jdtls.ext.core/pom.xml | 2 +- .../com.microsoft.jdtls.ext.tp.target | 2 +- jdtls.ext/com.microsoft.jdtls.ext.target/pom.xml | 2 +- jdtls.ext/pom.xml | 2 +- package-lock.json | 4 ++-- package.json | 4 ++-- 8 files changed, 13 insertions(+), 9 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b4c55930..0eeb0d5f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,10 @@ All notable changes to the "vscode-java-dependency" extension will be documented The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/) and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html). +## 0.23.6 +### Fixed +- Referenced Libraries container should be immutable for build tool projects. [PR#826](https://github.com/microsoft/vscode-java-dependency/pull/826) + ## 0.23.5 ### Added - Add 'New Java File' menu to File Explorer. [PR#820](https://github.com/microsoft/vscode-java-dependency/pull/820). diff --git a/jdtls.ext/com.microsoft.jdtls.ext.core/META-INF/MANIFEST.MF b/jdtls.ext/com.microsoft.jdtls.ext.core/META-INF/MANIFEST.MF index 49b634c8..75cd0183 100644 --- a/jdtls.ext/com.microsoft.jdtls.ext.core/META-INF/MANIFEST.MF +++ b/jdtls.ext/com.microsoft.jdtls.ext.core/META-INF/MANIFEST.MF @@ -2,7 +2,7 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: JDTLS EXT Core Bundle-SymbolicName: com.microsoft.jdtls.ext.core;singleton:=true -Bundle-Version: 0.23.5 +Bundle-Version: 0.23.6 Bundle-Activator: com.microsoft.jdtls.ext.core.JdtlsExtActivator Bundle-RequiredExecutionEnvironment: JavaSE-11 Bundle-ActivationPolicy: lazy diff --git a/jdtls.ext/com.microsoft.jdtls.ext.core/pom.xml b/jdtls.ext/com.microsoft.jdtls.ext.core/pom.xml index 71a5e1cd..3a3f179f 100644 --- a/jdtls.ext/com.microsoft.jdtls.ext.core/pom.xml +++ b/jdtls.ext/com.microsoft.jdtls.ext.core/pom.xml @@ -5,7 +5,7 @@ com.microsoft.jdtls.ext jdtls-ext-parent - 0.23.5 + 0.23.6 com.microsoft.jdtls.ext.core eclipse-plugin diff --git a/jdtls.ext/com.microsoft.jdtls.ext.target/com.microsoft.jdtls.ext.tp.target b/jdtls.ext/com.microsoft.jdtls.ext.target/com.microsoft.jdtls.ext.tp.target index 76fe1b37..daa2dbf1 100644 --- a/jdtls.ext/com.microsoft.jdtls.ext.target/com.microsoft.jdtls.ext.tp.target +++ b/jdtls.ext/com.microsoft.jdtls.ext.target/com.microsoft.jdtls.ext.tp.target @@ -14,7 +14,7 @@ - + diff --git a/jdtls.ext/com.microsoft.jdtls.ext.target/pom.xml b/jdtls.ext/com.microsoft.jdtls.ext.target/pom.xml index 61c4f57f..5917e061 100644 --- a/jdtls.ext/com.microsoft.jdtls.ext.target/pom.xml +++ b/jdtls.ext/com.microsoft.jdtls.ext.target/pom.xml @@ -4,7 +4,7 @@ com.microsoft.jdtls.ext jdtls-ext-parent - 0.23.5 + 0.23.6 com.microsoft.jdtls.ext.tp ${base.name} :: Target Platform diff --git a/jdtls.ext/pom.xml b/jdtls.ext/pom.xml index 035b28f9..35ac33db 100644 --- a/jdtls.ext/pom.xml +++ b/jdtls.ext/pom.xml @@ -4,7 +4,7 @@ com.microsoft.jdtls.ext jdtls-ext-parent ${base.name} :: Parent - 0.23.5 + 0.23.6 pom Java Project Manager diff --git a/package-lock.json b/package-lock.json index 0c09d5bc..4da6e0ee 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "vscode-java-dependency", - "version": "0.23.5", + "version": "0.23.6", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "vscode-java-dependency", - "version": "0.23.5", + "version": "0.23.6", "license": "MIT", "dependencies": { "await-lock": "^2.2.2", diff --git a/package.json b/package.json index ccbf7149..3fa5f483 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "vscode-java-dependency", "displayName": "Project Manager for Java", "description": "%description%", - "version": "0.23.5", + "version": "0.23.6", "publisher": "vscjava", "preview": false, "aiKey": "5c642b22-e845-4400-badb-3f8509a70777", @@ -46,7 +46,7 @@ "main": "./main.js", "contributes": { "javaExtensions": [ - "./server/com.microsoft.jdtls.ext.core-0.23.5.jar" + "./server/com.microsoft.jdtls.ext.core-0.23.6.jar" ], "commands": [ { From 25d487b4955d8aaf0fd63da846bdd196d4fcb35c Mon Sep 17 00:00:00 2001 From: Jinbo Wang Date: Fri, 19 Apr 2024 14:57:40 +0800 Subject: [PATCH 199/352] Fix #828: creates file watcher with trailing slash causes problems for other extensions (#829) --- src/syncHandler.ts | 2 +- src/views/dependencyDataProvider.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/syncHandler.ts b/src/syncHandler.ts index 031aa190..d6d247c0 100644 --- a/src/syncHandler.ts +++ b/src/syncHandler.ts @@ -51,7 +51,7 @@ class SyncHandler implements Disposable { try { const uris = await this.getWatchingUris(); for (const uri of uris) { - const normalizedPath: string = uri.fsPath; + const normalizedPath: string = uri.fsPath?.replace(/[\\\/]+$/, ""); // remove trailing slashes const pattern: RelativePattern = new RelativePattern(normalizedPath, "**/*"); const watcher: FileSystemWatcher = workspace.createFileSystemWatcher(pattern); this.disposables.push(watcher); diff --git a/src/views/dependencyDataProvider.ts b/src/views/dependencyDataProvider.ts index 72c4cf55..dd0bd05b 100644 --- a/src/views/dependencyDataProvider.ts +++ b/src/views/dependencyDataProvider.ts @@ -64,7 +64,7 @@ export class DependencyDataProvider implements TreeDataProvider { window.showErrorMessage("The URI of the project is not available, you can try to trigger the command 'Java: Reload Project' from Command Palette."); return; } - const pattern: RelativePattern = new RelativePattern(Uri.parse(node.uri).fsPath, "{pom.xml,*.gradle}"); + const pattern: RelativePattern = new RelativePattern(Uri.parse(node.uri).fsPath?.replace(/[\\\/]+$/, ""), "{pom.xml,*.gradle}"); const uris: Uri[] = await workspace.findFiles(pattern, null /*exclude*/, 1 /*maxResults*/); if (uris.length >= 1) { commands.executeCommand(Commands.JAVA_PROJECT_CONFIGURATION_UPDATE, uris[0]); From 17accfd28aa6377a0191850df072fb5acfbb028f Mon Sep 17 00:00:00 2001 From: Dusan Balek Date: Thu, 25 Apr 2024 08:31:55 +0200 Subject: [PATCH 200/352] =?UTF-8?q?fix:=20Micronaut=C2=AE=20Launch=20exten?= =?UTF-8?q?sion=20renamed.=20(#831)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/controllers/projectController.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/controllers/projectController.ts b/src/controllers/projectController.ts index f560c424..3f9cbaf5 100644 --- a/src/controllers/projectController.ts +++ b/src/controllers/projectController.ts @@ -270,7 +270,7 @@ const projectTypes: IProjectType[] = [ metadata: { type: ProjectType.Micronaut, extensionId: "oracle-labs-graalvm.micronaut", - extensionName: "Micronaut® Launch", + extensionName: "Launch for Micronaut® framework", createCommandId: "extension.micronaut.createProject", }, }, From 6aaf68428f0abac4e224d698ab98c83897c52285 Mon Sep 17 00:00:00 2001 From: Sheng Chen Date: Tue, 14 May 2024 11:17:50 +0800 Subject: [PATCH 201/352] build: Update code sign task to v5 (#834) --- .azure-pipelines/nightly.yml | 9 +++++++-- .azure-pipelines/rc.yml | 9 +++++++-- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/.azure-pipelines/nightly.yml b/.azure-pipelines/nightly.yml index 4dd6e40d..472e9ec3 100644 --- a/.azure-pipelines/nightly.yml +++ b/.azure-pipelines/nightly.yml @@ -67,10 +67,15 @@ extends: script: |- # Build the jars to the server folder. npm run build-server - - task: SFP.build-tasks.custom-build-task-1.EsrpCodeSigning@2 + - task: SFP.build-tasks.custom-build-task-1.EsrpCodeSigning@5 displayName: ESRP CodeSigning inputs: - ConnectedServiceName: vscjavaci_esrp_codesign + ConnectedServiceName: 'ESRP-Release-Test' + AppRegistrationClientId: '1992ee18-e9d2-42d6-ab20-94dd947a44b6' + AppRegistrationTenantId: '72f988bf-86f1-41af-91ab-2d7cd011db47' + AuthAKVName: 'vscjavaci' + AuthCertName: 'vscjava-esrprelease-auth' + AuthSignCertName: 'VSCJava-CodeSign' FolderPath: server Pattern: com.microsoft.jdtls.ext.*.jar signConfigType: inlineSignParams diff --git a/.azure-pipelines/rc.yml b/.azure-pipelines/rc.yml index 3745e081..cc8e8472 100644 --- a/.azure-pipelines/rc.yml +++ b/.azure-pipelines/rc.yml @@ -62,10 +62,15 @@ extends: script: |- # Build the jars to the server folder. npm run build-server - - task: SFP.build-tasks.custom-build-task-1.EsrpCodeSigning@2 + - task: SFP.build-tasks.custom-build-task-1.EsrpCodeSigning@5 displayName: ESRP CodeSigning inputs: - ConnectedServiceName: vscjavaci_esrp_codesign + ConnectedServiceName: 'ESRP-Release-Test' + AppRegistrationClientId: '1992ee18-e9d2-42d6-ab20-94dd947a44b6' + AppRegistrationTenantId: '72f988bf-86f1-41af-91ab-2d7cd011db47' + AuthAKVName: 'vscjavaci' + AuthCertName: 'vscjava-esrprelease-auth' + AuthSignCertName: 'VSCJava-CodeSign' FolderPath: server Pattern: com.microsoft.jdtls.ext.*.jar signConfigType: inlineSignParams From 257b02074759d4e360048c347ae3dfc453820fd0 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 16 Jun 2024 20:02:24 +0800 Subject: [PATCH 202/352] chore(deps): Bump braces from 3.0.2 to 3.0.3 (#841) Bumps [braces](https://github.com/micromatch/braces) from 3.0.2 to 3.0.3. - [Changelog](https://github.com/micromatch/braces/blob/master/CHANGELOG.md) - [Commits](https://github.com/micromatch/braces/compare/3.0.2...3.0.3) --- updated-dependencies: - dependency-name: braces dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/package-lock.json b/package-lock.json index 4da6e0ee..9315d489 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1171,11 +1171,11 @@ } }, "node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", "dependencies": { - "fill-range": "^7.0.1" + "fill-range": "^7.1.1" }, "engines": { "node": ">=8" @@ -2137,9 +2137,9 @@ } }, "node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", "dependencies": { "to-regex-range": "^5.0.1" }, @@ -6647,11 +6647,11 @@ } }, "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", "requires": { - "fill-range": "^7.0.1" + "fill-range": "^7.1.1" } }, "browser-stdout": { @@ -7337,9 +7337,9 @@ } }, "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", "requires": { "to-regex-range": "^5.0.1" } From 10a3140ded7af016f85f02140e88925c8c172ed1 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 19 Jun 2024 09:03:03 +0800 Subject: [PATCH 203/352] chore(deps-dev): Bump ws from 8.16.0 to 8.17.1 (#842) Bumps [ws](https://github.com/websockets/ws) from 8.16.0 to 8.17.1. - [Release notes](https://github.com/websockets/ws/releases) - [Commits](https://github.com/websockets/ws/compare/8.16.0...8.17.1) --- updated-dependencies: - dependency-name: ws dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index 9315d489..02fb7e3e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5582,9 +5582,9 @@ "dev": true }, "node_modules/ws": { - "version": "8.16.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.16.0.tgz", - "integrity": "sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ==", + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz", + "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==", "dev": true, "engines": { "node": ">=10.0.0" @@ -9831,9 +9831,9 @@ "dev": true }, "ws": { - "version": "8.16.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.16.0.tgz", - "integrity": "sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ==", + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz", + "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==", "dev": true, "requires": {} }, From b66179caee2db2c5b5bdc7949a37266b754571fa Mon Sep 17 00:00:00 2001 From: Sheng Chen Date: Thu, 20 Jun 2024 12:24:19 +0800 Subject: [PATCH 204/352] build - Update telemetry wrapper to 0.14.0 (#840) --- package-lock.json | 272 ++++++++++++++++++++++++++++++++++------------ package.json | 2 +- src/extension.ts | 2 +- 3 files changed, 205 insertions(+), 71 deletions(-) diff --git a/package-lock.json b/package-lock.json index 02fb7e3e..85929e6c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -16,7 +16,7 @@ "lodash": "^4.17.21", "minimatch": "^5.1.6", "semver": "^7.3.8", - "vscode-extension-telemetry-wrapper": "^0.13.2", + "vscode-extension-telemetry-wrapper": "^0.14.0", "vscode-tas-client": "^0.1.75" }, "devDependencies": { @@ -313,46 +313,118 @@ } }, "node_modules/@microsoft/1ds-core-js": { - "version": "3.2.12", - "resolved": "https://registry.npmjs.org/@microsoft/1ds-core-js/-/1ds-core-js-3.2.12.tgz", - "integrity": "sha512-cHpxZZ+pbtOyqFMFB/c1COpaOE3VPFU6phYVHVvOA9DvoeMZfI/Xrxaj7B/vfq4MmkiE7nOAPhv5ZRn+i6OogA==", + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@microsoft/1ds-core-js/-/1ds-core-js-4.2.2.tgz", + "integrity": "sha512-4c1AXzOj7ZyX7/97v8fEDYcQ8ymTTmj+j9HYYlcO0/cUbDzZGA7/xzb34chvvAbV60qDEbX0Ha/ea7wzgefORg==", "dependencies": { - "@microsoft/applicationinsights-core-js": "2.8.14", - "@microsoft/applicationinsights-shims": "^2.0.2", - "@microsoft/dynamicproto-js": "^1.1.7" + "@microsoft/applicationinsights-core-js": "3.2.2", + "@microsoft/applicationinsights-shims": "3.0.1", + "@microsoft/dynamicproto-js": "^2.0.3", + "@nevware21/ts-async": ">= 0.5.1 < 2.x", + "@nevware21/ts-utils": ">= 0.11.1 < 2.x" } }, "node_modules/@microsoft/1ds-post-js": { - "version": "3.2.12", - "resolved": "https://registry.npmjs.org/@microsoft/1ds-post-js/-/1ds-post-js-3.2.12.tgz", - "integrity": "sha512-vhIVYg4FzBfwtM8tBqDUq3xU+cFu6SQ7biuJHtQpd5PVjDgvAovVOMRF1khsZE/k2rttRRBpmBgNEqG3Ptoysw==", + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@microsoft/1ds-post-js/-/1ds-post-js-4.2.2.tgz", + "integrity": "sha512-0k1aSxD03r3ugLaYhI8Y8AonI/whOzSQd66XBYURVTs6uheMMxDQdSnAk/4Dwn/TUK3TCEJZBIwZRVpUJtJX9w==", + "dependencies": { + "@microsoft/1ds-core-js": "4.2.2", + "@microsoft/applicationinsights-shims": "3.0.1", + "@microsoft/dynamicproto-js": "^2.0.3", + "@nevware21/ts-async": ">= 0.5.1 < 2.x", + "@nevware21/ts-utils": ">= 0.11.1 < 2.x" + } + }, + "node_modules/@microsoft/applicationinsights-channel-js": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/@microsoft/applicationinsights-channel-js/-/applicationinsights-channel-js-3.2.2.tgz", + "integrity": "sha512-4ruoKxgZYYa+K8JJu8RMY0egKazS8xClbx70NQHa/rJ7JYFgN3OIEIBZtFoMcHR8Vg7MEsNE5/wV6o7WWJkVIA==", + "dependencies": { + "@microsoft/applicationinsights-common": "3.2.2", + "@microsoft/applicationinsights-core-js": "3.2.2", + "@microsoft/applicationinsights-shims": "3.0.1", + "@microsoft/dynamicproto-js": "^2.0.3", + "@nevware21/ts-async": ">= 0.5.1 < 2.x", + "@nevware21/ts-utils": ">= 0.11.1 < 2.x" + }, + "peerDependencies": { + "tslib": "*" + } + }, + "node_modules/@microsoft/applicationinsights-common": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/@microsoft/applicationinsights-common/-/applicationinsights-common-3.2.2.tgz", + "integrity": "sha512-e1C35gdkFSzWyUUR1S8FvisXW3nT3p6wWsLNs+vUKLOTQzsvW3XpNMVtNCq4MfHWiYDuz1lPSzo2eENaij1fVA==", "dependencies": { - "@microsoft/1ds-core-js": "3.2.12", - "@microsoft/applicationinsights-shims": "^2.0.2", - "@microsoft/dynamicproto-js": "^1.1.7" + "@microsoft/applicationinsights-core-js": "3.2.2", + "@microsoft/applicationinsights-shims": "3.0.1", + "@microsoft/dynamicproto-js": "^2.0.3", + "@nevware21/ts-utils": ">= 0.11.1 < 2.x" + }, + "peerDependencies": { + "tslib": "*" } }, "node_modules/@microsoft/applicationinsights-core-js": { - "version": "2.8.14", - "resolved": "https://registry.npmjs.org/@microsoft/applicationinsights-core-js/-/applicationinsights-core-js-2.8.14.tgz", - "integrity": "sha512-XacWUHdjSHMUwdngMZBp0oiCBifD56CQK2Egu2PiBiF4xu2AO2yNCtWSXsQX2g5OkEhVwaEjfa/aH3WbpYxB1g==", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/@microsoft/applicationinsights-core-js/-/applicationinsights-core-js-3.2.2.tgz", + "integrity": "sha512-dF6LZ4ahdhoHufw+N7OXRDzWT8QN193Dvpd8GLqEZdR/KtCTofPSI63yumu+ZkzKYadf1S3w2xg0OmbdyXexoQ==", "dependencies": { - "@microsoft/applicationinsights-shims": "2.0.2", - "@microsoft/dynamicproto-js": "^1.1.9" + "@microsoft/applicationinsights-shims": "3.0.1", + "@microsoft/dynamicproto-js": "^2.0.3", + "@nevware21/ts-async": ">= 0.5.1 < 2.x", + "@nevware21/ts-utils": ">= 0.11.1 < 2.x" }, "peerDependencies": { "tslib": "*" } }, "node_modules/@microsoft/applicationinsights-shims": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@microsoft/applicationinsights-shims/-/applicationinsights-shims-2.0.2.tgz", - "integrity": "sha512-PoHEgsnmcqruLNHZ/amACqdJ6YYQpED0KSRe6J7gIJTtpZC1FfFU9b1fmDKDKtFoUSrPzEh1qzO3kmRZP0betg==" + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@microsoft/applicationinsights-shims/-/applicationinsights-shims-3.0.1.tgz", + "integrity": "sha512-DKwboF47H1nb33rSUfjqI6ryX29v+2QWcTrRvcQDA32AZr5Ilkr7whOOSsD1aBzwqX0RJEIP1Z81jfE3NBm/Lg==", + "dependencies": { + "@nevware21/ts-utils": ">= 0.9.4 < 2.x" + } + }, + "node_modules/@microsoft/applicationinsights-web-basic": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/@microsoft/applicationinsights-web-basic/-/applicationinsights-web-basic-3.2.2.tgz", + "integrity": "sha512-4OdgTurRr/Awm2DcWuAhidFON2UFiirabeO9SSAeTefDCdtzv5fWzntq9zvdV47c+w6WzZkz8nX/bQTgNRb2+w==", + "dependencies": { + "@microsoft/applicationinsights-channel-js": "3.2.2", + "@microsoft/applicationinsights-common": "3.2.2", + "@microsoft/applicationinsights-core-js": "3.2.2", + "@microsoft/applicationinsights-shims": "3.0.1", + "@microsoft/dynamicproto-js": "^2.0.3", + "@nevware21/ts-async": ">= 0.5.1 < 2.x", + "@nevware21/ts-utils": ">= 0.11.1 < 2.x" + }, + "peerDependencies": { + "tslib": "*" + } }, "node_modules/@microsoft/dynamicproto-js": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/@microsoft/dynamicproto-js/-/dynamicproto-js-1.1.9.tgz", - "integrity": "sha512-n1VPsljTSkthsAFYdiWfC+DKzK2WwcRp83Y1YAqdX552BstvsDjft9YXppjUzp11BPsapDoO1LDgrDB0XVsfNQ==" + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@microsoft/dynamicproto-js/-/dynamicproto-js-2.0.3.tgz", + "integrity": "sha512-JTWTU80rMy3mdxOjjpaiDQsTLZ6YSGGqsjURsY6AUQtIj0udlF/jYmhdLZu8693ZIC0T1IwYnFa0+QeiMnziBA==", + "dependencies": { + "@nevware21/ts-utils": ">= 0.10.4 < 2.x" + } + }, + "node_modules/@nevware21/ts-async": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/@nevware21/ts-async/-/ts-async-0.5.1.tgz", + "integrity": "sha512-O2kN8n2HpDWJ7Oji+oTMnhITrCndmrNvrHbGDwAIBydx+FWvLE/vrw4QwnRRMvSCa2AJrcP59Ryklxv30KfkWQ==", + "dependencies": { + "@nevware21/ts-utils": ">= 0.11.2 < 2.x" + } + }, + "node_modules/@nevware21/ts-utils": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/@nevware21/ts-utils/-/ts-utils-0.11.2.tgz", + "integrity": "sha512-80W8BkS09kkGuUHJX50Fqq+QqAslxUaOQytH+3JhRacXs1EpEt2JOOkYKytqFZAYir3SeH9fahniEaDzIBxlUw==" }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", @@ -547,15 +619,16 @@ "dev": true }, "node_modules/@vscode/extension-telemetry": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/@vscode/extension-telemetry/-/extension-telemetry-0.6.2.tgz", - "integrity": "sha512-yb/wxLuaaCRcBAZtDCjNYSisAXz3FWsSqAha5nhHcYxx2ZPdQdWuZqVXGKq0ZpHVndBWWtK6XqtpCN2/HB4S1w==", + "version": "0.9.6", + "resolved": "https://registry.npmjs.org/@vscode/extension-telemetry/-/extension-telemetry-0.9.6.tgz", + "integrity": "sha512-qWK2GNw+b69QRYpjuNM9g3JKToMICoNIdc0rQMtvb4gIG9vKKCZCVCz+ZOx6XM/YlfWAyuPiyxcjIY0xyF+Djg==", "dependencies": { - "@microsoft/1ds-core-js": "^3.2.3", - "@microsoft/1ds-post-js": "^3.2.3" + "@microsoft/1ds-core-js": "^4.1.2", + "@microsoft/1ds-post-js": "^4.1.2", + "@microsoft/applicationinsights-web-basic": "^3.1.2" }, "engines": { - "vscode": "^1.60.0" + "vscode": "^1.75.0" } }, "node_modules/@vscode/test-electron": { @@ -5204,15 +5277,12 @@ } }, "node_modules/vscode-extension-telemetry-wrapper": { - "version": "0.13.3", - "resolved": "https://registry.npmjs.org/vscode-extension-telemetry-wrapper/-/vscode-extension-telemetry-wrapper-0.13.3.tgz", - "integrity": "sha512-k/PbUbH9/xqiMXI2g2RXpDg+4/v08t3NzdPc7HuDPF3A1XcYkgYwsPnS/bqsKZNymSQdbLvVuie6STMxbDX9KQ==", + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/vscode-extension-telemetry-wrapper/-/vscode-extension-telemetry-wrapper-0.14.0.tgz", + "integrity": "sha512-EYr1hqiYVSGfupchDN405zSwuvA8V3tJ62KcLIRDr/4ongOc2AvSZ0BlRq8a0w950tadsMlXTKEheB97fZBttg==", "dependencies": { - "@vscode/extension-telemetry": "^0.6.2", + "@vscode/extension-telemetry": "^0.9.6", "uuid": "^8.3.2" - }, - "engines": { - "vscode": "^1.14.0" } }, "node_modules/vscode-extension-tester": { @@ -5927,43 +5997,106 @@ } }, "@microsoft/1ds-core-js": { - "version": "3.2.12", - "resolved": "https://registry.npmjs.org/@microsoft/1ds-core-js/-/1ds-core-js-3.2.12.tgz", - "integrity": "sha512-cHpxZZ+pbtOyqFMFB/c1COpaOE3VPFU6phYVHVvOA9DvoeMZfI/Xrxaj7B/vfq4MmkiE7nOAPhv5ZRn+i6OogA==", + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@microsoft/1ds-core-js/-/1ds-core-js-4.2.2.tgz", + "integrity": "sha512-4c1AXzOj7ZyX7/97v8fEDYcQ8ymTTmj+j9HYYlcO0/cUbDzZGA7/xzb34chvvAbV60qDEbX0Ha/ea7wzgefORg==", "requires": { - "@microsoft/applicationinsights-core-js": "2.8.14", - "@microsoft/applicationinsights-shims": "^2.0.2", - "@microsoft/dynamicproto-js": "^1.1.7" + "@microsoft/applicationinsights-core-js": "3.2.2", + "@microsoft/applicationinsights-shims": "3.0.1", + "@microsoft/dynamicproto-js": "^2.0.3", + "@nevware21/ts-async": ">= 0.5.1 < 2.x", + "@nevware21/ts-utils": ">= 0.11.1 < 2.x" } }, "@microsoft/1ds-post-js": { - "version": "3.2.12", - "resolved": "https://registry.npmjs.org/@microsoft/1ds-post-js/-/1ds-post-js-3.2.12.tgz", - "integrity": "sha512-vhIVYg4FzBfwtM8tBqDUq3xU+cFu6SQ7biuJHtQpd5PVjDgvAovVOMRF1khsZE/k2rttRRBpmBgNEqG3Ptoysw==", + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@microsoft/1ds-post-js/-/1ds-post-js-4.2.2.tgz", + "integrity": "sha512-0k1aSxD03r3ugLaYhI8Y8AonI/whOzSQd66XBYURVTs6uheMMxDQdSnAk/4Dwn/TUK3TCEJZBIwZRVpUJtJX9w==", "requires": { - "@microsoft/1ds-core-js": "3.2.12", - "@microsoft/applicationinsights-shims": "^2.0.2", - "@microsoft/dynamicproto-js": "^1.1.7" + "@microsoft/1ds-core-js": "4.2.2", + "@microsoft/applicationinsights-shims": "3.0.1", + "@microsoft/dynamicproto-js": "^2.0.3", + "@nevware21/ts-async": ">= 0.5.1 < 2.x", + "@nevware21/ts-utils": ">= 0.11.1 < 2.x" + } + }, + "@microsoft/applicationinsights-channel-js": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/@microsoft/applicationinsights-channel-js/-/applicationinsights-channel-js-3.2.2.tgz", + "integrity": "sha512-4ruoKxgZYYa+K8JJu8RMY0egKazS8xClbx70NQHa/rJ7JYFgN3OIEIBZtFoMcHR8Vg7MEsNE5/wV6o7WWJkVIA==", + "requires": { + "@microsoft/applicationinsights-common": "3.2.2", + "@microsoft/applicationinsights-core-js": "3.2.2", + "@microsoft/applicationinsights-shims": "3.0.1", + "@microsoft/dynamicproto-js": "^2.0.3", + "@nevware21/ts-async": ">= 0.5.1 < 2.x", + "@nevware21/ts-utils": ">= 0.11.1 < 2.x" + } + }, + "@microsoft/applicationinsights-common": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/@microsoft/applicationinsights-common/-/applicationinsights-common-3.2.2.tgz", + "integrity": "sha512-e1C35gdkFSzWyUUR1S8FvisXW3nT3p6wWsLNs+vUKLOTQzsvW3XpNMVtNCq4MfHWiYDuz1lPSzo2eENaij1fVA==", + "requires": { + "@microsoft/applicationinsights-core-js": "3.2.2", + "@microsoft/applicationinsights-shims": "3.0.1", + "@microsoft/dynamicproto-js": "^2.0.3", + "@nevware21/ts-utils": ">= 0.11.1 < 2.x" } }, "@microsoft/applicationinsights-core-js": { - "version": "2.8.14", - "resolved": "https://registry.npmjs.org/@microsoft/applicationinsights-core-js/-/applicationinsights-core-js-2.8.14.tgz", - "integrity": "sha512-XacWUHdjSHMUwdngMZBp0oiCBifD56CQK2Egu2PiBiF4xu2AO2yNCtWSXsQX2g5OkEhVwaEjfa/aH3WbpYxB1g==", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/@microsoft/applicationinsights-core-js/-/applicationinsights-core-js-3.2.2.tgz", + "integrity": "sha512-dF6LZ4ahdhoHufw+N7OXRDzWT8QN193Dvpd8GLqEZdR/KtCTofPSI63yumu+ZkzKYadf1S3w2xg0OmbdyXexoQ==", "requires": { - "@microsoft/applicationinsights-shims": "2.0.2", - "@microsoft/dynamicproto-js": "^1.1.9" + "@microsoft/applicationinsights-shims": "3.0.1", + "@microsoft/dynamicproto-js": "^2.0.3", + "@nevware21/ts-async": ">= 0.5.1 < 2.x", + "@nevware21/ts-utils": ">= 0.11.1 < 2.x" } }, "@microsoft/applicationinsights-shims": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@microsoft/applicationinsights-shims/-/applicationinsights-shims-2.0.2.tgz", - "integrity": "sha512-PoHEgsnmcqruLNHZ/amACqdJ6YYQpED0KSRe6J7gIJTtpZC1FfFU9b1fmDKDKtFoUSrPzEh1qzO3kmRZP0betg==" + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@microsoft/applicationinsights-shims/-/applicationinsights-shims-3.0.1.tgz", + "integrity": "sha512-DKwboF47H1nb33rSUfjqI6ryX29v+2QWcTrRvcQDA32AZr5Ilkr7whOOSsD1aBzwqX0RJEIP1Z81jfE3NBm/Lg==", + "requires": { + "@nevware21/ts-utils": ">= 0.9.4 < 2.x" + } + }, + "@microsoft/applicationinsights-web-basic": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/@microsoft/applicationinsights-web-basic/-/applicationinsights-web-basic-3.2.2.tgz", + "integrity": "sha512-4OdgTurRr/Awm2DcWuAhidFON2UFiirabeO9SSAeTefDCdtzv5fWzntq9zvdV47c+w6WzZkz8nX/bQTgNRb2+w==", + "requires": { + "@microsoft/applicationinsights-channel-js": "3.2.2", + "@microsoft/applicationinsights-common": "3.2.2", + "@microsoft/applicationinsights-core-js": "3.2.2", + "@microsoft/applicationinsights-shims": "3.0.1", + "@microsoft/dynamicproto-js": "^2.0.3", + "@nevware21/ts-async": ">= 0.5.1 < 2.x", + "@nevware21/ts-utils": ">= 0.11.1 < 2.x" + } }, "@microsoft/dynamicproto-js": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/@microsoft/dynamicproto-js/-/dynamicproto-js-1.1.9.tgz", - "integrity": "sha512-n1VPsljTSkthsAFYdiWfC+DKzK2WwcRp83Y1YAqdX552BstvsDjft9YXppjUzp11BPsapDoO1LDgrDB0XVsfNQ==" + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@microsoft/dynamicproto-js/-/dynamicproto-js-2.0.3.tgz", + "integrity": "sha512-JTWTU80rMy3mdxOjjpaiDQsTLZ6YSGGqsjURsY6AUQtIj0udlF/jYmhdLZu8693ZIC0T1IwYnFa0+QeiMnziBA==", + "requires": { + "@nevware21/ts-utils": ">= 0.10.4 < 2.x" + } + }, + "@nevware21/ts-async": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/@nevware21/ts-async/-/ts-async-0.5.1.tgz", + "integrity": "sha512-O2kN8n2HpDWJ7Oji+oTMnhITrCndmrNvrHbGDwAIBydx+FWvLE/vrw4QwnRRMvSCa2AJrcP59Ryklxv30KfkWQ==", + "requires": { + "@nevware21/ts-utils": ">= 0.11.2 < 2.x" + } + }, + "@nevware21/ts-utils": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/@nevware21/ts-utils/-/ts-utils-0.11.2.tgz", + "integrity": "sha512-80W8BkS09kkGuUHJX50Fqq+QqAslxUaOQytH+3JhRacXs1EpEt2JOOkYKytqFZAYir3SeH9fahniEaDzIBxlUw==" }, "@nodelib/fs.scandir": { "version": "2.1.5", @@ -6134,12 +6267,13 @@ "dev": true }, "@vscode/extension-telemetry": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/@vscode/extension-telemetry/-/extension-telemetry-0.6.2.tgz", - "integrity": "sha512-yb/wxLuaaCRcBAZtDCjNYSisAXz3FWsSqAha5nhHcYxx2ZPdQdWuZqVXGKq0ZpHVndBWWtK6XqtpCN2/HB4S1w==", + "version": "0.9.6", + "resolved": "https://registry.npmjs.org/@vscode/extension-telemetry/-/extension-telemetry-0.9.6.tgz", + "integrity": "sha512-qWK2GNw+b69QRYpjuNM9g3JKToMICoNIdc0rQMtvb4gIG9vKKCZCVCz+ZOx6XM/YlfWAyuPiyxcjIY0xyF+Djg==", "requires": { - "@microsoft/1ds-core-js": "^3.2.3", - "@microsoft/1ds-post-js": "^3.2.3" + "@microsoft/1ds-core-js": "^4.1.2", + "@microsoft/1ds-post-js": "^4.1.2", + "@microsoft/applicationinsights-web-basic": "^3.1.2" } }, "@vscode/test-electron": { @@ -9570,11 +9704,11 @@ "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==" }, "vscode-extension-telemetry-wrapper": { - "version": "0.13.3", - "resolved": "https://registry.npmjs.org/vscode-extension-telemetry-wrapper/-/vscode-extension-telemetry-wrapper-0.13.3.tgz", - "integrity": "sha512-k/PbUbH9/xqiMXI2g2RXpDg+4/v08t3NzdPc7HuDPF3A1XcYkgYwsPnS/bqsKZNymSQdbLvVuie6STMxbDX9KQ==", + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/vscode-extension-telemetry-wrapper/-/vscode-extension-telemetry-wrapper-0.14.0.tgz", + "integrity": "sha512-EYr1hqiYVSGfupchDN405zSwuvA8V3tJ62KcLIRDr/4ongOc2AvSZ0BlRq8a0w950tadsMlXTKEheB97fZBttg==", "requires": { - "@vscode/extension-telemetry": "^0.6.2", + "@vscode/extension-telemetry": "^0.9.6", "uuid": "^8.3.2" } }, diff --git a/package.json b/package.json index 3fa5f483..b55c6f10 100644 --- a/package.json +++ b/package.json @@ -1075,7 +1075,7 @@ "lodash": "^4.17.21", "minimatch": "^5.1.6", "semver": "^7.3.8", - "vscode-extension-telemetry-wrapper": "^0.13.2", + "vscode-extension-telemetry-wrapper": "^0.14.0", "vscode-tas-client": "^0.1.75" } } diff --git a/src/extension.ts b/src/extension.ts index b9b1d0d7..531b5ac3 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -23,7 +23,7 @@ import { newJavaFile } from "./explorerCommands/new"; export async function activate(context: ExtensionContext): Promise { contextManager.initialize(context); - await initializeFromJsonFile(context.asAbsolutePath("./package.json"), { firstParty: true }); + await initializeFromJsonFile(context.asAbsolutePath("./package.json")); await initExpService(context); await instrumentOperation("activation", activateExtension)(context); addExtensionChangeListener(context); From 2ee3c9615c29247fbc945956bffb632dd0712b65 Mon Sep 17 00:00:00 2001 From: Sheng Chen Date: Thu, 27 Jun 2024 13:37:13 +0800 Subject: [PATCH 205/352] build - Prepare for 0.23.7 (#843) --- CHANGELOG.md | 4 ++++ jdtls.ext/com.microsoft.jdtls.ext.core/META-INF/MANIFEST.MF | 2 +- jdtls.ext/com.microsoft.jdtls.ext.core/pom.xml | 2 +- jdtls.ext/com.microsoft.jdtls.ext.target/pom.xml | 2 +- jdtls.ext/pom.xml | 2 +- package-lock.json | 4 ++-- package.json | 4 ++-- 7 files changed, 12 insertions(+), 8 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0eeb0d5f..ba4f72eb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,10 @@ All notable changes to the "vscode-java-dependency" extension will be documented The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/) and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html). +## 0.23.7 +* fix - Creates file watcher with trailing slash causes problems for other extensions by @testforstephen in https://github.com/microsoft/vscode-java-dependency/pull/829 +* fix - Micronaut® Launch extension renamed. by @dbalek in https://github.com/microsoft/vscode-java-dependency/pull/831 + ## 0.23.6 ### Fixed - Referenced Libraries container should be immutable for build tool projects. [PR#826](https://github.com/microsoft/vscode-java-dependency/pull/826) diff --git a/jdtls.ext/com.microsoft.jdtls.ext.core/META-INF/MANIFEST.MF b/jdtls.ext/com.microsoft.jdtls.ext.core/META-INF/MANIFEST.MF index 75cd0183..7ba188b8 100644 --- a/jdtls.ext/com.microsoft.jdtls.ext.core/META-INF/MANIFEST.MF +++ b/jdtls.ext/com.microsoft.jdtls.ext.core/META-INF/MANIFEST.MF @@ -2,7 +2,7 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: JDTLS EXT Core Bundle-SymbolicName: com.microsoft.jdtls.ext.core;singleton:=true -Bundle-Version: 0.23.6 +Bundle-Version: 0.23.7 Bundle-Activator: com.microsoft.jdtls.ext.core.JdtlsExtActivator Bundle-RequiredExecutionEnvironment: JavaSE-11 Bundle-ActivationPolicy: lazy diff --git a/jdtls.ext/com.microsoft.jdtls.ext.core/pom.xml b/jdtls.ext/com.microsoft.jdtls.ext.core/pom.xml index 3a3f179f..37ea2cf7 100644 --- a/jdtls.ext/com.microsoft.jdtls.ext.core/pom.xml +++ b/jdtls.ext/com.microsoft.jdtls.ext.core/pom.xml @@ -5,7 +5,7 @@ com.microsoft.jdtls.ext jdtls-ext-parent - 0.23.6 + 0.23.7 com.microsoft.jdtls.ext.core eclipse-plugin diff --git a/jdtls.ext/com.microsoft.jdtls.ext.target/pom.xml b/jdtls.ext/com.microsoft.jdtls.ext.target/pom.xml index 5917e061..43dc8b56 100644 --- a/jdtls.ext/com.microsoft.jdtls.ext.target/pom.xml +++ b/jdtls.ext/com.microsoft.jdtls.ext.target/pom.xml @@ -4,7 +4,7 @@ com.microsoft.jdtls.ext jdtls-ext-parent - 0.23.6 + 0.23.7 com.microsoft.jdtls.ext.tp ${base.name} :: Target Platform diff --git a/jdtls.ext/pom.xml b/jdtls.ext/pom.xml index 35ac33db..ab530794 100644 --- a/jdtls.ext/pom.xml +++ b/jdtls.ext/pom.xml @@ -4,7 +4,7 @@ com.microsoft.jdtls.ext jdtls-ext-parent ${base.name} :: Parent - 0.23.6 + 0.23.7 pom Java Project Manager diff --git a/package-lock.json b/package-lock.json index 85929e6c..43a34ccd 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "vscode-java-dependency", - "version": "0.23.6", + "version": "0.23.7", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "vscode-java-dependency", - "version": "0.23.6", + "version": "0.23.7", "license": "MIT", "dependencies": { "await-lock": "^2.2.2", diff --git a/package.json b/package.json index b55c6f10..9bdb4752 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "vscode-java-dependency", "displayName": "Project Manager for Java", "description": "%description%", - "version": "0.23.6", + "version": "0.23.7", "publisher": "vscjava", "preview": false, "aiKey": "5c642b22-e845-4400-badb-3f8509a70777", @@ -46,7 +46,7 @@ "main": "./main.js", "contributes": { "javaExtensions": [ - "./server/com.microsoft.jdtls.ext.core-0.23.6.jar" + "./server/com.microsoft.jdtls.ext.core-0.23.7.jar" ], "commands": [ { From 0904e0799ffbdcd021ee8bf615d6953a84e425d8 Mon Sep 17 00:00:00 2001 From: Sheng Chen Date: Mon, 1 Jul 2024 15:52:46 +0800 Subject: [PATCH 206/352] build - Add vsix sign steps (#844) --- .azure-pipelines/ci.yml | 4 ++-- .azure-pipelines/nightly.yml | 46 +++++++++++++++++++++++++++++------- .azure-pipelines/rc.yml | 41 ++++++++++++++++++++++++++++---- 3 files changed, 77 insertions(+), 14 deletions(-) diff --git a/.azure-pipelines/ci.yml b/.azure-pipelines/ci.yml index 492d6665..da46c1be 100644 --- a/.azure-pipelines/ci.yml +++ b/.azure-pipelines/ci.yml @@ -50,9 +50,9 @@ extends: jdkArchitectureOption: x64 jdkSourceOption: PreInstalled - task: NodeTool@0 - displayName: Use Node 16.x + displayName: Use Node 18.x inputs: - versionSpec: 16.x + versionSpec: 18.x - task: Npm@1 displayName: npm install inputs: diff --git a/.azure-pipelines/nightly.yml b/.azure-pipelines/nightly.yml index 472e9ec3..94fe2964 100644 --- a/.azure-pipelines/nightly.yml +++ b/.azure-pipelines/nightly.yml @@ -47,9 +47,9 @@ extends: clean: true fetchTags: true - task: NodeTool@0 - displayName: Use Node 16.x + displayName: Use Node 18.x inputs: - versionSpec: 16.x + versionSpec: 18.x - task: JavaToolInstaller@0 displayName: Use Java 17 inputs: @@ -110,11 +110,8 @@ extends: script: |- node ./scripts/prepare-nightly-build.js mv ./package.insiders.json ./package.json - - task: Bash@3 - displayName: vsce package --pre-release - inputs: - targetType: inline - script: npx @vscode/vsce@latest package --pre-release + - script: npx @vscode/vsce@latest package --pre-release -o extension.vsix + displayName: 'vsce package --pre-release' ### Copy files for APIScan - task: CopyFiles@2 displayName: "Copy Files for APIScan" @@ -134,8 +131,41 @@ extends: condition: and(succeeded(), ne(variables['DisableAPIScan'], 'true')) env: AzureServicesAuthConnectionString: runAs=App;AppId=$(ApiScanClientId);TenantId=$(ApiScanTenant);AppKey=$(ApiScanSecret) + - script: npx @vscode/vsce@latest generate-manifest -i extension.vsix -o extension.manifest + displayName: 'Generate extension manifest' + - script: cp extension.manifest extension.signature.p7s + displayName: 'Prepare manifest for signing' + - task: SFP.build-tasks.custom-build-task-1.EsrpCodeSigning@5 + inputs: + ConnectedServiceName: 'ESRP-Release-Test' + AppRegistrationClientId: '1992ee18-e9d2-42d6-ab20-94dd947a44b6' + AppRegistrationTenantId: '72f988bf-86f1-41af-91ab-2d7cd011db47' + AuthAKVName: 'vscjavaci' + AuthCertName: 'vscjava-esrprelease-auth' + AuthSignCertName: 'VSCJava-CodeSign' + FolderPath: '.' + Pattern: 'extension.signature.p7s' + signConfigType: inlineSignParams + inlineOperation: | + [ + { + "keyCode": "CP-401405", + "operationSetCode": "VSCodePublisherSign", + "parameters" : [], + "toolName": "sign", + "toolVersion": "1.0" + } + ] + SessionTimeout: 90 + MaxConcurrency: 25 + MaxRetryAttempts: 5 + PendingAnalysisWaitTimeoutMinutes: 5 + displayName: 'Sign extension' - task: CopyFiles@2 displayName: "Copy Files to: $(Build.ArtifactStagingDirectory)" inputs: - Contents: "*.vsix" + Contents: | + extension.vsix + extension.manifest + extension.signature.p7s TargetFolder: $(Build.ArtifactStagingDirectory) diff --git a/.azure-pipelines/rc.yml b/.azure-pipelines/rc.yml index cc8e8472..ee059eb5 100644 --- a/.azure-pipelines/rc.yml +++ b/.azure-pipelines/rc.yml @@ -42,9 +42,9 @@ extends: clean: true fetchTags: true - task: NodeTool@0 - displayName: Use Node 16.x + displayName: Use Node 18.x inputs: - versionSpec: 16.x + versionSpec: 18.x - task: JavaToolInstaller@0 displayName: Use Java 17 inputs: @@ -102,7 +102,7 @@ extends: displayName: vsce package inputs: targetType: inline - script: npx @vscode/vsce@latest package + script: npx @vscode/vsce@latest package -o extension.vsix ### Copy files for APIScan - task: CopyFiles@2 displayName: "Copy Files for APIScan" @@ -122,8 +122,41 @@ extends: condition: and(succeeded(), ne(variables['DisableAPIScan'], 'true')) env: AzureServicesAuthConnectionString: runAs=App;AppId=$(ApiScanClientId);TenantId=$(ApiScanTenant);AppKey=$(ApiScanSecret) + - script: npx @vscode/vsce@latest generate-manifest -i extension.vsix -o extension.manifest + displayName: 'Generate extension manifest' + - script: cp extension.manifest extension.signature.p7s + displayName: 'Prepare manifest for signing' + - task: SFP.build-tasks.custom-build-task-1.EsrpCodeSigning@5 + inputs: + ConnectedServiceName: 'ESRP-Release-Test' + AppRegistrationClientId: '1992ee18-e9d2-42d6-ab20-94dd947a44b6' + AppRegistrationTenantId: '72f988bf-86f1-41af-91ab-2d7cd011db47' + AuthAKVName: 'vscjavaci' + AuthCertName: 'vscjava-esrprelease-auth' + AuthSignCertName: 'VSCJava-CodeSign' + FolderPath: '.' + Pattern: 'extension.signature.p7s' + signConfigType: inlineSignParams + inlineOperation: | + [ + { + "keyCode": "CP-401405", + "operationSetCode": "VSCodePublisherSign", + "parameters" : [], + "toolName": "sign", + "toolVersion": "1.0" + } + ] + SessionTimeout: 90 + MaxConcurrency: 25 + MaxRetryAttempts: 5 + PendingAnalysisWaitTimeoutMinutes: 5 + displayName: 'Sign extension' - task: CopyFiles@2 displayName: "Copy Files to: $(Build.ArtifactStagingDirectory)" inputs: - Contents: "*.vsix" + Contents: | + extension.vsix + extension.manifest + extension.signature.p7s TargetFolder: $(Build.ArtifactStagingDirectory) From f2dfc46a369ab638a3d3ab98299fed1ee7ee3b8d Mon Sep 17 00:00:00 2001 From: Sheng Chen Date: Mon, 8 Jul 2024 11:07:43 +0800 Subject: [PATCH 207/352] feat - Suppport create package from file explorer (#845) --- package.json | 34 +++++--- package.nls.json | 1 + src/commands.ts | 2 + src/explorerCommands/new.ts | 146 ++++++++++++++++++++++---------- src/views/dependencyExplorer.ts | 3 + 5 files changed, 132 insertions(+), 54 deletions(-) diff --git a/package.json b/package.json index 9bdb4752..5b5ea3a6 100644 --- a/package.json +++ b/package.json @@ -257,6 +257,11 @@ "title": "%contributes.commands.java.view.package.newPackage%", "category": "Java" }, + { + "command": "java.view.fileExplorer.newPackage", + "title": "%contributes.commands.java.view.fileExplorer.newPackage%", + "category": "Java" + }, { "command": "java.view.package.newFile", "title": "%contributes.commands.java.view.package.newFile%", @@ -502,6 +507,10 @@ "command": "java.view.package.deleteFilePermanently", "when": "false" }, + { + "command": "java.view.fileExplorer.newPackage", + "when": "false" + }, { "command": "java.project.build.workspace", "when": "false" @@ -545,24 +554,29 @@ ], "explorer/context": [ { - "command": "java.view.package.revealInProjectExplorer", - "when": "resourceFilename =~ /(.*\\.gradle)|(.*\\.gradle\\.kts)|(pom\\.xml)$/ && java:serverMode == Standard", - "group": "1_javaactions" + "submenu": "javaProject.newJavaFile", + "when": "explorerResourceIsFolder", + "group": "1_javaactions@10" }, { - "command": "java.view.package.revealInProjectExplorer", - "when": "resourceExtname == .java && java:serverMode == Standard", - "group": "1_javaactions" + "command": "java.view.fileExplorer.newPackage", + "when": "explorerResourceIsFolder", + "group": "1_javaactions@20" }, { "command": "_java.project.create.from.fileexplorer.menu", "when": "explorerResourceIsFolder", - "group": "1_javaactions" + "group": "1_javaactions@30" }, { - "submenu": "javaProject.newJavaFile", - "when": "explorerResourceIsFolder", - "group": "1_javaactions" + "command": "java.view.package.revealInProjectExplorer", + "when": "resourceFilename =~ /(.*\\.gradle)|(.*\\.gradle\\.kts)|(pom\\.xml)$/ && java:serverMode == Standard", + "group": "1_javaactions@40" + }, + { + "command": "java.view.package.revealInProjectExplorer", + "when": "resourceExtname == .java && java:serverMode == Standard", + "group": "1_javaactions@40" } ], "editor/title": [ diff --git a/package.nls.json b/package.nls.json index adf5b5cb..8feb8343 100644 --- a/package.nls.json +++ b/package.nls.json @@ -35,6 +35,7 @@ "contributes.commands.java.view.package.renameFile": "Rename", "contributes.commands.java.view.package.moveFileToTrash": "Delete", "contributes.commands.java.view.package.deleteFilePermanently": "Delete Permanently", + "contributes.commands.java.view.fileExplorer.newPackage": "New Java Package...", "contributes.submenus.javaProject.new": "New", "contributes.commands.java.view.menus.file.newJavaClass": "New Java File", "configuration.java.dependency.showMembers": "Show the members in the explorer", diff --git a/src/commands.ts b/src/commands.ts index e84a5fe9..a2564835 100644 --- a/src/commands.ts +++ b/src/commands.ts @@ -54,6 +54,8 @@ export namespace Commands { export const VIEW_PACKAGE_NEW_JAVA_PACKAGE = "java.view.package.newPackage"; + export const VIEW_EXPLORER_NEW_PACKAGE = "java.view.fileExplorer.newPackage"; + export const VIEW_PACKAGE_RENAME_FILE = "java.view.package.renameFile"; export const VIEW_PACKAGE_MOVE_FILE_TO_TRASH = "java.view.package.moveFileToTrash"; diff --git a/src/explorerCommands/new.ts b/src/explorerCommands/new.ts index 736c49c7..84ab3360 100644 --- a/src/explorerCommands/new.ts +++ b/src/explorerCommands/new.ts @@ -321,15 +321,7 @@ async function inferPackageFsPath(): Promise { return getPackageFsPathFromActiveEditor(); } - let sourcePaths: string[] | undefined; - try { - const result = await commands.executeCommand(Commands.EXECUTE_WORKSPACE_COMMAND, Commands.LIST_SOURCEPATHS); - if (result && result.data && result.data.length) { - sourcePaths = result.data.map((entry) => entry.path); - } - } catch (e) { - // do nothing - } + let sourcePaths: string[] | undefined = (await getSourceRoots())?.data?.map((sourcePath) => sourcePath.path); if (!window.activeTextEditor) { if (sourcePaths?.length === 1) { @@ -420,14 +412,10 @@ async function resolvePackageName(filePath: string): Promise { return guessPackageName(filePath); } - let sourcePaths: string[] = []; - const result: IListCommandResult = - await commands.executeCommand(Commands.EXECUTE_WORKSPACE_COMMAND, Commands.LIST_SOURCEPATHS); - if (result && result.data && result.data.length) { - sourcePaths = result.data.map((sourcePath) => sourcePath.path).sort((a, b) => b.length - a.length); - } + let sourcePaths: string[] = (await getSourceRoots())?.data?.map( + (sourcePath) => sourcePath.path).sort((a, b) => b.length - a.length) ?? []; - if (!sourcePaths || !sourcePaths.length) { + if (!sourcePaths?.length) { return ""; } @@ -513,40 +501,30 @@ function getNewFilePath(basePath: string, className: string): string { return path.join(basePath, ...className.split(".")) + ".java"; } -export async function newPackage(node?: DataNode): Promise { - if (!node?.uri || !canCreatePackage(node)) { +export async function newPackage(node: DataNode | Uri | undefined): Promise { + if (!node) { return; } - let defaultValue: string; - let packageRootPath: string; - const nodeKind = node.nodeData.kind; - if (nodeKind === NodeKind.Project) { - defaultValue = ""; - packageRootPath = await getPackageFsPath(node) || ""; - } else if (nodeKind === NodeKind.PackageRoot) { - defaultValue = ""; - packageRootPath = Uri.parse(node.uri).fsPath; - } else if (nodeKind === NodeKind.Package) { - defaultValue = node.nodeData.name + "."; - packageRootPath = getPackageRootPath(Uri.parse(node.uri).fsPath, node.nodeData.name); - } else if (nodeKind === NodeKind.PrimaryType) { - const primaryTypeNode = node; - packageRootPath = primaryTypeNode.getPackageRootPath(); - if (packageRootPath === "") { - window.showErrorMessage("Failed to get the package root path."); - return; - } - const packagePath = await getPackageFsPath(node); - if (!packagePath) { - window.showErrorMessage("Failed to get the package path."); - return; - } - defaultValue = path.relative(packageRootPath, packagePath).replace(/[\\\/]/g, ".") + "."; - } else { + const isUri = node instanceof Uri; + if (!isUri && (!node.uri || !canCreatePackage(node))) { + return; + } + + sendInfo("", { + "triggernewpackagefrom": isUri ? "fileExplorer" : "javaProjectExplorer", + }); + + let {defaultValue, packageRootPath} = (isUri ? await getPackageInformationFromUri(node) + : await getPackageInformationFromNode(node)) || {}; + if (defaultValue === undefined || packageRootPath === undefined) { return; } + if (defaultValue.length > 0 && !defaultValue.endsWith(".")) { + defaultValue += "."; + } + const packageName: string | undefined = await window.showInputBox({ value: defaultValue, placeHolder: "Input the package name", @@ -573,6 +551,74 @@ export async function newPackage(node?: DataNode): Promise { await fse.ensureDir(getNewPackagePath(packageRootPath, packageName)); } +async function getPackageInformationFromUri(uri: Uri): Promise | undefined> { + const defaultValue = { + defaultValue: "", + packageRootPath: uri.fsPath, + }; + if (!isLanguageServerReady()) { + return defaultValue; + } + + let sourcePaths: string[] = (await getSourceRoots())?.data?.map( + (sourcePath) => sourcePath.path).sort((a, b) => b.length - a.length) ?? []; + + if (!sourcePaths?.length) { + return defaultValue; + } + + for (const sourcePath of sourcePaths) { + if (isPrefix(sourcePath, uri.fsPath)) { + const relative = path.relative(sourcePath, uri.fsPath); + return { + defaultValue: relative.replace(/[/\\]/g, "."), + packageRootPath: sourcePath, + }; + } + } + + return defaultValue; +} + + +async function getPackageInformationFromNode(node: DataNode): Promise | undefined> { + const nodeKind = node.nodeData.kind; + if (nodeKind === NodeKind.Project) { + return { + packageRootPath: await getPackageFsPath(node) || "", + defaultValue: "", + } + } else if (nodeKind === NodeKind.PackageRoot) { + return { + packageRootPath: Uri.parse(node.uri!).fsPath, + defaultValue: "", + } + } else if (nodeKind === NodeKind.Package) { + return { + packageRootPath: getPackageRootPath(Uri.parse(node.uri!).fsPath, node.nodeData.name), + defaultValue: node.nodeData.name + ".", + } + } else if (nodeKind === NodeKind.PrimaryType) { + const primaryTypeNode = node; + const packageRootPath = primaryTypeNode.getPackageRootPath(); + if (packageRootPath === "") { + window.showErrorMessage("Failed to get the package root path."); + return undefined; + } + const packagePath = await getPackageFsPath(node); + if (!packagePath) { + window.showErrorMessage("Failed to get the package path."); + return undefined; + } + return { + packageRootPath: packageRootPath, + defaultValue: path.relative(packageRootPath, packagePath).replace(/[/\\]/g, "."), + } + } + + return undefined; +} + /** * Check if the create package command is available for the given node. * Currently the check logic is the same as the create class command. @@ -708,3 +754,15 @@ function getBasePath(node: DataNode): string | undefined { return undefined; } } + +async function getSourceRoots(): Promise{ + try { + const result = await commands.executeCommand(Commands.EXECUTE_WORKSPACE_COMMAND, Commands.LIST_SOURCEPATHS); + if (result?.data?.length) { + return result; + } + } catch (e) { + // ignore; + } + return undefined; +} diff --git a/src/views/dependencyExplorer.ts b/src/views/dependencyExplorer.ts index 8841b4d8..9afb27b8 100644 --- a/src/views/dependencyExplorer.ts +++ b/src/views/dependencyExplorer.ts @@ -147,6 +147,9 @@ export class DependencyExplorer implements Disposable { } newPackage(cmdNode); }), + instrumentOperationAsVsCodeCommand(Commands.VIEW_EXPLORER_NEW_PACKAGE, (node: Uri) => { + newPackage(node); + }), instrumentOperationAsVsCodeCommand(Commands.VIEW_PACKAGE_REVEAL_FILE_OS, (node?: DataNode) => { const cmdNode = getCmdNode(this._dependencyViewer.selection, node); if (cmdNode?.uri) { From 60dad37509056a5a40f97f71ad1b564ac60e00aa Mon Sep 17 00:00:00 2001 From: Sheng Chen Date: Wed, 24 Jul 2024 11:08:54 +0800 Subject: [PATCH 208/352] build - Prepare for 0.24.0 (#847) --- .github/workflows/windows.yml | 3 +++ CHANGELOG.md | 3 +++ .../META-INF/MANIFEST.MF | 2 +- .../com.microsoft.jdtls.ext.core/pom.xml | 2 +- .../com.microsoft.jdtls.ext.target/pom.xml | 2 +- jdtls.ext/pom.xml | 2 +- package-lock.json | 4 ++-- package.json | 4 ++-- src/explorerCommands/new.ts | 19 ++++++++++--------- 9 files changed, 24 insertions(+), 17 deletions(-) diff --git a/.github/workflows/windows.yml b/.github/workflows/windows.yml index b6716e1d..fee79b90 100644 --- a/.github/workflows/windows.yml +++ b/.github/workflows/windows.yml @@ -30,6 +30,9 @@ jobs: - name: Install VSCE run: npm install -g @vscode/vsce + - name: Lint + run: npm run tslint + - name: Build OSGi bundle run: npm run build-server diff --git a/CHANGELOG.md b/CHANGELOG.md index ba4f72eb..02f3bb79 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,9 @@ All notable changes to the "vscode-java-dependency" extension will be documented The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/) and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html). +## 0.24.0 +* feat - Support adding new package from file explorer by @jdneo in https://github.com/microsoft/vscode-java-dependency/pull/845 + ## 0.23.7 * fix - Creates file watcher with trailing slash causes problems for other extensions by @testforstephen in https://github.com/microsoft/vscode-java-dependency/pull/829 * fix - Micronaut® Launch extension renamed. by @dbalek in https://github.com/microsoft/vscode-java-dependency/pull/831 diff --git a/jdtls.ext/com.microsoft.jdtls.ext.core/META-INF/MANIFEST.MF b/jdtls.ext/com.microsoft.jdtls.ext.core/META-INF/MANIFEST.MF index 7ba188b8..5bba4389 100644 --- a/jdtls.ext/com.microsoft.jdtls.ext.core/META-INF/MANIFEST.MF +++ b/jdtls.ext/com.microsoft.jdtls.ext.core/META-INF/MANIFEST.MF @@ -2,7 +2,7 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: JDTLS EXT Core Bundle-SymbolicName: com.microsoft.jdtls.ext.core;singleton:=true -Bundle-Version: 0.23.7 +Bundle-Version: 0.24.0 Bundle-Activator: com.microsoft.jdtls.ext.core.JdtlsExtActivator Bundle-RequiredExecutionEnvironment: JavaSE-11 Bundle-ActivationPolicy: lazy diff --git a/jdtls.ext/com.microsoft.jdtls.ext.core/pom.xml b/jdtls.ext/com.microsoft.jdtls.ext.core/pom.xml index 37ea2cf7..618e8f40 100644 --- a/jdtls.ext/com.microsoft.jdtls.ext.core/pom.xml +++ b/jdtls.ext/com.microsoft.jdtls.ext.core/pom.xml @@ -5,7 +5,7 @@ com.microsoft.jdtls.ext jdtls-ext-parent - 0.23.7 + 0.24.0 com.microsoft.jdtls.ext.core eclipse-plugin diff --git a/jdtls.ext/com.microsoft.jdtls.ext.target/pom.xml b/jdtls.ext/com.microsoft.jdtls.ext.target/pom.xml index 43dc8b56..405b4e1a 100644 --- a/jdtls.ext/com.microsoft.jdtls.ext.target/pom.xml +++ b/jdtls.ext/com.microsoft.jdtls.ext.target/pom.xml @@ -4,7 +4,7 @@ com.microsoft.jdtls.ext jdtls-ext-parent - 0.23.7 + 0.24.0 com.microsoft.jdtls.ext.tp ${base.name} :: Target Platform diff --git a/jdtls.ext/pom.xml b/jdtls.ext/pom.xml index ab530794..d1fc175d 100644 --- a/jdtls.ext/pom.xml +++ b/jdtls.ext/pom.xml @@ -4,7 +4,7 @@ com.microsoft.jdtls.ext jdtls-ext-parent ${base.name} :: Parent - 0.23.7 + 0.24.0 pom Java Project Manager diff --git a/package-lock.json b/package-lock.json index 43a34ccd..ea6b0047 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "vscode-java-dependency", - "version": "0.23.7", + "version": "0.24.0", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "vscode-java-dependency", - "version": "0.23.7", + "version": "0.24.0", "license": "MIT", "dependencies": { "await-lock": "^2.2.2", diff --git a/package.json b/package.json index 5b5ea3a6..b72d6b19 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "vscode-java-dependency", "displayName": "Project Manager for Java", "description": "%description%", - "version": "0.23.7", + "version": "0.24.0", "publisher": "vscjava", "preview": false, "aiKey": "5c642b22-e845-4400-badb-3f8509a70777", @@ -46,7 +46,7 @@ "main": "./main.js", "contributes": { "javaExtensions": [ - "./server/com.microsoft.jdtls.ext.core-0.23.7.jar" + "./server/com.microsoft.jdtls.ext.core-0.24.0.jar" ], "commands": [ { diff --git a/src/explorerCommands/new.ts b/src/explorerCommands/new.ts index 84ab3360..5a5cb7cc 100644 --- a/src/explorerCommands/new.ts +++ b/src/explorerCommands/new.ts @@ -321,7 +321,7 @@ async function inferPackageFsPath(): Promise { return getPackageFsPathFromActiveEditor(); } - let sourcePaths: string[] | undefined = (await getSourceRoots())?.data?.map((sourcePath) => sourcePath.path); + const sourcePaths: string[] | undefined = (await getSourceRoots())?.data?.map((sourcePath) => sourcePath.path); if (!window.activeTextEditor) { if (sourcePaths?.length === 1) { @@ -412,7 +412,7 @@ async function resolvePackageName(filePath: string): Promise { return guessPackageName(filePath); } - let sourcePaths: string[] = (await getSourceRoots())?.data?.map( + const sourcePaths: string[] = (await getSourceRoots())?.data?.map( (sourcePath) => sourcePath.path).sort((a, b) => b.length - a.length) ?? []; if (!sourcePaths?.length) { @@ -515,8 +515,9 @@ export async function newPackage(node: DataNode | Uri | undefined): Promise sourcePath.path).sort((a, b) => b.length - a.length) ?? []; if (!sourcePaths?.length) { @@ -587,17 +588,17 @@ async function getPackageInformationFromNode(node: DataNode): Promise node; const packageRootPath = primaryTypeNode.getPackageRootPath(); @@ -611,9 +612,9 @@ async function getPackageInformationFromNode(node: DataNode): Promise Date: Tue, 27 Aug 2024 12:32:57 +0800 Subject: [PATCH 209/352] build - Update dependencies (#850) * build - Update dependencies - Update nodejs to 20.x - Update lsp4j tp 0.23.1 - Update @vscode/test-electron --- .azure-pipelines/ci.yml | 4 +- .azure-pipelines/nightly.yml | 4 +- .azure-pipelines/rc.yml | 4 +- .github/workflows/linux.yml | 2 +- .github/workflows/linuxUI.yml | 2 +- .github/workflows/macOS.yml | 2 +- .github/workflows/windows.yml | 2 +- .github/workflows/windowsUI.yml | 2 +- .../com.microsoft.jdtls.ext.tp.target | 4 +- package-lock.json | 712 ++++++++++++++---- package.json | 4 +- test/index.ts | 10 +- 12 files changed, 602 insertions(+), 150 deletions(-) diff --git a/.azure-pipelines/ci.yml b/.azure-pipelines/ci.yml index da46c1be..61020f86 100644 --- a/.azure-pipelines/ci.yml +++ b/.azure-pipelines/ci.yml @@ -50,9 +50,9 @@ extends: jdkArchitectureOption: x64 jdkSourceOption: PreInstalled - task: NodeTool@0 - displayName: Use Node 18.x + displayName: Use Node 20.x inputs: - versionSpec: 18.x + versionSpec: 20.x - task: Npm@1 displayName: npm install inputs: diff --git a/.azure-pipelines/nightly.yml b/.azure-pipelines/nightly.yml index 94fe2964..34b58b53 100644 --- a/.azure-pipelines/nightly.yml +++ b/.azure-pipelines/nightly.yml @@ -47,9 +47,9 @@ extends: clean: true fetchTags: true - task: NodeTool@0 - displayName: Use Node 18.x + displayName: Use Node 20.x inputs: - versionSpec: 18.x + versionSpec: 20.x - task: JavaToolInstaller@0 displayName: Use Java 17 inputs: diff --git a/.azure-pipelines/rc.yml b/.azure-pipelines/rc.yml index ee059eb5..9808dfd2 100644 --- a/.azure-pipelines/rc.yml +++ b/.azure-pipelines/rc.yml @@ -42,9 +42,9 @@ extends: clean: true fetchTags: true - task: NodeTool@0 - displayName: Use Node 18.x + displayName: Use Node 20.x inputs: - versionSpec: 18.x + versionSpec: 20.x - task: JavaToolInstaller@0 displayName: Use Java 17 inputs: diff --git a/.github/workflows/linux.yml b/.github/workflows/linux.yml index 6cec9f67..ff8e399c 100644 --- a/.github/workflows/linux.yml +++ b/.github/workflows/linux.yml @@ -29,7 +29,7 @@ jobs: - name: Setup Node.js environment uses: actions/setup-node@v2 with: - node-version: 16 + node-version: 20 - name: Install Node.js modules run: npm install diff --git a/.github/workflows/linuxUI.yml b/.github/workflows/linuxUI.yml index 0fb228c7..8cfc462c 100644 --- a/.github/workflows/linuxUI.yml +++ b/.github/workflows/linuxUI.yml @@ -29,7 +29,7 @@ jobs: - name: Setup Node.js environment uses: actions/setup-node@v2 with: - node-version: 16 + node-version: 20 - name: Install Node.js modules run: npm install diff --git a/.github/workflows/macOS.yml b/.github/workflows/macOS.yml index 85a934a3..5da0d24a 100644 --- a/.github/workflows/macOS.yml +++ b/.github/workflows/macOS.yml @@ -22,7 +22,7 @@ jobs: - name: Setup Node.js environment uses: actions/setup-node@v2 with: - node-version: 16 + node-version: 20 - name: Install Node.js modules run: npm install diff --git a/.github/workflows/windows.yml b/.github/workflows/windows.yml index fee79b90..48e980ca 100644 --- a/.github/workflows/windows.yml +++ b/.github/workflows/windows.yml @@ -22,7 +22,7 @@ jobs: - name: Setup Node.js environment uses: actions/setup-node@v2 with: - node-version: 16 + node-version: 20 - name: Install Node.js modules run: npm install diff --git a/.github/workflows/windowsUI.yml b/.github/workflows/windowsUI.yml index be506d36..24aeadde 100644 --- a/.github/workflows/windowsUI.yml +++ b/.github/workflows/windowsUI.yml @@ -22,7 +22,7 @@ jobs: - name: Setup Node.js environment uses: actions/setup-node@v2 with: - node-version: 16 + node-version: 20 - name: Install Node.js modules run: npm install diff --git a/jdtls.ext/com.microsoft.jdtls.ext.target/com.microsoft.jdtls.ext.tp.target b/jdtls.ext/com.microsoft.jdtls.ext.target/com.microsoft.jdtls.ext.tp.target index daa2dbf1..6a4e67b7 100644 --- a/jdtls.ext/com.microsoft.jdtls.ext.target/com.microsoft.jdtls.ext.tp.target +++ b/jdtls.ext/com.microsoft.jdtls.ext.target/com.microsoft.jdtls.ext.tp.target @@ -21,8 +21,8 @@ - - + + diff --git a/package-lock.json b/package-lock.json index ea6b0047..23299643 100644 --- a/package-lock.json +++ b/package-lock.json @@ -25,10 +25,10 @@ "@types/lodash": "^4.14.191", "@types/minimatch": "^3.0.3", "@types/mocha": "^9.1.1", - "@types/node": "^16.18.11", + "@types/node": "20.x", "@types/semver": "^7.3.13", "@types/vscode": "1.83.1", - "@vscode/test-electron": "^2.3.8", + "@vscode/test-electron": "^2.4.1", "copy-webpack-plugin": "^11.0.0", "glob": "^7.2.3", "mocha": "^9.2.2", @@ -492,15 +492,6 @@ "node": ">=14.16" } }, - "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==", - "dev": true, - "engines": { - "node": ">= 6" - } - }, "node_modules/@types/eslint": { "version": "8.44.0", "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.44.0.tgz", @@ -577,10 +568,13 @@ "dev": true }, "node_modules/@types/node": { - "version": "16.18.38", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.38.tgz", - "integrity": "sha512-6sfo1qTulpVbkxECP+AVrHV9OoJqhzCsfTNp5NIG+enM4HyM3HvZCO798WShIXBN0+QtDIcutJCjsVYnQP5rIQ==", - "dev": true + "version": "20.16.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.16.1.tgz", + "integrity": "sha512-zJDo7wEadFtSyNz5QITDfRcrhqDvQI1xQNQ0VoizPjM/dVAODqqIUWbJPkvsxmTI0MYRGRikcdjMPhOssnPejQ==", + "dev": true, + "dependencies": { + "undici-types": "~6.19.2" + } }, "node_modules/@types/selenium-webdriver": { "version": "4.1.21", @@ -632,15 +626,16 @@ } }, "node_modules/@vscode/test-electron": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/@vscode/test-electron/-/test-electron-2.3.8.tgz", - "integrity": "sha512-b4aZZsBKtMGdDljAsOPObnAi7+VWIaYl3ylCz1jTs+oV6BZ4TNHcVNC3xUn0azPeszBmwSBDQYfFESIaUQnrOg==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@vscode/test-electron/-/test-electron-2.4.1.tgz", + "integrity": "sha512-Gc6EdaLANdktQ1t+zozoBVRynfIsMKMc94Svu1QreOBC8y76x4tvaK32TljrLi1LI2+PK58sDVbL7ALdqf3VRQ==", "dev": true, "dependencies": { - "http-proxy-agent": "^4.0.1", - "https-proxy-agent": "^5.0.0", + "http-proxy-agent": "^7.0.2", + "https-proxy-agent": "^7.0.5", "jszip": "^3.10.1", - "semver": "^7.5.2" + "ora": "^7.0.1", + "semver": "^7.6.2" }, "engines": { "node": ">=16" @@ -1001,15 +996,15 @@ } }, "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==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz", + "integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==", "dev": true, "dependencies": { - "debug": "4" + "debug": "^4.3.4" }, "engines": { - "node": ">= 6.0.0" + "node": ">= 14" } }, "node_modules/ajv": { @@ -1120,11 +1115,11 @@ "integrity": "sha512-aDczADvlvTGajTDjcjpJMqRkOF6Qdz3YbPZm/PyW6tKPkx2hlYBzxMhEywM/tU72HrVZjgl5VCdRuMlA7pZ8Gw==" }, "node_modules/axios": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.1.tgz", - "integrity": "sha512-vfBmhDpKafglh0EldBEbVuoe7DyAavGSLWhuSm5ZSEKQnHhBf0xAAwybbNH1IkrJNGnS/VG4I5yxig1pCEXE4g==", + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.4.tgz", + "integrity": "sha512-DukmaFRnY6AzAALSH4J2M3k6PkaC+MfaAGdEERRWcC9q3/TWQwLpHR8ZRLKTdQ3aBDL64EdluRDjJqKw+BPZEw==", "dependencies": { - "follow-redirects": "^1.15.0", + "follow-redirects": "^1.15.6", "form-data": "^4.0.0", "proxy-from-env": "^1.1.0" } @@ -1162,8 +1157,7 @@ "type": "consulting", "url": "https://feross.org/support" } - ], - "optional": true + ] }, "node_modules/big-integer": { "version": "1.6.51", @@ -1586,6 +1580,33 @@ "node": ">=6.0" } }, + "node_modules/cli-cursor": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-4.0.0.tgz", + "integrity": "sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==", + "dev": true, + "dependencies": { + "restore-cursor": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-spinners": { + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", + "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", + "dev": true, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/clipboardy": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/clipboardy/-/clipboardy-4.0.0.tgz", @@ -1754,9 +1775,9 @@ } }, "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.6.tgz", + "integrity": "sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==", "dev": true, "dependencies": { "ms": "2.1.2" @@ -2152,9 +2173,9 @@ "dev": true }, "node_modules/fast-glob": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.0.tgz", - "integrity": "sha512-ChDuvbOypPuNjO8yIDf36x7BlZX1smcUMTTcyoIjycexOxd6DFsKsg21qVBzEmr3G7fUKIRy2/psii+CIUt7FA==", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", @@ -2682,17 +2703,16 @@ "dev": true }, "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==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", + "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", "dev": true, "dependencies": { - "@tootallnate/once": "1", - "agent-base": "6", - "debug": "4" + "agent-base": "^7.1.0", + "debug": "^4.3.4" }, "engines": { - "node": ">= 6" + "node": ">= 14" } }, "node_modules/http2-wrapper": { @@ -2709,16 +2729,16 @@ } }, "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==", + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.5.tgz", + "integrity": "sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw==", "dev": true, "dependencies": { - "agent-base": "6", + "agent-base": "^7.0.2", "debug": "4" }, "engines": { - "node": ">= 6" + "node": ">= 14" } }, "node_modules/human-signals": { @@ -2748,8 +2768,7 @@ "type": "consulting", "url": "https://feross.org/support" } - ], - "optional": true + ] }, "node_modules/ignore": { "version": "5.2.4", @@ -2901,6 +2920,18 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/is-interactive": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-2.0.0.tgz", + "integrity": "sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", @@ -3226,6 +3257,7 @@ "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, "dependencies": { "yallist": "^4.0.0" }, @@ -3279,11 +3311,11 @@ } }, "node_modules/micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.7.tgz", + "integrity": "sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==", "dependencies": { - "braces": "^3.0.2", + "braces": "^3.0.3", "picomatch": "^2.3.1" }, "engines": { @@ -3715,6 +3747,119 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/ora": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/ora/-/ora-7.0.1.tgz", + "integrity": "sha512-0TUxTiFJWv+JnjWm4o9yvuskpEJLXTcng8MJuKd+SzAzp2o+OP3HWqNhB4OdJRt1Vsd9/mR0oyaEYlOnL7XIRw==", + "dev": true, + "dependencies": { + "chalk": "^5.3.0", + "cli-cursor": "^4.0.0", + "cli-spinners": "^2.9.0", + "is-interactive": "^2.0.0", + "is-unicode-supported": "^1.3.0", + "log-symbols": "^5.1.0", + "stdin-discarder": "^0.1.0", + "string-width": "^6.1.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ora/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/ora/node_modules/chalk": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", + "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", + "dev": true, + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/ora/node_modules/emoji-regex": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.3.0.tgz", + "integrity": "sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw==", + "dev": true + }, + "node_modules/ora/node_modules/is-unicode-supported": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-1.3.0.tgz", + "integrity": "sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ora/node_modules/log-symbols": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-5.1.0.tgz", + "integrity": "sha512-l0x2DvrW294C9uDCoQe1VSU4gf529FkSZ6leBl4TiqZH/e+0R7hSfHQBNut2mNygDgHwvYHfFLn6Oxb3VWj2rA==", + "dev": true, + "dependencies": { + "chalk": "^5.0.0", + "is-unicode-supported": "^1.1.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ora/node_modules/string-width": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-6.1.0.tgz", + "integrity": "sha512-k01swCJAgQmuADB0YIc+7TuatfNvTBVOoaUWJjTB9R4VJzR5vNWzf5t42ESVZFPS8xTySF7CAdV4t/aaIm3UnQ==", + "dev": true, + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^10.2.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ora/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, "node_modules/p-cancelable": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-3.0.0.tgz", @@ -4232,6 +4377,52 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/restore-cursor": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-4.0.0.tgz", + "integrity": "sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==", + "dev": true, + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/restore-cursor/node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/restore-cursor/node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/restore-cursor/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true + }, "node_modules/reusify": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", @@ -4333,12 +4524,9 @@ } }, "node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dependencies": { - "lru-cache": "^6.0.0" - }, + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", "bin": { "semver": "bin/semver.js" }, @@ -4347,9 +4535,9 @@ } }, "node_modules/serialize-javascript": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.1.tgz", - "integrity": "sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", + "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", "dev": true, "dependencies": { "randombytes": "^2.1.0" @@ -4518,6 +4706,70 @@ "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", "dev": true }, + "node_modules/stdin-discarder": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/stdin-discarder/-/stdin-discarder-0.1.0.tgz", + "integrity": "sha512-xhV7w8S+bUwlPTb4bAOUQhv8/cSS5offJuX8GQGq32ONF0ZtDWKfkdomM3HMRA+LhX6um/FZ0COqlwsjD53LeQ==", + "dev": true, + "dependencies": { + "bl": "^5.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/stdin-discarder/node_modules/bl": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-5.1.0.tgz", + "integrity": "sha512-tv1ZJHLfTDnXE6tMHv73YgSJaWR2AFuPwMntBe7XL/GBFHnT0CLnsHMogfk5+GzCDC5ZWarSCYaIGATZt9dNsQ==", + "dev": true, + "dependencies": { + "buffer": "^6.0.3", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "node_modules/stdin-discarder/node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "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" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, + "node_modules/stdin-discarder/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", @@ -4928,15 +5180,16 @@ } }, "node_modules/ts-loader": { - "version": "9.4.4", - "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.4.4.tgz", - "integrity": "sha512-MLukxDHBl8OJ5Dk3y69IsKVFRA/6MwzEqBgh+OXMPB/OD01KQuWPFd1WAQP8a5PeSCAxfnkhiuWqfmFJzJQt9w==", + "version": "9.5.1", + "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.5.1.tgz", + "integrity": "sha512-rNH3sK9kGZcH9dYzC7CewQm4NtxJTjSEVRJ2DyBZR7f8/wcta+iV44UPCXc5+nzDzivKtlzV6c9P4e+oFhDLYg==", "dev": true, "dependencies": { "chalk": "^4.1.0", "enhanced-resolve": "^5.0.0", "micromatch": "^4.0.0", - "semver": "^7.3.4" + "semver": "^7.3.4", + "source-map": "^0.7.4" }, "engines": { "node": ">=12.0.0" @@ -4946,6 +5199,15 @@ "webpack": "^5.0.0" } }, + "node_modules/ts-loader/node_modules/source-map": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", + "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, "node_modules/tslib": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", @@ -5185,6 +5447,12 @@ "integrity": "sha512-+A5Sja4HP1M08MaXya7p5LvjuM7K6q/2EaC0+iovj/wOcMsTzMvDFbasi/oSapiwOlt252IqsKqPjCl7huKS0A==", "dev": true }, + "node_modules/undici-types": { + "version": "6.19.8", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", + "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==", + "dev": true + }, "node_modules/universalify": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", @@ -5715,7 +5983,8 @@ "node_modules/yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true }, "node_modules/yargs": { "version": "16.2.0", @@ -6143,12 +6412,6 @@ "defer-to-connect": "^2.0.1" } }, - "@tootallnate/once": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", - "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", - "dev": true - }, "@types/eslint": { "version": "8.44.0", "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.44.0.tgz", @@ -6225,10 +6488,13 @@ "dev": true }, "@types/node": { - "version": "16.18.38", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.38.tgz", - "integrity": "sha512-6sfo1qTulpVbkxECP+AVrHV9OoJqhzCsfTNp5NIG+enM4HyM3HvZCO798WShIXBN0+QtDIcutJCjsVYnQP5rIQ==", - "dev": true + "version": "20.16.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.16.1.tgz", + "integrity": "sha512-zJDo7wEadFtSyNz5QITDfRcrhqDvQI1xQNQ0VoizPjM/dVAODqqIUWbJPkvsxmTI0MYRGRikcdjMPhOssnPejQ==", + "dev": true, + "requires": { + "undici-types": "~6.19.2" + } }, "@types/selenium-webdriver": { "version": "4.1.21", @@ -6277,15 +6543,16 @@ } }, "@vscode/test-electron": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/@vscode/test-electron/-/test-electron-2.3.8.tgz", - "integrity": "sha512-b4aZZsBKtMGdDljAsOPObnAi7+VWIaYl3ylCz1jTs+oV6BZ4TNHcVNC3xUn0azPeszBmwSBDQYfFESIaUQnrOg==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@vscode/test-electron/-/test-electron-2.4.1.tgz", + "integrity": "sha512-Gc6EdaLANdktQ1t+zozoBVRynfIsMKMc94Svu1QreOBC8y76x4tvaK32TljrLi1LI2+PK58sDVbL7ALdqf3VRQ==", "dev": true, "requires": { - "http-proxy-agent": "^4.0.1", - "https-proxy-agent": "^5.0.0", + "http-proxy-agent": "^7.0.2", + "https-proxy-agent": "^7.0.5", "jszip": "^3.10.1", - "semver": "^7.5.2" + "ora": "^7.0.1", + "semver": "^7.6.2" } }, "@vscode/vsce": { @@ -6595,12 +6862,12 @@ "requires": {} }, "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==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz", + "integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==", "dev": true, "requires": { - "debug": "4" + "debug": "^4.3.4" } }, "ajv": { @@ -6681,11 +6948,11 @@ "integrity": "sha512-aDczADvlvTGajTDjcjpJMqRkOF6Qdz3YbPZm/PyW6tKPkx2hlYBzxMhEywM/tU72HrVZjgl5VCdRuMlA7pZ8Gw==" }, "axios": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.1.tgz", - "integrity": "sha512-vfBmhDpKafglh0EldBEbVuoe7DyAavGSLWhuSm5ZSEKQnHhBf0xAAwybbNH1IkrJNGnS/VG4I5yxig1pCEXE4g==", + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.4.tgz", + "integrity": "sha512-DukmaFRnY6AzAALSH4J2M3k6PkaC+MfaAGdEERRWcC9q3/TWQwLpHR8ZRLKTdQ3aBDL64EdluRDjJqKw+BPZEw==", "requires": { - "follow-redirects": "^1.15.0", + "follow-redirects": "^1.15.6", "form-data": "^4.0.0", "proxy-from-env": "^1.1.0" } @@ -6709,8 +6976,7 @@ "version": "1.5.1", "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "dev": true, - "optional": true + "dev": true }, "big-integer": { "version": "1.6.51", @@ -7011,6 +7277,21 @@ "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", "dev": true }, + "cli-cursor": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-4.0.0.tgz", + "integrity": "sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==", + "dev": true, + "requires": { + "restore-cursor": "^4.0.0" + } + }, + "cli-spinners": { + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", + "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", + "dev": true + }, "clipboardy": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/clipboardy/-/clipboardy-4.0.0.tgz", @@ -7142,9 +7423,9 @@ "dev": true }, "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.6.tgz", + "integrity": "sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==", "dev": true, "requires": { "ms": "2.1.2" @@ -7420,9 +7701,9 @@ "dev": true }, "fast-glob": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.0.tgz", - "integrity": "sha512-ChDuvbOypPuNjO8yIDf36x7BlZX1smcUMTTcyoIjycexOxd6DFsKsg21qVBzEmr3G7fUKIRy2/psii+CIUt7FA==", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", "requires": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", @@ -7808,14 +8089,13 @@ "dev": true }, "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==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", + "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", "dev": true, "requires": { - "@tootallnate/once": "1", - "agent-base": "6", - "debug": "4" + "agent-base": "^7.1.0", + "debug": "^4.3.4" } }, "http2-wrapper": { @@ -7829,12 +8109,12 @@ } }, "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==", + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.5.tgz", + "integrity": "sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw==", "dev": true, "requires": { - "agent-base": "6", + "agent-base": "^7.0.2", "debug": "4" } }, @@ -7848,8 +8128,7 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "dev": true, - "optional": true + "dev": true }, "ignore": { "version": "5.2.4", @@ -7953,6 +8232,12 @@ "is-docker": "^3.0.0" } }, + "is-interactive": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-2.0.0.tgz", + "integrity": "sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==", + "dev": true + }, "is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", @@ -8198,6 +8483,7 @@ "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, "requires": { "yallist": "^4.0.0" } @@ -8241,11 +8527,11 @@ "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==" }, "micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.7.tgz", + "integrity": "sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==", "requires": { - "braces": "^3.0.2", + "braces": "^3.0.3", "picomatch": "^2.3.1" } }, @@ -8568,6 +8854,79 @@ "mimic-fn": "^4.0.0" } }, + "ora": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/ora/-/ora-7.0.1.tgz", + "integrity": "sha512-0TUxTiFJWv+JnjWm4o9yvuskpEJLXTcng8MJuKd+SzAzp2o+OP3HWqNhB4OdJRt1Vsd9/mR0oyaEYlOnL7XIRw==", + "dev": true, + "requires": { + "chalk": "^5.3.0", + "cli-cursor": "^4.0.0", + "cli-spinners": "^2.9.0", + "is-interactive": "^2.0.0", + "is-unicode-supported": "^1.3.0", + "log-symbols": "^5.1.0", + "stdin-discarder": "^0.1.0", + "string-width": "^6.1.0", + "strip-ansi": "^7.1.0" + }, + "dependencies": { + "ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true + }, + "chalk": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", + "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", + "dev": true + }, + "emoji-regex": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.3.0.tgz", + "integrity": "sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw==", + "dev": true + }, + "is-unicode-supported": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-1.3.0.tgz", + "integrity": "sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==", + "dev": true + }, + "log-symbols": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-5.1.0.tgz", + "integrity": "sha512-l0x2DvrW294C9uDCoQe1VSU4gf529FkSZ6leBl4TiqZH/e+0R7hSfHQBNut2mNygDgHwvYHfFLn6Oxb3VWj2rA==", + "dev": true, + "requires": { + "chalk": "^5.0.0", + "is-unicode-supported": "^1.1.0" + } + }, + "string-width": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-6.1.0.tgz", + "integrity": "sha512-k01swCJAgQmuADB0YIc+7TuatfNvTBVOoaUWJjTB9R4VJzR5vNWzf5t42ESVZFPS8xTySF7CAdV4t/aaIm3UnQ==", + "dev": true, + "requires": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^10.2.1", + "strip-ansi": "^7.0.1" + } + }, + "strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "requires": { + "ansi-regex": "^6.0.1" + } + } + } + }, "p-cancelable": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-3.0.0.tgz", @@ -8947,6 +9306,39 @@ "lowercase-keys": "^3.0.0" } }, + "restore-cursor": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-4.0.0.tgz", + "integrity": "sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==", + "dev": true, + "requires": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "dependencies": { + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true + }, + "onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "requires": { + "mimic-fn": "^2.1.0" + } + }, + "signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true + } + } + }, "reusify": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", @@ -9014,17 +9406,14 @@ } }, "semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "requires": { - "lru-cache": "^6.0.0" - } + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==" }, "serialize-javascript": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.1.tgz", - "integrity": "sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", + "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", "dev": true, "requires": { "randombytes": "^2.1.0" @@ -9135,6 +9524,49 @@ "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", "dev": true }, + "stdin-discarder": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/stdin-discarder/-/stdin-discarder-0.1.0.tgz", + "integrity": "sha512-xhV7w8S+bUwlPTb4bAOUQhv8/cSS5offJuX8GQGq32ONF0ZtDWKfkdomM3HMRA+LhX6um/FZ0COqlwsjD53LeQ==", + "dev": true, + "requires": { + "bl": "^5.0.0" + }, + "dependencies": { + "bl": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-5.1.0.tgz", + "integrity": "sha512-tv1ZJHLfTDnXE6tMHv73YgSJaWR2AFuPwMntBe7XL/GBFHnT0CLnsHMogfk5+GzCDC5ZWarSCYaIGATZt9dNsQ==", + "dev": true, + "requires": { + "buffer": "^6.0.3", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "dev": true, + "requires": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, + "readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } + } + }, "string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", @@ -9439,15 +9871,24 @@ "requires": {} }, "ts-loader": { - "version": "9.4.4", - "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.4.4.tgz", - "integrity": "sha512-MLukxDHBl8OJ5Dk3y69IsKVFRA/6MwzEqBgh+OXMPB/OD01KQuWPFd1WAQP8a5PeSCAxfnkhiuWqfmFJzJQt9w==", + "version": "9.5.1", + "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.5.1.tgz", + "integrity": "sha512-rNH3sK9kGZcH9dYzC7CewQm4NtxJTjSEVRJ2DyBZR7f8/wcta+iV44UPCXc5+nzDzivKtlzV6c9P4e+oFhDLYg==", "dev": true, "requires": { "chalk": "^4.1.0", "enhanced-resolve": "^5.0.0", "micromatch": "^4.0.0", - "semver": "^7.3.4" + "semver": "^7.3.4", + "source-map": "^0.7.4" + }, + "dependencies": { + "source-map": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", + "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", + "dev": true + } } }, "tslib": { @@ -9638,6 +10079,12 @@ "integrity": "sha512-+A5Sja4HP1M08MaXya7p5LvjuM7K6q/2EaC0+iovj/wOcMsTzMvDFbasi/oSapiwOlt252IqsKqPjCl7huKS0A==", "dev": true }, + "undici-types": { + "version": "6.19.8", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", + "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==", + "dev": true + }, "universalify": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", @@ -10002,7 +10449,8 @@ "yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true }, "yargs": { "version": "16.2.0", diff --git a/package.json b/package.json index b72d6b19..11ad98d7 100644 --- a/package.json +++ b/package.json @@ -1067,10 +1067,10 @@ "@types/lodash": "^4.14.191", "@types/minimatch": "^3.0.3", "@types/mocha": "^9.1.1", - "@types/node": "^16.18.11", + "@types/node": "20.x", "@types/semver": "^7.3.13", "@types/vscode": "1.83.1", - "@vscode/test-electron": "^2.3.8", + "@vscode/test-electron": "^2.4.1", "copy-webpack-plugin": "^11.0.0", "glob": "^7.2.3", "mocha": "^9.2.2", diff --git a/test/index.ts b/test/index.ts index 66d0b20a..c89db539 100644 --- a/test/index.ts +++ b/test/index.ts @@ -16,10 +16,14 @@ async function main(): Promise { // Resolve redhat.java dependency const [cli, ...args] = resolveCliArgsFromVSCodeExecutablePath(vscodeExecutablePath); - cp.spawnSync(cli, [...args, '--install-extension', 'redhat.java'], { + const options: cp.SpawnSyncOptionsWithStringEncoding = { encoding: 'utf-8', - stdio: 'inherit' - }); + stdio: 'inherit', + }; + if (process.platform === 'win32') { + options.shell = true; + } + cp.spawnSync(cli, [...args, '--install-extension', 'redhat.java'], options); // The folder containing the Extension Manifest package.json // Passed to `--extensionDevelopmentPath` From 923da7f423f5d913eb8d5e4f53e9bdf97e8b867d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 27 Aug 2024 12:40:27 +0800 Subject: [PATCH 210/352] chore(deps): Bump micromatch from 4.0.5 to 4.0.8 (#851) Bumps [micromatch](https://github.com/micromatch/micromatch) from 4.0.5 to 4.0.8. - [Release notes](https://github.com/micromatch/micromatch/releases) - [Changelog](https://github.com/micromatch/micromatch/blob/4.0.8/CHANGELOG.md) - [Commits](https://github.com/micromatch/micromatch/compare/4.0.5...4.0.8) --- updated-dependencies: - dependency-name: micromatch dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index 23299643..183e5900 100644 --- a/package-lock.json +++ b/package-lock.json @@ -3311,9 +3311,9 @@ } }, "node_modules/micromatch": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.7.tgz", - "integrity": "sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==", + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", "dependencies": { "braces": "^3.0.3", "picomatch": "^2.3.1" @@ -8527,9 +8527,9 @@ "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==" }, "micromatch": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.7.tgz", - "integrity": "sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==", + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", "requires": { "braces": "^3.0.3", "picomatch": "^2.3.1" From 0785f1e5559542dd9bef1c21f4ed6b7ddc7b1ee3 Mon Sep 17 00:00:00 2001 From: Dusan Balek Date: Wed, 28 Aug 2024 05:14:55 +0200 Subject: [PATCH 211/352] fix - Graal Cloud Native Launcher extension renamed. (#849) --- src/controllers/projectController.ts | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/controllers/projectController.ts b/src/controllers/projectController.ts index 3f9cbaf5..b630e339 100644 --- a/src/controllers/projectController.ts +++ b/src/controllers/projectController.ts @@ -109,7 +109,7 @@ enum ProjectType { MicroProfile = "MicroProfile", JavaFX = "JavaFX", Micronaut = "Micronaut", - GCN = "GCN", + GDK = "GDK", } async function ensureExtension(typeName: string, metaData: IProjectTypeMetadata): Promise { @@ -275,12 +275,12 @@ const projectTypes: IProjectType[] = [ }, }, { - displayName: "Graal Cloud Native", + displayName: "Graal Development Kit for Micronaut", metadata: { - type: ProjectType.GCN, + type: ProjectType.GDK, extensionId: "oracle-labs-graalvm.gcn", - extensionName: "Graal Cloud Native Launcher", - createCommandId: "gcn.createGcnProject", + extensionName: "Graal Development Kit for Micronaut Launcher", + createCommandId: "gdk.createGdkProject", }, }, ]; From 6ee1c6bb29e293e3b7e5cd4477f8e5d43a0cf280 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 2 Sep 2024 09:40:39 +0800 Subject: [PATCH 212/352] chore(deps-dev): Bump webpack from 5.88.2 to 5.94.0 (#853) Bumps [webpack](https://github.com/webpack/webpack) from 5.88.2 to 5.94.0. - [Release notes](https://github.com/webpack/webpack/releases) - [Commits](https://github.com/webpack/webpack/compare/v5.88.2...v5.94.0) --- updated-dependencies: - dependency-name: webpack dependency-type: direct:development ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 560 +++++++++++++++++++++------------------------- package.json | 2 +- 2 files changed, 260 insertions(+), 302 deletions(-) diff --git a/package-lock.json b/package-lock.json index 183e5900..ca0fb949 100644 --- a/package-lock.json +++ b/package-lock.json @@ -36,7 +36,7 @@ "tslint": "^6.1.3", "typescript": "^4.9.4", "vscode-extension-tester": "^7.0.0", - "webpack": "^5.76.0", + "webpack": "^5.94.0", "webpack-cli": "^4.10.0" }, "engines": { @@ -255,61 +255,61 @@ } }, "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", - "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", + "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", "dev": true, "dependencies": { - "@jridgewell/set-array": "^1.0.1", + "@jridgewell/set-array": "^1.2.1", "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" + "@jridgewell/trace-mapping": "^0.3.24" }, "engines": { "node": ">=6.0.0" } }, "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", - "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", "dev": true, "engines": { "node": ">=6.0.0" } }, "node_modules/@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", "dev": true, "engines": { "node": ">=6.0.0" } }, "node_modules/@jridgewell/source-map": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.5.tgz", - "integrity": "sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==", + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz", + "integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==", "dev": true, "dependencies": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25" } }, "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.14", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", - "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", "dev": true }, "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.18", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz", - "integrity": "sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==", + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", "dev": true, "dependencies": { - "@jridgewell/resolve-uri": "3.1.0", - "@jridgewell/sourcemap-codec": "1.4.14" + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" } }, "node_modules/@microsoft/1ds-core-js": { @@ -492,30 +492,10 @@ "node": ">=14.16" } }, - "node_modules/@types/eslint": { - "version": "8.44.0", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.44.0.tgz", - "integrity": "sha512-gsF+c/0XOguWgaOgvFs+xnnRqt9GwgTvIks36WpE6ueeI4KCEHHd8K/CKHqhOqrJKsYH8m27kRzQEvWXAwXUTw==", - "dev": true, - "dependencies": { - "@types/estree": "*", - "@types/json-schema": "*" - } - }, - "node_modules/@types/eslint-scope": { - "version": "3.7.4", - "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.4.tgz", - "integrity": "sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==", - "dev": true, - "dependencies": { - "@types/eslint": "*", - "@types/estree": "*" - } - }, "node_modules/@types/estree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.1.tgz", - "integrity": "sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", + "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", "dev": true }, "node_modules/@types/fs-extra": { @@ -781,9 +761,9 @@ } }, "node_modules/@webassemblyjs/ast": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.6.tgz", - "integrity": "sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.12.1.tgz", + "integrity": "sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg==", "dev": true, "dependencies": { "@webassemblyjs/helper-numbers": "1.11.6", @@ -803,9 +783,9 @@ "dev": true }, "node_modules/@webassemblyjs/helper-buffer": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.6.tgz", - "integrity": "sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.12.1.tgz", + "integrity": "sha512-nzJwQw99DNDKr9BVCOZcLuJJUlqkJh+kVzVl6Fmq/tI5ZtEyWT1KZMyOXltXLZJmDtvLCDgwsyrkohEtopTXCw==", "dev": true }, "node_modules/@webassemblyjs/helper-numbers": { @@ -826,15 +806,15 @@ "dev": true }, "node_modules/@webassemblyjs/helper-wasm-section": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.6.tgz", - "integrity": "sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.12.1.tgz", + "integrity": "sha512-Jif4vfB6FJlUlSbgEMHUyk1j234GTNG9dBJ4XJdOySoj518Xj0oGsNi59cUQF4RRMS9ouBUxDDdyBVfPTypa5g==", "dev": true, "dependencies": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-buffer": "1.12.1", "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/wasm-gen": "1.11.6" + "@webassemblyjs/wasm-gen": "1.12.1" } }, "node_modules/@webassemblyjs/ieee754": { @@ -862,28 +842,28 @@ "dev": true }, "node_modules/@webassemblyjs/wasm-edit": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.6.tgz", - "integrity": "sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.12.1.tgz", + "integrity": "sha512-1DuwbVvADvS5mGnXbE+c9NfA8QRcZ6iKquqjjmR10k6o+zzsRVesil54DKexiowcFCPdr/Q0qaMgB01+SQ1u6g==", "dev": true, "dependencies": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-buffer": "1.12.1", "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/helper-wasm-section": "1.11.6", - "@webassemblyjs/wasm-gen": "1.11.6", - "@webassemblyjs/wasm-opt": "1.11.6", - "@webassemblyjs/wasm-parser": "1.11.6", - "@webassemblyjs/wast-printer": "1.11.6" + "@webassemblyjs/helper-wasm-section": "1.12.1", + "@webassemblyjs/wasm-gen": "1.12.1", + "@webassemblyjs/wasm-opt": "1.12.1", + "@webassemblyjs/wasm-parser": "1.12.1", + "@webassemblyjs/wast-printer": "1.12.1" } }, "node_modules/@webassemblyjs/wasm-gen": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.6.tgz", - "integrity": "sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.12.1.tgz", + "integrity": "sha512-TDq4Ojh9fcohAw6OIMXqiIcTq5KUXTGRkVxbSo1hQnSy6lAM5GSdfwWeSxpAo0YzgsgF182E/U0mDNhuA0tW7w==", "dev": true, "dependencies": { - "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/ast": "1.12.1", "@webassemblyjs/helper-wasm-bytecode": "1.11.6", "@webassemblyjs/ieee754": "1.11.6", "@webassemblyjs/leb128": "1.11.6", @@ -891,24 +871,24 @@ } }, "node_modules/@webassemblyjs/wasm-opt": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.6.tgz", - "integrity": "sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.12.1.tgz", + "integrity": "sha512-Jg99j/2gG2iaz3hijw857AVYekZe2SAskcqlWIZXjji5WStnOpVoat3gQfT/Q5tb2djnCjBtMocY/Su1GfxPBg==", "dev": true, "dependencies": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-buffer": "1.11.6", - "@webassemblyjs/wasm-gen": "1.11.6", - "@webassemblyjs/wasm-parser": "1.11.6" + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-buffer": "1.12.1", + "@webassemblyjs/wasm-gen": "1.12.1", + "@webassemblyjs/wasm-parser": "1.12.1" } }, "node_modules/@webassemblyjs/wasm-parser": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.6.tgz", - "integrity": "sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.12.1.tgz", + "integrity": "sha512-xikIi7c2FHXysxXe3COrVUPSheuBtpcfhbpFj4gmu7KRLYOzANztwUU0IbsqvMqzuNK2+glRGWCEqZo1WCLyAQ==", "dev": true, "dependencies": { - "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/ast": "1.12.1", "@webassemblyjs/helper-api-error": "1.11.6", "@webassemblyjs/helper-wasm-bytecode": "1.11.6", "@webassemblyjs/ieee754": "1.11.6", @@ -917,12 +897,12 @@ } }, "node_modules/@webassemblyjs/wast-printer": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.6.tgz", - "integrity": "sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.12.1.tgz", + "integrity": "sha512-+X4WAlOisVWQMikjbcvY2e0rwPsKQ9F688lksZhBcPycBBuii3O7m8FACbDMWDojpAqvjIncrG8J0XHKyQfVeA==", "dev": true, "dependencies": { - "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/ast": "1.12.1", "@xtuc/long": "4.2.2" } }, @@ -975,9 +955,9 @@ "dev": true }, "node_modules/acorn": { - "version": "8.10.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", - "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", + "version": "8.12.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz", + "integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==", "dev": true, "bin": { "acorn": "bin/acorn" @@ -986,10 +966,10 @@ "node": ">=0.4.0" } }, - "node_modules/acorn-import-assertions": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz", - "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==", + "node_modules/acorn-import-attributes": { + "version": "1.9.5", + "resolved": "https://registry.npmjs.org/acorn-import-attributes/-/acorn-import-attributes-1.9.5.tgz", + "integrity": "sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==", "dev": true, "peerDependencies": { "acorn": "^8" @@ -1255,9 +1235,9 @@ "dev": true }, "node_modules/browserslist": { - "version": "4.21.9", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.9.tgz", - "integrity": "sha512-M0MFoZzbUrRU4KNfCrDLnvyE7gub+peetoTid3TBIqtunaDJyXlwhakT+/VkvSXcfIzFfK/nkCs4nmyTmxdNSg==", + "version": "4.23.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.3.tgz", + "integrity": "sha512-btwCFJVjI4YWDNfau8RhZ+B1Q/VLoUITrm3RlP6y1tYGWIOa+InuYiRGXUBXo8nA1qKmHMyLB/iVQg5TT4eFoA==", "dev": true, "funding": [ { @@ -1274,10 +1254,10 @@ } ], "dependencies": { - "caniuse-lite": "^1.0.30001503", - "electron-to-chromium": "^1.4.431", - "node-releases": "^2.0.12", - "update-browserslist-db": "^1.0.11" + "caniuse-lite": "^1.0.30001646", + "electron-to-chromium": "^1.5.4", + "node-releases": "^2.0.18", + "update-browserslist-db": "^1.1.0" }, "bin": { "browserslist": "cli.js" @@ -1429,9 +1409,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001517", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001517.tgz", - "integrity": "sha512-Vdhm5S11DaFVLlyiKu4hiUTkpZu+y1KA/rZZqVQfOD5YdDT/eQKlkt7NaE0WGOFgX32diqt9MiP9CAiFeRklaA==", + "version": "1.0.30001655", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001655.tgz", + "integrity": "sha512-jRGVy3iSGO5Uutn2owlb5gR6qsGngTw9ZTb4ali9f3glshcNmJ2noam4Mo9zia5P9Dk3jNNydy7vQjuE5dQmfg==", "dev": true, "funding": [ { @@ -1972,9 +1952,9 @@ "dev": true }, "node_modules/electron-to-chromium": { - "version": "1.4.467", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.467.tgz", - "integrity": "sha512-2qI70O+rR4poYeF2grcuS/bCps5KJh6y1jtZMDDEteyKJQrzLOEhFyXCLcHW6DTBjKjWkk26JhWoAi+Ux9A0fg==", + "version": "1.5.13", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.13.tgz", + "integrity": "sha512-lbBcvtIJ4J6sS4tb5TLp1b4LyfCdMkwStzXPyAgVgTRAsep4bvrAGaBOP7ZJtQMNJpSQ9SqG4brWOroNaQtm7Q==", "dev": true }, "node_modules/emoji-regex": { @@ -1993,9 +1973,9 @@ } }, "node_modules/enhanced-resolve": { - "version": "5.15.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz", - "integrity": "sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==", + "version": "5.17.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17.1.tgz", + "integrity": "sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg==", "dev": true, "dependencies": { "graceful-fs": "^4.2.4", @@ -2036,9 +2016,9 @@ "dev": true }, "node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", "dev": true, "engines": { "node": ">=6" @@ -3649,9 +3629,9 @@ "optional": true }, "node_modules/node-releases": { - "version": "2.0.13", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz", - "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==", + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz", + "integrity": "sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==", "dev": true }, "node_modules/normalize-path": { @@ -4030,9 +4010,9 @@ "dev": true }, "node_modules/picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", + "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==", "dev": true }, "node_modules/picomatch": { @@ -5018,9 +4998,9 @@ } }, "node_modules/terser": { - "version": "5.19.1", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.19.1.tgz", - "integrity": "sha512-27hxBUVdV6GoNg1pKQ7Z5cbR6V9txPVyBA+FQw3BaZ1Wuzvztce5p156DaP0NVZNrMZZ+6iG9Syf7WgMNKDg2Q==", + "version": "5.31.6", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.31.6.tgz", + "integrity": "sha512-PQ4DAriWzKj+qgehQ7LK5bQqCFNMmlhjR2PFFLuqGCpuCAauxemVBWwWOxo3UIwWQx8+Pr61Df++r76wDmkQBg==", "dev": true, "dependencies": { "@jridgewell/source-map": "^0.3.3", @@ -5036,16 +5016,16 @@ } }, "node_modules/terser-webpack-plugin": { - "version": "5.3.9", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.9.tgz", - "integrity": "sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA==", + "version": "5.3.10", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.10.tgz", + "integrity": "sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==", "dev": true, "dependencies": { - "@jridgewell/trace-mapping": "^0.3.17", + "@jridgewell/trace-mapping": "^0.3.20", "jest-worker": "^27.4.5", "schema-utils": "^3.1.1", "serialize-javascript": "^6.0.1", - "terser": "^5.16.8" + "terser": "^5.26.0" }, "engines": { "node": ">= 10.13.0" @@ -5480,9 +5460,9 @@ } }, "node_modules/update-browserslist-db": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz", - "integrity": "sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.0.tgz", + "integrity": "sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==", "dev": true, "funding": [ { @@ -5499,8 +5479,8 @@ } ], "dependencies": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" + "escalade": "^3.1.2", + "picocolors": "^1.0.1" }, "bin": { "update-browserslist-db": "cli.js" @@ -5665,9 +5645,9 @@ } }, "node_modules/watchpack": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", - "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.2.tgz", + "integrity": "sha512-TnbFSbcOCcDgjZ4piURLCbJ3nJhznVh9kw6F6iokjiFPl8ONxe9A6nMDVXDiNbrSfLILs6vB07F7wLBrwPYzJw==", "dev": true, "dependencies": { "glob-to-regexp": "^0.4.1", @@ -5678,34 +5658,33 @@ } }, "node_modules/webpack": { - "version": "5.88.2", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.88.2.tgz", - "integrity": "sha512-JmcgNZ1iKj+aiR0OvTYtWQqJwq37Pf683dY9bVORwVbUrDhLhdn/PlO2sHsFHPkj7sHNQF3JwaAkp49V+Sq1tQ==", + "version": "5.94.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.94.0.tgz", + "integrity": "sha512-KcsGn50VT+06JH/iunZJedYGUJS5FGjow8wb9c0v5n1Om8O1g4L6LjtfxwlXIATopoQu+vOXXa7gYisWxCoPyg==", "dev": true, "dependencies": { - "@types/eslint-scope": "^3.7.3", - "@types/estree": "^1.0.0", - "@webassemblyjs/ast": "^1.11.5", - "@webassemblyjs/wasm-edit": "^1.11.5", - "@webassemblyjs/wasm-parser": "^1.11.5", + "@types/estree": "^1.0.5", + "@webassemblyjs/ast": "^1.12.1", + "@webassemblyjs/wasm-edit": "^1.12.1", + "@webassemblyjs/wasm-parser": "^1.12.1", "acorn": "^8.7.1", - "acorn-import-assertions": "^1.9.0", - "browserslist": "^4.14.5", + "acorn-import-attributes": "^1.9.5", + "browserslist": "^4.21.10", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.15.0", + "enhanced-resolve": "^5.17.1", "es-module-lexer": "^1.2.1", "eslint-scope": "5.1.1", "events": "^3.2.0", "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.2.9", + "graceful-fs": "^4.2.11", "json-parse-even-better-errors": "^2.3.1", "loader-runner": "^4.2.0", "mime-types": "^2.1.27", "neo-async": "^2.6.2", "schema-utils": "^3.2.0", "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.3.7", - "watchpack": "^2.4.0", + "terser-webpack-plugin": "^5.3.10", + "watchpack": "^2.4.1", "webpack-sources": "^3.2.3" }, "bin": { @@ -6217,52 +6196,52 @@ } }, "@jridgewell/gen-mapping": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", - "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", + "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", "dev": true, "requires": { - "@jridgewell/set-array": "^1.0.1", + "@jridgewell/set-array": "^1.2.1", "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" + "@jridgewell/trace-mapping": "^0.3.24" } }, "@jridgewell/resolve-uri": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", - "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", "dev": true }, "@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", "dev": true }, "@jridgewell/source-map": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.5.tgz", - "integrity": "sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==", + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz", + "integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==", "dev": true, "requires": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25" } }, "@jridgewell/sourcemap-codec": { - "version": "1.4.14", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", - "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", "dev": true }, "@jridgewell/trace-mapping": { - "version": "0.3.18", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz", - "integrity": "sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==", + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", "dev": true, "requires": { - "@jridgewell/resolve-uri": "3.1.0", - "@jridgewell/sourcemap-codec": "1.4.14" + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" } }, "@microsoft/1ds-core-js": { @@ -6412,30 +6391,10 @@ "defer-to-connect": "^2.0.1" } }, - "@types/eslint": { - "version": "8.44.0", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.44.0.tgz", - "integrity": "sha512-gsF+c/0XOguWgaOgvFs+xnnRqt9GwgTvIks36WpE6ueeI4KCEHHd8K/CKHqhOqrJKsYH8m27kRzQEvWXAwXUTw==", - "dev": true, - "requires": { - "@types/estree": "*", - "@types/json-schema": "*" - } - }, - "@types/eslint-scope": { - "version": "3.7.4", - "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.4.tgz", - "integrity": "sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==", - "dev": true, - "requires": { - "@types/eslint": "*", - "@types/estree": "*" - } - }, "@types/estree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.1.tgz", - "integrity": "sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", + "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", "dev": true }, "@types/fs-extra": { @@ -6668,9 +6627,9 @@ } }, "@webassemblyjs/ast": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.6.tgz", - "integrity": "sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.12.1.tgz", + "integrity": "sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg==", "dev": true, "requires": { "@webassemblyjs/helper-numbers": "1.11.6", @@ -6690,9 +6649,9 @@ "dev": true }, "@webassemblyjs/helper-buffer": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.6.tgz", - "integrity": "sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.12.1.tgz", + "integrity": "sha512-nzJwQw99DNDKr9BVCOZcLuJJUlqkJh+kVzVl6Fmq/tI5ZtEyWT1KZMyOXltXLZJmDtvLCDgwsyrkohEtopTXCw==", "dev": true }, "@webassemblyjs/helper-numbers": { @@ -6713,15 +6672,15 @@ "dev": true }, "@webassemblyjs/helper-wasm-section": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.6.tgz", - "integrity": "sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.12.1.tgz", + "integrity": "sha512-Jif4vfB6FJlUlSbgEMHUyk1j234GTNG9dBJ4XJdOySoj518Xj0oGsNi59cUQF4RRMS9ouBUxDDdyBVfPTypa5g==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-buffer": "1.12.1", "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/wasm-gen": "1.11.6" + "@webassemblyjs/wasm-gen": "1.12.1" } }, "@webassemblyjs/ieee754": { @@ -6749,28 +6708,28 @@ "dev": true }, "@webassemblyjs/wasm-edit": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.6.tgz", - "integrity": "sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.12.1.tgz", + "integrity": "sha512-1DuwbVvADvS5mGnXbE+c9NfA8QRcZ6iKquqjjmR10k6o+zzsRVesil54DKexiowcFCPdr/Q0qaMgB01+SQ1u6g==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-buffer": "1.12.1", "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/helper-wasm-section": "1.11.6", - "@webassemblyjs/wasm-gen": "1.11.6", - "@webassemblyjs/wasm-opt": "1.11.6", - "@webassemblyjs/wasm-parser": "1.11.6", - "@webassemblyjs/wast-printer": "1.11.6" + "@webassemblyjs/helper-wasm-section": "1.12.1", + "@webassemblyjs/wasm-gen": "1.12.1", + "@webassemblyjs/wasm-opt": "1.12.1", + "@webassemblyjs/wasm-parser": "1.12.1", + "@webassemblyjs/wast-printer": "1.12.1" } }, "@webassemblyjs/wasm-gen": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.6.tgz", - "integrity": "sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.12.1.tgz", + "integrity": "sha512-TDq4Ojh9fcohAw6OIMXqiIcTq5KUXTGRkVxbSo1hQnSy6lAM5GSdfwWeSxpAo0YzgsgF182E/U0mDNhuA0tW7w==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/ast": "1.12.1", "@webassemblyjs/helper-wasm-bytecode": "1.11.6", "@webassemblyjs/ieee754": "1.11.6", "@webassemblyjs/leb128": "1.11.6", @@ -6778,24 +6737,24 @@ } }, "@webassemblyjs/wasm-opt": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.6.tgz", - "integrity": "sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.12.1.tgz", + "integrity": "sha512-Jg99j/2gG2iaz3hijw857AVYekZe2SAskcqlWIZXjji5WStnOpVoat3gQfT/Q5tb2djnCjBtMocY/Su1GfxPBg==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-buffer": "1.11.6", - "@webassemblyjs/wasm-gen": "1.11.6", - "@webassemblyjs/wasm-parser": "1.11.6" + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-buffer": "1.12.1", + "@webassemblyjs/wasm-gen": "1.12.1", + "@webassemblyjs/wasm-parser": "1.12.1" } }, "@webassemblyjs/wasm-parser": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.6.tgz", - "integrity": "sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.12.1.tgz", + "integrity": "sha512-xikIi7c2FHXysxXe3COrVUPSheuBtpcfhbpFj4gmu7KRLYOzANztwUU0IbsqvMqzuNK2+glRGWCEqZo1WCLyAQ==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/ast": "1.12.1", "@webassemblyjs/helper-api-error": "1.11.6", "@webassemblyjs/helper-wasm-bytecode": "1.11.6", "@webassemblyjs/ieee754": "1.11.6", @@ -6804,12 +6763,12 @@ } }, "@webassemblyjs/wast-printer": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.6.tgz", - "integrity": "sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.12.1.tgz", + "integrity": "sha512-+X4WAlOisVWQMikjbcvY2e0rwPsKQ9F688lksZhBcPycBBuii3O7m8FACbDMWDojpAqvjIncrG8J0XHKyQfVeA==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/ast": "1.12.1", "@xtuc/long": "4.2.2" } }, @@ -6849,15 +6808,15 @@ "dev": true }, "acorn": { - "version": "8.10.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", - "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", + "version": "8.12.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz", + "integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==", "dev": true }, - "acorn-import-assertions": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz", - "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==", + "acorn-import-attributes": { + "version": "1.9.5", + "resolved": "https://registry.npmjs.org/acorn-import-attributes/-/acorn-import-attributes-1.9.5.tgz", + "integrity": "sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==", "dev": true, "requires": {} }, @@ -7061,15 +7020,15 @@ "dev": true }, "browserslist": { - "version": "4.21.9", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.9.tgz", - "integrity": "sha512-M0MFoZzbUrRU4KNfCrDLnvyE7gub+peetoTid3TBIqtunaDJyXlwhakT+/VkvSXcfIzFfK/nkCs4nmyTmxdNSg==", + "version": "4.23.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.3.tgz", + "integrity": "sha512-btwCFJVjI4YWDNfau8RhZ+B1Q/VLoUITrm3RlP6y1tYGWIOa+InuYiRGXUBXo8nA1qKmHMyLB/iVQg5TT4eFoA==", "dev": true, "requires": { - "caniuse-lite": "^1.0.30001503", - "electron-to-chromium": "^1.4.431", - "node-releases": "^2.0.12", - "update-browserslist-db": "^1.0.11" + "caniuse-lite": "^1.0.30001646", + "electron-to-chromium": "^1.5.4", + "node-releases": "^2.0.18", + "update-browserslist-db": "^1.1.0" } }, "buffer": { @@ -7174,9 +7133,9 @@ "dev": true }, "caniuse-lite": { - "version": "1.0.30001517", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001517.tgz", - "integrity": "sha512-Vdhm5S11DaFVLlyiKu4hiUTkpZu+y1KA/rZZqVQfOD5YdDT/eQKlkt7NaE0WGOFgX32diqt9MiP9CAiFeRklaA==", + "version": "1.0.30001655", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001655.tgz", + "integrity": "sha512-jRGVy3iSGO5Uutn2owlb5gR6qsGngTw9ZTb4ali9f3glshcNmJ2noam4Mo9zia5P9Dk3jNNydy7vQjuE5dQmfg==", "dev": true }, "chainsaw": { @@ -7557,9 +7516,9 @@ "dev": true }, "electron-to-chromium": { - "version": "1.4.467", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.467.tgz", - "integrity": "sha512-2qI70O+rR4poYeF2grcuS/bCps5KJh6y1jtZMDDEteyKJQrzLOEhFyXCLcHW6DTBjKjWkk26JhWoAi+Ux9A0fg==", + "version": "1.5.13", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.13.tgz", + "integrity": "sha512-lbBcvtIJ4J6sS4tb5TLp1b4LyfCdMkwStzXPyAgVgTRAsep4bvrAGaBOP7ZJtQMNJpSQ9SqG4brWOroNaQtm7Q==", "dev": true }, "emoji-regex": { @@ -7578,9 +7537,9 @@ } }, "enhanced-resolve": { - "version": "5.15.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz", - "integrity": "sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==", + "version": "5.17.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17.1.tgz", + "integrity": "sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg==", "dev": true, "requires": { "graceful-fs": "^4.2.4", @@ -7606,9 +7565,9 @@ "dev": true }, "escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", "dev": true }, "escape-string-regexp": { @@ -8787,9 +8746,9 @@ "optional": true }, "node-releases": { - "version": "2.0.13", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz", - "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==", + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz", + "integrity": "sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==", "dev": true }, "normalize-path": { @@ -9053,9 +9012,9 @@ "dev": true }, "picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", + "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==", "dev": true }, "picomatch": { @@ -9763,9 +9722,9 @@ } }, "terser": { - "version": "5.19.1", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.19.1.tgz", - "integrity": "sha512-27hxBUVdV6GoNg1pKQ7Z5cbR6V9txPVyBA+FQw3BaZ1Wuzvztce5p156DaP0NVZNrMZZ+6iG9Syf7WgMNKDg2Q==", + "version": "5.31.6", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.31.6.tgz", + "integrity": "sha512-PQ4DAriWzKj+qgehQ7LK5bQqCFNMmlhjR2PFFLuqGCpuCAauxemVBWwWOxo3UIwWQx8+Pr61Df++r76wDmkQBg==", "dev": true, "requires": { "@jridgewell/source-map": "^0.3.3", @@ -9775,16 +9734,16 @@ } }, "terser-webpack-plugin": { - "version": "5.3.9", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.9.tgz", - "integrity": "sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA==", + "version": "5.3.10", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.10.tgz", + "integrity": "sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==", "dev": true, "requires": { - "@jridgewell/trace-mapping": "^0.3.17", + "@jridgewell/trace-mapping": "^0.3.20", "jest-worker": "^27.4.5", "schema-utils": "^3.1.1", "serialize-javascript": "^6.0.1", - "terser": "^5.16.8" + "terser": "^5.26.0" }, "dependencies": { "ajv": { @@ -10109,13 +10068,13 @@ } }, "update-browserslist-db": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz", - "integrity": "sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.0.tgz", + "integrity": "sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==", "dev": true, "requires": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" + "escalade": "^3.1.2", + "picocolors": "^1.0.1" } }, "uri-js": { @@ -10239,9 +10198,9 @@ } }, "watchpack": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", - "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.2.tgz", + "integrity": "sha512-TnbFSbcOCcDgjZ4piURLCbJ3nJhznVh9kw6F6iokjiFPl8ONxe9A6nMDVXDiNbrSfLILs6vB07F7wLBrwPYzJw==", "dev": true, "requires": { "glob-to-regexp": "^0.4.1", @@ -10249,34 +10208,33 @@ } }, "webpack": { - "version": "5.88.2", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.88.2.tgz", - "integrity": "sha512-JmcgNZ1iKj+aiR0OvTYtWQqJwq37Pf683dY9bVORwVbUrDhLhdn/PlO2sHsFHPkj7sHNQF3JwaAkp49V+Sq1tQ==", + "version": "5.94.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.94.0.tgz", + "integrity": "sha512-KcsGn50VT+06JH/iunZJedYGUJS5FGjow8wb9c0v5n1Om8O1g4L6LjtfxwlXIATopoQu+vOXXa7gYisWxCoPyg==", "dev": true, "requires": { - "@types/eslint-scope": "^3.7.3", - "@types/estree": "^1.0.0", - "@webassemblyjs/ast": "^1.11.5", - "@webassemblyjs/wasm-edit": "^1.11.5", - "@webassemblyjs/wasm-parser": "^1.11.5", + "@types/estree": "^1.0.5", + "@webassemblyjs/ast": "^1.12.1", + "@webassemblyjs/wasm-edit": "^1.12.1", + "@webassemblyjs/wasm-parser": "^1.12.1", "acorn": "^8.7.1", - "acorn-import-assertions": "^1.9.0", - "browserslist": "^4.14.5", + "acorn-import-attributes": "^1.9.5", + "browserslist": "^4.21.10", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.15.0", + "enhanced-resolve": "^5.17.1", "es-module-lexer": "^1.2.1", "eslint-scope": "5.1.1", "events": "^3.2.0", "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.2.9", + "graceful-fs": "^4.2.11", "json-parse-even-better-errors": "^2.3.1", "loader-runner": "^4.2.0", "mime-types": "^2.1.27", "neo-async": "^2.6.2", "schema-utils": "^3.2.0", "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.3.7", - "watchpack": "^2.4.0", + "terser-webpack-plugin": "^5.3.10", + "watchpack": "^2.4.1", "webpack-sources": "^3.2.3" }, "dependencies": { diff --git a/package.json b/package.json index 11ad98d7..32fe726b 100644 --- a/package.json +++ b/package.json @@ -1078,7 +1078,7 @@ "tslint": "^6.1.3", "typescript": "^4.9.4", "vscode-extension-tester": "^7.0.0", - "webpack": "^5.76.0", + "webpack": "^5.94.0", "webpack-cli": "^4.10.0" }, "dependencies": { From b839f1e2e20c2bd5126109d906afdb84ef9e096c Mon Sep 17 00:00:00 2001 From: Marko Milic Date: Thu, 31 Oct 2024 08:05:11 +0100 Subject: [PATCH 213/352] ux - display maven and gradle dependencies with pattern 'groupId:artifactId:version ' (#859) --- .vscode/launch.json | 1 + CONTRIBUTING.md | 37 +++++++++++++++++++ .../jdtls/ext/core/PackageCommand.java | 3 +- .../jdtls/ext/core/model/PackageNode.java | 22 +++++++++++ src/views/PrimaryTypeNode.ts | 4 ++ src/views/containerNode.ts | 25 ++++++++++--- src/views/dataNode.ts | 4 ++ src/views/dependencyDataProvider.ts | 10 ++++- src/views/documentSymbolNode.ts | 6 ++- src/views/explorerNode.ts | 2 + test/gradle-suite/projectView.test.ts | 6 ++- test/invisible-suite/projectView.test.ts | 14 +++---- test/maven-suite/projectView.test.ts | 20 +++++++++- 13 files changed, 133 insertions(+), 21 deletions(-) create mode 100644 CONTRIBUTING.md diff --git a/.vscode/launch.json b/.vscode/launch.json index 57261f9f..7e154613 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -18,6 +18,7 @@ { "type": "java", "name": "Attach to Plugin", + "projectName": "com.microsoft.jdtls.ext.core", "request": "attach", "hostName": "localhost", "port": 1044 diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 00000000..9917e21e --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,37 @@ +# How to Contribute + +We greatly appreciate contributions to the vscode-java-dependency project. Your efforts help us maintain and improve this extension. To ensure a smooth contribution process, please follow these guidelines. + +## Prerequisites +- [JDK](https://www.oracle.com/java/technologies/downloads/?er=221886) +- [Node.JS](https://nodejs.org/en/) +- [VSCode](https://code.visualstudio.com/) + +## Build and Run + +To set up the vscode-java-dependency project, follow these steps: + +1. **Build the Server JAR**: + - The server JAR (Java application) is located in the [jdtls.ext](./jdtls.ext) directory. + - Run the following command to build the server: + ```shell + npm run build-server + ``` + +2. **Install Dependencies**: + - Execute the following command to install the necessary dependencies: + ```shell + npm install + ``` + +3. **Run/Debug the Extension**: + - Open the "Run and Debug" view in Visual Studio Code. + - Run the "Run Extension" task. + +4. **Attach to Plugin[Debug Java]**: + - Prerequisite: Ensure that the extension is activated, meaning the Java process is already launched. This is required for the task to run properly. + - Open the "Run and Debug" view in Visual Studio Code. + - Run the "Attach to Plugin" task. + - Note: This task is required only if you want to debug Java code [jdtls.ext](./jdtls.ext). It requires the [vscode-pde](https://marketplace.visualstudio.com/items?itemName=yaozheng.vscode-pde) extension to be installed. + +Thank you for your contributions and support! \ No newline at end of file diff --git a/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/PackageCommand.java b/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/PackageCommand.java index 1bb2e99b..cada8754 100644 --- a/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/PackageCommand.java +++ b/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/PackageCommand.java @@ -14,6 +14,7 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; +import java.util.EnumMap; import java.util.HashMap; import java.util.LinkedList; import java.util.List; @@ -78,7 +79,7 @@ public class PackageCommand { private static final Map>> commands; static { - commands = new HashMap<>(); + commands = new EnumMap<>(NodeKind.class); commands.put(NodeKind.PROJECT, PackageCommand::getProjectChildren); commands.put(NodeKind.CONTAINER, PackageCommand::getContainerChildren); commands.put(NodeKind.PACKAGEROOT, PackageCommand::getPackageRootChildren); diff --git a/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/model/PackageNode.java b/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/model/PackageNode.java index 7f146d8d..92fa4cf7 100644 --- a/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/model/PackageNode.java +++ b/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/model/PackageNode.java @@ -19,6 +19,7 @@ import java.util.Map; import java.util.Objects; +import org.apache.commons.lang3.StringUtils; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IFolder; import org.eclipse.core.resources.IProject; @@ -273,11 +274,32 @@ public static PackageRootNode createNodeForPackageFragmentRoot(IPackageFragmentR for (IClasspathAttribute attribute : resolvedClasspathEntry.getExtraAttributes()) { node.setMetaDataValue(attribute.getName(), attribute.getValue()); } + + String computedDisplayName = computeDisplayName(node); + if (StringUtils.isNotBlank(computedDisplayName)) { + node.setDisplayName(computedDisplayName); + } } return node; } + private static String computeDisplayName(PackageRootNode node) { + if (node.getMetaData() == null || node.getMetaData().isEmpty()) { + return node.getName(); + } + + String version = (String) node.getMetaData().get("maven.version"); + String groupId = (String) node.getMetaData().get("maven.groupId"); + String artifactId = (String) node.getMetaData().get("maven.artifactId"); + + if (StringUtils.isBlank(version) || StringUtils.isBlank(groupId) || StringUtils.isBlank(artifactId)) { + return node.getName(); + } + + return groupId + ":" + artifactId + ":" + version; + } + /** * Get the correspond node of classpath, it may be container or a package root. * diff --git a/src/views/PrimaryTypeNode.ts b/src/views/PrimaryTypeNode.ts index 8ee95223..0d80bf8b 100644 --- a/src/views/PrimaryTypeNode.ts +++ b/src/views/PrimaryTypeNode.ts @@ -34,6 +34,10 @@ export class PrimaryTypeNode extends DataNode { return ""; } + public getLabel(): string { + return this._nodeData.displayName ?? this._nodeData.name; + } + protected async loadData(): Promise { if (!this.hasChildren() || !this.nodeData.uri) { return undefined; diff --git a/src/views/containerNode.ts b/src/views/containerNode.ts index 0245514c..a8cbd6c7 100644 --- a/src/views/containerNode.ts +++ b/src/views/containerNode.ts @@ -15,23 +15,36 @@ export class ContainerNode extends DataNode { super(nodeData, parent); } + private _containerType: ContainerType; + public get projectBasePath() { return this._project.uri && Uri.parse(this._project.uri).fsPath; } - public getContainerType(): string { + public getContainerType(): ContainerType { + if (this._containerType) { + return this._containerType; + } + const containerPath: string = this._nodeData.path || ""; if (containerPath.startsWith(ContainerPath.JRE)) { - return ContainerType.JRE; + this._containerType = ContainerType.JRE; } else if (containerPath.startsWith(ContainerPath.Maven)) { - return ContainerType.Maven; + this._containerType = ContainerType.Maven; } else if (containerPath.startsWith(ContainerPath.Gradle)) { - return ContainerType.Gradle; + this._containerType = ContainerType.Gradle; } else if (containerPath.startsWith(ContainerPath.ReferencedLibrary) && this._project.isUnmanagedFolder()) { // currently, we only support editing referenced libraries in unmanaged folders - return ContainerType.ReferencedLibrary; + this._containerType = ContainerType.ReferencedLibrary; + } else { + this._containerType = ContainerType.Unknown; } - return ContainerType.Unknown; + + return this._containerType; + } + + public isMavenType(): boolean { + return this._containerType === ContainerType.Maven; } protected async loadData(): Promise { diff --git a/src/views/dataNode.ts b/src/views/dataNode.ts index 21be07a7..200abf13 100644 --- a/src/views/dataNode.ts +++ b/src/views/dataNode.ts @@ -42,6 +42,10 @@ export abstract class DataNode extends ExplorerNode { return item; } + public getDisplayName(): string { + return this._nodeData.displayName || this._nodeData.name; + } + public get nodeData(): INodeData { return this._nodeData; } diff --git a/src/views/dependencyDataProvider.ts b/src/views/dependencyDataProvider.ts index dd0bd05b..12001be2 100644 --- a/src/views/dependencyDataProvider.ts +++ b/src/views/dependencyDataProvider.ts @@ -7,7 +7,7 @@ import { RelativePattern, TreeDataProvider, TreeItem, Uri, window, workspace, } from "vscode"; import { instrumentOperationAsVsCodeCommand, sendError } from "vscode-extension-telemetry-wrapper"; -import { contextManager } from "../../extension.bundle"; +import { ContainerNode, contextManager } from "../../extension.bundle"; import { Commands } from "../commands"; import { Context } from "../constants"; import { appendOutput, executeExportJarTask } from "../tasks/buildArtifact/BuildArtifactTaskProvider"; @@ -124,6 +124,14 @@ export class DependencyDataProvider implements TreeDataProvider { const children = (!this._rootItems || !element) ? await this.getRootNodes() : await element.getChildren(); + if (children && element instanceof ContainerNode) { + if (element.isMavenType()) { + children.sort((a, b) => { + return a.getDisplayName().localeCompare(b.getDisplayName()); + }); + } + } + explorerNodeCache.saveNodes(children || []); return children; } diff --git a/src/views/documentSymbolNode.ts b/src/views/documentSymbolNode.ts index a6ead753..7552116e 100644 --- a/src/views/documentSymbolNode.ts +++ b/src/views/documentSymbolNode.ts @@ -28,6 +28,10 @@ export class DocumentSymbolNode extends ExplorerNode { super(parent); } + public getDisplayName(): string { + return this.symbolInfo.name; + } + public getChildren(): ExplorerNode[] | Promise { const res: ExplorerNode[] = []; if (this.symbolInfo?.children?.length) { @@ -39,7 +43,7 @@ export class DocumentSymbolNode extends ExplorerNode { } public getTreeItem(): TreeItem | Promise { - const item = new TreeItem(this.symbolInfo.name, + const item = new TreeItem(this.getDisplayName(), this.symbolInfo?.children?.length ? TreeItemCollapsibleState.Collapsed : TreeItemCollapsibleState.None); item.iconPath = this.iconPath; diff --git a/src/views/explorerNode.ts b/src/views/explorerNode.ts index c5c29092..1dcac373 100644 --- a/src/views/explorerNode.ts +++ b/src/views/explorerNode.ts @@ -33,4 +33,6 @@ export abstract class ExplorerNode { public abstract getTreeItem(): TreeItem | Promise; public abstract computeContextValue(): string | undefined; + + public abstract getDisplayName(): string; } diff --git a/test/gradle-suite/projectView.test.ts b/test/gradle-suite/projectView.test.ts index ec5a045d..4a4e6776 100644 --- a/test/gradle-suite/projectView.test.ts +++ b/test/gradle-suite/projectView.test.ts @@ -3,13 +3,17 @@ import * as assert from "assert"; import { ContainerNode, contextManager, DataNode, DependencyExplorer, + languageServerApiManager, PackageRootNode, PrimaryTypeNode, ProjectNode } from "../../extension.bundle"; import { fsPath, setupTestEnv, Uris } from "../shared"; // tslint:disable: only-arrow-functions suite("Gradle Project View Tests", () => { - suiteSetup(setupTestEnv); + suiteSetup(async () => { + await setupTestEnv(); + await languageServerApiManager.ready(); + }); test("Can node render correctly", async function() { const explorer = DependencyExplorer.getInstance(contextManager.context); diff --git a/test/invisible-suite/projectView.test.ts b/test/invisible-suite/projectView.test.ts index c1488ce7..61e91d01 100644 --- a/test/invisible-suite/projectView.test.ts +++ b/test/invisible-suite/projectView.test.ts @@ -3,22 +3,21 @@ import * as assert from "assert"; import * as fse from "fs-extra"; -import { platform } from "os"; import * as path from "path"; import * as vscode from "vscode"; -import { Commands, contextManager, DependencyExplorer, PackageNode, PackageRootNode, ProjectNode } from "../../extension.bundle"; +import { Commands, contextManager, DependencyExplorer, languageServerApiManager, PackageNode, PackageRootNode, ProjectNode } from "../../extension.bundle"; import { setupTestEnv } from "../shared"; import { sleep } from "../util"; // tslint:disable: only-arrow-functions suite("Invisible Project View Tests", () => { - suiteSetup(setupTestEnv); + suiteSetup(async () => { + await setupTestEnv(); + await languageServerApiManager.ready(); + }); test("Can execute command java.project.refreshLibraries correctly", async function() { - if (platform() === "darwin") { - this.skip(); - } const explorer = DependencyExplorer.getInstance(contextManager.context); let projectNode = (await explorer.dataProvider.getChildren())![0] as ProjectNode; @@ -37,9 +36,6 @@ suite("Invisible Project View Tests", () => { }); test("Can execute command java.project.removeLibrary correctly", async function() { - if (platform() === "darwin") { - this.skip(); - } const explorer = DependencyExplorer.getInstance(contextManager.context); let projectNode = (await explorer.dataProvider.getChildren())![0] as ProjectNode; diff --git a/test/maven-suite/projectView.test.ts b/test/maven-suite/projectView.test.ts index f6863758..ec305edd 100644 --- a/test/maven-suite/projectView.test.ts +++ b/test/maven-suite/projectView.test.ts @@ -4,13 +4,16 @@ import * as assert from "assert"; import * as vscode from "vscode"; import { Commands, ContainerNode, contextManager, DataNode, DependencyExplorer, FileNode, - INodeData, Jdtls, NodeKind, PackageNode, PackageRootNode, PrimaryTypeNode, ProjectNode } from "../../extension.bundle"; + INodeData, Jdtls, languageServerApiManager, NodeKind, PackageNode, PackageRootNode, PrimaryTypeNode, ProjectNode } from "../../extension.bundle"; import { fsPath, printNodes, setupTestEnv, Uris } from "../shared"; // tslint:disable: only-arrow-functions suite("Maven Project View Tests", () => { - suiteSetup(setupTestEnv); + suiteSetup(async () => { + await setupTestEnv(); + await languageServerApiManager.ready(); + }); test("Can node render correctly in hierarchical view", async function() { await vscode.workspace.getConfiguration("java.dependency").update("packagePresentation", "hierarchical"); @@ -253,6 +256,19 @@ suite("Maven Project View Tests", () => { assert.equal(projectChildren.length, 4); }); + test("Can maven dependency nodes display in correct groupId:artifactId:version format", async function() { + const explorer = DependencyExplorer.getInstance(contextManager.context); + + const roots = await explorer.dataProvider.getChildren(); + const projectNode = roots![0] as ProjectNode; + const projectChildren = await projectNode.getChildren(); + const mavenDependency = projectChildren[3] as ContainerNode; + const mavenChildren = await mavenDependency.getChildren(); + + assert.equal(mavenChildren[0].getDisplayName(), "org.hamcrest:hamcrest-core:1.3"); + assert.equal(mavenChildren[1].getDisplayName(), "junit:junit:4.13.1"); + }); + teardown(async () => { // Restore default settings. Some tests might alter them and others depend on a specific setting. // Not resetting to the default settings will also show the file as changed in the source control view. From 573598b8caac6fe64c3cff5a77292f9b91d5b598 Mon Sep 17 00:00:00 2001 From: Sheng Chen Date: Thu, 31 Oct 2024 15:49:39 +0800 Subject: [PATCH 214/352] build - Prepare for 0.24.1 (#863) --- CHANGELOG.md | 7 +++++++ .../com.microsoft.jdtls.ext.core/META-INF/MANIFEST.MF | 2 +- jdtls.ext/com.microsoft.jdtls.ext.core/pom.xml | 2 +- jdtls.ext/com.microsoft.jdtls.ext.target/pom.xml | 2 +- jdtls.ext/pom.xml | 2 +- package-lock.json | 4 ++-- package.json | 4 ++-- 7 files changed, 15 insertions(+), 8 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 02f3bb79..84c5be80 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,13 @@ All notable changes to the "vscode-java-dependency" extension will be documented The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/) and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html). +## 0.24.1 +* Graal Cloud Native Launcher extension renamed. by @dbalek in https://github.com/microsoft/vscode-java-dependency/pull/849 +* ux - display maven and gradle dependencies with pattern 'groupId:artifactId:version ' by @mamilic in https://github.com/microsoft/vscode-java-dependency/pull/859 + +## New Contributors +* @mamilic made their first contribution in https://github.com/microsoft/vscode-java-dependency/pull/859 + ## 0.24.0 * feat - Support adding new package from file explorer by @jdneo in https://github.com/microsoft/vscode-java-dependency/pull/845 diff --git a/jdtls.ext/com.microsoft.jdtls.ext.core/META-INF/MANIFEST.MF b/jdtls.ext/com.microsoft.jdtls.ext.core/META-INF/MANIFEST.MF index 5bba4389..0503367f 100644 --- a/jdtls.ext/com.microsoft.jdtls.ext.core/META-INF/MANIFEST.MF +++ b/jdtls.ext/com.microsoft.jdtls.ext.core/META-INF/MANIFEST.MF @@ -2,7 +2,7 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: JDTLS EXT Core Bundle-SymbolicName: com.microsoft.jdtls.ext.core;singleton:=true -Bundle-Version: 0.24.0 +Bundle-Version: 0.24.1 Bundle-Activator: com.microsoft.jdtls.ext.core.JdtlsExtActivator Bundle-RequiredExecutionEnvironment: JavaSE-11 Bundle-ActivationPolicy: lazy diff --git a/jdtls.ext/com.microsoft.jdtls.ext.core/pom.xml b/jdtls.ext/com.microsoft.jdtls.ext.core/pom.xml index 618e8f40..643a4c97 100644 --- a/jdtls.ext/com.microsoft.jdtls.ext.core/pom.xml +++ b/jdtls.ext/com.microsoft.jdtls.ext.core/pom.xml @@ -5,7 +5,7 @@ com.microsoft.jdtls.ext jdtls-ext-parent - 0.24.0 + 0.24.1 com.microsoft.jdtls.ext.core eclipse-plugin diff --git a/jdtls.ext/com.microsoft.jdtls.ext.target/pom.xml b/jdtls.ext/com.microsoft.jdtls.ext.target/pom.xml index 405b4e1a..4fae28b3 100644 --- a/jdtls.ext/com.microsoft.jdtls.ext.target/pom.xml +++ b/jdtls.ext/com.microsoft.jdtls.ext.target/pom.xml @@ -4,7 +4,7 @@ com.microsoft.jdtls.ext jdtls-ext-parent - 0.24.0 + 0.24.1 com.microsoft.jdtls.ext.tp ${base.name} :: Target Platform diff --git a/jdtls.ext/pom.xml b/jdtls.ext/pom.xml index d1fc175d..d76a1b74 100644 --- a/jdtls.ext/pom.xml +++ b/jdtls.ext/pom.xml @@ -4,7 +4,7 @@ com.microsoft.jdtls.ext jdtls-ext-parent ${base.name} :: Parent - 0.24.0 + 0.24.1 pom Java Project Manager diff --git a/package-lock.json b/package-lock.json index ca0fb949..65c3926b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "vscode-java-dependency", - "version": "0.24.0", + "version": "0.24.1", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "vscode-java-dependency", - "version": "0.24.0", + "version": "0.24.1", "license": "MIT", "dependencies": { "await-lock": "^2.2.2", diff --git a/package.json b/package.json index 32fe726b..df286b18 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "vscode-java-dependency", "displayName": "Project Manager for Java", "description": "%description%", - "version": "0.24.0", + "version": "0.24.1", "publisher": "vscjava", "preview": false, "aiKey": "5c642b22-e845-4400-badb-3f8509a70777", @@ -46,7 +46,7 @@ "main": "./main.js", "contributes": { "javaExtensions": [ - "./server/com.microsoft.jdtls.ext.core-0.24.0.jar" + "./server/com.microsoft.jdtls.ext.core-0.24.1.jar" ], "commands": [ { From 62713c888440347980efe1b5590e6bc749d14487 Mon Sep 17 00:00:00 2001 From: Sheng Chen Date: Wed, 4 Dec 2024 08:56:41 +0800 Subject: [PATCH 215/352] build - Onboard MicroBuild (#867) --- .azure-pipelines/nightly.yml | 117 ++++++++++++----------------------- .azure-pipelines/rc.yml | 113 ++++++++++++--------------------- .vscodeignore | 1 + 3 files changed, 81 insertions(+), 150 deletions(-) diff --git a/.azure-pipelines/nightly.yml b/.azure-pipelines/nightly.yml index 34b58b53..6078c137 100644 --- a/.azure-pipelines/nightly.yml +++ b/.azure-pipelines/nightly.yml @@ -12,31 +12,27 @@ resources: - repository: self type: git ref: refs/heads/main - - repository: 1esPipelines + - repository: MicroBuildTemplate type: git - name: 1ESPipelineTemplates/1ESPipelineTemplates - ref: refs/tags/release + name: 1ESPipelineTemplates/MicroBuildTemplate trigger: none extends: - template: v1/1ES.Official.PipelineTemplate.yml@1esPipelines + template: azure-pipelines/MicroBuild.1ES.Official.yml@MicroBuildTemplate parameters: pool: - name: 1ES_JavaTooling_Pool - image: 1ES_JavaTooling_Windows_2022 - os: windows - sdl: - sourceAnalysisPool: - name: 1ES_JavaTooling_Pool - image: 1ES_JavaTooling_Windows_2022 - os: windows - customBuildTags: - - MigrationTooling-mseng-VSJava-13463-Tool + name: MSEngSS-MicroBuild2022-1ES stages: - stage: Build jobs: - job: Job_1 displayName: Agent job 1 templateContext: + mb: + signing: + enabled: true + signType: real + zipSources: false + feedSource: 'https://mseng.pkgs.visualstudio.com/DefaultCollection/_packaging/MicroBuildToolset/nuget/v3/index.json' outputs: - output: pipelineArtifact artifactName: extension @@ -50,66 +46,57 @@ extends: displayName: Use Node 20.x inputs: versionSpec: 20.x + # The image does not have jdk preinstalled, we need to download it first. + - task: PowerShell@2 + displayName: Download JDK 17 + inputs: + targetType: 'inline' + script: |- + New-Item -ItemType Directory -Path "$env:AGENT_TEMPDIRECTORY\downloadjdk" + Invoke-WebRequest -Uri "https://aka.ms/download-jdk/microsoft-jdk-17-windows-x64.zip" -OutFile "$env:AGENT_TEMPDIRECTORY\downloadjdk\microsoft-jdk-17-windows-x64.zip" - task: JavaToolInstaller@0 displayName: Use Java 17 inputs: versionSpec: "17" jdkArchitectureOption: x64 - jdkSourceOption: PreInstalled + jdkSourceOption: LocalDirectory + jdkFile: $(Agent.TempDirectory)/downloadjdk/microsoft-jdk-17-windows-x64.zip + jdkDestinationDirectory: $(Agent.ToolsDirectory)/ms-jdk17 + - script: java --version + displayName: 'Check Java installation' - task: Npm@1 displayName: npm install inputs: verbose: false - - task: Bash@3 + - task: CmdLine@2 displayName: npx gulp build_server inputs: targetType: inline script: |- # Build the jars to the server folder. npm run build-server - - task: SFP.build-tasks.custom-build-task-1.EsrpCodeSigning@5 - displayName: ESRP CodeSigning + - task: PowerShell@2 + displayName: Sign Jars inputs: - ConnectedServiceName: 'ESRP-Release-Test' - AppRegistrationClientId: '1992ee18-e9d2-42d6-ab20-94dd947a44b6' - AppRegistrationTenantId: '72f988bf-86f1-41af-91ab-2d7cd011db47' - AuthAKVName: 'vscjavaci' - AuthCertName: 'vscjava-esrprelease-auth' - AuthSignCertName: 'VSCJava-CodeSign' - FolderPath: server - Pattern: com.microsoft.jdtls.ext.*.jar - signConfigType: inlineSignParams - inlineOperation: |- - [ - { - "KeyCode" : "CP-447347-Java", - "OperationCode" : "JavaSign", - "Parameters" : { - "SigAlg" : "SHA256withRSA", - "Timestamp" : "-tsa http://sha256timestamp.ws.digicert.com/sha256/timestamp" - }, - "ToolName" : "sign", - "ToolVersion" : "1.0" - }, - { - "KeyCode" : "CP-447347-Java", - "OperationCode" : "JavaVerify", - "Parameters" : {}, - "ToolName" : "sign", - "ToolVersion" : "1.0" - } - ] + targetType: 'inline' + script: |- + $files = Get-ChildItem -Path . -Recurse -Filter "com.microsoft.jdtls.ext.*.jar" + foreach ($file in $files) { + $fileName = $file.Name + & dotnet "$env:MBSIGN_APPFOLDER\DDSignFiles.dll" /file:"$fileName" /certs:100010171 + } + workingDirectory: 'server' - task: CmdLine@2 displayName: Replace AI Key inputs: script: npx json@9.0.6 -I -f package.json -e "this.aiKey=\"%AI_KEY%\"" - - task: Bash@3 - displayName: Bash Script + - task: PowerShell@2 + displayName: Update package.json inputs: targetType: inline script: |- node ./scripts/prepare-nightly-build.js - mv ./package.insiders.json ./package.json + Move-Item -Path "./package.insiders.json" -Destination "./package.json" -Force - script: npx @vscode/vsce@latest package --pre-release -o extension.vsix displayName: 'vsce package --pre-release' ### Copy files for APIScan @@ -133,34 +120,12 @@ extends: AzureServicesAuthConnectionString: runAs=App;AppId=$(ApiScanClientId);TenantId=$(ApiScanTenant);AppKey=$(ApiScanSecret) - script: npx @vscode/vsce@latest generate-manifest -i extension.vsix -o extension.manifest displayName: 'Generate extension manifest' - - script: cp extension.manifest extension.signature.p7s + - script: copy extension.manifest extension.signature.p7s displayName: 'Prepare manifest for signing' - - task: SFP.build-tasks.custom-build-task-1.EsrpCodeSigning@5 + - task: CmdLine@2 + displayName: Sign extension inputs: - ConnectedServiceName: 'ESRP-Release-Test' - AppRegistrationClientId: '1992ee18-e9d2-42d6-ab20-94dd947a44b6' - AppRegistrationTenantId: '72f988bf-86f1-41af-91ab-2d7cd011db47' - AuthAKVName: 'vscjavaci' - AuthCertName: 'vscjava-esrprelease-auth' - AuthSignCertName: 'VSCJava-CodeSign' - FolderPath: '.' - Pattern: 'extension.signature.p7s' - signConfigType: inlineSignParams - inlineOperation: | - [ - { - "keyCode": "CP-401405", - "operationSetCode": "VSCodePublisherSign", - "parameters" : [], - "toolName": "sign", - "toolVersion": "1.0" - } - ] - SessionTimeout: 90 - MaxConcurrency: 25 - MaxRetryAttempts: 5 - PendingAnalysisWaitTimeoutMinutes: 5 - displayName: 'Sign extension' + script: dotnet %MBSIGN_APPFOLDER%/ddsignfiles.dll /file:extension.signature.p7s /certs:4014052 - task: CopyFiles@2 displayName: "Copy Files to: $(Build.ArtifactStagingDirectory)" inputs: diff --git a/.azure-pipelines/rc.yml b/.azure-pipelines/rc.yml index 9808dfd2..0038ff36 100644 --- a/.azure-pipelines/rc.yml +++ b/.azure-pipelines/rc.yml @@ -7,31 +7,27 @@ resources: - repository: self type: git ref: refs/heads/main - - repository: 1esPipelines + - repository: MicroBuildTemplate type: git - name: 1ESPipelineTemplates/1ESPipelineTemplates - ref: refs/tags/release + name: 1ESPipelineTemplates/MicroBuildTemplate trigger: none extends: - template: v1/1ES.Official.PipelineTemplate.yml@1esPipelines + template: azure-pipelines/MicroBuild.1ES.Official.yml@MicroBuildTemplate parameters: pool: - name: 1ES_JavaTooling_Pool - image: 1ES_JavaTooling_Windows_2022 - os: windows - sdl: - sourceAnalysisPool: - name: 1ES_JavaTooling_Pool - image: 1ES_JavaTooling_Windows_2022 - os: windows - customBuildTags: - - MigrationTooling-mseng-VSJava-9019-Tool + name: MSEngSS-MicroBuild2022-1ES stages: - stage: Build jobs: - job: Job_1 displayName: RC templateContext: + mb: + signing: + enabled: true + signType: real + zipSources: false + feedSource: 'https://mseng.pkgs.visualstudio.com/DefaultCollection/_packaging/MicroBuildToolset/nuget/v3/index.json' outputs: - output: pipelineArtifact artifactName: extension @@ -45,60 +41,51 @@ extends: displayName: Use Node 20.x inputs: versionSpec: 20.x + # The image does not have jdk preinstalled, we need to download it first. + - task: PowerShell@2 + displayName: Download JDK 17 + inputs: + targetType: 'inline' + script: |- + New-Item -ItemType Directory -Path "$env:AGENT_TEMPDIRECTORY\downloadjdk" + Invoke-WebRequest -Uri "https://aka.ms/download-jdk/microsoft-jdk-17-windows-x64.zip" -OutFile "$env:AGENT_TEMPDIRECTORY\downloadjdk\microsoft-jdk-17-windows-x64.zip" - task: JavaToolInstaller@0 displayName: Use Java 17 inputs: versionSpec: "17" jdkArchitectureOption: x64 - jdkSourceOption: PreInstalled + jdkSourceOption: LocalDirectory + jdkFile: $(Agent.TempDirectory)/downloadjdk/microsoft-jdk-17-windows-x64.zip + jdkDestinationDirectory: $(Agent.ToolsDirectory)/ms-jdk17 + - script: java --version + displayName: 'Check Java installation' - task: Npm@1 displayName: npm install inputs: verbose: false - - task: Bash@3 + - task: CmdLine@2 displayName: npx gulp build_server inputs: targetType: inline script: |- # Build the jars to the server folder. npm run build-server - - task: SFP.build-tasks.custom-build-task-1.EsrpCodeSigning@5 - displayName: ESRP CodeSigning + - task: PowerShell@2 + displayName: Sign Jars inputs: - ConnectedServiceName: 'ESRP-Release-Test' - AppRegistrationClientId: '1992ee18-e9d2-42d6-ab20-94dd947a44b6' - AppRegistrationTenantId: '72f988bf-86f1-41af-91ab-2d7cd011db47' - AuthAKVName: 'vscjavaci' - AuthCertName: 'vscjava-esrprelease-auth' - AuthSignCertName: 'VSCJava-CodeSign' - FolderPath: server - Pattern: com.microsoft.jdtls.ext.*.jar - signConfigType: inlineSignParams - inlineOperation: |- - [ - { - "KeyCode" : "CP-447347-Java", - "OperationCode" : "JavaSign", - "Parameters" : { - "SigAlg" : "SHA256withRSA", - "Timestamp" : "-tsa http://sha256timestamp.ws.digicert.com/sha256/timestamp" - }, - "ToolName" : "sign", - "ToolVersion" : "1.0" - }, - { - "KeyCode" : "CP-447347-Java", - "OperationCode" : "JavaVerify", - "Parameters" : {}, - "ToolName" : "sign", - "ToolVersion" : "1.0" - } - ] + targetType: 'inline' + script: |- + $files = Get-ChildItem -Path . -Recurse -Filter "com.microsoft.jdtls.ext.*.jar" + foreach ($file in $files) { + $fileName = $file.Name + & dotnet "$env:MBSIGN_APPFOLDER\DDSignFiles.dll" /file:"$fileName" /certs:100010171 + } + workingDirectory: 'server' - task: CmdLine@2 displayName: Replace AI Key inputs: script: npx json@9.0.6 -I -f package.json -e "this.aiKey=\"%AI_KEY%\"" - - task: Bash@3 + - task: CmdLine@2 displayName: vsce package inputs: targetType: inline @@ -124,34 +111,12 @@ extends: AzureServicesAuthConnectionString: runAs=App;AppId=$(ApiScanClientId);TenantId=$(ApiScanTenant);AppKey=$(ApiScanSecret) - script: npx @vscode/vsce@latest generate-manifest -i extension.vsix -o extension.manifest displayName: 'Generate extension manifest' - - script: cp extension.manifest extension.signature.p7s + - script: copy extension.manifest extension.signature.p7s displayName: 'Prepare manifest for signing' - - task: SFP.build-tasks.custom-build-task-1.EsrpCodeSigning@5 + - task: CmdLine@2 + displayName: Sign extension inputs: - ConnectedServiceName: 'ESRP-Release-Test' - AppRegistrationClientId: '1992ee18-e9d2-42d6-ab20-94dd947a44b6' - AppRegistrationTenantId: '72f988bf-86f1-41af-91ab-2d7cd011db47' - AuthAKVName: 'vscjavaci' - AuthCertName: 'vscjava-esrprelease-auth' - AuthSignCertName: 'VSCJava-CodeSign' - FolderPath: '.' - Pattern: 'extension.signature.p7s' - signConfigType: inlineSignParams - inlineOperation: | - [ - { - "keyCode": "CP-401405", - "operationSetCode": "VSCodePublisherSign", - "parameters" : [], - "toolName": "sign", - "toolVersion": "1.0" - } - ] - SessionTimeout: 90 - MaxConcurrency: 25 - MaxRetryAttempts: 5 - PendingAnalysisWaitTimeoutMinutes: 5 - displayName: 'Sign extension' + script: dotnet %MBSIGN_APPFOLDER%/ddsignfiles.dll /file:extension.signature.p7s /certs:4014052 - task: CopyFiles@2 displayName: "Copy Files to: $(Build.ArtifactStagingDirectory)" inputs: diff --git a/.vscodeignore b/.vscodeignore index 8a6df51d..f496bbbe 100644 --- a/.vscodeignore +++ b/.vscodeignore @@ -23,3 +23,4 @@ test-resources # Ignore output of code sign server/*.md +**/*.log From 6951192fefd0d50667e9e92bccb6ac39e532a0ba Mon Sep 17 00:00:00 2001 From: Sheng Chen Date: Tue, 18 Mar 2025 10:30:16 +0800 Subject: [PATCH 216/352] Create dependabot.yml (#873) --- .github/dependabot.yml | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 .github/dependabot.yml diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 00000000..f55afd44 --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,11 @@ +# To get started with Dependabot version updates, you'll need to specify which +# package ecosystems to update and where the package manifests are located. +# Please see the documentation for all configuration options: +# https://docs.github.com/code-security/dependabot/dependabot-version-updates/configuration-options-for-the-dependabot.yml-file + +version: 2 +updates: + - package-ecosystem: "" # See documentation for possible values + directory: "/" # Location of package manifests + schedule: + interval: "daily" From 405a172e8f854c4ea7fd4da2a18c6c82a171328c Mon Sep 17 00:00:00 2001 From: Sheng Chen Date: Tue, 18 Mar 2025 12:46:49 +0800 Subject: [PATCH 217/352] Bump jdk to 21 in ci (#874) --- .github/workflows/linux.yml | 4 +-- .github/workflows/linuxUI.yml | 4 +-- .github/workflows/macOS.yml | 4 +-- .github/workflows/windows.yml | 4 +-- .github/workflows/windowsUI.yml | 4 +-- .../com.microsoft.jdtls.ext.tp.target | 8 ++---- package-lock.json | 26 ++++++++++--------- 7 files changed, 26 insertions(+), 28 deletions(-) diff --git a/.github/workflows/linux.yml b/.github/workflows/linux.yml index ff8e399c..7f07ce1d 100644 --- a/.github/workflows/linux.yml +++ b/.github/workflows/linux.yml @@ -21,10 +21,10 @@ jobs: sudo /usr/bin/Xvfb :99 -screen 0 1024x768x24 > /dev/null 2>&1 & sleep 3 - - name: Set up JDK 17 + - name: Set up JDK 21 uses: actions/setup-java@v1 with: - java-version: '17' + java-version: '21' - name: Setup Node.js environment uses: actions/setup-node@v2 diff --git a/.github/workflows/linuxUI.yml b/.github/workflows/linuxUI.yml index 8cfc462c..89deaf32 100644 --- a/.github/workflows/linuxUI.yml +++ b/.github/workflows/linuxUI.yml @@ -21,10 +21,10 @@ jobs: sudo /usr/bin/Xvfb :99 -screen 0 1024x768x24 > /dev/null 2>&1 & sleep 3 - - name: Set up JDK 17 + - name: Set up JDK 21 uses: actions/setup-java@v1 with: - java-version: '17' + java-version: '21' - name: Setup Node.js environment uses: actions/setup-node@v2 diff --git a/.github/workflows/macOS.yml b/.github/workflows/macOS.yml index 5da0d24a..80250d13 100644 --- a/.github/workflows/macOS.yml +++ b/.github/workflows/macOS.yml @@ -14,10 +14,10 @@ jobs: steps: - uses: actions/checkout@v2 - - name: Set up JDK 17 + - name: Set up JDK 21 uses: actions/setup-java@v1 with: - java-version: '17' + java-version: '21' - name: Setup Node.js environment uses: actions/setup-node@v2 diff --git a/.github/workflows/windows.yml b/.github/workflows/windows.yml index 48e980ca..a55b6a5c 100644 --- a/.github/workflows/windows.yml +++ b/.github/workflows/windows.yml @@ -14,10 +14,10 @@ jobs: steps: - uses: actions/checkout@v2 - - name: Set up JDK 17 + - name: Set up JDK 21 uses: actions/setup-java@v1 with: - java-version: '17' + java-version: '21' - name: Setup Node.js environment uses: actions/setup-node@v2 diff --git a/.github/workflows/windowsUI.yml b/.github/workflows/windowsUI.yml index 24aeadde..90a7f322 100644 --- a/.github/workflows/windowsUI.yml +++ b/.github/workflows/windowsUI.yml @@ -14,10 +14,10 @@ jobs: steps: - uses: actions/checkout@v2 - - name: Set up JDK 17 + - name: Set up JDK 21 uses: actions/setup-java@v1 with: - java-version: '17' + java-version: '21' - name: Setup Node.js environment uses: actions/setup-node@v2 diff --git a/jdtls.ext/com.microsoft.jdtls.ext.target/com.microsoft.jdtls.ext.tp.target b/jdtls.ext/com.microsoft.jdtls.ext.target/com.microsoft.jdtls.ext.tp.target index 6a4e67b7..9a0e618b 100644 --- a/jdtls.ext/com.microsoft.jdtls.ext.target/com.microsoft.jdtls.ext.tp.target +++ b/jdtls.ext/com.microsoft.jdtls.ext.target/com.microsoft.jdtls.ext.tp.target @@ -10,20 +10,16 @@ - + - + - - - - diff --git a/package-lock.json b/package-lock.json index 65c3926b..9cce1096 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1095,9 +1095,10 @@ "integrity": "sha512-aDczADvlvTGajTDjcjpJMqRkOF6Qdz3YbPZm/PyW6tKPkx2hlYBzxMhEywM/tU72HrVZjgl5VCdRuMlA7pZ8Gw==" }, "node_modules/axios": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.4.tgz", - "integrity": "sha512-DukmaFRnY6AzAALSH4J2M3k6PkaC+MfaAGdEERRWcC9q3/TWQwLpHR8ZRLKTdQ3aBDL64EdluRDjJqKw+BPZEw==", + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.8.3.tgz", + "integrity": "sha512-iP4DebzoNlP/YN2dpwCgb8zoCmhtkajzS48JvwmkSkXvPI3DHc7m+XYL5tGnSlJtR6nImXZmdCuN5aP8dh1d8A==", + "license": "MIT", "dependencies": { "follow-redirects": "^1.15.6", "form-data": "^4.0.0", @@ -1713,10 +1714,11 @@ "dev": true }, "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", "dev": true, + "license": "MIT", "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", @@ -6907,9 +6909,9 @@ "integrity": "sha512-aDczADvlvTGajTDjcjpJMqRkOF6Qdz3YbPZm/PyW6tKPkx2hlYBzxMhEywM/tU72HrVZjgl5VCdRuMlA7pZ8Gw==" }, "axios": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.4.tgz", - "integrity": "sha512-DukmaFRnY6AzAALSH4J2M3k6PkaC+MfaAGdEERRWcC9q3/TWQwLpHR8ZRLKTdQ3aBDL64EdluRDjJqKw+BPZEw==", + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.8.3.tgz", + "integrity": "sha512-iP4DebzoNlP/YN2dpwCgb8zoCmhtkajzS48JvwmkSkXvPI3DHc7m+XYL5tGnSlJtR6nImXZmdCuN5aP8dh1d8A==", "requires": { "follow-redirects": "^1.15.6", "form-data": "^4.0.0", @@ -7352,9 +7354,9 @@ "dev": true }, "cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", "dev": true, "requires": { "path-key": "^3.1.0", From 84af4b35654fe0167b0bff1d39cd0ccc3d4b07c6 Mon Sep 17 00:00:00 2001 From: Sheng Chen Date: Tue, 18 Mar 2025 13:14:24 +0800 Subject: [PATCH 218/352] Use jdk 21 in ado pipelines (#875) --- .azure-pipelines/ci.yml | 4 ++-- .azure-pipelines/nightly.yml | 12 ++++++------ .azure-pipelines/rc.yml | 12 ++++++------ 3 files changed, 14 insertions(+), 14 deletions(-) diff --git a/.azure-pipelines/ci.yml b/.azure-pipelines/ci.yml index 61020f86..6442cafb 100644 --- a/.azure-pipelines/ci.yml +++ b/.azure-pipelines/ci.yml @@ -44,9 +44,9 @@ extends: - checkout: self fetchTags: false - task: JavaToolInstaller@0 - displayName: Use Java 17 + displayName: Use Java 21 inputs: - versionSpec: "17" + versionSpec: "21" jdkArchitectureOption: x64 jdkSourceOption: PreInstalled - task: NodeTool@0 diff --git a/.azure-pipelines/nightly.yml b/.azure-pipelines/nightly.yml index 6078c137..9e77b80a 100644 --- a/.azure-pipelines/nightly.yml +++ b/.azure-pipelines/nightly.yml @@ -48,20 +48,20 @@ extends: versionSpec: 20.x # The image does not have jdk preinstalled, we need to download it first. - task: PowerShell@2 - displayName: Download JDK 17 + displayName: Download JDK 21 inputs: targetType: 'inline' script: |- New-Item -ItemType Directory -Path "$env:AGENT_TEMPDIRECTORY\downloadjdk" - Invoke-WebRequest -Uri "https://aka.ms/download-jdk/microsoft-jdk-17-windows-x64.zip" -OutFile "$env:AGENT_TEMPDIRECTORY\downloadjdk\microsoft-jdk-17-windows-x64.zip" + Invoke-WebRequest -Uri "https://aka.ms/download-jdk/microsoft-jdk-21-windows-x64.zip" -OutFile "$env:AGENT_TEMPDIRECTORY\downloadjdk\microsoft-jdk-21-windows-x64.zip" - task: JavaToolInstaller@0 - displayName: Use Java 17 + displayName: Use Java 21 inputs: - versionSpec: "17" + versionSpec: "21" jdkArchitectureOption: x64 jdkSourceOption: LocalDirectory - jdkFile: $(Agent.TempDirectory)/downloadjdk/microsoft-jdk-17-windows-x64.zip - jdkDestinationDirectory: $(Agent.ToolsDirectory)/ms-jdk17 + jdkFile: $(Agent.TempDirectory)/downloadjdk/microsoft-jdk-21-windows-x64.zip + jdkDestinationDirectory: $(Agent.ToolsDirectory)/ms-jdk21 - script: java --version displayName: 'Check Java installation' - task: Npm@1 diff --git a/.azure-pipelines/rc.yml b/.azure-pipelines/rc.yml index 0038ff36..fac4cdbc 100644 --- a/.azure-pipelines/rc.yml +++ b/.azure-pipelines/rc.yml @@ -43,20 +43,20 @@ extends: versionSpec: 20.x # The image does not have jdk preinstalled, we need to download it first. - task: PowerShell@2 - displayName: Download JDK 17 + displayName: Download JDK 21 inputs: targetType: 'inline' script: |- New-Item -ItemType Directory -Path "$env:AGENT_TEMPDIRECTORY\downloadjdk" - Invoke-WebRequest -Uri "https://aka.ms/download-jdk/microsoft-jdk-17-windows-x64.zip" -OutFile "$env:AGENT_TEMPDIRECTORY\downloadjdk\microsoft-jdk-17-windows-x64.zip" + Invoke-WebRequest -Uri "https://aka.ms/download-jdk/microsoft-jdk-21-windows-x64.zip" -OutFile "$env:AGENT_TEMPDIRECTORY\downloadjdk\microsoft-jdk-21-windows-x64.zip" - task: JavaToolInstaller@0 - displayName: Use Java 17 + displayName: Use Java 21 inputs: - versionSpec: "17" + versionSpec: "21" jdkArchitectureOption: x64 jdkSourceOption: LocalDirectory - jdkFile: $(Agent.TempDirectory)/downloadjdk/microsoft-jdk-17-windows-x64.zip - jdkDestinationDirectory: $(Agent.ToolsDirectory)/ms-jdk17 + jdkFile: $(Agent.TempDirectory)/downloadjdk/microsoft-jdk-21-windows-x64.zip + jdkDestinationDirectory: $(Agent.ToolsDirectory)/ms-jdk21 - script: java --version displayName: 'Check Java installation' - task: Npm@1 From 7b3990cf7d388b0e3fc801734cbff654a5313d17 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 3 Jun 2025 16:22:37 +0800 Subject: [PATCH 219/352] chore(deps): Bump tar-fs (#879) Bumps and [tar-fs](https://github.com/mafintosh/tar-fs). These dependencies needed to be updated together. Updates `tar-fs` from 2.1.1 to 2.1.3 - [Commits](https://github.com/mafintosh/tar-fs/commits) Updates `tar-fs` from 1.16.3 to 2.1.3 - [Commits](https://github.com/mafintosh/tar-fs/commits) --- updated-dependencies: - dependency-name: tar-fs dependency-version: 2.1.3 dependency-type: indirect - dependency-name: tar-fs dependency-version: 2.1.3 dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 26 ++++++++++++++------------ 1 file changed, 14 insertions(+), 12 deletions(-) diff --git a/package-lock.json b/package-lock.json index 9cce1096..bae24778 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4888,10 +4888,11 @@ } }, "node_modules/tar-fs": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", - "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.3.tgz", + "integrity": "sha512-090nwYJDmlhwFwEW3QQl+vaNnxsO2yVsd45eTKRBzSzu+hlb1w2K9inVq5b0ngXuLVqQ4ApvsUHHnu/zQNkWAg==", "dev": true, + "license": "MIT", "optional": true, "dependencies": { "chownr": "^1.1.1", @@ -4962,10 +4963,11 @@ } }, "node_modules/targz/node_modules/tar-fs": { - "version": "1.16.3", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-1.16.3.tgz", - "integrity": "sha512-NvCeXpYx7OsmOh8zIOP/ebG55zZmxLE0etfWRbWok+q2Qo8x/vOR/IJT1taADXPe+jsiu9axDb3X4B+iIgNlKw==", + "version": "1.16.5", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-1.16.5.tgz", + "integrity": "sha512-1ergVCCysmwHQNrOS+Pjm4DQ4nrGp43+Xnu4MRGjCnQu/m3hEgLNS78d5z+B8OJ1hN5EejJdCSFZE1oM6AQXAQ==", "dev": true, + "license": "MIT", "dependencies": { "chownr": "^1.0.1", "mkdirp": "^0.5.1", @@ -9617,9 +9619,9 @@ "dev": true }, "tar-fs": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", - "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.3.tgz", + "integrity": "sha512-090nwYJDmlhwFwEW3QQl+vaNnxsO2yVsd45eTKRBzSzu+hlb1w2K9inVq5b0ngXuLVqQ4ApvsUHHnu/zQNkWAg==", "dev": true, "optional": true, "requires": { @@ -9687,9 +9689,9 @@ } }, "tar-fs": { - "version": "1.16.3", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-1.16.3.tgz", - "integrity": "sha512-NvCeXpYx7OsmOh8zIOP/ebG55zZmxLE0etfWRbWok+q2Qo8x/vOR/IJT1taADXPe+jsiu9axDb3X4B+iIgNlKw==", + "version": "1.16.5", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-1.16.5.tgz", + "integrity": "sha512-1ergVCCysmwHQNrOS+Pjm4DQ4nrGp43+Xnu4MRGjCnQu/m3hEgLNS78d5z+B8OJ1hN5EejJdCSFZE1oM6AQXAQ==", "dev": true, "requires": { "chownr": "^1.0.1", From ee5172f881b9e913085763f8606f652d1007ef1f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 12 Jun 2025 09:44:09 +0800 Subject: [PATCH 220/352] chore(deps): Bump brace-expansion (#880) Bumps and [brace-expansion](https://github.com/juliangruber/brace-expansion). These dependencies needed to be updated together. Updates `brace-expansion` from 2.0.1 to 2.0.2 - [Release notes](https://github.com/juliangruber/brace-expansion/releases) - [Commits](https://github.com/juliangruber/brace-expansion/compare/v2.0.1...v2.0.2) Updates `brace-expansion` from 1.1.11 to 2.0.2 - [Release notes](https://github.com/juliangruber/brace-expansion/releases) - [Commits](https://github.com/juliangruber/brace-expansion/compare/v2.0.1...v2.0.2) --- updated-dependencies: - dependency-name: brace-expansion dependency-version: 2.0.2 dependency-type: indirect - dependency-name: brace-expansion dependency-version: 2.0.2 dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 65 +++++++++++++++++++++++++---------------------- 1 file changed, 35 insertions(+), 30 deletions(-) diff --git a/package-lock.json b/package-lock.json index bae24778..efb5876b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -671,10 +671,11 @@ } }, "node_modules/@vscode/vsce/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==", + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "dev": true, + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -1211,9 +1212,10 @@ "dev": true }, "node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0" } @@ -2470,10 +2472,11 @@ "dev": true }, "node_modules/glob/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==", + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "dev": true, + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -3451,10 +3454,11 @@ } }, "node_modules/mocha/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==", + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "dev": true, + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -5250,10 +5254,11 @@ } }, "node_modules/tslint/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==", + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "dev": true, + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -6557,9 +6562,9 @@ } }, "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "dev": true, "requires": { "balanced-match": "^1.0.0", @@ -7002,9 +7007,9 @@ "dev": true }, "brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", "requires": { "balanced-match": "^1.0.0" } @@ -7881,9 +7886,9 @@ }, "dependencies": { "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "dev": true, "requires": { "balanced-match": "^1.0.0", @@ -8598,9 +8603,9 @@ }, "dependencies": { "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "dev": true, "requires": { "balanced-match": "^1.0.0", @@ -9899,9 +9904,9 @@ } }, "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "dev": true, "requires": { "balanced-match": "^1.0.0", From 1c9e83bdf6c549eca3a5afe5bfd5e8c2accad06d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 22 Jul 2025 11:27:03 +0800 Subject: [PATCH 221/352] chore(deps): Bump form-data from 4.0.0 to 4.0.4 (#884) --- updated-dependencies: - dependency-name: form-data dependency-version: 4.0.4 dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 286 +++++++++++++++++++++++++++++++++++----------- 1 file changed, 222 insertions(+), 64 deletions(-) diff --git a/package-lock.json b/package-lock.json index efb5876b..5b6b821b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1399,6 +1399,18 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/camelcase": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", @@ -1940,6 +1952,19 @@ "url": "https://github.com/fb55/domutils?sponsor=1" } }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/duplexer2": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", @@ -2013,12 +2038,53 @@ "node": ">=4" } }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "engines": { + "node": ">= 0.4" + } + }, "node_modules/es-module-lexer": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.3.0.tgz", "integrity": "sha512-vZK7T0N2CBmBOixhmjdqx2gWVbFZ4DXZ/NyRMZVlJXPa7CyFS+/a4QQsDGDQy9ZfEzxFuNEsMLeQJnKP2p5/JA==", "dev": true }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/escalade": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", @@ -2294,12 +2360,14 @@ } }, "node_modules/form-data": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", - "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.4.tgz", + "integrity": "sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==", "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.2", "mime-types": "^2.1.12" }, "engines": { @@ -2385,7 +2453,6 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "dev": true, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -2400,20 +2467,40 @@ } }, "node_modules/get-intrinsic": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.2.tgz", - "integrity": "sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==", - "dev": true, + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", "function-bind": "^1.1.2", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "hasown": "^2.0.0" + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/get-stream": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", @@ -2513,12 +2600,11 @@ } }, "node_modules/gopd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", - "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", - "dev": true, - "dependencies": { - "get-intrinsic": "^1.1.3" + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -2596,11 +2682,10 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/has-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", - "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", - "dev": true, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", "engines": { "node": ">= 0.4" }, @@ -2608,11 +2693,13 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "dev": true, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "dependencies": { + "has-symbols": "^1.0.3" + }, "engines": { "node": ">= 0.4" }, @@ -2621,10 +2708,9 @@ } }, "node_modules/hasown": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", - "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", - "dev": true, + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", "dependencies": { "function-bind": "^1.1.2" }, @@ -3275,6 +3361,14 @@ "url": "https://github.com/fb55/entities?sponsor=1" } }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "engines": { + "node": ">= 0.4" + } + }, "node_modules/mdurl": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", @@ -7135,6 +7229,15 @@ "set-function-length": "^1.1.1" } }, + "call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "requires": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + } + }, "camelcase": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", @@ -7509,6 +7612,16 @@ "domhandler": "^5.0.3" } }, + "dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "requires": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + } + }, "duplexer2": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", @@ -7567,12 +7680,41 @@ "integrity": "sha512-ZtUjZO6l5mwTHvc1L9+1q5p/R3wTopcfqMW8r5t8SJSKqeVI/LtajORwRFEKpEFuekjD0VBjwu1HMxL4UalIRw==", "dev": true }, + "es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==" + }, + "es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==" + }, "es-module-lexer": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.3.0.tgz", "integrity": "sha512-vZK7T0N2CBmBOixhmjdqx2gWVbFZ4DXZ/NyRMZVlJXPa7CyFS+/a4QQsDGDQy9ZfEzxFuNEsMLeQJnKP2p5/JA==", "dev": true }, + "es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "requires": { + "es-errors": "^1.3.0" + } + }, + "es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "requires": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + } + }, "escalade": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", @@ -7767,12 +7909,14 @@ } }, "form-data": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", - "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.4.tgz", + "integrity": "sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==", "requires": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.2", "mime-types": "^2.1.12" } }, @@ -7837,8 +7981,7 @@ "function-bind": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "dev": true + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==" }, "get-caller-file": { "version": "2.0.5", @@ -7847,15 +7990,29 @@ "dev": true }, "get-intrinsic": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.2.tgz", - "integrity": "sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==", - "dev": true, + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", "requires": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", "function-bind": "^1.1.2", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "hasown": "^2.0.0" + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + } + }, + "get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "requires": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" } }, "get-stream": { @@ -7934,13 +8091,9 @@ } }, "gopd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", - "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", - "dev": true, - "requires": { - "get-intrinsic": "^1.1.3" - } + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==" }, "got": { "version": "13.0.0", @@ -7996,23 +8149,23 @@ "get-intrinsic": "^1.2.2" } }, - "has-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", - "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", - "dev": true - }, "has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "dev": true + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==" + }, + "has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "requires": { + "has-symbols": "^1.0.3" + } }, "hasown": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", - "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", - "dev": true, + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", "requires": { "function-bind": "^1.1.2" } @@ -8477,6 +8630,11 @@ } } }, + "math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==" + }, "mdurl": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", From 05652400fdc10a331cbe7b50fd5f0390666b7ed1 Mon Sep 17 00:00:00 2001 From: wenyt <75360946+wenytang-ms@users.noreply.github.com> Date: Thu, 7 Aug 2025 13:11:44 +0800 Subject: [PATCH 222/352] ci: jdk compile support jdk 24 (#886) * ci: jdk compile support jdk 24 * Update scripts/buildJdtlsExt.js Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * ci: update --------- Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- scripts/buildJdtlsExt.js | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/scripts/buildJdtlsExt.js b/scripts/buildJdtlsExt.js index c6623dbf..0785d8c4 100644 --- a/scripts/buildJdtlsExt.js +++ b/scripts/buildJdtlsExt.js @@ -7,7 +7,19 @@ const path = require('path'); const server_dir = path.resolve('jdtls.ext'); -cp.execSync(mvnw()+ ' clean package', {cwd:server_dir, stdio:[0,1,2]} ); +// Set JVM options to increase XML entity size limits +// JDK 24 contains changes to JAXP limits, see: https://bugs.openjdk.org/browse/JDK-8343022 +const jvmOptions = [ + '-Djdk.xml.maxGeneralEntitySizeLimit=0', + '-Djdk.xml.totalEntitySizeLimit=0' +].join(' '); + +// Set MAVEN_OPTS environment variable with JVM options +const env = { ...process.env }; +env.MAVEN_OPTS = env.MAVEN_OPTS ? env.MAVEN_OPTS + ' ' + jvmOptions : jvmOptions; + +const mvnCommand = `${mvnw()} clean package`; +cp.execSync(mvnCommand, {cwd:server_dir, stdio:[0,1,2], env: env} ); copy(path.join(server_dir, 'com.microsoft.jdtls.ext.core/target'), path.resolve('server'), (file) => { return /^com.microsoft.jdtls.ext.core.*.jar$/.test(file); }); From afdf59ddd2bebdfefc20ce3fcc614ea7c2bbf6ff Mon Sep 17 00:00:00 2001 From: Snjeza Date: Mon, 11 Aug 2025 07:26:59 +0200 Subject: [PATCH 223/352] Improve ProjectCommand.getMainClasses (#883) Co-authored-by: wenyt <75360946+wenytang-ms@users.noreply.github.com> --- .../jdtls/ext/core/ProjectCommand.java | 37 ++++++++++++------- 1 file changed, 24 insertions(+), 13 deletions(-) diff --git a/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/ProjectCommand.java b/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/ProjectCommand.java index 1c89a202..3f10d3e6 100644 --- a/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/ProjectCommand.java +++ b/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/ProjectCommand.java @@ -19,6 +19,7 @@ import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; +import java.util.Collections; import java.util.HashSet; import java.util.List; import java.util.Objects; @@ -65,6 +66,7 @@ import org.eclipse.jdt.ls.core.internal.managers.ProjectsManager; import org.eclipse.jdt.ls.core.internal.managers.UpdateClasspathJob; import org.eclipse.jdt.ls.core.internal.preferences.Preferences.ReferencedLibraries; +import org.eclipse.jdt.ls.core.internal.preferences.Preferences.SearchScope; import org.eclipse.lsp4j.jsonrpc.json.adapters.CollectionTypeAdapter; import org.eclipse.lsp4j.jsonrpc.json.adapters.EnumTypeAdapter; @@ -232,23 +234,32 @@ private static boolean exportJarExecution(String mainClass, Classpath[] classpat } public static List getMainClasses(List arguments, IProgressMonitor monitor) throws Exception { - List projectList = listProjects(arguments, monitor); - final List res = new ArrayList<>(); - List searchRoots = new ArrayList<>(); + List args = new ArrayList<>(arguments); + if (args.size() <= 1) { + args.add(Boolean.TRUE); + } else { + args.set(1, Boolean.TRUE); + } + List projectList = listProjects(args, monitor); if (projectList.size() == 0) { - return res; + return Collections.emptyList(); } - for (PackageNode project : projectList) { + final List res = new ArrayList<>(); + List javaProjects = new ArrayList<>(); + for (PackageNode project: projectList) { IJavaProject javaProject = PackageCommand.getJavaProject(project.getUri()); - for (IPackageFragmentRoot packageFragmentRoot : javaProject.getAllPackageFragmentRoots()) { - if (!packageFragmentRoot.isArchive()) { - searchRoots.add(packageFragmentRoot); - } + if (javaProject != null && javaProject.exists()) { + javaProjects.add(javaProject); } } - IJavaSearchScope scope = SearchEngine.createJavaSearchScope(searchRoots.toArray(new IJavaElement[0])); - SearchPattern pattern = SearchPattern.createPattern("main(String[]) void", IJavaSearchConstants.METHOD, - IJavaSearchConstants.DECLARATIONS, SearchPattern.R_EXACT_MATCH | SearchPattern.R_CASE_SENSITIVE); + int includeMask = IJavaSearchScope.SOURCES; + IJavaSearchScope scope = SearchEngine.createJavaSearchScope(javaProjects.toArray(new IJavaProject[0]), + includeMask); + SearchPattern pattern1 = SearchPattern.createPattern("main(String[]) void", IJavaSearchConstants.METHOD, + IJavaSearchConstants.DECLARATIONS, SearchPattern.R_CASE_SENSITIVE | SearchPattern.R_EXACT_MATCH); + SearchPattern pattern2 = SearchPattern.createPattern("main() void", IJavaSearchConstants.METHOD, + IJavaSearchConstants.DECLARATIONS, SearchPattern.R_CASE_SENSITIVE | SearchPattern.R_EXACT_MATCH); + SearchPattern pattern = SearchPattern.createOrPattern(pattern1, pattern2); SearchRequestor requestor = new SearchRequestor() { @Override public void acceptSearchMatch(SearchMatch match) { @@ -275,7 +286,7 @@ public void acceptSearchMatch(SearchMatch match) { SearchEngine searchEngine = new SearchEngine(); try { searchEngine.search(pattern, new SearchParticipant[] {SearchEngine.getDefaultSearchParticipant()}, scope, - requestor, new NullProgressMonitor()); + requestor, monitor); } catch (CoreException e) { // ignore } From 6a485903f63c7b28ab5c6fa78c461b5736b70055 Mon Sep 17 00:00:00 2001 From: wenyt <75360946+wenytang-ms@users.noreply.github.com> Date: Fri, 15 Aug 2025 09:30:20 +0800 Subject: [PATCH 224/352] ci: update azdo pipeline settings (#891) --- .azure-pipelines/nightly.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.azure-pipelines/nightly.yml b/.azure-pipelines/nightly.yml index 9e77b80a..d4e5fa6f 100644 --- a/.azure-pipelines/nightly.yml +++ b/.azure-pipelines/nightly.yml @@ -21,6 +21,8 @@ extends: parameters: pool: name: MSEngSS-MicroBuild2022-1ES + settings: + networkIsolationPolicy: Permissive stages: - stage: Build jobs: From 88c1f7db15ab9fe2e8bc83b09dfa5ed920d7f379 Mon Sep 17 00:00:00 2001 From: wenyt <75360946+wenytang-ms@users.noreply.github.com> Date: Fri, 15 Aug 2025 13:26:11 +0800 Subject: [PATCH 225/352] ci: add publish pipeline (#892) * ci: update ci pool * ci: add publish pipeline --- .azure-pipelines/nightly.yml | 2 +- .azure-pipelines/rc.yml | 4 ++- .azure-pipelines/release-nightly.yml | 51 ++++++++++++++++++++++++++++ .azure-pipelines/release.yml | 51 ++++++++++++++++++++++++++++ 4 files changed, 106 insertions(+), 2 deletions(-) create mode 100644 .azure-pipelines/release-nightly.yml create mode 100644 .azure-pipelines/release.yml diff --git a/.azure-pipelines/nightly.yml b/.azure-pipelines/nightly.yml index d4e5fa6f..2a70fed0 100644 --- a/.azure-pipelines/nightly.yml +++ b/.azure-pipelines/nightly.yml @@ -20,7 +20,7 @@ extends: template: azure-pipelines/MicroBuild.1ES.Official.yml@MicroBuildTemplate parameters: pool: - name: MSEngSS-MicroBuild2022-1ES + name: VSEngSS-MicroBuild2022-1ES settings: networkIsolationPolicy: Permissive stages: diff --git a/.azure-pipelines/rc.yml b/.azure-pipelines/rc.yml index fac4cdbc..1494ae90 100644 --- a/.azure-pipelines/rc.yml +++ b/.azure-pipelines/rc.yml @@ -15,7 +15,9 @@ extends: template: azure-pipelines/MicroBuild.1ES.Official.yml@MicroBuildTemplate parameters: pool: - name: MSEngSS-MicroBuild2022-1ES + name: VSEngSS-MicroBuild2022-1ES + settings: + networkIsolationPolicy: Permissive stages: - stage: Build jobs: diff --git a/.azure-pipelines/release-nightly.yml b/.azure-pipelines/release-nightly.yml new file mode 100644 index 00000000..ab3d9612 --- /dev/null +++ b/.azure-pipelines/release-nightly.yml @@ -0,0 +1,51 @@ +# This pipeline is used to release the Project Manager for Java VSCode extension from the nightly/stable build. +# It contains following steps: +# 1. Download the plugin artifact from the nightly/stable build pipeline. +# 2. Publish the plugin to the marketplace. + +name: $(Date:yyyyMMdd).$(Rev:r) # Use the current date and a revision number for the build name. + +variables: + - name: Codeql.Enabled + value: true +resources: + repositories: + - repository: self + type: git + ref: refs/heads/main + - repository: 1esPipelines + type: git + name: 1ESPipelineTemplates/1ESPipelineTemplates + ref: refs/tags/release +trigger: none +extends: + template: v1/1ES.Official.PipelineTemplate.yml@1esPipelines + parameters: + pool: + os: linux + name: 1ES_JavaTooling_Pool + image: 1ES_JavaTooling_Ubuntu-2004 + stages: + - stage: Release + jobs: + - job: Job + displayName: Release Project Manager for Java VSCode Extension + templateContext: + type: releaseJob + isProduction: true + inputs: + - input: pipelineArtifact + buildType: specific + project: $(AzDo.ProjectId) # Azure DevOps project ID + definition: $(AzDo.BuildPipelineId) # artifact build pipeline ID + artifactName: vsix + downloadType: specific + targetPath: '$(Build.SourcesDirectory)' + steps: + - task: AzureCLI@2 + displayName: 'Publish Extension' + inputs: + azureSubscription: 'VSCode-Ext-Publishing' + scriptType: pscore + scriptLocation: inlineScript + inlineScript: 'npx @vscode/vsce@latest publish -i ''$(Build.SourcesDirectory)/extension.vsix'' --manifestPath ''$(Build.SourcesDirectory)/extension.manifest'' --signaturePath ''$(Build.SourcesDirectory)/extension.signature.p7s'' --azure-credential' \ No newline at end of file diff --git a/.azure-pipelines/release.yml b/.azure-pipelines/release.yml new file mode 100644 index 00000000..ab3d9612 --- /dev/null +++ b/.azure-pipelines/release.yml @@ -0,0 +1,51 @@ +# This pipeline is used to release the Project Manager for Java VSCode extension from the nightly/stable build. +# It contains following steps: +# 1. Download the plugin artifact from the nightly/stable build pipeline. +# 2. Publish the plugin to the marketplace. + +name: $(Date:yyyyMMdd).$(Rev:r) # Use the current date and a revision number for the build name. + +variables: + - name: Codeql.Enabled + value: true +resources: + repositories: + - repository: self + type: git + ref: refs/heads/main + - repository: 1esPipelines + type: git + name: 1ESPipelineTemplates/1ESPipelineTemplates + ref: refs/tags/release +trigger: none +extends: + template: v1/1ES.Official.PipelineTemplate.yml@1esPipelines + parameters: + pool: + os: linux + name: 1ES_JavaTooling_Pool + image: 1ES_JavaTooling_Ubuntu-2004 + stages: + - stage: Release + jobs: + - job: Job + displayName: Release Project Manager for Java VSCode Extension + templateContext: + type: releaseJob + isProduction: true + inputs: + - input: pipelineArtifact + buildType: specific + project: $(AzDo.ProjectId) # Azure DevOps project ID + definition: $(AzDo.BuildPipelineId) # artifact build pipeline ID + artifactName: vsix + downloadType: specific + targetPath: '$(Build.SourcesDirectory)' + steps: + - task: AzureCLI@2 + displayName: 'Publish Extension' + inputs: + azureSubscription: 'VSCode-Ext-Publishing' + scriptType: pscore + scriptLocation: inlineScript + inlineScript: 'npx @vscode/vsce@latest publish -i ''$(Build.SourcesDirectory)/extension.vsix'' --manifestPath ''$(Build.SourcesDirectory)/extension.manifest'' --signaturePath ''$(Build.SourcesDirectory)/extension.signature.p7s'' --azure-credential' \ No newline at end of file From 7d07d9719535cd2ca747beaad6f155f272a977cf Mon Sep 17 00:00:00 2001 From: wenyt <75360946+wenytang-ms@users.noreply.github.com> Date: Fri, 15 Aug 2025 14:33:41 +0800 Subject: [PATCH 226/352] fix: fix path for extension when release download (#893) --- .azure-pipelines/release-nightly.yml | 2 +- .azure-pipelines/release.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.azure-pipelines/release-nightly.yml b/.azure-pipelines/release-nightly.yml index ab3d9612..f3c5f974 100644 --- a/.azure-pipelines/release-nightly.yml +++ b/.azure-pipelines/release-nightly.yml @@ -38,7 +38,7 @@ extends: buildType: specific project: $(AzDo.ProjectId) # Azure DevOps project ID definition: $(AzDo.BuildPipelineId) # artifact build pipeline ID - artifactName: vsix + artifactName: extension downloadType: specific targetPath: '$(Build.SourcesDirectory)' steps: diff --git a/.azure-pipelines/release.yml b/.azure-pipelines/release.yml index ab3d9612..f3c5f974 100644 --- a/.azure-pipelines/release.yml +++ b/.azure-pipelines/release.yml @@ -38,7 +38,7 @@ extends: buildType: specific project: $(AzDo.ProjectId) # Azure DevOps project ID definition: $(AzDo.BuildPipelineId) # artifact build pipeline ID - artifactName: vsix + artifactName: extension downloadType: specific targetPath: '$(Build.SourcesDirectory)' steps: From f566a9335c67f822610502b754fb2ea72bcfd0c9 Mon Sep 17 00:00:00 2001 From: wenyt <75360946+wenytang-ms@users.noreply.github.com> Date: Mon, 18 Aug 2025 09:48:27 +0800 Subject: [PATCH 227/352] ci: upgrade node as 20 for publish (#896) --- .azure-pipelines/release-nightly.yml | 4 ++++ .azure-pipelines/release.yml | 4 ++++ 2 files changed, 8 insertions(+) diff --git a/.azure-pipelines/release-nightly.yml b/.azure-pipelines/release-nightly.yml index f3c5f974..a47d9b2d 100644 --- a/.azure-pipelines/release-nightly.yml +++ b/.azure-pipelines/release-nightly.yml @@ -42,6 +42,10 @@ extends: downloadType: specific targetPath: '$(Build.SourcesDirectory)' steps: + - task: NodeTool@0 + displayName: Use Node 20.x + inputs: + versionSpec: 20.x - task: AzureCLI@2 displayName: 'Publish Extension' inputs: diff --git a/.azure-pipelines/release.yml b/.azure-pipelines/release.yml index f3c5f974..a47d9b2d 100644 --- a/.azure-pipelines/release.yml +++ b/.azure-pipelines/release.yml @@ -42,6 +42,10 @@ extends: downloadType: specific targetPath: '$(Build.SourcesDirectory)' steps: + - task: NodeTool@0 + displayName: Use Node 20.x + inputs: + versionSpec: 20.x - task: AzureCLI@2 displayName: 'Publish Extension' inputs: From 124b733ea67585acd129a32c52ba2aea8e780fb2 Mon Sep 17 00:00:00 2001 From: wenyt <75360946+wenytang-ms@users.noreply.github.com> Date: Mon, 25 Aug 2025 11:26:23 +0800 Subject: [PATCH 228/352] ci: support PME to code sign (#900) --- .azure-pipelines/nightly.yml | 1 + .azure-pipelines/rc.yml | 1 + 2 files changed, 2 insertions(+) diff --git a/.azure-pipelines/nightly.yml b/.azure-pipelines/nightly.yml index 2a70fed0..f7ca5cc1 100644 --- a/.azure-pipelines/nightly.yml +++ b/.azure-pipelines/nightly.yml @@ -33,6 +33,7 @@ extends: signing: enabled: true signType: real + signWithProd: true zipSources: false feedSource: 'https://mseng.pkgs.visualstudio.com/DefaultCollection/_packaging/MicroBuildToolset/nuget/v3/index.json' outputs: diff --git a/.azure-pipelines/rc.yml b/.azure-pipelines/rc.yml index 1494ae90..bb353bb6 100644 --- a/.azure-pipelines/rc.yml +++ b/.azure-pipelines/rc.yml @@ -28,6 +28,7 @@ extends: signing: enabled: true signType: real + signWithProd: true zipSources: false feedSource: 'https://mseng.pkgs.visualstudio.com/DefaultCollection/_packaging/MicroBuildToolset/nuget/v3/index.json' outputs: From 852589ac0c3a9454829c23c780e1f843aa049498 Mon Sep 17 00:00:00 2001 From: Copilot <198982749+Copilot@users.noreply.github.com> Date: Thu, 4 Sep 2025 09:36:29 +0800 Subject: [PATCH 229/352] Add AI triage agent workflow and LLM documentation from vscode-gradle (#902) * Initial plan * Add AI triage agent workflow and LLM documentation from vscode-gradle Co-authored-by: chagong <831821+chagong@users.noreply.github.com> --------- Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: chagong <831821+chagong@users.noreply.github.com> --- .github/llms.md | 38 +++++++++ .github/workflows/triage-agent.yml | 122 +++++++++++++++++++++++++++++ 2 files changed, 160 insertions(+) create mode 100644 .github/llms.md create mode 100644 .github/workflows/triage-agent.yml diff --git a/.github/llms.md b/.github/llms.md new file mode 100644 index 00000000..55d69b23 --- /dev/null +++ b/.github/llms.md @@ -0,0 +1,38 @@ +# Extension Pack for Java +Extension Pack for Java is a collection of popular extensions that can help write, test and debug Java applications in Visual Studio Code. By installing Extension Pack for Java, the following extensions are installed: + +- [📦 Language Support for Java™ by Red Hat ](https://marketplace.visualstudio.com/items?itemName=redhat.java) + - Code Navigation + - Auto Completion + - Refactoring + - Code Snippets +- [📦 Debugger for Java](https://marketplace.visualstudio.com/items?itemName=vscjava.vscode-java-debug) + - Debugging +- [📦 Test Runner for Java](https://marketplace.visualstudio.com/items?itemName=vscjava.vscode-java-test) + - Run & Debug JUnit/TestNG Test Cases +- [📦 Maven for Java](https://marketplace.visualstudio.com/items?itemName=vscjava.vscode-maven) + - Project Scaffolding + - Custom Goals +- [📦 Gradle for Java](https://marketplace.visualstudio.com/items?itemName=vscjava.vscode-gradle) + - View Gradle tasks and project dependencies + - Gradle file authoring + - Import Gradle projects via [Gradle Build Server](https://github.com/microsoft/build-server-for-gradle) +- [📦 Project Manager for Java](https://marketplace.visualstudio.com/items?itemName=vscjava.vscode-java-dependency) + - Manage Java projects, referenced libraries, resource files, packages, classes, and class members +- [📦 Visual Studio IntelliCode](https://marketplace.visualstudio.com/items?itemName=VisualStudioExptTeam.vscodeintellicode) + - AI-assisted development + - Completion list ranked by AI + +## Label +When labeling an issue, follow the rules below per label category: +### General Rules +- Analyze if the issue is related with the scope of using extensions for Java development. If not, STOP labelling IMMEDIATELY. +- Assign label per category. +- If a category is not applicable or you're unsure, you may skip it. +- Do not assign multiple labels within the same category, unless explicitly allowed as an exception. + +### Issue Type Labels +- [bug]: Primary label for real bug issues +- [enhancement]: Primary label for enhancement issues +- [documentation]: Primary label for documentation issues +- [question]: Primary label for question issues \ No newline at end of file diff --git a/.github/workflows/triage-agent.yml b/.github/workflows/triage-agent.yml new file mode 100644 index 00000000..689a2529 --- /dev/null +++ b/.github/workflows/triage-agent.yml @@ -0,0 +1,122 @@ +name: AI Triage - Label and Comment on New Issues +on: + issues: + types: [opened] + workflow_dispatch: + inputs: + issue_number: + description: 'Issue number to triage (manual run). e.g. 123' + required: true + +permissions: + issues: write + contents: read + +jobs: + label_and_comment: + runs-on: ubuntu-latest + + steps: + - name: Checkout repository + uses: actions/checkout@v2 + + - name: Get issue data + id: get_issue + uses: actions/github-script@v6 + with: + script: | + const eventName = context.eventName; + let issue; + if (eventName === 'workflow_dispatch') { + const inputs = context.payload.inputs || {}; + const issueNumber = inputs.issue_number || inputs.issueNumber; + if (!issueNumber) core.setFailed('Input issue_number is required for manual run.'); + const { data } = await github.rest.issues.get({ + owner: context.repo.owner, + repo: context.repo.repo, + issue_number: parseInt(issueNumber, 10), + }); + issue = data; + } else if (context.payload.issue) { + issue = context.payload.issue; + } else { + core.setFailed('No issue information found in the event payload.'); + } + core.setOutput('id', String(issue.number)); + core.setOutput('user', String((issue.user && issue.user.login) || '')); + core.setOutput('title', String(issue.title || '')); + core.setOutput('body', String(issue.body || '')); + const labelNames = (issue.labels || []).map(label => label.name); + core.setOutput('labels', JSON.stringify(labelNames)); + + - name: Call Azure Function + id: call_azure_function + env: + PAYLOAD: >- + { + "authToken": "${{ secrets.GITHUB_TOKEN }}", + "repoId": "microsoft/vscode-java-dependency", + "issueData": { + "id": ${{ steps.get_issue.outputs.id }}, + "user": ${{ toJson(steps.get_issue.outputs.user) }}, + "title": ${{ toJson(steps.get_issue.outputs.title) }}, + "body": ${{ toJson(steps.get_issue.outputs.body) }}, + "labels": ${{ steps.get_issue.outputs.labels }} + }, + "mode": "DirectUpdate" + } + + run: | + # Make the HTTP request with improved error handling and timeouts + echo "Making request to triage agent..." + + # Add timeout handling and better error detection + set +e # Don't exit on curl failure + response=$(timeout ${{ vars.TRIAGE_AGENT_TIMEOUT }} curl \ + --max-time 0 \ + --connect-timeout 30 \ + --fail-with-body \ + --silent \ + --show-error \ + --write-out "HTTPSTATUS:%{http_code}" \ + --header "Content-Type: application/json" \ + --request POST \ + --data "$PAYLOAD" \ + ${{ secrets.TRIAGE_FUNCTION_LINK }} 2>&1) + + curl_exit_code=$? + set -e # Re-enable exit on error + + echo "Curl exit code: $curl_exit_code" + + # Check if curl command timed out or failed + if [ $curl_exit_code -eq 124 ]; then + echo "❌ Request timed out after 650 seconds" + exit 1 + elif [ $curl_exit_code -ne 0 ]; then + echo "❌ Curl command failed with exit code: $curl_exit_code" + echo "Response: $response" + exit 1 + fi + + # Extract HTTP status code and response body + http_code=$(echo "$response" | grep -o "HTTPSTATUS:[0-9]*" | cut -d: -f2) + response_body=$(echo "$response" | sed 's/HTTPSTATUS:[0-9]*$//') + + echo "HTTP Status Code: $http_code" + + # Validate HTTP status code + if [ -z "$http_code" ]; then + echo "❌ Failed to extract HTTP status code from response" + echo "Raw response: $response" + exit 1 + fi + + # Check if the request was successful + if [ "$http_code" -ge 200 ] && [ "$http_code" -lt 300 ]; then + echo "✅ Azure Function call succeeded" + else + echo "❌ Azure Function call failed with status code: $http_code" + echo "Response: $response_body" + exit 1 + fi From 465d9882ead7c92a854ba2c3fdf315f0198760a1 Mon Sep 17 00:00:00 2001 From: Ray Sun <202210574+FluoriteCafe-work@users.noreply.github.com> Date: Thu, 18 Sep 2025 11:21:39 +0800 Subject: [PATCH 230/352] Remind users to upgrade old (<21) Java and EOL Spring Boot/Framework versions (#901) --- package.json | 30 ++++- package.nls.json | 3 + src/commands.ts | 9 ++ src/constants.ts | 6 + src/extension.ts | 2 + src/settings.ts | 4 + src/syncHandler.ts | 2 + src/upgrade/assessmentManager.ts | 139 +++++++++++++++++++++ src/upgrade/dependency.metadata.ts | 107 ++++++++++++++++ src/upgrade/display/notificationManager.ts | 90 +++++++++++++ src/upgrade/metadataManager.ts | 28 +++++ src/upgrade/type.ts | 31 +++++ src/upgrade/upgradeManager.ts | 73 +++++++++++ src/upgrade/utility.ts | 75 +++++++++++ 14 files changed, 598 insertions(+), 1 deletion(-) create mode 100644 src/upgrade/assessmentManager.ts create mode 100644 src/upgrade/dependency.metadata.ts create mode 100644 src/upgrade/display/notificationManager.ts create mode 100644 src/upgrade/metadataManager.ts create mode 100644 src/upgrade/type.ts create mode 100644 src/upgrade/upgradeManager.ts create mode 100644 src/upgrade/utility.ts diff --git a/package.json b/package.json index df286b18..6003c338 100644 --- a/package.json +++ b/package.json @@ -288,6 +288,16 @@ "command": "java.view.package.renameFile", "title": "%contributes.commands.java.view.package.renameFile%", "category": "Java" + }, + { + "command": "_java.view.modernizeJavaProject", + "title": "%contributes.commands.java.view.modernizeJavaProject%", + "category": "Java" + }, + { + "command": "_java.upgradeWithCopilot", + "title": "%contributes.commands.java.upgradeWithCopilot%", + "category": "Java" } ], "configuration": { @@ -323,6 +333,11 @@ "description": "%configuration.java.dependency.packagePresentation%", "default": "flat" }, + "java.dependency.enableDependencyCheckup": { + "type": "boolean", + "description": "%configuration.java.dependency.enableDependencyCheckup%", + "default": true + }, "java.project.exportJar.targetPath": { "type": "string", "anyOf": [ @@ -550,6 +565,14 @@ { "command": "_java.project.create.from.javaprojectexplorer", "when": "false" + }, + { + "command": "_java.view.modernizeJavaProject", + "when": "false" + }, + { + "command": "_java.upgradeWithCopilot", + "when": "false" } ], "explorer/context": [ @@ -568,6 +591,11 @@ "when": "explorerResourceIsFolder", "group": "1_javaactions@30" }, + { + "command": "_java.view.modernizeJavaProject", + "when": "explorerResourceIsFolder && java:serverMode && isModernizationExtensionInstalled", + "group": "1_javaactions@40" + }, { "command": "java.view.package.revealInProjectExplorer", "when": "resourceFilename =~ /(.*\\.gradle)|(.*\\.gradle\\.kts)|(pom\\.xml)$/ && java:serverMode == Standard", @@ -1092,4 +1120,4 @@ "vscode-extension-telemetry-wrapper": "^0.14.0", "vscode-tas-client": "^0.1.75" } -} +} \ No newline at end of file diff --git a/package.nls.json b/package.nls.json index 8feb8343..95052e18 100644 --- a/package.nls.json +++ b/package.nls.json @@ -24,6 +24,7 @@ "contributes.commands.java.view.package.copyRelativeFilePath": "Copy Relative Path", "contributes.commands.java.view.package.new": "New...", "contributes.commands.java.view.package.newJavaClass": "Class...", + "contributes.commands.java.view.modernizeJavaProject": "Modernize Java project", "contributes.commands.java.view.package.newJavaInterface": "Interface...", "contributes.commands.java.view.package.newJavaEnum": "Enum...", "contributes.commands.java.view.package.newJavaRecord": "Record...", @@ -38,11 +39,13 @@ "contributes.commands.java.view.fileExplorer.newPackage": "New Java Package...", "contributes.submenus.javaProject.new": "New", "contributes.commands.java.view.menus.file.newJavaClass": "New Java File", + "contributes.commands.java.upgradeWithCopilot": "Upgrade dependencies", "configuration.java.dependency.showMembers": "Show the members in the explorer", "configuration.java.dependency.syncWithFolderExplorer": "Link Java Projects Explorer with the active editor", "configuration.java.dependency.autoRefresh": "Synchronize Java Projects explorer with changes", "configuration.java.dependency.refreshDelay": "The delay time (ms) the auto refresh is invoked when changes are detected", "configuration.java.dependency.packagePresentation": "Package presentation mode: flat or hierarchical", + "configuration.java.dependency.enableDependencyCheckup": "Show reminders when your Java runtimes or dependencies need an upgrade.", "configuration.java.project.explorer.showNonJavaResources": "When enabled, the explorer shows non-Java resources.", "configuration.java.project.exportJar.targetPath.customization": "The output path of the exported jar. Leave it empty if you want to manually pick the output location.", "configuration.java.project.exportJar.targetPath.workspaceFolder": "Export the jar file into the workspace folder. Its name is the same as the folder's.", diff --git a/src/commands.ts b/src/commands.ts index a2564835..f3887ef7 100644 --- a/src/commands.ts +++ b/src/commands.ts @@ -42,6 +42,8 @@ export namespace Commands { export const VIEW_PACKAGE_NEW_JAVA_CLASS = "java.view.package.newJavaClass"; + export const VIEW_MODERNIZE_JAVA_PROJECT = "_java.view.modernizeJavaProject"; + export const VIEW_PACKAGE_NEW_JAVA_INTERFACE = "java.view.package.newJavaInterface"; export const VIEW_PACKAGE_NEW_JAVA_ENUM = "java.view.package.newJavaEnum"; @@ -132,6 +134,8 @@ export namespace Commands { export const JAVA_PROJECT_CHECK_IMPORT_STATUS = "java.project.checkImportStatus"; + export const JAVA_UPGRADE_WITH_COPILOT = "_java.upgradeWithCopilot"; + /** * Commands from Visual Studio Code */ @@ -156,6 +160,11 @@ export namespace Commands { export const BUILD_PROJECT = "java.project.build"; + /** + * Commands from Java Upgrade Tool + */ + export const GOTO_AGENT_MODE = "javaupgrade.gotoAgentMode"; + /** * Get the project settings */ diff --git a/src/constants.ts b/src/constants.ts index df01101c..659e67ca 100644 --- a/src/constants.ts +++ b/src/constants.ts @@ -33,6 +33,12 @@ export namespace Explorer { export namespace ExtensionName { export const JAVA_LANGUAGE_SUPPORT: string = "redhat.java"; + export const APP_MODERNIZATION_FOR_JAVA = "vscjava.migrate-java-to-azure"; + export const APP_MODERNIZATION_UPGRADE_FOR_JAVA = "vscjava.vscode-java-upgrade"; +} + +export namespace Upgrade { + export const PACKAGE_ID_FOR_JAVA_RUNTIME = "java:*"; } /** diff --git a/src/extension.ts b/src/extension.ts index 531b5ac3..d2fe424b 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -20,9 +20,11 @@ import { DiagnosticProvider } from "./tasks/buildArtifact/migration/DiagnosticPr import { setContextForDeprecatedTasks, updateExportTaskType } from "./tasks/buildArtifact/migration/utils"; import { CodeActionProvider } from "./tasks/buildArtifact/migration/CodeActionProvider"; import { newJavaFile } from "./explorerCommands/new"; +import upgradeManager from "./upgrade/upgradeManager"; export async function activate(context: ExtensionContext): Promise { contextManager.initialize(context); + upgradeManager.initialize(context); await initializeFromJsonFile(context.asAbsolutePath("./package.json")); await initExpService(context); await instrumentOperation("activation", activateExtension)(context); diff --git a/src/settings.ts b/src/settings.ts index bea8e7c2..60bde619 100644 --- a/src/settings.ts +++ b/src/settings.ts @@ -108,6 +108,10 @@ export class Settings { return workspace.getConfiguration("java.dependency").get("refreshDelay", 2000); } + public static getEnableDependencyCheckup() { + return workspace.getConfiguration("java.dependency").get("enableDependencyCheckup", true); + } + public static getExportJarTargetPath(): string { // tslint:disable-next-line: no-invalid-template-strings return workspace.getConfiguration("java.project.exportJar").get("targetPath", "${workspaceFolder}/${workspaceFolderBasename}.jar"); diff --git a/src/syncHandler.ts b/src/syncHandler.ts index d6d247c0..40315fa0 100644 --- a/src/syncHandler.ts +++ b/src/syncHandler.ts @@ -13,6 +13,7 @@ import { DataNode } from "./views/dataNode"; import { ExplorerNode } from "./views/explorerNode"; import { explorerNodeCache } from "./views/nodeCache/explorerNodeCache"; import { Jdtls } from "./java/jdtls"; +import upgradeManager from "./upgrade/upgradeManager"; const ENABLE_AUTO_REFRESH: string = "java.view.package.enableAutoRefresh"; const DISABLE_AUTO_REFRESH: string = "java.view.package.disableAutoRefresh"; @@ -46,6 +47,7 @@ class SyncHandler implements Disposable { this.disposables.push(workspace.onDidChangeWorkspaceFolders(() => { this.refresh(); + upgradeManager.scan(); })); try { diff --git a/src/upgrade/assessmentManager.ts b/src/upgrade/assessmentManager.ts new file mode 100644 index 00000000..1a361460 --- /dev/null +++ b/src/upgrade/assessmentManager.ts @@ -0,0 +1,139 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT license. + +import * as semver from 'semver'; +import { Jdtls } from "../java/jdtls"; +import { NodeKind, type INodeData } from "../java/nodeData"; +import { type DependencyCheckItem, UpgradeReason, type UpgradeIssue } from "./type"; +import { DEPENDENCY_JAVA_RUNTIME } from "./dependency.metadata"; +import { Upgrade } from '../constants'; +import { buildPackageId } from './utility'; +import metadataManager from './metadataManager'; +import { sendInfo } from 'vscode-extension-telemetry-wrapper'; + +function getJavaIssues(data: INodeData): UpgradeIssue[] { + const javaVersion = data.metaData?.MaxSourceVersion as number | undefined; + const { name, supportedVersion } = DEPENDENCY_JAVA_RUNTIME; + if (!javaVersion) { + return []; + } + const currentSemVer = semver.coerce(javaVersion); + if (currentSemVer && !semver.satisfies(currentSemVer, supportedVersion)) { + return [{ + ...DEPENDENCY_JAVA_RUNTIME, + packageId: Upgrade.PACKAGE_ID_FOR_JAVA_RUNTIME, + packageDisplayName: name, + currentVersion: String(javaVersion), + }]; + } + + return []; +} + +function getUpgradeForDependency(versionString: string, supportedVersionDefinition: DependencyCheckItem, packageId: string): UpgradeIssue | null { + const { reason } = supportedVersionDefinition; + switch (reason) { + case UpgradeReason.DEPRECATED: { + return { + ...supportedVersionDefinition, + packageDisplayName: supportedVersionDefinition.name, + reason, + currentVersion: versionString, + packageId, + }; + } + case UpgradeReason.END_OF_LIFE: { + const currentSemVer = semver.coerce(versionString); + if (currentSemVer && !semver.satisfies(currentSemVer, supportedVersionDefinition.supportedVersion)) { + return { + ...supportedVersionDefinition, + packageDisplayName: supportedVersionDefinition.name, + reason, + currentVersion: versionString, + packageId, + }; + } + } + } + + return null; +} + +function getDependencyIssue(data: INodeData): UpgradeIssue | null { + const versionString = data.metaData?.["maven.version"]; + const groupId = data.metaData?.["maven.groupId"]; + const artifactId = data.metaData?.["maven.artifactId"]; + const packageId = buildPackageId(groupId, artifactId); + const supportedVersionDefinition = metadataManager.getMetadataById(packageId); + if (!versionString || !groupId || !supportedVersionDefinition) { + return null; + } + + return getUpgradeForDependency(versionString, supportedVersionDefinition, packageId); +} + +async function getDependencyIssues(projectNode: INodeData): Promise { + const projectStructureData = await Jdtls.getPackageData({ kind: NodeKind.Project, projectUri: projectNode.uri }); + const packageContainerIssues = await Promise.allSettled( + projectStructureData + .filter(x => x.kind === NodeKind.Container) + .map(async (packageContainer) => { + const packages = await Jdtls.getPackageData({ + kind: NodeKind.Container, + projectUri: projectNode.uri, + path: packageContainer.path, + }); + + return packages.map(getDependencyIssue).filter((x): x is UpgradeIssue => Boolean(x)); + }) + ); + + return packageContainerIssues + .map(x => { + if (x.status === "fulfilled") { + return x.value; + } + + sendInfo("", { + operationName: "java.dependency.assessmentManager.getDependencyIssues", + }); + return []; + }) + .reduce((a, b) => [...a, ...b]); +} + +async function getProjectIssues(projectNode: INodeData): Promise { + const issues: UpgradeIssue[] = []; + issues.push(...getJavaIssues(projectNode)); + issues.push(...(await getDependencyIssues(projectNode))); + return issues; +} + +async function getWorkspaceIssues(workspaceFolderUri: string): Promise { + const projects = await Jdtls.getProjects(workspaceFolderUri); + const projectsIssues = await Promise.allSettled(projects.map(async (projectNode) => { + const issues = await getProjectIssues(projectNode); + sendInfo("", { + operationName: "java.dependency.assessmentManager.getWorkspaceIssues", + issuesFoundForPackageId: JSON.stringify(issues.map(x => `${x.packageId}:${x.currentVersion}`)), + }); + return issues; + })); + + const workspaceIssues = projectsIssues.map(x => { + if (x.status === "fulfilled") { + return x.value; + } + + sendInfo("", { + operationName: "java.dependency.assessmentManager.getWorkspaceIssues", + }); + return []; + }).reduce((a, b) => [...a, ...b]); + + return workspaceIssues; +} + +export default { + getWorkspaceIssues, +}; \ No newline at end of file diff --git a/src/upgrade/dependency.metadata.ts b/src/upgrade/dependency.metadata.ts new file mode 100644 index 00000000..8b31b04f --- /dev/null +++ b/src/upgrade/dependency.metadata.ts @@ -0,0 +1,107 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT license. + +import { Upgrade } from "../constants"; +import { UpgradeReason, type DependencyCheckMetadata } from "./type"; + +const LATEST_JAVA_LTS_VESRION = 21; + +export const DEPENDENCY_JAVA_RUNTIME = { + "name": "Java Runtime", + "reason": UpgradeReason.JRE_TOO_OLD, + "supportedVersion": `>=${LATEST_JAVA_LTS_VESRION}`, + "suggestedVersion": { + "name": String(LATEST_JAVA_LTS_VESRION), + "description": "latest LTS version", + }, +} as const; + +const DEPENDENCIES_TO_SCAN: DependencyCheckMetadata = { + "org.springframework.boot:*": { + "reason": UpgradeReason.END_OF_LIFE, + "name": "Spring Boot", + "supportedVersion": "2.7.x || >=3.2.x", + "eolDate": { + "4.0.x": "2027-12", + "3.5.x": "2032-06", + "3.4.x": "2026-12", + "3.3.x": "2026-06", + "3.2.x": "2025-12", + "3.1.x": "2025-06", + "3.0.x": "2024-12", + "2.7.x": "2029-06", + "2.6.x": "2024-02", + "2.5.x": "2023-08", + "2.4.x": "2023-02", + "2.3.x": "2022-08", + "2.2.x": "2022-01", + "2.1.x": "2021-01", + "2.0.x": "2020-06", + "1.5.x": "2020-11", + }, + "suggestedVersion": { + "name": "3.5", + "description": "latest stable release", + }, + }, + "org.springframework:*": { + "reason": UpgradeReason.END_OF_LIFE, + "name": "Spring Framework", + "supportedVersion": "5.3.x || >=6.2.x", + "eolDate": { + "7.0.x": "2028-06", + "6.2.x": "2032-06", + "6.1.x": "2026-06", + "6.0.x": "2025-08", + "5.3.x": "2029-06", + "5.2.x": "2023-12", + "5.1.x": "2022-12", + "5.0.x": "2022-12", + "4.3.x": "2020-12", + }, + "suggestedVersion": { + "name": "3.5", + "description": "latest stable release", + }, + }, + "org.springframework.security:*": { + "reason": UpgradeReason.END_OF_LIFE, + "name": "Spring Security", + "supportedVersion": "5.7.x || 5.8.x || >=6.2.x", + "eolDate": { + "7.0.x": "2027-12", + "6.5.x": "2032-06", + "6.4.x": "2026-12", + "6.3.x": "2026-06", + "6.2.x": "2025-12", + "6.1.x": "2025-06", + "6.0.x": "2024-12", + "5.8.x": "2029-06", + "5.7.x": "2029-06", + "5.6.x": "2024-02", + "5.5.x": "2023-08", + "5.4.x": "2023-02", + "5.3.x": "2022-08", + "5.2.x": "2022-01", + "5.1.x": "2021-01", + "5.0.x": "2020-06", + "4.2.x": "2020-11", + }, + "suggestedVersion": { + "name": "3.5", + "description": "latest stable release", + }, + }, + "javax:*": { + "reason": UpgradeReason.DEPRECATED, + "name": "Java EE", + "suggestedVersion": { + "name": "Jakarta EE 10", + "description": "latest release with wide Java runtime version support", + + }, + }, + [Upgrade.PACKAGE_ID_FOR_JAVA_RUNTIME]: DEPENDENCY_JAVA_RUNTIME, +}; + +export default DEPENDENCIES_TO_SCAN; \ No newline at end of file diff --git a/src/upgrade/display/notificationManager.ts b/src/upgrade/display/notificationManager.ts new file mode 100644 index 00000000..1b6c98d0 --- /dev/null +++ b/src/upgrade/display/notificationManager.ts @@ -0,0 +1,90 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT license. + +import { commands, ExtensionContext, window } from "vscode"; +import type { IUpgradeIssuesRenderer, UpgradeIssue } from "../type"; +import { buildFixPrompt, buildNotificationMessage } from "../utility"; +import { Commands } from "../../commands"; +import { Settings } from "../../settings"; +import { instrumentOperation, sendInfo } from "vscode-extension-telemetry-wrapper"; + +const KEY_PREFIX = 'javaupgrade.notificationManager'; +const NEXT_SHOW_TS_KEY = `${KEY_PREFIX}.nextShowTs`; + +const BUTTON_TEXT_UPGRADE = "Upgrade Now"; +const BUTTON_TEXT_NOT_NOW = "Not Now"; + +const SECONDS_IN_A_DAY = 24 * 60 * 60; +const SECONDS_COUNT_BEFORE_NOTIFICATION_RESHOW = 10 * SECONDS_IN_A_DAY; + +function getNowTs() { + return Number(new Date()) / 1000; +} + +class NotificationManager implements IUpgradeIssuesRenderer { + private hasShown = false; + private context?: ExtensionContext; + + initialize(context: ExtensionContext) { + this.context = context; + } + + async render(issues: UpgradeIssue[]) { + return (instrumentOperation( + "java.dependency.showUpgradeNotification", + async (operationId: string) => { + if (issues.length === 0) { + return; + } + const issue = issues[0]; + + if (!this.shouldShow()) { + return; + } + + if (this.hasShown) { + return; + } + this.hasShown = true; + + const prompt = buildFixPrompt(issue); + const notificationMessage = buildNotificationMessage(issue); + const selection = await window.showInformationMessage( + notificationMessage, + BUTTON_TEXT_UPGRADE, + BUTTON_TEXT_NOT_NOW); + sendInfo(operationId, { + operationName: "java.dependency.upgradeNotification.runUpgrade", + choice: selection ?? "", + }); + + switch (selection) { + case BUTTON_TEXT_UPGRADE: { + commands.executeCommand(Commands.JAVA_UPGRADE_WITH_COPILOT, prompt); + break; + } + case BUTTON_TEXT_NOT_NOW: { + this.setNextShowTs(getNowTs() + SECONDS_COUNT_BEFORE_NOTIFICATION_RESHOW); + break; + } + } + } + ))(); + } + + private shouldShow() { + return Settings.getEnableDependencyCheckup() + && ((this.getNextShowTs() ?? 0) <= getNowTs()); + } + + private getNextShowTs() { + return this.context?.globalState.get(NEXT_SHOW_TS_KEY); + } + + private setNextShowTs(num: number) { + return this.context?.globalState.update(NEXT_SHOW_TS_KEY, num); + } +} + +const notificationManager = new NotificationManager(); +export default notificationManager; \ No newline at end of file diff --git a/src/upgrade/metadataManager.ts b/src/upgrade/metadataManager.ts new file mode 100644 index 00000000..f9f79dfd --- /dev/null +++ b/src/upgrade/metadataManager.ts @@ -0,0 +1,28 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT license. + +import { type DependencyCheckMetadata, type DependencyCheckItem } from "./type"; +import { buildPackageId } from "./utility"; +import DEPENDENCIES_TO_SCAN from "./dependency.metadata"; + +class MetadataManager { + private static dependencyCheckMetadata: DependencyCheckMetadata = DEPENDENCIES_TO_SCAN; + + public static getMetadataById(givenPackageId: string): DependencyCheckItem | undefined { + const splits = givenPackageId.split(":", 2); + const groupId = splits[0]; + const artifactId = splits[1] ?? ""; + + const packageId = buildPackageId(groupId, artifactId); + const packageIdWithWildcardArtifactId = buildPackageId(groupId, "*"); + return this.getMetadata(packageId) ?? this.getMetadata(packageIdWithWildcardArtifactId); + } + + private static getMetadata(packageRuleUsed: string) { + return this.dependencyCheckMetadata[packageRuleUsed] ? { + ...this.dependencyCheckMetadata[packageRuleUsed], packageRuleUsed + } : undefined; + } +} + +export default MetadataManager; \ No newline at end of file diff --git a/src/upgrade/type.ts b/src/upgrade/type.ts new file mode 100644 index 00000000..82105fb0 --- /dev/null +++ b/src/upgrade/type.ts @@ -0,0 +1,31 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT license. + +export type UpgradeTarget = { name: string; description: string }; +export type DependencyCheckItemBase = { name: string, reason: UpgradeReason, suggestedVersion: UpgradeTarget }; +export type DependencyCheckItemEol = DependencyCheckItemBase & { + reason: UpgradeReason.END_OF_LIFE, + supportedVersion: string, + eolDate: Record +}; +export type DependencyCheckItemJreTooOld = DependencyCheckItemBase & { reason: UpgradeReason.JRE_TOO_OLD }; +export type DependencyCheckItemDeprecated = DependencyCheckItemBase & { reason: UpgradeReason.DEPRECATED }; +export type DependencyCheckItem = (DependencyCheckItemEol | DependencyCheckItemJreTooOld | DependencyCheckItemDeprecated); +export type DependencyCheckMetadata = Record; + +export enum UpgradeReason { + END_OF_LIFE, + DEPRECATED, + CVE, + JRE_TOO_OLD, +} + +export type UpgradeIssue = { + packageId: string; + packageDisplayName: string; + currentVersion: string; +} & DependencyCheckItem; + +export interface IUpgradeIssuesRenderer { + render(issues: UpgradeIssue[]): void; +} \ No newline at end of file diff --git a/src/upgrade/upgradeManager.ts b/src/upgrade/upgradeManager.ts new file mode 100644 index 00000000..60e270e4 --- /dev/null +++ b/src/upgrade/upgradeManager.ts @@ -0,0 +1,73 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT license. + +import { commands, type ExtensionContext, extensions, workspace, type WorkspaceFolder } from "vscode"; + +import { Jdtls } from "../java/jdtls"; +import { languageServerApiManager } from "../languageServerApi/languageServerApiManager"; +import { ExtensionName } from "../constants"; +import { instrumentOperation, instrumentOperationAsVsCodeCommand } from "vscode-extension-telemetry-wrapper"; +import { Commands } from "../commands"; +import notificationManager from "./display/notificationManager"; +import { Settings } from "../settings"; +import assessmentManager from "./assessmentManager"; + +const DEFAULT_UPGRADE_PROMPT = "Upgrade Java project dependency to latest version."; + + +function shouldRunCheckup() { + return Settings.getEnableDependencyCheckup() + && !!extensions.getExtension(ExtensionName.APP_MODERNIZATION_UPGRADE_FOR_JAVA); +} + +class UpgradeManager { + public static initialize(context: ExtensionContext) { + notificationManager.initialize(context); + + // Commands to be used + context.subscriptions.push(instrumentOperationAsVsCodeCommand(Commands.JAVA_UPGRADE_WITH_COPILOT, async (promptText?: string) => { + const promptToUse = promptText ?? DEFAULT_UPGRADE_PROMPT; + await commands.executeCommand(Commands.GOTO_AGENT_MODE, { prompt: promptToUse }); + })); + commands.executeCommand('setContext', 'isModernizationExtensionInstalled', + !!extensions.getExtension(ExtensionName.APP_MODERNIZATION_FOR_JAVA)); + context.subscriptions.push(instrumentOperationAsVsCodeCommand(Commands.VIEW_MODERNIZE_JAVA_PROJECT, () => { + commands.executeCommand("workbench.view.extension.azureJavaMigrationExplorer"); + })); + + UpgradeManager.scan(); + } + + public static scan() { + if (!shouldRunCheckup()) { + return; + } + workspace.workspaceFolders?.forEach((folder) => + UpgradeManager.runDependencyCheckup(folder) + ); + } + + private static async runDependencyCheckup(folder: WorkspaceFolder) { + return (instrumentOperation("java.dependency.runDependencyCheckup", + async (_operationId: string) => { + if (!await languageServerApiManager.ready()) { + return; + } + const hasJavaError: boolean = await Jdtls.checkImportStatus(); + if (hasJavaError) { + return; + } + + const uri = folder.uri.toString(); + const workspaceIssues = await assessmentManager.getWorkspaceIssues(uri); + + if (workspaceIssues.length > 0) { + // only show one issue in notifications + notificationManager.render(workspaceIssues); + } + } + ))(); + } +} + +export default UpgradeManager; \ No newline at end of file diff --git a/src/upgrade/utility.ts b/src/upgrade/utility.ts new file mode 100644 index 00000000..1735f599 --- /dev/null +++ b/src/upgrade/utility.ts @@ -0,0 +1,75 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT license. + +import { Uri } from "vscode"; +import * as semver from "semver"; +import { UpgradeReason, type UpgradeIssue } from "./type"; +import { Upgrade } from "../constants"; + + +function findEolDate(currentVersion: string, eolDate: Record): string | null { + const currentVersionSemVer = semver.coerce(currentVersion); + if (!currentVersionSemVer) { + return null; + } + for (const [versionRange, date] of Object.entries(eolDate)) { + if (semver.satisfies(currentVersionSemVer, versionRange)) { + return date; + } + } + return null; +} + +export function buildNotificationMessage(issue: UpgradeIssue): string { + const { + packageId, + currentVersion, + reason, + suggestedVersion: { name: suggestedVersionName, description: suggestedVersionDescription }, + packageDisplayName + } = issue; + + + if (packageId === Upgrade.PACKAGE_ID_FOR_JAVA_RUNTIME) { + return `The current project is using an older Java runtime (${currentVersion}). Do you want to upgrade to the latest LTS version ${suggestedVersionName}?`; + } + + switch (reason) { + case UpgradeReason.END_OF_LIFE: { + const { eolDate } = issue; + const versionEolDate = findEolDate(currentVersion, eolDate); + return `The current project is using ${packageDisplayName} ${currentVersion}, which has reached end of life${versionEolDate ? ` in ${versionEolDate}` : "" + }. Do you want to upgrade to ${suggestedVersionName} (${suggestedVersionDescription})?`; + } + case UpgradeReason.DEPRECATED: + default: { + return `The current project is using ${packageDisplayName} ${currentVersion}, which has been deprecated. Do you want to upgrade to ${suggestedVersionName} (${suggestedVersionDescription})?`; + } + } +} + + +export function buildFixPrompt(issue: UpgradeIssue): string { + const { packageDisplayName, reason } = issue; + + switch (reason) { + case UpgradeReason.JRE_TOO_OLD: { + const { suggestedVersion: { name: suggestedVersionName } } = issue; + return `upgrade java runtime to the latest LTS version ${suggestedVersionName} using java upgrade tools`; + } + case UpgradeReason.END_OF_LIFE: + case UpgradeReason.DEPRECATED: { + const { suggestedVersion: { name: suggestedVersionName } } = issue; + return `upgrade ${packageDisplayName} to ${suggestedVersionName} using java upgrade tools`; + } + } +} + +export function buildPackageId(groupId: string, artifactId: string): string { + return `${groupId}:${artifactId}`; +} + +export function normalizePath(path: string): string { + return Uri.parse(path).toString(); +} + From f9dc47275c05dbf63d944e0a32b04538001f84f6 Mon Sep 17 00:00:00 2001 From: Ray Sun <202210574+FluoriteCafe-work@users.noreply.github.com> Date: Fri, 19 Sep 2025 09:10:28 +0800 Subject: [PATCH 231/352] chore: Release 0.25.0 (#908) --- CHANGELOG.md | 4 ++++ package-lock.json | 4 ++-- package.json | 2 +- 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 84c5be80..2f46a7af 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,10 @@ All notable changes to the "vscode-java-dependency" extension will be documented The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/) and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html). +## 0.25.0 +- feat - Remind users to upgrade old (<21) Java and EOL Spring Boot/Framework versions by @FluoriteCafe-work in https://github.com/microsoft/vscode-java-dependency/pull/901 +- feat - Improve ProjectCommand.getMainClasses by @snjeza in https://github.com/microsoft/vscode-java-dependency/pull/883 + ## 0.24.1 * Graal Cloud Native Launcher extension renamed. by @dbalek in https://github.com/microsoft/vscode-java-dependency/pull/849 * ux - display maven and gradle dependencies with pattern 'groupId:artifactId:version ' by @mamilic in https://github.com/microsoft/vscode-java-dependency/pull/859 diff --git a/package-lock.json b/package-lock.json index 5b6b821b..88d74227 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "vscode-java-dependency", - "version": "0.24.1", + "version": "0.25.0", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "vscode-java-dependency", - "version": "0.24.1", + "version": "0.25.0", "license": "MIT", "dependencies": { "await-lock": "^2.2.2", diff --git a/package.json b/package.json index 6003c338..31fd592f 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "vscode-java-dependency", "displayName": "Project Manager for Java", "description": "%description%", - "version": "0.24.1", + "version": "0.25.0", "publisher": "vscjava", "preview": false, "aiKey": "5c642b22-e845-4400-badb-3f8509a70777", From 64737bc73b25cf91a80a5185074675b7d7e44f4a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 19 Sep 2025 10:17:18 +0800 Subject: [PATCH 232/352] chore(deps): Bump axios from 1.8.3 to 1.12.1 (#903) Bumps [axios](https://github.com/axios/axios) from 1.8.3 to 1.12.1. - [Release notes](https://github.com/axios/axios/releases) - [Changelog](https://github.com/axios/axios/blob/v1.x/CHANGELOG.md) - [Commits](https://github.com/axios/axios/compare/v1.8.3...v1.12.1) --- updated-dependencies: - dependency-name: axios dependency-version: 1.12.1 dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/package-lock.json b/package-lock.json index 88d74227..86f0b6a8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1096,13 +1096,12 @@ "integrity": "sha512-aDczADvlvTGajTDjcjpJMqRkOF6Qdz3YbPZm/PyW6tKPkx2hlYBzxMhEywM/tU72HrVZjgl5VCdRuMlA7pZ8Gw==" }, "node_modules/axios": { - "version": "1.8.3", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.8.3.tgz", - "integrity": "sha512-iP4DebzoNlP/YN2dpwCgb8zoCmhtkajzS48JvwmkSkXvPI3DHc7m+XYL5tGnSlJtR6nImXZmdCuN5aP8dh1d8A==", - "license": "MIT", + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.12.2.tgz", + "integrity": "sha512-vMJzPewAlRyOgxV2dU0Cuz2O8zzzx9VYtbJOaBgXFeLc4IV/Eg50n4LowmehOOR61S8ZMpc2K5Sa7g6A4jfkUw==", "dependencies": { "follow-redirects": "^1.15.6", - "form-data": "^4.0.0", + "form-data": "^4.0.4", "proxy-from-env": "^1.1.0" } }, @@ -7010,12 +7009,12 @@ "integrity": "sha512-aDczADvlvTGajTDjcjpJMqRkOF6Qdz3YbPZm/PyW6tKPkx2hlYBzxMhEywM/tU72HrVZjgl5VCdRuMlA7pZ8Gw==" }, "axios": { - "version": "1.8.3", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.8.3.tgz", - "integrity": "sha512-iP4DebzoNlP/YN2dpwCgb8zoCmhtkajzS48JvwmkSkXvPI3DHc7m+XYL5tGnSlJtR6nImXZmdCuN5aP8dh1d8A==", + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.12.2.tgz", + "integrity": "sha512-vMJzPewAlRyOgxV2dU0Cuz2O8zzzx9VYtbJOaBgXFeLc4IV/Eg50n4LowmehOOR61S8ZMpc2K5Sa7g6A4jfkUw==", "requires": { "follow-redirects": "^1.15.6", - "form-data": "^4.0.0", + "form-data": "^4.0.4", "proxy-from-env": "^1.1.0" } }, From b8548d6447a9f29c056c10620b9044deaa4817a6 Mon Sep 17 00:00:00 2001 From: Ray Sun <202210574+FluoriteCafe-work@users.noreply.github.com> Date: Fri, 26 Sep 2025 15:16:24 +0800 Subject: [PATCH 233/352] Check extension existence on-the-fly when needed (#911) * feat: do JIT extension check on command execution * chore: revise extension install UX * chore: UX update * chore: bump to 0.25.2 --- CHANGELOG.md | 4 ++ package-lock.json | 4 +- package.json | 4 +- src/constants.ts | 1 + src/upgrade/dependency.metadata.ts | 2 +- src/upgrade/display/notificationManager.ts | 12 +++-- src/upgrade/upgradeManager.ts | 21 +++++--- src/upgrade/utility.ts | 59 +++++++++++++++++++--- 8 files changed, 83 insertions(+), 24 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2f46a7af..02058291 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,10 @@ All notable changes to the "vscode-java-dependency" extension will be documented The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/) and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html). +## 0.25.2 + +- ux - Check extension existence on-the-fly when needed by @FluoriteCafe-work in https://github.com/microsoft/vscode-java-dependency/pull/911 + ## 0.25.0 - feat - Remind users to upgrade old (<21) Java and EOL Spring Boot/Framework versions by @FluoriteCafe-work in https://github.com/microsoft/vscode-java-dependency/pull/901 - feat - Improve ProjectCommand.getMainClasses by @snjeza in https://github.com/microsoft/vscode-java-dependency/pull/883 diff --git a/package-lock.json b/package-lock.json index 86f0b6a8..02feb80c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "vscode-java-dependency", - "version": "0.25.0", + "version": "0.25.2", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "vscode-java-dependency", - "version": "0.25.0", + "version": "0.25.2", "license": "MIT", "dependencies": { "await-lock": "^2.2.2", diff --git a/package.json b/package.json index 31fd592f..118693fb 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "vscode-java-dependency", "displayName": "Project Manager for Java", "description": "%description%", - "version": "0.25.0", + "version": "0.25.2", "publisher": "vscjava", "preview": false, "aiKey": "5c642b22-e845-4400-badb-3f8509a70777", @@ -593,7 +593,7 @@ }, { "command": "_java.view.modernizeJavaProject", - "when": "explorerResourceIsFolder && java:serverMode && isModernizationExtensionInstalled", + "when": "explorerResourceIsFolder && java:serverMode", "group": "1_javaactions@40" }, { diff --git a/src/constants.ts b/src/constants.ts index 659e67ca..8bb176a5 100644 --- a/src/constants.ts +++ b/src/constants.ts @@ -35,6 +35,7 @@ export namespace ExtensionName { export const JAVA_LANGUAGE_SUPPORT: string = "redhat.java"; export const APP_MODERNIZATION_FOR_JAVA = "vscjava.migrate-java-to-azure"; export const APP_MODERNIZATION_UPGRADE_FOR_JAVA = "vscjava.vscode-java-upgrade"; + export const APP_MODERNIZATION_EXTENSION_NAME = "GitHub Copilot app modernization"; } export namespace Upgrade { diff --git a/src/upgrade/dependency.metadata.ts b/src/upgrade/dependency.metadata.ts index 8b31b04f..71a793c8 100644 --- a/src/upgrade/dependency.metadata.ts +++ b/src/upgrade/dependency.metadata.ts @@ -11,7 +11,7 @@ export const DEPENDENCY_JAVA_RUNTIME = { "reason": UpgradeReason.JRE_TOO_OLD, "supportedVersion": `>=${LATEST_JAVA_LTS_VESRION}`, "suggestedVersion": { - "name": String(LATEST_JAVA_LTS_VESRION), + "name": `Java ${LATEST_JAVA_LTS_VESRION}`, "description": "latest LTS version", }, } as const; diff --git a/src/upgrade/display/notificationManager.ts b/src/upgrade/display/notificationManager.ts index 1b6c98d0..c597e746 100644 --- a/src/upgrade/display/notificationManager.ts +++ b/src/upgrade/display/notificationManager.ts @@ -1,17 +1,19 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT license. -import { commands, ExtensionContext, window } from "vscode"; +import { commands, ExtensionContext, extensions, window } from "vscode"; import type { IUpgradeIssuesRenderer, UpgradeIssue } from "../type"; import { buildFixPrompt, buildNotificationMessage } from "../utility"; import { Commands } from "../../commands"; import { Settings } from "../../settings"; import { instrumentOperation, sendInfo } from "vscode-extension-telemetry-wrapper"; +import { ExtensionName } from "../../constants"; const KEY_PREFIX = 'javaupgrade.notificationManager'; const NEXT_SHOW_TS_KEY = `${KEY_PREFIX}.nextShowTs`; const BUTTON_TEXT_UPGRADE = "Upgrade Now"; +const BUTTON_TEXT_INSTALL_AND_UPGRADE = "Install Extension and Upgrade"; const BUTTON_TEXT_NOT_NOW = "Not Now"; const SECONDS_IN_A_DAY = 24 * 60 * 60; @@ -47,11 +49,13 @@ class NotificationManager implements IUpgradeIssuesRenderer { } this.hasShown = true; + const hasExtension = !!extensions.getExtension(ExtensionName.APP_MODERNIZATION_UPGRADE_FOR_JAVA); const prompt = buildFixPrompt(issue); - const notificationMessage = buildNotificationMessage(issue); + const notificationMessage = buildNotificationMessage(issue, hasExtension); + const upgradeButtonText = hasExtension ? BUTTON_TEXT_UPGRADE : BUTTON_TEXT_INSTALL_AND_UPGRADE; const selection = await window.showInformationMessage( notificationMessage, - BUTTON_TEXT_UPGRADE, + upgradeButtonText, BUTTON_TEXT_NOT_NOW); sendInfo(operationId, { operationName: "java.dependency.upgradeNotification.runUpgrade", @@ -59,7 +63,7 @@ class NotificationManager implements IUpgradeIssuesRenderer { }); switch (selection) { - case BUTTON_TEXT_UPGRADE: { + case upgradeButtonText: { commands.executeCommand(Commands.JAVA_UPGRADE_WITH_COPILOT, prompt); break; } diff --git a/src/upgrade/upgradeManager.ts b/src/upgrade/upgradeManager.ts index 60e270e4..9808a3ac 100644 --- a/src/upgrade/upgradeManager.ts +++ b/src/upgrade/upgradeManager.ts @@ -1,7 +1,7 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT license. -import { commands, type ExtensionContext, extensions, workspace, type WorkspaceFolder } from "vscode"; +import { commands, type ExtensionContext, workspace, type WorkspaceFolder } from "vscode"; import { Jdtls } from "../java/jdtls"; import { languageServerApiManager } from "../languageServerApi/languageServerApiManager"; @@ -11,28 +11,33 @@ import { Commands } from "../commands"; import notificationManager from "./display/notificationManager"; import { Settings } from "../settings"; import assessmentManager from "./assessmentManager"; +import { checkOrInstallAppModExtension, checkOrPromptToInstallAppModExtension } from "./utility"; const DEFAULT_UPGRADE_PROMPT = "Upgrade Java project dependency to latest version."; function shouldRunCheckup() { - return Settings.getEnableDependencyCheckup() - && !!extensions.getExtension(ExtensionName.APP_MODERNIZATION_UPGRADE_FOR_JAVA); + return Settings.getEnableDependencyCheckup(); } class UpgradeManager { public static initialize(context: ExtensionContext) { notificationManager.initialize(context); - // Commands to be used + // Upgrade project context.subscriptions.push(instrumentOperationAsVsCodeCommand(Commands.JAVA_UPGRADE_WITH_COPILOT, async (promptText?: string) => { + await checkOrInstallAppModExtension(ExtensionName.APP_MODERNIZATION_UPGRADE_FOR_JAVA); const promptToUse = promptText ?? DEFAULT_UPGRADE_PROMPT; await commands.executeCommand(Commands.GOTO_AGENT_MODE, { prompt: promptToUse }); })); - commands.executeCommand('setContext', 'isModernizationExtensionInstalled', - !!extensions.getExtension(ExtensionName.APP_MODERNIZATION_FOR_JAVA)); - context.subscriptions.push(instrumentOperationAsVsCodeCommand(Commands.VIEW_MODERNIZE_JAVA_PROJECT, () => { - commands.executeCommand("workbench.view.extension.azureJavaMigrationExplorer"); + + // Show modernization view + context.subscriptions.push(instrumentOperationAsVsCodeCommand(Commands.VIEW_MODERNIZE_JAVA_PROJECT, async () => { + await checkOrPromptToInstallAppModExtension( + ExtensionName.APP_MODERNIZATION_FOR_JAVA, + "Install GitHub Copilot app modernization to modernize the Java project.", + "Install Extension and Modernize"); + await commands.executeCommand("workbench.view.extension.azureJavaMigrationExplorer"); })); UpgradeManager.scan(); diff --git a/src/upgrade/utility.ts b/src/upgrade/utility.ts index 1735f599..b14bb81b 100644 --- a/src/upgrade/utility.ts +++ b/src/upgrade/utility.ts @@ -1,10 +1,10 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT license. -import { Uri } from "vscode"; +import { commands, extensions, Uri, window } from "vscode"; import * as semver from "semver"; import { UpgradeReason, type UpgradeIssue } from "./type"; -import { Upgrade } from "../constants"; +import { ExtensionName, Upgrade } from "../constants"; function findEolDate(currentVersion: string, eolDate: Record): string | null { @@ -20,7 +20,7 @@ function findEolDate(currentVersion: string, eolDate: Record): s return null; } -export function buildNotificationMessage(issue: UpgradeIssue): string { +export function buildNotificationMessage(issue: UpgradeIssue, hasExtension: boolean): string { const { packageId, currentVersion, @@ -29,21 +29,22 @@ export function buildNotificationMessage(issue: UpgradeIssue): string { packageDisplayName } = issue; + const upgradeWord = hasExtension ? "upgrade" : `install ${ExtensionName.APP_MODERNIZATION_EXTENSION_NAME} extension and upgrade`; if (packageId === Upgrade.PACKAGE_ID_FOR_JAVA_RUNTIME) { - return `The current project is using an older Java runtime (${currentVersion}). Do you want to upgrade to the latest LTS version ${suggestedVersionName}?`; + return `This project is using an older Java runtime (${currentVersion}). Would you like to ${upgradeWord} it to ${suggestedVersionName} (latest LTS)?`; } switch (reason) { case UpgradeReason.END_OF_LIFE: { const { eolDate } = issue; const versionEolDate = findEolDate(currentVersion, eolDate); - return `The current project is using ${packageDisplayName} ${currentVersion}, which has reached end of life${versionEolDate ? ` in ${versionEolDate}` : "" - }. Do you want to upgrade to ${suggestedVersionName} (${suggestedVersionDescription})?`; + return `This project is using ${packageDisplayName} ${currentVersion}, which has reached end of life${versionEolDate ? ` in ${versionEolDate}` : "" + }. Would you like to ${upgradeWord} it to ${suggestedVersionName} (${suggestedVersionDescription})?`; } case UpgradeReason.DEPRECATED: default: { - return `The current project is using ${packageDisplayName} ${currentVersion}, which has been deprecated. Do you want to upgrade to ${suggestedVersionName} (${suggestedVersionDescription})?`; + return `This project is using ${packageDisplayName} ${currentVersion}, which has been deprecated. Would you like to ${upgradeWord} it to ${suggestedVersionName} (${suggestedVersionDescription})?`; } } } @@ -73,3 +74,47 @@ export function normalizePath(path: string): string { return Uri.parse(path).toString(); } +async function checkOrPromptToEnableAppModExtension() { + if (extensions.getExtension(ExtensionName.APP_MODERNIZATION_FOR_JAVA)) { + return; + } + + // The extension is disabled if we cannot detect the extension after installing it. + await commands.executeCommand("workbench.extensions.search", ExtensionName.APP_MODERNIZATION_FOR_JAVA); + const BTN_TEXT = "Show extension in sidebar"; + const choice2 = await window.showInformationMessage( + `${ExtensionName.APP_MODERNIZATION_EXTENSION_NAME} extension is needed for the feature to work but it seems disabled. Please enable it manually and try again.`, + BTN_TEXT + ); + if (choice2 === BTN_TEXT) { + await commands.executeCommand("workbench.extensions.search", ExtensionName.APP_MODERNIZATION_FOR_JAVA); + } +} + +export async function checkOrPromptToInstallAppModExtension( + extensionIdToCheck: string, + notificationText: string, + buttonText: string): Promise { + if (extensions.getExtension(extensionIdToCheck)) { + return; + } + + const choice = await window.showInformationMessage(notificationText, buttonText); + if (choice === buttonText) { + await commands.executeCommand("workbench.extensions.installExtension", ExtensionName.APP_MODERNIZATION_FOR_JAVA); + } else { + return; + } + + await checkOrPromptToEnableAppModExtension(); +} + +export async function checkOrInstallAppModExtension( + extensionIdToCheck: string): Promise { + if (extensions.getExtension(extensionIdToCheck)) { + return; + } + + await commands.executeCommand("workbench.extensions.installExtension", ExtensionName.APP_MODERNIZATION_FOR_JAVA); + await checkOrPromptToEnableAppModExtension(); +} \ No newline at end of file From 53fc8233702a03eef7fc5ac579f5fa6d3d58a2bb Mon Sep 17 00:00:00 2001 From: Ray Sun <202210574+FluoriteCafe-work@users.noreply.github.com> Date: Fri, 26 Sep 2025 16:19:44 +0800 Subject: [PATCH 234/352] Improve wording on project modernization (#912) * chore: strings * docs: CHANGELOG * chore: wording Co-authored-by: Miller Wang <69189193+wangmingliang-ms@users.noreply.github.com> * feat: pop-up on disabled extension * chore: telemetry for `extensionDisabled` event * chore: lint --------- Co-authored-by: Miller Wang <69189193+wangmingliang-ms@users.noreply.github.com> --- CHANGELOG.md | 1 + src/upgrade/upgradeManager.ts | 8 ++++---- src/upgrade/utility.ts | 34 +++++++++++++++++++--------------- 3 files changed, 24 insertions(+), 19 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 02058291..d763d838 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0. ## 0.25.2 +- ux - Improve wording on project modernization by @FluoriteCafe-work in https://github.com/microsoft/vscode-java-dependency/pull/912 - ux - Check extension existence on-the-fly when needed by @FluoriteCafe-work in https://github.com/microsoft/vscode-java-dependency/pull/911 ## 0.25.0 diff --git a/src/upgrade/upgradeManager.ts b/src/upgrade/upgradeManager.ts index 9808a3ac..87fe3372 100644 --- a/src/upgrade/upgradeManager.ts +++ b/src/upgrade/upgradeManager.ts @@ -11,7 +11,7 @@ import { Commands } from "../commands"; import notificationManager from "./display/notificationManager"; import { Settings } from "../settings"; import assessmentManager from "./assessmentManager"; -import { checkOrInstallAppModExtension, checkOrPromptToInstallAppModExtension } from "./utility"; +import { checkOrInstallAppModExtensionForUpgrade, checkOrPopupToInstallAppModExtensionForModernization } from "./utility"; const DEFAULT_UPGRADE_PROMPT = "Upgrade Java project dependency to latest version."; @@ -26,16 +26,16 @@ class UpgradeManager { // Upgrade project context.subscriptions.push(instrumentOperationAsVsCodeCommand(Commands.JAVA_UPGRADE_WITH_COPILOT, async (promptText?: string) => { - await checkOrInstallAppModExtension(ExtensionName.APP_MODERNIZATION_UPGRADE_FOR_JAVA); + await checkOrInstallAppModExtensionForUpgrade(ExtensionName.APP_MODERNIZATION_UPGRADE_FOR_JAVA); const promptToUse = promptText ?? DEFAULT_UPGRADE_PROMPT; await commands.executeCommand(Commands.GOTO_AGENT_MODE, { prompt: promptToUse }); })); // Show modernization view context.subscriptions.push(instrumentOperationAsVsCodeCommand(Commands.VIEW_MODERNIZE_JAVA_PROJECT, async () => { - await checkOrPromptToInstallAppModExtension( + await checkOrPopupToInstallAppModExtensionForModernization( ExtensionName.APP_MODERNIZATION_FOR_JAVA, - "Install GitHub Copilot app modernization to modernize the Java project.", + `${ExtensionName.APP_MODERNIZATION_EXTENSION_NAME} extension is required to modernize Java projects. Would you like to install it and modernize this project?`, "Install Extension and Modernize"); await commands.executeCommand("workbench.view.extension.azureJavaMigrationExplorer"); })); diff --git a/src/upgrade/utility.ts b/src/upgrade/utility.ts index b14bb81b..09588801 100644 --- a/src/upgrade/utility.ts +++ b/src/upgrade/utility.ts @@ -5,6 +5,7 @@ import { commands, extensions, Uri, window } from "vscode"; import * as semver from "semver"; import { UpgradeReason, type UpgradeIssue } from "./type"; import { ExtensionName, Upgrade } from "../constants"; +import { instrumentOperation } from "vscode-extension-telemetry-wrapper"; function findEolDate(currentVersion: string, eolDate: Record): string | null { @@ -74,24 +75,27 @@ export function normalizePath(path: string): string { return Uri.parse(path).toString(); } -async function checkOrPromptToEnableAppModExtension() { +async function checkOrPromptToEnableAppModExtension(keyword: string) { if (extensions.getExtension(ExtensionName.APP_MODERNIZATION_FOR_JAVA)) { return; } - // The extension is disabled if we cannot detect the extension after installing it. - await commands.executeCommand("workbench.extensions.search", ExtensionName.APP_MODERNIZATION_FOR_JAVA); - const BTN_TEXT = "Show extension in sidebar"; - const choice2 = await window.showInformationMessage( - `${ExtensionName.APP_MODERNIZATION_EXTENSION_NAME} extension is needed for the feature to work but it seems disabled. Please enable it manually and try again.`, - BTN_TEXT - ); - if (choice2 === BTN_TEXT) { + // The extension is in a disabled state since we cannot detect the extension after installing it. + await instrumentOperation("java.dependency.extensionDisabled", async () => { await commands.executeCommand("workbench.extensions.search", ExtensionName.APP_MODERNIZATION_FOR_JAVA); - } + const BTN_TEXT = "Show extension in sidebar"; + const choice2 = await window.showInformationMessage( + `${ExtensionName.APP_MODERNIZATION_EXTENSION_NAME} extension is required to ${keyword} Java projects but it seems disabled. Please enable it manually and try again.`, + { modal: true }, + BTN_TEXT + ); + if (choice2 === BTN_TEXT) { + await commands.executeCommand("workbench.extensions.search", ExtensionName.APP_MODERNIZATION_FOR_JAVA); + } + })(); } -export async function checkOrPromptToInstallAppModExtension( +export async function checkOrPopupToInstallAppModExtensionForModernization( extensionIdToCheck: string, notificationText: string, buttonText: string): Promise { @@ -99,22 +103,22 @@ export async function checkOrPromptToInstallAppModExtension( return; } - const choice = await window.showInformationMessage(notificationText, buttonText); + const choice = await window.showInformationMessage(notificationText, { modal: true }, buttonText); if (choice === buttonText) { await commands.executeCommand("workbench.extensions.installExtension", ExtensionName.APP_MODERNIZATION_FOR_JAVA); } else { return; } - await checkOrPromptToEnableAppModExtension(); + await checkOrPromptToEnableAppModExtension("modernize"); } -export async function checkOrInstallAppModExtension( +export async function checkOrInstallAppModExtensionForUpgrade( extensionIdToCheck: string): Promise { if (extensions.getExtension(extensionIdToCheck)) { return; } await commands.executeCommand("workbench.extensions.installExtension", ExtensionName.APP_MODERNIZATION_FOR_JAVA); - await checkOrPromptToEnableAppModExtension(); + await checkOrPromptToEnableAppModExtension("upgrade"); } \ No newline at end of file From eb89297a6ecebdcb5a753459c334a24db0f5736c Mon Sep 17 00:00:00 2001 From: wenyt <75360946+wenytang-ms@users.noreply.github.com> Date: Sun, 28 Sep 2025 09:22:41 +0800 Subject: [PATCH 235/352] feat: add getImportClassContent method to collect import class info (#907) * feat: add getImportClassContent method to collect import class info * feat: update the java command * fix: update findtype to more useable * fix: update * fix: update logic to resolve type * feat: support static import * feat: adjust logic and bump up version --- .../com.microsoft.jdtls.ext.core/plugin.xml | 1 + .../jdtls/ext/core/CommandHandler.java | 2 + .../jdtls/ext/core/ProjectCommand.java | 506 +++++++++++++++++- package-lock.json | 2 +- package.json | 2 +- 5 files changed, 497 insertions(+), 16 deletions(-) diff --git a/jdtls.ext/com.microsoft.jdtls.ext.core/plugin.xml b/jdtls.ext/com.microsoft.jdtls.ext.core/plugin.xml index 0352e983..6643c1a7 100644 --- a/jdtls.ext/com.microsoft.jdtls.ext.core/plugin.xml +++ b/jdtls.ext/com.microsoft.jdtls.ext.core/plugin.xml @@ -10,6 +10,7 @@ + arguments, IProgress return ProjectCommand.exportJar(arguments, monitor); case "java.project.checkImportStatus": return ProjectCommand.checkImportStatus(); + case "java.project.getImportClassContent": + return ProjectCommand.getImportClassContent(arguments, monitor); default: break; } diff --git a/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/ProjectCommand.java b/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/ProjectCommand.java index 3f10d3e6..aad11b68 100644 --- a/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/ProjectCommand.java +++ b/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/ProjectCommand.java @@ -42,7 +42,6 @@ import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.MultiStatus; -import org.eclipse.core.runtime.NullProgressMonitor; import org.eclipse.core.runtime.OperationCanceledException; import org.eclipse.core.runtime.Path; import org.eclipse.jdt.core.IJavaElement; @@ -66,7 +65,6 @@ import org.eclipse.jdt.ls.core.internal.managers.ProjectsManager; import org.eclipse.jdt.ls.core.internal.managers.UpdateClasspathJob; import org.eclipse.jdt.ls.core.internal.preferences.Preferences.ReferencedLibraries; -import org.eclipse.jdt.ls.core.internal.preferences.Preferences.SearchScope; import org.eclipse.lsp4j.jsonrpc.json.adapters.CollectionTypeAdapter; import org.eclipse.lsp4j.jsonrpc.json.adapters.EnumTypeAdapter; @@ -88,6 +86,16 @@ public MainClassInfo(String name, String path) { } } + private static class ImportClassInfo { + public String uri; + public String className; + + public ImportClassInfo(String uri, String className) { + this.uri = uri; + this.className = className; + } + } + private static class Classpath { public String source; public String destination; @@ -110,7 +118,7 @@ public static List listProjects(List arguments, IProgressMo projects = ProjectUtils.getAllProjects(); } else { projects = Arrays.stream(ProjectUtils.getJavaProjects()) - .map(IJavaProject::getProject).toArray(IProject[]::new); + .map(IJavaProject::getProject).toArray(IProject[]::new); } ArrayList children = new ArrayList<>(); @@ -202,11 +210,14 @@ private static boolean exportJarExecution(String mainClass, Classpath[] classpat } if (classpath.isArtifact) { MultiStatus resultStatus = writeArchive(new ZipFile(classpath.source), - /* areDirectoryEntriesIncluded = */true, /* isCompressed = */true, target, directories, monitor); + /* areDirectoryEntriesIncluded = */true, /* isCompressed = */true, target, directories, + monitor); int severity = resultStatus.getSeverity(); if (severity == IStatus.OK) { java.nio.file.Path path = java.nio.file.Paths.get(classpath.source); - reportExportJarMessage(terminalId, IStatus.OK, "Successfully extracted the file to the exported jar: " + path.getFileName().toString()); + reportExportJarMessage(terminalId, IStatus.OK, + "Successfully extracted the file to the exported jar: " + + path.getFileName().toString()); continue; } if (resultStatus.isMultiStatus()) { @@ -218,9 +229,13 @@ private static boolean exportJarExecution(String mainClass, Classpath[] classpat } } else { try { - writeFile(new File(classpath.source), new Path(classpath.destination), /* areDirectoryEntriesIncluded = */true, - /* isCompressed = */true, target, directories); - reportExportJarMessage(terminalId, IStatus.OK, "Successfully added the file to the exported jar: " + classpath.destination); + writeFile(new File(classpath.source), new Path(classpath.destination), /* + * areDirectoryEntriesIncluded + * = + */true, + /* isCompressed = */true, target, directories); + reportExportJarMessage(terminalId, IStatus.OK, + "Successfully added the file to the exported jar: " + classpath.destination); } catch (CoreException e) { reportExportJarMessage(terminalId, IStatus.ERROR, e.getMessage()); } @@ -233,7 +248,8 @@ private static boolean exportJarExecution(String mainClass, Classpath[] classpat return true; } - public static List getMainClasses(List arguments, IProgressMonitor monitor) throws Exception { + public static List getMainClasses(List arguments, IProgressMonitor monitor) + throws Exception { List args = new ArrayList<>(arguments); if (args.size() <= 1) { args.add(Boolean.TRUE); @@ -246,7 +262,7 @@ public static List getMainClasses(List arguments, IProgre } final List res = new ArrayList<>(); List javaProjects = new ArrayList<>(); - for (PackageNode project: projectList) { + for (PackageNode project : projectList) { IJavaProject javaProject = PackageCommand.getJavaProject(project.getUri()); if (javaProject != null && javaProject.exists()) { javaProjects.add(javaProject); @@ -254,7 +270,7 @@ public static List getMainClasses(List arguments, IProgre } int includeMask = IJavaSearchScope.SOURCES; IJavaSearchScope scope = SearchEngine.createJavaSearchScope(javaProjects.toArray(new IJavaProject[0]), - includeMask); + includeMask); SearchPattern pattern1 = SearchPattern.createPattern("main(String[]) void", IJavaSearchConstants.METHOD, IJavaSearchConstants.DECLARATIONS, SearchPattern.R_CASE_SENSITIVE | SearchPattern.R_EXACT_MATCH); SearchPattern pattern2 = SearchPattern.createPattern("main() void", IJavaSearchConstants.METHOD, @@ -285,7 +301,7 @@ public void acceptSearchMatch(SearchMatch match) { }; SearchEngine searchEngine = new SearchEngine(); try { - searchEngine.search(pattern, new SearchParticipant[] {SearchEngine.getDefaultSearchParticipant()}, scope, + searchEngine.search(pattern, new SearchParticipant[] { SearchEngine.getDefaultSearchParticipant() }, scope, requestor, monitor); } catch (CoreException e) { // ignore @@ -332,11 +348,473 @@ public static boolean checkImportStatus() { return hasError; } + public static ImportClassInfo[] getImportClassContent(List arguments, IProgressMonitor monitor) { + if (arguments == null || arguments.isEmpty()) { + return new ImportClassInfo[0]; + } + + try { + String fileUri = (String) arguments.get(0); + + // Parse URI manually to avoid restricted API + java.net.URI uri = new java.net.URI(fileUri); + String filePath = uri.getPath(); + if (filePath == null) { + return new ImportClassInfo[0]; + } + + IPath path = new Path(filePath); + + // Get the file resource + IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot(); + IFile file = root.getFileForLocation(path); + if (file == null || !file.exists()) { + return new ImportClassInfo[0]; + } + + // Get the Java project + IJavaProject javaProject = JavaCore.create(file.getProject()); + if (javaProject == null || !javaProject.exists()) { + return new ImportClassInfo[0]; + } + + // Find the compilation unit + IJavaElement javaElement = JavaCore.create(file); + if (!(javaElement instanceof org.eclipse.jdt.core.ICompilationUnit)) { + return new ImportClassInfo[0]; + } + + org.eclipse.jdt.core.ICompilationUnit compilationUnit = (org.eclipse.jdt.core.ICompilationUnit) javaElement; + + // Parse imports and resolve local project files + List result = new ArrayList<>(); + + // Get all imports from the compilation unit + org.eclipse.jdt.core.IImportDeclaration[] imports = compilationUnit.getImports(); + Set processedTypes = new HashSet<>(); + + for (org.eclipse.jdt.core.IImportDeclaration importDecl : imports) { + if (monitor.isCanceled()) { + break; + } + + String importName = importDecl.getElementName(); + boolean isStatic = (importDecl.getFlags() & org.eclipse.jdt.core.Flags.AccStatic) != 0; + + if (isStatic) { + // Handle static imports + resolveStaticImport(javaProject, importName, result, processedTypes); + } else if (importName.endsWith(".*")) { + // Handle package imports + String packageName = importName.substring(0, importName.length() - 2); + resolvePackageTypes(javaProject, packageName, result, processedTypes); + } else { + // Handle single type imports + resolveSingleType(javaProject, importName, result, processedTypes); + } + } + + return result.toArray(new ImportClassInfo[0]); + + } catch (Exception e) { + JdtlsExtActivator.logException("Error in resolveCopilotRequest", e); + return new ImportClassInfo[0]; + } + } + + private static void resolveSingleType(IJavaProject javaProject, String typeName, List result, + Set processedTypes) { + try { + if (processedTypes.contains(typeName)) { + return; + } + processedTypes.add(typeName); + + // Extract package and simple name from the fully qualified type name + int lastDotIndex = typeName.lastIndexOf('.'); + if (lastDotIndex == -1) { + // Default package or invalid type name + return; + } + + String packageName = typeName.substring(0, lastDotIndex); + String simpleName = typeName.substring(lastDotIndex + 1); + + // Strategy: Use JDT's global type resolution first (comprehensive), + // then fallback to manual package fragment traversal if needed + + // Primary path: Use JDT's findType which searches all sources and dependencies + try { + org.eclipse.jdt.core.IType type = javaProject.findType(typeName); + if (type != null && type.exists()) { + // Found type - check if it's a source type we want to process + if (!type.isBinary()) { + // Source type found - extract information and return + extractTypeInfo(type, result); + return; + } + // Note: Binary types (from JARs/JRE) are intentionally ignored + // as they don't provide useful context for code completion + } + } catch (JavaModelException e) { + JdtlsExtActivator.logException("Error in primary type search: " + typeName, e); + // Continue to fallback method + } + + // Fallback path: Manual search in local source package fragments + // This is used when findType() doesn't return results or fails + IPackageFragmentRoot[] packageRoots = javaProject.getPackageFragmentRoots(); + for (IPackageFragmentRoot packageRoot : packageRoots) { + if (packageRoot.getKind() == IPackageFragmentRoot.K_SOURCE) { + org.eclipse.jdt.core.IPackageFragment packageFragment = packageRoot.getPackageFragment(packageName); + if (packageFragment != null && packageFragment.exists()) { + // Look for compilation unit with matching name + org.eclipse.jdt.core.ICompilationUnit cu = packageFragment.getCompilationUnit(simpleName + ".java"); + if (cu != null && cu.exists() && cu.getResource() != null && cu.getResource().exists()) { + // Get primary type from compilation unit + org.eclipse.jdt.core.IType primaryType = cu.findPrimaryType(); + if (primaryType != null && primaryType.exists() && + typeName.equals(primaryType.getFullyQualifiedName())) { + // Found local project source type via fallback method + extractTypeInfo(primaryType, result); + return; + } + + // Also check for inner types in the compilation unit + org.eclipse.jdt.core.IType[] allTypes = cu.getAllTypes(); + for (org.eclipse.jdt.core.IType type : allTypes) { + if (typeName.equals(type.getFullyQualifiedName())) { + extractTypeInfo(type, result); + return; + } + } + } + } + } + } + } catch (JavaModelException e) { + // Log but continue processing other types + JdtlsExtActivator.logException("Error resolving type: " + typeName, e); + } + } + + private static void resolveStaticImport(IJavaProject javaProject, String staticImportName, List result, + Set processedTypes) { + try { + if (staticImportName.endsWith(".*")) { + // Static import of all static members from a class: import static MyClass.*; + String className = staticImportName.substring(0, staticImportName.length() - 2); + resolveStaticMembersFromClass(javaProject, className, result, processedTypes); + } else { + // Static import of specific member: import static MyClass.myMethod; + int lastDotIndex = staticImportName.lastIndexOf('.'); + if (lastDotIndex > 0) { + String className = staticImportName.substring(0, lastDotIndex); + String memberName = staticImportName.substring(lastDotIndex + 1); + resolveStaticMemberFromClass(javaProject, className, memberName, result, processedTypes); + } + } + } catch (Exception e) { + JdtlsExtActivator.logException("Error resolving static import: " + staticImportName, e); + } + } + + private static void resolveStaticMembersFromClass(IJavaProject javaProject, String className, + List result, Set processedTypes) { + try { + // First resolve the class itself to get context information + resolveSingleType(javaProject, className, result, processedTypes); + + // Find the type and extract its static members + org.eclipse.jdt.core.IType type = javaProject.findType(className); + if (type != null && type.exists() && !type.isBinary()) { + String staticMemberInfo = "staticImport:" + className + ".*"; + + // Add information about available static members + List staticMembers = new ArrayList<>(); + + // Get static methods + IMethod[] methods = type.getMethods(); + for (IMethod method : methods) { + int flags = method.getFlags(); + if (org.eclipse.jdt.core.Flags.isStatic(flags) && org.eclipse.jdt.core.Flags.isPublic(flags)) { + staticMembers.add("method:" + method.getElementName() + getParameterTypes(method)); + } + } + + // Get static fields + org.eclipse.jdt.core.IField[] fields = type.getFields(); + for (org.eclipse.jdt.core.IField field : fields) { + int flags = field.getFlags(); + if (org.eclipse.jdt.core.Flags.isStatic(flags) && org.eclipse.jdt.core.Flags.isPublic(flags)) { + staticMembers.add("field:" + field.getElementName()); + } + } + + if (!staticMembers.isEmpty()) { + staticMemberInfo += "|members:" + String.join(",", staticMembers.subList(0, Math.min(staticMembers.size(), 10))); + } + + String uri = getTypeUri(type); + if (uri != null) { + result.add(new ImportClassInfo(uri, staticMemberInfo)); + } + } + } catch (JavaModelException e) { + JdtlsExtActivator.logException("Error resolving static members from: " + className, e); + } + } + + private static void resolveStaticMemberFromClass(IJavaProject javaProject, String className, String memberName, + List result, Set processedTypes) { + try { + // First resolve the class itself + resolveSingleType(javaProject, className, result, processedTypes); + + // Find the specific static member + org.eclipse.jdt.core.IType type = javaProject.findType(className); + if (type != null && type.exists() && !type.isBinary()) { + String memberInfo = "staticImport:" + className + "." + memberName; + + // Check if it's a method + IMethod[] methods = type.getMethods(); + for (IMethod method : methods) { + if (method.getElementName().equals(memberName)) { + int flags = method.getFlags(); + if (org.eclipse.jdt.core.Flags.isStatic(flags)) { + memberInfo += "|type:method" + getParameterTypes(method); + break; + } + } + } + + // Check if it's a field + org.eclipse.jdt.core.IField[] fields = type.getFields(); + for (org.eclipse.jdt.core.IField field : fields) { + if (field.getElementName().equals(memberName)) { + int flags = field.getFlags(); + if (org.eclipse.jdt.core.Flags.isStatic(flags)) { + memberInfo += "|type:field"; + break; + } + } + } + + String uri = getTypeUri(type); + if (uri != null) { + result.add(new ImportClassInfo(uri, memberInfo)); + } + } + } catch (JavaModelException e) { + JdtlsExtActivator.logException("Error resolving static member: " + className + "." + memberName, e); + } + } + + private static void resolvePackageTypes(IJavaProject javaProject, String packageName, List result, + Set processedTypes) { + try { + // Find all package fragments with this name + IPackageFragmentRoot[] packageRoots = javaProject.getPackageFragmentRoots(); + for (IPackageFragmentRoot packageRoot : packageRoots) { + if (packageRoot.getKind() == IPackageFragmentRoot.K_SOURCE) { + org.eclipse.jdt.core.IPackageFragment packageFragment = packageRoot.getPackageFragment(packageName); + if (packageFragment != null && packageFragment.exists()) { + // Get all compilation units in this package + org.eclipse.jdt.core.ICompilationUnit[] compilationUnits = packageFragment + .getCompilationUnits(); + for (org.eclipse.jdt.core.ICompilationUnit cu : compilationUnits) { + // Get all types in the compilation unit + org.eclipse.jdt.core.IType[] types = cu.getAllTypes(); + for (org.eclipse.jdt.core.IType type : types) { + String fullTypeName = type.getFullyQualifiedName(); + if (!processedTypes.contains(fullTypeName)) { + processedTypes.add(fullTypeName); + extractTypeInfo(type, result); + } + } + } + } + } + } + } catch (JavaModelException e) { + // Log but continue processing + JdtlsExtActivator.logException("Error resolving package: " + packageName, e); + } + } + + private static void extractTypeInfo(org.eclipse.jdt.core.IType type, List result) { + try { + String typeName = type.getFullyQualifiedName(); + String typeInfo = ""; + + // Determine type kind + if (type.isInterface()) { + typeInfo = "interface:" + typeName; + } else if (type.isClass()) { + extractDetailedClassInfo(type, result); + return; // extractDetailedClassInfo handles adding to result + } else if (type.isEnum()) { + typeInfo = "enum:" + typeName; + } else if (type.isAnnotation()) { + typeInfo = "annotation:" + typeName; + } else { + typeInfo = "type:" + typeName; + } + + // Get URI for this type + String uri = getTypeUri(type); + if (uri != null) { + result.add(new ImportClassInfo(uri, typeInfo)); + } + + // Also add nested types + org.eclipse.jdt.core.IType[] nestedTypes = type.getTypes(); + for (org.eclipse.jdt.core.IType nestedType : nestedTypes) { + extractTypeInfo(nestedType, result); + } + + } catch (JavaModelException e) { + // Log but continue processing other types + JdtlsExtActivator.logException("Error extracting type info for: " + type.getElementName(), e); + } + } + + private static void extractDetailedClassInfo(org.eclipse.jdt.core.IType type, List result) { + try { + if (!type.isClass()) { + return; // Only process classes + } + + String className = type.getFullyQualifiedName(); + List classDetails = new ArrayList<>(); + + // 1. Class declaration information + classDetails.add("class:" + className); + + // 2. Modifiers + int flags = type.getFlags(); + List modifiers = new ArrayList<>(); + if (org.eclipse.jdt.core.Flags.isPublic(flags)) + modifiers.add("public"); + if (org.eclipse.jdt.core.Flags.isAbstract(flags)) + modifiers.add("abstract"); + if (org.eclipse.jdt.core.Flags.isFinal(flags)) + modifiers.add("final"); + if (org.eclipse.jdt.core.Flags.isStatic(flags)) + modifiers.add("static"); + if (!modifiers.isEmpty()) { + classDetails.add("modifiers:" + String.join(",", modifiers)); + } + + // 3. Inheritance + String superclass = type.getSuperclassName(); + if (superclass != null && !"Object".equals(superclass)) { + classDetails.add("extends:" + superclass); + } + + // 4. Implemented interfaces + String[] interfaces = type.getSuperInterfaceNames(); + if (interfaces.length > 0) { + classDetails.add("implements:" + String.join(",", interfaces)); + } + + // 5. Constructors + IMethod[] methods = type.getMethods(); + List constructors = new ArrayList<>(); + List publicMethods = new ArrayList<>(); + + for (IMethod method : methods) { + if (method.isConstructor()) { + constructors.add(method.getElementName() + getParameterTypes(method)); + } else if (org.eclipse.jdt.core.Flags.isPublic(method.getFlags())) { + publicMethods.add(method.getElementName() + getParameterTypes(method)); + } + } + + if (!constructors.isEmpty()) { + classDetails.add("constructors:" + String.join(",", constructors)); + } + + if (!publicMethods.isEmpty()) { + classDetails.add("publicMethods:" + + String.join(",", publicMethods.subList(0, Math.min(publicMethods.size(), 10)))); + } + + // 6. Public fields + org.eclipse.jdt.core.IField[] fields = type.getFields(); + List publicFields = new ArrayList<>(); + for (org.eclipse.jdt.core.IField field : fields) { + if (org.eclipse.jdt.core.Flags.isPublic(field.getFlags())) { + publicFields.add(field.getElementName()); + } + } + + if (!publicFields.isEmpty()) { + classDetails.add("publicFields:" + String.join(",", publicFields)); + } + + // Get URI for this type + String uri = getTypeUri(type); + if (uri != null) { + // Combine all information into one string + String classInfo = String.join("|", classDetails); + result.add(new ImportClassInfo(uri, classInfo)); + } + + } catch (JavaModelException e) { + JdtlsExtActivator.logException("Error extracting detailed class info", e); + } + } + + // Helper method: Get file URI/path for the type (instead of fully qualified class name) + private static String getTypeUri(org.eclipse.jdt.core.IType type) { + try { + // Get the compilation unit that contains this type + org.eclipse.jdt.core.ICompilationUnit compilationUnit = type.getCompilationUnit(); + if (compilationUnit != null) { + // Get the underlying resource (file) + org.eclipse.core.resources.IResource resource = compilationUnit.getUnderlyingResource(); + if (resource != null && resource instanceof org.eclipse.core.resources.IFile) { + org.eclipse.core.resources.IFile file = (org.eclipse.core.resources.IFile) resource; + // Get the file location as a file URI + java.net.URI fileUri = file.getLocationURI(); + if (fileUri != null) { + return fileUri.toString(); + } + + // Fallback: use workspace-relative path as URI + return file.getFullPath().toString(); + } + } + + // Fallback: if we can't get file URI, return the fully qualified class name + // This should rarely happen for source types + return type.getFullyQualifiedName(); + } catch (Exception e) { + JdtlsExtActivator.logException("Error getting file URI for type: " + type.getElementName(), e); + // Fallback to class name in case of error + try { + return type.getFullyQualifiedName(); + } catch (Exception e2) { + return null; + } + } + } + + // Helper method: Get method parameter types + private static String getParameterTypes(IMethod method) { + String[] paramTypes = method.getParameterTypes(); + if (paramTypes.length == 0) { + return "()"; + } + return "(" + String.join(",", paramTypes) + ")"; + } + private static void reportExportJarMessage(String terminalId, int severity, String message) { if (StringUtils.isNotBlank(message) && StringUtils.isNotBlank(terminalId)) { String readableSeverity = getSeverityString(severity); JavaLanguageServerPlugin.getInstance().getClientConnection().executeClientCommand(COMMAND_EXPORT_JAR_REPORT, - terminalId, "[" + readableSeverity + "] " + message); + terminalId, "[" + readableSeverity + "] " + message); } } @@ -392,4 +870,4 @@ public boolean isBelongsToWorkspace() { return belongsToWorkspace; } } -} +} \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 02feb80c..3be5c70b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "vscode-java-dependency", - "version": "0.25.2", + "version": "0.26.0", "lockfileVersion": 2, "requires": true, "packages": { diff --git a/package.json b/package.json index 118693fb..564e86e4 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "vscode-java-dependency", "displayName": "Project Manager for Java", "description": "%description%", - "version": "0.25.2", + "version": "0.26.0", "publisher": "vscjava", "preview": false, "aiKey": "5c642b22-e845-4400-badb-3f8509a70777", From cb650091f37437736696c6424aa89ef565f59ce4 Mon Sep 17 00:00:00 2001 From: Ray Sun <202210574+FluoriteCafe-work@users.noreply.github.com> Date: Thu, 9 Oct 2025 16:54:06 +0800 Subject: [PATCH 236/352] Calculate package version range for upgrade (#910) * chore: add telemetry pre notification response * feat: check version range on in-scope groupIds * chore: lint * chore: update `operationName` on notification display Co-authored-by: Miller Wang <69189193+wangmingliang-ms@users.noreply.github.com> * chore: separate the check flows * fix: return an object rather than array * chore: lint * chore: rename opName for clarity * fix: Java version data --------- Co-authored-by: Miller Wang <69189193+wangmingliang-ms@users.noreply.github.com> --- src/upgrade/assessmentManager.ts | 91 +++++++++++++++++----- src/upgrade/display/notificationManager.ts | 4 + src/upgrade/type.ts | 8 +- 3 files changed, 84 insertions(+), 19 deletions(-) diff --git a/src/upgrade/assessmentManager.ts b/src/upgrade/assessmentManager.ts index 1a361460..7135a57b 100644 --- a/src/upgrade/assessmentManager.ts +++ b/src/upgrade/assessmentManager.ts @@ -4,13 +4,45 @@ import * as semver from 'semver'; import { Jdtls } from "../java/jdtls"; import { NodeKind, type INodeData } from "../java/nodeData"; -import { type DependencyCheckItem, UpgradeReason, type UpgradeIssue } from "./type"; +import { type DependencyCheckItem, type UpgradeIssue, type PackageDescription, UpgradeReason } from "./type"; import { DEPENDENCY_JAVA_RUNTIME } from "./dependency.metadata"; import { Upgrade } from '../constants'; import { buildPackageId } from './utility'; import metadataManager from './metadataManager'; import { sendInfo } from 'vscode-extension-telemetry-wrapper'; +function packageNodeToDescription(node: INodeData): PackageDescription | null { + const version = node.metaData?.["maven.version"]; + const groupId = node.metaData?.["maven.groupId"]; + const artifactId = node.metaData?.["maven.artifactId"]; + if (!version || !groupId || !artifactId) { + return null; + } + + return { version, groupId, artifactId }; +} + +function getVersionRange(versions: Set) : string { + const versionList = [...versions].sort((a, b) => semver.compare(a, b)); + if (versionList.length === 1) { + return versionList[0]; + } + return `${versionList[0]}|${versionList[versionList.length - 1]}`; +} + +function collectVersionRange(pkgs: PackageDescription[]): Record { + const versionMap: Record> = {}; + for (const pkg of pkgs) { + const groupId = pkg.groupId; + if (!versionMap[groupId]) { + versionMap[groupId] = new Set(); + } + versionMap[groupId].add(pkg.version); + } + + return Object.fromEntries(Object.entries(versionMap).map(([groupId, versions]) => [groupId, getVersionRange(versions)])); +} + function getJavaIssues(data: INodeData): UpgradeIssue[] { const javaVersion = data.metaData?.MaxSourceVersion as number | undefined; const { name, supportedVersion } = DEPENDENCY_JAVA_RUNTIME; @@ -18,6 +50,19 @@ function getJavaIssues(data: INodeData): UpgradeIssue[] { return []; } const currentSemVer = semver.coerce(javaVersion); + + const [javaRuntimeGroupId, javaRuntimeArtifactId] = Upgrade.PACKAGE_ID_FOR_JAVA_RUNTIME.split(":"); + sendInfo("", { + operationName: "java.dependency.assessmentManager.getJavaVersionRange", + versionRangeByGroupId: JSON.stringify( + collectVersionRange([{ + groupId: javaRuntimeGroupId, + artifactId: javaRuntimeArtifactId, + version: String(javaVersion), + }]), + ), + }); + if (currentSemVer && !semver.satisfies(currentSemVer, supportedVersion)) { return [{ ...DEPENDENCY_JAVA_RUNTIME, @@ -31,7 +76,7 @@ function getJavaIssues(data: INodeData): UpgradeIssue[] { } function getUpgradeForDependency(versionString: string, supportedVersionDefinition: DependencyCheckItem, packageId: string): UpgradeIssue | null { - const { reason } = supportedVersionDefinition; + const reason = supportedVersionDefinition.reason; switch (reason) { case UpgradeReason.DEPRECATED: { return { @@ -59,17 +104,21 @@ function getUpgradeForDependency(versionString: string, supportedVersionDefiniti return null; } -function getDependencyIssue(data: INodeData): UpgradeIssue | null { - const versionString = data.metaData?.["maven.version"]; - const groupId = data.metaData?.["maven.groupId"]; - const artifactId = data.metaData?.["maven.artifactId"]; +function getPackageUpgradeMetadata(pkg: PackageDescription): DependencyCheckItem | null { + const { groupId, artifactId } = pkg; const packageId = buildPackageId(groupId, artifactId); - const supportedVersionDefinition = metadataManager.getMetadataById(packageId); - if (!versionString || !groupId || !supportedVersionDefinition) { + return metadataManager.getMetadataById(packageId) ?? null; +} + +function getDependencyIssue(pkg: PackageDescription): UpgradeIssue | null { + const supportedVersionDefinition = getPackageUpgradeMetadata(pkg); + const version = pkg.version; + if (!version || !supportedVersionDefinition) { return null; } - - return getUpgradeForDependency(versionString, supportedVersionDefinition, packageId); + const { groupId, artifactId } = pkg; + const packageId = buildPackageId(groupId, artifactId); + return getUpgradeForDependency(version, supportedVersionDefinition, packageId); } async function getDependencyIssues(projectNode: INodeData): Promise { @@ -78,13 +127,23 @@ async function getDependencyIssues(projectNode: INodeData): Promise x.kind === NodeKind.Container) .map(async (packageContainer) => { - const packages = await Jdtls.getPackageData({ + const packageNodes = await Jdtls.getPackageData({ kind: NodeKind.Container, projectUri: projectNode.uri, path: packageContainer.path, }); - - return packages.map(getDependencyIssue).filter((x): x is UpgradeIssue => Boolean(x)); + const packages = packageNodes.map(packageNodeToDescription).filter((x): x is PackageDescription => Boolean(x)); + + const issues = packages.map(getDependencyIssue).filter((x): x is UpgradeIssue => Boolean(x)); + const versionRangeByGroupId = collectVersionRange(packages.filter(getPackageUpgradeMetadata)); + if (Object.keys(versionRangeByGroupId).length > 0) { + sendInfo("", { + operationName: "java.dependency.assessmentManager.getDependencyVersionRange", + versionRangeByGroupId: JSON.stringify(versionRangeByGroupId), + }); + } + + return issues; }) ); @@ -95,7 +154,7 @@ async function getDependencyIssues(projectNode: INodeData): Promise { const issues = await getProjectIssues(projectNode); - sendInfo("", { - operationName: "java.dependency.assessmentManager.getWorkspaceIssues", - issuesFoundForPackageId: JSON.stringify(issues.map(x => `${x.packageId}:${x.currentVersion}`)), - }); return issues; })); diff --git a/src/upgrade/display/notificationManager.ts b/src/upgrade/display/notificationManager.ts index c597e746..22e4a9ef 100644 --- a/src/upgrade/display/notificationManager.ts +++ b/src/upgrade/display/notificationManager.ts @@ -53,6 +53,10 @@ class NotificationManager implements IUpgradeIssuesRenderer { const prompt = buildFixPrompt(issue); const notificationMessage = buildNotificationMessage(issue, hasExtension); const upgradeButtonText = hasExtension ? BUTTON_TEXT_UPGRADE : BUTTON_TEXT_INSTALL_AND_UPGRADE; + + sendInfo(operationId, { + operationName: "java.dependency.upgradeNotification.show", + }); const selection = await window.showInformationMessage( notificationMessage, upgradeButtonText, diff --git a/src/upgrade/type.ts b/src/upgrade/type.ts index 82105fb0..f64c1fdc 100644 --- a/src/upgrade/type.ts +++ b/src/upgrade/type.ts @@ -28,4 +28,10 @@ export type UpgradeIssue = { export interface IUpgradeIssuesRenderer { render(issues: UpgradeIssue[]): void; -} \ No newline at end of file +} + +export type PackageDescription = { + groupId: string; + artifactId: string; + version: string; +}; \ No newline at end of file From f4d4fe124162445a4f6056a110ed09b3edd90ef3 Mon Sep 17 00:00:00 2001 From: Ray Sun <202210574+FluoriteCafe-work@users.noreply.github.com> Date: Fri, 10 Oct 2025 11:07:49 +0800 Subject: [PATCH 237/352] Release 0.26.1 (#915) * chore: bump to 0.26.1 * docs: update CHANGELOG.md --- CHANGELOG.md | 8 ++++++++ package-lock.json | 4 ++-- package.json | 2 +- 3 files changed, 11 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d763d838..c165ef1a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,14 @@ All notable changes to the "vscode-java-dependency" extension will be documented The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/) and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html). +## 0.26.1 + +- fix - Calculate package version range for upgrade by @FluoriteCafe-work in https://github.com/microsoft/vscode-java-dependency/pull/910 + +## 0.26.0 + +- feat - Add getImportClassContent method to collect import class info by @wenytang-ms in https://github.com/microsoft/vscode-java-dependency/pull/907 + ## 0.25.2 - ux - Improve wording on project modernization by @FluoriteCafe-work in https://github.com/microsoft/vscode-java-dependency/pull/912 diff --git a/package-lock.json b/package-lock.json index 3be5c70b..5863a3aa 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "vscode-java-dependency", - "version": "0.26.0", + "version": "0.26.1", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "vscode-java-dependency", - "version": "0.25.2", + "version": "0.26.1", "license": "MIT", "dependencies": { "await-lock": "^2.2.2", diff --git a/package.json b/package.json index 564e86e4..217d60d7 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "vscode-java-dependency", "displayName": "Project Manager for Java", "description": "%description%", - "version": "0.26.0", + "version": "0.26.1", "publisher": "vscjava", "preview": false, "aiKey": "5c642b22-e845-4400-badb-3f8509a70777", From c424e64ebc8e9302ae8d1845ad7894007077bb74 Mon Sep 17 00:00:00 2001 From: wenyt <75360946+wenytang-ms@users.noreply.github.com> Date: Fri, 17 Oct 2025 11:38:25 +0800 Subject: [PATCH 238/352] feat: adjust the format of context with javadoc (#918) * feat: adjust the format of context with javadoc * feat: update * feat: update the method * feat: add interface describ --- .../jdtls/ext/core/ProjectCommand.java | 442 +------ .../ext/core/parser/ContextResolver.java | 1094 +++++++++++++++++ 2 files changed, 1122 insertions(+), 414 deletions(-) create mode 100644 jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/parser/ContextResolver.java diff --git a/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/ProjectCommand.java b/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/ProjectCommand.java index aad11b68..df41a432 100644 --- a/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/ProjectCommand.java +++ b/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/ProjectCommand.java @@ -48,7 +48,6 @@ import org.eclipse.jdt.core.IJavaProject; import org.eclipse.jdt.core.IMethod; import org.eclipse.jdt.core.IModuleDescription; -import org.eclipse.jdt.core.IPackageFragmentRoot; import org.eclipse.jdt.core.JavaCore; import org.eclipse.jdt.core.JavaModelException; import org.eclipse.jdt.core.search.IJavaSearchConstants; @@ -70,6 +69,8 @@ import com.google.gson.Gson; import com.google.gson.GsonBuilder; +import com.microsoft.jdtls.ext.core.parser.ContextResolver; +import com.microsoft.jdtls.ext.core.parser.ContextResolver.ImportClassInfo; import com.microsoft.jdtls.ext.core.model.PackageNode; public final class ProjectCommand { @@ -86,15 +87,7 @@ public MainClassInfo(String name, String path) { } } - private static class ImportClassInfo { - public String uri; - public String className; - public ImportClassInfo(String uri, String className) { - this.uri = uri; - this.className = className; - } - } private static class Classpath { public String source; @@ -348,9 +341,17 @@ public static boolean checkImportStatus() { return hasError; } - public static ImportClassInfo[] getImportClassContent(List arguments, IProgressMonitor monitor) { + /** + * Get import class content for Copilot integration. + * This method extracts information about imported classes from a Java file. + * + * @param arguments List containing the file URI as the first element + * @param monitor Progress monitor for cancellation support + * @return List of ImportClassInfo containing class information and JavaDoc + */ + public static List getImportClassContent(List arguments, IProgressMonitor monitor) { if (arguments == null || arguments.isEmpty()) { - return new ImportClassInfo[0]; + return Collections.emptyList(); } try { @@ -360,7 +361,7 @@ public static ImportClassInfo[] getImportClassContent(List arguments, IP java.net.URI uri = new java.net.URI(fileUri); String filePath = uri.getPath(); if (filePath == null) { - return new ImportClassInfo[0]; + return Collections.emptyList(); } IPath path = new Path(filePath); @@ -369,25 +370,26 @@ public static ImportClassInfo[] getImportClassContent(List arguments, IP IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot(); IFile file = root.getFileForLocation(path); if (file == null || !file.exists()) { - return new ImportClassInfo[0]; + return Collections.emptyList(); } // Get the Java project IJavaProject javaProject = JavaCore.create(file.getProject()); if (javaProject == null || !javaProject.exists()) { - return new ImportClassInfo[0]; + return Collections.emptyList(); } // Find the compilation unit IJavaElement javaElement = JavaCore.create(file); if (!(javaElement instanceof org.eclipse.jdt.core.ICompilationUnit)) { - return new ImportClassInfo[0]; + return Collections.emptyList(); } org.eclipse.jdt.core.ICompilationUnit compilationUnit = (org.eclipse.jdt.core.ICompilationUnit) javaElement; // Parse imports and resolve local project files - List result = new ArrayList<>(); + // Delegate to JavaContentParser for processing + List classInfoList = new ArrayList<>(); // Get all imports from the compilation unit org.eclipse.jdt.core.IImportDeclaration[] imports = compilationUnit.getImports(); @@ -402,412 +404,24 @@ public static ImportClassInfo[] getImportClassContent(List arguments, IP boolean isStatic = (importDecl.getFlags() & org.eclipse.jdt.core.Flags.AccStatic) != 0; if (isStatic) { - // Handle static imports - resolveStaticImport(javaProject, importName, result, processedTypes); + // Handle static imports - delegate to ContextResolver + ContextResolver.resolveStaticImport(javaProject, importName, classInfoList, processedTypes, monitor); } else if (importName.endsWith(".*")) { - // Handle package imports + // Handle package imports - delegate to ContextResolver String packageName = importName.substring(0, importName.length() - 2); - resolvePackageTypes(javaProject, packageName, result, processedTypes); + ContextResolver.resolvePackageTypes(javaProject, packageName, classInfoList, processedTypes, monitor); } else { - // Handle single type imports - resolveSingleType(javaProject, importName, result, processedTypes); - } - } - - return result.toArray(new ImportClassInfo[0]); - - } catch (Exception e) { - JdtlsExtActivator.logException("Error in resolveCopilotRequest", e); - return new ImportClassInfo[0]; - } - } - - private static void resolveSingleType(IJavaProject javaProject, String typeName, List result, - Set processedTypes) { - try { - if (processedTypes.contains(typeName)) { - return; - } - processedTypes.add(typeName); - - // Extract package and simple name from the fully qualified type name - int lastDotIndex = typeName.lastIndexOf('.'); - if (lastDotIndex == -1) { - // Default package or invalid type name - return; - } - - String packageName = typeName.substring(0, lastDotIndex); - String simpleName = typeName.substring(lastDotIndex + 1); - - // Strategy: Use JDT's global type resolution first (comprehensive), - // then fallback to manual package fragment traversal if needed - - // Primary path: Use JDT's findType which searches all sources and dependencies - try { - org.eclipse.jdt.core.IType type = javaProject.findType(typeName); - if (type != null && type.exists()) { - // Found type - check if it's a source type we want to process - if (!type.isBinary()) { - // Source type found - extract information and return - extractTypeInfo(type, result); - return; - } - // Note: Binary types (from JARs/JRE) are intentionally ignored - // as they don't provide useful context for code completion - } - } catch (JavaModelException e) { - JdtlsExtActivator.logException("Error in primary type search: " + typeName, e); - // Continue to fallback method - } - - // Fallback path: Manual search in local source package fragments - // This is used when findType() doesn't return results or fails - IPackageFragmentRoot[] packageRoots = javaProject.getPackageFragmentRoots(); - for (IPackageFragmentRoot packageRoot : packageRoots) { - if (packageRoot.getKind() == IPackageFragmentRoot.K_SOURCE) { - org.eclipse.jdt.core.IPackageFragment packageFragment = packageRoot.getPackageFragment(packageName); - if (packageFragment != null && packageFragment.exists()) { - // Look for compilation unit with matching name - org.eclipse.jdt.core.ICompilationUnit cu = packageFragment.getCompilationUnit(simpleName + ".java"); - if (cu != null && cu.exists() && cu.getResource() != null && cu.getResource().exists()) { - // Get primary type from compilation unit - org.eclipse.jdt.core.IType primaryType = cu.findPrimaryType(); - if (primaryType != null && primaryType.exists() && - typeName.equals(primaryType.getFullyQualifiedName())) { - // Found local project source type via fallback method - extractTypeInfo(primaryType, result); - return; - } - - // Also check for inner types in the compilation unit - org.eclipse.jdt.core.IType[] allTypes = cu.getAllTypes(); - for (org.eclipse.jdt.core.IType type : allTypes) { - if (typeName.equals(type.getFullyQualifiedName())) { - extractTypeInfo(type, result); - return; - } - } - } - } - } - } - } catch (JavaModelException e) { - // Log but continue processing other types - JdtlsExtActivator.logException("Error resolving type: " + typeName, e); - } - } - - private static void resolveStaticImport(IJavaProject javaProject, String staticImportName, List result, - Set processedTypes) { - try { - if (staticImportName.endsWith(".*")) { - // Static import of all static members from a class: import static MyClass.*; - String className = staticImportName.substring(0, staticImportName.length() - 2); - resolveStaticMembersFromClass(javaProject, className, result, processedTypes); - } else { - // Static import of specific member: import static MyClass.myMethod; - int lastDotIndex = staticImportName.lastIndexOf('.'); - if (lastDotIndex > 0) { - String className = staticImportName.substring(0, lastDotIndex); - String memberName = staticImportName.substring(lastDotIndex + 1); - resolveStaticMemberFromClass(javaProject, className, memberName, result, processedTypes); - } - } - } catch (Exception e) { - JdtlsExtActivator.logException("Error resolving static import: " + staticImportName, e); - } - } - - private static void resolveStaticMembersFromClass(IJavaProject javaProject, String className, - List result, Set processedTypes) { - try { - // First resolve the class itself to get context information - resolveSingleType(javaProject, className, result, processedTypes); - - // Find the type and extract its static members - org.eclipse.jdt.core.IType type = javaProject.findType(className); - if (type != null && type.exists() && !type.isBinary()) { - String staticMemberInfo = "staticImport:" + className + ".*"; - - // Add information about available static members - List staticMembers = new ArrayList<>(); - - // Get static methods - IMethod[] methods = type.getMethods(); - for (IMethod method : methods) { - int flags = method.getFlags(); - if (org.eclipse.jdt.core.Flags.isStatic(flags) && org.eclipse.jdt.core.Flags.isPublic(flags)) { - staticMembers.add("method:" + method.getElementName() + getParameterTypes(method)); - } - } - - // Get static fields - org.eclipse.jdt.core.IField[] fields = type.getFields(); - for (org.eclipse.jdt.core.IField field : fields) { - int flags = field.getFlags(); - if (org.eclipse.jdt.core.Flags.isStatic(flags) && org.eclipse.jdt.core.Flags.isPublic(flags)) { - staticMembers.add("field:" + field.getElementName()); - } - } - - if (!staticMembers.isEmpty()) { - staticMemberInfo += "|members:" + String.join(",", staticMembers.subList(0, Math.min(staticMembers.size(), 10))); - } - - String uri = getTypeUri(type); - if (uri != null) { - result.add(new ImportClassInfo(uri, staticMemberInfo)); - } - } - } catch (JavaModelException e) { - JdtlsExtActivator.logException("Error resolving static members from: " + className, e); - } - } - - private static void resolveStaticMemberFromClass(IJavaProject javaProject, String className, String memberName, - List result, Set processedTypes) { - try { - // First resolve the class itself - resolveSingleType(javaProject, className, result, processedTypes); - - // Find the specific static member - org.eclipse.jdt.core.IType type = javaProject.findType(className); - if (type != null && type.exists() && !type.isBinary()) { - String memberInfo = "staticImport:" + className + "." + memberName; - - // Check if it's a method - IMethod[] methods = type.getMethods(); - for (IMethod method : methods) { - if (method.getElementName().equals(memberName)) { - int flags = method.getFlags(); - if (org.eclipse.jdt.core.Flags.isStatic(flags)) { - memberInfo += "|type:method" + getParameterTypes(method); - break; - } - } - } - - // Check if it's a field - org.eclipse.jdt.core.IField[] fields = type.getFields(); - for (org.eclipse.jdt.core.IField field : fields) { - if (field.getElementName().equals(memberName)) { - int flags = field.getFlags(); - if (org.eclipse.jdt.core.Flags.isStatic(flags)) { - memberInfo += "|type:field"; - break; - } - } + // Handle single type imports - delegate to ContextResolver + ContextResolver.resolveSingleType(javaProject, importName, classInfoList, processedTypes, monitor); } - - String uri = getTypeUri(type); - if (uri != null) { - result.add(new ImportClassInfo(uri, memberInfo)); - } - } - } catch (JavaModelException e) { - JdtlsExtActivator.logException("Error resolving static member: " + className + "." + memberName, e); - } - } - - private static void resolvePackageTypes(IJavaProject javaProject, String packageName, List result, - Set processedTypes) { - try { - // Find all package fragments with this name - IPackageFragmentRoot[] packageRoots = javaProject.getPackageFragmentRoots(); - for (IPackageFragmentRoot packageRoot : packageRoots) { - if (packageRoot.getKind() == IPackageFragmentRoot.K_SOURCE) { - org.eclipse.jdt.core.IPackageFragment packageFragment = packageRoot.getPackageFragment(packageName); - if (packageFragment != null && packageFragment.exists()) { - // Get all compilation units in this package - org.eclipse.jdt.core.ICompilationUnit[] compilationUnits = packageFragment - .getCompilationUnits(); - for (org.eclipse.jdt.core.ICompilationUnit cu : compilationUnits) { - // Get all types in the compilation unit - org.eclipse.jdt.core.IType[] types = cu.getAllTypes(); - for (org.eclipse.jdt.core.IType type : types) { - String fullTypeName = type.getFullyQualifiedName(); - if (!processedTypes.contains(fullTypeName)) { - processedTypes.add(fullTypeName); - extractTypeInfo(type, result); - } - } - } - } - } - } - } catch (JavaModelException e) { - // Log but continue processing - JdtlsExtActivator.logException("Error resolving package: " + packageName, e); - } - } - - private static void extractTypeInfo(org.eclipse.jdt.core.IType type, List result) { - try { - String typeName = type.getFullyQualifiedName(); - String typeInfo = ""; - - // Determine type kind - if (type.isInterface()) { - typeInfo = "interface:" + typeName; - } else if (type.isClass()) { - extractDetailedClassInfo(type, result); - return; // extractDetailedClassInfo handles adding to result - } else if (type.isEnum()) { - typeInfo = "enum:" + typeName; - } else if (type.isAnnotation()) { - typeInfo = "annotation:" + typeName; - } else { - typeInfo = "type:" + typeName; - } - - // Get URI for this type - String uri = getTypeUri(type); - if (uri != null) { - result.add(new ImportClassInfo(uri, typeInfo)); - } - - // Also add nested types - org.eclipse.jdt.core.IType[] nestedTypes = type.getTypes(); - for (org.eclipse.jdt.core.IType nestedType : nestedTypes) { - extractTypeInfo(nestedType, result); - } - - } catch (JavaModelException e) { - // Log but continue processing other types - JdtlsExtActivator.logException("Error extracting type info for: " + type.getElementName(), e); - } - } - - private static void extractDetailedClassInfo(org.eclipse.jdt.core.IType type, List result) { - try { - if (!type.isClass()) { - return; // Only process classes - } - - String className = type.getFullyQualifiedName(); - List classDetails = new ArrayList<>(); - - // 1. Class declaration information - classDetails.add("class:" + className); - - // 2. Modifiers - int flags = type.getFlags(); - List modifiers = new ArrayList<>(); - if (org.eclipse.jdt.core.Flags.isPublic(flags)) - modifiers.add("public"); - if (org.eclipse.jdt.core.Flags.isAbstract(flags)) - modifiers.add("abstract"); - if (org.eclipse.jdt.core.Flags.isFinal(flags)) - modifiers.add("final"); - if (org.eclipse.jdt.core.Flags.isStatic(flags)) - modifiers.add("static"); - if (!modifiers.isEmpty()) { - classDetails.add("modifiers:" + String.join(",", modifiers)); - } - - // 3. Inheritance - String superclass = type.getSuperclassName(); - if (superclass != null && !"Object".equals(superclass)) { - classDetails.add("extends:" + superclass); } - // 4. Implemented interfaces - String[] interfaces = type.getSuperInterfaceNames(); - if (interfaces.length > 0) { - classDetails.add("implements:" + String.join(",", interfaces)); - } - - // 5. Constructors - IMethod[] methods = type.getMethods(); - List constructors = new ArrayList<>(); - List publicMethods = new ArrayList<>(); - - for (IMethod method : methods) { - if (method.isConstructor()) { - constructors.add(method.getElementName() + getParameterTypes(method)); - } else if (org.eclipse.jdt.core.Flags.isPublic(method.getFlags())) { - publicMethods.add(method.getElementName() + getParameterTypes(method)); - } - } - - if (!constructors.isEmpty()) { - classDetails.add("constructors:" + String.join(",", constructors)); - } + return classInfoList; - if (!publicMethods.isEmpty()) { - classDetails.add("publicMethods:" - + String.join(",", publicMethods.subList(0, Math.min(publicMethods.size(), 10)))); - } - - // 6. Public fields - org.eclipse.jdt.core.IField[] fields = type.getFields(); - List publicFields = new ArrayList<>(); - for (org.eclipse.jdt.core.IField field : fields) { - if (org.eclipse.jdt.core.Flags.isPublic(field.getFlags())) { - publicFields.add(field.getElementName()); - } - } - - if (!publicFields.isEmpty()) { - classDetails.add("publicFields:" + String.join(",", publicFields)); - } - - // Get URI for this type - String uri = getTypeUri(type); - if (uri != null) { - // Combine all information into one string - String classInfo = String.join("|", classDetails); - result.add(new ImportClassInfo(uri, classInfo)); - } - - } catch (JavaModelException e) { - JdtlsExtActivator.logException("Error extracting detailed class info", e); - } - } - - // Helper method: Get file URI/path for the type (instead of fully qualified class name) - private static String getTypeUri(org.eclipse.jdt.core.IType type) { - try { - // Get the compilation unit that contains this type - org.eclipse.jdt.core.ICompilationUnit compilationUnit = type.getCompilationUnit(); - if (compilationUnit != null) { - // Get the underlying resource (file) - org.eclipse.core.resources.IResource resource = compilationUnit.getUnderlyingResource(); - if (resource != null && resource instanceof org.eclipse.core.resources.IFile) { - org.eclipse.core.resources.IFile file = (org.eclipse.core.resources.IFile) resource; - // Get the file location as a file URI - java.net.URI fileUri = file.getLocationURI(); - if (fileUri != null) { - return fileUri.toString(); - } - - // Fallback: use workspace-relative path as URI - return file.getFullPath().toString(); - } - } - - // Fallback: if we can't get file URI, return the fully qualified class name - // This should rarely happen for source types - return type.getFullyQualifiedName(); } catch (Exception e) { - JdtlsExtActivator.logException("Error getting file URI for type: " + type.getElementName(), e); - // Fallback to class name in case of error - try { - return type.getFullyQualifiedName(); - } catch (Exception e2) { - return null; - } - } - } - - // Helper method: Get method parameter types - private static String getParameterTypes(IMethod method) { - String[] paramTypes = method.getParameterTypes(); - if (paramTypes.length == 0) { - return "()"; + JdtlsExtActivator.logException("Error in getImportClassContent", e); + return Collections.emptyList(); } - return "(" + String.join(",", paramTypes) + ")"; } private static void reportExportJarMessage(String terminalId, int severity, String message) { @@ -870,4 +484,4 @@ public boolean isBelongsToWorkspace() { return belongsToWorkspace; } } -} \ No newline at end of file +} diff --git a/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/parser/ContextResolver.java b/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/parser/ContextResolver.java new file mode 100644 index 00000000..e0218b0c --- /dev/null +++ b/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/parser/ContextResolver.java @@ -0,0 +1,1094 @@ +/******************************************************************************* + * Copyright (c) 2018 Microsoft Corporation and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Microsoft Corporation - initial API and implementation + *******************************************************************************/ + +package com.microsoft.jdtls.ext.core.parser; + +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Set; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.jdt.core.IMethod; +import org.eclipse.jdt.core.IPackageFragmentRoot; +import org.eclipse.jdt.core.IJavaProject; +import org.eclipse.jdt.core.JavaModelException; + +import com.microsoft.jdtls.ext.core.JdtlsExtActivator; + +/** + * Parser for extracting Java class content information for Copilot integration. + * Handles import resolution, JavaDoc extraction, and class description generation. + */ +public class ContextResolver { + + // Pre-compiled regex patterns for performance + private static final Pattern MARKDOWN_CODE_PATTERN = Pattern.compile("(?s)```(?:java)?\\n?(.*?)```"); + private static final Pattern HTML_PRE_PATTERN = Pattern.compile("(?is)]*>(.*?)"); + private static final Pattern HTML_CODE_PATTERN = Pattern.compile("(?is)]*>(.*?)"); + + // Constants for limiting displayed members + private static final int MAX_METHODS_TO_DISPLAY = 10; + private static final int MAX_FIELDS_TO_DISPLAY = 10; + private static final int MAX_STATIC_METHODS_TO_DISPLAY = 10; + private static final int MAX_STATIC_FIELDS_TO_DISPLAY = 10; + + /** + * ImportClassInfo - Conforms to Copilot CodeSnippet format + * Used to provide Java class context information and JavaDoc to Copilot + */ + public static class ImportClassInfo { + public String uri; // File URI (required) + public String className; // Human-readable class description with JavaDoc appended (required) + + public ImportClassInfo(String uri, String className) { + this.uri = uri; + this.className = className; + } + } + + /** + * Resolve a single type import and extract its information + */ + public static void resolveSingleType(IJavaProject javaProject, String typeName, List classInfoList, + Set processedTypes, IProgressMonitor monitor) { + try { + if (processedTypes.contains(typeName)) { + return; + } + processedTypes.add(typeName); + + // Extract package and simple name from the fully qualified type name + int lastDotIndex = typeName.lastIndexOf('.'); + if (lastDotIndex == -1) { + // Default package or invalid type name + return; + } + + String packageName = typeName.substring(0, lastDotIndex); + String simpleName = typeName.substring(lastDotIndex + 1); + + // Strategy: Use JDT's global type resolution first (comprehensive), + // then fallback to manual package fragment traversal if needed + + // Primary path: Use JDT's findType which searches all sources and dependencies + try { + org.eclipse.jdt.core.IType type = javaProject.findType(typeName); + if (type != null && type.exists()) { + // Found type - check if it's a source type we want to process + if (!type.isBinary()) { + // Source type found - extract information and return + extractTypeInfo(type, classInfoList, monitor); + return; + } + // Note: Binary types (from JARs/JRE) are intentionally ignored + // as they don't provide useful context for code completion + } + } catch (JavaModelException e) { + JdtlsExtActivator.logException("Error in primary type search: " + typeName, e); + // Continue to fallback method + } + + // Fallback path: Manual search in local source package fragments + // This is used when findType() doesn't return results or fails + IPackageFragmentRoot[] packageRoots = javaProject.getPackageFragmentRoots(); + for (IPackageFragmentRoot packageRoot : packageRoots) { + if (packageRoot.getKind() == IPackageFragmentRoot.K_SOURCE) { + org.eclipse.jdt.core.IPackageFragment packageFragment = packageRoot.getPackageFragment(packageName); + if (packageFragment != null && packageFragment.exists()) { + // Look for compilation unit with matching name + org.eclipse.jdt.core.ICompilationUnit cu = packageFragment.getCompilationUnit(simpleName + ".java"); + if (cu != null && cu.exists() && cu.getResource() != null && cu.getResource().exists()) { + // Get primary type from compilation unit + org.eclipse.jdt.core.IType primaryType = cu.findPrimaryType(); + if (primaryType != null && primaryType.exists() && + typeName.equals(primaryType.getFullyQualifiedName())) { + // Found local project source type via fallback method + extractTypeInfo(primaryType, classInfoList, monitor); + return; + } + + // Also check for inner types in the compilation unit + org.eclipse.jdt.core.IType[] allTypes = cu.getAllTypes(); + for (org.eclipse.jdt.core.IType type : allTypes) { + if (typeName.equals(type.getFullyQualifiedName())) { + extractTypeInfo(type, classInfoList, monitor); + return; + } + } + } + } + } + } + } catch (JavaModelException e) { + // Log but continue processing other types + JdtlsExtActivator.logException("Error resolving type: " + typeName, e); + } + } + + /** + * Resolve a static import statement + */ + public static void resolveStaticImport(IJavaProject javaProject, String staticImportName, List classInfoList, + Set processedTypes, IProgressMonitor monitor) { + try { + if (staticImportName.endsWith(".*")) { + // Static import of all static members from a class: import static MyClass.*; + String className = staticImportName.substring(0, staticImportName.length() - 2); + resolveStaticMembersFromClass(javaProject, className, classInfoList, processedTypes, monitor); + } else { + // Static import of specific member: import static MyClass.myMethod; + int lastDotIndex = staticImportName.lastIndexOf('.'); + if (lastDotIndex > 0) { + String className = staticImportName.substring(0, lastDotIndex); + String memberName = staticImportName.substring(lastDotIndex + 1); + resolveStaticMemberFromClass(javaProject, className, memberName, classInfoList, processedTypes, monitor); + } + } + } catch (Exception e) { + JdtlsExtActivator.logException("Error resolving static import: " + staticImportName, e); + } + } + + /** + * Resolve all static members from a class + */ + public static void resolveStaticMembersFromClass(IJavaProject javaProject, String className, + List classInfoList, Set processedTypes, IProgressMonitor monitor) { + try { + // First resolve the class itself to get context information + resolveSingleType(javaProject, className, classInfoList, processedTypes, monitor); + + // Find the type and extract its static members + org.eclipse.jdt.core.IType type = javaProject.findType(className); + if (type != null && type.exists() && !type.isBinary()) { + StringBuilder description = new StringBuilder(); + description.append("Static Import: ").append(className).append(".*\n"); + description.append("All static members from ").append(className).append("\n\n"); + + // Get static methods + IMethod[] methods = type.getMethods(); + List staticMethodSigs = new ArrayList<>(); + for (IMethod method : methods) { + int flags = method.getFlags(); + if (org.eclipse.jdt.core.Flags.isStatic(flags) && org.eclipse.jdt.core.Flags.isPublic(flags)) { + if (staticMethodSigs.size() < MAX_STATIC_METHODS_TO_DISPLAY) { + staticMethodSigs.add(generateMethodSignature(method)); + } + } + } + + // Get static fields + org.eclipse.jdt.core.IField[] fields = type.getFields(); + List staticFieldSigs = new ArrayList<>(); + for (org.eclipse.jdt.core.IField field : fields) { + int flags = field.getFlags(); + if (org.eclipse.jdt.core.Flags.isStatic(flags) && org.eclipse.jdt.core.Flags.isPublic(flags)) { + if (staticFieldSigs.size() < MAX_STATIC_FIELDS_TO_DISPLAY) { + staticFieldSigs.add(generateFieldSignature(field)); + } + } + } + + if (!staticMethodSigs.isEmpty()) { + description.append("Static Methods:\n"); + for (String sig : staticMethodSigs) { + description.append(" - ").append(sig).append("\n"); + } + description.append("\n"); + } + + if (!staticFieldSigs.isEmpty()) { + description.append("Static Fields:\n"); + for (String sig : staticFieldSigs) { + description.append(" - ").append(sig).append("\n"); + } + } + + String uri = getTypeUri(type); + if (uri != null) { + classInfoList.add(new ImportClassInfo(uri, description.toString())); + } + } + } catch (JavaModelException e) { + JdtlsExtActivator.logException("Error resolving static members from: " + className, e); + } + } + + /** + * Resolve a specific static member from a class + */ + public static void resolveStaticMemberFromClass(IJavaProject javaProject, String className, String memberName, + List classInfoList, Set processedTypes, IProgressMonitor monitor) { + try { + // First resolve the class itself + resolveSingleType(javaProject, className, classInfoList, processedTypes, monitor); + + // Find the specific static member + org.eclipse.jdt.core.IType type = javaProject.findType(className); + if (type != null && type.exists() && !type.isBinary()) { + StringBuilder description = new StringBuilder(); + description.append("Static Import: ").append(className).append(".").append(memberName).append("\n\n"); + + boolean found = false; + + // Check if it's a method + IMethod[] methods = type.getMethods(); + for (IMethod method : methods) { + if (method.getElementName().equals(memberName)) { + int flags = method.getFlags(); + if (org.eclipse.jdt.core.Flags.isStatic(flags)) { + description.append("Static Method:\n"); + description.append(" - ").append(generateMethodSignature(method)).append("\n"); + found = true; + break; + } + } + } + + // Check if it's a field + if (!found) { + org.eclipse.jdt.core.IField[] fields = type.getFields(); + for (org.eclipse.jdt.core.IField field : fields) { + if (field.getElementName().equals(memberName)) { + int flags = field.getFlags(); + if (org.eclipse.jdt.core.Flags.isStatic(flags)) { + description.append("Static Field:\n"); + description.append(" - ").append(generateFieldSignature(field)).append("\n"); + found = true; + break; + } + } + } + } + + if (found) { + String uri = getTypeUri(type); + if (uri != null) { + classInfoList.add(new ImportClassInfo(uri, description.toString())); + } + } + } + } catch (JavaModelException e) { + JdtlsExtActivator.logException("Error resolving static member: " + className + "." + memberName, e); + } + } + + /** + * Resolve all types in a package (for wildcard imports) + */ + public static void resolvePackageTypes(IJavaProject javaProject, String packageName, List classInfoList, + Set processedTypes, IProgressMonitor monitor) { + try { + // Find all package fragments with this name + IPackageFragmentRoot[] packageRoots = javaProject.getPackageFragmentRoots(); + for (IPackageFragmentRoot packageRoot : packageRoots) { + if (packageRoot.getKind() == IPackageFragmentRoot.K_SOURCE) { + org.eclipse.jdt.core.IPackageFragment packageFragment = packageRoot.getPackageFragment(packageName); + if (packageFragment != null && packageFragment.exists()) { + // Get all compilation units in this package + org.eclipse.jdt.core.ICompilationUnit[] compilationUnits = packageFragment + .getCompilationUnits(); + for (org.eclipse.jdt.core.ICompilationUnit cu : compilationUnits) { + // Get all types in the compilation unit + org.eclipse.jdt.core.IType[] types = cu.getAllTypes(); + for (org.eclipse.jdt.core.IType type : types) { + String fullTypeName = type.getFullyQualifiedName(); + if (!processedTypes.contains(fullTypeName)) { + processedTypes.add(fullTypeName); + extractTypeInfo(type, classInfoList, monitor); + } + } + } + } + } + } + } catch (JavaModelException e) { + // Log but continue processing + JdtlsExtActivator.logException("Error resolving package: " + packageName, e); + } + } + + /** + * Extract type information and generate ImportClassInfo conforming to Copilot CodeSnippet format + * Also extracts JavaDoc if available and appends it to the class description + * Improved version: generates human-readable class descriptions with integrated JavaDoc + */ + public static void extractTypeInfo(org.eclipse.jdt.core.IType type, List classInfoList, + IProgressMonitor monitor) { + try { + // Get file URI + String uri = getTypeUri(type); + if (uri == null) { + return; + } + + // Extract relevant JavaDoc content first (code snippets with fallback strategy) + // This uses a hybrid approach: AST extraction -> HTML extraction -> Markdown extraction -> fallback + String relevantJavadoc = extractRelevantJavaDocContent(type, monitor); + + // Generate human-readable class description with JavaDoc inserted after signature + String description = generateClassDescription(type, relevantJavadoc); + + // Create ImportClassInfo (conforms to Copilot CodeSnippet format) + ImportClassInfo info = new ImportClassInfo(uri, description); + classInfoList.add(info); + + // Recursively process nested types + org.eclipse.jdt.core.IType[] nestedTypes = type.getTypes(); + for (org.eclipse.jdt.core.IType nestedType : nestedTypes) { + extractTypeInfo(nestedType, classInfoList, monitor); + } + + } catch (JavaModelException e) { + JdtlsExtActivator.logException("Error extracting type info for: " + type.getElementName(), e); + } + } + + /** + * Get file URI/path for the type (instead of fully qualified class name) + */ + public static String getTypeUri(org.eclipse.jdt.core.IType type) { + try { + // Get the compilation unit that contains this type + org.eclipse.jdt.core.ICompilationUnit compilationUnit = type.getCompilationUnit(); + if (compilationUnit != null) { + // Get the underlying resource (file) + org.eclipse.core.resources.IResource resource = compilationUnit.getUnderlyingResource(); + if (resource != null && resource instanceof org.eclipse.core.resources.IFile) { + org.eclipse.core.resources.IFile file = (org.eclipse.core.resources.IFile) resource; + // Get the file location as a file URI + java.net.URI fileUri = file.getLocationURI(); + if (fileUri != null) { + return fileUri.toString(); + } + + // Fallback: use workspace-relative path as URI + return file.getFullPath().toString(); + } + } + + // Fallback: if we can't get file URI, return the fully qualified class name + // This should rarely happen for source types + return type.getFullyQualifiedName(); + } catch (Exception e) { + JdtlsExtActivator.logException("Error getting file URI for type: " + type.getElementName(), e); + // Fallback to class name in case of error + try { + return type.getFullyQualifiedName(); + } catch (Exception e2) { + return null; + } + } + } + + /** + * Generate complete class description (natural language format, similar to JavaDoc) + * @param type the Java type to describe + * @param javadoc optional JavaDoc content to insert after signature (can be null or empty) + */ + public static String generateClassDescription(org.eclipse.jdt.core.IType type, String javadoc) { + StringBuilder description = new StringBuilder(); + + try { + String qualifiedName = type.getFullyQualifiedName(); + String simpleName = type.getElementName(); + + // === 1. Title and signature === + description.append("Class: ").append(qualifiedName).append("\n"); + + // Generate class signature + StringBuilder signature = new StringBuilder(); + int flags = type.getFlags(); + + if (org.eclipse.jdt.core.Flags.isPublic(flags)) signature.append("public "); + if (org.eclipse.jdt.core.Flags.isAbstract(flags)) signature.append("abstract "); + if (org.eclipse.jdt.core.Flags.isFinal(flags)) signature.append("final "); + + if (type.isInterface()) { + signature.append("interface "); + } else if (type.isEnum()) { + signature.append("enum "); + } else if (type.isAnnotation()) { + signature.append("@interface "); + } else { + signature.append("class "); + } + + signature.append(simpleName); + + // Type parameters + String[] typeParams = type.getTypeParameterSignatures(); + if (typeParams != null && typeParams.length > 0) { + signature.append("<"); + for (int i = 0; i < typeParams.length; i++) { + if (i > 0) signature.append(", "); + signature.append(convertTypeSignature(typeParams[i])); + } + signature.append(">"); + } + + // Inheritance relationship + String superclass = type.getSuperclassName(); + if (superclass != null && !superclass.equals("Object") && !type.isInterface()) { + signature.append(" extends ").append(superclass); + } + + // Implemented interfaces + String[] interfaces = type.getSuperInterfaceNames(); + if (interfaces != null && interfaces.length > 0) { + if (type.isInterface()) { + signature.append(" extends "); + } else { + signature.append(" implements "); + } + for (int i = 0; i < interfaces.length; i++) { + if (i > 0) signature.append(", "); + signature.append(interfaces[i]); + } + } + + description.append("Signature: ").append(signature).append("\n\n"); + + // === 2. JavaDoc (inserted after signature) === + if (isNotEmpty(javadoc)) { + description.append("JavaDoc:\n").append(javadoc).append("\n\n"); + } + + // === 3. Constructors === + IMethod[] methods = type.getMethods(); + List constructorSigs = new ArrayList<>(); + + for (IMethod method : methods) { + if (method.isConstructor()) { + constructorSigs.add(generateMethodSignature(method)); + } + } + + if (!constructorSigs.isEmpty()) { + description.append("Constructors:\n"); + for (String sig : constructorSigs) { + description.append(" - ").append(sig).append("\n"); + } + description.append("\n"); + } + + // === 4. Public methods (limited to first 10) === + List methodSigs = new ArrayList<>(); + int methodCount = 0; + + for (IMethod method : methods) { + if (!method.isConstructor() && org.eclipse.jdt.core.Flags.isPublic(method.getFlags())) { + if (methodCount < MAX_METHODS_TO_DISPLAY) { + methodSigs.add(generateMethodSignature(method)); + methodCount++; + } else { + break; + } + } + } + + if (!methodSigs.isEmpty()) { + description.append("Methods:\n"); + for (String sig : methodSigs) { + description.append(" - ").append(sig).append("\n"); + } + if (methodCount == MAX_METHODS_TO_DISPLAY && methods.length > methodCount) { + description.append(" - ... (more methods available)\n"); + } + description.append("\n"); + } + + // === 5. Public fields (limited to first 10) === + org.eclipse.jdt.core.IField[] fields = type.getFields(); + List fieldSigs = new ArrayList<>(); + int fieldCount = 0; + + for (org.eclipse.jdt.core.IField field : fields) { + if (org.eclipse.jdt.core.Flags.isPublic(field.getFlags()) && fieldCount < MAX_FIELDS_TO_DISPLAY) { + fieldSigs.add(generateFieldSignature(field)); + fieldCount++; + } + } + + if (!fieldSigs.isEmpty()) { + description.append("Fields:\n"); + for (String sig : fieldSigs) { + description.append(" - ").append(sig).append("\n"); + } + } + + } catch (JavaModelException e) { + return "Error generating description for type: " + e.getMessage(); + } + + return description.toString(); + } + + // ================ JavaDoc Extraction Methods ================ + + /** + * Extracts relevant code snippets from Javadoc. + * This method is optimized to extract code from `` tags and markdown code fences, + * and formats them in an LLM-readable format. + * + * @param type the type to extract Javadoc from. + * @param monitor the progress monitor. + * @return A string containing all found code snippets, formatted as markdown code blocks. + */ + private static String extractRelevantJavaDocContent(org.eclipse.jdt.core.IType type, IProgressMonitor monitor) { + try { + String rawJavadoc; + boolean isHtml; + + if (type.isBinary()) { + rawJavadoc = type.getAttachedJavadoc(monitor); + isHtml = true; + } else { + org.eclipse.jdt.core.ISourceRange javadocRange = type.getJavadocRange(); + if (javadocRange == null) { + return ""; + } + rawJavadoc = type.getCompilationUnit().getSource().substring(javadocRange.getOffset(), javadocRange.getOffset() + javadocRange.getLength()); + isHtml = false; // Javadoc comment from source is not HTML + } + + if (!isNotEmpty(rawJavadoc)) { + return ""; + } + + StringBuilder allCodeSnippets = new StringBuilder(); + Set seenCodeSnippets = new HashSet<>(); + + // 1. Extract markdown code blocks (```...```) + Matcher markdownMatcher = MARKDOWN_CODE_PATTERN.matcher(rawJavadoc); + while (markdownMatcher.find()) { + String code = markdownMatcher.group(1).trim(); + if (isNotEmpty(code) && seenCodeSnippets.add(code)) { + allCodeSnippets.append("```java\n").append(code).append("\n```\n\n"); + } + } + + // 2. Extract HTML
       and  blocks
      +            // Clean Javadoc comment for HTML extraction
      +            String cleanedForHtml = isHtml ? rawJavadoc : cleanJavadocComment(rawJavadoc);
      +            cleanedForHtml = convertHtmlEntities(cleanedForHtml);
      +
      +            // Priority 1: 
       blocks (often contain well-formatted code)
      +            Matcher preMatcher = HTML_PRE_PATTERN.matcher(cleanedForHtml);
      +            while (preMatcher.find()) {
      +                String code = preMatcher.group(1).replaceAll("(?i)]*>", "").replaceAll("(?i)", "").trim();
      +                if (isNotEmpty(code) && seenCodeSnippets.add(code)) {
      +                    allCodeSnippets.append("```java\n").append(code).append("\n```\n\n");
      +                }
      +            }
      +
      +            // Priority 2:  blocks (for inline snippets)
      +            Matcher codeMatcher = HTML_CODE_PATTERN.matcher(cleanedForHtml);
      +            while (codeMatcher.find()) {
      +                String code = codeMatcher.group(1).trim();
      +                // Use HashSet for O(1) duplicate checking
      +                if (isNotEmpty(code) && seenCodeSnippets.add(code)) {
      +                    allCodeSnippets.append("```java\n").append(code).append("\n```\n\n");
      +                }
      +            }
      +
      +            return allCodeSnippets.toString().trim();
      +
      +        } catch (Exception e) {
      +            JdtlsExtActivator.logException("Error extracting relevant JavaDoc content for: " + type.getElementName(), e);
      +            return "";
      +        }
      +    }
      +
      +    /**
      +     * Clean up raw JavaDoc comment by removing comment markers and asterisks
      +     */
      +    private static String cleanJavadocComment(String rawJavadoc) {
      +        if (rawJavadoc == null || rawJavadoc.isEmpty()) {
      +            return "";
      +        }
      +        
      +        // Remove opening /** and closing */
      +        String cleaned = rawJavadoc;
      +        cleaned = cleaned.replaceFirst("^/\\*\\*", "");
      +        cleaned = cleaned.replaceFirst("\\*/$", "");
      +        
      +        // Split into lines and clean each line
      +        String[] lines = cleaned.split("\\r?\\n");
      +        StringBuilder result = new StringBuilder();
      +        
      +        for (String line : lines) {
      +            // Remove leading whitespace and asterisk
      +            String trimmed = line.trim();
      +            if (trimmed.startsWith("*")) {
      +                trimmed = trimmed.substring(1).trim();
      +            }
      +            
      +            // Skip empty lines at the beginning
      +            if (result.length() == 0 && trimmed.isEmpty()) {
      +                continue;
      +            }
      +            
      +            // Add line to result
      +            if (result.length() > 0 && !trimmed.isEmpty()) {
      +                result.append("\n");
      +            }
      +            result.append(trimmed);
      +        }
      +        
      +        return result.toString();
      +    }
      +
      +
      +    /**
      +     * Convert HTML entities to their plain text equivalents
      +     */
      +    private static String convertHtmlEntities(String text) {
      +        if (text == null || text.isEmpty()) {
      +            return text;
      +        }
      +        String result = text;
      +        result = result.replace(" ", " ");
      +        result = result.replace("<", "<");
      +        result = result.replace(">", ">");
      +        result = result.replace("&", "&");
      +        result = result.replace(""", "\"");
      +        result = result.replace("'", "'");
      +        result = result.replace("'", "'");
      +        result = result.replace("—", "-");
      +        result = result.replace("–", "-");
      +        return result;
      +    }
      +
      +    /**
      +     * Extract summary description from method JavaDoc
      +     * Returns the first sentence or paragraph of the JavaDoc as a brief description
      +     */
      +    private static String extractMethodJavaDocSummary(IMethod method) {
      +        try {
      +            // Try to get JavaDoc from source
      +            org.eclipse.jdt.core.ISourceRange javadocRange = method.getJavadocRange();
      +            if (javadocRange == null) {
      +                return "";
      +            }
      +            
      +            String rawJavadoc = method.getCompilationUnit().getSource()
      +                .substring(javadocRange.getOffset(), javadocRange.getOffset() + javadocRange.getLength());
      +            
      +            if (!isNotEmpty(rawJavadoc)) {
      +                return "";
      +            }
      +            
      +            // Clean the JavaDoc comment
      +            String cleaned = cleanJavadocComment(rawJavadoc);
      +            
      +            // Extract the description (before any @param, @return, @throws tags)
      +            String description = extractJavadocDescription(cleaned);
      +            
      +            // Get first sentence or limit length
      +            String summary = getFirstSentenceOrLimit(description, 120);
      +            
      +            return summary;
      +            
      +        } catch (Exception e) {
      +            // Silently fail and return empty string
      +            return "";
      +        }
      +    }
      +
      +    /**
      +     * Extract the main description part from JavaDoc (before @tags)
      +     */
      +    private static String extractJavadocDescription(String cleanedJavadoc) {
      +        if (cleanedJavadoc == null || cleanedJavadoc.isEmpty()) {
      +            return "";
      +        }
      +        
      +        // Split into lines and extract description before @tags
      +        String[] lines = cleanedJavadoc.split("\\n");
      +        StringBuilder description = new StringBuilder();
      +        
      +        for (String line : lines) {
      +            String trimmedLine = line.trim();
      +            // Check if line starts with @tag
      +            if (trimmedLine.startsWith("@")) {
      +                break; // Stop at first tag
      +            }
      +            
      +            // Skip empty lines at the beginning
      +            if (description.length() == 0 && trimmedLine.isEmpty()) {
      +                continue;
      +            }
      +            
      +            if (description.length() > 0) {
      +                description.append(" ");
      +            }
      +            description.append(trimmedLine);
      +        }
      +        
      +        return description.toString().trim();
      +    }
      +
      +    /**
      +     * Get the first sentence or limit the text to maxLength characters
      +     */
      +    private static String getFirstSentenceOrLimit(String text, int maxLength) {
      +        if (text == null || text.isEmpty()) {
      +            return "";
      +        }
      +        
      +        // Try to find the first sentence (ending with ., !, or ?)
      +        int firstPeriod = text.indexOf(". ");
      +        int firstExclamation = text.indexOf("! ");
      +        int firstQuestion = text.indexOf("? ");
      +        
      +        int firstSentenceEnd = -1;
      +        if (firstPeriod != -1) firstSentenceEnd = firstPeriod;
      +        if (firstExclamation != -1 && (firstSentenceEnd == -1 || firstExclamation < firstSentenceEnd)) {
      +            firstSentenceEnd = firstExclamation;
      +        }
      +        if (firstQuestion != -1 && (firstSentenceEnd == -1 || firstQuestion < firstSentenceEnd)) {
      +            firstSentenceEnd = firstQuestion;
      +        }
      +        
      +        // If we found a sentence ending and it's within reasonable length
      +        if (firstSentenceEnd != -1 && firstSentenceEnd < maxLength) {
      +            return text.substring(0, firstSentenceEnd + 1).trim();
      +        }
      +        
      +        // Otherwise, limit to maxLength
      +        if (text.length() > maxLength) {
      +            // Try to cut at a word boundary
      +            int lastSpace = text.lastIndexOf(' ', maxLength);
      +            if (lastSpace > maxLength / 2) {
      +                return text.substring(0, lastSpace).trim() + "...";
      +            }
      +            return text.substring(0, maxLength).trim() + "...";
      +        }
      +        
      +        return text.trim();
      +    }
      +
      +    /**
      +     * Extract summary description from field JavaDoc
      +     */
      +    private static String extractFieldJavaDocSummary(org.eclipse.jdt.core.IField field) {
      +        try {
      +            // Try to get JavaDoc from source
      +            org.eclipse.jdt.core.ISourceRange javadocRange = field.getJavadocRange();
      +            if (javadocRange == null) {
      +                return "";
      +            }
      +            
      +            String rawJavadoc = field.getCompilationUnit().getSource()
      +                .substring(javadocRange.getOffset(), javadocRange.getOffset() + javadocRange.getLength());
      +            
      +            if (!isNotEmpty(rawJavadoc)) {
      +                return "";
      +            }
      +            
      +            // Clean the JavaDoc comment
      +            String cleaned = cleanJavadocComment(rawJavadoc);
      +            
      +            // Extract the description (before any @tags)
      +            String description = extractJavadocDescription(cleaned);
      +            
      +            // Get first sentence or limit length
      +            String summary = getFirstSentenceOrLimit(description, 120);
      +            
      +            return summary;
      +            
      +        } catch (Exception e) {
      +            // Silently fail and return empty string
      +            return "";
      +        }
      +    }
      +
      +    /**
      +     * Generate human-readable method signature with JavaDoc description
      +     */
      +    public static String generateMethodSignature(IMethod method) {
      +        StringBuilder sb = new StringBuilder();
      +        
      +        try {
      +            int flags = method.getFlags();
      +            appendAccessModifiers(sb, flags);
      +            appendOtherModifiers(sb, flags, true);
      +            
      +            // Type parameters (if any)
      +            String[] typeParameters = method.getTypeParameterSignatures();
      +            if (typeParameters != null && typeParameters.length > 0) {
      +                sb.append("<");
      +                for (int i = 0; i < typeParameters.length; i++) {
      +                    if (i > 0) sb.append(", ");
      +                    sb.append(convertTypeSignature(typeParameters[i]));
      +                }
      +                sb.append("> ");
      +            }
      +            
      +            // Return type (constructors don't have return type)
      +            if (!method.isConstructor()) {
      +                String returnType = convertTypeSignature(method.getReturnType());
      +                sb.append(returnType).append(" ");
      +            }
      +            
      +            // Method name
      +            sb.append(method.getElementName()).append("(");
      +            
      +            // Parameter list
      +            String[] paramTypes = method.getParameterTypes();
      +            String[] paramNames = method.getParameterNames();
      +            for (int i = 0; i < paramTypes.length; i++) {
      +                if (i > 0) {
      +                    sb.append(", ");
      +                }
      +                sb.append(convertTypeSignature(paramTypes[i]));
      +                if (paramNames != null && i < paramNames.length) {
      +                    sb.append(" ").append(paramNames[i]);
      +                }
      +            }
      +            
      +            sb.append(")");
      +            
      +            // Exception declarations
      +            String[] exceptionTypes = method.getExceptionTypes();
      +            if (exceptionTypes != null && exceptionTypes.length > 0) {
      +                sb.append(" throws ");
      +                for (int i = 0; i < exceptionTypes.length; i++) {
      +                    if (i > 0) sb.append(", ");
      +                    sb.append(convertTypeSignature(exceptionTypes[i]));
      +                }
      +            }
      +            
      +        } catch (JavaModelException e) {
      +            return method.getElementName() + "(...)";
      +        }
      +        
      +        // Extract JavaDoc description and prepend if exists
      +        String javadocSummary = extractMethodJavaDocSummary(method);
      +        if (isNotEmpty(javadocSummary)) {
      +            return "// " + javadocSummary + "\n      " + sb.toString();
      +        }
      +        
      +        return sb.toString();
      +    }
      +
      +    /**
      +     * Generate human-readable field signature with JavaDoc description
      +     */
      +    public static String generateFieldSignature(org.eclipse.jdt.core.IField field) {
      +        StringBuilder sb = new StringBuilder();
      +        
      +        try {
      +            int flags = field.getFlags();
      +            appendAccessModifiers(sb, flags);
      +            appendOtherModifiers(sb, flags, false);
      +            
      +            // Type and name
      +            String fieldType = convertTypeSignature(field.getTypeSignature());
      +            sb.append(fieldType).append(" ").append(field.getElementName());
      +            
      +            // If it's a constant, try to get the initial value
      +            if (org.eclipse.jdt.core.Flags.isStatic(flags) && org.eclipse.jdt.core.Flags.isFinal(flags)) {
      +                Object constant = field.getConstant();
      +                if (constant != null) {
      +                    sb.append(" = ");
      +                    if (constant instanceof String) {
      +                        sb.append("\"").append(constant).append("\"");
      +                    } else {
      +                        sb.append(constant);
      +                    }
      +                }
      +            }
      +            
      +        } catch (JavaModelException e) {
      +            return field.getElementName();
      +        }
      +        
      +        // Extract JavaDoc description and prepend if exists
      +        String javadocSummary = extractFieldJavaDocSummary(field);
      +        if (isNotEmpty(javadocSummary)) {
      +            return "// " + javadocSummary + "\n      " + sb.toString();
      +        }
      +        
      +        return sb.toString();
      +    }
      +
      +    /**
      +     * Append access modifiers (public/protected/private) to StringBuilder
      +     */
      +    private static void appendAccessModifiers(StringBuilder sb, int flags) {
      +        if (org.eclipse.jdt.core.Flags.isPublic(flags)) {
      +            sb.append("public ");
      +        } else if (org.eclipse.jdt.core.Flags.isProtected(flags)) {
      +            sb.append("protected ");
      +        } else if (org.eclipse.jdt.core.Flags.isPrivate(flags)) {
      +            sb.append("private ");
      +        }
      +    }
      +
      +    /**
      +     * Append other modifiers (static/final/abstract) to StringBuilder
      +     */
      +    private static void appendOtherModifiers(StringBuilder sb, int flags, boolean isMethod) {
      +        if (org.eclipse.jdt.core.Flags.isStatic(flags)) {
      +            sb.append("static ");
      +        }
      +        if (org.eclipse.jdt.core.Flags.isFinal(flags)) {
      +            sb.append("final ");
      +        }
      +        if (isMethod && org.eclipse.jdt.core.Flags.isAbstract(flags)) {
      +            sb.append("abstract ");
      +        }
      +    }
      +
      +    /**
      +     * Convert JDT type signature to human-readable format
      +     */
      +    public static String convertTypeSignature(String jdtSignature) {
      +        if (jdtSignature == null || jdtSignature.isEmpty()) {
      +            return "void";
      +        }
      +
      +        // Handle array types
      +        int arrayDimensions = 0;
      +        while (jdtSignature.startsWith("[")) {
      +            arrayDimensions++;
      +            jdtSignature = jdtSignature.substring(1);
      +        }
      +
      +        String baseType;
      +
      +        // Handle type parameters and reference types (starts with Q)
      +        if (jdtSignature.startsWith("Q") && jdtSignature.endsWith(";")) {
      +            baseType = jdtSignature.substring(1, jdtSignature.length() - 1);
      +            baseType = baseType.replace('/', '.');
      +            
      +            // Handle generic type parameters (e.g., "QResult;")
      +            baseType = processGenericTypes(baseType);
      +            baseType = simplifyTypeName(baseType);
      +        }
      +        // Handle fully qualified types (starts with L)
      +        else if (jdtSignature.startsWith("L") && jdtSignature.endsWith(";")) {
      +            baseType = jdtSignature.substring(1, jdtSignature.length() - 1);
      +            baseType = baseType.replace('/', '.');
      +            
      +            // Handle generic type parameters
      +            baseType = processGenericTypes(baseType);
      +            baseType = simplifyTypeName(baseType);
      +        }
      +        // Handle primitive types
      +        else {
      +            switch (jdtSignature.charAt(0)) {
      +                case 'I': baseType = "int"; break;
      +                case 'Z': baseType = "boolean"; break;
      +                case 'V': baseType = "void"; break;
      +                case 'J': baseType = "long"; break;
      +                case 'F': baseType = "float"; break;
      +                case 'D': baseType = "double"; break;
      +                case 'B': baseType = "byte"; break;
      +                case 'C': baseType = "char"; break;
      +                case 'S': baseType = "short"; break;
      +                default: baseType = jdtSignature;
      +            }
      +        }
      +
      +        // Add array markers
      +        for (int i = 0; i < arrayDimensions; i++) {
      +            baseType += "[]";
      +        }
      +
      +        return baseType;
      +    }
      +    
      +    /**
      +     * Process generic type parameters in a type name
      +     * Example: "Result" -> "Result"
      +     */
      +    private static String processGenericTypes(String typeName) {
      +        if (typeName == null || !typeName.contains("<")) {
      +            return typeName;
      +        }
      +        
      +        StringBuilder result = new StringBuilder();
      +        int i = 0;
      +        
      +        while (i < typeName.length()) {
      +            char c = typeName.charAt(i);
      +            
      +            if (c == '<' || c == ',' || c == ' ') {
      +                // Keep angle brackets, commas, and spaces
      +                result.append(c);
      +                i++;
      +                
      +                // Skip whitespace after comma or opening bracket
      +                while (i < typeName.length() && typeName.charAt(i) == ' ') {
      +                    result.append(' ');
      +                    i++;
      +                }
      +                
      +                // Check if next is a type parameter (Q or L prefix)
      +                if (i < typeName.length()) {
      +                    char next = typeName.charAt(i);
      +                    
      +                    if (next == 'Q' || next == 'L') {
      +                        // Find the end of this type parameter (marked by ;)
      +                        int endIndex = typeName.indexOf(';', i);
      +                        if (endIndex != -1) {
      +                            // Extract the type parameter and convert it
      +                            String typeParam = typeName.substring(i + 1, endIndex);
      +                            
      +                            // Recursively process nested generics
      +                            typeParam = processGenericTypes(typeParam);
      +                            typeParam = simplifyTypeName(typeParam);
      +                            
      +                            result.append(typeParam);
      +                            i = endIndex + 1; // Skip past the semicolon
      +                        } else {
      +                            result.append(next);
      +                            i++;
      +                        }
      +                    } else {
      +                        // Not a type parameter, just append
      +                        result.append(next);
      +                        i++;
      +                    }
      +                }
      +            } else {
      +                result.append(c);
      +                i++;
      +            }
      +        }
      +        
      +        return result.toString();
      +    }
      +
      +    /**
      +     * Simplify fully qualified type name to just the simple name
      +     */
      +    private static String simplifyTypeName(String qualifiedName) {
      +        if (qualifiedName == null) {
      +            return qualifiedName;
      +        }
      +        int lastDot = qualifiedName.lastIndexOf('.');
      +        return lastDot == -1 ? qualifiedName : qualifiedName.substring(lastDot + 1);
      +    }
      +
      +    /**
      +     * Utility method to check if a string is not empty or null
      +     */
      +    private static boolean isNotEmpty(String value) {
      +        return value != null && !value.isEmpty();
      +    }
      +}
      
      From 1d4ac3f44fbfcae953f9f4b9cb02db68ba7347f3 Mon Sep 17 00:00:00 2001
      From: wenyt <75360946+wenytang-ms@users.noreply.github.com>
      Date: Fri, 24 Oct 2025 15:41:09 +0800
      Subject: [PATCH 239/352] feat: add project deps info to context (#919)
      
      * feat: release for manager
      
      * feat: add project java deps
      
      * feat: release for manager
      
      * feat: add get deps
      
      * feat: adjust logic
      
      * test: add invoke command for test
      
      * feat: update
      
      * fix: update the logic to the resolve
      
      * fix: update
      ---
       .../com.microsoft.jdtls.ext.core/plugin.xml   |   1 +
       .../jdtls/ext/core/CommandHandler.java        |   2 +
       .../jdtls/ext/core/ProjectCommand.java        |  84 ++-
       .../ext/core/parser/ContextResolver.java      | 670 ++++++++++++------
       .../ext/core/parser/ProjectResolver.java      | 254 +++++++
       src/commands.ts                               |   2 +
       src/java/jdtls.ts                             |   9 +
       7 files changed, 811 insertions(+), 211 deletions(-)
       create mode 100644 jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/parser/ProjectResolver.java
      
      diff --git a/jdtls.ext/com.microsoft.jdtls.ext.core/plugin.xml b/jdtls.ext/com.microsoft.jdtls.ext.core/plugin.xml
      index 6643c1a7..a469ec92 100644
      --- a/jdtls.ext/com.microsoft.jdtls.ext.core/plugin.xml
      +++ b/jdtls.ext/com.microsoft.jdtls.ext.core/plugin.xml
      @@ -11,6 +11,7 @@
                   
                   
                   
      +            
               
           
            arguments, IProgress
                           return ProjectCommand.checkImportStatus();
                       case "java.project.getImportClassContent":
                           return ProjectCommand.getImportClassContent(arguments, monitor);
      +                case "java.project.getDependencies":
      +                    return ProjectCommand.getProjectDependencies(arguments, monitor);
                       default:
                           break;
                   }
      diff --git a/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/ProjectCommand.java b/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/ProjectCommand.java
      index df41a432..4aa6632b 100644
      --- a/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/ProjectCommand.java
      +++ b/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/ProjectCommand.java
      @@ -71,6 +71,7 @@
       import com.google.gson.GsonBuilder;
       import com.microsoft.jdtls.ext.core.parser.ContextResolver;
       import com.microsoft.jdtls.ext.core.parser.ContextResolver.ImportClassInfo;
      +import com.microsoft.jdtls.ext.core.parser.ProjectResolver;
       import com.microsoft.jdtls.ext.core.model.PackageNode;
       
       public final class ProjectCommand {
      @@ -87,7 +88,15 @@ public MainClassInfo(String name, String path) {
               }
           }
       
      +    private static class DependencyInfo {
      +        public String key;
      +        public String value;
       
      +        public DependencyInfo(String key, String value) {
      +            this.key = key;
      +            this.value = value;
      +        }
      +    }
       
           private static class Classpath {
               public String source;
      @@ -344,6 +353,7 @@ public static boolean checkImportStatus() {
           /**
            * Get import class content for Copilot integration.
            * This method extracts information about imported classes from a Java file.
      +     * Uses a time-controlled strategy: prioritizes internal classes, adds external classes only if time permits.
            * 
            * @param arguments List containing the file URI as the first element
            * @param monitor Progress monitor for cancellation support
      @@ -354,6 +364,11 @@ public static List getImportClassContent(List arguments
                   return Collections.emptyList();
               }
       
      +        // Time control: total budget 80ms, early return at 75ms
      +        long startTime = System.currentTimeMillis();
      +        final long TIME_BUDGET_MS = 80;
      +        final long EARLY_RETURN_MS = 75;
      +
               try {
                   String fileUri = (String) arguments.get(0);
       
      @@ -388,16 +403,18 @@ public static List getImportClassContent(List arguments
                   org.eclipse.jdt.core.ICompilationUnit compilationUnit = (org.eclipse.jdt.core.ICompilationUnit) javaElement;
       
                   // Parse imports and resolve local project files
      -            // Delegate to JavaContentParser for processing
                   List classInfoList = new ArrayList<>();
       
                   // Get all imports from the compilation unit
                   org.eclipse.jdt.core.IImportDeclaration[] imports = compilationUnit.getImports();
                   Set processedTypes = new HashSet<>();
       
      +            // Phase 1: Priority - Resolve project source classes (internal)
                   for (org.eclipse.jdt.core.IImportDeclaration importDecl : imports) {
      -                if (monitor.isCanceled()) {
      -                    break;
      +                // Check time budget before each operation
      +                long elapsed = System.currentTimeMillis() - startTime;
      +                if (monitor.isCanceled() || elapsed >= EARLY_RETURN_MS) {
      +                    return classInfoList; // Early return if approaching time limit
                       }
       
                       String importName = importDecl.getElementName();
      @@ -416,6 +433,43 @@ public static List getImportClassContent(List arguments
                       }
                   }
       
      +            // Phase 2: If time permits, resolve external dependencies
      +            long elapsedAfterInternal = System.currentTimeMillis() - startTime;
      +            if (elapsedAfterInternal < EARLY_RETURN_MS && !monitor.isCanceled()) {
      +                // Calculate remaining time budget for external classes
      +                long remainingTime = TIME_BUDGET_MS - elapsedAfterInternal;
      +                
      +                // Only proceed with external if we have reasonable time left (at least 15ms)
      +                if (remainingTime >= 15) {
      +                    List externalClasses = new ArrayList<>();
      +                    
      +                    for (org.eclipse.jdt.core.IImportDeclaration importDecl : imports) {
      +                        // Check time before each external resolution
      +                        long currentElapsed = System.currentTimeMillis() - startTime;
      +                        if (monitor.isCanceled() || currentElapsed >= EARLY_RETURN_MS) {
      +                            break;
      +                        }
      +
      +                        String importName = importDecl.getElementName();
      +                        boolean isStatic = (importDecl.getFlags() & org.eclipse.jdt.core.Flags.AccStatic) != 0;
      +                        
      +                        // Skip package imports (*.* ) - too broad for external dependencies
      +                        if (importName.endsWith(".*")) {
      +                            continue;
      +                        }
      +                        
      +                        // Resolve external (binary) types with simplified content
      +                        if (!isStatic) {
      +                            ContextResolver.resolveBinaryType(javaProject, importName, externalClasses, 
      +                                    processedTypes, Integer.MAX_VALUE, monitor);
      +                        }
      +                    }
      +                    
      +                    // Append external classes after project sources
      +                    classInfoList.addAll(externalClasses);
      +                }
      +            }
      +
                   return classInfoList;
       
               } catch (Exception e) {
      @@ -449,6 +503,30 @@ private static String getSeverityString(int severity) {
               }
           }
       
      +    /**
      +     * Get project dependencies information including JDK version.
      +     * 
      +     * @param arguments List containing the project URI as the first element
      +     * @param monitor Progress monitor for cancellation support
      +     * @return List of DependencyInfo containing key-value pairs of project information
      +     */
      +    public static List getProjectDependencies(List arguments, IProgressMonitor monitor) {
      +        if (arguments == null || arguments.isEmpty()) {
      +            return new ArrayList<>();
      +        }
      +
      +        String projectUri = (String) arguments.get(0);
      +        List resolverResult = ProjectResolver.resolveProjectDependencies(projectUri, monitor);
      +        
      +        // Convert ProjectResolver.DependencyInfo to ProjectCommand.DependencyInfo
      +        List result = new ArrayList<>();
      +        for (ProjectResolver.DependencyInfo info : resolverResult) {
      +            result.add(new DependencyInfo(info.key, info.value));
      +        }
      +        
      +        return result;
      +    }
      +
           private static final class LinkedFolderVisitor implements IResourceVisitor {
       
               private boolean belongsToWorkspace;
      diff --git a/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/parser/ContextResolver.java b/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/parser/ContextResolver.java
      index e0218b0c..bf815c50 100644
      --- a/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/parser/ContextResolver.java
      +++ b/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/parser/ContextResolver.java
      @@ -43,6 +43,28 @@ public class ContextResolver {
           private static final int MAX_STATIC_METHODS_TO_DISPLAY = 10;
           private static final int MAX_STATIC_FIELDS_TO_DISPLAY = 10;
       
      +    // Common JDK packages to skip (Copilot already has good understanding of these)
      +    // These are well-known packages whose classes don't need to be extracted from JARs
      +    private static final Set SKIP_COMMON_JDK_PACKAGES = new HashSet<>();
      +    static {
      +        // Core Java packages - Copilot has excellent understanding of these
      +        SKIP_COMMON_JDK_PACKAGES.add("java.lang");           // Object, String, Integer, etc.
      +        SKIP_COMMON_JDK_PACKAGES.add("java.util");           // Collections, List, Map, Set, etc.
      +        SKIP_COMMON_JDK_PACKAGES.add("java.io");             // File, InputStream, Reader, etc.
      +        SKIP_COMMON_JDK_PACKAGES.add("java.nio");            // ByteBuffer, etc.
      +        SKIP_COMMON_JDK_PACKAGES.add("java.nio.file");       // Path, Paths, Files
      +        SKIP_COMMON_JDK_PACKAGES.add("java.time");           // LocalDate, LocalDateTime, Instant, etc.
      +        SKIP_COMMON_JDK_PACKAGES.add("java.util.concurrent"); // ExecutorService, Future, CompletableFuture, etc.
      +        SKIP_COMMON_JDK_PACKAGES.add("java.util.stream");    // Stream, Collectors
      +        SKIP_COMMON_JDK_PACKAGES.add("java.util.function");  // Function, Consumer, Supplier, Predicate
      +        SKIP_COMMON_JDK_PACKAGES.add("java.net");            // URL, URI, HttpURLConnection
      +        SKIP_COMMON_JDK_PACKAGES.add("java.util.regex");     // Pattern, Matcher
      +        SKIP_COMMON_JDK_PACKAGES.add("java.math");           // BigDecimal, BigInteger
      +        SKIP_COMMON_JDK_PACKAGES.add("java.text");           // DateFormat, SimpleDateFormat, etc.
      +        SKIP_COMMON_JDK_PACKAGES.add("java.sql");            // Connection, ResultSet, etc.
      +        SKIP_COMMON_JDK_PACKAGES.add("javax.sql");           // DataSource, etc.
      +    }
      +
           /**
            * ImportClassInfo - Conforms to Copilot CodeSnippet format
            * Used to provide Java class context information and JavaDoc to Copilot
      @@ -51,9 +73,9 @@ public static class ImportClassInfo {
               public String uri;           // File URI (required)
               public String className;     // Human-readable class description with JavaDoc appended (required)
       
      -        public ImportClassInfo(String uri, String className) {
      +        public ImportClassInfo(String uri, String value) {
                   this.uri = uri;
      -            this.className = className;
      +            this.className = value;
               }
           }
       
      @@ -63,15 +85,16 @@ public ImportClassInfo(String uri, String className) {
           public static void resolveSingleType(IJavaProject javaProject, String typeName, List classInfoList,
                   Set processedTypes, IProgressMonitor monitor) {
               try {
      +            // Check if already processed to avoid duplicates
                   if (processedTypes.contains(typeName)) {
                       return;
                   }
      -            processedTypes.add(typeName);
       
                   // Extract package and simple name from the fully qualified type name
                   int lastDotIndex = typeName.lastIndexOf('.');
                   if (lastDotIndex == -1) {
      -                // Default package or invalid type name
      +                // Default package or invalid type name - mark as processed to avoid retry
      +                processedTypes.add(typeName);
                       return;
                   }
                   
      @@ -87,12 +110,14 @@ public static void resolveSingleType(IJavaProject javaProject, String typeName,
                       if (type != null && type.exists()) {
                           // Found type - check if it's a source type we want to process
                           if (!type.isBinary()) {
      -                        // Source type found - extract information and return
      +                        // Source type found - mark as processed and extract information
      +                        processedTypes.add(typeName);
                               extractTypeInfo(type, classInfoList, monitor);
                               return;
                           }
      -                    // Note: Binary types (from JARs/JRE) are intentionally ignored
      -                    // as they don't provide useful context for code completion
      +                    // Binary types (from JARs/JRE) found but not processed in Phase 1
      +                    // Do NOT mark as processed - let Phase 2 handle them if triggered
      +                    return;
                       }
                   } catch (JavaModelException e) {
                       JdtlsExtActivator.logException("Error in primary type search: " + typeName, e);
      @@ -114,6 +139,7 @@ public static void resolveSingleType(IJavaProject javaProject, String typeName,
                                   if (primaryType != null && primaryType.exists() && 
                                       typeName.equals(primaryType.getFullyQualifiedName())) {
                                       // Found local project source type via fallback method
      +                                processedTypes.add(typeName);
                                       extractTypeInfo(primaryType, classInfoList, monitor);
                                       return;
                                   }
      @@ -122,6 +148,7 @@ public static void resolveSingleType(IJavaProject javaProject, String typeName,
                                   org.eclipse.jdt.core.IType[] allTypes = cu.getAllTypes();
                                   for (org.eclipse.jdt.core.IType type : allTypes) {
                                       if (typeName.equals(type.getFullyQualifiedName())) {
      +                                    processedTypes.add(typeName);
                                           extractTypeInfo(type, classInfoList, monitor);
                                           return;
                                       }
      @@ -130,10 +157,41 @@ public static void resolveSingleType(IJavaProject javaProject, String typeName,
                           }
                       }
                   }
      +            
      +            // Type not found - mark as processed to avoid repeated failed lookups
      +            processedTypes.add(typeName);
      +            
               } catch (JavaModelException e) {
      -            // Log but continue processing other types
      +            // Log and mark as processed even on error to avoid repeated failures
                   JdtlsExtActivator.logException("Error resolving type: " + typeName, e);
      +            processedTypes.add(typeName);
      +        }
      +    }
      +
      +    /**
      +     * Check if a type belongs to a common JDK package that should be skipped.
      +     * Uses package-level matching for efficient filtering.
      +     * 
      +     * @param typeName Fully qualified type name (e.g., "java.lang.String")
      +     * @return true if the type is from a common JDK package
      +     */
      +    private static boolean isCommonJdkType(String typeName) {
      +        if (typeName == null || typeName.isEmpty()) {
      +            return false;
      +        }
      +        
      +        // Extract package name from fully qualified type name
      +        int lastDotIndex = typeName.lastIndexOf('.');
      +        if (lastDotIndex == -1) {
      +            return false; // No package (default package)
               }
      +        
      +        String packageName = typeName.substring(0, lastDotIndex);
      +        
      +        // Check if package matches any common JDK package
      +        // This includes both exact matches and sub-packages
      +        return SKIP_COMMON_JDK_PACKAGES.contains(packageName) || 
      +               SKIP_COMMON_JDK_PACKAGES.stream().anyMatch(pkg -> packageName.startsWith(pkg + "."));
           }
       
           /**
      @@ -284,6 +342,54 @@ public static void resolveStaticMemberFromClass(IJavaProject javaProject, String
               }
           }
       
      +    /**
      +     * Resolve a binary type (from external JAR/JRE) with simplified content.
      +     * This method is used for external dependencies when project sources are sparse.
      +     * 
      +     * @param javaProject The Java project context
      +     * @param typeName Fully qualified type name (e.g., "java.util.ArrayList")
      +     * @param classInfoList List to append resolved class information
      +     * @param processedTypes Set tracking already processed types to avoid duplicates
      +     * @param maxMethods Maximum number of methods to include (to limit token usage)
      +     * @param monitor Progress monitor for cancellation
      +     */
      +    public static void resolveBinaryType(IJavaProject javaProject, String typeName, 
      +            List classInfoList, Set processedTypes, 
      +            int maxMethods, IProgressMonitor monitor) {
      +        try {
      +            if (processedTypes.contains(typeName)) {
      +                return;
      +            }
      +            
      +            // Performance optimization: Skip common JDK packages that Copilot already understands well
      +            // This significantly reduces processing time for external dependencies
      +            if (isCommonJdkType(typeName)) {
      +                processedTypes.add(typeName);
      +                return;
      +            }
      +            
      +            // Use JDT's findType which searches all sources and dependencies
      +            org.eclipse.jdt.core.IType type = javaProject.findType(typeName);
      +            if (type == null || !type.exists()) {
      +                return;
      +            }
      +            
      +            // Only process binary types (from JARs/JRE)
      +            if (!type.isBinary()) {
      +                return; // Skip source types - they should be handled by resolveSingleType
      +            }
      +            
      +            processedTypes.add(typeName);
      +            
      +            // Extract simplified information for binary types
      +            extractBinaryTypeInfo(type, classInfoList, maxMethods, monitor);
      +            
      +        } catch (JavaModelException e) {
      +            // Log but continue processing other types
      +            JdtlsExtActivator.logException("Error resolving binary type: " + typeName, e);
      +        }
      +    }
      +
           /**
            * Resolve all types in a package (for wildcard imports)
            */
      @@ -355,6 +461,173 @@ public static void extractTypeInfo(org.eclipse.jdt.core.IType type, List classInfoList, int maxMethods, IProgressMonitor monitor) {
      +        try {
      +            // Use a placeholder URI for binary types (they don't have local file paths)
      +            String uri = "jar://" + type.getFullyQualifiedName().replace('.', '/') + ".class";
      +            
      +            // Generate simplified class description for binary types
      +            StringBuilder sb = new StringBuilder();
      +            
      +            // 1. Extract class-level JavaDoc (brief summary only)
      +            String javadoc = extractBriefJavaDoc(type);
      +            if (javadoc != null && !javadoc.isEmpty()) {
      +                sb.append("/**\n * ").append(javadoc).append("\n */\n");
      +            }
      +            
      +            // 2. Class signature (modifiers, name, generics, inheritance)
      +            sb.append(generateClassSignature(type));
      +            sb.append(" {\n\n");
      +            
      +            // 3. Public fields (limit to first 5)
      +            org.eclipse.jdt.core.IField[] fields = type.getFields();
      +            int fieldCount = 0;
      +            for (org.eclipse.jdt.core.IField field : fields) {
      +                if (fieldCount >= 5) break;
      +                if (org.eclipse.jdt.core.Flags.isPublic(field.getFlags())) {
      +                    sb.append("    ").append(generateBinaryFieldSignature(field)).append("\n");
      +                    fieldCount++;
      +                }
      +            }
      +            if (fieldCount > 0) {
      +                sb.append("\n");
      +            }
      +            
      +            // 4. Public methods (limited by maxMethods parameter)
      +            org.eclipse.jdt.core.IMethod[] methods = type.getMethods();
      +            int methodCount = 0;
      +            for (org.eclipse.jdt.core.IMethod method : methods) {
      +                if (methodCount >= maxMethods) break;
      +                if (org.eclipse.jdt.core.Flags.isPublic(method.getFlags())) {
      +                    sb.append("    ").append(generateBinaryMethodSignature(method)).append("\n");
      +                    methodCount++;
      +                }
      +            }
      +            
      +            sb.append("}\n");
      +            
      +            // Add note indicating this is simplified external dependency info
      +            sb.append("// Note: External dependency - showing simplified signature only\n");
      +            
      +            // Create ImportClassInfo
      +            ImportClassInfo info = new ImportClassInfo(uri, sb.toString());
      +            classInfoList.add(info);
      +            
      +        } catch (JavaModelException e) {
      +            JdtlsExtActivator.logException("Error extracting binary type info for: " + type.getElementName(), e);
      +        }
      +    }
      +
      +    /**
      +     * Generate class signature with modifiers, name, generics, and inheritance
      +     */
      +    private static String generateClassSignature(org.eclipse.jdt.core.IType type) throws JavaModelException {
      +        StringBuilder sb = new StringBuilder();
      +        
      +        // Modifiers
      +        int flags = type.getFlags();
      +        if (org.eclipse.jdt.core.Flags.isPublic(flags)) sb.append("public ");
      +        if (org.eclipse.jdt.core.Flags.isAbstract(flags) && !type.isInterface()) sb.append("abstract ");
      +        if (org.eclipse.jdt.core.Flags.isFinal(flags)) sb.append("final ");
      +        
      +        // Type kind
      +        if (type.isInterface()) {
      +            sb.append("interface ");
      +        } else if (type.isEnum()) {
      +            sb.append("enum ");
      +        } else if (type.isAnnotation()) {
      +            sb.append("@interface ");
      +        } else {
      +            sb.append("class ");
      +        }
      +        
      +        // Simple name
      +        sb.append(type.getElementName());
      +        
      +        // Type parameters
      +        org.eclipse.jdt.core.ITypeParameter[] typeParams = type.getTypeParameters();
      +        if (typeParams != null && typeParams.length > 0) {
      +            sb.append("<");
      +            for (int i = 0; i < typeParams.length; i++) {
      +                if (i > 0) sb.append(", ");
      +                sb.append(typeParams[i].getElementName());
      +            }
      +            sb.append(">");
      +        }
      +        
      +        // Superclass
      +        String superclass = type.getSuperclassName();
      +        if (superclass != null && !superclass.equals("Object") && !type.isInterface()) {
      +            sb.append(" extends ").append(simplifyTypeName(superclass));
      +        }
      +        
      +        // Interfaces
      +        String[] interfaces = type.getSuperInterfaceNames();
      +        if (interfaces != null && interfaces.length > 0) {
      +            if (type.isInterface()) {
      +                sb.append(" extends ");
      +            } else {
      +                sb.append(" implements ");
      +            }
      +            for (int i = 0; i < interfaces.length; i++) {
      +                if (i > 0) sb.append(", ");
      +                sb.append(simplifyTypeName(interfaces[i]));
      +            }
      +        }
      +        
      +        return sb.toString();
      +    }
      +    
      +    /**
      +     * Extract brief JavaDoc summary for binary types (first sentence only)
      +     * Performance optimization: Skip JavaDoc extraction for binary types to avoid expensive I/O
      +     */
      +    private static String extractBriefJavaDoc(org.eclipse.jdt.core.IType type) {
      +        // Performance optimization: Skip JavaDoc extraction for binary types
      +        // getAttachedJavadoc() is expensive - may involve JAR reading, network downloads, HTML parsing
      +        if (type.isBinary()) {
      +            return null;
      +        }
      +        
      +        try {
      +            String javadoc = type.getAttachedJavadoc(null);
      +            if (javadoc == null || javadoc.isEmpty()) {
      +                return null;
      +            }
      +            return getFirstSentenceOrLimit(javadoc, 120);
      +        } catch (Exception e) {
      +            return null;
      +        }
      +    }
      +
      +    /**
      +     * Generate simplified field signature for binary types
      +     */
      +    private static String generateBinaryFieldSignature(org.eclipse.jdt.core.IField field) {
      +        return generateFieldSignatureInternal(field, true);
      +    }
      +
      +    /**
      +     * Generate simplified method signature for binary types (no implementation)
      +     */
      +    private static String generateBinaryMethodSignature(org.eclipse.jdt.core.IMethod method) {
      +        return generateMethodSignatureInternal(method, true, false);
      +    }
      +
           /**
            * Get file URI/path for the type (instead of fully qualified class name)
            */
      @@ -676,35 +949,7 @@ private static String convertHtmlEntities(String text) {
            * Returns the first sentence or paragraph of the JavaDoc as a brief description
            */
           private static String extractMethodJavaDocSummary(IMethod method) {
      -        try {
      -            // Try to get JavaDoc from source
      -            org.eclipse.jdt.core.ISourceRange javadocRange = method.getJavadocRange();
      -            if (javadocRange == null) {
      -                return "";
      -            }
      -            
      -            String rawJavadoc = method.getCompilationUnit().getSource()
      -                .substring(javadocRange.getOffset(), javadocRange.getOffset() + javadocRange.getLength());
      -            
      -            if (!isNotEmpty(rawJavadoc)) {
      -                return "";
      -            }
      -            
      -            // Clean the JavaDoc comment
      -            String cleaned = cleanJavadocComment(rawJavadoc);
      -            
      -            // Extract the description (before any @param, @return, @throws tags)
      -            String description = extractJavadocDescription(cleaned);
      -            
      -            // Get first sentence or limit length
      -            String summary = getFirstSentenceOrLimit(description, 120);
      -            
      -            return summary;
      -            
      -        } catch (Exception e) {
      -            // Silently fail and return empty string
      -            return "";
      -        }
      +        return extractJavaDocSummaryFromElement(method);
           }
       
           /**
      @@ -748,33 +993,25 @@ private static String getFirstSentenceOrLimit(String text, int maxLength) {
                   return "";
               }
               
      -        // Try to find the first sentence (ending with ., !, or ?)
      -        int firstPeriod = text.indexOf(". ");
      -        int firstExclamation = text.indexOf("! ");
      -        int firstQuestion = text.indexOf("? ");
      -        
      +        // Find first sentence boundary (., !, ?)
      +        int[] boundaries = {text.indexOf(". "), text.indexOf(".\n"), text.indexOf("! "), text.indexOf("? ")};
               int firstSentenceEnd = -1;
      -        if (firstPeriod != -1) firstSentenceEnd = firstPeriod;
      -        if (firstExclamation != -1 && (firstSentenceEnd == -1 || firstExclamation < firstSentenceEnd)) {
      -            firstSentenceEnd = firstExclamation;
      -        }
      -        if (firstQuestion != -1 && (firstSentenceEnd == -1 || firstQuestion < firstSentenceEnd)) {
      -            firstSentenceEnd = firstQuestion;
      +        for (int boundary : boundaries) {
      +            if (boundary != -1 && (firstSentenceEnd == -1 || boundary < firstSentenceEnd)) {
      +                firstSentenceEnd = boundary;
      +            }
               }
               
      -        // If we found a sentence ending and it's within reasonable length
      +        // Return first sentence if within reasonable length
               if (firstSentenceEnd != -1 && firstSentenceEnd < maxLength) {
                   return text.substring(0, firstSentenceEnd + 1).trim();
               }
               
      -        // Otherwise, limit to maxLength
      +        // Otherwise truncate at maxLength with word boundary
               if (text.length() > maxLength) {
      -            // Try to cut at a word boundary
                   int lastSpace = text.lastIndexOf(' ', maxLength);
      -            if (lastSpace > maxLength / 2) {
      -                return text.substring(0, lastSpace).trim() + "...";
      -            }
      -            return text.substring(0, maxLength).trim() + "...";
      +            int cutPoint = (lastSpace > maxLength / 2) ? lastSpace : maxLength;
      +            return text.substring(0, cutPoint).trim() + "...";
               }
               
               return text.trim();
      @@ -784,174 +1021,24 @@ private static String getFirstSentenceOrLimit(String text, int maxLength) {
            * Extract summary description from field JavaDoc
            */
           private static String extractFieldJavaDocSummary(org.eclipse.jdt.core.IField field) {
      -        try {
      -            // Try to get JavaDoc from source
      -            org.eclipse.jdt.core.ISourceRange javadocRange = field.getJavadocRange();
      -            if (javadocRange == null) {
      -                return "";
      -            }
      -            
      -            String rawJavadoc = field.getCompilationUnit().getSource()
      -                .substring(javadocRange.getOffset(), javadocRange.getOffset() + javadocRange.getLength());
      -            
      -            if (!isNotEmpty(rawJavadoc)) {
      -                return "";
      -            }
      -            
      -            // Clean the JavaDoc comment
      -            String cleaned = cleanJavadocComment(rawJavadoc);
      -            
      -            // Extract the description (before any @tags)
      -            String description = extractJavadocDescription(cleaned);
      -            
      -            // Get first sentence or limit length
      -            String summary = getFirstSentenceOrLimit(description, 120);
      -            
      -            return summary;
      -            
      -        } catch (Exception e) {
      -            // Silently fail and return empty string
      -            return "";
      -        }
      +        return extractJavaDocSummaryFromElement(field);
           }
       
           /**
            * Generate human-readable method signature with JavaDoc description
            */
           public static String generateMethodSignature(IMethod method) {
      -        StringBuilder sb = new StringBuilder();
      -        
      -        try {
      -            int flags = method.getFlags();
      -            appendAccessModifiers(sb, flags);
      -            appendOtherModifiers(sb, flags, true);
      -            
      -            // Type parameters (if any)
      -            String[] typeParameters = method.getTypeParameterSignatures();
      -            if (typeParameters != null && typeParameters.length > 0) {
      -                sb.append("<");
      -                for (int i = 0; i < typeParameters.length; i++) {
      -                    if (i > 0) sb.append(", ");
      -                    sb.append(convertTypeSignature(typeParameters[i]));
      -                }
      -                sb.append("> ");
      -            }
      -            
      -            // Return type (constructors don't have return type)
      -            if (!method.isConstructor()) {
      -                String returnType = convertTypeSignature(method.getReturnType());
      -                sb.append(returnType).append(" ");
      -            }
      -            
      -            // Method name
      -            sb.append(method.getElementName()).append("(");
      -            
      -            // Parameter list
      -            String[] paramTypes = method.getParameterTypes();
      -            String[] paramNames = method.getParameterNames();
      -            for (int i = 0; i < paramTypes.length; i++) {
      -                if (i > 0) {
      -                    sb.append(", ");
      -                }
      -                sb.append(convertTypeSignature(paramTypes[i]));
      -                if (paramNames != null && i < paramNames.length) {
      -                    sb.append(" ").append(paramNames[i]);
      -                }
      -            }
      -            
      -            sb.append(")");
      -            
      -            // Exception declarations
      -            String[] exceptionTypes = method.getExceptionTypes();
      -            if (exceptionTypes != null && exceptionTypes.length > 0) {
      -                sb.append(" throws ");
      -                for (int i = 0; i < exceptionTypes.length; i++) {
      -                    if (i > 0) sb.append(", ");
      -                    sb.append(convertTypeSignature(exceptionTypes[i]));
      -                }
      -            }
      -            
      -        } catch (JavaModelException e) {
      -            return method.getElementName() + "(...)";
      -        }
      -        
      -        // Extract JavaDoc description and prepend if exists
      -        String javadocSummary = extractMethodJavaDocSummary(method);
      -        if (isNotEmpty(javadocSummary)) {
      -            return "// " + javadocSummary + "\n      " + sb.toString();
      -        }
      -        
      -        return sb.toString();
      +        return generateMethodSignatureInternal(method, false, true);
           }
       
           /**
            * Generate human-readable field signature with JavaDoc description
            */
           public static String generateFieldSignature(org.eclipse.jdt.core.IField field) {
      -        StringBuilder sb = new StringBuilder();
      -        
      -        try {
      -            int flags = field.getFlags();
      -            appendAccessModifiers(sb, flags);
      -            appendOtherModifiers(sb, flags, false);
      -            
      -            // Type and name
      -            String fieldType = convertTypeSignature(field.getTypeSignature());
      -            sb.append(fieldType).append(" ").append(field.getElementName());
      -            
      -            // If it's a constant, try to get the initial value
      -            if (org.eclipse.jdt.core.Flags.isStatic(flags) && org.eclipse.jdt.core.Flags.isFinal(flags)) {
      -                Object constant = field.getConstant();
      -                if (constant != null) {
      -                    sb.append(" = ");
      -                    if (constant instanceof String) {
      -                        sb.append("\"").append(constant).append("\"");
      -                    } else {
      -                        sb.append(constant);
      -                    }
      -                }
      -            }
      -            
      -        } catch (JavaModelException e) {
      -            return field.getElementName();
      -        }
      -        
      -        // Extract JavaDoc description and prepend if exists
      -        String javadocSummary = extractFieldJavaDocSummary(field);
      -        if (isNotEmpty(javadocSummary)) {
      -            return "// " + javadocSummary + "\n      " + sb.toString();
      -        }
      -        
      -        return sb.toString();
      +        return generateFieldSignatureInternal(field, false);
           }
       
      -    /**
      -     * Append access modifiers (public/protected/private) to StringBuilder
      -     */
      -    private static void appendAccessModifiers(StringBuilder sb, int flags) {
      -        if (org.eclipse.jdt.core.Flags.isPublic(flags)) {
      -            sb.append("public ");
      -        } else if (org.eclipse.jdt.core.Flags.isProtected(flags)) {
      -            sb.append("protected ");
      -        } else if (org.eclipse.jdt.core.Flags.isPrivate(flags)) {
      -            sb.append("private ");
      -        }
      -    }
       
      -    /**
      -     * Append other modifiers (static/final/abstract) to StringBuilder
      -     */
      -    private static void appendOtherModifiers(StringBuilder sb, int flags, boolean isMethod) {
      -        if (org.eclipse.jdt.core.Flags.isStatic(flags)) {
      -            sb.append("static ");
      -        }
      -        if (org.eclipse.jdt.core.Flags.isFinal(flags)) {
      -            sb.append("final ");
      -        }
      -        if (isMethod && org.eclipse.jdt.core.Flags.isAbstract(flags)) {
      -            sb.append("abstract ");
      -        }
      -    }
       
           /**
            * Convert JDT type signature to human-readable format
      @@ -1085,6 +1172,173 @@ private static String simplifyTypeName(String qualifiedName) {
               return lastDot == -1 ? qualifiedName : qualifiedName.substring(lastDot + 1);
           }
       
      +    /**
      +     * Unified JavaDoc summary extractor for methods and fields
      +     */
      +    private static String extractJavaDocSummaryFromElement(org.eclipse.jdt.core.IMember element) {
      +        try {
      +            org.eclipse.jdt.core.ISourceRange javadocRange = element.getJavadocRange();
      +            if (javadocRange == null) {
      +                return "";
      +            }
      +            
      +            String rawJavadoc = element.getCompilationUnit().getSource()
      +                .substring(javadocRange.getOffset(), javadocRange.getOffset() + javadocRange.getLength());
      +            
      +            if (rawJavadoc == null || rawJavadoc.isEmpty()) {
      +                return "";
      +            }
      +            
      +            String cleaned = cleanJavadocComment(rawJavadoc);
      +            String description = extractJavadocDescription(cleaned);
      +            return getFirstSentenceOrLimit(description, 120);
      +        } catch (Exception e) {
      +            return "";
      +        }
      +    }
      +
      +    /**
      +     * Unified method signature generator (handles both source and binary types)
      +     * @param simplified true for binary types (no parameter names, no JavaDoc)
      +     * @param includeJavadoc true to include JavaDoc comments
      +     */
      +    private static String generateMethodSignatureInternal(IMethod method, boolean simplified, boolean includeJavadoc) {
      +        try {
      +            StringBuilder sb = new StringBuilder();
      +            int flags = method.getFlags();
      +            
      +            // Modifiers
      +            if (org.eclipse.jdt.core.Flags.isPublic(flags)) sb.append("public ");
      +            if (!simplified) {
      +                if (org.eclipse.jdt.core.Flags.isProtected(flags)) sb.append("protected ");
      +                if (org.eclipse.jdt.core.Flags.isPrivate(flags)) sb.append("private ");
      +            }
      +            if (org.eclipse.jdt.core.Flags.isStatic(flags)) sb.append("static ");
      +            if (org.eclipse.jdt.core.Flags.isFinal(flags)) sb.append("final ");
      +            if (org.eclipse.jdt.core.Flags.isAbstract(flags)) sb.append("abstract ");
      +            
      +            // Type parameters (only for non-simplified)
      +            if (!simplified) {
      +                @SuppressWarnings("deprecation")
      +                String[] typeParameters = method.getTypeParameterSignatures();
      +                if (typeParameters != null && typeParameters.length > 0) {
      +                    sb.append("<");
      +                    for (int i = 0; i < typeParameters.length; i++) {
      +                        if (i > 0) sb.append(", ");
      +                        sb.append(convertTypeSignature(typeParameters[i]));
      +                    }
      +                    sb.append("> ");
      +                }
      +            }
      +            
      +            // Return type (skip for constructors)
      +            if (!method.isConstructor()) {
      +                String returnType = simplified ? 
      +                    simplifyTypeName(org.eclipse.jdt.core.Signature.toString(method.getReturnType())) :
      +                    convertTypeSignature(method.getReturnType());
      +                sb.append(returnType).append(" ");
      +            }
      +            
      +            // Method name and parameters
      +            sb.append(method.getElementName()).append("(");
      +            String[] paramTypes = method.getParameterTypes();
      +            String[] paramNames = simplified ? null : method.getParameterNames();
      +            
      +            for (int i = 0; i < paramTypes.length; i++) {
      +                if (i > 0) sb.append(", ");
      +                String paramType = simplified ? 
      +                    simplifyTypeName(org.eclipse.jdt.core.Signature.toString(paramTypes[i])) :
      +                    convertTypeSignature(paramTypes[i]);
      +                sb.append(paramType);
      +                if (paramNames != null && i < paramNames.length) {
      +                    sb.append(" ").append(paramNames[i]);
      +                }
      +            }
      +            sb.append(")");
      +            
      +            // Exception declarations (only for non-simplified)
      +            if (!simplified) {
      +                String[] exceptionTypes = method.getExceptionTypes();
      +                if (exceptionTypes != null && exceptionTypes.length > 0) {
      +                    sb.append(" throws ");
      +                    for (int i = 0; i < exceptionTypes.length; i++) {
      +                        if (i > 0) sb.append(", ");
      +                        sb.append(convertTypeSignature(exceptionTypes[i]));
      +                    }
      +                }
      +            } else {
      +                sb.append(";");
      +            }
      +            
      +            // Add JavaDoc if requested
      +            if (includeJavadoc) {
      +                String javadocSummary = extractMethodJavaDocSummary(method);
      +                if (javadocSummary != null && !javadocSummary.isEmpty()) {
      +                    return "// " + javadocSummary + "\n      " + sb.toString();
      +                }
      +            }
      +            
      +            return sb.toString();
      +        } catch (JavaModelException e) {
      +            return simplified ? "// Error generating method signature" : method.getElementName() + "(...)";
      +        }
      +    }
      +
      +    /**
      +     * Unified field signature generator (handles both source and binary types)
      +     * @param simplified true for binary types (no constant values, no JavaDoc)
      +     */
      +    private static String generateFieldSignatureInternal(org.eclipse.jdt.core.IField field, boolean simplified) {
      +        try {
      +            StringBuilder sb = new StringBuilder();
      +            int flags = field.getFlags();
      +            
      +            // Modifiers
      +            if (org.eclipse.jdt.core.Flags.isPublic(flags)) sb.append("public ");
      +            if (!simplified) {
      +                if (org.eclipse.jdt.core.Flags.isProtected(flags)) sb.append("protected ");
      +                if (org.eclipse.jdt.core.Flags.isPrivate(flags)) sb.append("private ");
      +            }
      +            if (org.eclipse.jdt.core.Flags.isStatic(flags)) sb.append("static ");
      +            if (org.eclipse.jdt.core.Flags.isFinal(flags)) sb.append("final ");
      +            
      +            // Type and name
      +            String fieldType = simplified ?
      +                simplifyTypeName(org.eclipse.jdt.core.Signature.toString(field.getTypeSignature())) :
      +                convertTypeSignature(field.getTypeSignature());
      +            sb.append(fieldType).append(" ").append(field.getElementName());
      +            
      +            // Constant value (only for non-simplified)
      +            if (!simplified && org.eclipse.jdt.core.Flags.isStatic(flags) && org.eclipse.jdt.core.Flags.isFinal(flags)) {
      +                Object constant = field.getConstant();
      +                if (constant != null) {
      +                    sb.append(" = ");
      +                    if (constant instanceof String) {
      +                        sb.append("\"").append(constant).append("\"");
      +                    } else {
      +                        sb.append(constant);
      +                    }
      +                }
      +            }
      +            
      +            if (simplified) {
      +                sb.append(";");
      +            }
      +            
      +            // Add JavaDoc if not simplified
      +            if (!simplified) {
      +                String javadocSummary = extractFieldJavaDocSummary(field);
      +                if (javadocSummary != null && !javadocSummary.isEmpty()) {
      +                    return "// " + javadocSummary + "\n      " + sb.toString();
      +                }
      +            }
      +            
      +            return sb.toString();
      +        } catch (JavaModelException e) {
      +            return simplified ? "// Error generating field signature" : field.getElementName();
      +        }
      +    }
      +
           /**
            * Utility method to check if a string is not empty or null
            */
      diff --git a/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/parser/ProjectResolver.java b/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/parser/ProjectResolver.java
      new file mode 100644
      index 00000000..2f317a41
      --- /dev/null
      +++ b/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/parser/ProjectResolver.java
      @@ -0,0 +1,254 @@
      +package com.microsoft.jdtls.ext.core.parser;
      +
      +import java.util.ArrayList;
      +import java.util.List;
      +
      +import org.eclipse.core.resources.IProject;
      +import org.eclipse.core.resources.IWorkspaceRoot;
      +import org.eclipse.core.resources.ResourcesPlugin;
      +import org.eclipse.core.runtime.IPath;
      +import org.eclipse.core.runtime.IProgressMonitor;
      +import org.eclipse.jdt.core.IClasspathEntry;
      +import org.eclipse.jdt.core.IJavaProject;
      +import org.eclipse.jdt.core.JavaCore;
      +import org.eclipse.jdt.core.JavaModelException;
      +import org.eclipse.jdt.launching.JavaRuntime;
      +import org.eclipse.jdt.ls.core.internal.ResourceUtils;
      +
      +import com.microsoft.jdtls.ext.core.JdtlsExtActivator;
      +
      +public class ProjectResolver {
      +    
      +    // Constants for dependency info keys
      +    private static final String KEY_BUILD_TOOL = "buildTool";
      +    private static final String KEY_PROJECT_NAME = "projectName";
      +    private static final String KEY_PROJECT_LOCATION = "projectLocation";
      +    private static final String KEY_JAVA_VERSION = "javaVersion";
      +    private static final String KEY_SOURCE_COMPATIBILITY = "sourceCompatibility";
      +    private static final String KEY_TARGET_COMPATIBILITY = "targetCompatibility";
      +    private static final String KEY_MODULE_NAME = "moduleName";
      +    private static final String KEY_TOTAL_LIBRARIES = "totalLibraries";
      +    private static final String KEY_TOTAL_PROJECT_REFS = "totalProjectReferences";
      +    private static final String KEY_JRE_CONTAINER_PATH = "jreContainerPath";
      +    private static final String KEY_JRE_CONTAINER = "jreContainer";
      +    
      +    public static class DependencyInfo {
      +        public String key;
      +        public String value;
      +
      +        public DependencyInfo(String key, String value) {
      +            this.key = key;
      +            this.value = value;
      +        }
      +    }
      +    
      +    /**
      +     * Resolve project dependencies information including JDK version.
      +     * 
      +     * @param projectUri The project URI
      +     * @param monitor Progress monitor for cancellation support
      +     * @return List of DependencyInfo containing key-value pairs of project information
      +     */
      +    public static List resolveProjectDependencies(String projectUri, IProgressMonitor monitor) {
      +        List result = new ArrayList<>();
      +        
      +        try {
      +            IPath projectPath = ResourceUtils.canonicalFilePathFromURI(projectUri);
      +            
      +            // Find the project
      +            IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
      +            IProject project = findProjectByPath(root, projectPath);
      +            
      +            if (project == null || !project.isAccessible()) {
      +                return result;
      +            }
      +            
      +            IJavaProject javaProject = JavaCore.create(project);
      +            if (javaProject == null || !javaProject.exists()) {
      +                return result;
      +            }
      +            
      +            // Add basic project information
      +            addBasicProjectInfo(result, project, javaProject);
      +            
      +            // Get classpath entries (dependencies)
      +            processClasspathEntries(result, javaProject, monitor);
      +            
      +            // Add build tool info by checking for build files
      +            detectBuildTool(result, project);
      +            
      +        } catch (Exception e) {
      +            JdtlsExtActivator.logException("Error in resolveProjectDependencies", e);
      +        }
      +        
      +        return result;
      +    }
      +    
      +    /**
      +     * Find project by path from all projects in workspace.
      +     */
      +    private static IProject findProjectByPath(IWorkspaceRoot root, IPath projectPath) {
      +        IProject[] allProjects = root.getProjects();
      +        for (IProject p : allProjects) {
      +            if (p.getLocation() != null && p.getLocation().equals(projectPath)) {
      +                return p;
      +            }
      +        }
      +        return null;
      +    }
      +    
      +    /**
      +     * Add basic project information including name, location, and Java version settings.
      +     */
      +    private static void addBasicProjectInfo(List result, IProject project, IJavaProject javaProject) {
      +        result.add(new DependencyInfo(KEY_PROJECT_NAME, project.getName()));
      +        
      +        addIfNotNull(result, KEY_PROJECT_LOCATION, 
      +            project.getLocation() != null ? project.getLocation().toOSString() : null);
      +        
      +        addIfNotNull(result, KEY_JAVA_VERSION, 
      +            javaProject.getOption(JavaCore.COMPILER_COMPLIANCE, true));
      +        
      +        addIfNotNull(result, KEY_SOURCE_COMPATIBILITY, 
      +            javaProject.getOption(JavaCore.COMPILER_SOURCE, true));
      +        
      +        addIfNotNull(result, KEY_TARGET_COMPATIBILITY, 
      +            javaProject.getOption(JavaCore.COMPILER_CODEGEN_TARGET_PLATFORM, true));
      +        
      +        addIfNotNull(result, KEY_MODULE_NAME, getModuleName(javaProject));
      +    }
      +    
      +    /**
      +     * Process classpath entries to extract library and project reference information.
      +     */
      +    private static void processClasspathEntries(List result, IJavaProject javaProject, IProgressMonitor monitor) {
      +        try {
      +            IClasspathEntry[] classpathEntries = javaProject.getResolvedClasspath(true);
      +            int libCount = 0;
      +            int projectRefCount = 0;
      +            
      +            for (IClasspathEntry entry : classpathEntries) {
      +                if (monitor.isCanceled()) {
      +                    break;
      +                }
      +                
      +                switch (entry.getEntryKind()) {
      +                    case IClasspathEntry.CPE_LIBRARY:
      +                        libCount++;
      +                        processLibraryEntry(result, entry, libCount);
      +                        break;
      +                    case IClasspathEntry.CPE_PROJECT:
      +                        projectRefCount++;
      +                        processProjectEntry(result, entry, projectRefCount);
      +                        break;
      +                    case IClasspathEntry.CPE_CONTAINER:
      +                        processContainerEntry(result, entry);
      +                        break;
      +                }
      +            }
      +            
      +            // Add summary counts
      +            result.add(new DependencyInfo(KEY_TOTAL_LIBRARIES, String.valueOf(libCount)));
      +            result.add(new DependencyInfo(KEY_TOTAL_PROJECT_REFS, String.valueOf(projectRefCount)));
      +            
      +        } catch (JavaModelException e) {
      +            JdtlsExtActivator.logException("Error getting classpath entries", e);
      +        }
      +    }
      +    
      +    /**
      +     * Process a library classpath entry.
      +     */
      +    private static void processLibraryEntry(List result, IClasspathEntry entry, int libCount) {
      +        IPath libPath = entry.getPath();
      +        if (libPath != null) {
      +            result.add(new DependencyInfo("library_" + libCount, 
      +                libPath.lastSegment() + " (" + libPath.toOSString() + ")"));
      +        }
      +    }
      +    
      +    /**
      +     * Process a project reference classpath entry.
      +     */
      +    private static void processProjectEntry(List result, IClasspathEntry entry, int projectRefCount) {
      +        IPath projectRefPath = entry.getPath();
      +        if (projectRefPath != null) {
      +            result.add(new DependencyInfo("projectReference_" + projectRefCount, 
      +                projectRefPath.lastSegment()));
      +        }
      +    }
      +    
      +    /**
      +     * Process a container classpath entry (JRE, Maven, Gradle containers).
      +     */
      +    private static void processContainerEntry(List result, IClasspathEntry entry) {
      +        String containerPath = entry.getPath().toString();
      +        
      +        if (containerPath.contains("JRE_CONTAINER")) {
      +            result.add(new DependencyInfo(KEY_JRE_CONTAINER_PATH, containerPath));
      +            try {
      +                String vmInstallName = JavaRuntime.getVMInstallName(entry.getPath());
      +                addIfNotNull(result, KEY_JRE_CONTAINER, vmInstallName);
      +            } catch (Exception e) {
      +                // Ignore if unable to get VM install name
      +            }
      +        } else if (containerPath.contains("MAVEN")) {
      +            result.add(new DependencyInfo(KEY_BUILD_TOOL, "Maven"));
      +        } else if (containerPath.contains("GRADLE")) {
      +            result.add(new DependencyInfo(KEY_BUILD_TOOL, "Gradle"));
      +        }
      +    }
      +    
      +    /**
      +     * Detect build tool by checking for build configuration files.
      +     * Only adds if not already detected from classpath containers.
      +     */
      +    private static void detectBuildTool(List result, IProject project) {
      +        // Check if buildTool already set from container
      +        if (hasBuildToolInfo(result)) {
      +            return;
      +        }
      +        
      +        if (project.getFile("pom.xml").exists()) {
      +            result.add(new DependencyInfo(KEY_BUILD_TOOL, "Maven"));
      +        } else if (project.getFile("build.gradle").exists() || project.getFile("build.gradle.kts").exists()) {
      +            result.add(new DependencyInfo(KEY_BUILD_TOOL, "Gradle"));
      +        }
      +    }
      +    
      +    /**
      +     * Get module name for a Java project.
      +     */
      +    private static String getModuleName(IJavaProject project) {
      +        if (project == null || !JavaRuntime.isModularProject(project)) {
      +            return null;
      +        }
      +        try {
      +            org.eclipse.jdt.core.IModuleDescription module = project.getModuleDescription();
      +            return module != null ? module.getElementName() : null;
      +        } catch (Exception e) {
      +            return null;
      +        }
      +    }
      +    
      +    /**
      +     * Helper method to add dependency info only if value is not null.
      +     */
      +    private static void addIfNotNull(List result, String key, String value) {
      +        if (value != null) {
      +            result.add(new DependencyInfo(key, value));
      +        }
      +    }
      +    
      +    /**
      +     * Check if buildTool info is already present in result list.
      +     */
      +    private static boolean hasBuildToolInfo(List result) {
      +        for (DependencyInfo info : result) {
      +            if (KEY_BUILD_TOOL.equals(info.key)) {
      +                return true;
      +            }
      +        }
      +        return false;
      +    }
      +}
      diff --git a/src/commands.ts b/src/commands.ts
      index f3887ef7..a7338c0a 100644
      --- a/src/commands.ts
      +++ b/src/commands.ts
      @@ -134,6 +134,8 @@ export namespace Commands {
       
           export const JAVA_PROJECT_CHECK_IMPORT_STATUS = "java.project.checkImportStatus";
       
      +    export const JAVA_PROJECT_GET_DEPENDENCIES = "java.project.getDependencies";
      +
           export const JAVA_UPGRADE_WITH_COPILOT = "_java.upgradeWithCopilot";
       
           /**
      diff --git a/src/java/jdtls.ts b/src/java/jdtls.ts
      index c1388253..84a372a0 100644
      --- a/src/java/jdtls.ts
      +++ b/src/java/jdtls.ts
      @@ -82,6 +82,10 @@ export namespace Jdtls {
               return commands.executeCommand(Commands.EXECUTE_WORKSPACE_COMMAND, Commands.JAVA_PROJECT_CHECK_IMPORT_STATUS) || false;
           }
       
      +    export async function getProjectDependencies(projectUri: string): Promise {
      +        return await commands.executeCommand(Commands.EXECUTE_WORKSPACE_COMMAND, Commands.JAVA_PROJECT_GET_DEPENDENCIES, projectUri) || [];
      +    }
      +
           export enum CompileWorkspaceStatus {
               Failed = 0,
               Succeed = 1,
      @@ -97,4 +101,9 @@ export namespace Jdtls {
       interface IPackageDataParam {
           projectUri: string | undefined;
           [key: string]: any;
      +}
      +
      +export interface IDependencyInfo {
      +    key: string;
      +    value: string;
       }
      \ No newline at end of file
      
      From 609dfd20eb1739add35504a499141901dbfba4ce Mon Sep 17 00:00:00 2001
      From: wenyt <75360946+wenytang-ms@users.noreply.github.com>
      Date: Fri, 24 Oct 2025 15:52:28 +0800
      Subject: [PATCH 240/352] docs: add changelog to 0.26.2 (#920)
      
      * docs: add changelog to 0.26.2
      
      * ci: revert node version
      ---
       CHANGELOG.md      | 4 ++++
       package-lock.json | 2 +-
       package.json      | 2 +-
       3 files changed, 6 insertions(+), 2 deletions(-)
      
      diff --git a/CHANGELOG.md b/CHANGELOG.md
      index c165ef1a..2f3be684 100644
      --- a/CHANGELOG.md
      +++ b/CHANGELOG.md
      @@ -4,6 +4,10 @@ All notable changes to the "vscode-java-dependency" extension will be documented
       The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/)
       and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html).
       
      +## 0.26.2
      +
      +- Enhancement - Add getProjectInfo method to collect project info in https://github.com/microsoft/vscode-java-dependency/pull/919
      +
       ## 0.26.1
       
       - fix - Calculate package version range for upgrade by @FluoriteCafe-work in https://github.com/microsoft/vscode-java-dependency/pull/910
      diff --git a/package-lock.json b/package-lock.json
      index 5863a3aa..f8fdb6bb 100644
      --- a/package-lock.json
      +++ b/package-lock.json
      @@ -1,6 +1,6 @@
       {
         "name": "vscode-java-dependency",
      -  "version": "0.26.1",
      +  "version": "0.26.2",
         "lockfileVersion": 2,
         "requires": true,
         "packages": {
      diff --git a/package.json b/package.json
      index 217d60d7..9f0dc1b0 100644
      --- a/package.json
      +++ b/package.json
      @@ -2,7 +2,7 @@
         "name": "vscode-java-dependency",
         "displayName": "Project Manager for Java",
         "description": "%description%",
      -  "version": "0.26.1",
      +  "version": "0.26.2",
         "publisher": "vscjava",
         "preview": false,
         "aiKey": "5c642b22-e845-4400-badb-3f8509a70777",
      
      From a9fa7074c6eeabe6ed7fd2e8648bd495c939ae83 Mon Sep 17 00:00:00 2001
      From: wenyt <75360946+wenytang-ms@users.noreply.github.com>
      Date: Mon, 3 Nov 2025 15:02:46 +0800
      Subject: [PATCH 241/352] feat: format get java project info result (#926)
      
      * feat: support aggregate projects and format result
      
      * fix: update
      ---
       .../jdtls/ext/core/ProjectCommand.java        |  6 +--
       .../ext/core/parser/ProjectResolver.java      | 53 +++++++++++++++----
       2 files changed, 46 insertions(+), 13 deletions(-)
      
      diff --git a/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/ProjectCommand.java b/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/ProjectCommand.java
      index 4aa6632b..002f8072 100644
      --- a/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/ProjectCommand.java
      +++ b/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/ProjectCommand.java
      @@ -506,7 +506,7 @@ private static String getSeverityString(int severity) {
           /**
            * Get project dependencies information including JDK version.
            * 
      -     * @param arguments List containing the project URI as the first element
      +     * @param arguments List containing the file URI as the first element
            * @param monitor Progress monitor for cancellation support
            * @return List of DependencyInfo containing key-value pairs of project information
            */
      @@ -515,8 +515,8 @@ public static List getProjectDependencies(List arguments
                   return new ArrayList<>();
               }
       
      -        String projectUri = (String) arguments.get(0);
      -        List resolverResult = ProjectResolver.resolveProjectDependencies(projectUri, monitor);
      +        String fileUri = (String) arguments.get(0);
      +        List resolverResult = ProjectResolver.resolveProjectDependencies(fileUri, monitor);
               
               // Convert ProjectResolver.DependencyInfo to ProjectCommand.DependencyInfo
               List result = new ArrayList<>();
      diff --git a/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/parser/ProjectResolver.java b/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/parser/ProjectResolver.java
      index 2f317a41..77d2d256 100644
      --- a/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/parser/ProjectResolver.java
      +++ b/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/parser/ProjectResolver.java
      @@ -2,10 +2,13 @@
       
       import java.util.ArrayList;
       import java.util.List;
      +import java.util.Map;
      +import java.util.concurrent.ConcurrentHashMap;
       
       import org.eclipse.core.resources.IProject;
       import org.eclipse.core.resources.IWorkspaceRoot;
       import org.eclipse.core.resources.ResourcesPlugin;
      +import org.eclipse.core.runtime.CoreException;
       import org.eclipse.core.runtime.IPath;
       import org.eclipse.core.runtime.IProgressMonitor;
       import org.eclipse.jdt.core.IClasspathEntry;
      @@ -44,26 +47,28 @@ public DependencyInfo(String key, String value) {
           
           /**
            * Resolve project dependencies information including JDK version.
      +     * Supports both single projects and multi-module aggregator projects.
            * 
      -     * @param projectUri The project URI
      +     * @param fileUri The file URI
            * @param monitor Progress monitor for cancellation support
            * @return List of DependencyInfo containing key-value pairs of project information
            */
      -    public static List resolveProjectDependencies(String projectUri, IProgressMonitor monitor) {
      +    public static List resolveProjectDependencies(String fileUri, IProgressMonitor monitor) {
               List result = new ArrayList<>();
               
               try {
      -            IPath projectPath = ResourceUtils.canonicalFilePathFromURI(projectUri);
      +            IPath fileIPath = ResourceUtils.canonicalFilePathFromURI(fileUri);
                   
                   // Find the project
                   IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
      -            IProject project = findProjectByPath(root, projectPath);
      +            IProject project = findProjectByPath(root, fileIPath);
                   
                   if (project == null || !project.isAccessible()) {
                       return result;
                   }
                   
                   IJavaProject javaProject = JavaCore.create(project);
      +            // Check if this is a Java project
                   if (javaProject == null || !javaProject.exists()) {
                       return result;
                   }
      @@ -86,14 +91,31 @@ public static List resolveProjectDependencies(String projectUri,
           
           /**
            * Find project by path from all projects in workspace.
      +     * The path can be either a project root path or a file/folder path within a project.
      +     * This method will find the project that contains the given path.
      +     * 
      +     * @param root The workspace root
      +     * @param filePath The path to search for (can be project root or file within project)
      +     * @return The project that contains the path, or null if not found
            */
      -    private static IProject findProjectByPath(IWorkspaceRoot root, IPath projectPath) {
      +    private static IProject findProjectByPath(IWorkspaceRoot root, IPath filePath) {
               IProject[] allProjects = root.getProjects();
      +        
      +        // First pass: check for exact project location match (most efficient)
               for (IProject p : allProjects) {
      -            if (p.getLocation() != null && p.getLocation().equals(projectPath)) {
      +            if (p.getLocation() != null && p.getLocation().equals(filePath)) {
                       return p;
                   }
               }
      +        
      +        // Second pass: check if the file path is within any project directory
      +        // This handles cases where filePath points to a file or folder inside a project
      +        for (IProject p : allProjects) {
      +            if (p.getLocation() != null && p.getLocation().isPrefixOf(filePath)) {
      +                return p;
      +            }
      +        }
      +        
               return null;
           }
           
      @@ -158,17 +180,19 @@ private static void processClasspathEntries(List result, IJavaPr
           
           /**
            * Process a library classpath entry.
      +     * Only returns the library file name without full path to reduce data size.
            */
           private static void processLibraryEntry(List result, IClasspathEntry entry, int libCount) {
               IPath libPath = entry.getPath();
               if (libPath != null) {
      -            result.add(new DependencyInfo("library_" + libCount, 
      -                libPath.lastSegment() + " (" + libPath.toOSString() + ")"));
      +            // Only keep the file name, remove the full path
      +            result.add(new DependencyInfo("library_" + libCount, libPath.lastSegment()));
               }
           }
           
           /**
            * Process a project reference classpath entry.
      +     * Simplified to only extract essential information.
            */
           private static void processProjectEntry(List result, IClasspathEntry entry, int projectRefCount) {
               IPath projectRefPath = entry.getPath();
      @@ -185,12 +209,21 @@ private static void processContainerEntry(List result, IClasspat
               String containerPath = entry.getPath().toString();
               
               if (containerPath.contains("JRE_CONTAINER")) {
      -            result.add(new DependencyInfo(KEY_JRE_CONTAINER_PATH, containerPath));
      +            // Only extract the JRE version, not the full container path
                   try {
                       String vmInstallName = JavaRuntime.getVMInstallName(entry.getPath());
                       addIfNotNull(result, KEY_JRE_CONTAINER, vmInstallName);
                   } catch (Exception e) {
      -                // Ignore if unable to get VM install name
      +                // Fallback: try to extract version from path
      +                if (containerPath.contains("JavaSE-")) {
      +                    int startIdx = containerPath.lastIndexOf("JavaSE-");
      +                    String version = containerPath.substring(startIdx);
      +                    // Clean up any trailing characters
      +                    if (version.contains("/")) {
      +                        version = version.substring(0, version.indexOf("/"));
      +                    }
      +                    result.add(new DependencyInfo(KEY_JRE_CONTAINER, version));
      +                }
                   }
               } else if (containerPath.contains("MAVEN")) {
                   result.add(new DependencyInfo(KEY_BUILD_TOOL, "Maven"));
      
      From b3fd5db31295a782c7e306a15199b414598deffd Mon Sep 17 00:00:00 2001
      From: wenyt <75360946+wenytang-ms@users.noreply.github.com>
      Date: Mon, 3 Nov 2025 15:48:25 +0800
      Subject: [PATCH 242/352] feat: add cache to project resolver (#925)
      
      * feat: add cache to project resolver
      
      * perf: update project location as key
      
      * fix: fix error
      ---
       .../ext/core/parser/ProjectResolver.java      | 201 ++++++++++++++++++
       1 file changed, 201 insertions(+)
      
      diff --git a/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/parser/ProjectResolver.java b/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/parser/ProjectResolver.java
      index 77d2d256..b41aaa6c 100644
      --- a/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/parser/ProjectResolver.java
      +++ b/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/parser/ProjectResolver.java
      @@ -6,12 +6,21 @@
       import java.util.concurrent.ConcurrentHashMap;
       
       import org.eclipse.core.resources.IProject;
      +import org.eclipse.core.resources.IResource;
      +import org.eclipse.core.resources.IResourceChangeEvent;
      +import org.eclipse.core.resources.IResourceChangeListener;
      +import org.eclipse.core.resources.IResourceDelta;
      +import org.eclipse.core.resources.IResourceDeltaVisitor;
       import org.eclipse.core.resources.IWorkspaceRoot;
       import org.eclipse.core.resources.ResourcesPlugin;
       import org.eclipse.core.runtime.CoreException;
       import org.eclipse.core.runtime.IPath;
       import org.eclipse.core.runtime.IProgressMonitor;
      +import org.eclipse.jdt.core.ElementChangedEvent;
       import org.eclipse.jdt.core.IClasspathEntry;
      +import org.eclipse.jdt.core.IElementChangedListener;
      +import org.eclipse.jdt.core.IJavaElement;
      +import org.eclipse.jdt.core.IJavaElementDelta;
       import org.eclipse.jdt.core.IJavaProject;
       import org.eclipse.jdt.core.JavaCore;
       import org.eclipse.jdt.core.JavaModelException;
      @@ -21,6 +30,179 @@
       import com.microsoft.jdtls.ext.core.JdtlsExtActivator;
       
       public class ProjectResolver {
      +
      +    // Cache for project dependency information
      +    private static final Map dependencyCache = new ConcurrentHashMap<>();
      +    
      +    // Flag to track if listeners are registered
      +    private static volatile boolean listenersRegistered = false;
      +    
      +    // Lock for listener registration
      +    private static final Object listenerLock = new Object();
      +    
      +    /**
      +     * Cached dependency information with timestamp
      +     */
      +    private static class CachedDependencyInfo {
      +        final List dependencies;
      +        final long timestamp;
      +        final long classpathHash;
      +        
      +        CachedDependencyInfo(List dependencies, long classpathHash) {
      +            this.dependencies = new ArrayList<>(dependencies);
      +            this.timestamp = System.currentTimeMillis();
      +            this.classpathHash = classpathHash;
      +        }
      +        
      +        boolean isValid() {
      +            // Cache is valid for 5 minutes
      +            return (System.currentTimeMillis() - timestamp) < 300000;
      +        }
      +    }
      +    
      +    /**
      +     * Listener for Java element changes (classpath changes, project references, etc.)
      +     */
      +    private static final IElementChangedListener javaElementListener = new IElementChangedListener() {
      +        @Override
      +        public void elementChanged(ElementChangedEvent event) {
      +            IJavaElementDelta delta = event.getDelta();
      +            processDelta(delta);
      +        }
      +        
      +        private void processDelta(IJavaElementDelta delta) {
      +            IJavaElement element = delta.getElement();
      +            int flags = delta.getFlags();
      +            
      +            // Check for classpath changes
      +            if ((flags & IJavaElementDelta.F_CLASSPATH_CHANGED) != 0 ||
      +                (flags & IJavaElementDelta.F_RESOLVED_CLASSPATH_CHANGED) != 0) {
      +                
      +                if (element instanceof IJavaProject) {
      +                    IJavaProject project = (IJavaProject) element;
      +                    invalidateCache(project.getProject());
      +                }
      +            }
      +            
      +            // Recursively process children
      +            for (IJavaElementDelta child : delta.getAffectedChildren()) {
      +                processDelta(child);
      +            }
      +        }
      +    };
      +    
      +    /**
      +     * Listener for resource changes (pom.xml, build.gradle, etc.)
      +     */
      +    private static final IResourceChangeListener resourceListener = new IResourceChangeListener() {
      +        @Override
      +        public void resourceChanged(IResourceChangeEvent event) {
      +            if (event.getType() != IResourceChangeEvent.POST_CHANGE) {
      +                return;
      +            }
      +            
      +            IResourceDelta delta = event.getDelta();
      +            if (delta == null) {
      +                return;
      +            }
      +            
      +            try {
      +                delta.accept(new IResourceDeltaVisitor() {
      +                    @Override
      +                    public boolean visit(IResourceDelta delta) throws CoreException {
      +                        IResource resource = delta.getResource();
      +                        
      +                        // Check for build file changes
      +                        if (resource.getType() == IResource.FILE) {
      +                            String fileName = resource.getName();
      +                            if ("pom.xml".equals(fileName) || 
      +                                "build.gradle".equals(fileName) || 
      +                                "build.gradle.kts".equals(fileName) ||
      +                                ".classpath".equals(fileName) ||
      +                                ".project".equals(fileName)) {
      +                                
      +                                IProject project = resource.getProject();
      +                                if (project != null) {
      +                                    invalidateCache(project);
      +                                }
      +                            }
      +                        }
      +                        return true;
      +                    }
      +                });
      +            } catch (CoreException e) {
      +                JdtlsExtActivator.logException("Error processing resource delta", e);
      +            }
      +        }
      +    };
      +    
      +    /**
      +     * Initialize listeners for cache invalidation
      +     */
      +    private static void ensureListenersRegistered() {
      +        if (!listenersRegistered) {
      +            synchronized (listenerLock) {
      +                if (!listenersRegistered) {
      +                    try {
      +                        // Register Java element change listener
      +                        JavaCore.addElementChangedListener(javaElementListener, 
      +                            ElementChangedEvent.POST_CHANGE);
      +                        
      +                        // Register resource change listener
      +                        ResourcesPlugin.getWorkspace().addResourceChangeListener(
      +                            resourceListener, 
      +                            IResourceChangeEvent.POST_CHANGE);
      +                        
      +                        listenersRegistered = true;
      +                        JdtlsExtActivator.logInfo("ProjectResolver cache listeners registered successfully");
      +                    } catch (Exception e) {
      +                        JdtlsExtActivator.logException("Failed to register ProjectResolver listeners", e);
      +                    }
      +                }
      +            }
      +        }
      +    }
      +    
      +    /**
      +     * Invalidate cache for a specific project
      +     */
      +    private static void invalidateCache(IProject project) {
      +        if (project == null) {
      +            return;
      +        }
      +        
      +        String projectPath = project.getLocation() != null ? 
      +            project.getLocation().toOSString() : project.getName();
      +        
      +        if (dependencyCache.remove(projectPath) != null) {
      +            JdtlsExtActivator.logInfo("Cache invalidated for project: " + project.getName());
      +        }
      +    }
      +    
      +    /**
      +     * Clear all cached dependency information
      +     */
      +    public static void clearCache() {
      +        dependencyCache.clear();
      +        JdtlsExtActivator.logInfo("ProjectResolver cache cleared");
      +    }
      +    
      +    /**
      +     * Calculate a simple hash of classpath entries for cache validation
      +     */
      +    private static long calculateClasspathHash(IJavaProject javaProject) {
      +        try {
      +            IClasspathEntry[] entries = javaProject.getResolvedClasspath(true);
      +            long hash = 0;
      +            for (IClasspathEntry entry : entries) {
      +                hash = hash * 31 + entry.getPath().toString().hashCode();
      +                hash = hash * 31 + entry.getEntryKind();
      +            }
      +            return hash;
      +        } catch (JavaModelException e) {
      +            return 0;
      +        }
      +    }
           
           // Constants for dependency info keys
           private static final String KEY_BUILD_TOOL = "buildTool";
      @@ -54,6 +236,9 @@ public DependencyInfo(String key, String value) {
            * @return List of DependencyInfo containing key-value pairs of project information
            */
           public static List resolveProjectDependencies(String fileUri, IProgressMonitor monitor) {
      +        // Ensure listeners are registered for cache invalidation
      +        ensureListenersRegistered();
      +
               List result = new ArrayList<>();
               
               try {
      @@ -73,6 +258,19 @@ public static List resolveProjectDependencies(String fileUri, IP
                       return result;
                   }
                   
      +            // Generate cache key based on project location
      +            String cacheKey = project.getLocation().toOSString();
      +            
      +            // Calculate current classpath hash for validation
      +            long currentClasspathHash = calculateClasspathHash(javaProject);
      +            
      +            // Try to get from cache
      +            CachedDependencyInfo cached = dependencyCache.get(cacheKey);
      +            if (cached != null && cached.isValid() && cached.classpathHash == currentClasspathHash) {
      +                JdtlsExtActivator.logInfo("Using cached dependencies for project: " + project.getName());
      +                return new ArrayList<>(cached.dependencies);
      +            }
      +            
                   // Add basic project information
                   addBasicProjectInfo(result, project, javaProject);
                   
      @@ -81,6 +279,9 @@ public static List resolveProjectDependencies(String fileUri, IP
                   
                   // Add build tool info by checking for build files
                   detectBuildTool(result, project);
      +
      +            // Store in cache
      +            dependencyCache.put(cacheKey, new CachedDependencyInfo(result, currentClasspathHash));
                   
               } catch (Exception e) {
                   JdtlsExtActivator.logException("Error in resolveProjectDependencies", e);
      
      From 926603d0ce288d702a25acaf1509c0dce6d6a890 Mon Sep 17 00:00:00 2001
      From: wenyt <75360946+wenytang-ms@users.noreply.github.com>
      Date: Mon, 3 Nov 2025 16:22:22 +0800
      Subject: [PATCH 243/352] feat: support context provider api (#924)
      
      * feat: support context provider api
      
      * style: fix format style
      
      * ci: fix
      
      * perf: update code to comments
      ---
       package-lock.json              | 174 +++++++++++++++-
       package.json                   |   1 +
       src/commands.ts                |   2 +
       src/copilot/contextProvider.ts | 153 ++++++++++++++
       src/copilot/copilotHelper.ts   | 362 +++++++++++++++++++++++++++++++++
       src/copilot/utils.ts           | 233 +++++++++++++++++++++
       src/extension.ts               |   2 +
       7 files changed, 926 insertions(+), 1 deletion(-)
       create mode 100644 src/copilot/contextProvider.ts
       create mode 100644 src/copilot/copilotHelper.ts
       create mode 100644 src/copilot/utils.ts
      
      diff --git a/package-lock.json b/package-lock.json
      index f8fdb6bb..ae6bcf66 100644
      --- a/package-lock.json
      +++ b/package-lock.json
      @@ -6,9 +6,10 @@
         "packages": {
           "": {
             "name": "vscode-java-dependency",
      -      "version": "0.26.1",
      +      "version": "0.26.2",
             "license": "MIT",
             "dependencies": {
      +        "@github/copilot-language-server": "^1.388.0",
               "await-lock": "^2.2.2",
               "fmtr": "^1.1.4",
               "fs-extra": "^10.1.0",
      @@ -158,6 +159,90 @@
               "node": ">=10.0.0"
             }
           },
      +    "node_modules/@github/copilot-language-server": {
      +      "version": "1.389.0",
      +      "resolved": "https://registry.npmjs.org/@github/copilot-language-server/-/copilot-language-server-1.389.0.tgz",
      +      "integrity": "sha512-GLuqlJNesnA13OkijEaV/bATgRDnzFsp83TGYfhM8hbI+4Ilpb3GqrRpk9Z1jpvcLnZOk04fVqJ2+dK3brRgPg==",
      +      "license": "MIT",
      +      "dependencies": {
      +        "vscode-languageserver-protocol": "^3.17.5"
      +      },
      +      "bin": {
      +        "copilot-language-server": "dist/language-server.js"
      +      },
      +      "optionalDependencies": {
      +        "@github/copilot-language-server-darwin-arm64": "1.389.0",
      +        "@github/copilot-language-server-darwin-x64": "1.389.0",
      +        "@github/copilot-language-server-linux-arm64": "1.389.0",
      +        "@github/copilot-language-server-linux-x64": "1.389.0",
      +        "@github/copilot-language-server-win32-x64": "1.389.0"
      +      }
      +    },
      +    "node_modules/@github/copilot-language-server-darwin-arm64": {
      +      "version": "1.389.0",
      +      "resolved": "https://registry.npmjs.org/@github/copilot-language-server-darwin-arm64/-/copilot-language-server-darwin-arm64-1.389.0.tgz",
      +      "integrity": "sha512-Sx+8U4rLixBYS7UgqBBiHM73VyhbrcQhfaHg8ZyezmiEXV+ohNKpCIerFoepUrjmxgqRhx1DZrouk90cILb4aA==",
      +      "cpu": [
      +        "arm64"
      +      ],
      +      "license": "MIT",
      +      "optional": true,
      +      "os": [
      +        "darwin"
      +      ]
      +    },
      +    "node_modules/@github/copilot-language-server-darwin-x64": {
      +      "version": "1.389.0",
      +      "resolved": "https://registry.npmjs.org/@github/copilot-language-server-darwin-x64/-/copilot-language-server-darwin-x64-1.389.0.tgz",
      +      "integrity": "sha512-tiuNcZSrtv94arAfn2E1xFt8wVUvvRMAgCtNezq45L+oIe2+SY5SS+3EXhM0lracNPp+cJc1VrKoxn0buH1Cxw==",
      +      "cpu": [
      +        "x64"
      +      ],
      +      "license": "MIT",
      +      "optional": true,
      +      "os": [
      +        "darwin"
      +      ]
      +    },
      +    "node_modules/@github/copilot-language-server-linux-arm64": {
      +      "version": "1.389.0",
      +      "resolved": "https://registry.npmjs.org/@github/copilot-language-server-linux-arm64/-/copilot-language-server-linux-arm64-1.389.0.tgz",
      +      "integrity": "sha512-T/vgrbUOzmqEmlBF8LhwFX8ciBJOszNaiR4yPvEVT5+2wV1Jcnpk8C5QuKJ9xvryjDDlqoWowOF9UuB0PNJWYA==",
      +      "cpu": [
      +        "arm64"
      +      ],
      +      "license": "MIT",
      +      "optional": true,
      +      "os": [
      +        "linux"
      +      ]
      +    },
      +    "node_modules/@github/copilot-language-server-linux-x64": {
      +      "version": "1.389.0",
      +      "resolved": "https://registry.npmjs.org/@github/copilot-language-server-linux-x64/-/copilot-language-server-linux-x64-1.389.0.tgz",
      +      "integrity": "sha512-nKHoOzYJx0IzaHFXRzfD2djyg0YYZYX1UPu4hr6uAAa3ilI5jcYGJTb9MUYWZbemLTnU4tbWuBbv5aFVKTe4iw==",
      +      "cpu": [
      +        "x64"
      +      ],
      +      "license": "MIT",
      +      "optional": true,
      +      "os": [
      +        "linux"
      +      ]
      +    },
      +    "node_modules/@github/copilot-language-server-win32-x64": {
      +      "version": "1.389.0",
      +      "resolved": "https://registry.npmjs.org/@github/copilot-language-server-win32-x64/-/copilot-language-server-win32-x64-1.389.0.tgz",
      +      "integrity": "sha512-BAXL4tBLZc0+igST0Phal6ROQmH2rbjfLqd/ok8T1nmSGBfGddvEGh6oZHLUS6HuT26VilB/UG/wvp/yodyowQ==",
      +      "cpu": [
      +        "x64"
      +      ],
      +      "license": "MIT",
      +      "optional": true,
      +      "os": [
      +        "win32"
      +      ]
      +    },
           "node_modules/@isaacs/cliui": {
             "version": "8.0.2",
             "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz",
      @@ -5735,6 +5820,31 @@
               "url": "https://github.com/sponsors/isaacs"
             }
           },
      +    "node_modules/vscode-jsonrpc": {
      +      "version": "8.2.0",
      +      "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-8.2.0.tgz",
      +      "integrity": "sha512-C+r0eKJUIfiDIfwJhria30+TYWPtuHJXHtI7J0YlOmKAo7ogxP20T0zxB7HZQIFhIyvoBPwWskjxrvAtfjyZfA==",
      +      "license": "MIT",
      +      "engines": {
      +        "node": ">=14.0.0"
      +      }
      +    },
      +    "node_modules/vscode-languageserver-protocol": {
      +      "version": "3.17.5",
      +      "resolved": "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.17.5.tgz",
      +      "integrity": "sha512-mb1bvRJN8SVznADSGWM9u/b07H7Ecg0I3OgXDuLdn307rl/J3A9YD6/eYOssqhecL27hK1IPZAsaqh00i/Jljg==",
      +      "license": "MIT",
      +      "dependencies": {
      +        "vscode-jsonrpc": "8.2.0",
      +        "vscode-languageserver-types": "3.17.5"
      +      }
      +    },
      +    "node_modules/vscode-languageserver-types": {
      +      "version": "3.17.5",
      +      "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.17.5.tgz",
      +      "integrity": "sha512-Ld1VelNuX9pdF39h2Hgaeb5hEZM2Z3jUrrMgWQAu82jMtZp7p3vJT3BzToKtZI7NgQssZje5o0zryOrhQvzQAg==",
      +      "license": "MIT"
      +    },
           "node_modules/vscode-tas-client": {
             "version": "0.1.75",
             "resolved": "https://registry.npmjs.org/vscode-tas-client/-/vscode-tas-client-0.1.75.tgz",
      @@ -6232,6 +6342,49 @@
             "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==",
             "dev": true
           },
      +    "@github/copilot-language-server": {
      +      "version": "1.389.0",
      +      "resolved": "https://registry.npmjs.org/@github/copilot-language-server/-/copilot-language-server-1.389.0.tgz",
      +      "integrity": "sha512-GLuqlJNesnA13OkijEaV/bATgRDnzFsp83TGYfhM8hbI+4Ilpb3GqrRpk9Z1jpvcLnZOk04fVqJ2+dK3brRgPg==",
      +      "requires": {
      +        "@github/copilot-language-server-darwin-arm64": "1.389.0",
      +        "@github/copilot-language-server-darwin-x64": "1.389.0",
      +        "@github/copilot-language-server-linux-arm64": "1.389.0",
      +        "@github/copilot-language-server-linux-x64": "1.389.0",
      +        "@github/copilot-language-server-win32-x64": "1.389.0",
      +        "vscode-languageserver-protocol": "^3.17.5"
      +      }
      +    },
      +    "@github/copilot-language-server-darwin-arm64": {
      +      "version": "1.389.0",
      +      "resolved": "https://registry.npmjs.org/@github/copilot-language-server-darwin-arm64/-/copilot-language-server-darwin-arm64-1.389.0.tgz",
      +      "integrity": "sha512-Sx+8U4rLixBYS7UgqBBiHM73VyhbrcQhfaHg8ZyezmiEXV+ohNKpCIerFoepUrjmxgqRhx1DZrouk90cILb4aA==",
      +      "optional": true
      +    },
      +    "@github/copilot-language-server-darwin-x64": {
      +      "version": "1.389.0",
      +      "resolved": "https://registry.npmjs.org/@github/copilot-language-server-darwin-x64/-/copilot-language-server-darwin-x64-1.389.0.tgz",
      +      "integrity": "sha512-tiuNcZSrtv94arAfn2E1xFt8wVUvvRMAgCtNezq45L+oIe2+SY5SS+3EXhM0lracNPp+cJc1VrKoxn0buH1Cxw==",
      +      "optional": true
      +    },
      +    "@github/copilot-language-server-linux-arm64": {
      +      "version": "1.389.0",
      +      "resolved": "https://registry.npmjs.org/@github/copilot-language-server-linux-arm64/-/copilot-language-server-linux-arm64-1.389.0.tgz",
      +      "integrity": "sha512-T/vgrbUOzmqEmlBF8LhwFX8ciBJOszNaiR4yPvEVT5+2wV1Jcnpk8C5QuKJ9xvryjDDlqoWowOF9UuB0PNJWYA==",
      +      "optional": true
      +    },
      +    "@github/copilot-language-server-linux-x64": {
      +      "version": "1.389.0",
      +      "resolved": "https://registry.npmjs.org/@github/copilot-language-server-linux-x64/-/copilot-language-server-linux-x64-1.389.0.tgz",
      +      "integrity": "sha512-nKHoOzYJx0IzaHFXRzfD2djyg0YYZYX1UPu4hr6uAAa3ilI5jcYGJTb9MUYWZbemLTnU4tbWuBbv5aFVKTe4iw==",
      +      "optional": true
      +    },
      +    "@github/copilot-language-server-win32-x64": {
      +      "version": "1.389.0",
      +      "resolved": "https://registry.npmjs.org/@github/copilot-language-server-win32-x64/-/copilot-language-server-win32-x64-1.389.0.tgz",
      +      "integrity": "sha512-BAXL4tBLZc0+igST0Phal6ROQmH2rbjfLqd/ok8T1nmSGBfGddvEGh6oZHLUS6HuT26VilB/UG/wvp/yodyowQ==",
      +      "optional": true
      +    },
           "@isaacs/cliui": {
             "version": "8.0.2",
             "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz",
      @@ -10355,6 +10508,25 @@
             "dev": true,
             "requires": {}
           },
      +    "vscode-jsonrpc": {
      +      "version": "8.2.0",
      +      "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-8.2.0.tgz",
      +      "integrity": "sha512-C+r0eKJUIfiDIfwJhria30+TYWPtuHJXHtI7J0YlOmKAo7ogxP20T0zxB7HZQIFhIyvoBPwWskjxrvAtfjyZfA=="
      +    },
      +    "vscode-languageserver-protocol": {
      +      "version": "3.17.5",
      +      "resolved": "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.17.5.tgz",
      +      "integrity": "sha512-mb1bvRJN8SVznADSGWM9u/b07H7Ecg0I3OgXDuLdn307rl/J3A9YD6/eYOssqhecL27hK1IPZAsaqh00i/Jljg==",
      +      "requires": {
      +        "vscode-jsonrpc": "8.2.0",
      +        "vscode-languageserver-types": "3.17.5"
      +      }
      +    },
      +    "vscode-languageserver-types": {
      +      "version": "3.17.5",
      +      "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.17.5.tgz",
      +      "integrity": "sha512-Ld1VelNuX9pdF39h2Hgaeb5hEZM2Z3jUrrMgWQAu82jMtZp7p3vJT3BzToKtZI7NgQssZje5o0zryOrhQvzQAg=="
      +    },
           "vscode-tas-client": {
             "version": "0.1.75",
             "resolved": "https://registry.npmjs.org/vscode-tas-client/-/vscode-tas-client-0.1.75.tgz",
      diff --git a/package.json b/package.json
      index 9f0dc1b0..e29c4470 100644
      --- a/package.json
      +++ b/package.json
      @@ -1110,6 +1110,7 @@
           "webpack-cli": "^4.10.0"
         },
         "dependencies": {
      +    "@github/copilot-language-server": "^1.388.0",
           "await-lock": "^2.2.2",
           "fmtr": "^1.1.4",
           "fs-extra": "^10.1.0",
      diff --git a/src/commands.ts b/src/commands.ts
      index a7338c0a..0e7a69cd 100644
      --- a/src/commands.ts
      +++ b/src/commands.ts
      @@ -136,6 +136,8 @@ export namespace Commands {
       
           export const JAVA_PROJECT_GET_DEPENDENCIES = "java.project.getDependencies";
       
      +    export const JAVA_PROJECT_GET_IMPORT_CLASS_CONTENT = "java.project.getImportClassContent";
      +
           export const JAVA_UPGRADE_WITH_COPILOT = "_java.upgradeWithCopilot";
       
           /**
      diff --git a/src/copilot/contextProvider.ts b/src/copilot/contextProvider.ts
      new file mode 100644
      index 00000000..4857b8e6
      --- /dev/null
      +++ b/src/copilot/contextProvider.ts
      @@ -0,0 +1,153 @@
      +/*---------------------------------------------------------------------------------------------
      + *  Copyright (c) Microsoft Corporation. All rights reserved.
      + *  Licensed under the MIT License. See License.txt in the project root for license information.
      + *--------------------------------------------------------------------------------------------*/
      +import {
      +    ResolveRequest,
      +    SupportedContextItem,
      +    type ContextProvider,
      +} from '@github/copilot-language-server';
      +import * as vscode from 'vscode';
      +import { CopilotHelper } from './copilotHelper';
      +import { sendError, sendInfo } from "vscode-extension-telemetry-wrapper";
      +import {
      +    JavaContextProviderUtils,
      +    CancellationError,
      +    InternalCancellationError,
      +    CopilotCancellationError,
      +    ContextResolverFunction,
      +    CopilotApi,
      +    ContextProviderRegistrationError,
      +    ContextProviderResolverError
      +} from './utils';
      +
      +export async function registerCopilotContextProviders(
      +    context: vscode.ExtensionContext
      +) {
      +    try {
      +        const apis = await JavaContextProviderUtils.getCopilotApis();
      +        if (!apis.clientApi || !apis.chatApi) {
      +            return;
      +        }
      +        // Register the Java completion context provider
      +        const provider: ContextProvider = {
      +            id: 'vscjava.vscode-java-dependency', // use extension id as provider id for now
      +            selector: [{ language: "java" }],
      +            resolver: { resolve: createJavaContextResolver() }
      +        };
      +        const installCount = await JavaContextProviderUtils.installContextProviderOnApis(apis, provider, context, installContextProvider);
      +        if (installCount === 0) {
      +            return;
      +        }
      +        sendInfo("", {
      +            "action": "registerCopilotContextProvider",
      +            "status": "succeeded",
      +            "installCount": installCount
      +        });
      +    }
      +    catch (error) {
      +        const errorMessage = (error as Error).message || "unknown_error";
      +        sendError(new ContextProviderRegistrationError(
      +            'Failed to register Copilot context provider: ' + errorMessage
      +        ));
      +    }
      +}
      +
      +/**
      + * Create the Java context resolver function
      + */
      +function createJavaContextResolver(): ContextResolverFunction {
      +    return async (request: ResolveRequest, copilotCancel: vscode.CancellationToken): Promise => {
      +        try {
      +            // Check for immediate cancellation
      +            JavaContextProviderUtils.checkCancellation(copilotCancel);
      +            return await resolveJavaContext(request, copilotCancel);
      +        } catch (error: any) {
      +            sendError(new ContextProviderResolverError('Java Context Resolution Failed: ' + ((error as Error).message || "unknown_error")));
      +            // This should never be reached due to handleError throwing, but TypeScript requires it
      +            return [];
      +        }
      +    };
      +}
      +
      +/**
      + * Send telemetry data for Java context resolution
      + */
      +function sendContextTelemetry(request: ResolveRequest, start: number, items: SupportedContextItem[], status: string, error?: string) {
      +    const duration = Math.round(performance.now() - start);
      +    const tokenCount = JavaContextProviderUtils.calculateTokenCount(items);
      +    const telemetryData: any = {
      +        "action": "resolveJavaContext",
      +        "completionId": request.completionId,
      +        "duration": duration,
      +        "itemCount": items.length,
      +        "tokenCount": tokenCount,
      +        "status": status
      +    };
      +    if (error) {
      +        telemetryData.error = error;
      +    }
      +    sendInfo("", telemetryData);
      +}
      +
      +async function resolveJavaContext(request: ResolveRequest, copilotCancel: vscode.CancellationToken): Promise {
      +    const items: SupportedContextItem[] = [];
      +    const start = performance.now();
      +    try {
      +        // Check for cancellation before starting
      +        JavaContextProviderUtils.checkCancellation(copilotCancel);
      +        // Resolve project dependencies and convert to context items
      +        const projectDependencyItems = await CopilotHelper.resolveAndConvertProjectDependencies(
      +            vscode.window.activeTextEditor,
      +            copilotCancel,
      +            JavaContextProviderUtils.checkCancellation
      +        );
      +        JavaContextProviderUtils.checkCancellation(copilotCancel);
      +        items.push(...projectDependencyItems);
      +
      +        JavaContextProviderUtils.checkCancellation(copilotCancel);
      +
      +        // Resolve local imports and convert to context items
      +        const localImportItems = await CopilotHelper.resolveAndConvertLocalImports(
      +            vscode.window.activeTextEditor,
      +            copilotCancel,
      +            JavaContextProviderUtils.checkCancellation
      +        );
      +        JavaContextProviderUtils.checkCancellation(copilotCancel);
      +        items.push(...localImportItems);
      +    } catch (error: any) {
      +        if (error instanceof CopilotCancellationError) {
      +            sendContextTelemetry(request, start, items, "cancelled_by_copilot");
      +            throw error;
      +        }
      +        if (error instanceof vscode.CancellationError || error.message === CancellationError.CANCELED) {
      +            sendContextTelemetry(request, start, items, "cancelled_internally");
      +            throw new InternalCancellationError();
      +        }
      +
      +        // Send telemetry for general errors (but continue with partial results)
      +        sendContextTelemetry(request, start, items, "error_partial_results", error.message || "unknown_error");
      +
      +        // Return partial results and log completion for error case
      +        return items;
      +    }
      +
      +    // Send telemetry data once at the end for success case
      +    sendContextTelemetry(request, start, items, "succeeded");
      +
      +    return items;
      +}
      +
      +export async function installContextProvider(
      +    copilotAPI: CopilotApi,
      +    contextProvider: ContextProvider
      +): Promise {
      +    const hasGetContextProviderAPI = typeof copilotAPI.getContextProviderAPI === 'function';
      +    if (hasGetContextProviderAPI) {
      +        const contextAPI = await copilotAPI.getContextProviderAPI('v1');
      +        if (contextAPI) {
      +            return contextAPI.registerContextProvider(contextProvider);
      +        }
      +    }
      +    return undefined;
      +}
      diff --git a/src/copilot/copilotHelper.ts b/src/copilot/copilotHelper.ts
      new file mode 100644
      index 00000000..2a0b4cfd
      --- /dev/null
      +++ b/src/copilot/copilotHelper.ts
      @@ -0,0 +1,362 @@
      +// Copyright (c) Microsoft Corporation. All rights reserved.
      +// Licensed under the MIT license.
      +
      +import { commands, Uri, CancellationToken } from "vscode";
      +import { sendError, sendInfo } from "vscode-extension-telemetry-wrapper";
      +import { GetImportClassContentError, GetProjectDependenciesError, sendContextOperationTelemetry, JavaContextProviderUtils } from "./utils";
      +import { Commands } from '../commands';
      +
      +/**
      + * Enum for error messages used in Promise rejection
      + */
      +export enum ErrorMessage {
      +    OperationCancelled = "Operation cancelled",
      +    OperationTimedOut = "Operation timed out"
      +}
      +
      +/**
      + * Enum for empty reason codes when operations return empty results
      + */
      +export enum EmptyReason {
      +    CopilotCancelled = "CopilotCancelled",
      +    CommandNullResult = "CommandNullResult",
      +    Timeout = "Timeout",
      +    NoWorkspace = "NoWorkspace",
      +    NoDependenciesResults = "NoDependenciesResults",
      +    NoActiveEditor = "NoActiveEditor",
      +    NotJavaFile = "NotJavaFile",
      +    NoImportsResults = "NoImportsResults"
      +}
      +
      +export interface INodeImportClass {
      +    uri: string;
      +    value: string;
      +}
      +
      +export interface IImportClassContentResult {
      +    classInfoList: INodeImportClass[];
      +    emptyReason?: string;
      +    isEmpty: boolean;
      +}
      +
      +export interface IProjectDependency {
      +    [key: string]: string;
      +}
      +
      +export interface IProjectDependenciesResult {
      +    dependencyInfoList: { key: string; value: string }[];
      +    emptyReason?: string;
      +    isEmpty: boolean;
      +}
      +/**
      + * Helper class for Copilot integration to analyze Java project dependencies
      + */
      +export namespace CopilotHelper {
      +    /**
      +     * Resolves all local project types imported by the given file (backward compatibility version)
      +     * @param fileUri The URI of the Java file to analyze
      +     * @param cancellationToken Optional cancellation token to abort the operation
      +     * @returns Array of import class information
      +     */
      +    export async function resolveLocalImports(fileUri: Uri, cancellationToken?: CancellationToken): Promise {
      +        const result = await resolveLocalImportsWithReason(fileUri, cancellationToken);
      +        return result.classInfoList;
      +    }
      +
      +    /**
      +     * Resolves all local project types imported by the given file with detailed error reporting
      +     * @param fileUri The URI of the Java file to analyze
      +     * @param cancellationToken Optional cancellation token to abort the operation
      +     * @returns Result object containing import class information and error details
      +     */
      +    export async function resolveLocalImportsWithReason(fileUri: Uri, cancellationToken?: CancellationToken): Promise {
      +        if (cancellationToken?.isCancellationRequested) {
      +            return {
      +                classInfoList: [],
      +                emptyReason: EmptyReason.CopilotCancelled,
      +                isEmpty: true
      +            };
      +        }
      +
      +        try {
      +            const normalizedUri = decodeURIComponent(Uri.file(fileUri.fsPath).toString());
      +            const commandPromise = commands.executeCommand(
      +                Commands.EXECUTE_WORKSPACE_COMMAND,
      +                Commands.JAVA_PROJECT_GET_IMPORT_CLASS_CONTENT,
      +                normalizedUri
      +            ) as Promise;
      +            if (cancellationToken) {
      +                const result = await Promise.race([
      +                    commandPromise,
      +                    new Promise((_, reject) => {
      +                        cancellationToken.onCancellationRequested(() => {
      +                            reject(new Error(ErrorMessage.OperationCancelled));
      +                        });
      +                    }),
      +                    new Promise((_, reject) => {
      +                        setTimeout(() => {
      +                            reject(new Error(ErrorMessage.OperationTimedOut));
      +                        }, 80); // 80ms timeout
      +                    })
      +                ]);
      +                if (!result) {
      +                    return {
      +                        classInfoList: [],
      +                        emptyReason: EmptyReason.CommandNullResult,
      +                        isEmpty: true
      +                    };
      +                }
      +                return result;
      +            } else {
      +                const result = await Promise.race([
      +                    commandPromise,
      +                    new Promise((_, reject) => {
      +                        setTimeout(() => {
      +                            reject(new Error(ErrorMessage.OperationTimedOut));
      +                        }, 80); // 80ms timeout
      +                    })
      +                ]);
      +                if (!result) {
      +                    return {
      +                        classInfoList: [],
      +                        emptyReason: EmptyReason.CommandNullResult,
      +                        isEmpty: true
      +                    };
      +                }
      +                return result;
      +            }
      +        } catch (error: any) {
      +            if (error.message === ErrorMessage.OperationCancelled) {
      +                return {
      +                    classInfoList: [],
      +                    emptyReason: EmptyReason.CopilotCancelled,
      +                    isEmpty: true
      +                };
      +            }
      +            if (error.message === ErrorMessage.OperationTimedOut) {
      +                return {
      +                    classInfoList: [],
      +                    emptyReason: EmptyReason.Timeout,
      +                    isEmpty: true
      +                };
      +            }
      +            const errorMessage = 'TsException_' + ((error as Error).message || "unknown");
      +            sendError(new GetImportClassContentError(errorMessage));
      +            return {
      +                classInfoList: [],
      +                emptyReason: errorMessage,
      +                isEmpty: true
      +            };
      +        }
      +    }
      +
      +    /**
      +     * Resolves project dependencies for the given project URI (backward compatibility version)
      +     * @param projectUri The URI of the Java project to analyze
      +     * @param cancellationToken Optional cancellation token to abort the operation
      +     * @returns Object containing project dependencies as key-value pairs
      +     */
      +    export async function resolveProjectDependencies(projectUri: Uri, cancellationToken?: CancellationToken): Promise {
      +        const result = await resolveProjectDependenciesWithReason(projectUri, cancellationToken);
      +
      +        // Convert to legacy format
      +        const dependencies: IProjectDependency = {};
      +        for (const dep of result.dependencyInfoList) {
      +            dependencies[dep.key] = dep.value;
      +        }
      +
      +        return dependencies;
      +    }
      +
      +    /**
      +     * Resolves project dependencies with detailed error reporting
      +     * @param projectUri The URI of the Java project to analyze
      +     * @param cancellationToken Optional cancellation token to abort the operation
      +     * @returns Result object containing project dependencies and error information
      +     */
      +    export async function resolveProjectDependenciesWithReason(
      +        fileUri: Uri,
      +        cancellationToken?: CancellationToken
      +    ): Promise {
      +        if (cancellationToken?.isCancellationRequested) {
      +            return {
      +                dependencyInfoList: [],
      +                emptyReason: EmptyReason.CopilotCancelled,
      +                isEmpty: true
      +            };
      +        }
      +
      +        try {
      +            const normalizedUri = decodeURIComponent(Uri.file(fileUri.fsPath).toString());
      +            const commandPromise = commands.executeCommand(
      +                Commands.EXECUTE_WORKSPACE_COMMAND,
      +                Commands.JAVA_PROJECT_GET_DEPENDENCIES,
      +                normalizedUri
      +            ) as Promise;
      +
      +            if (cancellationToken) {
      +                const result = await Promise.race([
      +                    commandPromise,
      +                    new Promise((_, reject) => {
      +                        cancellationToken.onCancellationRequested(() => {
      +                            reject(new Error(ErrorMessage.OperationCancelled));
      +                        });
      +                    }),
      +                    new Promise((_, reject) => {
      +                        setTimeout(() => {
      +                            reject(new Error(ErrorMessage.OperationTimedOut));
      +                        }, 40); // 40ms timeout
      +                    })
      +                ]);
      +                if (!result) {
      +                    return {
      +                        dependencyInfoList: [],
      +                        emptyReason: EmptyReason.CommandNullResult,
      +                        isEmpty: true
      +                    };
      +                }
      +                return result;
      +            } else {
      +                const result = await Promise.race([
      +                    commandPromise,
      +                    new Promise((_, reject) => {
      +                        setTimeout(() => {
      +                            reject(new Error(ErrorMessage.OperationTimedOut));
      +                        }, 40); // 40ms timeout
      +                    })
      +                ]);
      +                if (!result) {
      +                    return {
      +                        dependencyInfoList: [],
      +                        emptyReason: EmptyReason.CommandNullResult,
      +                        isEmpty: true
      +                    };
      +                }
      +                return result;
      +            }
      +        } catch (error: any) {
      +            if (error.message === ErrorMessage.OperationCancelled) {
      +                return {
      +                    dependencyInfoList: [],
      +                    emptyReason: EmptyReason.CopilotCancelled,
      +                    isEmpty: true
      +                };
      +            }
      +            if (error.message === ErrorMessage.OperationTimedOut) {
      +                return {
      +                    dependencyInfoList: [],
      +                    emptyReason: EmptyReason.Timeout,
      +                    isEmpty: true
      +                };
      +            }
      +            const errorMessage = 'TsException_' + ((error as Error).message || "unknown");
      +            sendError(new GetProjectDependenciesError(errorMessage));
      +            return {
      +                dependencyInfoList: [],
      +                emptyReason: errorMessage,
      +                isEmpty: true
      +            };
      +        }
      +    }
      +
      +    /**
      +     * Resolves project dependencies and converts them to context items with cancellation support
      +     * @param workspaceFolders The workspace folders, or undefined if none
      +     * @param copilotCancel Cancellation token from Copilot
      +     * @param checkCancellation Function to check for cancellation
      +     * @returns Array of context items for project dependencies, or empty array if no workspace folders
      +     */
      +    export async function resolveAndConvertProjectDependencies(
      +        activeEditor: { document: { uri: Uri; languageId: string } } | undefined,
      +        copilotCancel: CancellationToken,
      +        checkCancellation: (token: CancellationToken) => void
      +    ): Promise<{ name: string; value: string; importance: number }[]> {
      +        const items: any[] = [];
      +        // Check if workspace folders exist
      +        if (!activeEditor) {
      +            sendContextOperationTelemetry("resolveLocalImports", "ContextEmpty", sendInfo, EmptyReason.NoActiveEditor);
      +            return items;
      +        }
      +        if (activeEditor.document.languageId !== 'java') {
      +            sendContextOperationTelemetry("resolveLocalImports", "ContextEmpty", sendInfo, EmptyReason.NotJavaFile);
      +            return items;
      +        }
      +        const documentUri = activeEditor.document.uri;
      +
      +        // Resolve project dependencies
      +        const projectDependenciesResult = await resolveProjectDependenciesWithReason(documentUri, copilotCancel);
      +
      +        // Check for cancellation after dependency resolution
      +        checkCancellation(copilotCancel);
      +
      +        // Send telemetry if result is empty
      +        if (projectDependenciesResult.isEmpty && projectDependenciesResult.emptyReason) {
      +            sendContextOperationTelemetry("resolveProjectDependencies", "ContextEmpty", sendInfo, projectDependenciesResult.emptyReason);
      +        }
      +
      +        // Check for cancellation after telemetry
      +        checkCancellation(copilotCancel);
      +
      +        // Convert project dependencies to context items
      +        if (projectDependenciesResult.dependencyInfoList && projectDependenciesResult.dependencyInfoList.length > 0) {
      +            const contextItems = JavaContextProviderUtils.createContextItemsFromProjectDependencies(projectDependenciesResult.dependencyInfoList);
      +
      +            // Check cancellation once after creating all items
      +            checkCancellation(copilotCancel);
      +            items.push(...contextItems);
      +        }
      +
      +        return items;
      +    }
      +
      +    /**
      +     * Resolves local imports and converts them to context items with cancellation support
      +     * @param activeEditor The active text editor, or undefined if none
      +     * @param copilotCancel Cancellation token from Copilot
      +     * @param checkCancellation Function to check for cancellation
      +     * @param createContextItems Function to create context items from imports
      +     * @returns Array of context items for local imports, or empty array if no valid editor
      +     */
      +    export async function resolveAndConvertLocalImports(
      +        activeEditor: { document: { uri: Uri; languageId: string } } | undefined,
      +        copilotCancel: CancellationToken,
      +        checkCancellation: (token: CancellationToken) => void
      +    ): Promise {
      +        const items: any[] = [];
      +        // Check if there's an active editor with a Java document
      +        if (!activeEditor) {
      +            sendContextOperationTelemetry("resolveLocalImports", "ContextEmpty", sendInfo, EmptyReason.NoActiveEditor);
      +            return items;
      +        }
      +        if (activeEditor.document.languageId !== 'java') {
      +            sendContextOperationTelemetry("resolveLocalImports", "ContextEmpty", sendInfo, EmptyReason.NotJavaFile);
      +            return items;
      +        }
      +
      +        const documentUri = activeEditor.document.uri;
      +
      +        // Check for cancellation before resolving imports
      +        checkCancellation(copilotCancel);
      +        // Resolve imports directly without caching
      +        const importClassResult = await resolveLocalImportsWithReason(documentUri, copilotCancel);
      +
      +        // Check for cancellation after resolution
      +        checkCancellation(copilotCancel);
      +
      +        // Send telemetry if result is empty
      +        if (importClassResult.isEmpty && importClassResult.emptyReason) {
      +            sendContextOperationTelemetry("resolveLocalImports", "ContextEmpty", sendInfo, importClassResult.emptyReason);
      +        }
      +        // Check for cancellation before processing results
      +        checkCancellation(copilotCancel);
      +        if (importClassResult.classInfoList && importClassResult.classInfoList.length > 0) {
      +            // Process imports in batches to reduce cancellation check overhead
      +            const contextItems = JavaContextProviderUtils.createContextItemsFromImports(importClassResult.classInfoList);
      +            // Check cancellation once after creating all items
      +            checkCancellation(copilotCancel);
      +            items.push(...contextItems);
      +        }
      +
      +        return items;
      +    }
      +}
      diff --git a/src/copilot/utils.ts b/src/copilot/utils.ts
      new file mode 100644
      index 00000000..69717aa2
      --- /dev/null
      +++ b/src/copilot/utils.ts
      @@ -0,0 +1,233 @@
      +// Copyright (c) Microsoft Corporation. All rights reserved.
      +// Licensed under the MIT license.
      +import * as vscode from 'vscode';
      +import {
      +    ContextProviderApiV1,
      +    ResolveRequest,
      +    SupportedContextItem,
      +    type ContextProvider,
      +} from '@github/copilot-language-server';
      +/**
      + * Error classes for Copilot context provider cancellation handling
      + */
      +export class CancellationError extends Error {
      +    static readonly CANCELED = "Canceled";
      +    constructor() {
      +        super(CancellationError.CANCELED);
      +        this.name = this.message;
      +    }
      +}
      +
      +export class InternalCancellationError extends CancellationError {
      +}
      +
      +export class CopilotCancellationError extends CancellationError {
      +}
      +
      +/**
      + * Type definitions for common patterns
      + */
      +export type ContextResolverFunction = (request: ResolveRequest, token: vscode.CancellationToken) => Promise;
      +
      +export interface CopilotApiWrapper {
      +    clientApi?: CopilotApi;
      +    chatApi?: CopilotApi;
      +}
      +
      +export interface CopilotApi {
      +    getContextProviderAPI(version: string): Promise;
      +}
      +
      +/**
      + * Utility class for handling common operations in Java Context Provider
      + */
      +export class JavaContextProviderUtils {
      +    /**
      +     * Check if operation should be cancelled and throw appropriate error
      +     */
      +    static checkCancellation(token: vscode.CancellationToken): void {
      +        if (token.isCancellationRequested) {
      +            throw new CopilotCancellationError();
      +        }
      +    }
      +
      +    static createContextItemsFromProjectDependencies(projectDepsResults: { key: string; value: string }[]): SupportedContextItem[] {
      +        return projectDepsResults.map(dep => ({
      +            name: dep.key,
      +            value: dep.value,
      +            importance: 70
      +        }));
      +    }
      +
      +    /**
      +     * Create context items from import classes
      +     */
      +    static createContextItemsFromImports(importClasses: any[]): SupportedContextItem[] {
      +        return importClasses.map((cls: any) => ({
      +            uri: cls.uri,
      +            value: cls.value,
      +            importance: 80,
      +            origin: 'request' as const
      +        }));
      +    }
      +
      +    /**
      +     * Get and validate Copilot APIs
      +     */
      +    static async getCopilotApis(): Promise {
      +        const copilotClientApi = await getCopilotClientApi();
      +        const copilotChatApi = await getCopilotChatApi();
      +        return { clientApi: copilotClientApi, chatApi: copilotChatApi };
      +    }
      +
      +    /**
      +     * Install context provider on available APIs
      +     */
      +    static async installContextProviderOnApis(
      +        apis: CopilotApiWrapper,
      +        provider: ContextProvider,
      +        context: vscode.ExtensionContext,
      +        installFn: (api: CopilotApi, provider: ContextProvider) => Promise
      +    ): Promise {
      +        let installCount = 0;
      +
      +        if (apis.clientApi) {
      +            const disposable = await installFn(apis.clientApi, provider);
      +            if (disposable) {
      +                context.subscriptions.push(disposable);
      +                installCount++;
      +            }
      +        }
      +
      +        if (apis.chatApi) {
      +            const disposable = await installFn(apis.chatApi, provider);
      +            if (disposable) {
      +                context.subscriptions.push(disposable);
      +                installCount++;
      +            }
      +        }
      +
      +        return installCount;
      +    }
      +
      +    /**
      +     * Calculate approximate token count for context items
      +     * Using a simple heuristic: ~4 characters per token
      +     * Optimized for performance by using reduce and direct property access
      +     */
      +    static calculateTokenCount(items: SupportedContextItem[]): number {
      +        // Fast path: if no items, return 0
      +        if (items.length === 0) {
      +            return 0;
      +        }
      +
      +        // Use reduce for better performance
      +        const totalChars = items.reduce((sum, item) => {
      +            let itemChars = 0;
      +            // Direct property access is faster than 'in' operator
      +            const value = (item as any).value;
      +            const name = (item as any).name;
      +
      +            if (value && typeof value === 'string') {
      +                itemChars += value.length;
      +            }
      +            if (name && typeof name === 'string') {
      +                itemChars += name.length;
      +            }
      +
      +            return sum + itemChars;
      +        }, 0);
      +
      +        // Approximate: 1 token ≈ 4 characters
      +        // Use bitwise shift for faster division by 4
      +        return Math.ceil(totalChars / 4);
      +    }
      +}
      +
      +/**
      + * Get Copilot client API
      + */
      +export async function getCopilotClientApi(): Promise {
      +    const extension = vscode.extensions.getExtension('github.copilot');
      +    if (!extension) {
      +        return undefined;
      +    }
      +    try {
      +        return await extension.activate();
      +    } catch {
      +        return undefined;
      +    }
      +}
      +
      +/**
      + * Get Copilot chat API
      + */
      +export async function getCopilotChatApi(): Promise {
      +    type CopilotChatApi = { getAPI?(version: number): CopilotApi | undefined };
      +    const extension = vscode.extensions.getExtension('github.copilot-chat');
      +    if (!extension) {
      +        return undefined;
      +    }
      +
      +    let exports: CopilotChatApi | undefined;
      +    try {
      +        exports = await extension.activate();
      +    } catch {
      +        return undefined;
      +    }
      +    if (!exports || typeof exports.getAPI !== 'function') {
      +        return undefined;
      +    }
      +    return exports.getAPI(1);
      +}
      +
      +export class ContextProviderRegistrationError extends Error {
      +    constructor(message: string) {
      +        super(message);
      +        this.name = 'ContextProviderRegistrationError';
      +    }
      +}
      +
      +export class GetImportClassContentError extends Error {
      +    constructor(message: string) {
      +        super(message);
      +        this.name = 'GetImportClassContentError';
      +    }
      +}
      +
      +export class GetProjectDependenciesError extends Error {
      +    constructor(message: string) {
      +        super(message);
      +        this.name = 'GetProjectDependenciesError';
      +    }
      +}
      +
      +export class ContextProviderResolverError extends Error {
      +    constructor(message: string) {
      +        super(message);
      +        this.name = 'ContextProviderResolverError';
      +    }
      +}
      +
      +/**
      + * Send telemetry data for context operations (like resolveProjectDependencies, resolveLocalImports)
      + * @param action The action being performed
      + * @param status The status of the action (e.g., "ContextEmpty", "succeeded")
      + * @param reason Optional reason for empty context
      + * @param sendInfo The sendInfo function from vscode-extension-telemetry-wrapper
      + */
      +export function sendContextOperationTelemetry(
      +    action: string,
      +    status: string,
      +    sendInfo: (eventName: string, properties?: any) => void,
      +    reason?: string
      +): void {
      +    const telemetryData: any = {
      +        "action": action,
      +        "status": status
      +    };
      +    if (reason) {
      +        telemetryData.ContextEmptyReason = reason;
      +    }
      +    sendInfo("", telemetryData);
      +}
      \ No newline at end of file
      diff --git a/src/extension.ts b/src/extension.ts
      index d2fe424b..af169c32 100644
      --- a/src/extension.ts
      +++ b/src/extension.ts
      @@ -21,6 +21,7 @@ import { setContextForDeprecatedTasks, updateExportTaskType } from "./tasks/buil
       import { CodeActionProvider } from "./tasks/buildArtifact/migration/CodeActionProvider";
       import { newJavaFile } from "./explorerCommands/new";
       import upgradeManager from "./upgrade/upgradeManager";
      +import { registerCopilotContextProviders } from "./copilot/contextProvider";
       
       export async function activate(context: ExtensionContext): Promise {
           contextManager.initialize(context);
      @@ -37,6 +38,7 @@ export async function activate(context: ExtensionContext): Promise {
               }
           });
           contextManager.setContextValue(Context.EXTENSION_ACTIVATED, true);
      +    await registerCopilotContextProviders(context);
       }
       
       async function activateExtension(_operationId: string, context: ExtensionContext): Promise {
      
      From 5ac7b555e5f04823a7e59e09cbf5f73378074034 Mon Sep 17 00:00:00 2001
      From: wenyt <75360946+wenytang-ms@users.noreply.github.com>
      Date: Tue, 4 Nov 2025 09:08:41 +0800
      Subject: [PATCH 244/352] perf: add info to track project info and import
       context empty reason (#927)
      
      * perf: add info to track empty reason
      
      * perf: update the empty reason
      
      * clean up useless code
      
      * fix: shorten the msg
      ---
       .../jdtls/ext/core/ProjectCommand.java        | 345 ++++++++++++++----
       .../ext/core/parser/ContextResolver.java      |   4 +-
       2 files changed, 281 insertions(+), 68 deletions(-)
      
      diff --git a/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/ProjectCommand.java b/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/ProjectCommand.java
      index 002f8072..86a82282 100644
      --- a/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/ProjectCommand.java
      +++ b/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/ProjectCommand.java
      @@ -98,6 +98,132 @@ public DependencyInfo(String key, String value) {
               }
           }
       
      +    /**
      +     * Empty reasons for ImportClassContent operation
      +     */
      +    public enum ImportClassContentErrorReason {
      +        NULL_ARGUMENTS("NullArgs"),
      +        INVALID_URI("InvalidURI"),
      +        URI_PARSE_FAILED("ParseFail"),
      +        FILE_NOT_FOUND("NotFound"),
      +        FILE_NOT_EXISTS("NotExists"),
      +        NOT_JAVA_PROJECT("NotJava"),
      +        PROJECT_NOT_EXISTS("ProjNotExists"),
      +        NOT_COMPILATION_UNIT("NotCU"),
      +        NO_IMPORTS("NoImports"),
      +        OPERATION_CANCELLED("Cancelled"),
      +        TIME_LIMIT_EXCEEDED("Timeout"),
      +        NO_RESULTS("NoResults"),
      +        PROCESSING_EXCEPTION("Error");
      +
      +        private final String message;
      +
      +        ImportClassContentErrorReason(String message) {
      +            this.message = message;
      +        }
      +
      +        public String getMessage() {
      +            return message;
      +        }
      +    }
      +
      +    /**
      +     * Empty reasons for ProjectDependencies operation
      +     */
      +    public enum ProjectDependenciesErrorReason {
      +        NULL_ARGUMENTS("NullArgs"),
      +        INVALID_URI("InvalidURI"),
      +        URI_PARSE_FAILED("ParseFail"),
      +        MALFORMED_URI("MalformedURI"),
      +        OPERATION_CANCELLED("Cancelled"),
      +        RESOLVER_NULL_RESULT("ResolverNull"),
      +        NO_DEPENDENCIES("NoDeps"),
      +        PROCESSING_EXCEPTION("Error");
      +
      +        private final String message;
      +
      +        ProjectDependenciesErrorReason(String message) {
      +            this.message = message;
      +        }
      +
      +        public String getMessage() {
      +            return message;
      +        }
      +    }
      +
      +    /**
      +     * Error context information for operations
      +     */
      +    public static class ErrorContext {
      +        public final String errorValue;   // The value that caused the error (e.g., invalid URI, null parsedPath, etc.)
      +
      +        public ErrorContext(String errorValue) {
      +            this.errorValue = errorValue;
      +        }
      +    }
      +
      +    /**
      +     * Result wrapper for getImportClassContent method
      +     */
      +    public static class ImportClassContentResult {
      +        public List classInfoList;
      +        public String emptyReason; // Reason why the result is empty
      +        public boolean isEmpty;
      +        public ErrorContext errorContext; // Error context (only set when isEmpty = true)
      +
      +        public ImportClassContentResult(List classInfoList) {
      +            this.classInfoList = classInfoList;
      +            this.emptyReason = null;
      +            this.isEmpty = false;
      +            this.errorContext = null;
      +        }
      +
      +        public ImportClassContentResult(ImportClassContentErrorReason errorReason) {
      +            this.classInfoList = Collections.emptyList();
      +            this.emptyReason = errorReason.getMessage(); // Use enum message
      +            this.isEmpty = true;
      +            this.errorContext = null;
      +        }
      +
      +        public ImportClassContentResult(ImportClassContentErrorReason errorReason, String errorValue) {
      +            this.classInfoList = Collections.emptyList();
      +            this.emptyReason = errorReason.getMessage();
      +            this.isEmpty = true;
      +            this.errorContext = new ErrorContext(errorValue);
      +        }
      +    }
      +
      +    /**
      +     * Result wrapper for getProjectDependencies method
      +     */
      +    public static class ProjectDependenciesResult {
      +        public List dependencyInfoList;
      +        public String emptyReason; // Reason why the result is empty
      +        public boolean isEmpty;
      +        public ErrorContext errorContext; // Error context (only set when isEmpty = true)
      +
      +        public ProjectDependenciesResult(List dependencyInfoList) {
      +            this.dependencyInfoList = dependencyInfoList;
      +            this.emptyReason = null;
      +            this.isEmpty = false;
      +            this.errorContext = null;
      +        }
      +
      +        public ProjectDependenciesResult(ProjectDependenciesErrorReason errorReason) {
      +            this.dependencyInfoList = new ArrayList<>();
      +            this.emptyReason = errorReason.getMessage(); // Use enum message
      +            this.isEmpty = true;
      +            this.errorContext = null;
      +        }
      +
      +        public ProjectDependenciesResult(ProjectDependenciesErrorReason errorReason, String errorValue) {
      +            this.dependencyInfoList = new ArrayList<>();
      +            this.emptyReason = errorReason.getMessage();
      +            this.isEmpty = true;
      +            this.errorContext = new ErrorContext(errorValue);
      +        }
      +    }
      +
           private static class Classpath {
               public String source;
               public String destination;
      @@ -353,30 +479,33 @@ public static boolean checkImportStatus() {
           /**
            * Get import class content for Copilot integration.
            * This method extracts information about imported classes from a Java file.
      -     * Uses a time-controlled strategy: prioritizes internal classes, adds external classes only if time permits.
      +     * Uses a time-controlled strategy: prioritizes internal classes, adds external
      +     * classes only if time permits.
            * 
            * @param arguments List containing the file URI as the first element
      -     * @param monitor Progress monitor for cancellation support
      +     * @param monitor   Progress monitor for cancellation support
            * @return List of ImportClassInfo containing class information and JavaDoc
            */
      -    public static List getImportClassContent(List arguments, IProgressMonitor monitor) {
      +    public static ImportClassContentResult getImportClassContent(List arguments,
      +            IProgressMonitor monitor) {
      +        // Record start time for timeout control
      +        long startTime = System.currentTimeMillis();
      +        final long TIMEOUT_MS = 80; // 80ms timeout
      +        
               if (arguments == null || arguments.isEmpty()) {
      -            return Collections.emptyList();
      +            return new ImportClassContentResult(ImportClassContentErrorReason.NULL_ARGUMENTS);
               }
       
      -        // Time control: total budget 80ms, early return at 75ms
      -        long startTime = System.currentTimeMillis();
      -        final long TIME_BUDGET_MS = 80;
      -        final long EARLY_RETURN_MS = 75;
      -
               try {
                   String fileUri = (String) arguments.get(0);
      -
      +            if (fileUri == null || fileUri.trim().isEmpty()) {
      +                return new ImportClassContentResult(ImportClassContentErrorReason.INVALID_URI, fileUri);
      +            }
                   // Parse URI manually to avoid restricted API
                   java.net.URI uri = new java.net.URI(fileUri);
                   String filePath = uri.getPath();
                   if (filePath == null) {
      -                return Collections.emptyList();
      +                return new ImportClassContentResult(ImportClassContentErrorReason.URI_PARSE_FAILED, filePath);
                   }
       
                   IPath path = new Path(filePath);
      @@ -385,19 +514,26 @@ public static List getImportClassContent(List arguments
                   IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
                   IFile file = root.getFileForLocation(path);
                   if (file == null || !file.exists()) {
      -                return Collections.emptyList();
      +                return new ImportClassContentResult(ImportClassContentErrorReason.FILE_NOT_FOUND, filePath);
      +            }
      +            if (!file.exists()) {
      +                return new ImportClassContentResult(ImportClassContentErrorReason.FILE_NOT_EXISTS, filePath);
                   }
       
                   // Get the Java project
                   IJavaProject javaProject = JavaCore.create(file.getProject());
      -            if (javaProject == null || !javaProject.exists()) {
      -                return Collections.emptyList();
      +            if (javaProject == null) {
      +                return new ImportClassContentResult(ImportClassContentErrorReason.NOT_JAVA_PROJECT, filePath);
      +            }
      +            if (!javaProject.exists()) {
      +                String projectName = javaProject.getProject().getName();
      +                return new ImportClassContentResult(ImportClassContentErrorReason.PROJECT_NOT_EXISTS, projectName);
                   }
       
                   // Find the compilation unit
                   IJavaElement javaElement = JavaCore.create(file);
                   if (!(javaElement instanceof org.eclipse.jdt.core.ICompilationUnit)) {
      -                return Collections.emptyList();
      +                return new ImportClassContentResult(ImportClassContentErrorReason.NOT_COMPILATION_UNIT, filePath);
                   }
       
                   org.eclipse.jdt.core.ICompilationUnit compilationUnit = (org.eclipse.jdt.core.ICompilationUnit) javaElement;
      @@ -409,72 +545,102 @@ public static List getImportClassContent(List arguments
                   org.eclipse.jdt.core.IImportDeclaration[] imports = compilationUnit.getImports();
                   Set processedTypes = new HashSet<>();
       
      +            // Check if file has no imports
      +            if (imports == null || imports.length == 0) {
      +                return new ImportClassContentResult(ImportClassContentErrorReason.NO_IMPORTS);
      +            }
      +
                   // Phase 1: Priority - Resolve project source classes (internal)
                   for (org.eclipse.jdt.core.IImportDeclaration importDecl : imports) {
      -                // Check time budget before each operation
      -                long elapsed = System.currentTimeMillis() - startTime;
      -                if (monitor.isCanceled() || elapsed >= EARLY_RETURN_MS) {
      -                    return classInfoList; // Early return if approaching time limit
      +                // Check cancellation before each operation
      +                if (monitor.isCanceled()) {
      +                    return new ImportClassContentResult(ImportClassContentErrorReason.OPERATION_CANCELLED);
                       }
       
                       String importName = importDecl.getElementName();
                       boolean isStatic = (importDecl.getFlags() & org.eclipse.jdt.core.Flags.AccStatic) != 0;
      -                
      +
                       if (isStatic) {
                           // Handle static imports - delegate to ContextResolver
      -                    ContextResolver.resolveStaticImport(javaProject, importName, classInfoList, processedTypes, monitor);
      +                    ContextResolver.resolveStaticImport(javaProject, importName, classInfoList, processedTypes,
      +                            monitor);
                       } else if (importName.endsWith(".*")) {
                           // Handle package imports - delegate to ContextResolver
                           String packageName = importName.substring(0, importName.length() - 2);
      -                    ContextResolver.resolvePackageTypes(javaProject, packageName, classInfoList, processedTypes, monitor);
      +                    ContextResolver.resolvePackageTypes(javaProject, packageName, classInfoList, processedTypes,
      +                            monitor);
                       } else {
                           // Handle single type imports - delegate to ContextResolver
                           ContextResolver.resolveSingleType(javaProject, importName, classInfoList, processedTypes, monitor);
                       }
                   }
       
      -            // Phase 2: If time permits, resolve external dependencies
      -            long elapsedAfterInternal = System.currentTimeMillis() - startTime;
      -            if (elapsedAfterInternal < EARLY_RETURN_MS && !monitor.isCanceled()) {
      -                // Calculate remaining time budget for external classes
      -                long remainingTime = TIME_BUDGET_MS - elapsedAfterInternal;
      +            // Phase 2: Resolve external dependencies if not cancelled and within time limit
      +            if (!monitor.isCanceled()) {
      +                // Check if we have exceeded the timeout before starting external resolution
      +                long currentTime = System.currentTimeMillis();
      +                long elapsedTime = currentTime - startTime;
                       
      -                // Only proceed with external if we have reasonable time left (at least 15ms)
      -                if (remainingTime >= 15) {
      -                    List externalClasses = new ArrayList<>();
      -                    
      -                    for (org.eclipse.jdt.core.IImportDeclaration importDecl : imports) {
      -                        // Check time before each external resolution
      -                        long currentElapsed = System.currentTimeMillis() - startTime;
      -                        if (monitor.isCanceled() || currentElapsed >= EARLY_RETURN_MS) {
      -                            break;
      -                        }
      +                if (elapsedTime >= TIMEOUT_MS) {
      +                    // Return early due to timeout, but still return what we have collected so far
      +                    if (classInfoList.isEmpty()) {
      +                        return new ImportClassContentResult(ImportClassContentErrorReason.TIME_LIMIT_EXCEEDED, String.valueOf(elapsedTime) + "ms");
      +                    }
      +                    return new ImportClassContentResult(classInfoList);
      +                }
      +                
      +                List externalClasses = new ArrayList<>();
       
      -                        String importName = importDecl.getElementName();
      -                        boolean isStatic = (importDecl.getFlags() & org.eclipse.jdt.core.Flags.AccStatic) != 0;
      -                        
      -                        // Skip package imports (*.* ) - too broad for external dependencies
      -                        if (importName.endsWith(".*")) {
      -                            continue;
      -                        }
      -                        
      -                        // Resolve external (binary) types with simplified content
      -                        if (!isStatic) {
      -                            ContextResolver.resolveBinaryType(javaProject, importName, externalClasses, 
      -                                    processedTypes, Integer.MAX_VALUE, monitor);
      -                        }
      +                for (org.eclipse.jdt.core.IImportDeclaration importDecl : imports) {
      +                    // Check cancellation before each external resolution
      +                    if (monitor.isCanceled()) {
      +                        break;
                           }
                           
      -                    // Append external classes after project sources
      -                    classInfoList.addAll(externalClasses);
      +                    // Check timeout before each external resolution
      +                    currentTime = System.currentTimeMillis();
      +                    elapsedTime = currentTime - startTime;
      +                    if (elapsedTime >= TIMEOUT_MS) {
      +                        // Timeout reached, stop processing external dependencies but keep existing results
      +                        break;
      +                    }
      +
      +                    String importName = importDecl.getElementName();
      +                    boolean isStatic = (importDecl.getFlags() & org.eclipse.jdt.core.Flags.AccStatic) != 0;
      +
      +                    // Skip package imports (*.* ) - too broad for external dependencies
      +                    if (importName.endsWith(".*")) {
      +                        continue;
      +                    }
      +
      +                    // Resolve external (binary) types with simplified content
      +                    if (!isStatic) {
      +                        ContextResolver.resolveBinaryType(javaProject, importName, externalClasses,
      +                                processedTypes, Integer.MAX_VALUE, monitor);
      +                    }
                       }
      -            }
       
      -            return classInfoList;
      +                // Append external classes after project sources
      +                classInfoList.addAll(externalClasses);
      +            }
      +            // Success case - return the resolved class information
      +            if (classInfoList.isEmpty()) {
      +                return new ImportClassContentResult(ImportClassContentErrorReason.NO_RESULTS);
      +            }
      +            return new ImportClassContentResult(classInfoList);
       
               } catch (Exception e) {
                   JdtlsExtActivator.logException("Error in getImportClassContent", e);
      -            return Collections.emptyList();
      +            // Try to get context from arguments if available
      +            String errorUri = null;
      +            try {
      +                if (arguments != null && !arguments.isEmpty()) {
      +                    errorUri = (String) arguments.get(0);
      +                }
      +            } catch (Exception ignored) {
      +                // Ignore any further exceptions when trying to get context
      +            }
      +            return new ImportClassContentResult(ImportClassContentErrorReason.PROCESSING_EXCEPTION, errorUri);
               }
           }
       
      @@ -510,21 +676,68 @@ private static String getSeverityString(int severity) {
            * @param monitor Progress monitor for cancellation support
            * @return List of DependencyInfo containing key-value pairs of project information
            */
      -    public static List getProjectDependencies(List arguments, IProgressMonitor monitor) {
      +    public static ProjectDependenciesResult getProjectDependencies(List arguments,
      +            IProgressMonitor monitor) {
               if (arguments == null || arguments.isEmpty()) {
      -            return new ArrayList<>();
      +            return new ProjectDependenciesResult(ProjectDependenciesErrorReason.NULL_ARGUMENTS);
               }
       
      -        String fileUri = (String) arguments.get(0);
      -        List resolverResult = ProjectResolver.resolveProjectDependencies(fileUri, monitor);
      -        
      -        // Convert ProjectResolver.DependencyInfo to ProjectCommand.DependencyInfo
      -        List result = new ArrayList<>();
      -        for (ProjectResolver.DependencyInfo info : resolverResult) {
      -            result.add(new DependencyInfo(info.key, info.value));
      +        try {
      +            String fileUri = (String) arguments.get(0);
      +            if (fileUri == null || fileUri.trim().isEmpty()) {
      +                return new ProjectDependenciesResult(ProjectDependenciesErrorReason.INVALID_URI, fileUri);
      +            }
      +
      +            // Validate URI format
      +            String parsedPath = null;
      +            try {
      +                java.net.URI uri = new java.net.URI(fileUri);
      +                parsedPath = uri.getPath();
      +                if (parsedPath == null) {
      +                    return new ProjectDependenciesResult(ProjectDependenciesErrorReason.URI_PARSE_FAILED, parsedPath);
      +                }
      +            } catch (java.net.URISyntaxException e) {
      +                return new ProjectDependenciesResult(ProjectDependenciesErrorReason.MALFORMED_URI, fileUri);
      +            }
      +
      +            // Check if monitor is cancelled before processing
      +            if (monitor.isCanceled()) {
      +                return new ProjectDependenciesResult(ProjectDependenciesErrorReason.OPERATION_CANCELLED);
      +            }
      +            List resolverResult = ProjectResolver.resolveProjectDependencies(fileUri,
      +                    monitor);
      +            // Check if resolver returned null (should not happen, but defensive
      +            // programming)
      +            if (resolverResult == null) {
      +                return new ProjectDependenciesResult(ProjectDependenciesErrorReason.RESOLVER_NULL_RESULT);
      +            }
      +            // Convert ProjectResolver.DependencyInfo to ProjectCommand.DependencyInfo
      +            List result = new ArrayList<>();
      +            for (ProjectResolver.DependencyInfo info : resolverResult) {
      +                if (info != null) {
      +                    result.add(new DependencyInfo(info.key, info.value));
      +                }
      +            }
      +
      +            // Check if no dependencies were resolved
      +            if (result.isEmpty()) {
      +                return new ProjectDependenciesResult(ProjectDependenciesErrorReason.NO_DEPENDENCIES);
      +            }
      +
      +            return new ProjectDependenciesResult(result);
      +        } catch (Exception e) {
      +            JdtlsExtActivator.logException("Error in getProjectDependenciesWithReason", e);
      +            // Try to get context from arguments if available
      +            String errorUri = null;
      +            try {
      +                if (arguments != null && !arguments.isEmpty()) {
      +                    errorUri = (String) arguments.get(0);
      +                }
      +            } catch (Exception ignored) {
      +                // Ignore any further exceptions when trying to get context
      +            }
      +            return new ProjectDependenciesResult(ProjectDependenciesErrorReason.PROCESSING_EXCEPTION, errorUri);
               }
      -        
      -        return result;
           }
       
           private static final class LinkedFolderVisitor implements IResourceVisitor {
      diff --git a/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/parser/ContextResolver.java b/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/parser/ContextResolver.java
      index bf815c50..2d1ee610 100644
      --- a/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/parser/ContextResolver.java
      +++ b/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/parser/ContextResolver.java
      @@ -71,11 +71,11 @@ public class ContextResolver {
            */
           public static class ImportClassInfo {
               public String uri;           // File URI (required)
      -        public String className;     // Human-readable class description with JavaDoc appended (required)
      +        public String value;     // Human-readable class description with JavaDoc appended (required)
       
               public ImportClassInfo(String uri, String value) {
                   this.uri = uri;
      -            this.className = value;
      +            this.value = value;
               }
           }
       
      
      From e1307184fb87832d2102af9adc06836f4a3b58ad Mon Sep 17 00:00:00 2001
      From: wenyt <75360946+wenytang-ms@users.noreply.github.com>
      Date: Tue, 4 Nov 2025 11:15:12 +0800
      Subject: [PATCH 245/352] docs: add changelog to 0.26.3 (#928)
      
      ---
       CHANGELOG.md      | 6 ++++++
       package-lock.json | 2 +-
       package.json      | 2 +-
       3 files changed, 8 insertions(+), 2 deletions(-)
      
      diff --git a/CHANGELOG.md b/CHANGELOG.md
      index 2f3be684..c35cef3a 100644
      --- a/CHANGELOG.md
      +++ b/CHANGELOG.md
      @@ -4,6 +4,12 @@ All notable changes to the "vscode-java-dependency" extension will be documented
       The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/)
       and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html).
       
      +## 0.26.3
      +
      +- Enhancement - Register Context Provider to Copilot in https://github.com/microsoft/vscode-java-dependency/pull/924
      +- Enhancement - Adjust format to getProjectInfo method in https://github.com/microsoft/vscode-java-dependency/pull/927
      +- Enhancement - Add cache to getProjectInfo in https://github.com/microsoft/vscode-java-dependency/pull/925 
      +
       ## 0.26.2
       
       - Enhancement - Add getProjectInfo method to collect project info in https://github.com/microsoft/vscode-java-dependency/pull/919
      diff --git a/package-lock.json b/package-lock.json
      index ae6bcf66..d479cf48 100644
      --- a/package-lock.json
      +++ b/package-lock.json
      @@ -1,6 +1,6 @@
       {
         "name": "vscode-java-dependency",
      -  "version": "0.26.2",
      +  "version": "0.26.3",
         "lockfileVersion": 2,
         "requires": true,
         "packages": {
      diff --git a/package.json b/package.json
      index e29c4470..1a039ca9 100644
      --- a/package.json
      +++ b/package.json
      @@ -2,7 +2,7 @@
         "name": "vscode-java-dependency",
         "displayName": "Project Manager for Java",
         "description": "%description%",
      -  "version": "0.26.2",
      +  "version": "0.26.3",
         "publisher": "vscjava",
         "preview": false,
         "aiKey": "5c642b22-e845-4400-badb-3f8509a70777",
      
      From 7c460e88dfc3f21576d07907a3e6289e4d569085 Mon Sep 17 00:00:00 2001
      From: Ray Sun <202210574+FluoriteCafe-work@users.noreply.github.com>
      Date: Fri, 7 Nov 2025 15:40:20 +0800
      Subject: [PATCH 246/352] Update wording for Java 21 (#930)
      
      * chore: update wording on Java 21
      
      * chore: typo
      
      * chore: bump to 0.26.4
      
      * docs: update changelog
      ---
       CHANGELOG.md                       | 4 ++++
       package-lock.json                  | 4 ++--
       package.json                       | 2 +-
       src/upgrade/dependency.metadata.ts | 8 ++++----
       src/upgrade/utility.ts             | 4 ++--
       5 files changed, 13 insertions(+), 9 deletions(-)
      
      diff --git a/CHANGELOG.md b/CHANGELOG.md
      index c35cef3a..72f68ec7 100644
      --- a/CHANGELOG.md
      +++ b/CHANGELOG.md
      @@ -4,6 +4,10 @@ All notable changes to the "vscode-java-dependency" extension will be documented
       The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/)
       and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html).
       
      +## 0.26.4
      +
      +- fix - Update wording for Java 21 in https://github.com/microsoft/vscode-java-dependency/pull/930
      +
       ## 0.26.3
       
       - Enhancement - Register Context Provider to Copilot in https://github.com/microsoft/vscode-java-dependency/pull/924
      diff --git a/package-lock.json b/package-lock.json
      index d479cf48..e1551677 100644
      --- a/package-lock.json
      +++ b/package-lock.json
      @@ -1,12 +1,12 @@
       {
         "name": "vscode-java-dependency",
      -  "version": "0.26.3",
      +  "version": "0.26.4",
         "lockfileVersion": 2,
         "requires": true,
         "packages": {
           "": {
             "name": "vscode-java-dependency",
      -      "version": "0.26.2",
      +      "version": "0.26.4",
             "license": "MIT",
             "dependencies": {
               "@github/copilot-language-server": "^1.388.0",
      diff --git a/package.json b/package.json
      index 1a039ca9..f586baf8 100644
      --- a/package.json
      +++ b/package.json
      @@ -2,7 +2,7 @@
         "name": "vscode-java-dependency",
         "displayName": "Project Manager for Java",
         "description": "%description%",
      -  "version": "0.26.3",
      +  "version": "0.26.4",
         "publisher": "vscjava",
         "preview": false,
         "aiKey": "5c642b22-e845-4400-badb-3f8509a70777",
      diff --git a/src/upgrade/dependency.metadata.ts b/src/upgrade/dependency.metadata.ts
      index 71a793c8..8831f5f5 100644
      --- a/src/upgrade/dependency.metadata.ts
      +++ b/src/upgrade/dependency.metadata.ts
      @@ -4,15 +4,15 @@
       import { Upgrade } from "../constants";
       import { UpgradeReason, type DependencyCheckMetadata } from "./type";
       
      -const LATEST_JAVA_LTS_VESRION = 21;
      +const MATURE_JAVA_LTS_VERSION = 21;
       
       export const DEPENDENCY_JAVA_RUNTIME = {
           "name": "Java Runtime",
           "reason": UpgradeReason.JRE_TOO_OLD,
      -    "supportedVersion": `>=${LATEST_JAVA_LTS_VESRION}`,
      +    "supportedVersion": `>=${MATURE_JAVA_LTS_VERSION}`,
           "suggestedVersion": {
      -        "name": `Java ${LATEST_JAVA_LTS_VESRION}`,
      -        "description": "latest LTS version",
      +        "name": `Java ${MATURE_JAVA_LTS_VERSION}`,
      +        "description": "LTS version",
           },
       } as const;
       
      diff --git a/src/upgrade/utility.ts b/src/upgrade/utility.ts
      index 09588801..c6345100 100644
      --- a/src/upgrade/utility.ts
      +++ b/src/upgrade/utility.ts
      @@ -33,7 +33,7 @@ export function buildNotificationMessage(issue: UpgradeIssue, hasExtension: bool
           const upgradeWord = hasExtension ? "upgrade" : `install ${ExtensionName.APP_MODERNIZATION_EXTENSION_NAME} extension and upgrade`;
       
           if (packageId === Upgrade.PACKAGE_ID_FOR_JAVA_RUNTIME) {
      -        return `This project is using an older Java runtime (${currentVersion}). Would you like to ${upgradeWord} it to ${suggestedVersionName} (latest LTS)?`;
      +        return `This project is using an older Java runtime (${currentVersion}). Would you like to ${upgradeWord} it to ${suggestedVersionName} (LTS)?`;
           }
       
           switch (reason) {
      @@ -57,7 +57,7 @@ export function buildFixPrompt(issue: UpgradeIssue): string {
           switch (reason) {
               case UpgradeReason.JRE_TOO_OLD: {
                   const { suggestedVersion: { name: suggestedVersionName } } = issue;
      -            return `upgrade java runtime to the latest LTS version ${suggestedVersionName} using java upgrade tools`;
      +            return `upgrade java runtime to the LTS version ${suggestedVersionName} using java upgrade tools`;
               }
               case UpgradeReason.END_OF_LIFE:
               case UpgradeReason.DEPRECATED: {
      
      From e6e0d7a8928ff6c438ccf6312e9fde8c05de730a Mon Sep 17 00:00:00 2001
      From: wenyt <75360946+wenytang-ms@users.noreply.github.com>
      Date: Mon, 10 Nov 2025 13:27:52 +0800
      Subject: [PATCH 247/352] perf: optimized the javadoc from binary and filter
       common 3rd lib (#931)
      
      ---
       .../ext/core/parser/ContextResolver.java      | 78 ++++++++++++++++---
       1 file changed, 67 insertions(+), 11 deletions(-)
      
      diff --git a/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/parser/ContextResolver.java b/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/parser/ContextResolver.java
      index 2d1ee610..b5d4ee30 100644
      --- a/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/parser/ContextResolver.java
      +++ b/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/parser/ContextResolver.java
      @@ -63,6 +63,57 @@ public class ContextResolver {
               SKIP_COMMON_JDK_PACKAGES.add("java.text");           // DateFormat, SimpleDateFormat, etc.
               SKIP_COMMON_JDK_PACKAGES.add("java.sql");            // Connection, ResultSet, etc.
               SKIP_COMMON_JDK_PACKAGES.add("javax.sql");           // DataSource, etc.
      +        
      +        // Java EE / Jakarta EE - Well-known enterprise packages
      +        SKIP_COMMON_JDK_PACKAGES.add("javax.servlet");       // Servlet API
      +        SKIP_COMMON_JDK_PACKAGES.add("javax.annotation");    // @PostConstruct, @PreDestroy, etc.
      +        SKIP_COMMON_JDK_PACKAGES.add("javax.persistence");   // JPA annotations
      +        SKIP_COMMON_JDK_PACKAGES.add("javax.inject");        // @Inject
      +        SKIP_COMMON_JDK_PACKAGES.add("javax.validation");    // Bean Validation
      +        SKIP_COMMON_JDK_PACKAGES.add("jakarta.servlet");     // Jakarta Servlet
      +        SKIP_COMMON_JDK_PACKAGES.add("jakarta.persistence"); // Jakarta JPA
      +        
      +        // Spring Framework - Extremely common and well-documented
      +        SKIP_COMMON_JDK_PACKAGES.add("org.springframework.stereotype");    // @Component, @Service, @Repository, @Controller
      +        SKIP_COMMON_JDK_PACKAGES.add("org.springframework.beans");         // @Autowired, BeanFactory
      +        SKIP_COMMON_JDK_PACKAGES.add("org.springframework.context");       // ApplicationContext, @Configuration
      +        SKIP_COMMON_JDK_PACKAGES.add("org.springframework.web.bind");      // @RequestMapping, @PathVariable, etc.
      +        SKIP_COMMON_JDK_PACKAGES.add("org.springframework.boot");          // SpringApplication, @SpringBootApplication
      +        SKIP_COMMON_JDK_PACKAGES.add("org.springframework.data.jpa");      // JpaRepository
      +        SKIP_COMMON_JDK_PACKAGES.add("org.springframework.data.repository"); // CrudRepository
      +        SKIP_COMMON_JDK_PACKAGES.add("org.springframework.transaction");   // @Transactional
      +        SKIP_COMMON_JDK_PACKAGES.add("org.springframework.security");      // Spring Security annotations
      +        
      +        // Testing frameworks - Very common and well-documented
      +        SKIP_COMMON_JDK_PACKAGES.add("org.junit");           // JUnit 4/5 - @Test, assertions
      +        SKIP_COMMON_JDK_PACKAGES.add("org.junit.jupiter");   // JUnit 5 specific
      +        SKIP_COMMON_JDK_PACKAGES.add("org.testng");          // TestNG
      +        SKIP_COMMON_JDK_PACKAGES.add("org.mockito");         // Mockito - mock(), when(), verify()
      +        SKIP_COMMON_JDK_PACKAGES.add("org.assertj");         // AssertJ fluent assertions
      +        SKIP_COMMON_JDK_PACKAGES.add("org.hamcrest");        // Hamcrest matchers
      +        
      +        // Lombok - Code generation library (Copilot understands these annotations very well)
      +        SKIP_COMMON_JDK_PACKAGES.add("lombok");              // @Data, @Getter, @Setter, @Builder, etc.
      +        
      +        // Logging frameworks - Very standard APIs
      +        SKIP_COMMON_JDK_PACKAGES.add("org.slf4j");           // SLF4J - Logger, LoggerFactory
      +        SKIP_COMMON_JDK_PACKAGES.add("org.apache.logging.log4j"); // Log4j 2
      +        SKIP_COMMON_JDK_PACKAGES.add("org.apache.log4j");    // Log4j 1.x
      +        SKIP_COMMON_JDK_PACKAGES.add("java.util.logging");   // JUL - java.util.logging
      +        
      +        // Jackson - JSON processing (very common)
      +        SKIP_COMMON_JDK_PACKAGES.add("com.fasterxml.jackson.annotation"); // @JsonProperty, @JsonIgnore
      +        SKIP_COMMON_JDK_PACKAGES.add("com.fasterxml.jackson.core");       // JsonParser, JsonGenerator
      +        SKIP_COMMON_JDK_PACKAGES.add("com.fasterxml.jackson.databind");   // ObjectMapper
      +        
      +        // Google Guava - Well-known utility library
      +        SKIP_COMMON_JDK_PACKAGES.add("com.google.common.collect"); // ImmutableList, ImmutableMap, etc.
      +        SKIP_COMMON_JDK_PACKAGES.add("com.google.common.base");    // Preconditions, Strings, etc.
      +        
      +        // Apache Commons - Well-known utility libraries
      +        SKIP_COMMON_JDK_PACKAGES.add("org.apache.commons.lang3");  // StringUtils, etc.
      +        SKIP_COMMON_JDK_PACKAGES.add("org.apache.commons.collections4"); // CollectionUtils
      +        SKIP_COMMON_JDK_PACKAGES.add("org.apache.commons.io");     // IOUtils, FileUtils
           }
       
           /**
      @@ -821,20 +872,25 @@ public static String generateClassDescription(org.eclipse.jdt.core.IType type, S
            */
           private static String extractRelevantJavaDocContent(org.eclipse.jdt.core.IType type, IProgressMonitor monitor) {
               try {
      +            // Performance optimization: Skip JavaDoc extraction for binary types
      +            // getAttachedJavadoc() is EXTREMELY expensive for binary types:
      +            // - Requires reading from JAR files (I/O overhead)
      +            // - May trigger Maven artifact download from remote repositories (network)
      +            // - Involves HTML parsing and DOM manipulation (CPU intensive)
      +            // Binary types from JARs are typically well-known libraries that Copilot already understands
      +            if (type.isBinary()) {
      +                return ""; // Skip expensive JavaDoc extraction for external dependencies
      +            }
      +            
                   String rawJavadoc;
      -            boolean isHtml;
      +            boolean isHtml = false;
       
      -            if (type.isBinary()) {
      -                rawJavadoc = type.getAttachedJavadoc(monitor);
      -                isHtml = true;
      -            } else {
      -                org.eclipse.jdt.core.ISourceRange javadocRange = type.getJavadocRange();
      -                if (javadocRange == null) {
      -                    return "";
      -                }
      -                rawJavadoc = type.getCompilationUnit().getSource().substring(javadocRange.getOffset(), javadocRange.getOffset() + javadocRange.getLength());
      -                isHtml = false; // Javadoc comment from source is not HTML
      +            // Extract JavaDoc from source code (fast - no I/O, no network, no HTML parsing)
      +            org.eclipse.jdt.core.ISourceRange javadocRange = type.getJavadocRange();
      +            if (javadocRange == null) {
      +                return "";
                   }
      +            rawJavadoc = type.getCompilationUnit().getSource().substring(javadocRange.getOffset(), javadocRange.getOffset() + javadocRange.getLength());
       
                   if (!isNotEmpty(rawJavadoc)) {
                       return "";
      
      From e7bf941c036f578ad56ab58b57425960e48e6974 Mon Sep 17 00:00:00 2001
      From: Changyong Gong 
      Date: Tue, 11 Nov 2025 12:08:43 +0800
      Subject: [PATCH 248/352] chore: add triage open issues workflow (#935)
      
      ---
       .github/workflows/triage-agent.yml           |   5 +-
       .github/workflows/triage-all-open-issues.yml | 145 +++++++++++++++++++
       2 files changed, 149 insertions(+), 1 deletion(-)
       create mode 100644 .github/workflows/triage-all-open-issues.yml
      
      diff --git a/.github/workflows/triage-agent.yml b/.github/workflows/triage-agent.yml
      index 689a2529..92d805cb 100644
      --- a/.github/workflows/triage-agent.yml
      +++ b/.github/workflows/triage-agent.yml
      @@ -1,4 +1,4 @@
      -name: AI Triage - Label and Comment on New Issues
      +name: AI Triage
       on:
         issues:
           types: [opened]
      @@ -8,6 +8,9 @@ on:
               description: 'Issue number to triage (manual run). e.g. 123'
               required: true
       
      +run-name: >-
      +  AI Triage for Issue #${{ github.event.issue.number || github.event.inputs.issue_number }}
      +
       permissions:
         issues: write
         contents: read
      diff --git a/.github/workflows/triage-all-open-issues.yml b/.github/workflows/triage-all-open-issues.yml
      new file mode 100644
      index 00000000..092f4ef7
      --- /dev/null
      +++ b/.github/workflows/triage-all-open-issues.yml
      @@ -0,0 +1,145 @@
      +name: AI Triage - Process All Open Issues
      +on:
      +  workflow_dispatch:
      +    inputs:
      +      dry_run:
      +        description: 'Dry run mode - only list issues without processing'
      +        required: false
      +        default: false
      +        type: boolean
      +      max_issues:
      +        description: 'Maximum number of issues to process (0 = all)'
      +        required: false
      +        default: '0'
      +        type: string
      +
      +permissions:
      +  issues: write
      +  contents: read
      +  actions: write
      +
      +jobs:
      +  get_open_issues:
      +    runs-on: ubuntu-latest
      +    outputs:
      +      issue_numbers: ${{ steps.get_issues.outputs.issue_numbers }}
      +      total_count: ${{ steps.get_issues.outputs.total_count }}
      +    
      +    steps:
      +      - name: Get all open issues
      +        id: get_issues
      +        uses: actions/github-script@v6
      +        with:
      +          script: |
      +            // Use Search API to filter issues at API level
      +            const { data } = await github.rest.search.issuesAndPullRequests({
      +              q: `repo:${context.repo.owner}/${context.repo.repo} is:issue is:open -label:ai-triaged -label:invalid`,
      +              sort: 'created',
      +              order: 'asc',
      +              per_page: 100
      +            });
      +            
      +            const actualIssues = data.items;
      +            
      +            let issuesToProcess = actualIssues;
      +            const maxIssues = parseInt('${{ inputs.max_issues }}' || '0');
      +            
      +            if (maxIssues > 0 && actualIssues.length > maxIssues) {
      +              issuesToProcess = actualIssues.slice(0, maxIssues);
      +              console.log(`Limiting to first ${maxIssues} issues out of ${actualIssues.length} total`);
      +            }
      +            
      +            const issueNumbers = issuesToProcess.map(issue => issue.number);
      +            const totalCount = issuesToProcess.length;
      +            
      +            console.log(`Found ${actualIssues.length} open issues, processing ${totalCount}:`);
      +            issuesToProcess.forEach(issue => {
      +              console.log(`  #${issue.number}: ${issue.title}`);
      +            });
      +            
      +            core.setOutput('issue_numbers', JSON.stringify(issueNumbers));
      +            core.setOutput('total_count', totalCount);
      +
      +  process_issues:
      +    runs-on: ubuntu-latest
      +    needs: get_open_issues
      +    if: needs.get_open_issues.outputs.total_count > 0
      +    
      +    strategy:
      +      # Process issues one by one (max-parallel: 1)
      +      max-parallel: 1
      +      matrix:
      +        issue_number: ${{ fromJSON(needs.get_open_issues.outputs.issue_numbers) }}
      +    
      +    steps:
      +      - name: Log current issue being processed
      +        run: |
      +          echo "🔄 Processing issue #${{ matrix.issue_number }}"
      +          echo "Total issues to process: ${{ needs.get_open_issues.outputs.total_count }}"
      +      
      +      - name: Check if dry run mode
      +        if: inputs.dry_run == true
      +        run: |
      +          echo "🔍 DRY RUN MODE: Would process issue #${{ matrix.issue_number }}"
      +          echo "Skipping actual triage processing"
      +      
      +      - name: Trigger triage workflow for issue
      +        if: inputs.dry_run != true
      +        uses: actions/github-script@v6
      +        with:
      +          script: |
      +            const issueNumber = '${{ matrix.issue_number }}';
      +            
      +            try {
      +              console.log(`Triggering triage workflow for issue #${issueNumber}`);
      +              
      +              const response = await github.rest.actions.createWorkflowDispatch({
      +                owner: context.repo.owner,
      +                repo: context.repo.repo,
      +                workflow_id: 'triage-agent.yml',
      +                ref: 'main',
      +                inputs: {
      +                  issue_number: issueNumber
      +                }
      +              });
      +              
      +              console.log(`✅ Successfully triggered triage workflow for issue #${issueNumber}`);
      +              
      +            } catch (error) {
      +              console.error(`❌ Failed to trigger triage workflow for issue #${issueNumber}:`, error);
      +              core.setFailed(`Failed to process issue #${issueNumber}: ${error.message}`);
      +            }
      +      
      +      - name: Wait for workflow completion
      +        if: inputs.dry_run != true
      +        run: |
      +          echo "⏳ Waiting for triage workflow to complete for issue #${{ matrix.issue_number }}..."
      +          echo "Timeout: ${{ vars.TRIAGE_AGENT_TIMEOUT }} seconds"
      +          sleep ${{ vars.TRIAGE_AGENT_TIMEOUT }}  # Wait for triage workflow completion
      +
      +  summary:
      +    runs-on: ubuntu-latest
      +    needs: [get_open_issues, process_issues]
      +    if: always()
      +    
      +    steps:
      +      - name: Print summary
      +        run: |
      +          echo "## Triage Processing Summary"
      +          echo "Total open issues found: ${{ needs.get_open_issues.outputs.total_count }}"
      +          
      +          if [ "${{ inputs.dry_run }}" == "true" ]; then
      +            echo "Mode: DRY RUN (no actual processing performed)"
      +          else
      +            echo "Mode: FULL PROCESSING"
      +          fi
      +          
      +          if [ "${{ needs.process_issues.result }}" == "success" ]; then
      +            echo "✅ All issues processed successfully"
      +          elif [ "${{ needs.process_issues.result }}" == "failure" ]; then
      +            echo "❌ Some issues failed to process"
      +          elif [ "${{ needs.process_issues.result }}" == "skipped" ]; then
      +            echo "⏭️ Processing was skipped (no open issues found)"
      +          else
      +            echo "⚠️ Processing completed with status: ${{ needs.process_issues.result }}"
      +          fi
      
      From 8c231a2eebc0c6f7494710129695af307248e491 Mon Sep 17 00:00:00 2001
      From: wenyt <75360946+wenytang-ms@users.noreply.github.com>
      Date: Tue, 11 Nov 2025 13:01:49 +0800
      Subject: [PATCH 249/352] perf: adjust javadoc return content (#932)
      
      * chore: update
      
      * chore: update
      
      * fix: fix comments
      
      * fix: update the code
      
      * fix: update
      
      * ci: update
      
      * pref: remove html tags
      
      * perf: remove useless code
      
      * perf: remove useless code
      ---
       .../ext/core/parser/ContextResolver.java      | 244 +++++++++++++-----
       1 file changed, 174 insertions(+), 70 deletions(-)
      
      diff --git a/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/parser/ContextResolver.java b/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/parser/ContextResolver.java
      index b5d4ee30..ab063ef0 100644
      --- a/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/parser/ContextResolver.java
      +++ b/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/parser/ContextResolver.java
      @@ -231,16 +231,14 @@ private static boolean isCommonJdkType(String typeName) {
                   return false;
               }
               
      -        // Extract package name from fully qualified type name
               int lastDotIndex = typeName.lastIndexOf('.');
               if (lastDotIndex == -1) {
      -            return false; // No package (default package)
      +            return false;
               }
               
               String packageName = typeName.substring(0, lastDotIndex);
               
      -        // Check if package matches any common JDK package
      -        // This includes both exact matches and sub-packages
      +        // Check exact match or sub-package match
               return SKIP_COMMON_JDK_PACKAGES.contains(packageName) || 
                      SKIP_COMMON_JDK_PACKAGES.stream().anyMatch(pkg -> packageName.startsWith(pkg + "."));
           }
      @@ -862,13 +860,15 @@ public static String generateClassDescription(org.eclipse.jdt.core.IType type, S
           // ================ JavaDoc Extraction Methods ================
       
           /**
      -     * Extracts relevant code snippets from Javadoc.
      -     * This method is optimized to extract code from `` tags and markdown code fences,
      -     * and formats them in an LLM-readable format.
      +     * Extracts relevant JavaDoc content including description text and code snippets.
      +     * This method extracts:
      +     * 1. Class description (first paragraph of text)
      +     * 2. Code snippets from , 
      , and ``` blocks
      +     * 3. @deprecated tag if present
            *
            * @param type the type to extract Javadoc from.
            * @param monitor the progress monitor.
      -     * @return A string containing all found code snippets, formatted as markdown code blocks.
      +     * @return A string containing description and code snippets in LLM-readable format.
            */
           private static String extractRelevantJavaDocContent(org.eclipse.jdt.core.IType type, IProgressMonitor monitor) {
               try {
      @@ -883,7 +883,6 @@ private static String extractRelevantJavaDocContent(org.eclipse.jdt.core.IType t
                   }
                   
                   String rawJavadoc;
      -            boolean isHtml = false;
       
                   // Extract JavaDoc from source code (fast - no I/O, no network, no HTML parsing)
                   org.eclipse.jdt.core.ISourceRange javadocRange = type.getJavadocRange();
      @@ -896,49 +895,89 @@ private static String extractRelevantJavaDocContent(org.eclipse.jdt.core.IType t
                       return "";
                   }
       
      -            StringBuilder allCodeSnippets = new StringBuilder();
      +            StringBuilder result = new StringBuilder();
                   Set seenCodeSnippets = new HashSet<>();
      +            
      +            // Clean Javadoc comment for processing
      +            String cleanedJavadoc = cleanJavadocComment(rawJavadoc);
      +            cleanedJavadoc = removeHtmlTags(cleanedJavadoc);
      +            cleanedJavadoc = convertHtmlEntities(cleanedJavadoc);
      +
      +            // === High Priority: Extract class description text (first paragraph) ===
      +            String description = extractClassDescription(cleanedJavadoc);
      +            if (isNotEmpty(description)) {
      +                result.append("Description:\n").append(description).append("\n\n");
      +            }
       
      +            // === Extract code snippets ===
                   // 1. Extract markdown code blocks (```...```)
                   Matcher markdownMatcher = MARKDOWN_CODE_PATTERN.matcher(rawJavadoc);
                   while (markdownMatcher.find()) {
                       String code = markdownMatcher.group(1).trim();
                       if (isNotEmpty(code) && seenCodeSnippets.add(code)) {
      -                    allCodeSnippets.append("```java\n").append(code).append("\n```\n\n");
      +                    result.append("```java\n").append(code).append("\n```\n\n");
                       }
                   }
       
                   // 2. Extract HTML 
       and  blocks
      -            // Clean Javadoc comment for HTML extraction
      -            String cleanedForHtml = isHtml ? rawJavadoc : cleanJavadocComment(rawJavadoc);
      -            cleanedForHtml = convertHtmlEntities(cleanedForHtml);
      -
                   // Priority 1: 
       blocks (often contain well-formatted code)
      -            Matcher preMatcher = HTML_PRE_PATTERN.matcher(cleanedForHtml);
      +            Matcher preMatcher = HTML_PRE_PATTERN.matcher(cleanedJavadoc);
                   while (preMatcher.find()) {
                       String code = preMatcher.group(1).replaceAll("(?i)]*>", "").replaceAll("(?i)", "").trim();
                       if (isNotEmpty(code) && seenCodeSnippets.add(code)) {
      -                    allCodeSnippets.append("```java\n").append(code).append("\n```\n\n");
      +                    result.append("```java\n").append(code).append("\n```\n\n");
                       }
                   }
       
                   // Priority 2:  blocks (for inline snippets)
      -            Matcher codeMatcher = HTML_CODE_PATTERN.matcher(cleanedForHtml);
      +            Matcher codeMatcher = HTML_CODE_PATTERN.matcher(cleanedJavadoc);
                   while (codeMatcher.find()) {
                       String code = codeMatcher.group(1).trim();
                       // Use HashSet for O(1) duplicate checking
                       if (isNotEmpty(code) && seenCodeSnippets.add(code)) {
      -                    allCodeSnippets.append("```java\n").append(code).append("\n```\n\n");
      +                    result.append("```java\n").append(code).append("\n```\n\n");
                       }
                   }
       
      -            return allCodeSnippets.toString().trim();
      +            return result.toString().trim();
       
               } catch (Exception e) {
                   JdtlsExtActivator.logException("Error extracting relevant JavaDoc content for: " + type.getElementName(), e);
                   return "";
               }
           }
      +    
      +    /**
      +     * Extract the main description paragraph from class JavaDoc (before @tags and code blocks).
      +     * Returns the first paragraph of descriptive text, limited to reasonable length.
      +     */
      +    private static String extractClassDescription(String cleanedJavadoc) {
      +        if (cleanedJavadoc == null || cleanedJavadoc.isEmpty()) {
      +            return "";
      +        }
      +        
      +        // Remove code blocks first to get pure text
      +        String textOnly = cleanedJavadoc;
      +        textOnly = MARKDOWN_CODE_PATTERN.matcher(textOnly).replaceAll("");
      +        textOnly = HTML_PRE_PATTERN.matcher(textOnly).replaceAll("");
      +        textOnly = HTML_CODE_PATTERN.matcher(textOnly).replaceAll("");
      +        
      +        // Extract description before @tags
      +        String description = extractJavadocDescription(textOnly);
      +        
      +        // Limit to ~2000 characters
      +        if (description.length() > 2000) {
      +            int breakPoint = findBestBreakpoint(description, 1500, 2100);
      +            if (breakPoint != -1) {
      +                description = description.substring(0, breakPoint + 1).trim();
      +            } else {
      +                int lastSpace = description.lastIndexOf(' ', 2000);
      +                description = description.substring(0, lastSpace > 1500 ? lastSpace : 2000).trim() + "...";
      +            }
      +        }
      +        
      +        return description.trim();
      +    }
       
           /**
            * Clean up raw JavaDoc comment by removing comment markers and asterisks
      @@ -987,27 +1026,68 @@ private static String convertHtmlEntities(String text) {
               if (text == null || text.isEmpty()) {
                   return text;
               }
      -        String result = text;
      -        result = result.replace(" ", " ");
      -        result = result.replace("<", "<");
      -        result = result.replace(">", ">");
      -        result = result.replace("&", "&");
      -        result = result.replace(""", "\"");
      -        result = result.replace("'", "'");
      -        result = result.replace("'", "'");
      -        result = result.replace("—", "-");
      -        result = result.replace("–", "-");
      -        return result;
      +        return text.replace(" ", " ")
      +                   .replace("<", "<")
      +                   .replace(">", ">")
      +                   .replace("&", "&")
      +                   .replace(""", "\"")
      +                   .replace("'", "'")
      +                   .replace("'", "'")
      +                   .replace("—", "-")
      +                   .replace("–", "-");
           }
       
           /**
      -     * Extract summary description from method JavaDoc
      -     * Returns the first sentence or paragraph of the JavaDoc as a brief description
      +     * Remove all HTML tags from text, keeping only plain text content.
      +     * Preserves line breaks for block-level tags like 

      ,
      ,

      . */ - private static String extractMethodJavaDocSummary(IMethod method) { - return extractJavaDocSummaryFromElement(method); + private static String removeHtmlTags(String text) { + if (text == null || text.isEmpty()) { + return text; + } + + // Replace block-level tags with line breaks + text = text.replaceAll("(?i)||]*>", "\n"); + + // Remove all remaining HTML tags + text = text.replaceAll("<[^>]+>", ""); + + // Clean up whitespace: collapse spaces, trim lines, limit line breaks + text = text.replaceAll("[ \\t]+", " ") + .replaceAll(" *\\n *", "\n") + .replaceAll("\\n{3,}", "\n\n"); + + return text.trim(); } + /** + * Extract method JavaDoc content directly for LLM consumption. + * Returns cleaned JavaDoc without artificial truncation - let LLM understand the full context. + */ + private static String extractMethodJavaDocSummary(IMethod method) { + try { + org.eclipse.jdt.core.ISourceRange javadocRange = method.getJavadocRange(); + if (javadocRange == null) { + return ""; + } + + String rawJavadoc = method.getCompilationUnit().getSource() + .substring(javadocRange.getOffset(), javadocRange.getOffset() + javadocRange.getLength()); + + if (!isNotEmpty(rawJavadoc)) { + return ""; + } + + // Just clean and return - let LLM understand the full context + String cleaned = cleanJavadocComment(rawJavadoc); + cleaned = removeHtmlTags(cleaned); + return convertHtmlEntities(cleaned); + + } catch (Exception e) { + return ""; + } + } + /** * Extract the main description part from JavaDoc (before @tags) */ @@ -1050,13 +1130,7 @@ private static String getFirstSentenceOrLimit(String text, int maxLength) { } // Find first sentence boundary (., !, ?) - int[] boundaries = {text.indexOf(". "), text.indexOf(".\n"), text.indexOf("! "), text.indexOf("? ")}; - int firstSentenceEnd = -1; - for (int boundary : boundaries) { - if (boundary != -1 && (firstSentenceEnd == -1 || boundary < firstSentenceEnd)) { - firstSentenceEnd = boundary; - } - } + int firstSentenceEnd = findFirstSentenceBoundary(text); // Return first sentence if within reasonable length if (firstSentenceEnd != -1 && firstSentenceEnd < maxLength) { @@ -1072,12 +1146,67 @@ private static String getFirstSentenceOrLimit(String text, int maxLength) { return text.trim(); } + + /** + * Find the first sentence boundary in text + */ + private static int findFirstSentenceBoundary(String text) { + int[] boundaries = {text.indexOf(". "), text.indexOf(".\n"), text.indexOf("! "), text.indexOf("? ")}; + int result = -1; + for (int boundary : boundaries) { + if (boundary != -1 && (result == -1 || boundary < result)) { + result = boundary; + } + } + return result; + } + + /** + * Find the best breakpoint for truncating text within a range + */ + private static int findBestBreakpoint(String text, int minPos, int maxPos) { + int[] boundaries = { + text.indexOf(". ", minPos), + text.indexOf(".\n", minPos), + text.indexOf("! ", minPos), + text.indexOf("? ", minPos) + }; + + int result = -1; + for (int boundary : boundaries) { + if (boundary != -1 && boundary < maxPos && (result == -1 || boundary < result)) { + result = boundary; + } + } + return result; + } /** - * Extract summary description from field JavaDoc + * Extract field JavaDoc content directly for LLM consumption. + * Returns cleaned JavaDoc without artificial truncation - let LLM understand the full context. */ private static String extractFieldJavaDocSummary(org.eclipse.jdt.core.IField field) { - return extractJavaDocSummaryFromElement(field); + try { + org.eclipse.jdt.core.ISourceRange javadocRange = field.getJavadocRange(); + if (javadocRange == null) { + return ""; + } + + String rawJavadoc = field.getCompilationUnit().getSource() + .substring(javadocRange.getOffset(), javadocRange.getOffset() + javadocRange.getLength()); + + if (!isNotEmpty(rawJavadoc)) { + return ""; + } + + // Just clean and return - let LLM understand the full context + String cleaned = cleanJavadocComment(rawJavadoc); + cleaned = removeHtmlTags(cleaned); + return convertHtmlEntities(cleaned); + + } catch (Exception e) { + return ""; + } } /** @@ -1094,8 +1223,6 @@ public static String generateFieldSignature(org.eclipse.jdt.core.IField field) { return generateFieldSignatureInternal(field, false); } - - /** * Convert JDT type signature to human-readable format */ @@ -1228,30 +1355,7 @@ private static String simplifyTypeName(String qualifiedName) { return lastDot == -1 ? qualifiedName : qualifiedName.substring(lastDot + 1); } - /** - * Unified JavaDoc summary extractor for methods and fields - */ - private static String extractJavaDocSummaryFromElement(org.eclipse.jdt.core.IMember element) { - try { - org.eclipse.jdt.core.ISourceRange javadocRange = element.getJavadocRange(); - if (javadocRange == null) { - return ""; - } - - String rawJavadoc = element.getCompilationUnit().getSource() - .substring(javadocRange.getOffset(), javadocRange.getOffset() + javadocRange.getLength()); - - if (rawJavadoc == null || rawJavadoc.isEmpty()) { - return ""; - } - - String cleaned = cleanJavadocComment(rawJavadoc); - String description = extractJavadocDescription(cleaned); - return getFirstSentenceOrLimit(description, 120); - } catch (Exception e) { - return ""; - } - } + /** * Unified method signature generator (handles both source and binary types) From bb01d028ede4869a247cb76f05e033d3fcdd51e3 Mon Sep 17 00:00:00 2001 From: wenyt <75360946+wenytang-ms@users.noreply.github.com> Date: Tue, 11 Nov 2025 16:00:57 +0800 Subject: [PATCH 250/352] perf: throttling telemetry event in context provider (#936) * perf: throttling telemetry event * fix: update * fix: update * fix: update * fix: remove senderror * perf: remove useless code * perf: remove useless code * perf: remove useless code --- src/copilot/contextProvider.ts | 84 +++++++++----- src/copilot/copilotHelper.ts | 206 ++++++++++++++------------------- src/copilot/utils.ts | 55 +++++++-- 3 files changed, 183 insertions(+), 162 deletions(-) diff --git a/src/copilot/contextProvider.ts b/src/copilot/contextProvider.ts index 4857b8e6..6640ee13 100644 --- a/src/copilot/contextProvider.ts +++ b/src/copilot/contextProvider.ts @@ -18,7 +18,8 @@ import { ContextResolverFunction, CopilotApi, ContextProviderRegistrationError, - ContextProviderResolverError + ContextProviderResolverError, + sendContextResolutionTelemetry } from './utils'; export async function registerCopilotContextProviders( @@ -70,70 +71,95 @@ function createJavaContextResolver(): ContextResolverFunction { }; } -/** - * Send telemetry data for Java context resolution - */ -function sendContextTelemetry(request: ResolveRequest, start: number, items: SupportedContextItem[], status: string, error?: string) { - const duration = Math.round(performance.now() - start); - const tokenCount = JavaContextProviderUtils.calculateTokenCount(items); - const telemetryData: any = { - "action": "resolveJavaContext", - "completionId": request.completionId, - "duration": duration, - "itemCount": items.length, - "tokenCount": tokenCount, - "status": status - }; - if (error) { - telemetryData.error = error; - } - sendInfo("", telemetryData); -} - async function resolveJavaContext(request: ResolveRequest, copilotCancel: vscode.CancellationToken): Promise { const items: SupportedContextItem[] = []; const start = performance.now(); + + let dependenciesResult: CopilotHelper.IResolveResult | undefined; + let importsResult: CopilotHelper.IResolveResult | undefined; + try { // Check for cancellation before starting JavaContextProviderUtils.checkCancellation(copilotCancel); + // Resolve project dependencies and convert to context items - const projectDependencyItems = await CopilotHelper.resolveAndConvertProjectDependencies( + dependenciesResult = await CopilotHelper.resolveAndConvertProjectDependencies( vscode.window.activeTextEditor, copilotCancel, JavaContextProviderUtils.checkCancellation ); JavaContextProviderUtils.checkCancellation(copilotCancel); - items.push(...projectDependencyItems); + items.push(...dependenciesResult.items); JavaContextProviderUtils.checkCancellation(copilotCancel); // Resolve local imports and convert to context items - const localImportItems = await CopilotHelper.resolveAndConvertLocalImports( + importsResult = await CopilotHelper.resolveAndConvertLocalImports( vscode.window.activeTextEditor, copilotCancel, JavaContextProviderUtils.checkCancellation ); JavaContextProviderUtils.checkCancellation(copilotCancel); - items.push(...localImportItems); + items.push(...importsResult.items); } catch (error: any) { if (error instanceof CopilotCancellationError) { - sendContextTelemetry(request, start, items, "cancelled_by_copilot"); + sendContextResolutionTelemetry( + request, + start, + items, + "cancelled_by_copilot", + undefined, + dependenciesResult?.emptyReason, + importsResult?.emptyReason, + dependenciesResult?.itemCount, + importsResult?.itemCount + ); throw error; } if (error instanceof vscode.CancellationError || error.message === CancellationError.CANCELED) { - sendContextTelemetry(request, start, items, "cancelled_internally"); + sendContextResolutionTelemetry( + request, + start, + items, + "cancelled_internally", + undefined, + dependenciesResult?.emptyReason, + importsResult?.emptyReason, + dependenciesResult?.itemCount, + importsResult?.itemCount + ); throw new InternalCancellationError(); } // Send telemetry for general errors (but continue with partial results) - sendContextTelemetry(request, start, items, "error_partial_results", error.message || "unknown_error"); + sendContextResolutionTelemetry( + request, + start, + items, + "error_partial_results", + error.message || "unknown_error", + dependenciesResult?.emptyReason, + importsResult?.emptyReason, + dependenciesResult?.itemCount, + importsResult?.itemCount + ); // Return partial results and log completion for error case return items; } // Send telemetry data once at the end for success case - sendContextTelemetry(request, start, items, "succeeded"); + sendContextResolutionTelemetry( + request, + start, + items, + "succeeded", + undefined, + dependenciesResult?.emptyReason, + importsResult?.emptyReason, + dependenciesResult?.itemCount, + importsResult?.itemCount + ); return items; } diff --git a/src/copilot/copilotHelper.ts b/src/copilot/copilotHelper.ts index 2a0b4cfd..67bf3196 100644 --- a/src/copilot/copilotHelper.ts +++ b/src/copilot/copilotHelper.ts @@ -2,8 +2,7 @@ // Licensed under the MIT license. import { commands, Uri, CancellationToken } from "vscode"; -import { sendError, sendInfo } from "vscode-extension-telemetry-wrapper"; -import { GetImportClassContentError, GetProjectDependenciesError, sendContextOperationTelemetry, JavaContextProviderUtils } from "./utils"; +import { JavaContextProviderUtils } from "./utils"; import { Commands } from '../commands'; /** @@ -52,17 +51,6 @@ export interface IProjectDependenciesResult { * Helper class for Copilot integration to analyze Java project dependencies */ export namespace CopilotHelper { - /** - * Resolves all local project types imported by the given file (backward compatibility version) - * @param fileUri The URI of the Java file to analyze - * @param cancellationToken Optional cancellation token to abort the operation - * @returns Array of import class information - */ - export async function resolveLocalImports(fileUri: Uri, cancellationToken?: CancellationToken): Promise { - const result = await resolveLocalImportsWithReason(fileUri, cancellationToken); - return result.classInfoList; - } - /** * Resolves all local project types imported by the given file with detailed error reporting * @param fileUri The URI of the Java file to analyze @@ -85,46 +73,41 @@ export namespace CopilotHelper { Commands.JAVA_PROJECT_GET_IMPORT_CLASS_CONTENT, normalizedUri ) as Promise; + + // Build promises array for race condition + // Note: Client-side timeout is NECESSARY even if backend has timeout because: + // 1. Network delays may prevent backend response from arriving + // 2. Process hangs won't trigger backend timeout + // 3. Command dispatch failures need to be caught + const promises: Promise[] = [ + commandPromise, + new Promise((_, reject) => { + setTimeout(() => { + reject(new Error(ErrorMessage.OperationTimedOut)); + }, 80); // 80ms client-side timeout (independent of backend timeout) + }) + ]; + + // Add cancellation promise if token provided if (cancellationToken) { - const result = await Promise.race([ - commandPromise, + promises.push( new Promise((_, reject) => { cancellationToken.onCancellationRequested(() => { reject(new Error(ErrorMessage.OperationCancelled)); }); - }), - new Promise((_, reject) => { - setTimeout(() => { - reject(new Error(ErrorMessage.OperationTimedOut)); - }, 80); // 80ms timeout }) - ]); - if (!result) { - return { - classInfoList: [], - emptyReason: EmptyReason.CommandNullResult, - isEmpty: true - }; - } - return result; - } else { - const result = await Promise.race([ - commandPromise, - new Promise((_, reject) => { - setTimeout(() => { - reject(new Error(ErrorMessage.OperationTimedOut)); - }, 80); // 80ms timeout - }) - ]); - if (!result) { - return { - classInfoList: [], - emptyReason: EmptyReason.CommandNullResult, - isEmpty: true - }; - } - return result; + ); } + + const result = await Promise.race(promises); + if (!result) { + return { + classInfoList: [], + emptyReason: EmptyReason.CommandNullResult, + isEmpty: true + }; + } + return result; } catch (error: any) { if (error.message === ErrorMessage.OperationCancelled) { return { @@ -141,7 +124,6 @@ export namespace CopilotHelper { }; } const errorMessage = 'TsException_' + ((error as Error).message || "unknown"); - sendError(new GetImportClassContentError(errorMessage)); return { classInfoList: [], emptyReason: errorMessage, @@ -150,24 +132,6 @@ export namespace CopilotHelper { } } - /** - * Resolves project dependencies for the given project URI (backward compatibility version) - * @param projectUri The URI of the Java project to analyze - * @param cancellationToken Optional cancellation token to abort the operation - * @returns Object containing project dependencies as key-value pairs - */ - export async function resolveProjectDependencies(projectUri: Uri, cancellationToken?: CancellationToken): Promise { - const result = await resolveProjectDependenciesWithReason(projectUri, cancellationToken); - - // Convert to legacy format - const dependencies: IProjectDependency = {}; - for (const dep of result.dependencyInfoList) { - dependencies[dep.key] = dep.value; - } - - return dependencies; - } - /** * Resolves project dependencies with detailed error reporting * @param projectUri The URI of the Java project to analyze @@ -194,46 +158,40 @@ export namespace CopilotHelper { normalizedUri ) as Promise; + // Build promises array for race condition + // Note: Client-side timeout is NECESSARY even if backend has timeout because: + // 1. Network delays may prevent backend response from arriving + // 2. Process hangs won't trigger backend timeout + // 3. Command dispatch failures need to be caught + const promises: Promise[] = [ + commandPromise, + new Promise((_, reject) => { + setTimeout(() => { + reject(new Error(ErrorMessage.OperationTimedOut)); + }, 40); // 40ms client-side timeout (independent of backend timeout) + }) + ]; + + // Add cancellation promise if token provided if (cancellationToken) { - const result = await Promise.race([ - commandPromise, + promises.push( new Promise((_, reject) => { cancellationToken.onCancellationRequested(() => { reject(new Error(ErrorMessage.OperationCancelled)); }); - }), - new Promise((_, reject) => { - setTimeout(() => { - reject(new Error(ErrorMessage.OperationTimedOut)); - }, 40); // 40ms timeout }) - ]); - if (!result) { - return { - dependencyInfoList: [], - emptyReason: EmptyReason.CommandNullResult, - isEmpty: true - }; - } - return result; - } else { - const result = await Promise.race([ - commandPromise, - new Promise((_, reject) => { - setTimeout(() => { - reject(new Error(ErrorMessage.OperationTimedOut)); - }, 40); // 40ms timeout - }) - ]); - if (!result) { - return { - dependencyInfoList: [], - emptyReason: EmptyReason.CommandNullResult, - isEmpty: true - }; - } - return result; + ); + } + + const result = await Promise.race(promises); + if (!result) { + return { + dependencyInfoList: [], + emptyReason: EmptyReason.CommandNullResult, + isEmpty: true + }; } + return result; } catch (error: any) { if (error.message === ErrorMessage.OperationCancelled) { return { @@ -250,7 +208,6 @@ export namespace CopilotHelper { }; } const errorMessage = 'TsException_' + ((error as Error).message || "unknown"); - sendError(new GetProjectDependenciesError(errorMessage)); return { dependencyInfoList: [], emptyReason: errorMessage, @@ -259,27 +216,35 @@ export namespace CopilotHelper { } } + /** + * Result interface for dependency resolution with diagnostic information + */ + export interface IResolveResult { + items: any[]; + emptyReason?: string; + itemCount: number; + } + /** * Resolves project dependencies and converts them to context items with cancellation support - * @param workspaceFolders The workspace folders, or undefined if none + * @param activeEditor The active text editor, or undefined if none * @param copilotCancel Cancellation token from Copilot * @param checkCancellation Function to check for cancellation - * @returns Array of context items for project dependencies, or empty array if no workspace folders + * @returns Result object containing context items and diagnostic information */ export async function resolveAndConvertProjectDependencies( activeEditor: { document: { uri: Uri; languageId: string } } | undefined, copilotCancel: CancellationToken, checkCancellation: (token: CancellationToken) => void - ): Promise<{ name: string; value: string; importance: number }[]> { + ): Promise { const items: any[] = []; - // Check if workspace folders exist + + // Check if active editor exists if (!activeEditor) { - sendContextOperationTelemetry("resolveLocalImports", "ContextEmpty", sendInfo, EmptyReason.NoActiveEditor); - return items; + return { items: [], emptyReason: EmptyReason.NoActiveEditor, itemCount: 0 }; } if (activeEditor.document.languageId !== 'java') { - sendContextOperationTelemetry("resolveLocalImports", "ContextEmpty", sendInfo, EmptyReason.NotJavaFile); - return items; + return { items: [], emptyReason: EmptyReason.NotJavaFile, itemCount: 0 }; } const documentUri = activeEditor.document.uri; @@ -289,12 +254,12 @@ export namespace CopilotHelper { // Check for cancellation after dependency resolution checkCancellation(copilotCancel); - // Send telemetry if result is empty + // Return empty result with reason if no dependencies found if (projectDependenciesResult.isEmpty && projectDependenciesResult.emptyReason) { - sendContextOperationTelemetry("resolveProjectDependencies", "ContextEmpty", sendInfo, projectDependenciesResult.emptyReason); + return { items: [], emptyReason: projectDependenciesResult.emptyReason, itemCount: 0 }; } - // Check for cancellation after telemetry + // Check for cancellation after dependency resolution checkCancellation(copilotCancel); // Convert project dependencies to context items @@ -306,7 +271,7 @@ export namespace CopilotHelper { items.push(...contextItems); } - return items; + return { items, itemCount: items.length }; } /** @@ -314,23 +279,21 @@ export namespace CopilotHelper { * @param activeEditor The active text editor, or undefined if none * @param copilotCancel Cancellation token from Copilot * @param checkCancellation Function to check for cancellation - * @param createContextItems Function to create context items from imports - * @returns Array of context items for local imports, or empty array if no valid editor + * @returns Result object containing context items and diagnostic information */ export async function resolveAndConvertLocalImports( activeEditor: { document: { uri: Uri; languageId: string } } | undefined, copilotCancel: CancellationToken, checkCancellation: (token: CancellationToken) => void - ): Promise { + ): Promise { const items: any[] = []; + // Check if there's an active editor with a Java document if (!activeEditor) { - sendContextOperationTelemetry("resolveLocalImports", "ContextEmpty", sendInfo, EmptyReason.NoActiveEditor); - return items; + return { items: [], emptyReason: EmptyReason.NoActiveEditor, itemCount: 0 }; } if (activeEditor.document.languageId !== 'java') { - sendContextOperationTelemetry("resolveLocalImports", "ContextEmpty", sendInfo, EmptyReason.NotJavaFile); - return items; + return { items: [], emptyReason: EmptyReason.NotJavaFile, itemCount: 0 }; } const documentUri = activeEditor.document.uri; @@ -343,10 +306,11 @@ export namespace CopilotHelper { // Check for cancellation after resolution checkCancellation(copilotCancel); - // Send telemetry if result is empty + // Return empty result with reason if no imports found if (importClassResult.isEmpty && importClassResult.emptyReason) { - sendContextOperationTelemetry("resolveLocalImports", "ContextEmpty", sendInfo, importClassResult.emptyReason); + return { items: [], emptyReason: importClassResult.emptyReason, itemCount: 0 }; } + // Check for cancellation before processing results checkCancellation(copilotCancel); if (importClassResult.classInfoList && importClassResult.classInfoList.length > 0) { @@ -357,6 +321,6 @@ export namespace CopilotHelper { items.push(...contextItems); } - return items; + return { items, itemCount: items.length }; } } diff --git a/src/copilot/utils.ts b/src/copilot/utils.ts index 69717aa2..4a2b424a 100644 --- a/src/copilot/utils.ts +++ b/src/copilot/utils.ts @@ -7,6 +7,7 @@ import { SupportedContextItem, type ContextProvider, } from '@github/copilot-language-server'; +import { sendInfo } from "vscode-extension-telemetry-wrapper"; /** * Error classes for Copilot context provider cancellation handling */ @@ -210,24 +211,54 @@ export class ContextProviderResolverError extends Error { } /** - * Send telemetry data for context operations (like resolveProjectDependencies, resolveLocalImports) - * @param action The action being performed - * @param status The status of the action (e.g., "ContextEmpty", "succeeded") - * @param reason Optional reason for empty context + * Send consolidated telemetry data for Java context resolution + * This is the centralized function for sending context resolution telemetry + * + * @param request The resolve request from Copilot + * @param start Performance timestamp when resolution started + * @param items The resolved context items + * @param status Status of the resolution ("succeeded", "cancelled_by_copilot", "cancelled_internally", "error_partial_results") * @param sendInfo The sendInfo function from vscode-extension-telemetry-wrapper + * @param error Optional error message + * @param dependenciesEmptyReason Optional reason why dependencies were empty + * @param importsEmptyReason Optional reason why imports were empty + * @param dependenciesCount Number of dependency items resolved + * @param importsCount Number of import items resolved */ -export function sendContextOperationTelemetry( - action: string, +export function sendContextResolutionTelemetry( + request: ResolveRequest, + start: number, + items: SupportedContextItem[], status: string, - sendInfo: (eventName: string, properties?: any) => void, - reason?: string + error?: string, + dependenciesEmptyReason?: string, + importsEmptyReason?: string, + dependenciesCount?: number, + importsCount?: number ): void { + const duration = Math.round(performance.now() - start); + const tokenCount = JavaContextProviderUtils.calculateTokenCount(items); const telemetryData: any = { - "action": action, - "status": status + "action": "resolveJavaContext", + "completionId": request.completionId, + "duration": duration, + "itemCount": items.length, + "tokenCount": tokenCount, + "status": status, + "dependenciesCount": dependenciesCount ?? 0, + "importsCount": importsCount ?? 0 }; - if (reason) { - telemetryData.ContextEmptyReason = reason; + + // Add empty reasons if present + if (dependenciesEmptyReason) { + telemetryData.dependenciesEmptyReason = dependenciesEmptyReason; + } + if (importsEmptyReason) { + telemetryData.importsEmptyReason = importsEmptyReason; } + if (error) { + telemetryData.error = error; + } + sendInfo("", telemetryData); } \ No newline at end of file From 5cb59893179b7e9c0d081b301acddb41ec4ce274 Mon Sep 17 00:00:00 2001 From: wenyt <75360946+wenytang-ms@users.noreply.github.com> Date: Tue, 11 Nov 2025 17:02:48 +0800 Subject: [PATCH 251/352] fix: unblock activate extension while register copilot context provider (#937) --- src/extension.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/extension.ts b/src/extension.ts index af169c32..2ba04ba8 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -38,7 +38,7 @@ export async function activate(context: ExtensionContext): Promise { } }); contextManager.setContextValue(Context.EXTENSION_ACTIVATED, true); - await registerCopilotContextProviders(context); + registerCopilotContextProviders(context); } async function activateExtension(_operationId: string, context: ExtensionContext): Promise { From 9438d1b01928f968cf628073dd3481ce26a208b8 Mon Sep 17 00:00:00 2001 From: wenyt <75360946+wenytang-ms@users.noreply.github.com> Date: Wed, 12 Nov 2025 09:56:09 +0800 Subject: [PATCH 252/352] docs: release for 0.26.4 (#938) * docs: release for 0.26.4 * docs: update --- CHANGELOG.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 72f68ec7..64135b05 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,7 +6,10 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0. ## 0.26.4 -- fix - Update wording for Java 21 in https://github.com/microsoft/vscode-java-dependency/pull/930 +- Fix - Update wording for Java 21 in https://github.com/microsoft/vscode-java-dependency/pull/930 +- Enhancement - throttling telemetry event in context provider https://github.com/microsoft/vscode-java-dependency/pull/936 +- Enhancement - optimizing javadoc from binary and filter common 3rd lib https://github.com/microsoft/vscode-java-dependency/pull/931 +- Fix - unblocking activation of extension while registering copilot context provider https://github.com/microsoft/vscode-java-dependency/pull/937 ## 0.26.3 From 3effb19b351c5a0c5545c37e919db678b6402345 Mon Sep 17 00:00:00 2001 From: wenyt <75360946+wenytang-ms@users.noreply.github.com> Date: Fri, 14 Nov 2025 10:03:25 +0800 Subject: [PATCH 253/352] perf: register context provider while java ls ready (#939) * perf: register context provider while java ls ready * fix: fix whitespace --- src/extension.ts | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/extension.ts b/src/extension.ts index 2ba04ba8..c89b6547 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -22,6 +22,7 @@ import { CodeActionProvider } from "./tasks/buildArtifact/migration/CodeActionPr import { newJavaFile } from "./explorerCommands/new"; import upgradeManager from "./upgrade/upgradeManager"; import { registerCopilotContextProviders } from "./copilot/contextProvider"; +import { languageServerApiManager } from "./languageServerApi/languageServerApiManager"; export async function activate(context: ExtensionContext): Promise { contextManager.initialize(context); @@ -38,7 +39,6 @@ export async function activate(context: ExtensionContext): Promise { } }); contextManager.setContextValue(Context.EXTENSION_ACTIVATED, true); - registerCopilotContextProviders(context); } async function activateExtension(_operationId: string, context: ExtensionContext): Promise { @@ -85,6 +85,13 @@ async function activateExtension(_operationId: string, context: ExtensionContext } )); setContextForDeprecatedTasks(); + + // Register Copilot context providers after Java Language Server is ready + languageServerApiManager.ready().then((isReady) => { + if (isReady) { + registerCopilotContextProviders(context); + } + }); } // this method is called when your extension is deactivated From 698593c0df26ef27cf9bc6457868b8e2174a8712 Mon Sep 17 00:00:00 2001 From: wenyt <75360946+wenytang-ms@users.noreply.github.com> Date: Mon, 17 Nov 2025 10:53:35 +0800 Subject: [PATCH 254/352] fix: leverage jdtutils to get project correct (#940) * fix: leverage jdtutils to get project filepath * fix: update in project resolver * fix: update * fix: update --- .../jdtls/ext/core/ProjectCommand.java | 64 +++++++------------ .../ext/core/parser/ContextResolver.java | 48 ++++++++------ .../ext/core/parser/ProjectResolver.java | 58 ++++------------- 3 files changed, 65 insertions(+), 105 deletions(-) diff --git a/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/ProjectCommand.java b/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/ProjectCommand.java index 86a82282..9d0009fb 100644 --- a/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/ProjectCommand.java +++ b/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/ProjectCommand.java @@ -44,7 +44,6 @@ import org.eclipse.core.runtime.MultiStatus; import org.eclipse.core.runtime.OperationCanceledException; import org.eclipse.core.runtime.Path; -import org.eclipse.jdt.core.IJavaElement; import org.eclipse.jdt.core.IJavaProject; import org.eclipse.jdt.core.IMethod; import org.eclipse.jdt.core.IModuleDescription; @@ -58,6 +57,7 @@ import org.eclipse.jdt.core.search.SearchPattern; import org.eclipse.jdt.core.search.SearchRequestor; import org.eclipse.jdt.launching.JavaRuntime; +import org.eclipse.jdt.ls.core.internal.JDTUtils; import org.eclipse.jdt.ls.core.internal.JavaLanguageServerPlugin; import org.eclipse.jdt.ls.core.internal.ProjectUtils; import org.eclipse.jdt.ls.core.internal.ResourceUtils; @@ -155,7 +155,7 @@ public String getMessage() { * Error context information for operations */ public static class ErrorContext { - public final String errorValue; // The value that caused the error (e.g., invalid URI, null parsedPath, etc.) + public final String errorValue; // The value that caused the error (e.g., invalid URI, null parsedPath, etc.) public ErrorContext(String errorValue) { this.errorValue = errorValue; @@ -491,7 +491,7 @@ public static ImportClassContentResult getImportClassContent(List argume // Record start time for timeout control long startTime = System.currentTimeMillis(); final long TIMEOUT_MS = 80; // 80ms timeout - + if (arguments == null || arguments.isEmpty()) { return new ImportClassContentResult(ImportClassContentErrorReason.NULL_ARGUMENTS); } @@ -501,43 +501,24 @@ public static ImportClassContentResult getImportClassContent(List argume if (fileUri == null || fileUri.trim().isEmpty()) { return new ImportClassContentResult(ImportClassContentErrorReason.INVALID_URI, fileUri); } - // Parse URI manually to avoid restricted API - java.net.URI uri = new java.net.URI(fileUri); - String filePath = uri.getPath(); - if (filePath == null) { - return new ImportClassContentResult(ImportClassContentErrorReason.URI_PARSE_FAILED, filePath); - } - IPath path = new Path(filePath); + // Directly resolve compilation unit from URI using JDTUtils + java.net.URI uri = JDTUtils.toURI(fileUri); + org.eclipse.jdt.core.ICompilationUnit compilationUnit = JDTUtils.resolveCompilationUnit(uri); - // Get the file resource - IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot(); - IFile file = root.getFileForLocation(path); - if (file == null || !file.exists()) { - return new ImportClassContentResult(ImportClassContentErrorReason.FILE_NOT_FOUND, filePath); - } - if (!file.exists()) { - return new ImportClassContentResult(ImportClassContentErrorReason.FILE_NOT_EXISTS, filePath); + if (compilationUnit == null || !compilationUnit.exists()) { + return new ImportClassContentResult(ImportClassContentErrorReason.FILE_NOT_FOUND, fileUri); } - // Get the Java project - IJavaProject javaProject = JavaCore.create(file.getProject()); - if (javaProject == null) { - return new ImportClassContentResult(ImportClassContentErrorReason.NOT_JAVA_PROJECT, filePath); - } - if (!javaProject.exists()) { - String projectName = javaProject.getProject().getName(); + // Get the Java project from the compilation unit + IJavaProject javaProject = compilationUnit.getJavaProject(); + if (javaProject == null || !javaProject.exists()) { + String projectName = javaProject != null && javaProject.getProject() != null + ? javaProject.getProject().getName() + : "unknown"; return new ImportClassContentResult(ImportClassContentErrorReason.PROJECT_NOT_EXISTS, projectName); } - // Find the compilation unit - IJavaElement javaElement = JavaCore.create(file); - if (!(javaElement instanceof org.eclipse.jdt.core.ICompilationUnit)) { - return new ImportClassContentResult(ImportClassContentErrorReason.NOT_COMPILATION_UNIT, filePath); - } - - org.eclipse.jdt.core.ICompilationUnit compilationUnit = (org.eclipse.jdt.core.ICompilationUnit) javaElement; - // Parse imports and resolve local project files List classInfoList = new ArrayList<>(); @@ -580,15 +561,16 @@ public static ImportClassContentResult getImportClassContent(List argume // Check if we have exceeded the timeout before starting external resolution long currentTime = System.currentTimeMillis(); long elapsedTime = currentTime - startTime; - + if (elapsedTime >= TIMEOUT_MS) { // Return early due to timeout, but still return what we have collected so far if (classInfoList.isEmpty()) { - return new ImportClassContentResult(ImportClassContentErrorReason.TIME_LIMIT_EXCEEDED, String.valueOf(elapsedTime) + "ms"); + return new ImportClassContentResult(ImportClassContentErrorReason.TIME_LIMIT_EXCEEDED, + String.valueOf(elapsedTime) + "ms"); } return new ImportClassContentResult(classInfoList); } - + List externalClasses = new ArrayList<>(); for (org.eclipse.jdt.core.IImportDeclaration importDecl : imports) { @@ -596,12 +578,13 @@ public static ImportClassContentResult getImportClassContent(List argume if (monitor.isCanceled()) { break; } - + // Check timeout before each external resolution currentTime = System.currentTimeMillis(); elapsedTime = currentTime - startTime; if (elapsedTime >= TIMEOUT_MS) { - // Timeout reached, stop processing external dependencies but keep existing results + // Timeout reached, stop processing external dependencies but keep existing + // results break; } @@ -673,8 +656,9 @@ private static String getSeverityString(int severity) { * Get project dependencies information including JDK version. * * @param arguments List containing the file URI as the first element - * @param monitor Progress monitor for cancellation support - * @return List of DependencyInfo containing key-value pairs of project information + * @param monitor Progress monitor for cancellation support + * @return List of DependencyInfo containing key-value pairs of project + * information */ public static ProjectDependenciesResult getProjectDependencies(List arguments, IProgressMonitor monitor) { diff --git a/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/parser/ContextResolver.java b/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/parser/ContextResolver.java index ab063ef0..4adcef08 100644 --- a/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/parser/ContextResolver.java +++ b/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/parser/ContextResolver.java @@ -23,6 +23,7 @@ import org.eclipse.jdt.core.IPackageFragmentRoot; import org.eclipse.jdt.core.IJavaProject; import org.eclipse.jdt.core.JavaModelException; +import org.eclipse.jdt.ls.core.internal.JDTUtils; import com.microsoft.jdtls.ext.core.JdtlsExtActivator; @@ -184,15 +185,19 @@ public static void resolveSingleType(IJavaProject javaProject, String typeName, if (packageFragment != null && packageFragment.exists()) { // Look for compilation unit with matching name org.eclipse.jdt.core.ICompilationUnit cu = packageFragment.getCompilationUnit(simpleName + ".java"); - if (cu != null && cu.exists() && cu.getResource() != null && cu.getResource().exists()) { - // Get primary type from compilation unit - org.eclipse.jdt.core.IType primaryType = cu.findPrimaryType(); - if (primaryType != null && primaryType.exists() && - typeName.equals(primaryType.getFullyQualifiedName())) { - // Found local project source type via fallback method - processedTypes.add(typeName); - extractTypeInfo(primaryType, classInfoList, monitor); - return; + if (cu != null && cu.exists()) { + // Use JDTUtils to check if the compilation unit is accessible + String cuUri = JDTUtils.toUri(cu); + if (cuUri != null) { + // Get primary type from compilation unit + org.eclipse.jdt.core.IType primaryType = cu.findPrimaryType(); + if (primaryType != null && primaryType.exists() && + typeName.equals(primaryType.getFullyQualifiedName())) { + // Found local project source type via fallback method + processedTypes.add(typeName); + extractTypeInfo(primaryType, classInfoList, monitor); + return; + } } // Also check for inner types in the compilation unit @@ -685,18 +690,19 @@ public static String getTypeUri(org.eclipse.jdt.core.IType type) { // Get the compilation unit that contains this type org.eclipse.jdt.core.ICompilationUnit compilationUnit = type.getCompilationUnit(); if (compilationUnit != null) { - // Get the underlying resource (file) - org.eclipse.core.resources.IResource resource = compilationUnit.getUnderlyingResource(); - if (resource != null && resource instanceof org.eclipse.core.resources.IFile) { - org.eclipse.core.resources.IFile file = (org.eclipse.core.resources.IFile) resource; - // Get the file location as a file URI - java.net.URI fileUri = file.getLocationURI(); - if (fileUri != null) { - return fileUri.toString(); - } - - // Fallback: use workspace-relative path as URI - return file.getFullPath().toString(); + // Use JDTUtils to get URI (consistent with other parts of the codebase) + String uri = JDTUtils.toUri(compilationUnit); + if (uri != null) { + return uri; + } + } + + // For class files (binary types), try to get URI from class file + org.eclipse.jdt.core.IClassFile classFile = type.getClassFile(); + if (classFile != null) { + String uri = JDTUtils.toUri(classFile); + if (uri != null) { + return uri; } } diff --git a/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/parser/ProjectResolver.java b/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/parser/ProjectResolver.java index b41aaa6c..f00c7b39 100644 --- a/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/parser/ProjectResolver.java +++ b/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/parser/ProjectResolver.java @@ -11,7 +11,6 @@ import org.eclipse.core.resources.IResourceChangeListener; import org.eclipse.core.resources.IResourceDelta; import org.eclipse.core.resources.IResourceDeltaVisitor; -import org.eclipse.core.resources.IWorkspaceRoot; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IPath; @@ -25,7 +24,7 @@ import org.eclipse.jdt.core.JavaCore; import org.eclipse.jdt.core.JavaModelException; import org.eclipse.jdt.launching.JavaRuntime; -import org.eclipse.jdt.ls.core.internal.ResourceUtils; +import org.eclipse.jdt.ls.core.internal.JDTUtils; import com.microsoft.jdtls.ext.core.JdtlsExtActivator; @@ -171,10 +170,9 @@ private static void invalidateCache(IProject project) { return; } - String projectPath = project.getLocation() != null ? - project.getLocation().toOSString() : project.getName(); + String projectUri = JDTUtils.getFileURI(project); - if (dependencyCache.remove(projectPath) != null) { + if (dependencyCache.remove(projectUri) != null) { JdtlsExtActivator.logInfo("Cache invalidated for project: " + project.getName()); } } @@ -214,7 +212,6 @@ private static long calculateClasspathHash(IJavaProject javaProject) { private static final String KEY_MODULE_NAME = "moduleName"; private static final String KEY_TOTAL_LIBRARIES = "totalLibraries"; private static final String KEY_TOTAL_PROJECT_REFS = "totalProjectReferences"; - private static final String KEY_JRE_CONTAINER_PATH = "jreContainerPath"; private static final String KEY_JRE_CONTAINER = "jreContainer"; public static class DependencyInfo { @@ -242,12 +239,16 @@ public static List resolveProjectDependencies(String fileUri, IP List result = new ArrayList<>(); try { - IPath fileIPath = ResourceUtils.canonicalFilePathFromURI(fileUri); + // Use JDTUtils to convert URI and find the resource + java.net.URI uri = JDTUtils.toURI(fileUri); + IResource resource = JDTUtils.findResource(uri, + ResourcesPlugin.getWorkspace().getRoot()::findFilesForLocationURI); - // Find the project - IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot(); - IProject project = findProjectByPath(root, fileIPath); + if (resource == null) { + return result; + } + IProject project = resource.getProject(); if (project == null || !project.isAccessible()) { return result; } @@ -258,8 +259,8 @@ public static List resolveProjectDependencies(String fileUri, IP return result; } - // Generate cache key based on project location - String cacheKey = project.getLocation().toOSString(); + // Generate cache key based on project URI + String cacheKey = JDTUtils.getFileURI(project); // Calculate current classpath hash for validation long currentClasspathHash = calculateClasspathHash(javaProject); @@ -290,44 +291,13 @@ public static List resolveProjectDependencies(String fileUri, IP return result; } - /** - * Find project by path from all projects in workspace. - * The path can be either a project root path or a file/folder path within a project. - * This method will find the project that contains the given path. - * - * @param root The workspace root - * @param filePath The path to search for (can be project root or file within project) - * @return The project that contains the path, or null if not found - */ - private static IProject findProjectByPath(IWorkspaceRoot root, IPath filePath) { - IProject[] allProjects = root.getProjects(); - - // First pass: check for exact project location match (most efficient) - for (IProject p : allProjects) { - if (p.getLocation() != null && p.getLocation().equals(filePath)) { - return p; - } - } - - // Second pass: check if the file path is within any project directory - // This handles cases where filePath points to a file or folder inside a project - for (IProject p : allProjects) { - if (p.getLocation() != null && p.getLocation().isPrefixOf(filePath)) { - return p; - } - } - - return null; - } - /** * Add basic project information including name, location, and Java version settings. */ private static void addBasicProjectInfo(List result, IProject project, IJavaProject javaProject) { result.add(new DependencyInfo(KEY_PROJECT_NAME, project.getName())); - addIfNotNull(result, KEY_PROJECT_LOCATION, - project.getLocation() != null ? project.getLocation().toOSString() : null); + addIfNotNull(result, KEY_PROJECT_LOCATION, JDTUtils.getFileURI(project)); addIfNotNull(result, KEY_JAVA_VERSION, javaProject.getOption(JavaCore.COMPILER_COMPLIANCE, true)); From b25f999d2bf04814a35800788d8f2b74b463338f Mon Sep 17 00:00:00 2001 From: wenyt <75360946+wenytang-ms@users.noreply.github.com> Date: Mon, 17 Nov 2025 15:42:42 +0800 Subject: [PATCH 255/352] fix: use jdtutils to parse uri (#941) * fix: use jdtutils to parse uri * fix: fix copilot comments * fix: update * fix: update --- .../com/microsoft/jdtls/ext/core/ProjectCommand.java | 12 +++++------- .../jdtls/ext/core/parser/ContextResolver.java | 2 +- 2 files changed, 6 insertions(+), 8 deletions(-) diff --git a/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/ProjectCommand.java b/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/ProjectCommand.java index 9d0009fb..75c8b4b5 100644 --- a/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/ProjectCommand.java +++ b/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/ProjectCommand.java @@ -672,15 +672,13 @@ public static ProjectDependenciesResult getProjectDependencies(List argu return new ProjectDependenciesResult(ProjectDependenciesErrorReason.INVALID_URI, fileUri); } - // Validate URI format - String parsedPath = null; + // Validate URI format using JDTUtils try { - java.net.URI uri = new java.net.URI(fileUri); - parsedPath = uri.getPath(); - if (parsedPath == null) { - return new ProjectDependenciesResult(ProjectDependenciesErrorReason.URI_PARSE_FAILED, parsedPath); + java.net.URI uri = JDTUtils.toURI(fileUri); + if (uri == null) { + return new ProjectDependenciesResult(ProjectDependenciesErrorReason.URI_PARSE_FAILED, fileUri); } - } catch (java.net.URISyntaxException e) { + } catch (Exception e) { return new ProjectDependenciesResult(ProjectDependenciesErrorReason.MALFORMED_URI, fileUri); } diff --git a/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/parser/ContextResolver.java b/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/parser/ContextResolver.java index 4adcef08..77c04010 100644 --- a/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/parser/ContextResolver.java +++ b/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/parser/ContextResolver.java @@ -1,4 +1,4 @@ -/******************************************************************************* +/******************************************************************************* * Copyright (c) 2018 Microsoft Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 From 97b92307adf41e54fd14f93f170bf45235a1ae3d Mon Sep 17 00:00:00 2001 From: wenyt <75360946+wenytang-ms@users.noreply.github.com> Date: Tue, 18 Nov 2025 14:36:03 +0800 Subject: [PATCH 256/352] docs: release 0.26.5 (#943) --- CHANGELOG.md | 5 +++++ package-lock.json | 2 +- package.json | 2 +- 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 64135b05..5e847858 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,11 @@ All notable changes to the "vscode-java-dependency" extension will be documented The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/) and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html). +## 0.26.5 + +- Enhancement - Register Context Provider after Java LS ready in https://github.com/microsoft/vscode-java-dependency/pull/939 +- Fix - Fix uri parse and file parse in https://github.com/microsoft/vscode-java-dependency/pull/940 + ## 0.26.4 - Fix - Update wording for Java 21 in https://github.com/microsoft/vscode-java-dependency/pull/930 diff --git a/package-lock.json b/package-lock.json index e1551677..052d3eb4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "vscode-java-dependency", - "version": "0.26.4", + "version": "0.26.5", "lockfileVersion": 2, "requires": true, "packages": { diff --git a/package.json b/package.json index f586baf8..566496fe 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "vscode-java-dependency", "displayName": "Project Manager for Java", "description": "%description%", - "version": "0.26.4", + "version": "0.26.5", "publisher": "vscjava", "preview": false, "aiKey": "5c642b22-e845-4400-badb-3f8509a70777", From d2e7fdc99832c52dd12e8f0a5dbfe544002ad8bc Mon Sep 17 00:00:00 2001 From: wenyt <75360946+wenytang-ms@users.noreply.github.com> Date: Tue, 18 Nov 2025 15:06:12 +0800 Subject: [PATCH 257/352] ci: bump up telemetry deps version (#945) --- package-lock.json | 240 ++++++++++++++++++++++++---------------------- package.json | 2 +- 2 files changed, 127 insertions(+), 115 deletions(-) diff --git a/package-lock.json b/package-lock.json index 052d3eb4..8617f52a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -6,7 +6,7 @@ "packages": { "": { "name": "vscode-java-dependency", - "version": "0.26.4", + "version": "0.26.5", "license": "MIT", "dependencies": { "@github/copilot-language-server": "^1.388.0", @@ -17,7 +17,7 @@ "lodash": "^4.17.21", "minimatch": "^5.1.6", "semver": "^7.3.8", - "vscode-extension-telemetry-wrapper": "^0.14.0", + "vscode-extension-telemetry-wrapper": "^0.15.0", "vscode-tas-client": "^0.1.75" }, "devDependencies": { @@ -398,118 +398,128 @@ } }, "node_modules/@microsoft/1ds-core-js": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@microsoft/1ds-core-js/-/1ds-core-js-4.2.2.tgz", - "integrity": "sha512-4c1AXzOj7ZyX7/97v8fEDYcQ8ymTTmj+j9HYYlcO0/cUbDzZGA7/xzb34chvvAbV60qDEbX0Ha/ea7wzgefORg==", + "version": "4.3.10", + "resolved": "https://registry.npmjs.org/@microsoft/1ds-core-js/-/1ds-core-js-4.3.10.tgz", + "integrity": "sha512-5fSZmkGwWkH+mrIA5M1GYPZdPM+SjXwCCl2Am7VhFoVwOBJNhRnwvIpAdzw6sFjiebN/rz+/YH0NdxztGZSa9Q==", + "license": "MIT", "dependencies": { - "@microsoft/applicationinsights-core-js": "3.2.2", + "@microsoft/applicationinsights-core-js": "3.3.10", "@microsoft/applicationinsights-shims": "3.0.1", "@microsoft/dynamicproto-js": "^2.0.3", - "@nevware21/ts-async": ">= 0.5.1 < 2.x", - "@nevware21/ts-utils": ">= 0.11.1 < 2.x" + "@nevware21/ts-async": ">= 0.5.4 < 2.x", + "@nevware21/ts-utils": ">= 0.11.8 < 2.x" } }, "node_modules/@microsoft/1ds-post-js": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@microsoft/1ds-post-js/-/1ds-post-js-4.2.2.tgz", - "integrity": "sha512-0k1aSxD03r3ugLaYhI8Y8AonI/whOzSQd66XBYURVTs6uheMMxDQdSnAk/4Dwn/TUK3TCEJZBIwZRVpUJtJX9w==", + "version": "4.3.10", + "resolved": "https://registry.npmjs.org/@microsoft/1ds-post-js/-/1ds-post-js-4.3.10.tgz", + "integrity": "sha512-VSLjc9cT+Y+eTiSfYltJHJCejn8oYr0E6Pq2BMhOEO7F6IyLGYIxzKKvo78ze9x+iHX7KPTATcZ+PFgjGXuNqg==", + "license": "MIT", "dependencies": { - "@microsoft/1ds-core-js": "4.2.2", + "@microsoft/1ds-core-js": "4.3.10", "@microsoft/applicationinsights-shims": "3.0.1", "@microsoft/dynamicproto-js": "^2.0.3", - "@nevware21/ts-async": ">= 0.5.1 < 2.x", - "@nevware21/ts-utils": ">= 0.11.1 < 2.x" + "@nevware21/ts-async": ">= 0.5.4 < 2.x", + "@nevware21/ts-utils": ">= 0.11.8 < 2.x" } }, "node_modules/@microsoft/applicationinsights-channel-js": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/@microsoft/applicationinsights-channel-js/-/applicationinsights-channel-js-3.2.2.tgz", - "integrity": "sha512-4ruoKxgZYYa+K8JJu8RMY0egKazS8xClbx70NQHa/rJ7JYFgN3OIEIBZtFoMcHR8Vg7MEsNE5/wV6o7WWJkVIA==", + "version": "3.3.10", + "resolved": "https://registry.npmjs.org/@microsoft/applicationinsights-channel-js/-/applicationinsights-channel-js-3.3.10.tgz", + "integrity": "sha512-iolFLz1ocWAzIQqHIEjjov3gNTPkgFQ4ArHnBcJEYoffOGWlJt6copaevS5YPI5rHzmbySsengZ8cLJJBBrXzQ==", + "license": "MIT", "dependencies": { - "@microsoft/applicationinsights-common": "3.2.2", - "@microsoft/applicationinsights-core-js": "3.2.2", + "@microsoft/applicationinsights-common": "3.3.10", + "@microsoft/applicationinsights-core-js": "3.3.10", "@microsoft/applicationinsights-shims": "3.0.1", "@microsoft/dynamicproto-js": "^2.0.3", - "@nevware21/ts-async": ">= 0.5.1 < 2.x", - "@nevware21/ts-utils": ">= 0.11.1 < 2.x" + "@nevware21/ts-async": ">= 0.5.4 < 2.x", + "@nevware21/ts-utils": ">= 0.11.8 < 2.x" }, "peerDependencies": { - "tslib": "*" + "tslib": ">= 1.0.0" } }, "node_modules/@microsoft/applicationinsights-common": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/@microsoft/applicationinsights-common/-/applicationinsights-common-3.2.2.tgz", - "integrity": "sha512-e1C35gdkFSzWyUUR1S8FvisXW3nT3p6wWsLNs+vUKLOTQzsvW3XpNMVtNCq4MfHWiYDuz1lPSzo2eENaij1fVA==", + "version": "3.3.10", + "resolved": "https://registry.npmjs.org/@microsoft/applicationinsights-common/-/applicationinsights-common-3.3.10.tgz", + "integrity": "sha512-RVIenPIvNgZCbjJdALvLM4rNHgAFuHI7faFzHCgnI6S2WCUNGHeXlQTs9EUUrL+n2TPp9/cd0KKMILU5VVyYiA==", + "license": "MIT", "dependencies": { - "@microsoft/applicationinsights-core-js": "3.2.2", + "@microsoft/applicationinsights-core-js": "3.3.10", "@microsoft/applicationinsights-shims": "3.0.1", "@microsoft/dynamicproto-js": "^2.0.3", - "@nevware21/ts-utils": ">= 0.11.1 < 2.x" + "@nevware21/ts-utils": ">= 0.11.8 < 2.x" }, "peerDependencies": { - "tslib": "*" + "tslib": ">= 1.0.0" } }, "node_modules/@microsoft/applicationinsights-core-js": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/@microsoft/applicationinsights-core-js/-/applicationinsights-core-js-3.2.2.tgz", - "integrity": "sha512-dF6LZ4ahdhoHufw+N7OXRDzWT8QN193Dvpd8GLqEZdR/KtCTofPSI63yumu+ZkzKYadf1S3w2xg0OmbdyXexoQ==", + "version": "3.3.10", + "resolved": "https://registry.npmjs.org/@microsoft/applicationinsights-core-js/-/applicationinsights-core-js-3.3.10.tgz", + "integrity": "sha512-5yKeyassZTq2l+SAO4npu6LPnbS++UD+M+Ghjm9uRzoBwD8tumFx0/F8AkSVqbniSREd+ztH/2q2foewa2RZyg==", + "license": "MIT", "dependencies": { "@microsoft/applicationinsights-shims": "3.0.1", "@microsoft/dynamicproto-js": "^2.0.3", - "@nevware21/ts-async": ">= 0.5.1 < 2.x", - "@nevware21/ts-utils": ">= 0.11.1 < 2.x" + "@nevware21/ts-async": ">= 0.5.4 < 2.x", + "@nevware21/ts-utils": ">= 0.11.8 < 2.x" }, "peerDependencies": { - "tslib": "*" + "tslib": ">= 1.0.0" } }, "node_modules/@microsoft/applicationinsights-shims": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/@microsoft/applicationinsights-shims/-/applicationinsights-shims-3.0.1.tgz", "integrity": "sha512-DKwboF47H1nb33rSUfjqI6ryX29v+2QWcTrRvcQDA32AZr5Ilkr7whOOSsD1aBzwqX0RJEIP1Z81jfE3NBm/Lg==", + "license": "MIT", "dependencies": { "@nevware21/ts-utils": ">= 0.9.4 < 2.x" } }, "node_modules/@microsoft/applicationinsights-web-basic": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/@microsoft/applicationinsights-web-basic/-/applicationinsights-web-basic-3.2.2.tgz", - "integrity": "sha512-4OdgTurRr/Awm2DcWuAhidFON2UFiirabeO9SSAeTefDCdtzv5fWzntq9zvdV47c+w6WzZkz8nX/bQTgNRb2+w==", + "version": "3.3.10", + "resolved": "https://registry.npmjs.org/@microsoft/applicationinsights-web-basic/-/applicationinsights-web-basic-3.3.10.tgz", + "integrity": "sha512-AZib5DAT3NU0VT0nLWEwXrnoMDDgZ/5S4dso01CNU5ELNxLdg+1fvchstlVdMy4FrAnxzs8Wf/GIQNFYOVgpAw==", + "license": "MIT", "dependencies": { - "@microsoft/applicationinsights-channel-js": "3.2.2", - "@microsoft/applicationinsights-common": "3.2.2", - "@microsoft/applicationinsights-core-js": "3.2.2", + "@microsoft/applicationinsights-channel-js": "3.3.10", + "@microsoft/applicationinsights-common": "3.3.10", + "@microsoft/applicationinsights-core-js": "3.3.10", "@microsoft/applicationinsights-shims": "3.0.1", "@microsoft/dynamicproto-js": "^2.0.3", - "@nevware21/ts-async": ">= 0.5.1 < 2.x", - "@nevware21/ts-utils": ">= 0.11.1 < 2.x" + "@nevware21/ts-async": ">= 0.5.4 < 2.x", + "@nevware21/ts-utils": ">= 0.11.8 < 2.x" }, "peerDependencies": { - "tslib": "*" + "tslib": ">= 1.0.0" } }, "node_modules/@microsoft/dynamicproto-js": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/@microsoft/dynamicproto-js/-/dynamicproto-js-2.0.3.tgz", "integrity": "sha512-JTWTU80rMy3mdxOjjpaiDQsTLZ6YSGGqsjURsY6AUQtIj0udlF/jYmhdLZu8693ZIC0T1IwYnFa0+QeiMnziBA==", + "license": "MIT", "dependencies": { "@nevware21/ts-utils": ">= 0.10.4 < 2.x" } }, "node_modules/@nevware21/ts-async": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/@nevware21/ts-async/-/ts-async-0.5.1.tgz", - "integrity": "sha512-O2kN8n2HpDWJ7Oji+oTMnhITrCndmrNvrHbGDwAIBydx+FWvLE/vrw4QwnRRMvSCa2AJrcP59Ryklxv30KfkWQ==", + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/@nevware21/ts-async/-/ts-async-0.5.4.tgz", + "integrity": "sha512-IBTyj29GwGlxfzXw2NPnzty+w0Adx61Eze1/lknH/XIVdxtF9UnOpk76tnrHXWa6j84a1RR9hsOcHQPFv9qJjA==", + "license": "MIT", "dependencies": { - "@nevware21/ts-utils": ">= 0.11.2 < 2.x" + "@nevware21/ts-utils": ">= 0.11.6 < 2.x" } }, "node_modules/@nevware21/ts-utils": { - "version": "0.11.2", - "resolved": "https://registry.npmjs.org/@nevware21/ts-utils/-/ts-utils-0.11.2.tgz", - "integrity": "sha512-80W8BkS09kkGuUHJX50Fqq+QqAslxUaOQytH+3JhRacXs1EpEt2JOOkYKytqFZAYir3SeH9fahniEaDzIBxlUw==" + "version": "0.12.5", + "resolved": "https://registry.npmjs.org/@nevware21/ts-utils/-/ts-utils-0.12.5.tgz", + "integrity": "sha512-JPQZWPKQJjj7kAftdEZL0XDFfbMgXCGiUAZe0d7EhLC3QlXTlZdSckGqqRIQ2QNl0VTEZyZUvRBw6Ednw089Fw==", + "license": "MIT" }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", @@ -678,13 +688,14 @@ "dev": true }, "node_modules/@vscode/extension-telemetry": { - "version": "0.9.6", - "resolved": "https://registry.npmjs.org/@vscode/extension-telemetry/-/extension-telemetry-0.9.6.tgz", - "integrity": "sha512-qWK2GNw+b69QRYpjuNM9g3JKToMICoNIdc0rQMtvb4gIG9vKKCZCVCz+ZOx6XM/YlfWAyuPiyxcjIY0xyF+Djg==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@vscode/extension-telemetry/-/extension-telemetry-1.2.0.tgz", + "integrity": "sha512-En6dTwfy5NFzSMibvOpx/lKq2jtgWuR4++KJbi3SpQ2iT8gm+PHo9868/scocW122KDwTxl4ruxZ7i4rHmJJnQ==", + "license": "MIT", "dependencies": { - "@microsoft/1ds-core-js": "^4.1.2", - "@microsoft/1ds-post-js": "^4.1.2", - "@microsoft/applicationinsights-web-basic": "^3.1.2" + "@microsoft/1ds-core-js": "^4.3.10", + "@microsoft/1ds-post-js": "^4.3.10", + "@microsoft/applicationinsights-web-basic": "^3.3.10" }, "engines": { "vscode": "^1.75.0" @@ -5712,11 +5723,12 @@ } }, "node_modules/vscode-extension-telemetry-wrapper": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/vscode-extension-telemetry-wrapper/-/vscode-extension-telemetry-wrapper-0.14.0.tgz", - "integrity": "sha512-EYr1hqiYVSGfupchDN405zSwuvA8V3tJ62KcLIRDr/4ongOc2AvSZ0BlRq8a0w950tadsMlXTKEheB97fZBttg==", + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/vscode-extension-telemetry-wrapper/-/vscode-extension-telemetry-wrapper-0.15.0.tgz", + "integrity": "sha512-Uioj6zqmaHBOyRsryazdvgc8mZdRRUJSCL+Z68jG9QoZ5cwHlcaodou0BwqfTjfpwA+hUSseXRrSHrzGkXpGcQ==", + "license": "MIT", "dependencies": { - "@vscode/extension-telemetry": "^0.9.6", + "@vscode/extension-telemetry": "^1.2.0", "uuid": "^8.3.2" } }, @@ -6500,62 +6512,62 @@ } }, "@microsoft/1ds-core-js": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@microsoft/1ds-core-js/-/1ds-core-js-4.2.2.tgz", - "integrity": "sha512-4c1AXzOj7ZyX7/97v8fEDYcQ8ymTTmj+j9HYYlcO0/cUbDzZGA7/xzb34chvvAbV60qDEbX0Ha/ea7wzgefORg==", + "version": "4.3.10", + "resolved": "https://registry.npmjs.org/@microsoft/1ds-core-js/-/1ds-core-js-4.3.10.tgz", + "integrity": "sha512-5fSZmkGwWkH+mrIA5M1GYPZdPM+SjXwCCl2Am7VhFoVwOBJNhRnwvIpAdzw6sFjiebN/rz+/YH0NdxztGZSa9Q==", "requires": { - "@microsoft/applicationinsights-core-js": "3.2.2", + "@microsoft/applicationinsights-core-js": "3.3.10", "@microsoft/applicationinsights-shims": "3.0.1", "@microsoft/dynamicproto-js": "^2.0.3", - "@nevware21/ts-async": ">= 0.5.1 < 2.x", - "@nevware21/ts-utils": ">= 0.11.1 < 2.x" + "@nevware21/ts-async": ">= 0.5.4 < 2.x", + "@nevware21/ts-utils": ">= 0.11.8 < 2.x" } }, "@microsoft/1ds-post-js": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@microsoft/1ds-post-js/-/1ds-post-js-4.2.2.tgz", - "integrity": "sha512-0k1aSxD03r3ugLaYhI8Y8AonI/whOzSQd66XBYURVTs6uheMMxDQdSnAk/4Dwn/TUK3TCEJZBIwZRVpUJtJX9w==", + "version": "4.3.10", + "resolved": "https://registry.npmjs.org/@microsoft/1ds-post-js/-/1ds-post-js-4.3.10.tgz", + "integrity": "sha512-VSLjc9cT+Y+eTiSfYltJHJCejn8oYr0E6Pq2BMhOEO7F6IyLGYIxzKKvo78ze9x+iHX7KPTATcZ+PFgjGXuNqg==", "requires": { - "@microsoft/1ds-core-js": "4.2.2", + "@microsoft/1ds-core-js": "4.3.10", "@microsoft/applicationinsights-shims": "3.0.1", "@microsoft/dynamicproto-js": "^2.0.3", - "@nevware21/ts-async": ">= 0.5.1 < 2.x", - "@nevware21/ts-utils": ">= 0.11.1 < 2.x" + "@nevware21/ts-async": ">= 0.5.4 < 2.x", + "@nevware21/ts-utils": ">= 0.11.8 < 2.x" } }, "@microsoft/applicationinsights-channel-js": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/@microsoft/applicationinsights-channel-js/-/applicationinsights-channel-js-3.2.2.tgz", - "integrity": "sha512-4ruoKxgZYYa+K8JJu8RMY0egKazS8xClbx70NQHa/rJ7JYFgN3OIEIBZtFoMcHR8Vg7MEsNE5/wV6o7WWJkVIA==", + "version": "3.3.10", + "resolved": "https://registry.npmjs.org/@microsoft/applicationinsights-channel-js/-/applicationinsights-channel-js-3.3.10.tgz", + "integrity": "sha512-iolFLz1ocWAzIQqHIEjjov3gNTPkgFQ4ArHnBcJEYoffOGWlJt6copaevS5YPI5rHzmbySsengZ8cLJJBBrXzQ==", "requires": { - "@microsoft/applicationinsights-common": "3.2.2", - "@microsoft/applicationinsights-core-js": "3.2.2", + "@microsoft/applicationinsights-common": "3.3.10", + "@microsoft/applicationinsights-core-js": "3.3.10", "@microsoft/applicationinsights-shims": "3.0.1", "@microsoft/dynamicproto-js": "^2.0.3", - "@nevware21/ts-async": ">= 0.5.1 < 2.x", - "@nevware21/ts-utils": ">= 0.11.1 < 2.x" + "@nevware21/ts-async": ">= 0.5.4 < 2.x", + "@nevware21/ts-utils": ">= 0.11.8 < 2.x" } }, "@microsoft/applicationinsights-common": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/@microsoft/applicationinsights-common/-/applicationinsights-common-3.2.2.tgz", - "integrity": "sha512-e1C35gdkFSzWyUUR1S8FvisXW3nT3p6wWsLNs+vUKLOTQzsvW3XpNMVtNCq4MfHWiYDuz1lPSzo2eENaij1fVA==", + "version": "3.3.10", + "resolved": "https://registry.npmjs.org/@microsoft/applicationinsights-common/-/applicationinsights-common-3.3.10.tgz", + "integrity": "sha512-RVIenPIvNgZCbjJdALvLM4rNHgAFuHI7faFzHCgnI6S2WCUNGHeXlQTs9EUUrL+n2TPp9/cd0KKMILU5VVyYiA==", "requires": { - "@microsoft/applicationinsights-core-js": "3.2.2", + "@microsoft/applicationinsights-core-js": "3.3.10", "@microsoft/applicationinsights-shims": "3.0.1", "@microsoft/dynamicproto-js": "^2.0.3", - "@nevware21/ts-utils": ">= 0.11.1 < 2.x" + "@nevware21/ts-utils": ">= 0.11.8 < 2.x" } }, "@microsoft/applicationinsights-core-js": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/@microsoft/applicationinsights-core-js/-/applicationinsights-core-js-3.2.2.tgz", - "integrity": "sha512-dF6LZ4ahdhoHufw+N7OXRDzWT8QN193Dvpd8GLqEZdR/KtCTofPSI63yumu+ZkzKYadf1S3w2xg0OmbdyXexoQ==", + "version": "3.3.10", + "resolved": "https://registry.npmjs.org/@microsoft/applicationinsights-core-js/-/applicationinsights-core-js-3.3.10.tgz", + "integrity": "sha512-5yKeyassZTq2l+SAO4npu6LPnbS++UD+M+Ghjm9uRzoBwD8tumFx0/F8AkSVqbniSREd+ztH/2q2foewa2RZyg==", "requires": { "@microsoft/applicationinsights-shims": "3.0.1", "@microsoft/dynamicproto-js": "^2.0.3", - "@nevware21/ts-async": ">= 0.5.1 < 2.x", - "@nevware21/ts-utils": ">= 0.11.1 < 2.x" + "@nevware21/ts-async": ">= 0.5.4 < 2.x", + "@nevware21/ts-utils": ">= 0.11.8 < 2.x" } }, "@microsoft/applicationinsights-shims": { @@ -6567,17 +6579,17 @@ } }, "@microsoft/applicationinsights-web-basic": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/@microsoft/applicationinsights-web-basic/-/applicationinsights-web-basic-3.2.2.tgz", - "integrity": "sha512-4OdgTurRr/Awm2DcWuAhidFON2UFiirabeO9SSAeTefDCdtzv5fWzntq9zvdV47c+w6WzZkz8nX/bQTgNRb2+w==", + "version": "3.3.10", + "resolved": "https://registry.npmjs.org/@microsoft/applicationinsights-web-basic/-/applicationinsights-web-basic-3.3.10.tgz", + "integrity": "sha512-AZib5DAT3NU0VT0nLWEwXrnoMDDgZ/5S4dso01CNU5ELNxLdg+1fvchstlVdMy4FrAnxzs8Wf/GIQNFYOVgpAw==", "requires": { - "@microsoft/applicationinsights-channel-js": "3.2.2", - "@microsoft/applicationinsights-common": "3.2.2", - "@microsoft/applicationinsights-core-js": "3.2.2", + "@microsoft/applicationinsights-channel-js": "3.3.10", + "@microsoft/applicationinsights-common": "3.3.10", + "@microsoft/applicationinsights-core-js": "3.3.10", "@microsoft/applicationinsights-shims": "3.0.1", "@microsoft/dynamicproto-js": "^2.0.3", - "@nevware21/ts-async": ">= 0.5.1 < 2.x", - "@nevware21/ts-utils": ">= 0.11.1 < 2.x" + "@nevware21/ts-async": ">= 0.5.4 < 2.x", + "@nevware21/ts-utils": ">= 0.11.8 < 2.x" } }, "@microsoft/dynamicproto-js": { @@ -6589,17 +6601,17 @@ } }, "@nevware21/ts-async": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/@nevware21/ts-async/-/ts-async-0.5.1.tgz", - "integrity": "sha512-O2kN8n2HpDWJ7Oji+oTMnhITrCndmrNvrHbGDwAIBydx+FWvLE/vrw4QwnRRMvSCa2AJrcP59Ryklxv30KfkWQ==", + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/@nevware21/ts-async/-/ts-async-0.5.4.tgz", + "integrity": "sha512-IBTyj29GwGlxfzXw2NPnzty+w0Adx61Eze1/lknH/XIVdxtF9UnOpk76tnrHXWa6j84a1RR9hsOcHQPFv9qJjA==", "requires": { - "@nevware21/ts-utils": ">= 0.11.2 < 2.x" + "@nevware21/ts-utils": ">= 0.11.6 < 2.x" } }, "@nevware21/ts-utils": { - "version": "0.11.2", - "resolved": "https://registry.npmjs.org/@nevware21/ts-utils/-/ts-utils-0.11.2.tgz", - "integrity": "sha512-80W8BkS09kkGuUHJX50Fqq+QqAslxUaOQytH+3JhRacXs1EpEt2JOOkYKytqFZAYir3SeH9fahniEaDzIBxlUw==" + "version": "0.12.5", + "resolved": "https://registry.npmjs.org/@nevware21/ts-utils/-/ts-utils-0.12.5.tgz", + "integrity": "sha512-JPQZWPKQJjj7kAftdEZL0XDFfbMgXCGiUAZe0d7EhLC3QlXTlZdSckGqqRIQ2QNl0VTEZyZUvRBw6Ednw089Fw==" }, "@nodelib/fs.scandir": { "version": "2.1.5", @@ -6747,13 +6759,13 @@ "dev": true }, "@vscode/extension-telemetry": { - "version": "0.9.6", - "resolved": "https://registry.npmjs.org/@vscode/extension-telemetry/-/extension-telemetry-0.9.6.tgz", - "integrity": "sha512-qWK2GNw+b69QRYpjuNM9g3JKToMICoNIdc0rQMtvb4gIG9vKKCZCVCz+ZOx6XM/YlfWAyuPiyxcjIY0xyF+Djg==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@vscode/extension-telemetry/-/extension-telemetry-1.2.0.tgz", + "integrity": "sha512-En6dTwfy5NFzSMibvOpx/lKq2jtgWuR4++KJbi3SpQ2iT8gm+PHo9868/scocW122KDwTxl4ruxZ7i4rHmJJnQ==", "requires": { - "@microsoft/1ds-core-js": "^4.1.2", - "@microsoft/1ds-post-js": "^4.1.2", - "@microsoft/applicationinsights-web-basic": "^3.1.2" + "@microsoft/1ds-core-js": "^4.3.10", + "@microsoft/1ds-post-js": "^4.3.10", + "@microsoft/applicationinsights-web-basic": "^3.3.10" } }, "@vscode/test-electron": { @@ -10429,11 +10441,11 @@ "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==" }, "vscode-extension-telemetry-wrapper": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/vscode-extension-telemetry-wrapper/-/vscode-extension-telemetry-wrapper-0.14.0.tgz", - "integrity": "sha512-EYr1hqiYVSGfupchDN405zSwuvA8V3tJ62KcLIRDr/4ongOc2AvSZ0BlRq8a0w950tadsMlXTKEheB97fZBttg==", + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/vscode-extension-telemetry-wrapper/-/vscode-extension-telemetry-wrapper-0.15.0.tgz", + "integrity": "sha512-Uioj6zqmaHBOyRsryazdvgc8mZdRRUJSCL+Z68jG9QoZ5cwHlcaodou0BwqfTjfpwA+hUSseXRrSHrzGkXpGcQ==", "requires": { - "@vscode/extension-telemetry": "^0.9.6", + "@vscode/extension-telemetry": "^1.2.0", "uuid": "^8.3.2" } }, diff --git a/package.json b/package.json index 566496fe..d098d9d1 100644 --- a/package.json +++ b/package.json @@ -1118,7 +1118,7 @@ "lodash": "^4.17.21", "minimatch": "^5.1.6", "semver": "^7.3.8", - "vscode-extension-telemetry-wrapper": "^0.14.0", + "vscode-extension-telemetry-wrapper": "^0.15.0", "vscode-tas-client": "^0.1.75" } } \ No newline at end of file From 3dc88d95b4256773dae64256944a9aa82c76bfd5 Mon Sep 17 00:00:00 2001 From: Jinbo Wang Date: Fri, 5 Dec 2025 17:38:18 +0800 Subject: [PATCH 258/352] Add CODEOWNERS file (#949) --- .github/CODEOWNERS | 1 + 1 file changed, 1 insertion(+) create mode 100644 .github/CODEOWNERS diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS new file mode 100644 index 00000000..a6dfb950 --- /dev/null +++ b/.github/CODEOWNERS @@ -0,0 +1 @@ +* @testforstephen @wenytang-ms @chagong From 4980cf9f1f9b5b9f7eacc18373cb7ce1c3acc2d6 Mon Sep 17 00:00:00 2001 From: yezhu6 <92571997+yezhu6@users.noreply.github.com> Date: Wed, 10 Dec 2025 16:05:29 +0800 Subject: [PATCH 259/352] feat: add CVE checking in java upgrade promotion (#948) * add CVE checking * fix comments * update changelog and fix comments * Remove patched version from CVE issue && fix commets * Remove patchedVersion checking * Fix copilot comments * Add pagination for CVE fetch from github * Fix comments --------- Co-authored-by: Changyong Gong --- CHANGELOG.md | 4 + package.json | 1 + src/upgrade/assessmentManager.ts | 86 +++++---- src/upgrade/cve.ts | 192 +++++++++++++++++++++ src/upgrade/display/notificationManager.ts | 34 +++- src/upgrade/type.ts | 3 +- src/upgrade/utility.ts | 43 ++++- 7 files changed, 316 insertions(+), 47 deletions(-) create mode 100644 src/upgrade/cve.ts diff --git a/CHANGELOG.md b/CHANGELOG.md index 5e847858..25917fde 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,10 @@ All notable changes to the "vscode-java-dependency" extension will be documented The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/) and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html). +## 0.27.0 + +- feat - Add CVE checking to notify users to fix the critical/high-severity CVE issues in https://github.com/microsoft/vscode-java-dependency/pull/948 + ## 0.26.5 - Enhancement - Register Context Provider after Java LS ready in https://github.com/microsoft/vscode-java-dependency/pull/939 diff --git a/package.json b/package.json index d098d9d1..ce44199d 100644 --- a/package.json +++ b/package.json @@ -1111,6 +1111,7 @@ }, "dependencies": { "@github/copilot-language-server": "^1.388.0", + "@octokit/rest": "^21.1.1", "await-lock": "^2.2.2", "fmtr": "^1.1.4", "fs-extra": "^10.1.0", diff --git a/src/upgrade/assessmentManager.ts b/src/upgrade/assessmentManager.ts index 7135a57b..e5839fa2 100644 --- a/src/upgrade/assessmentManager.ts +++ b/src/upgrade/assessmentManager.ts @@ -10,6 +10,7 @@ import { Upgrade } from '../constants'; import { buildPackageId } from './utility'; import metadataManager from './metadataManager'; import { sendInfo } from 'vscode-extension-telemetry-wrapper'; +import { batchGetCVEIssues } from './cve'; function packageNodeToDescription(node: INodeData): PackageDescription | null { const version = node.metaData?.["maven.version"]; @@ -121,51 +122,29 @@ function getDependencyIssue(pkg: PackageDescription): UpgradeIssue | null { return getUpgradeForDependency(version, supportedVersionDefinition, packageId); } -async function getDependencyIssues(projectNode: INodeData): Promise { - const projectStructureData = await Jdtls.getPackageData({ kind: NodeKind.Project, projectUri: projectNode.uri }); - const packageContainerIssues = await Promise.allSettled( - projectStructureData - .filter(x => x.kind === NodeKind.Container) - .map(async (packageContainer) => { - const packageNodes = await Jdtls.getPackageData({ - kind: NodeKind.Container, - projectUri: projectNode.uri, - path: packageContainer.path, - }); - const packages = packageNodes.map(packageNodeToDescription).filter((x): x is PackageDescription => Boolean(x)); - - const issues = packages.map(getDependencyIssue).filter((x): x is UpgradeIssue => Boolean(x)); - const versionRangeByGroupId = collectVersionRange(packages.filter(getPackageUpgradeMetadata)); - if (Object.keys(versionRangeByGroupId).length > 0) { - sendInfo("", { - operationName: "java.dependency.assessmentManager.getDependencyVersionRange", - versionRangeByGroupId: JSON.stringify(versionRangeByGroupId), - }); - } - - return issues; - }) - ); +async function getDependencyIssues(dependencies: PackageDescription[]): Promise { - return packageContainerIssues - .map(x => { - if (x.status === "fulfilled") { - return x.value; - } + const issues = dependencies.map(getDependencyIssue).filter((x): x is UpgradeIssue => Boolean(x)); + const versionRangeByGroupId = collectVersionRange(dependencies.filter(pkg => getPackageUpgradeMetadata(pkg))); + if (Object.keys(versionRangeByGroupId).length > 0) { + sendInfo("", { + operationName: "java.dependency.assessmentManager.getDependencyVersionRange", + versionRangeByGroupId: JSON.stringify(versionRangeByGroupId), + }); + } - sendInfo("", { - operationName: "java.dependency.assessmentManager.getDependencyIssues.packageDataFailure", - }); - return []; - }) - .reduce((a, b) => [...a, ...b]); + return issues; } async function getProjectIssues(projectNode: INodeData): Promise { const issues: UpgradeIssue[] = []; + const dependencies = await getAllDependencies(projectNode); + issues.push(...await getCVEIssues(dependencies)); issues.push(...getJavaIssues(projectNode)); - issues.push(...(await getDependencyIssues(projectNode))); + issues.push(...await getDependencyIssues(dependencies)); + return issues; + } async function getWorkspaceIssues(workspaceFolderUri: string): Promise { @@ -184,11 +163,42 @@ async function getWorkspaceIssues(workspaceFolderUri: string): Promise [...a, ...b]); + }).flat(); return workspaceIssues; } +async function getAllDependencies(projectNode: INodeData): Promise { + const projectStructureData = await Jdtls.getPackageData({ kind: NodeKind.Project, projectUri: projectNode.uri }); + const packageContainers = projectStructureData.filter(x => x.kind === NodeKind.Container); + + const allPackages = await Promise.allSettled( + packageContainers.map(async (packageContainer) => { + const packageNodes = await Jdtls.getPackageData({ + kind: NodeKind.Container, + projectUri: projectNode.uri, + path: packageContainer.path, + }); + return packageNodes.map(packageNodeToDescription).filter((x): x is PackageDescription => Boolean(x)); + }) + ); + + const fulfilled = allPackages.filter((x): x is PromiseFulfilledResult => x.status === "fulfilled"); + const failedPackageCount = allPackages.length - fulfilled.length; + if (failedPackageCount > 0) { + sendInfo("", { + operationName: "java.dependency.assessmentManager.getAllDependencies.rejected", + failedPackageCount: String(failedPackageCount), + }); + } + return fulfilled.map(x => x.value).flat(); +} + +async function getCVEIssues(dependencies: PackageDescription[]): Promise { + const gavCoordinates = dependencies.map(pkg => `${pkg.groupId}:${pkg.artifactId}:${pkg.version}`); + return batchGetCVEIssues(gavCoordinates); +} + export default { getWorkspaceIssues, }; \ No newline at end of file diff --git a/src/upgrade/cve.ts b/src/upgrade/cve.ts new file mode 100644 index 00000000..804afa1a --- /dev/null +++ b/src/upgrade/cve.ts @@ -0,0 +1,192 @@ +import { UpgradeIssue, UpgradeReason } from "./type"; +import { Octokit } from "@octokit/rest"; +import * as semver from "semver"; + +/** + * Severity levels ordered by criticality (higher number = more critical) + * The official doc about the severity levels can be found at: + * https://docs.github.com/en/rest/security-advisories/global-advisories?apiVersion=2022-11-28 + */ +export enum Severity { + unknown = 0, + low = 1, + medium = 2, + high = 3, + critical = 4, +} + +export interface CVE { + id: string; + ghsa_id: string; + severity: keyof typeof Severity; + summary: string; + description: string; + html_url: string; + affectedDeps: { + name?: string | null; + vulVersions?: string | null; + patchedVersion?: string | null; + }[]; +} + +export type CveUpgradeIssue = UpgradeIssue & { + reason: UpgradeReason.CVE; + severity: string; + link: string; +}; + +export async function batchGetCVEIssues( + coordinates: string[] +): Promise { + // Split dependencies into smaller batches to avoid URL length limit + const BATCH_SIZE = 30; + const allCVEUpgradeIssues: CveUpgradeIssue[] = []; + + // Process dependencies in batches + for (let i = 0; i < coordinates.length; i += BATCH_SIZE) { + const batchCoordinates = coordinates.slice(i, i + BATCH_SIZE); + const cveUpgradeIssues = await getCveUpgradeIssues(batchCoordinates); + allCVEUpgradeIssues.push(...cveUpgradeIssues); + } + + return allCVEUpgradeIssues; +} + +async function getCveUpgradeIssues( + coordinates: string[] +): Promise { + if (coordinates.length === 0) { + return []; + } + const deps = coordinates + .map((d) => d.split(":", 3)) + .map((p) => ({ name: `${p[0]}:${p[1]}`, version: p[2] })) + .filter((d) => d.version); + + const depsCves = await fetchCves(deps); + return mapCvesToUpgradeIssues(depsCves); +} + +async function fetchCves(deps: { name: string; version: string }[]) { + if (deps.length === 0) { + return []; + } + try { + const allCves: CVE[] = await retrieveVulnerabilityData(deps); + + if (allCves.length === 0) { + return []; + } + // group the cves by coordinate + const depsCves: { dep: string; version: string; cves: CVE[] }[] = []; + + for (const dep of deps) { + const depCves: CVE[] = allCves.filter((cve) => + isCveAffectingDep(cve, dep.name, dep.version) + ); + + if (depCves.length < 1) { + continue; + } + + depsCves.push({ + dep: dep.name, + version: dep.version, + cves: depCves, + }); + } + + return depsCves; + } catch (error) { + return []; + } +} + +async function retrieveVulnerabilityData( + deps: { name: string; version: string }[] +) { + if (deps.length === 0) { + return []; + } + const octokit = new Octokit(); + + // Use paginate to fetch all pages of results + const allAdvisories = await octokit.paginate( + octokit.securityAdvisories.listGlobalAdvisories, + { + ecosystem: "maven", + affects: deps.map((p) => `${p.name}@${p.version}`), + direction: "asc", + sort: "published", + per_page: 100, + } + ); + + const allCves: CVE[] = allAdvisories + .filter( + (c) => + !c.withdrawn_at?.trim() && + (c.severity === "critical" || c.severity === "high") + ) // only consider critical and high severity CVEs + .map((cve) => ({ + id: cve.cve_id || cve.ghsa_id, + ghsa_id: cve.ghsa_id, + severity: cve.severity, + summary: cve.summary, + description: cve.description || cve.summary, + html_url: cve.html_url, + affectedDeps: (cve.vulnerabilities ?? []).map((v) => ({ + name: v.package?.name, + vulVersions: v.vulnerable_version_range, + patchedVersion: v.first_patched_version, + })), + })); + return allCves; +} + +function mapCvesToUpgradeIssues( + depsCves: { dep: string; version: string; cves: CVE[] }[] +) { + if (depsCves.length === 0) { + return []; + } + const upgradeIssues = depsCves.map((depCve) => { + const mostCriticalCve = [...depCve.cves] + .sort((a, b) => Severity[b.severity] - Severity[a.severity])[0]; + return { + packageId: depCve.dep, + packageDisplayName: depCve.dep, + currentVersion: depCve.version || "unknown", + name: `${mostCriticalCve.id || "CVE"}`, + reason: UpgradeReason.CVE as const, + suggestedVersion: { + name: "", + description: "", + }, + severity: mostCriticalCve.severity, + description: + mostCriticalCve.description || + mostCriticalCve.summary || + "Security vulnerability detected", + link: mostCriticalCve.html_url, + }; + }); + return upgradeIssues; +} + +function isCveAffectingDep( + cve: CVE, + depName: string, + depVersion: string +): boolean { + if (!cve.affectedDeps || cve.affectedDeps.length === 0) { + return false; + } + return cve.affectedDeps.some((d) => { + if (d.name !== depName || !d.vulVersions) { + return false; + } + + return semver.satisfies(depVersion || "0.0.0", d.vulVersions); + }); +} diff --git a/src/upgrade/display/notificationManager.ts b/src/upgrade/display/notificationManager.ts index 22e4a9ef..3061e179 100644 --- a/src/upgrade/display/notificationManager.ts +++ b/src/upgrade/display/notificationManager.ts @@ -2,18 +2,21 @@ // Licensed under the MIT license. import { commands, ExtensionContext, extensions, window } from "vscode"; -import type { IUpgradeIssuesRenderer, UpgradeIssue } from "../type"; -import { buildFixPrompt, buildNotificationMessage } from "../utility"; +import { UpgradeReason, type IUpgradeIssuesRenderer, type UpgradeIssue } from "../type"; +import { buildCVENotificationMessage, buildFixPrompt, buildNotificationMessage } from "../utility"; import { Commands } from "../../commands"; import { Settings } from "../../settings"; import { instrumentOperation, sendInfo } from "vscode-extension-telemetry-wrapper"; import { ExtensionName } from "../../constants"; +import { CveUpgradeIssue } from "../cve"; const KEY_PREFIX = 'javaupgrade.notificationManager'; const NEXT_SHOW_TS_KEY = `${KEY_PREFIX}.nextShowTs`; const BUTTON_TEXT_UPGRADE = "Upgrade Now"; +const BUTTON_TEXT_FIX_CVE = "Fix Now"; const BUTTON_TEXT_INSTALL_AND_UPGRADE = "Install Extension and Upgrade"; +const BUTTON_TEXT_INSTALL_AND_FIX_CVE = "Install Extension and Fix"; const BUTTON_TEXT_NOT_NOW = "Not Now"; const SECONDS_IN_A_DAY = 24 * 60 * 60; @@ -51,22 +54,39 @@ class NotificationManager implements IUpgradeIssuesRenderer { const hasExtension = !!extensions.getExtension(ExtensionName.APP_MODERNIZATION_UPGRADE_FOR_JAVA); const prompt = buildFixPrompt(issue); - const notificationMessage = buildNotificationMessage(issue, hasExtension); - const upgradeButtonText = hasExtension ? BUTTON_TEXT_UPGRADE : BUTTON_TEXT_INSTALL_AND_UPGRADE; + let notificationMessage = ""; + let cveIssues: CveUpgradeIssue[] = []; + if (issue.reason === UpgradeReason.CVE) { + // Filter to only CVE issues and cast to CveUpgradeIssue[] + cveIssues = issues.filter( + (i): i is CveUpgradeIssue => i.reason === UpgradeReason.CVE + ); + notificationMessage = buildCVENotificationMessage(cveIssues, hasExtension); + } else { + notificationMessage = buildNotificationMessage(issue, hasExtension); + } + const upgradeButtonText = hasExtension ? BUTTON_TEXT_UPGRADE : BUTTON_TEXT_INSTALL_AND_UPGRADE; + const fixCVEButtonText = hasExtension ? BUTTON_TEXT_FIX_CVE : BUTTON_TEXT_INSTALL_AND_FIX_CVE; sendInfo(operationId, { operationName: "java.dependency.upgradeNotification.show", }); + + const buttons = issue.reason === UpgradeReason.CVE + ? [fixCVEButtonText, BUTTON_TEXT_NOT_NOW] + : [upgradeButtonText, BUTTON_TEXT_NOT_NOW]; + const selection = await window.showInformationMessage( - notificationMessage, - upgradeButtonText, - BUTTON_TEXT_NOT_NOW); + notificationMessage, + ...buttons + ); sendInfo(operationId, { operationName: "java.dependency.upgradeNotification.runUpgrade", choice: selection ?? "", }); switch (selection) { + case fixCVEButtonText: case upgradeButtonText: { commands.executeCommand(Commands.JAVA_UPGRADE_WITH_COPILOT, prompt); break; diff --git a/src/upgrade/type.ts b/src/upgrade/type.ts index f64c1fdc..74802b82 100644 --- a/src/upgrade/type.ts +++ b/src/upgrade/type.ts @@ -10,7 +10,8 @@ export type DependencyCheckItemEol = DependencyCheckItemBase & { }; export type DependencyCheckItemJreTooOld = DependencyCheckItemBase & { reason: UpgradeReason.JRE_TOO_OLD }; export type DependencyCheckItemDeprecated = DependencyCheckItemBase & { reason: UpgradeReason.DEPRECATED }; -export type DependencyCheckItem = (DependencyCheckItemEol | DependencyCheckItemJreTooOld | DependencyCheckItemDeprecated); +export type DependencyCheckItemCve = DependencyCheckItemBase & { reason: UpgradeReason.CVE, severity: string, description: string, link: string }; +export type DependencyCheckItem = (DependencyCheckItemEol | DependencyCheckItemJreTooOld | DependencyCheckItemDeprecated | DependencyCheckItemCve); export type DependencyCheckMetadata = Record; export enum UpgradeReason { diff --git a/src/upgrade/utility.ts b/src/upgrade/utility.ts index c6345100..dd1c87bf 100644 --- a/src/upgrade/utility.ts +++ b/src/upgrade/utility.ts @@ -5,7 +5,8 @@ import { commands, extensions, Uri, window } from "vscode"; import * as semver from "semver"; import { UpgradeReason, type UpgradeIssue } from "./type"; import { ExtensionName, Upgrade } from "../constants"; -import { instrumentOperation } from "vscode-extension-telemetry-wrapper"; +import { instrumentOperation, sendInfo } from "vscode-extension-telemetry-wrapper"; +import { CveUpgradeIssue } from "./cve"; function findEolDate(currentVersion: string, eolDate: Record): string | null { @@ -50,7 +51,44 @@ export function buildNotificationMessage(issue: UpgradeIssue, hasExtension: bool } } +export function buildCVENotificationMessage(issues: CveUpgradeIssue[], hasExtension: boolean): string { + if (issues.length === 0) { + return "No CVE issues found."; + } + const severityCount: Record = issues.reduce>((acc, { reason, severity }) => { + if (reason === UpgradeReason.CVE && (severity === 'critical' || severity === 'high')) { + acc[severity] = (acc[severity] ?? 0) + 1; + } + return acc; + }, {}); + + const criticalCount = severityCount.critical || 0; + const highCount = severityCount.high || 0; + + const parts: string[] = []; + if (criticalCount > 0) { + parts.push(`${criticalCount} critical`); + } + if (highCount > 0) { + parts.push(`${highCount} high-severity`); + } + + const severityText = parts.join(" and "); + + sendInfo("", { + operationName: "java.dependency.upgrade.getCVESeverityDistribution", + CVESeverityDistribution: severityText, + }); + + const fixWord = hasExtension ? "fix" : `install ${ExtensionName.APP_MODERNIZATION_EXTENSION_NAME} extension and fix`; + + if (issues.length === 1) { + return `${severityText} CVE vulnerability is detected in this project. Would you like to ${fixWord} it now?`; + } + + return `${severityText} CVE vulnerabilities are detected in this project. Would you like to ${fixWord} them now?`; +} export function buildFixPrompt(issue: UpgradeIssue): string { const { packageDisplayName, reason } = issue; @@ -64,6 +102,9 @@ export function buildFixPrompt(issue: UpgradeIssue): string { const { suggestedVersion: { name: suggestedVersionName } } = issue; return `upgrade ${packageDisplayName} to ${suggestedVersionName} using java upgrade tools`; } + case UpgradeReason.CVE: { + return `fix all critical and high-severity CVE vulnerabilities in this project`; + } } } From 172f700c20480a9b8c470b3af961cfd482042baa Mon Sep 17 00:00:00 2001 From: yezhu6 <92571997+yezhu6@users.noreply.github.com> Date: Mon, 15 Dec 2025 10:12:44 +0800 Subject: [PATCH 260/352] fix semver issue for invalid semver version, like 4.3.6.RELEASE (#950) --- src/upgrade/assessmentManager.ts | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/upgrade/assessmentManager.ts b/src/upgrade/assessmentManager.ts index e5839fa2..6b0ba95e 100644 --- a/src/upgrade/assessmentManager.ts +++ b/src/upgrade/assessmentManager.ts @@ -24,7 +24,14 @@ function packageNodeToDescription(node: INodeData): PackageDescription | null { } function getVersionRange(versions: Set) : string { - const versionList = [...versions].sort((a, b) => semver.compare(a, b)); + const versionList = [...versions].sort((a, b) => { + const semverA = semver.coerce(a); + const semverB = semver.coerce(b); + if (!semverA || !semverB) { + return a.localeCompare(b); + } + return semver.compare(semverA, semverB); + }); if (versionList.length === 1) { return versionList[0]; } From 24c2437e7e22a6d64abf5dda55c47d70426c98a4 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 15 Dec 2025 15:58:05 +0800 Subject: [PATCH 261/352] chore(deps): Bump js-yaml and mocha (#944) Bumps [js-yaml](https://github.com/nodeca/js-yaml) to 3.14.2 and updates ancestor dependencies [js-yaml](https://github.com/nodeca/js-yaml) and [mocha](https://github.com/mochajs/mocha). These dependencies need to be updated together. Updates `js-yaml` from 3.14.1 to 3.14.2 - [Changelog](https://github.com/nodeca/js-yaml/blob/master/CHANGELOG.md) - [Commits](https://github.com/nodeca/js-yaml/compare/3.14.1...3.14.2) Updates `js-yaml` from 4.1.0 to 4.1.1 - [Changelog](https://github.com/nodeca/js-yaml/blob/master/CHANGELOG.md) - [Commits](https://github.com/nodeca/js-yaml/compare/3.14.1...3.14.2) Updates `mocha` from 9.2.2 to 11.7.5 - [Release notes](https://github.com/mochajs/mocha/releases) - [Changelog](https://github.com/mochajs/mocha/blob/v11.7.5/CHANGELOG.md) - [Commits](https://github.com/mochajs/mocha/compare/v9.2.2...v11.7.5) --- updated-dependencies: - dependency-name: js-yaml dependency-version: 3.14.2 dependency-type: indirect - dependency-name: js-yaml dependency-version: 4.1.1 dependency-type: indirect - dependency-name: mocha dependency-version: 11.7.5 dependency-type: direct:development ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Changyong Gong --- package-lock.json | 1058 +++++++++++++++++++++++++-------------------- package.json | 2 +- 2 files changed, 581 insertions(+), 479 deletions(-) diff --git a/package-lock.json b/package-lock.json index 8617f52a..4f9dac25 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,6 +10,7 @@ "license": "MIT", "dependencies": { "@github/copilot-language-server": "^1.388.0", + "@octokit/rest": "^21.1.1", "await-lock": "^2.2.2", "fmtr": "^1.1.4", "fs-extra": "^10.1.0", @@ -32,7 +33,7 @@ "@vscode/test-electron": "^2.4.1", "copy-webpack-plugin": "^11.0.0", "glob": "^7.2.3", - "mocha": "^9.2.2", + "mocha": "^11.7.5", "ts-loader": "^9.4.2", "tslint": "^6.1.3", "typescript": "^4.9.4", @@ -553,6 +554,174 @@ "node": ">= 8" } }, + "node_modules/@octokit/auth-token": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-5.1.2.tgz", + "integrity": "sha512-JcQDsBdg49Yky2w2ld20IHAlwr8d/d8N6NiOXbtuoPCqzbsiJgF633mVUw3x4mo0H5ypataQIX7SFu3yy44Mpw==", + "engines": { + "node": ">= 18" + } + }, + "node_modules/@octokit/core": { + "version": "6.1.6", + "resolved": "https://registry.npmjs.org/@octokit/core/-/core-6.1.6.tgz", + "integrity": "sha512-kIU8SLQkYWGp3pVKiYzA5OSaNF5EE03P/R8zEmmrG6XwOg5oBjXyQVVIauQ0dgau4zYhpZEhJrvIYt6oM+zZZA==", + "dependencies": { + "@octokit/auth-token": "^5.0.0", + "@octokit/graphql": "^8.2.2", + "@octokit/request": "^9.2.3", + "@octokit/request-error": "^6.1.8", + "@octokit/types": "^14.0.0", + "before-after-hook": "^3.0.2", + "universal-user-agent": "^7.0.0" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/@octokit/endpoint": { + "version": "10.1.4", + "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-10.1.4.tgz", + "integrity": "sha512-OlYOlZIsfEVZm5HCSR8aSg02T2lbUWOsCQoPKfTXJwDzcHQBrVBGdGXb89dv2Kw2ToZaRtudp8O3ZIYoaOjKlA==", + "dependencies": { + "@octokit/types": "^14.0.0", + "universal-user-agent": "^7.0.2" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/@octokit/graphql": { + "version": "8.2.2", + "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-8.2.2.tgz", + "integrity": "sha512-Yi8hcoqsrXGdt0yObxbebHXFOiUA+2v3n53epuOg1QUgOB6c4XzvisBNVXJSl8RYA5KrDuSL2yq9Qmqe5N0ryA==", + "dependencies": { + "@octokit/request": "^9.2.3", + "@octokit/types": "^14.0.0", + "universal-user-agent": "^7.0.0" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/@octokit/openapi-types": { + "version": "25.1.0", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-25.1.0.tgz", + "integrity": "sha512-idsIggNXUKkk0+BExUn1dQ92sfysJrje03Q0bv0e+KPLrvyqZF8MnBpFz8UNfYDwB3Ie7Z0TByjWfzxt7vseaA==" + }, + "node_modules/@octokit/plugin-paginate-rest": { + "version": "11.6.0", + "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-11.6.0.tgz", + "integrity": "sha512-n5KPteiF7pWKgBIBJSk8qzoZWcUkza2O6A0za97pMGVrGfPdltxrfmfF5GucHYvHGZD8BdaZmmHGz5cX/3gdpw==", + "dependencies": { + "@octokit/types": "^13.10.0" + }, + "engines": { + "node": ">= 18" + }, + "peerDependencies": { + "@octokit/core": ">=6" + } + }, + "node_modules/@octokit/plugin-paginate-rest/node_modules/@octokit/openapi-types": { + "version": "24.2.0", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-24.2.0.tgz", + "integrity": "sha512-9sIH3nSUttelJSXUrmGzl7QUBFul0/mB8HRYl3fOlgHbIWG+WnYDXU3v/2zMtAvuzZ/ed00Ei6on975FhBfzrg==" + }, + "node_modules/@octokit/plugin-paginate-rest/node_modules/@octokit/types": { + "version": "13.10.0", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-13.10.0.tgz", + "integrity": "sha512-ifLaO34EbbPj0Xgro4G5lP5asESjwHracYJvVaPIyXMuiuXLlhic3S47cBdTb+jfODkTE5YtGCLt3Ay3+J97sA==", + "dependencies": { + "@octokit/openapi-types": "^24.2.0" + } + }, + "node_modules/@octokit/plugin-request-log": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/@octokit/plugin-request-log/-/plugin-request-log-5.3.1.tgz", + "integrity": "sha512-n/lNeCtq+9ofhC15xzmJCNKP2BWTv8Ih2TTy+jatNCCq/gQP/V7rK3fjIfuz0pDWDALO/o/4QY4hyOF6TQQFUw==", + "engines": { + "node": ">= 18" + }, + "peerDependencies": { + "@octokit/core": ">=6" + } + }, + "node_modules/@octokit/plugin-rest-endpoint-methods": { + "version": "13.5.0", + "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-13.5.0.tgz", + "integrity": "sha512-9Pas60Iv9ejO3WlAX3maE1+38c5nqbJXV5GrncEfkndIpZrJ/WPMRd2xYDcPPEt5yzpxcjw9fWNoPhsSGzqKqw==", + "dependencies": { + "@octokit/types": "^13.10.0" + }, + "engines": { + "node": ">= 18" + }, + "peerDependencies": { + "@octokit/core": ">=6" + } + }, + "node_modules/@octokit/plugin-rest-endpoint-methods/node_modules/@octokit/openapi-types": { + "version": "24.2.0", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-24.2.0.tgz", + "integrity": "sha512-9sIH3nSUttelJSXUrmGzl7QUBFul0/mB8HRYl3fOlgHbIWG+WnYDXU3v/2zMtAvuzZ/ed00Ei6on975FhBfzrg==" + }, + "node_modules/@octokit/plugin-rest-endpoint-methods/node_modules/@octokit/types": { + "version": "13.10.0", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-13.10.0.tgz", + "integrity": "sha512-ifLaO34EbbPj0Xgro4G5lP5asESjwHracYJvVaPIyXMuiuXLlhic3S47cBdTb+jfODkTE5YtGCLt3Ay3+J97sA==", + "dependencies": { + "@octokit/openapi-types": "^24.2.0" + } + }, + "node_modules/@octokit/request": { + "version": "9.2.4", + "resolved": "https://registry.npmjs.org/@octokit/request/-/request-9.2.4.tgz", + "integrity": "sha512-q8ybdytBmxa6KogWlNa818r0k1wlqzNC+yNkcQDECHvQo8Vmstrg18JwqJHdJdUiHD2sjlwBgSm9kHkOKe2iyA==", + "dependencies": { + "@octokit/endpoint": "^10.1.4", + "@octokit/request-error": "^6.1.8", + "@octokit/types": "^14.0.0", + "fast-content-type-parse": "^2.0.0", + "universal-user-agent": "^7.0.2" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/@octokit/request-error": { + "version": "6.1.8", + "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-6.1.8.tgz", + "integrity": "sha512-WEi/R0Jmq+IJKydWlKDmryPcmdYSVjL3ekaiEL1L9eo1sUnqMJ+grqmC9cjk7CA7+b2/T397tO5d8YLOH3qYpQ==", + "dependencies": { + "@octokit/types": "^14.0.0" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/@octokit/rest": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-21.1.1.tgz", + "integrity": "sha512-sTQV7va0IUVZcntzy1q3QqPm/r8rWtDCqpRAmb8eXXnKkjoQEtFe3Nt5GTVsHft+R6jJoHeSiVLcgcvhtue/rg==", + "dependencies": { + "@octokit/core": "^6.1.4", + "@octokit/plugin-paginate-rest": "^11.4.2", + "@octokit/plugin-request-log": "^5.3.1", + "@octokit/plugin-rest-endpoint-methods": "^13.3.0" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/@octokit/types": { + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-14.1.0.tgz", + "integrity": "sha512-1y6DgTy8Jomcpu33N+p5w58l6xyt55Ar2I91RPiIA0xCJBXyUAhXCcmZaDWSANiha7R9a6qJJ2CRomGPZ6f46g==", + "dependencies": { + "@octokit/openapi-types": "^25.1.0" + } + }, "node_modules/@pkgjs/parseargs": { "version": "0.11.0", "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", @@ -681,12 +850,6 @@ "@types/node": "*" } }, - "node_modules/@ungap/promise-all-settled": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz", - "integrity": "sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==", - "dev": true - }, "node_modules/@vscode/extension-telemetry": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/@vscode/extension-telemetry/-/extension-telemetry-1.2.0.tgz", @@ -1129,15 +1292,6 @@ "ajv": "^8.8.2" } }, - "node_modules/ansi-colors": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", - "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", - "dev": true, - "engines": { - "node": ">=6" - } - }, "node_modules/ansi-regex": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", @@ -1162,19 +1316,6 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "dev": true, - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, "node_modules/argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", @@ -1236,6 +1377,11 @@ } ] }, + "node_modules/before-after-hook": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-3.0.2.tgz", + "integrity": "sha512-Nik3Sc0ncrMK4UUdXQmAnRtzmNQTAAXmXIopizwZ1W1t8QmfJj+zL4OA2I7XPTPW5z5TDqv4hRo/JzouDJnX3A==" + }, "node_modules/big-integer": { "version": "1.6.51", "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.51.tgz", @@ -1258,15 +1404,6 @@ "node": "*" } }, - "node_modules/binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/bl": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", @@ -1617,42 +1754,18 @@ } }, "node_modules/chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", + "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ], "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" + "readdirp": "^4.0.1" }, "engines": { - "node": ">= 8.10.0" + "node": ">= 14.16.0" }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/chokidar/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" + "funding": { + "url": "https://paulmillr.com/funding/" } }, "node_modules/chownr": { @@ -1715,14 +1828,17 @@ } }, "node_modules/cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", "dev": true, "dependencies": { "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", + "strip-ansi": "^6.0.1", "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" } }, "node_modules/clone-deep": { @@ -1973,9 +2089,9 @@ } }, "node_modules/diff": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", - "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-7.0.0.tgz", + "integrity": "sha512-PJWHUb1RFevKCwaFA9RlG5tCd+FO5iRh9A8HEtkmBH2Li03iJriB6m6JIN4rGz3K3JLawI7/veA1xzRKP6ISBw==", "dev": true, "engines": { "node": ">=0.3.1" @@ -2311,6 +2427,21 @@ "node": ">=6" } }, + "node_modules/fast-content-type-parse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fast-content-type-parse/-/fast-content-type-parse-2.0.1.tgz", + "integrity": "sha512-nGqtvLrj5w0naR6tDPfB4cUmYCqouzyQiz6C5y/LtcDllJdrcc6WaWW6iXyIIOErTa/XRybj28aasdn4LkVk6Q==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ] + }, "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", @@ -2503,20 +2634,6 @@ "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", "dev": true }, - "node_modules/fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, "node_modules/fstream": { "version": "1.0.12", "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.12.tgz", @@ -2735,15 +2852,6 @@ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" }, - "node_modules/growl": { - "version": "1.10.5", - "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", - "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", - "dev": true, - "engines": { - "node": ">=4.x" - } - }, "node_modules/has": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", @@ -3001,18 +3109,6 @@ "node": ">= 0.10" } }, - "node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "dependencies": { - "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/is-core-module": { "version": "2.12.1", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.1.tgz", @@ -3106,6 +3202,15 @@ "node": ">=0.12.0" } }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/is-plain-obj": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", @@ -3241,9 +3346,9 @@ "dev": true }, "node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", + "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", "dev": true, "dependencies": { "argparse": "^2.0.1" @@ -3572,9 +3677,9 @@ } }, "node_modules/minipass": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", - "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", "dev": true, "engines": { "node": ">=16 || 14 >=14.17" @@ -3600,124 +3705,89 @@ "optional": true }, "node_modules/mocha": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-9.2.2.tgz", - "integrity": "sha512-L6XC3EdwT6YrIk0yXpavvLkn8h+EU+Y5UcCHKECyMbdUIxyMuZj4bX4U9e1nvnvUUvQVsV2VHQr5zLdcUkhW/g==", - "dev": true, - "dependencies": { - "@ungap/promise-all-settled": "1.1.2", - "ansi-colors": "4.1.1", - "browser-stdout": "1.3.1", - "chokidar": "3.5.3", - "debug": "4.3.3", - "diff": "5.0.0", - "escape-string-regexp": "4.0.0", - "find-up": "5.0.0", - "glob": "7.2.0", - "growl": "1.10.5", - "he": "1.2.0", - "js-yaml": "4.1.0", - "log-symbols": "4.1.0", - "minimatch": "4.2.1", - "ms": "2.1.3", - "nanoid": "3.3.1", - "serialize-javascript": "6.0.0", - "strip-json-comments": "3.1.1", - "supports-color": "8.1.1", - "which": "2.0.2", - "workerpool": "6.2.0", - "yargs": "16.2.0", - "yargs-parser": "20.2.4", - "yargs-unparser": "2.0.0" + "version": "11.7.5", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-11.7.5.tgz", + "integrity": "sha512-mTT6RgopEYABzXWFx+GcJ+ZQ32kp4fMf0xvpZIIfSq9Z8lC/++MtcCnQ9t5FP2veYEP95FIYSvW+U9fV4xrlig==", + "dev": true, + "dependencies": { + "browser-stdout": "^1.3.1", + "chokidar": "^4.0.1", + "debug": "^4.3.5", + "diff": "^7.0.0", + "escape-string-regexp": "^4.0.0", + "find-up": "^5.0.0", + "glob": "^10.4.5", + "he": "^1.2.0", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", + "log-symbols": "^4.1.0", + "minimatch": "^9.0.5", + "ms": "^2.1.3", + "picocolors": "^1.1.1", + "serialize-javascript": "^6.0.2", + "strip-json-comments": "^3.1.1", + "supports-color": "^8.1.1", + "workerpool": "^9.2.0", + "yargs": "^17.7.2", + "yargs-parser": "^21.1.1", + "yargs-unparser": "^2.0.0" }, "bin": { "_mocha": "bin/_mocha", - "mocha": "bin/mocha" - }, - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mochajs" - } - }, - "node_modules/mocha/node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/mocha/node_modules/debug": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", - "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", - "dev": true, - "dependencies": { - "ms": "2.1.2" + "mocha": "bin/mocha.js" }, "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, - "node_modules/mocha/node_modules/debug/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, "node_modules/mocha/node_modules/glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz", + "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==", "dev": true, "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" + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" }, - "engines": { - "node": "*" + "bin": { + "glob": "dist/esm/bin.mjs" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/mocha/node_modules/glob/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "node_modules/mocha/node_modules/jackspeak": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", "dev": true, "dependencies": { - "brace-expansion": "^1.1.7" + "@isaacs/cliui": "^8.0.2" }, - "engines": { - "node": "*" + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" } }, "node_modules/mocha/node_modules/minimatch": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-4.2.1.tgz", - "integrity": "sha512-9Uq1ChtSZO+Mxa/CL1eGizn2vRn3MlLgzhT0Iz8zaY8NdvxvB0d5QdPFmCKf7JKA9Lerx5vRrnwO03jsSfGG9g==", + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "dev": true, "dependencies": { - "brace-expansion": "^1.1.7" + "brace-expansion": "^2.0.1" }, "engines": { - "node": ">=10" + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, "node_modules/mocha/node_modules/ms": { @@ -3726,15 +3796,6 @@ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "dev": true }, - "node_modules/mocha/node_modules/serialize-javascript": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", - "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", - "dev": true, - "dependencies": { - "randombytes": "^2.1.0" - } - }, "node_modules/monaco-page-objects": { "version": "3.12.0", "resolved": "https://registry.npmjs.org/monaco-page-objects/-/monaco-page-objects-3.12.0.tgz", @@ -3778,18 +3839,6 @@ "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", "dev": true }, - "node_modules/nanoid": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.1.tgz", - "integrity": "sha512-n6Vs/3KGyxPQd6uO0eH4Bv0ojGSUvuLlIHtC3Y0kEO23YRge8H9x1GCzLn28YX0H66pMkxuaeESFq4tKISKwdw==", - "dev": true, - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, "node_modules/napi-build-utils": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz", @@ -4083,6 +4132,12 @@ "node": ">=6" } }, + "node_modules/package-json-from-dist": { + "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 + }, "node_modules/pako": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", @@ -4166,29 +4221,26 @@ "dev": true }, "node_modules/path-scurry": { - "version": "1.10.1", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.1.tgz", - "integrity": "sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", "dev": true, "dependencies": { - "lru-cache": "^9.1.1 || ^10.0.0", + "lru-cache": "^10.2.0", "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" }, "engines": { - "node": ">=16 || 14 >=14.17" + "node": ">=16 || 14 >=14.18" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, "node_modules/path-scurry/node_modules/lru-cache": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.1.0.tgz", - "integrity": "sha512-/1clY/ui8CzjKFyjdvwPWJUYKiFVXG2I2cY0ssG7h4+hwk+XOIX7ZSG9Q7TW8TW3Kp3BUSqgFWBLgL4PJ+Blag==", - "dev": true, - "engines": { - "node": "14 || >=16.14" - } + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true }, "node_modules/path-type": { "version": "4.0.0", @@ -4205,9 +4257,9 @@ "dev": true }, "node_modules/picocolors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", - "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", "dev": true }, "node_modules/picomatch": { @@ -4452,15 +4504,16 @@ } }, "node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", + "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", "dev": true, - "dependencies": { - "picomatch": "^2.2.1" - }, "engines": { - "node": ">=8.10.0" + "node": ">= 14.18.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" } }, "node_modules/rechoir": { @@ -5510,9 +5563,9 @@ } }, "node_modules/tslint/node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "version": "3.14.2", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.2.tgz", + "integrity": "sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==", "dev": true, "dependencies": { "argparse": "^1.0.7", @@ -5631,6 +5684,11 @@ "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==", "dev": true }, + "node_modules/universal-user-agent": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-7.0.3.tgz", + "integrity": "sha512-TmnEAEAsBJVZM/AADELsK76llnwcf9vMKuPz8JflO1frO8Lchitr0fNaN9d+Ap0BjKtqWqd/J17qeDnXh8CL2A==" + }, "node_modules/universalify": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", @@ -6076,9 +6134,9 @@ "dev": true }, "node_modules/workerpool": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.0.tgz", - "integrity": "sha512-Rsk5qQHJ9eowMH28Jwhe8HEbmdYDX4lwoMWshiCXugjtHqMD9ZbiqSDLxcsfdqsETPzVUtX5s1Z5kStiIM6l4A==", + "version": "9.3.4", + "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-9.3.4.tgz", + "integrity": "sha512-TmPRQYYSAnnDiEB0P/Ytip7bFGvqnSU6I2BcuSw7Hx+JSg/DsUi5ebYfc8GYaSdpuvOcEs6dXxPurOYpe9QFwg==", "dev": true }, "node_modules/wrap-ansi": { @@ -6190,30 +6248,30 @@ "dev": true }, "node_modules/yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", "dev": true, "dependencies": { - "cliui": "^7.0.2", + "cliui": "^8.0.1", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", - "string-width": "^4.2.0", + "string-width": "^4.2.3", "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" + "yargs-parser": "^21.1.1" }, "engines": { - "node": ">=10" + "node": ">=12" } }, "node_modules/yargs-parser": { - "version": "20.2.4", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", - "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", "dev": true, "engines": { - "node": ">=10" + "node": ">=12" } }, "node_modules/yargs-unparser": { @@ -6636,6 +6694,140 @@ "fastq": "^1.6.0" } }, + "@octokit/auth-token": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-5.1.2.tgz", + "integrity": "sha512-JcQDsBdg49Yky2w2ld20IHAlwr8d/d8N6NiOXbtuoPCqzbsiJgF633mVUw3x4mo0H5ypataQIX7SFu3yy44Mpw==" + }, + "@octokit/core": { + "version": "6.1.6", + "resolved": "https://registry.npmjs.org/@octokit/core/-/core-6.1.6.tgz", + "integrity": "sha512-kIU8SLQkYWGp3pVKiYzA5OSaNF5EE03P/R8zEmmrG6XwOg5oBjXyQVVIauQ0dgau4zYhpZEhJrvIYt6oM+zZZA==", + "requires": { + "@octokit/auth-token": "^5.0.0", + "@octokit/graphql": "^8.2.2", + "@octokit/request": "^9.2.3", + "@octokit/request-error": "^6.1.8", + "@octokit/types": "^14.0.0", + "before-after-hook": "^3.0.2", + "universal-user-agent": "^7.0.0" + } + }, + "@octokit/endpoint": { + "version": "10.1.4", + "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-10.1.4.tgz", + "integrity": "sha512-OlYOlZIsfEVZm5HCSR8aSg02T2lbUWOsCQoPKfTXJwDzcHQBrVBGdGXb89dv2Kw2ToZaRtudp8O3ZIYoaOjKlA==", + "requires": { + "@octokit/types": "^14.0.0", + "universal-user-agent": "^7.0.2" + } + }, + "@octokit/graphql": { + "version": "8.2.2", + "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-8.2.2.tgz", + "integrity": "sha512-Yi8hcoqsrXGdt0yObxbebHXFOiUA+2v3n53epuOg1QUgOB6c4XzvisBNVXJSl8RYA5KrDuSL2yq9Qmqe5N0ryA==", + "requires": { + "@octokit/request": "^9.2.3", + "@octokit/types": "^14.0.0", + "universal-user-agent": "^7.0.0" + } + }, + "@octokit/openapi-types": { + "version": "25.1.0", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-25.1.0.tgz", + "integrity": "sha512-idsIggNXUKkk0+BExUn1dQ92sfysJrje03Q0bv0e+KPLrvyqZF8MnBpFz8UNfYDwB3Ie7Z0TByjWfzxt7vseaA==" + }, + "@octokit/plugin-paginate-rest": { + "version": "11.6.0", + "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-11.6.0.tgz", + "integrity": "sha512-n5KPteiF7pWKgBIBJSk8qzoZWcUkza2O6A0za97pMGVrGfPdltxrfmfF5GucHYvHGZD8BdaZmmHGz5cX/3gdpw==", + "requires": { + "@octokit/types": "^13.10.0" + }, + "dependencies": { + "@octokit/openapi-types": { + "version": "24.2.0", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-24.2.0.tgz", + "integrity": "sha512-9sIH3nSUttelJSXUrmGzl7QUBFul0/mB8HRYl3fOlgHbIWG+WnYDXU3v/2zMtAvuzZ/ed00Ei6on975FhBfzrg==" + }, + "@octokit/types": { + "version": "13.10.0", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-13.10.0.tgz", + "integrity": "sha512-ifLaO34EbbPj0Xgro4G5lP5asESjwHracYJvVaPIyXMuiuXLlhic3S47cBdTb+jfODkTE5YtGCLt3Ay3+J97sA==", + "requires": { + "@octokit/openapi-types": "^24.2.0" + } + } + } + }, + "@octokit/plugin-request-log": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/@octokit/plugin-request-log/-/plugin-request-log-5.3.1.tgz", + "integrity": "sha512-n/lNeCtq+9ofhC15xzmJCNKP2BWTv8Ih2TTy+jatNCCq/gQP/V7rK3fjIfuz0pDWDALO/o/4QY4hyOF6TQQFUw==", + "requires": {} + }, + "@octokit/plugin-rest-endpoint-methods": { + "version": "13.5.0", + "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-13.5.0.tgz", + "integrity": "sha512-9Pas60Iv9ejO3WlAX3maE1+38c5nqbJXV5GrncEfkndIpZrJ/WPMRd2xYDcPPEt5yzpxcjw9fWNoPhsSGzqKqw==", + "requires": { + "@octokit/types": "^13.10.0" + }, + "dependencies": { + "@octokit/openapi-types": { + "version": "24.2.0", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-24.2.0.tgz", + "integrity": "sha512-9sIH3nSUttelJSXUrmGzl7QUBFul0/mB8HRYl3fOlgHbIWG+WnYDXU3v/2zMtAvuzZ/ed00Ei6on975FhBfzrg==" + }, + "@octokit/types": { + "version": "13.10.0", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-13.10.0.tgz", + "integrity": "sha512-ifLaO34EbbPj0Xgro4G5lP5asESjwHracYJvVaPIyXMuiuXLlhic3S47cBdTb+jfODkTE5YtGCLt3Ay3+J97sA==", + "requires": { + "@octokit/openapi-types": "^24.2.0" + } + } + } + }, + "@octokit/request": { + "version": "9.2.4", + "resolved": "https://registry.npmjs.org/@octokit/request/-/request-9.2.4.tgz", + "integrity": "sha512-q8ybdytBmxa6KogWlNa818r0k1wlqzNC+yNkcQDECHvQo8Vmstrg18JwqJHdJdUiHD2sjlwBgSm9kHkOKe2iyA==", + "requires": { + "@octokit/endpoint": "^10.1.4", + "@octokit/request-error": "^6.1.8", + "@octokit/types": "^14.0.0", + "fast-content-type-parse": "^2.0.0", + "universal-user-agent": "^7.0.2" + } + }, + "@octokit/request-error": { + "version": "6.1.8", + "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-6.1.8.tgz", + "integrity": "sha512-WEi/R0Jmq+IJKydWlKDmryPcmdYSVjL3ekaiEL1L9eo1sUnqMJ+grqmC9cjk7CA7+b2/T397tO5d8YLOH3qYpQ==", + "requires": { + "@octokit/types": "^14.0.0" + } + }, + "@octokit/rest": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-21.1.1.tgz", + "integrity": "sha512-sTQV7va0IUVZcntzy1q3QqPm/r8rWtDCqpRAmb8eXXnKkjoQEtFe3Nt5GTVsHft+R6jJoHeSiVLcgcvhtue/rg==", + "requires": { + "@octokit/core": "^6.1.4", + "@octokit/plugin-paginate-rest": "^11.4.2", + "@octokit/plugin-request-log": "^5.3.1", + "@octokit/plugin-rest-endpoint-methods": "^13.3.0" + } + }, + "@octokit/types": { + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-14.1.0.tgz", + "integrity": "sha512-1y6DgTy8Jomcpu33N+p5w58l6xyt55Ar2I91RPiIA0xCJBXyUAhXCcmZaDWSANiha7R9a6qJJ2CRomGPZ6f46g==", + "requires": { + "@octokit/openapi-types": "^25.1.0" + } + }, "@pkgjs/parseargs": { "version": "0.11.0", "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", @@ -6752,12 +6944,6 @@ "@types/node": "*" } }, - "@ungap/promise-all-settled": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz", - "integrity": "sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==", - "dev": true - }, "@vscode/extension-telemetry": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/@vscode/extension-telemetry/-/extension-telemetry-1.2.0.tgz", @@ -7126,12 +7312,6 @@ "fast-deep-equal": "^3.1.3" } }, - "ansi-colors": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", - "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", - "dev": true - }, "ansi-regex": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", @@ -7147,16 +7327,6 @@ "color-convert": "^2.0.1" } }, - "anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "dev": true, - "requires": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - } - }, "argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", @@ -7204,6 +7374,11 @@ "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", "dev": true }, + "before-after-hook": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-3.0.2.tgz", + "integrity": "sha512-Nik3Sc0ncrMK4UUdXQmAnRtzmNQTAAXmXIopizwZ1W1t8QmfJj+zL4OA2I7XPTPW5z5TDqv4hRo/JzouDJnX3A==" + }, "big-integer": { "version": "1.6.51", "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.51.tgz", @@ -7220,12 +7395,6 @@ "chainsaw": "~0.1.0" } }, - "binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "dev": true - }, "bl": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", @@ -7474,30 +7643,12 @@ } }, "chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", + "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", "dev": true, "requires": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "fsevents": "~2.3.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "dependencies": { - "glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "requires": { - "is-glob": "^4.0.1" - } - } + "readdirp": "^4.0.1" } }, "chownr": { @@ -7539,13 +7690,13 @@ } }, "cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", "dev": true, "requires": { "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", + "strip-ansi": "^6.0.1", "wrap-ansi": "^7.0.0" } }, @@ -7726,9 +7877,9 @@ "optional": true }, "diff": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", - "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-7.0.0.tgz", + "integrity": "sha512-PJWHUb1RFevKCwaFA9RlG5tCd+FO5iRh9A8HEtkmBH2Li03iJriB6m6JIN4rGz3K3JLawI7/veA1xzRKP6ISBw==", "dev": true }, "dir-glob": { @@ -7968,6 +8119,11 @@ "dev": true, "optional": true }, + "fast-content-type-parse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fast-content-type-parse/-/fast-content-type-parse-2.0.1.tgz", + "integrity": "sha512-nGqtvLrj5w0naR6tDPfB4cUmYCqouzyQiz6C5y/LtcDllJdrcc6WaWW6iXyIIOErTa/XRybj28aasdn4LkVk6Q==" + }, "fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", @@ -8112,13 +8268,6 @@ "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", "dev": true }, - "fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, - "optional": true - }, "fstream": { "version": "1.0.12", "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.12.tgz", @@ -8283,12 +8432,6 @@ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" }, - "growl": { - "version": "1.10.5", - "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", - "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", - "dev": true - }, "has": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", @@ -8465,15 +8608,6 @@ "integrity": "sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==", "dev": true }, - "is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "requires": { - "binary-extensions": "^2.0.0" - } - }, "is-core-module": { "version": "2.12.1", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.1.tgz", @@ -8528,6 +8662,12 @@ "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" }, + "is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true + }, "is-plain-obj": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", @@ -8619,9 +8759,9 @@ "dev": true }, "js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", + "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", "dev": true, "requires": { "argparse": "^2.0.1" @@ -8871,9 +9011,9 @@ "dev": true }, "minipass": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", - "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", "dev": true }, "mkdirp": { @@ -8893,96 +9033,65 @@ "optional": true }, "mocha": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-9.2.2.tgz", - "integrity": "sha512-L6XC3EdwT6YrIk0yXpavvLkn8h+EU+Y5UcCHKECyMbdUIxyMuZj4bX4U9e1nvnvUUvQVsV2VHQr5zLdcUkhW/g==", - "dev": true, - "requires": { - "@ungap/promise-all-settled": "1.1.2", - "ansi-colors": "4.1.1", - "browser-stdout": "1.3.1", - "chokidar": "3.5.3", - "debug": "4.3.3", - "diff": "5.0.0", - "escape-string-regexp": "4.0.0", - "find-up": "5.0.0", - "glob": "7.2.0", - "growl": "1.10.5", - "he": "1.2.0", - "js-yaml": "4.1.0", - "log-symbols": "4.1.0", - "minimatch": "4.2.1", - "ms": "2.1.3", - "nanoid": "3.3.1", - "serialize-javascript": "6.0.0", - "strip-json-comments": "3.1.1", - "supports-color": "8.1.1", - "which": "2.0.2", - "workerpool": "6.2.0", - "yargs": "16.2.0", - "yargs-parser": "20.2.4", - "yargs-unparser": "2.0.0" + "version": "11.7.5", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-11.7.5.tgz", + "integrity": "sha512-mTT6RgopEYABzXWFx+GcJ+ZQ32kp4fMf0xvpZIIfSq9Z8lC/++MtcCnQ9t5FP2veYEP95FIYSvW+U9fV4xrlig==", + "dev": true, + "requires": { + "browser-stdout": "^1.3.1", + "chokidar": "^4.0.1", + "debug": "^4.3.5", + "diff": "^7.0.0", + "escape-string-regexp": "^4.0.0", + "find-up": "^5.0.0", + "glob": "^10.4.5", + "he": "^1.2.0", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", + "log-symbols": "^4.1.0", + "minimatch": "^9.0.5", + "ms": "^2.1.3", + "picocolors": "^1.1.1", + "serialize-javascript": "^6.0.2", + "strip-json-comments": "^3.1.1", + "supports-color": "^8.1.1", + "workerpool": "^9.2.0", + "yargs": "^17.7.2", + "yargs-parser": "^21.1.1", + "yargs-unparser": "^2.0.0" }, "dependencies": { - "brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "debug": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", - "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "glob": { + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz", + "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==", "dev": true, "requires": { - "ms": "2.1.2" - }, - "dependencies": { - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - } + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" } }, - "glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "jackspeak": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", "dev": true, "requires": { - "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" - }, - "dependencies": { - "minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - } + "@isaacs/cliui": "^8.0.2", + "@pkgjs/parseargs": "^0.11.0" } }, "minimatch": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-4.2.1.tgz", - "integrity": "sha512-9Uq1ChtSZO+Mxa/CL1eGizn2vRn3MlLgzhT0Iz8zaY8NdvxvB0d5QdPFmCKf7JKA9Lerx5vRrnwO03jsSfGG9g==", + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "dev": true, "requires": { - "brace-expansion": "^1.1.7" + "brace-expansion": "^2.0.1" } }, "ms": { @@ -8990,15 +9099,6 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "dev": true - }, - "serialize-javascript": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", - "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", - "dev": true, - "requires": { - "randombytes": "^2.1.0" - } } } }, @@ -9040,12 +9140,6 @@ "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", "dev": true }, - "nanoid": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.1.tgz", - "integrity": "sha512-n6Vs/3KGyxPQd6uO0eH4Bv0ojGSUvuLlIHtC3Y0kEO23YRge8H9x1GCzLn28YX0H66pMkxuaeESFq4tKISKwdw==", - "dev": true - }, "napi-build-utils": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz", @@ -9247,6 +9341,12 @@ "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", "dev": true }, + "package-json-from-dist": { + "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 + }, "pako": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", @@ -9314,19 +9414,19 @@ "dev": true }, "path-scurry": { - "version": "1.10.1", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.1.tgz", - "integrity": "sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", "dev": true, "requires": { - "lru-cache": "^9.1.1 || ^10.0.0", + "lru-cache": "^10.2.0", "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" }, "dependencies": { "lru-cache": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.1.0.tgz", - "integrity": "sha512-/1clY/ui8CzjKFyjdvwPWJUYKiFVXG2I2cY0ssG7h4+hwk+XOIX7ZSG9Q7TW8TW3Kp3BUSqgFWBLgL4PJ+Blag==", + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", "dev": true } } @@ -9343,9 +9443,9 @@ "dev": true }, "picocolors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", - "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", "dev": true }, "picomatch": { @@ -9526,13 +9626,10 @@ } }, "readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, - "requires": { - "picomatch": "^2.2.1" - } + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", + "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", + "dev": true }, "rechoir": { "version": "0.7.1", @@ -10280,9 +10377,9 @@ "dev": true }, "js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "version": "3.14.2", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.2.tgz", + "integrity": "sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==", "dev": true, "requires": { "argparse": "^1.0.7", @@ -10375,6 +10472,11 @@ "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==", "dev": true }, + "universal-user-agent": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-7.0.3.tgz", + "integrity": "sha512-TmnEAEAsBJVZM/AADELsK76llnwcf9vMKuPz8JflO1frO8Lchitr0fNaN9d+Ap0BjKtqWqd/J17qeDnXh8CL2A==" + }, "universalify": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", @@ -10686,9 +10788,9 @@ "dev": true }, "workerpool": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.0.tgz", - "integrity": "sha512-Rsk5qQHJ9eowMH28Jwhe8HEbmdYDX4lwoMWshiCXugjtHqMD9ZbiqSDLxcsfdqsETPzVUtX5s1Z5kStiIM6l4A==", + "version": "9.3.4", + "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-9.3.4.tgz", + "integrity": "sha512-TmPRQYYSAnnDiEB0P/Ytip7bFGvqnSU6I2BcuSw7Hx+JSg/DsUi5ebYfc8GYaSdpuvOcEs6dXxPurOYpe9QFwg==", "dev": true }, "wrap-ansi": { @@ -10761,24 +10863,24 @@ "dev": true }, "yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", "dev": true, "requires": { - "cliui": "^7.0.2", + "cliui": "^8.0.1", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", - "string-width": "^4.2.0", + "string-width": "^4.2.3", "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" + "yargs-parser": "^21.1.1" } }, "yargs-parser": { - "version": "20.2.4", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", - "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", "dev": true }, "yargs-unparser": { diff --git a/package.json b/package.json index ce44199d..92fb23a6 100644 --- a/package.json +++ b/package.json @@ -1101,7 +1101,7 @@ "@vscode/test-electron": "^2.4.1", "copy-webpack-plugin": "^11.0.0", "glob": "^7.2.3", - "mocha": "^9.2.2", + "mocha": "^11.7.5", "ts-loader": "^9.4.2", "tslint": "^6.1.3", "typescript": "^4.9.4", From d8f314830f252105c74de2d23a0a95d116cb0d19 Mon Sep 17 00:00:00 2001 From: yezhu6 <92571997+yezhu6@users.noreply.github.com> Date: Wed, 24 Dec 2025 09:25:06 +0800 Subject: [PATCH 262/352] Add tool is into the java upgrade prompts (#951) Co-authored-by: Miller Wang <69189193+wangmingliang-ms@users.noreply.github.com> --- src/upgrade/utility.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/upgrade/utility.ts b/src/upgrade/utility.ts index dd1c87bf..9db7e829 100644 --- a/src/upgrade/utility.ts +++ b/src/upgrade/utility.ts @@ -95,15 +95,15 @@ export function buildFixPrompt(issue: UpgradeIssue): string { switch (reason) { case UpgradeReason.JRE_TOO_OLD: { const { suggestedVersion: { name: suggestedVersionName } } = issue; - return `upgrade java runtime to the LTS version ${suggestedVersionName} using java upgrade tools`; + return `upgrade java runtime to the LTS version ${suggestedVersionName} using java upgrade tools by invoking #generate_upgrade_plan`; } case UpgradeReason.END_OF_LIFE: case UpgradeReason.DEPRECATED: { const { suggestedVersion: { name: suggestedVersionName } } = issue; - return `upgrade ${packageDisplayName} to ${suggestedVersionName} using java upgrade tools`; + return `upgrade ${packageDisplayName} to ${suggestedVersionName} using java upgrade tools by invoking #generate_upgrade_plan`; } case UpgradeReason.CVE: { - return `fix all critical and high-severity CVE vulnerabilities in this project`; + return `fix all critical and high-severity CVE vulnerabilities in this project by invoking #validate_cves_for_java`; } } } From 8b410fb1556f8347acbbe1cf65e2e79c78b42c74 Mon Sep 17 00:00:00 2001 From: Ray Sun <202210574+FluoriteCafe-work@users.noreply.github.com> Date: Wed, 24 Dec 2025 09:52:45 +0800 Subject: [PATCH 263/352] fix: correct Spring Framework suggested version (#954) Co-authored-by: Changyong Gong --- src/upgrade/dependency.metadata.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/upgrade/dependency.metadata.ts b/src/upgrade/dependency.metadata.ts index 8831f5f5..f676f72a 100644 --- a/src/upgrade/dependency.metadata.ts +++ b/src/upgrade/dependency.metadata.ts @@ -60,7 +60,7 @@ const DEPENDENCIES_TO_SCAN: DependencyCheckMetadata = { "4.3.x": "2020-12", }, "suggestedVersion": { - "name": "3.5", + "name": "6.2", "description": "latest stable release", }, }, From 6a9c60a1401c9f6c594b21f22b3b5cfa5ce6042c Mon Sep 17 00:00:00 2001 From: Hanxiao Liu Date: Wed, 24 Dec 2025 13:49:27 +0800 Subject: [PATCH 264/352] fix: only show dependency checkup for maven/gradle projects (#953) * fix: only show dependency checkup for maven/gradle projects * fix: fix lint issues --- src/upgrade/upgradeManager.ts | 25 +++++++++++++++++++++---- src/views/containerNode.ts | 2 +- 2 files changed, 22 insertions(+), 5 deletions(-) diff --git a/src/upgrade/upgradeManager.ts b/src/upgrade/upgradeManager.ts index 87fe3372..c61c786b 100644 --- a/src/upgrade/upgradeManager.ts +++ b/src/upgrade/upgradeManager.ts @@ -6,12 +6,14 @@ import { commands, type ExtensionContext, workspace, type WorkspaceFolder } from import { Jdtls } from "../java/jdtls"; import { languageServerApiManager } from "../languageServerApi/languageServerApiManager"; import { ExtensionName } from "../constants"; -import { instrumentOperation, instrumentOperationAsVsCodeCommand } from "vscode-extension-telemetry-wrapper"; +import { instrumentOperation, instrumentOperationAsVsCodeCommand, sendInfo } from "vscode-extension-telemetry-wrapper"; import { Commands } from "../commands"; import notificationManager from "./display/notificationManager"; import { Settings } from "../settings"; import assessmentManager from "./assessmentManager"; import { checkOrInstallAppModExtensionForUpgrade, checkOrPopupToInstallAppModExtensionForModernization } from "./utility"; +import { NodeKind } from "../../extension.bundle"; +import { ContainerPath } from "../views/containerNode"; const DEFAULT_UPGRADE_PROMPT = "Upgrade Java project dependency to latest version."; @@ -55,12 +57,27 @@ class UpgradeManager { private static async runDependencyCheckup(folder: WorkspaceFolder) { return (instrumentOperation("java.dependency.runDependencyCheckup", async (_operationId: string) => { - if (!await languageServerApiManager.ready()) { - return; + if (!(await languageServerApiManager.ready())) { + sendInfo(_operationId, { "skipReason": "languageServerNotReady" }); + return; } + const projectData = await Jdtls.getPackageData({ + kind: NodeKind.Project, + projectUri: folder.uri.toString(), + }); + const isMavenGradleProject = projectData.some( + (dep) => dep.kind === NodeKind.Container && + (dep.path?.startsWith(ContainerPath.Maven) || dep.path?.startsWith(ContainerPath.Gradle)) + ); + if (!isMavenGradleProject) { + sendInfo(_operationId, { "skipReason": "notMavenGradleProject" }); + return; + } + const hasJavaError: boolean = await Jdtls.checkImportStatus(); if (hasJavaError) { - return; + sendInfo(_operationId, { "skipReason": "hasJavaError" }); + return; } const uri = folder.uri.toString(); diff --git a/src/views/containerNode.ts b/src/views/containerNode.ts index a8cbd6c7..8ae3e83b 100644 --- a/src/views/containerNode.ts +++ b/src/views/containerNode.ts @@ -83,7 +83,7 @@ export enum ContainerType { Unknown = "", } -const enum ContainerPath { +export const enum ContainerPath { JRE = "org.eclipse.jdt.launching.JRE_CONTAINER", Maven = "org.eclipse.m2e.MAVEN2_CLASSPATH_CONTAINER", Gradle = "org.eclipse.buildship.core.gradleclasspathcontainer", From 4fe981d7b586e36eabc992aa8b8bd04cd86a7799 Mon Sep 17 00:00:00 2001 From: yezhu6 <92571997+yezhu6@users.noreply.github.com> Date: Fri, 26 Dec 2025 15:14:36 +0800 Subject: [PATCH 265/352] Get the direct dependencies while checking for promotion (#952) * get the direct dependencies * fix comments * Put the projectype checking in the getDirectDependencies && fix tslint errors * Move getDirectDeps into upgradeManager and just check the dependencies in the assessmentManager * update package version * Defer the upgrade scan * fix comments * Fix tslint errors --- package.json | 2 +- src/syncHandler.ts | 2 +- src/upgrade/assessmentManager.ts | 231 ++++++++++++++++++--- src/upgrade/display/notificationManager.ts | 21 +- src/upgrade/upgradeManager.ts | 73 ++++--- 5 files changed, 257 insertions(+), 72 deletions(-) diff --git a/package.json b/package.json index 92fb23a6..4258bbd4 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "vscode-java-dependency", "displayName": "Project Manager for Java", "description": "%description%", - "version": "0.26.5", + "version": "0.27.0", "publisher": "vscjava", "preview": false, "aiKey": "5c642b22-e845-4400-badb-3f8509a70777", diff --git a/src/syncHandler.ts b/src/syncHandler.ts index 40315fa0..cbdd05eb 100644 --- a/src/syncHandler.ts +++ b/src/syncHandler.ts @@ -47,7 +47,7 @@ class SyncHandler implements Disposable { this.disposables.push(workspace.onDidChangeWorkspaceFolders(() => { this.refresh(); - upgradeManager.scan(); + setImmediate(() => upgradeManager.scan()); // Deferred })); try { diff --git a/src/upgrade/assessmentManager.ts b/src/upgrade/assessmentManager.ts index 6b0ba95e..3a3c60fb 100644 --- a/src/upgrade/assessmentManager.ts +++ b/src/upgrade/assessmentManager.ts @@ -1,7 +1,11 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT license. +import * as fs from 'fs'; import * as semver from 'semver'; +import { globby } from 'globby'; + +import { Uri } from 'vscode'; import { Jdtls } from "../java/jdtls"; import { NodeKind, type INodeData } from "../java/nodeData"; import { type DependencyCheckItem, type UpgradeIssue, type PackageDescription, UpgradeReason } from "./type"; @@ -11,6 +15,7 @@ import { buildPackageId } from './utility'; import metadataManager from './metadataManager'; import { sendInfo } from 'vscode-extension-telemetry-wrapper'; import { batchGetCVEIssues } from './cve'; +import { ContainerPath } from '../views/containerNode'; function packageNodeToDescription(node: INodeData): PackageDescription | null { const version = node.metaData?.["maven.version"]; @@ -143,50 +148,187 @@ async function getDependencyIssues(dependencies: PackageDescription[]): Promise< return issues; } -async function getProjectIssues(projectNode: INodeData): Promise { - const issues: UpgradeIssue[] = []; - const dependencies = await getAllDependencies(projectNode); - issues.push(...await getCVEIssues(dependencies)); - issues.push(...getJavaIssues(projectNode)); - issues.push(...await getDependencyIssues(dependencies)); +async function getWorkspaceIssues(projectDeps: {projectNode: INodeData, dependencies: PackageDescription[]}[]): Promise { + const issues: UpgradeIssue[] = []; + const dependencyMap: Map = new Map(); + for (const { projectNode, dependencies } of projectDeps) { + issues.push(...getJavaIssues(projectNode)); + for (const dep of dependencies) { + const key = `${dep.groupId}:${dep.artifactId}:${dep.version ?? ""}`; + if (!dependencyMap.has(key)) { + dependencyMap.set(key, dep); + } + } + } + const uniqueDependencies = Array.from(dependencyMap.values()); + issues.push(...await getCVEIssues(uniqueDependencies)); + issues.push(...await getDependencyIssues(uniqueDependencies)); return issues; +} +/** + * Find all pom.xml files in a directory using glob + */ +async function findAllPomFiles(dir: string): Promise { + try { + return await globby('**/pom.xml', { + cwd: dir, + absolute: true, + ignore: ['**/node_modules/**', '**/target/**', '**/.git/**', '**/.idea/**', '**/.vscode/**'] + }); + } catch { + return []; + } } -async function getWorkspaceIssues(workspaceFolderUri: string): Promise { - const projects = await Jdtls.getProjects(workspaceFolderUri); - const projectsIssues = await Promise.allSettled(projects.map(async (projectNode) => { - const issues = await getProjectIssues(projectNode); - return issues; - })); +/** + * Parse dependencies from a single pom.xml file + */ +function parseDependenciesFromSinglePom(pomPath: string): Set { + // TODO : Use a proper XML parser if needed + const directDeps = new Set(); + try { + const pomContent = fs.readFileSync(pomPath, 'utf-8'); + + // Extract dependencies from section (not inside ) + // First, remove dependencyManagement sections to avoid including managed deps + const withoutDepMgmt = pomContent.replace(/[\s\S]*?<\/dependencyManagement>/g, ''); - const workspaceIssues = projectsIssues.map(x => { - if (x.status === "fulfilled") { - return x.value; + // Match blocks and extract groupId and artifactId + const dependencyRegex = /\s*([^<]+)<\/groupId>\s*([^<]+)<\/artifactId>/g; + let match = dependencyRegex.exec(withoutDepMgmt); + while (match !== null) { + const groupId = match[1].trim(); + const artifactId = match[2].trim(); + // Skip property references like ${project.groupId} + if (!groupId.includes('${') && !artifactId.includes('${')) { + directDeps.add(`${groupId}:${artifactId}`); + } + match = dependencyRegex.exec(withoutDepMgmt); } + } catch { + // If we can't read the pom, return empty set + } + return directDeps; +} - sendInfo("", { - operationName: "java.dependency.assessmentManager.getWorkspaceIssues", +/** + * Parse direct dependencies from all pom.xml files in the project. + * Finds all pom.xml files starting from the project root and parses them to collect dependencies. + */ +async function parseDirectDependenciesFromPom(projectPath: string): Promise> { + const directDeps = new Set(); + + // Find all pom.xml files in the project starting from the project root + const allPomFiles = await findAllPomFiles(projectPath); + + // Parse each pom.xml and collect dependencies + for (const pom of allPomFiles) { + const deps = parseDependenciesFromSinglePom(pom); + deps.forEach(dep => directDeps.add(dep)); + } + + return directDeps; +} + +/** + * Find all Gradle build files in a directory using glob + */ +async function findAllGradleFiles(dir: string): Promise { + try { + return await globby('**/{build.gradle,build.gradle.kts}', { + cwd: dir, + absolute: true, + ignore: ['**/node_modules/**', '**/build/**', '**/.git/**', '**/.idea/**', '**/.vscode/**', '**/.gradle/**'] }); + } catch { return []; - }).flat(); + } +} + +/** + * Parse dependencies from a single Gradle build file + */ +function parseDependenciesFromSingleGradle(gradlePath: string): Set { + const directDeps = new Set(); + try { + const gradleContent = fs.readFileSync(gradlePath, 'utf-8'); + + // Match common dependency configurations: + // implementation 'group:artifact:version' + // implementation "group:artifact:version" + // api 'group:artifact:version' + // compileOnly, runtimeOnly, testImplementation, etc. + const shortFormRegex = /(?:implementation|api|compile|compileOnly|runtimeOnly|testImplementation|testCompileOnly|testRuntimeOnly)\s*\(?['"]([^:'"]+):([^:'"]+)(?::[^'"]*)?['"]\)?/g; + let match = shortFormRegex.exec(gradleContent); + while (match !== null) { + const groupId = match[1].trim(); + const artifactId = match[2].trim(); + if (!groupId.includes('$') && !artifactId.includes('$')) { + directDeps.add(`${groupId}:${artifactId}`); + } + match = shortFormRegex.exec(gradleContent); + } + + // Match map notation: implementation group: 'x', name: 'y', version: 'z' + const mapFormRegex = /(?:implementation|api|compile|compileOnly|runtimeOnly|testImplementation|testCompileOnly|testRuntimeOnly)\s*\(?group:\s*['"]([^'"]+)['"]\s*,\s*name:\s*['"]([^'"]+)['"]/g; + match = mapFormRegex.exec(gradleContent); + while (match !== null) { + const groupId = match[1].trim(); + const artifactId = match[2].trim(); + if (!groupId.includes('$') && !artifactId.includes('$')) { + directDeps.add(`${groupId}:${artifactId}`); + } + match = mapFormRegex.exec(gradleContent); + } + } catch { + // If we can't read the gradle file, return empty set + } + return directDeps; +} + +/** + * Parse direct dependencies from all Gradle build files in the project. + * Finds all build.gradle and build.gradle.kts files and parses them to collect dependencies. + */ +async function parseDirectDependenciesFromGradle(projectPath: string): Promise> { + const directDeps = new Set(); + + // Find all Gradle build files in the project + const allGradleFiles = await findAllGradleFiles(projectPath); + + // Parse each gradle file and collect dependencies + for (const gradleFile of allGradleFiles) { + const deps = parseDependenciesFromSingleGradle(gradleFile); + deps.forEach(dep => directDeps.add(dep)); + } - return workspaceIssues; + return directDeps; } -async function getAllDependencies(projectNode: INodeData): Promise { +export async function getDirectDependencies(projectNode: INodeData): Promise { const projectStructureData = await Jdtls.getPackageData({ kind: NodeKind.Project, projectUri: projectNode.uri }); - const packageContainers = projectStructureData.filter(x => x.kind === NodeKind.Container); + // Only include Maven or Gradle containers (not JRE or other containers) + const dependencyContainers = projectStructureData.filter(x => + x.kind === NodeKind.Container && + (x.path?.startsWith(ContainerPath.Maven) || x.path?.startsWith(ContainerPath.Gradle)) + ); + + if (dependencyContainers.length === 0) { + return []; + } const allPackages = await Promise.allSettled( - packageContainers.map(async (packageContainer) => { + dependencyContainers.map(async (packageContainer) => { const packageNodes = await Jdtls.getPackageData({ kind: NodeKind.Container, projectUri: projectNode.uri, path: packageContainer.path, }); - return packageNodes.map(packageNodeToDescription).filter((x): x is PackageDescription => Boolean(x)); + return packageNodes + .map(packageNodeToDescription) + .filter((x): x is PackageDescription => Boolean(x)); }) ); @@ -194,11 +336,50 @@ async function getAllDependencies(projectNode: INodeData): Promise 0) { sendInfo("", { - operationName: "java.dependency.assessmentManager.getAllDependencies.rejected", + operationName: "java.dependency.assessmentManager.getDirectDependencies.rejected", failedPackageCount: String(failedPackageCount), }); } - return fulfilled.map(x => x.value).flat(); + + let dependencies = fulfilled.map(x => x.value).flat(); + + if (!dependencies || dependencies.length === 0) { + sendInfo("", { + operationName: "java.dependency.assessmentManager.getDirectDependencies.noDependencyInfo" + }); + return []; + } + + // Determine build type from dependency containers + const isMaven = dependencyContainers.some(x => x.path?.startsWith(ContainerPath.Maven)); + // Get direct dependency identifiers from build files + let directDependencyIds: Set | null = null; + if (projectNode.uri && dependencyContainers.length > 0) { + try { + const projectPath = Uri.parse(projectNode.uri).fsPath; + if (isMaven) { + directDependencyIds = await parseDirectDependenciesFromPom(projectPath); + } else { + directDependencyIds = await parseDirectDependenciesFromGradle(projectPath); + } + } catch { + // Ignore errors + } + } + + if (!directDependencyIds || directDependencyIds.size === 0) { + sendInfo("", { + operationName: "java.dependency.assessmentManager.getDirectDependencies.noDirectDependencyInfo" + }); + // TODO: fallback to return all dependencies if we cannot parse direct dependencies or just return empty? + return dependencies; + } + // Filter to only direct dependencies if we have build file info + dependencies = dependencies.filter(pkg => + directDependencyIds!.has(`${pkg.groupId}:${pkg.artifactId}`) + ); + + return dependencies; } async function getCVEIssues(dependencies: PackageDescription[]): Promise { diff --git a/src/upgrade/display/notificationManager.ts b/src/upgrade/display/notificationManager.ts index 3061e179..524184b5 100644 --- a/src/upgrade/display/notificationManager.ts +++ b/src/upgrade/display/notificationManager.ts @@ -41,7 +41,16 @@ class NotificationManager implements IUpgradeIssuesRenderer { if (issues.length === 0) { return; } - const issue = issues[0]; + + // Filter to only CVE issues and cast to CveUpgradeIssue[] + const cveIssues = issues.filter( + (i): i is CveUpgradeIssue => i.reason === UpgradeReason.CVE + ); + const nonCVEIssues = issues.filter( + (i) => i.reason !== UpgradeReason.CVE + ); + const hasCVEIssue = cveIssues.length > 0; + const issue = hasCVEIssue ? cveIssues[0] : nonCVEIssues[0]; if (!this.shouldShow()) { return; @@ -56,12 +65,8 @@ class NotificationManager implements IUpgradeIssuesRenderer { const prompt = buildFixPrompt(issue); let notificationMessage = ""; - let cveIssues: CveUpgradeIssue[] = []; - if (issue.reason === UpgradeReason.CVE) { - // Filter to only CVE issues and cast to CveUpgradeIssue[] - cveIssues = issues.filter( - (i): i is CveUpgradeIssue => i.reason === UpgradeReason.CVE - ); + + if (hasCVEIssue) { notificationMessage = buildCVENotificationMessage(cveIssues, hasExtension); } else { notificationMessage = buildNotificationMessage(issue, hasExtension); @@ -72,7 +77,7 @@ class NotificationManager implements IUpgradeIssuesRenderer { operationName: "java.dependency.upgradeNotification.show", }); - const buttons = issue.reason === UpgradeReason.CVE + const buttons = hasCVEIssue ? [fixCVEButtonText, BUTTON_TEXT_NOT_NOW] : [upgradeButtonText, BUTTON_TEXT_NOT_NOW]; diff --git a/src/upgrade/upgradeManager.ts b/src/upgrade/upgradeManager.ts index c61c786b..155eda17 100644 --- a/src/upgrade/upgradeManager.ts +++ b/src/upgrade/upgradeManager.ts @@ -10,10 +10,8 @@ import { instrumentOperation, instrumentOperationAsVsCodeCommand, sendInfo } fro import { Commands } from "../commands"; import notificationManager from "./display/notificationManager"; import { Settings } from "../settings"; -import assessmentManager from "./assessmentManager"; +import assessmentManager, { getDirectDependencies } from "./assessmentManager"; import { checkOrInstallAppModExtensionForUpgrade, checkOrPopupToInstallAppModExtensionForModernization } from "./utility"; -import { NodeKind } from "../../extension.bundle"; -import { ContainerPath } from "../views/containerNode"; const DEFAULT_UPGRADE_PROMPT = "Upgrade Java project dependency to latest version."; @@ -42,7 +40,8 @@ class UpgradeManager { await commands.executeCommand("workbench.view.extension.azureJavaMigrationExplorer"); })); - UpgradeManager.scan(); + // Defer the expensive scan operation to not block extension activation + setImmediate(() => UpgradeManager.scan()); } public static scan() { @@ -55,40 +54,40 @@ class UpgradeManager { } private static async runDependencyCheckup(folder: WorkspaceFolder) { - return (instrumentOperation("java.dependency.runDependencyCheckup", - async (_operationId: string) => { - if (!(await languageServerApiManager.ready())) { - sendInfo(_operationId, { "skipReason": "languageServerNotReady" }); - return; - } - const projectData = await Jdtls.getPackageData({ - kind: NodeKind.Project, - projectUri: folder.uri.toString(), - }); - const isMavenGradleProject = projectData.some( - (dep) => dep.kind === NodeKind.Container && - (dep.path?.startsWith(ContainerPath.Maven) || dep.path?.startsWith(ContainerPath.Gradle)) - ); - if (!isMavenGradleProject) { - sendInfo(_operationId, { "skipReason": "notMavenGradleProject" }); - return; - } - - const hasJavaError: boolean = await Jdtls.checkImportStatus(); - if (hasJavaError) { - sendInfo(_operationId, { "skipReason": "hasJavaError" }); - return; - } - - const uri = folder.uri.toString(); - const workspaceIssues = await assessmentManager.getWorkspaceIssues(uri); - - if (workspaceIssues.length > 0) { - // only show one issue in notifications - notificationManager.render(workspaceIssues); - } + return instrumentOperation("java.dependency.runDependencyCheckup", async (_operationId: string) => { + if (!(await languageServerApiManager.ready())) { + sendInfo(_operationId, { skipReason: "languageServerNotReady" }); + return; } - ))(); + + const hasJavaError: boolean = await Jdtls.checkImportStatus(); + if (hasJavaError) { + sendInfo(_operationId, { skipReason: "hasJavaError" }); + return; + } + + const projects = await Jdtls.getProjects(folder.uri.toString()); + const projectDirectDepsResults = await Promise.allSettled( + projects.map(async (projectNode) => ({ + projectNode, + dependencies: await getDirectDependencies(projectNode), + })) + ); + + const allProjectDirectDeps = projectDirectDepsResults.flatMap(result => + result.status === "fulfilled" ? [result.value] : [] + ); + + if (allProjectDirectDeps.every((x) => x.dependencies.length === 0)) { + sendInfo(_operationId, { skipReason: "notMavenGradleProject" }); + return; + } + + const workspaceIssues = await assessmentManager.getWorkspaceIssues(allProjectDirectDeps); + if (workspaceIssues.length > 0) { + notificationManager.render(workspaceIssues); + } + })(); } } From b7ecf2dda2f01dab258d0efda7f28bfcb7c3a3cc Mon Sep 17 00:00:00 2001 From: Ray Sun <202210574+FluoriteCafe-work@users.noreply.github.com> Date: Mon, 5 Jan 2026 16:16:52 +0800 Subject: [PATCH 266/352] docs: add setting item `java.dependency.enableDependencyCheckup` (#958) --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 805b8e76..341985ff 100644 --- a/README.md +++ b/README.md @@ -70,6 +70,7 @@ You can tell that the glob pattern is supported. And here's more - you can incl | `java.dependency.autoRefresh` | Specify whether to automatically sync the change from editor to the Java Projects explorer. | `true` | | `java.dependency.refreshDelay` | The delay time (ms) the auto refresh is invoked when changes are detected. | `2000ms` | | `java.dependency.packagePresentation` | Specify how to display the package. Supported values are: `flat`, `hierarchical`.| `flat` | +| `java.dependency.enableDependencyCheckup` | Show reminders when your Java runtimes or dependencies need an upgrade. | `true` | | `java.project.exportJar.targetPath` | The output path of export jar. When this setting is **empty** , a file explorer will pop up to let the user select the output location.| `${workspaceFolder}/${workspaceFolderBasename}.jar` | | `java.project.explorer.showNonJavaResources` | When enabled, the explorer shows non-Java resources. | `true` | From f517e651ae8ff3cffe241cb8baf8814a617135e3 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 22 Jan 2026 10:50:49 +0800 Subject: [PATCH 267/352] chore(deps): Bump lodash from 4.17.21 to 4.17.23 (#960) Bumps [lodash](https://github.com/lodash/lodash) from 4.17.21 to 4.17.23. - [Release notes](https://github.com/lodash/lodash/releases) - [Commits](https://github.com/lodash/lodash/compare/4.17.21...4.17.23) --- updated-dependencies: - dependency-name: lodash dependency-version: 4.17.23 dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 18 +++++++++--------- package.json | 2 +- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/package-lock.json b/package-lock.json index 4f9dac25..bfabf87a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "vscode-java-dependency", - "version": "0.26.5", + "version": "0.27.0", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "vscode-java-dependency", - "version": "0.26.5", + "version": "0.27.0", "license": "MIT", "dependencies": { "@github/copilot-language-server": "^1.388.0", @@ -15,7 +15,7 @@ "fmtr": "^1.1.4", "fs-extra": "^10.1.0", "globby": "^13.1.3", - "lodash": "^4.17.21", + "lodash": "^4.17.23", "minimatch": "^5.1.6", "semver": "^7.3.8", "vscode-extension-telemetry-wrapper": "^0.15.0", @@ -3492,9 +3492,9 @@ } }, "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + "version": "4.17.23", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.23.tgz", + "integrity": "sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w==" }, "node_modules/log-symbols": { "version": "4.1.0", @@ -8884,9 +8884,9 @@ } }, "lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + "version": "4.17.23", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.23.tgz", + "integrity": "sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w==" }, "log-symbols": { "version": "4.1.0", diff --git a/package.json b/package.json index 4258bbd4..c8d44ea6 100644 --- a/package.json +++ b/package.json @@ -1116,7 +1116,7 @@ "fmtr": "^1.1.4", "fs-extra": "^10.1.0", "globby": "^13.1.3", - "lodash": "^4.17.21", + "lodash": "^4.17.23", "minimatch": "^5.1.6", "semver": "^7.3.8", "vscode-extension-telemetry-wrapper": "^0.15.0", From e08bf10b50fe18c9c0c0cd0f16b71afbedf078c0 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 22 Jan 2026 13:14:49 +0800 Subject: [PATCH 268/352] chore(deps-dev): Bump qs from 6.11.2 to 6.14.1 (#957) Bumps [qs](https://github.com/ljharb/qs) from 6.11.2 to 6.14.1. - [Changelog](https://github.com/ljharb/qs/blob/main/CHANGELOG.md) - [Commits](https://github.com/ljharb/qs/compare/v6.11.2...v6.14.1) --- updated-dependencies: - dependency-name: qs dependency-version: 6.14.1 dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Changyong Gong --- package-lock.json | 274 +++++++++++++++++++++++++--------------------- 1 file changed, 150 insertions(+), 124 deletions(-) diff --git a/package-lock.json b/package-lock.json index bfabf87a..7614213d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1617,20 +1617,6 @@ "node": ">=14.16" } }, - "node_modules/call-bind": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.5.tgz", - "integrity": "sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.1", - "set-function-length": "^1.1.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/call-bind-apply-helpers": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", @@ -1643,6 +1629,22 @@ "node": ">= 0.4" } }, + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "dev": true, + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/camelcase": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", @@ -2056,20 +2058,6 @@ "node": ">=10" } }, - "node_modules/define-data-property": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.1.tgz", - "integrity": "sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==", - "dev": true, - "dependencies": { - "get-intrinsic": "^1.2.1", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, "node_modules/delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", @@ -2873,18 +2861,6 @@ "node": ">=8" } }, - "node_modules/has-property-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz", - "integrity": "sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==", - "dev": true, - "dependencies": { - "get-intrinsic": "^1.2.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/has-symbols": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", @@ -3939,10 +3915,13 @@ } }, "node_modules/object-inspect": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", - "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", "dev": true, + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -4396,12 +4375,12 @@ } }, "node_modules/qs": { - "version": "6.11.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.2.tgz", - "integrity": "sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==", + "version": "6.14.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.1.tgz", + "integrity": "sha512-4EK3+xJl8Ts67nLYNwqw/dsFVnCf+qR7RgXSK9jEEm9unao3njwMDdmsdvoKBKHzxd7tCYz5e5M+SnMjdtXGQQ==", "dev": true, "dependencies": { - "side-channel": "^1.0.4" + "side-channel": "^1.1.0" }, "engines": { "node": ">=0.6" @@ -4771,21 +4750,6 @@ "randombytes": "^2.1.0" } }, - "node_modules/set-function-length": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.1.1.tgz", - "integrity": "sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ==", - "dev": true, - "dependencies": { - "define-data-property": "^1.1.1", - "get-intrinsic": "^1.2.1", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, "node_modules/setimmediate": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", @@ -4826,14 +4790,72 @@ } }, "node_modules/side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "dev": true, + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", + "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "dev": true, + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", "dev": true, "dependencies": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "dev": true, + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -7551,17 +7573,6 @@ "responselike": "^3.0.0" } }, - "call-bind": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.5.tgz", - "integrity": "sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==", - "dev": true, - "requires": { - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.1", - "set-function-length": "^1.1.1" - } - }, "call-bind-apply-helpers": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", @@ -7571,6 +7582,16 @@ "function-bind": "^1.1.2" } }, + "call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "dev": true, + "requires": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + } + }, "camelcase": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", @@ -7853,17 +7874,6 @@ "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", "dev": true }, - "define-data-property": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.1.tgz", - "integrity": "sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==", - "dev": true, - "requires": { - "get-intrinsic": "^1.2.1", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.0" - } - }, "delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", @@ -8447,15 +8457,6 @@ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, - "has-property-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz", - "integrity": "sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==", - "dev": true, - "requires": { - "get-intrinsic": "^1.2.2" - } - }, "has-symbols": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", @@ -9215,9 +9216,9 @@ } }, "object-inspect": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", - "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", "dev": true }, "once": { @@ -9551,12 +9552,12 @@ "dev": true }, "qs": { - "version": "6.11.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.2.tgz", - "integrity": "sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==", + "version": "6.14.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.1.tgz", + "integrity": "sha512-4EK3+xJl8Ts67nLYNwqw/dsFVnCf+qR7RgXSK9jEEm9unao3njwMDdmsdvoKBKHzxd7tCYz5e5M+SnMjdtXGQQ==", "dev": true, "requires": { - "side-channel": "^1.0.4" + "side-channel": "^1.1.0" } }, "queue-microtask": { @@ -9806,18 +9807,6 @@ "randombytes": "^2.1.0" } }, - "set-function-length": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.1.1.tgz", - "integrity": "sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ==", - "dev": true, - "requires": { - "define-data-property": "^1.1.1", - "get-intrinsic": "^1.2.1", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.0" - } - }, "setimmediate": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", @@ -9849,14 +9838,51 @@ "dev": true }, "side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "dev": true, + "requires": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + } + }, + "side-channel-list": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", + "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", "dev": true, "requires": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3" + } + }, + "side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "dev": true, + "requires": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + } + }, + "side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "dev": true, + "requires": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" } }, "signal-exit": { From d695e70fbaaad8b1b5a5769502ba3bd767443f9f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 9 Feb 2026 14:45:05 +0800 Subject: [PATCH 269/352] chore(deps-dev): Bump webpack from 5.94.0 to 5.105.0 (#963) Bumps [webpack](https://github.com/webpack/webpack) from 5.94.0 to 5.105.0. - [Release notes](https://github.com/webpack/webpack/releases) - [Changelog](https://github.com/webpack/webpack/blob/main/CHANGELOG.md) - [Commits](https://github.com/webpack/webpack/compare/v5.94.0...v5.105.0) --- updated-dependencies: - dependency-name: webpack dependency-version: 5.105.0 dependency-type: direct:development ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 992 ++++++++++++++++++++-------------------------- package.json | 2 +- 2 files changed, 430 insertions(+), 564 deletions(-) diff --git a/package-lock.json b/package-lock.json index 7614213d..4b57e7dd 100644 --- a/package-lock.json +++ b/package-lock.json @@ -38,7 +38,7 @@ "tslint": "^6.1.3", "typescript": "^4.9.4", "vscode-extension-tester": "^7.0.0", - "webpack": "^5.94.0", + "webpack": "^5.105.0", "webpack-cli": "^4.10.0" }, "engines": { @@ -341,17 +341,13 @@ } }, "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", - "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", "dev": true, "dependencies": { - "@jridgewell/set-array": "^1.2.1", - "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/sourcemap-codec": "^1.5.0", "@jridgewell/trace-mapping": "^0.3.24" - }, - "engines": { - "node": ">=6.0.0" } }, "node_modules/@jridgewell/resolve-uri": { @@ -363,19 +359,10 @@ "node": ">=6.0.0" } }, - "node_modules/@jridgewell/set-array": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", - "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", - "dev": true, - "engines": { - "node": ">=6.0.0" - } - }, "node_modules/@jridgewell/source-map": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz", - "integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==", + "version": "0.3.11", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.11.tgz", + "integrity": "sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==", "dev": true, "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", @@ -383,15 +370,15 @@ } }, "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", - "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", "dev": true }, "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.25", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", - "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", "dev": true, "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", @@ -756,10 +743,30 @@ "node": ">=14.16" } }, + "node_modules/@types/eslint": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-9.6.1.tgz", + "integrity": "sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==", + "dev": true, + "dependencies": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "node_modules/@types/eslint-scope": { + "version": "3.7.7", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz", + "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==", + "dev": true, + "dependencies": { + "@types/eslint": "*", + "@types/estree": "*" + } + }, "node_modules/@types/estree": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", - "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", "dev": true }, "node_modules/@types/fs-extra": { @@ -788,9 +795,9 @@ "dev": true }, "node_modules/@types/json-schema": { - "version": "7.0.12", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.12.tgz", - "integrity": "sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==", + "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 }, "node_modules/@types/lodash": { @@ -1021,148 +1028,148 @@ } }, "node_modules/@webassemblyjs/ast": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.12.1.tgz", - "integrity": "sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.14.1.tgz", + "integrity": "sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==", "dev": true, "dependencies": { - "@webassemblyjs/helper-numbers": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6" + "@webassemblyjs/helper-numbers": "1.13.2", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2" } }, "node_modules/@webassemblyjs/floating-point-hex-parser": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz", - "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz", + "integrity": "sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==", "dev": true }, "node_modules/@webassemblyjs/helper-api-error": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", - "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz", + "integrity": "sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==", "dev": true }, "node_modules/@webassemblyjs/helper-buffer": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.12.1.tgz", - "integrity": "sha512-nzJwQw99DNDKr9BVCOZcLuJJUlqkJh+kVzVl6Fmq/tI5ZtEyWT1KZMyOXltXLZJmDtvLCDgwsyrkohEtopTXCw==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.14.1.tgz", + "integrity": "sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==", "dev": true }, "node_modules/@webassemblyjs/helper-numbers": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", - "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.13.2.tgz", + "integrity": "sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==", "dev": true, "dependencies": { - "@webassemblyjs/floating-point-hex-parser": "1.11.6", - "@webassemblyjs/helper-api-error": "1.11.6", + "@webassemblyjs/floating-point-hex-parser": "1.13.2", + "@webassemblyjs/helper-api-error": "1.13.2", "@xtuc/long": "4.2.2" } }, "node_modules/@webassemblyjs/helper-wasm-bytecode": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", - "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz", + "integrity": "sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==", "dev": true }, "node_modules/@webassemblyjs/helper-wasm-section": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.12.1.tgz", - "integrity": "sha512-Jif4vfB6FJlUlSbgEMHUyk1j234GTNG9dBJ4XJdOySoj518Xj0oGsNi59cUQF4RRMS9ouBUxDDdyBVfPTypa5g==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.14.1.tgz", + "integrity": "sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==", "dev": true, "dependencies": { - "@webassemblyjs/ast": "1.12.1", - "@webassemblyjs/helper-buffer": "1.12.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/wasm-gen": "1.12.1" + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/wasm-gen": "1.14.1" } }, "node_modules/@webassemblyjs/ieee754": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz", - "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.13.2.tgz", + "integrity": "sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==", "dev": true, "dependencies": { "@xtuc/ieee754": "^1.2.0" } }, "node_modules/@webassemblyjs/leb128": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz", - "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.13.2.tgz", + "integrity": "sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==", "dev": true, "dependencies": { "@xtuc/long": "4.2.2" } }, "node_modules/@webassemblyjs/utf8": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz", - "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.13.2.tgz", + "integrity": "sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==", "dev": true }, "node_modules/@webassemblyjs/wasm-edit": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.12.1.tgz", - "integrity": "sha512-1DuwbVvADvS5mGnXbE+c9NfA8QRcZ6iKquqjjmR10k6o+zzsRVesil54DKexiowcFCPdr/Q0qaMgB01+SQ1u6g==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.14.1.tgz", + "integrity": "sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==", "dev": true, "dependencies": { - "@webassemblyjs/ast": "1.12.1", - "@webassemblyjs/helper-buffer": "1.12.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/helper-wasm-section": "1.12.1", - "@webassemblyjs/wasm-gen": "1.12.1", - "@webassemblyjs/wasm-opt": "1.12.1", - "@webassemblyjs/wasm-parser": "1.12.1", - "@webassemblyjs/wast-printer": "1.12.1" + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/helper-wasm-section": "1.14.1", + "@webassemblyjs/wasm-gen": "1.14.1", + "@webassemblyjs/wasm-opt": "1.14.1", + "@webassemblyjs/wasm-parser": "1.14.1", + "@webassemblyjs/wast-printer": "1.14.1" } }, "node_modules/@webassemblyjs/wasm-gen": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.12.1.tgz", - "integrity": "sha512-TDq4Ojh9fcohAw6OIMXqiIcTq5KUXTGRkVxbSo1hQnSy6lAM5GSdfwWeSxpAo0YzgsgF182E/U0mDNhuA0tW7w==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.14.1.tgz", + "integrity": "sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==", "dev": true, "dependencies": { - "@webassemblyjs/ast": "1.12.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/ieee754": "1.11.6", - "@webassemblyjs/leb128": "1.11.6", - "@webassemblyjs/utf8": "1.11.6" + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/ieee754": "1.13.2", + "@webassemblyjs/leb128": "1.13.2", + "@webassemblyjs/utf8": "1.13.2" } }, "node_modules/@webassemblyjs/wasm-opt": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.12.1.tgz", - "integrity": "sha512-Jg99j/2gG2iaz3hijw857AVYekZe2SAskcqlWIZXjji5WStnOpVoat3gQfT/Q5tb2djnCjBtMocY/Su1GfxPBg==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.14.1.tgz", + "integrity": "sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==", "dev": true, "dependencies": { - "@webassemblyjs/ast": "1.12.1", - "@webassemblyjs/helper-buffer": "1.12.1", - "@webassemblyjs/wasm-gen": "1.12.1", - "@webassemblyjs/wasm-parser": "1.12.1" + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/wasm-gen": "1.14.1", + "@webassemblyjs/wasm-parser": "1.14.1" } }, "node_modules/@webassemblyjs/wasm-parser": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.12.1.tgz", - "integrity": "sha512-xikIi7c2FHXysxXe3COrVUPSheuBtpcfhbpFj4gmu7KRLYOzANztwUU0IbsqvMqzuNK2+glRGWCEqZo1WCLyAQ==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz", + "integrity": "sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==", "dev": true, "dependencies": { - "@webassemblyjs/ast": "1.12.1", - "@webassemblyjs/helper-api-error": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/ieee754": "1.11.6", - "@webassemblyjs/leb128": "1.11.6", - "@webassemblyjs/utf8": "1.11.6" + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-api-error": "1.13.2", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/ieee754": "1.13.2", + "@webassemblyjs/leb128": "1.13.2", + "@webassemblyjs/utf8": "1.13.2" } }, "node_modules/@webassemblyjs/wast-printer": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.12.1.tgz", - "integrity": "sha512-+X4WAlOisVWQMikjbcvY2e0rwPsKQ9F688lksZhBcPycBBuii3O7m8FACbDMWDojpAqvjIncrG8J0XHKyQfVeA==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.14.1.tgz", + "integrity": "sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==", "dev": true, "dependencies": { - "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/ast": "1.14.1", "@xtuc/long": "4.2.2" } }, @@ -1215,9 +1222,9 @@ "dev": true }, "node_modules/acorn": { - "version": "8.12.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz", - "integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==", + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", + "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", "dev": true, "bin": { "acorn": "bin/acorn" @@ -1226,13 +1233,16 @@ "node": ">=0.4.0" } }, - "node_modules/acorn-import-attributes": { - "version": "1.9.5", - "resolved": "https://registry.npmjs.org/acorn-import-attributes/-/acorn-import-attributes-1.9.5.tgz", - "integrity": "sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==", + "node_modules/acorn-import-phases": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/acorn-import-phases/-/acorn-import-phases-1.0.4.tgz", + "integrity": "sha512-wKmbr/DDiIXzEOiWrTTUcDm24kQ2vGfZQvM2fwg2vXqR5uW6aapr7ObPtj1th32b9u90/Pf4AItvdTh42fBmVQ==", "dev": true, + "engines": { + "node": ">=10.13.0" + }, "peerDependencies": { - "acorn": "^8" + "acorn": "^8.14.0" } }, "node_modules/agent-base": { @@ -1377,6 +1387,15 @@ } ] }, + "node_modules/baseline-browser-mapping": { + "version": "2.9.19", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.9.19.tgz", + "integrity": "sha512-ipDqC8FrAl/76p2SSWKSI+H9tFwm7vYqXQrItCuiVPt26Km0jS+NzSsBWAaBusvSbQcfJG+JitdMm+wZAgTYqg==", + "dev": true, + "bin": { + "baseline-browser-mapping": "dist/cli.js" + } + }, "node_modules/before-after-hook": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-3.0.2.tgz", @@ -1470,9 +1489,9 @@ "dev": true }, "node_modules/browserslist": { - "version": "4.23.3", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.3.tgz", - "integrity": "sha512-btwCFJVjI4YWDNfau8RhZ+B1Q/VLoUITrm3RlP6y1tYGWIOa+InuYiRGXUBXo8nA1qKmHMyLB/iVQg5TT4eFoA==", + "version": "4.28.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.1.tgz", + "integrity": "sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==", "dev": true, "funding": [ { @@ -1489,10 +1508,11 @@ } ], "dependencies": { - "caniuse-lite": "^1.0.30001646", - "electron-to-chromium": "^1.5.4", - "node-releases": "^2.0.18", - "update-browserslist-db": "^1.1.0" + "baseline-browser-mapping": "^2.9.0", + "caniuse-lite": "^1.0.30001759", + "electron-to-chromium": "^1.5.263", + "node-releases": "^2.0.27", + "update-browserslist-db": "^1.2.0" }, "bin": { "browserslist": "cli.js" @@ -1658,9 +1678,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001655", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001655.tgz", - "integrity": "sha512-jRGVy3iSGO5Uutn2owlb5gR6qsGngTw9ZTb4ali9f3glshcNmJ2noam4Mo9zia5P9Dk3jNNydy7vQjuE5dQmfg==", + "version": "1.0.30001769", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001769.tgz", + "integrity": "sha512-BCfFL1sHijQlBGWBMuJyhZUhzo7wer5sVj9hqekB/7xn0Ypy+pER/edCYQm4exbXj4WiySGp40P8UuTh6w1srg==", "dev": true, "funding": [ { @@ -2180,9 +2200,9 @@ "dev": true }, "node_modules/electron-to-chromium": { - "version": "1.5.13", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.13.tgz", - "integrity": "sha512-lbBcvtIJ4J6sS4tb5TLp1b4LyfCdMkwStzXPyAgVgTRAsep4bvrAGaBOP7ZJtQMNJpSQ9SqG4brWOroNaQtm7Q==", + "version": "1.5.286", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.286.tgz", + "integrity": "sha512-9tfDXhJ4RKFNerfjdCcZfufu49vg620741MNs26a9+bhLThdB+plgMeou98CAaHu/WATj2iHOOHTp1hWtABj2A==", "dev": true }, "node_modules/emoji-regex": { @@ -2201,13 +2221,13 @@ } }, "node_modules/enhanced-resolve": { - "version": "5.17.1", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17.1.tgz", - "integrity": "sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg==", + "version": "5.19.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.19.0.tgz", + "integrity": "sha512-phv3E1Xl4tQOShqSte26C7Fl84EwUdZsyOuSSk9qtAGyyQs2s3jJzComh+Abf4g187lUUAvH+H26omrqia2aGg==", "dev": true, "dependencies": { "graceful-fs": "^4.2.4", - "tapable": "^2.2.0" + "tapable": "^2.3.0" }, "engines": { "node": ">=10.13.0" @@ -2254,9 +2274,9 @@ } }, "node_modules/es-module-lexer": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.3.0.tgz", - "integrity": "sha512-vZK7T0N2CBmBOixhmjdqx2gWVbFZ4DXZ/NyRMZVlJXPa7CyFS+/a4QQsDGDQy9ZfEzxFuNEsMLeQJnKP2p5/JA==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-2.0.0.tgz", + "integrity": "sha512-5POEcUuZybH7IdmGsD8wlf0AI55wMecM9rVBTI/qEAy2c1kTOm3DjFYjrBdI2K3BaJjJYfYFeRtM0t9ssnRuxw==", "dev": true }, "node_modules/es-object-atoms": { @@ -2462,12 +2482,6 @@ "node": ">= 6" } }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true - }, "node_modules/fastest-levenshtein": { "version": "1.0.16", "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", @@ -3444,12 +3458,16 @@ "dev": true }, "node_modules/loader-runner": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", - "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.1.tgz", + "integrity": "sha512-IWqP2SCPhyVFTBtRcgMHdzlf9ul25NwaFx4wCEH/KjAXuuHY4yNjvPXsBokp8jCB936PyWRaPKUNh8NvylLp2Q==", "dev": true, "engines": { "node": ">=6.11.5" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" } }, "node_modules/locate-path": { @@ -3849,9 +3867,9 @@ "optional": true }, "node_modules/node-releases": { - "version": "2.0.18", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz", - "integrity": "sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==", + "version": "2.0.27", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.27.tgz", + "integrity": "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==", "dev": true }, "node_modules/normalize-path": { @@ -4698,9 +4716,9 @@ "dev": true }, "node_modules/schema-utils": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", - "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.3.tgz", + "integrity": "sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA==", "dev": true, "dependencies": { "@types/json-schema": "^7.0.9", @@ -4709,7 +4727,7 @@ "ajv-keywords": "^5.1.0" }, "engines": { - "node": ">= 12.13.0" + "node": ">= 10.13.0" }, "funding": { "type": "opencollective", @@ -5147,12 +5165,16 @@ } }, "node_modules/tapable": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", - "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.0.tgz", + "integrity": "sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==", "dev": true, "engines": { "node": ">=6" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" } }, "node_modules/tar-fs": { @@ -5270,13 +5292,13 @@ } }, "node_modules/terser": { - "version": "5.31.6", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.31.6.tgz", - "integrity": "sha512-PQ4DAriWzKj+qgehQ7LK5bQqCFNMmlhjR2PFFLuqGCpuCAauxemVBWwWOxo3UIwWQx8+Pr61Df++r76wDmkQBg==", + "version": "5.46.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.46.0.tgz", + "integrity": "sha512-jTwoImyr/QbOWFFso3YoU3ik0jBBDJ6JTOQiy/J2YxVJdZCc+5u7skhNwiOR3FQIygFqVUPHl7qbbxtjW2K3Qg==", "dev": true, "dependencies": { "@jridgewell/source-map": "^0.3.3", - "acorn": "^8.8.2", + "acorn": "^8.15.0", "commander": "^2.20.0", "source-map-support": "~0.5.20" }, @@ -5288,16 +5310,16 @@ } }, "node_modules/terser-webpack-plugin": { - "version": "5.3.10", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.10.tgz", - "integrity": "sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==", + "version": "5.3.16", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.16.tgz", + "integrity": "sha512-h9oBFCWrq78NyWWVcSwZarJkZ01c2AyGrzs1crmHZO3QUg9D61Wu4NPjBy69n7JqylFF5y+CsUZYmYEIZ3mR+Q==", "dev": true, "dependencies": { - "@jridgewell/trace-mapping": "^0.3.20", + "@jridgewell/trace-mapping": "^0.3.25", "jest-worker": "^27.4.5", - "schema-utils": "^3.1.1", - "serialize-javascript": "^6.0.1", - "terser": "^5.26.0" + "schema-utils": "^4.3.0", + "serialize-javascript": "^6.0.2", + "terser": "^5.31.1" }, "engines": { "node": ">= 10.13.0" @@ -5321,55 +5343,6 @@ } } }, - "node_modules/terser-webpack-plugin/node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/terser-webpack-plugin/node_modules/ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "dev": true, - "peerDependencies": { - "ajv": "^6.9.1" - } - }, - "node_modules/terser-webpack-plugin/node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "node_modules/terser-webpack-plugin/node_modules/schema-utils": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", - "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", - "dev": true, - "dependencies": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, "node_modules/tmp": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", @@ -5738,9 +5711,9 @@ } }, "node_modules/update-browserslist-db": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.0.tgz", - "integrity": "sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", + "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", "dev": true, "funding": [ { @@ -5757,8 +5730,8 @@ } ], "dependencies": { - "escalade": "^3.1.2", - "picocolors": "^1.0.1" + "escalade": "^3.2.0", + "picocolors": "^1.1.1" }, "bin": { "update-browserslist-db": "cli.js" @@ -5949,9 +5922,9 @@ } }, "node_modules/watchpack": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.2.tgz", - "integrity": "sha512-TnbFSbcOCcDgjZ4piURLCbJ3nJhznVh9kw6F6iokjiFPl8ONxe9A6nMDVXDiNbrSfLILs6vB07F7wLBrwPYzJw==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.5.1.tgz", + "integrity": "sha512-Zn5uXdcFNIA1+1Ei5McRd+iRzfhENPCe7LeABkJtNulSxjma+l7ltNx55BWZkRlwRnpOgHqxnjyaDgJnNXnqzg==", "dev": true, "dependencies": { "glob-to-regexp": "^0.4.1", @@ -5962,34 +5935,36 @@ } }, "node_modules/webpack": { - "version": "5.94.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.94.0.tgz", - "integrity": "sha512-KcsGn50VT+06JH/iunZJedYGUJS5FGjow8wb9c0v5n1Om8O1g4L6LjtfxwlXIATopoQu+vOXXa7gYisWxCoPyg==", - "dev": true, - "dependencies": { - "@types/estree": "^1.0.5", - "@webassemblyjs/ast": "^1.12.1", - "@webassemblyjs/wasm-edit": "^1.12.1", - "@webassemblyjs/wasm-parser": "^1.12.1", - "acorn": "^8.7.1", - "acorn-import-attributes": "^1.9.5", - "browserslist": "^4.21.10", + "version": "5.105.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.105.0.tgz", + "integrity": "sha512-gX/dMkRQc7QOMzgTe6KsYFM7DxeIONQSui1s0n/0xht36HvrgbxtM1xBlgx596NbpHuQU8P7QpKwrZYwUX48nw==", + "dev": true, + "dependencies": { + "@types/eslint-scope": "^3.7.7", + "@types/estree": "^1.0.8", + "@types/json-schema": "^7.0.15", + "@webassemblyjs/ast": "^1.14.1", + "@webassemblyjs/wasm-edit": "^1.14.1", + "@webassemblyjs/wasm-parser": "^1.14.1", + "acorn": "^8.15.0", + "acorn-import-phases": "^1.0.3", + "browserslist": "^4.28.1", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.17.1", - "es-module-lexer": "^1.2.1", + "enhanced-resolve": "^5.19.0", + "es-module-lexer": "^2.0.0", "eslint-scope": "5.1.1", "events": "^3.2.0", "glob-to-regexp": "^0.4.1", "graceful-fs": "^4.2.11", "json-parse-even-better-errors": "^2.3.1", - "loader-runner": "^4.2.0", + "loader-runner": "^4.3.1", "mime-types": "^2.1.27", "neo-async": "^2.6.2", - "schema-utils": "^3.2.0", - "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.3.10", - "watchpack": "^2.4.1", - "webpack-sources": "^3.2.3" + "schema-utils": "^4.3.3", + "tapable": "^2.3.0", + "terser-webpack-plugin": "^5.3.16", + "watchpack": "^2.5.1", + "webpack-sources": "^3.3.3" }, "bin": { "webpack": "bin/webpack.js" @@ -6077,63 +6052,14 @@ } }, "node_modules/webpack-sources": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", - "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.3.3.tgz", + "integrity": "sha512-yd1RBzSGanHkitROoPFd6qsrxt+oFhg/129YzheDGqeustzX0vTZJZsSsQjVQC4yzBQ56K55XU8gaNCtIzOnTg==", "dev": true, "engines": { "node": ">=10.13.0" } }, - "node_modules/webpack/node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/webpack/node_modules/ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "dev": true, - "peerDependencies": { - "ajv": "^6.9.1" - } - }, - "node_modules/webpack/node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "node_modules/webpack/node_modules/schema-utils": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", - "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", - "dev": true, - "dependencies": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", @@ -6543,13 +6469,12 @@ } }, "@jridgewell/gen-mapping": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", - "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", "dev": true, "requires": { - "@jridgewell/set-array": "^1.2.1", - "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/sourcemap-codec": "^1.5.0", "@jridgewell/trace-mapping": "^0.3.24" } }, @@ -6559,16 +6484,10 @@ "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", "dev": true }, - "@jridgewell/set-array": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", - "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", - "dev": true - }, "@jridgewell/source-map": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz", - "integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==", + "version": "0.3.11", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.11.tgz", + "integrity": "sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==", "dev": true, "requires": { "@jridgewell/gen-mapping": "^0.3.5", @@ -6576,15 +6495,15 @@ } }, "@jridgewell/sourcemap-codec": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", - "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", "dev": true }, "@jridgewell/trace-mapping": { - "version": "0.3.25", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", - "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", "dev": true, "requires": { "@jridgewell/resolve-uri": "^3.1.0", @@ -6872,10 +6791,30 @@ "defer-to-connect": "^2.0.1" } }, + "@types/eslint": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-9.6.1.tgz", + "integrity": "sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==", + "dev": true, + "requires": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "@types/eslint-scope": { + "version": "3.7.7", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz", + "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==", + "dev": true, + "requires": { + "@types/eslint": "*", + "@types/estree": "*" + } + }, "@types/estree": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", - "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", "dev": true }, "@types/fs-extra": { @@ -6904,9 +6843,9 @@ "dev": true }, "@types/json-schema": { - "version": "7.0.12", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.12.tgz", - "integrity": "sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==", + "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 }, "@types/lodash": { @@ -7102,148 +7041,148 @@ } }, "@webassemblyjs/ast": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.12.1.tgz", - "integrity": "sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.14.1.tgz", + "integrity": "sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==", "dev": true, "requires": { - "@webassemblyjs/helper-numbers": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6" + "@webassemblyjs/helper-numbers": "1.13.2", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2" } }, "@webassemblyjs/floating-point-hex-parser": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz", - "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz", + "integrity": "sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==", "dev": true }, "@webassemblyjs/helper-api-error": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", - "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz", + "integrity": "sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==", "dev": true }, "@webassemblyjs/helper-buffer": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.12.1.tgz", - "integrity": "sha512-nzJwQw99DNDKr9BVCOZcLuJJUlqkJh+kVzVl6Fmq/tI5ZtEyWT1KZMyOXltXLZJmDtvLCDgwsyrkohEtopTXCw==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.14.1.tgz", + "integrity": "sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==", "dev": true }, "@webassemblyjs/helper-numbers": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", - "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.13.2.tgz", + "integrity": "sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==", "dev": true, "requires": { - "@webassemblyjs/floating-point-hex-parser": "1.11.6", - "@webassemblyjs/helper-api-error": "1.11.6", + "@webassemblyjs/floating-point-hex-parser": "1.13.2", + "@webassemblyjs/helper-api-error": "1.13.2", "@xtuc/long": "4.2.2" } }, "@webassemblyjs/helper-wasm-bytecode": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", - "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz", + "integrity": "sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==", "dev": true }, "@webassemblyjs/helper-wasm-section": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.12.1.tgz", - "integrity": "sha512-Jif4vfB6FJlUlSbgEMHUyk1j234GTNG9dBJ4XJdOySoj518Xj0oGsNi59cUQF4RRMS9ouBUxDDdyBVfPTypa5g==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.14.1.tgz", + "integrity": "sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.12.1", - "@webassemblyjs/helper-buffer": "1.12.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/wasm-gen": "1.12.1" + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/wasm-gen": "1.14.1" } }, "@webassemblyjs/ieee754": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz", - "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.13.2.tgz", + "integrity": "sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==", "dev": true, "requires": { "@xtuc/ieee754": "^1.2.0" } }, "@webassemblyjs/leb128": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz", - "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.13.2.tgz", + "integrity": "sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==", "dev": true, "requires": { "@xtuc/long": "4.2.2" } }, "@webassemblyjs/utf8": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz", - "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.13.2.tgz", + "integrity": "sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==", "dev": true }, "@webassemblyjs/wasm-edit": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.12.1.tgz", - "integrity": "sha512-1DuwbVvADvS5mGnXbE+c9NfA8QRcZ6iKquqjjmR10k6o+zzsRVesil54DKexiowcFCPdr/Q0qaMgB01+SQ1u6g==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.14.1.tgz", + "integrity": "sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.12.1", - "@webassemblyjs/helper-buffer": "1.12.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/helper-wasm-section": "1.12.1", - "@webassemblyjs/wasm-gen": "1.12.1", - "@webassemblyjs/wasm-opt": "1.12.1", - "@webassemblyjs/wasm-parser": "1.12.1", - "@webassemblyjs/wast-printer": "1.12.1" + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/helper-wasm-section": "1.14.1", + "@webassemblyjs/wasm-gen": "1.14.1", + "@webassemblyjs/wasm-opt": "1.14.1", + "@webassemblyjs/wasm-parser": "1.14.1", + "@webassemblyjs/wast-printer": "1.14.1" } }, "@webassemblyjs/wasm-gen": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.12.1.tgz", - "integrity": "sha512-TDq4Ojh9fcohAw6OIMXqiIcTq5KUXTGRkVxbSo1hQnSy6lAM5GSdfwWeSxpAo0YzgsgF182E/U0mDNhuA0tW7w==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.14.1.tgz", + "integrity": "sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.12.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/ieee754": "1.11.6", - "@webassemblyjs/leb128": "1.11.6", - "@webassemblyjs/utf8": "1.11.6" + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/ieee754": "1.13.2", + "@webassemblyjs/leb128": "1.13.2", + "@webassemblyjs/utf8": "1.13.2" } }, "@webassemblyjs/wasm-opt": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.12.1.tgz", - "integrity": "sha512-Jg99j/2gG2iaz3hijw857AVYekZe2SAskcqlWIZXjji5WStnOpVoat3gQfT/Q5tb2djnCjBtMocY/Su1GfxPBg==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.14.1.tgz", + "integrity": "sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.12.1", - "@webassemblyjs/helper-buffer": "1.12.1", - "@webassemblyjs/wasm-gen": "1.12.1", - "@webassemblyjs/wasm-parser": "1.12.1" + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/wasm-gen": "1.14.1", + "@webassemblyjs/wasm-parser": "1.14.1" } }, "@webassemblyjs/wasm-parser": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.12.1.tgz", - "integrity": "sha512-xikIi7c2FHXysxXe3COrVUPSheuBtpcfhbpFj4gmu7KRLYOzANztwUU0IbsqvMqzuNK2+glRGWCEqZo1WCLyAQ==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz", + "integrity": "sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.12.1", - "@webassemblyjs/helper-api-error": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/ieee754": "1.11.6", - "@webassemblyjs/leb128": "1.11.6", - "@webassemblyjs/utf8": "1.11.6" + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-api-error": "1.13.2", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/ieee754": "1.13.2", + "@webassemblyjs/leb128": "1.13.2", + "@webassemblyjs/utf8": "1.13.2" } }, "@webassemblyjs/wast-printer": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.12.1.tgz", - "integrity": "sha512-+X4WAlOisVWQMikjbcvY2e0rwPsKQ9F688lksZhBcPycBBuii3O7m8FACbDMWDojpAqvjIncrG8J0XHKyQfVeA==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.14.1.tgz", + "integrity": "sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/ast": "1.14.1", "@xtuc/long": "4.2.2" } }, @@ -7283,15 +7222,15 @@ "dev": true }, "acorn": { - "version": "8.12.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz", - "integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==", + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", + "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", "dev": true }, - "acorn-import-attributes": { - "version": "1.9.5", - "resolved": "https://registry.npmjs.org/acorn-import-attributes/-/acorn-import-attributes-1.9.5.tgz", - "integrity": "sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==", + "acorn-import-phases": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/acorn-import-phases/-/acorn-import-phases-1.0.4.tgz", + "integrity": "sha512-wKmbr/DDiIXzEOiWrTTUcDm24kQ2vGfZQvM2fwg2vXqR5uW6aapr7ObPtj1th32b9u90/Pf4AItvdTh42fBmVQ==", "dev": true, "requires": {} }, @@ -7396,6 +7335,12 @@ "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", "dev": true }, + "baseline-browser-mapping": { + "version": "2.9.19", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.9.19.tgz", + "integrity": "sha512-ipDqC8FrAl/76p2SSWKSI+H9tFwm7vYqXQrItCuiVPt26Km0jS+NzSsBWAaBusvSbQcfJG+JitdMm+wZAgTYqg==", + "dev": true + }, "before-after-hook": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-3.0.2.tgz", @@ -7478,15 +7423,16 @@ "dev": true }, "browserslist": { - "version": "4.23.3", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.3.tgz", - "integrity": "sha512-btwCFJVjI4YWDNfau8RhZ+B1Q/VLoUITrm3RlP6y1tYGWIOa+InuYiRGXUBXo8nA1qKmHMyLB/iVQg5TT4eFoA==", + "version": "4.28.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.1.tgz", + "integrity": "sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==", "dev": true, "requires": { - "caniuse-lite": "^1.0.30001646", - "electron-to-chromium": "^1.5.4", - "node-releases": "^2.0.18", - "update-browserslist-db": "^1.1.0" + "baseline-browser-mapping": "^2.9.0", + "caniuse-lite": "^1.0.30001759", + "electron-to-chromium": "^1.5.263", + "node-releases": "^2.0.27", + "update-browserslist-db": "^1.2.0" } }, "buffer": { @@ -7599,9 +7545,9 @@ "dev": true }, "caniuse-lite": { - "version": "1.0.30001655", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001655.tgz", - "integrity": "sha512-jRGVy3iSGO5Uutn2owlb5gR6qsGngTw9ZTb4ali9f3glshcNmJ2noam4Mo9zia5P9Dk3jNNydy7vQjuE5dQmfg==", + "version": "1.0.30001769", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001769.tgz", + "integrity": "sha512-BCfFL1sHijQlBGWBMuJyhZUhzo7wer5sVj9hqekB/7xn0Ypy+pER/edCYQm4exbXj4WiySGp40P8UuTh6w1srg==", "dev": true }, "chainsaw": { @@ -7963,9 +7909,9 @@ "dev": true }, "electron-to-chromium": { - "version": "1.5.13", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.13.tgz", - "integrity": "sha512-lbBcvtIJ4J6sS4tb5TLp1b4LyfCdMkwStzXPyAgVgTRAsep4bvrAGaBOP7ZJtQMNJpSQ9SqG4brWOroNaQtm7Q==", + "version": "1.5.286", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.286.tgz", + "integrity": "sha512-9tfDXhJ4RKFNerfjdCcZfufu49vg620741MNs26a9+bhLThdB+plgMeou98CAaHu/WATj2iHOOHTp1hWtABj2A==", "dev": true }, "emoji-regex": { @@ -7984,13 +7930,13 @@ } }, "enhanced-resolve": { - "version": "5.17.1", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17.1.tgz", - "integrity": "sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg==", + "version": "5.19.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.19.0.tgz", + "integrity": "sha512-phv3E1Xl4tQOShqSte26C7Fl84EwUdZsyOuSSk9qtAGyyQs2s3jJzComh+Abf4g187lUUAvH+H26omrqia2aGg==", "dev": true, "requires": { "graceful-fs": "^4.2.4", - "tapable": "^2.2.0" + "tapable": "^2.3.0" } }, "entities": { @@ -8016,9 +7962,9 @@ "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==" }, "es-module-lexer": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.3.0.tgz", - "integrity": "sha512-vZK7T0N2CBmBOixhmjdqx2gWVbFZ4DXZ/NyRMZVlJXPa7CyFS+/a4QQsDGDQy9ZfEzxFuNEsMLeQJnKP2p5/JA==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-2.0.0.tgz", + "integrity": "sha512-5POEcUuZybH7IdmGsD8wlf0AI55wMecM9rVBTI/qEAy2c1kTOm3DjFYjrBdI2K3BaJjJYfYFeRtM0t9ssnRuxw==", "dev": true }, "es-object-atoms": { @@ -8162,12 +8108,6 @@ } } }, - "fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true - }, "fastest-levenshtein": { "version": "1.0.16", "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", @@ -8870,9 +8810,9 @@ "dev": true }, "loader-runner": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", - "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.1.tgz", + "integrity": "sha512-IWqP2SCPhyVFTBtRcgMHdzlf9ul25NwaFx4wCEH/KjAXuuHY4yNjvPXsBokp8jCB936PyWRaPKUNh8NvylLp2Q==", "dev": true }, "locate-path": { @@ -9172,9 +9112,9 @@ "optional": true }, "node-releases": { - "version": "2.0.18", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz", - "integrity": "sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==", + "version": "2.0.27", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.27.tgz", + "integrity": "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==", "dev": true }, "normalize-path": { @@ -9771,9 +9711,9 @@ "dev": true }, "schema-utils": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", - "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.3.tgz", + "integrity": "sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA==", "dev": true, "requires": { "@types/json-schema": "^7.0.9", @@ -10063,9 +10003,9 @@ "dev": true }, "tapable": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", - "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.0.tgz", + "integrity": "sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==", "dev": true }, "tar-fs": { @@ -10176,66 +10116,28 @@ } }, "terser": { - "version": "5.31.6", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.31.6.tgz", - "integrity": "sha512-PQ4DAriWzKj+qgehQ7LK5bQqCFNMmlhjR2PFFLuqGCpuCAauxemVBWwWOxo3UIwWQx8+Pr61Df++r76wDmkQBg==", + "version": "5.46.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.46.0.tgz", + "integrity": "sha512-jTwoImyr/QbOWFFso3YoU3ik0jBBDJ6JTOQiy/J2YxVJdZCc+5u7skhNwiOR3FQIygFqVUPHl7qbbxtjW2K3Qg==", "dev": true, "requires": { "@jridgewell/source-map": "^0.3.3", - "acorn": "^8.8.2", + "acorn": "^8.15.0", "commander": "^2.20.0", "source-map-support": "~0.5.20" } }, "terser-webpack-plugin": { - "version": "5.3.10", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.10.tgz", - "integrity": "sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==", + "version": "5.3.16", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.16.tgz", + "integrity": "sha512-h9oBFCWrq78NyWWVcSwZarJkZ01c2AyGrzs1crmHZO3QUg9D61Wu4NPjBy69n7JqylFF5y+CsUZYmYEIZ3mR+Q==", "dev": true, "requires": { - "@jridgewell/trace-mapping": "^0.3.20", + "@jridgewell/trace-mapping": "^0.3.25", "jest-worker": "^27.4.5", - "schema-utils": "^3.1.1", - "serialize-javascript": "^6.0.1", - "terser": "^5.26.0" - }, - "dependencies": { - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "dev": true, - "requires": {} - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "schema-utils": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", - "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", - "dev": true, - "requires": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - } - } + "schema-utils": "^4.3.0", + "serialize-javascript": "^6.0.2", + "terser": "^5.31.1" } }, "tmp": { @@ -10527,13 +10429,13 @@ } }, "update-browserslist-db": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.0.tgz", - "integrity": "sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", + "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", "dev": true, "requires": { - "escalade": "^3.1.2", - "picocolors": "^1.0.1" + "escalade": "^3.2.0", + "picocolors": "^1.1.1" } }, "uri-js": { @@ -10676,9 +10578,9 @@ } }, "watchpack": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.2.tgz", - "integrity": "sha512-TnbFSbcOCcDgjZ4piURLCbJ3nJhznVh9kw6F6iokjiFPl8ONxe9A6nMDVXDiNbrSfLILs6vB07F7wLBrwPYzJw==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.5.1.tgz", + "integrity": "sha512-Zn5uXdcFNIA1+1Ei5McRd+iRzfhENPCe7LeABkJtNulSxjma+l7ltNx55BWZkRlwRnpOgHqxnjyaDgJnNXnqzg==", "dev": true, "requires": { "glob-to-regexp": "^0.4.1", @@ -10686,72 +10588,36 @@ } }, "webpack": { - "version": "5.94.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.94.0.tgz", - "integrity": "sha512-KcsGn50VT+06JH/iunZJedYGUJS5FGjow8wb9c0v5n1Om8O1g4L6LjtfxwlXIATopoQu+vOXXa7gYisWxCoPyg==", - "dev": true, - "requires": { - "@types/estree": "^1.0.5", - "@webassemblyjs/ast": "^1.12.1", - "@webassemblyjs/wasm-edit": "^1.12.1", - "@webassemblyjs/wasm-parser": "^1.12.1", - "acorn": "^8.7.1", - "acorn-import-attributes": "^1.9.5", - "browserslist": "^4.21.10", + "version": "5.105.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.105.0.tgz", + "integrity": "sha512-gX/dMkRQc7QOMzgTe6KsYFM7DxeIONQSui1s0n/0xht36HvrgbxtM1xBlgx596NbpHuQU8P7QpKwrZYwUX48nw==", + "dev": true, + "requires": { + "@types/eslint-scope": "^3.7.7", + "@types/estree": "^1.0.8", + "@types/json-schema": "^7.0.15", + "@webassemblyjs/ast": "^1.14.1", + "@webassemblyjs/wasm-edit": "^1.14.1", + "@webassemblyjs/wasm-parser": "^1.14.1", + "acorn": "^8.15.0", + "acorn-import-phases": "^1.0.3", + "browserslist": "^4.28.1", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.17.1", - "es-module-lexer": "^1.2.1", + "enhanced-resolve": "^5.19.0", + "es-module-lexer": "^2.0.0", "eslint-scope": "5.1.1", "events": "^3.2.0", "glob-to-regexp": "^0.4.1", "graceful-fs": "^4.2.11", "json-parse-even-better-errors": "^2.3.1", - "loader-runner": "^4.2.0", + "loader-runner": "^4.3.1", "mime-types": "^2.1.27", "neo-async": "^2.6.2", - "schema-utils": "^3.2.0", - "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.3.10", - "watchpack": "^2.4.1", - "webpack-sources": "^3.2.3" - }, - "dependencies": { - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "dev": true, - "requires": {} - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "schema-utils": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", - "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", - "dev": true, - "requires": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - } - } + "schema-utils": "^4.3.3", + "tapable": "^2.3.0", + "terser-webpack-plugin": "^5.3.16", + "watchpack": "^2.5.1", + "webpack-sources": "^3.3.3" } }, "webpack-cli": { @@ -10793,9 +10659,9 @@ } }, "webpack-sources": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", - "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.3.3.tgz", + "integrity": "sha512-yd1RBzSGanHkitROoPFd6qsrxt+oFhg/129YzheDGqeustzX0vTZJZsSsQjVQC4yzBQ56K55XU8gaNCtIzOnTg==", "dev": true }, "which": { diff --git a/package.json b/package.json index c8d44ea6..1c0301a1 100644 --- a/package.json +++ b/package.json @@ -1106,7 +1106,7 @@ "tslint": "^6.1.3", "typescript": "^4.9.4", "vscode-extension-tester": "^7.0.0", - "webpack": "^5.94.0", + "webpack": "^5.105.0", "webpack-cli": "^4.10.0" }, "dependencies": { From de3c3b694339dfd4d1738d551f7145240c3ac131 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 13 Feb 2026 10:15:10 +0800 Subject: [PATCH 270/352] chore(deps): Bump axios from 1.12.2 to 1.13.5 (#965) Bumps [axios](https://github.com/axios/axios) from 1.12.2 to 1.13.5. - [Release notes](https://github.com/axios/axios/releases) - [Changelog](https://github.com/axios/axios/blob/v1.x/CHANGELOG.md) - [Commits](https://github.com/axios/axios/compare/v1.12.2...v1.13.5) --- updated-dependencies: - dependency-name: axios dependency-version: 1.13.5 dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 44 ++++++++++++++++++++++---------------------- 1 file changed, 22 insertions(+), 22 deletions(-) diff --git a/package-lock.json b/package-lock.json index 4b57e7dd..ef89b769 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1343,12 +1343,12 @@ "integrity": "sha512-aDczADvlvTGajTDjcjpJMqRkOF6Qdz3YbPZm/PyW6tKPkx2hlYBzxMhEywM/tU72HrVZjgl5VCdRuMlA7pZ8Gw==" }, "node_modules/axios": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.12.2.tgz", - "integrity": "sha512-vMJzPewAlRyOgxV2dU0Cuz2O8zzzx9VYtbJOaBgXFeLc4IV/Eg50n4LowmehOOR61S8ZMpc2K5Sa7g6A4jfkUw==", + "version": "1.13.5", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.13.5.tgz", + "integrity": "sha512-cz4ur7Vb0xS4/KUN0tPWe44eqxrIu31me+fbang3ijiNscE129POzipJJA6zniq2C/Z6sJCjMimjS8Lc/GAs8Q==", "dependencies": { - "follow-redirects": "^1.15.6", - "form-data": "^4.0.4", + "follow-redirects": "^1.15.11", + "form-data": "^4.0.5", "proxy-from-env": "^1.1.0" } }, @@ -2553,9 +2553,9 @@ } }, "node_modules/follow-redirects": { - "version": "1.15.6", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", - "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==", + "version": "1.15.11", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.11.tgz", + "integrity": "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==", "funding": [ { "type": "individual", @@ -2588,9 +2588,9 @@ } }, "node_modules/form-data": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.4.tgz", - "integrity": "sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz", + "integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==", "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", @@ -7305,12 +7305,12 @@ "integrity": "sha512-aDczADvlvTGajTDjcjpJMqRkOF6Qdz3YbPZm/PyW6tKPkx2hlYBzxMhEywM/tU72HrVZjgl5VCdRuMlA7pZ8Gw==" }, "axios": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.12.2.tgz", - "integrity": "sha512-vMJzPewAlRyOgxV2dU0Cuz2O8zzzx9VYtbJOaBgXFeLc4IV/Eg50n4LowmehOOR61S8ZMpc2K5Sa7g6A4jfkUw==", + "version": "1.13.5", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.13.5.tgz", + "integrity": "sha512-cz4ur7Vb0xS4/KUN0tPWe44eqxrIu31me+fbang3ijiNscE129POzipJJA6zniq2C/Z6sJCjMimjS8Lc/GAs8Q==", "requires": { - "follow-redirects": "^1.15.6", - "form-data": "^4.0.4", + "follow-redirects": "^1.15.11", + "form-data": "^4.0.5", "proxy-from-env": "^1.1.0" } }, @@ -8164,9 +8164,9 @@ } }, "follow-redirects": { - "version": "1.15.6", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", - "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==" + "version": "1.15.11", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.11.tgz", + "integrity": "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==" }, "foreground-child": { "version": "3.1.1", @@ -8179,9 +8179,9 @@ } }, "form-data": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.4.tgz", - "integrity": "sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz", + "integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==", "requires": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", From 1de66feb605a793234f0bc6f741275390c8b9d42 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 25 Feb 2026 13:47:19 +0800 Subject: [PATCH 271/352] chore(deps): Bump minimatch (#968) Bumps [minimatch](https://github.com/isaacs/minimatch) to 5.1.7 and updates ancestor dependencies and [minimatch](https://github.com/isaacs/minimatch). These dependencies need to be updated together. Updates `minimatch` from 5.1.6 to 5.1.7 - [Changelog](https://github.com/isaacs/minimatch/blob/main/changelog.md) - [Commits](https://github.com/isaacs/minimatch/compare/v5.1.6...v5.1.7) Updates `minimatch` from 3.1.2 to 3.1.3 - [Changelog](https://github.com/isaacs/minimatch/blob/main/changelog.md) - [Commits](https://github.com/isaacs/minimatch/compare/v5.1.6...v5.1.7) Updates `minimatch` from 9.0.5 to 9.0.6 - [Changelog](https://github.com/isaacs/minimatch/blob/main/changelog.md) - [Commits](https://github.com/isaacs/minimatch/compare/v5.1.6...v5.1.7) Updates `minimatch` from 9.0.3 to 9.0.6 - [Changelog](https://github.com/isaacs/minimatch/blob/main/changelog.md) - [Commits](https://github.com/isaacs/minimatch/compare/v5.1.6...v5.1.7) --- updated-dependencies: - dependency-name: minimatch dependency-version: 5.1.7 dependency-type: direct:production - dependency-name: minimatch dependency-version: 3.1.3 dependency-type: indirect - dependency-name: minimatch dependency-version: 9.0.6 dependency-type: indirect - dependency-name: minimatch dependency-version: 9.0.6 dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 154 ++++++++++++++++++++++++++++++++++------------ package.json | 2 +- 2 files changed, 114 insertions(+), 42 deletions(-) diff --git a/package-lock.json b/package-lock.json index ef89b769..453c0ae3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -16,7 +16,7 @@ "fs-extra": "^10.1.0", "globby": "^13.1.3", "lodash": "^4.17.23", - "minimatch": "^5.1.6", + "minimatch": "^5.1.7", "semver": "^7.3.8", "vscode-extension-telemetry-wrapper": "^0.15.0", "vscode-tas-client": "^0.1.75" @@ -1004,9 +1004,9 @@ } }, "node_modules/@vscode/vsce/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.3.tgz", + "integrity": "sha512-M2GCs7Vk83NxkUyQV1bkABc4yxgz9kILhHImZiBPAZ9ybuvCb0/H7lEl5XvIg3g+9d4eNotkZA5IWwYl0tibaA==", "dev": true, "dependencies": { "brace-expansion": "^1.1.7" @@ -2784,9 +2784,9 @@ } }, "node_modules/glob/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.3.tgz", + "integrity": "sha512-M2GCs7Vk83NxkUyQV1bkABc4yxgz9kILhHImZiBPAZ9ybuvCb0/H7lEl5XvIg3g+9d4eNotkZA5IWwYl0tibaA==", "dev": true, "dependencies": { "brace-expansion": "^1.1.7" @@ -3651,9 +3651,9 @@ } }, "node_modules/minimatch": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "version": "5.1.7", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.7.tgz", + "integrity": "sha512-FjiwU9HaHW6YB3H4a1sFudnv93lvydNjz2lmyUXR6IwKhGI+bgL3SOZrBGn6kvvX2pJvhEkGSGjyTHN47O4rqA==", "dependencies": { "brace-expansion": "^2.0.1" }, @@ -3734,6 +3734,27 @@ "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, + "node_modules/mocha/node_modules/balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "dev": true, + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/mocha/node_modules/brace-expansion": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.3.tgz", + "integrity": "sha512-fy6KJm2RawA5RcHkLa1z/ScpBeA762UF9KmZQxwIbDtRJrgLzM10depAiEQ+CXYcoiqW1/m96OAAoke2nE9EeA==", + "dev": true, + "dependencies": { + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + } + }, "node_modules/mocha/node_modules/glob": { "version": "10.5.0", "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz", @@ -3770,12 +3791,12 @@ } }, "node_modules/mocha/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "version": "9.0.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.6.tgz", + "integrity": "sha512-kQAVowdR33euIqeA0+VZTDqU+qo1IeVY+hrKYtZMio3Pg0P0vuh/kwRylLUddJhB6pf3q/botcOvRtx4IN1wqQ==", "dev": true, "dependencies": { - "brace-expansion": "^2.0.1" + "brace-expansion": "^5.0.2" }, "engines": { "node": ">=16 || 14 >=14.17" @@ -5571,9 +5592,9 @@ } }, "node_modules/tslint/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.3.tgz", + "integrity": "sha512-M2GCs7Vk83NxkUyQV1bkABc4yxgz9kILhHImZiBPAZ9ybuvCb0/H7lEl5XvIg3g+9d4eNotkZA5IWwYl0tibaA==", "dev": true, "dependencies": { "brace-expansion": "^1.1.7" @@ -5825,6 +5846,27 @@ "selenium-webdriver": "^4.6.1" } }, + "node_modules/vscode-extension-tester/node_modules/balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "dev": true, + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/vscode-extension-tester/node_modules/brace-expansion": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.3.tgz", + "integrity": "sha512-fy6KJm2RawA5RcHkLa1z/ScpBeA762UF9KmZQxwIbDtRJrgLzM10depAiEQ+CXYcoiqW1/m96OAAoke2nE9EeA==", + "dev": true, + "dependencies": { + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + } + }, "node_modules/vscode-extension-tester/node_modules/commander": { "version": "11.1.0", "resolved": "https://registry.npmjs.org/commander/-/commander-11.1.0.tgz", @@ -5871,12 +5913,12 @@ } }, "node_modules/vscode-extension-tester/node_modules/minimatch": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", - "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "version": "9.0.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.6.tgz", + "integrity": "sha512-kQAVowdR33euIqeA0+VZTDqU+qo1IeVY+hrKYtZMio3Pg0P0vuh/kwRylLUddJhB6pf3q/botcOvRtx4IN1wqQ==", "dev": true, "dependencies": { - "brace-expansion": "^2.0.1" + "brace-expansion": "^5.0.2" }, "engines": { "node": ">=16 || 14 >=14.17" @@ -7021,9 +7063,9 @@ "dev": true }, "minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.3.tgz", + "integrity": "sha512-M2GCs7Vk83NxkUyQV1bkABc4yxgz9kILhHImZiBPAZ9ybuvCb0/H7lEl5XvIg3g+9d4eNotkZA5IWwYl0tibaA==", "dev": true, "requires": { "brace-expansion": "^1.1.7" @@ -8316,9 +8358,9 @@ } }, "minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.3.tgz", + "integrity": "sha512-M2GCs7Vk83NxkUyQV1bkABc4yxgz9kILhHImZiBPAZ9ybuvCb0/H7lEl5XvIg3g+9d4eNotkZA5IWwYl0tibaA==", "dev": true, "requires": { "brace-expansion": "^1.1.7" @@ -8938,9 +8980,9 @@ "dev": true }, "minimatch": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "version": "5.1.7", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.7.tgz", + "integrity": "sha512-FjiwU9HaHW6YB3H4a1sFudnv93lvydNjz2lmyUXR6IwKhGI+bgL3SOZrBGn6kvvX2pJvhEkGSGjyTHN47O4rqA==", "requires": { "brace-expansion": "^2.0.1" } @@ -9002,6 +9044,21 @@ "yargs-unparser": "^2.0.0" }, "dependencies": { + "balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "dev": true + }, + "brace-expansion": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.3.tgz", + "integrity": "sha512-fy6KJm2RawA5RcHkLa1z/ScpBeA762UF9KmZQxwIbDtRJrgLzM10depAiEQ+CXYcoiqW1/m96OAAoke2nE9EeA==", + "dev": true, + "requires": { + "balanced-match": "^4.0.2" + } + }, "glob": { "version": "10.5.0", "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz", @@ -9027,12 +9084,12 @@ } }, "minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "version": "9.0.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.6.tgz", + "integrity": "sha512-kQAVowdR33euIqeA0+VZTDqU+qo1IeVY+hrKYtZMio3Pg0P0vuh/kwRylLUddJhB6pf3q/botcOvRtx4IN1wqQ==", "dev": true, "requires": { - "brace-expansion": "^2.0.1" + "brace-expansion": "^5.0.2" } }, "ms": { @@ -10315,9 +10372,9 @@ } }, "minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.3.tgz", + "integrity": "sha512-M2GCs7Vk83NxkUyQV1bkABc4yxgz9kILhHImZiBPAZ9ybuvCb0/H7lEl5XvIg3g+9d4eNotkZA5IWwYl0tibaA==", "dev": true, "requires": { "brace-expansion": "^1.1.7" @@ -10502,6 +10559,21 @@ "vscode-extension-tester-locators": "^3.10.0" }, "dependencies": { + "balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "dev": true + }, + "brace-expansion": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.3.tgz", + "integrity": "sha512-fy6KJm2RawA5RcHkLa1z/ScpBeA762UF9KmZQxwIbDtRJrgLzM10depAiEQ+CXYcoiqW1/m96OAAoke2nE9EeA==", + "dev": true, + "requires": { + "balanced-match": "^4.0.2" + } + }, "commander": { "version": "11.1.0", "resolved": "https://registry.npmjs.org/commander/-/commander-11.1.0.tgz", @@ -10533,12 +10605,12 @@ } }, "minimatch": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", - "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "version": "9.0.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.6.tgz", + "integrity": "sha512-kQAVowdR33euIqeA0+VZTDqU+qo1IeVY+hrKYtZMio3Pg0P0vuh/kwRylLUddJhB6pf3q/botcOvRtx4IN1wqQ==", "dev": true, "requires": { - "brace-expansion": "^2.0.1" + "brace-expansion": "^5.0.2" } } } diff --git a/package.json b/package.json index 1c0301a1..33696d97 100644 --- a/package.json +++ b/package.json @@ -1117,7 +1117,7 @@ "fs-extra": "^10.1.0", "globby": "^13.1.3", "lodash": "^4.17.23", - "minimatch": "^5.1.6", + "minimatch": "^5.1.7", "semver": "^7.3.8", "vscode-extension-telemetry-wrapper": "^0.15.0", "vscode-tas-client": "^0.1.75" From 4634b483bf2e1a60d95ef863b49c37eaa2003329 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 2 Mar 2026 16:51:47 +0800 Subject: [PATCH 272/352] chore(deps-dev): Bump qs from 6.14.1 to 6.14.2 (#967) Bumps [qs](https://github.com/ljharb/qs) from 6.14.1 to 6.14.2. - [Changelog](https://github.com/ljharb/qs/blob/main/CHANGELOG.md) - [Commits](https://github.com/ljharb/qs/compare/v6.14.1...v6.14.2) --- updated-dependencies: - dependency-name: qs dependency-version: 6.14.2 dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index 453c0ae3..8ecc8672 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4414,9 +4414,9 @@ } }, "node_modules/qs": { - "version": "6.14.1", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.1.tgz", - "integrity": "sha512-4EK3+xJl8Ts67nLYNwqw/dsFVnCf+qR7RgXSK9jEEm9unao3njwMDdmsdvoKBKHzxd7tCYz5e5M+SnMjdtXGQQ==", + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.15.0.tgz", + "integrity": "sha512-mAZTtNCeetKMH+pSjrb76NAM8V9a05I9aBZOHztWy/UqcJdQYNsf59vrRKWnojAT9Y+GbIvoTBC++CPHqpDBhQ==", "dev": true, "dependencies": { "side-channel": "^1.1.0" @@ -9549,9 +9549,9 @@ "dev": true }, "qs": { - "version": "6.14.1", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.1.tgz", - "integrity": "sha512-4EK3+xJl8Ts67nLYNwqw/dsFVnCf+qR7RgXSK9jEEm9unao3njwMDdmsdvoKBKHzxd7tCYz5e5M+SnMjdtXGQQ==", + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.15.0.tgz", + "integrity": "sha512-mAZTtNCeetKMH+pSjrb76NAM8V9a05I9aBZOHztWy/UqcJdQYNsf59vrRKWnojAT9Y+GbIvoTBC++CPHqpDBhQ==", "dev": true, "requires": { "side-channel": "^1.1.0" From ea6e281007af8ecea75a1020762460c9f76db676 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 3 Mar 2026 08:07:15 +0800 Subject: [PATCH 273/352] chore(deps): Bump minimatch (#969) Bumps [minimatch](https://github.com/isaacs/minimatch) to 5.1.9 and updates ancestor dependencies and [minimatch](https://github.com/isaacs/minimatch). These dependencies need to be updated together. Updates `minimatch` from 5.1.7 to 5.1.9 - [Changelog](https://github.com/isaacs/minimatch/blob/main/changelog.md) - [Commits](https://github.com/isaacs/minimatch/compare/v5.1.7...v5.1.9) Updates `minimatch` from 3.1.3 to 3.1.5 - [Changelog](https://github.com/isaacs/minimatch/blob/main/changelog.md) - [Commits](https://github.com/isaacs/minimatch/compare/v5.1.7...v5.1.9) Updates `minimatch` from 9.0.6 to 9.0.9 - [Changelog](https://github.com/isaacs/minimatch/blob/main/changelog.md) - [Commits](https://github.com/isaacs/minimatch/compare/v5.1.7...v5.1.9) --- updated-dependencies: - dependency-name: minimatch dependency-version: 5.1.9 dependency-type: direct:production - dependency-name: minimatch dependency-version: 3.1.5 dependency-type: indirect - dependency-name: minimatch dependency-version: 9.0.9 dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 154 ++++++++++++---------------------------------- package.json | 2 +- 2 files changed, 42 insertions(+), 114 deletions(-) diff --git a/package-lock.json b/package-lock.json index 8ecc8672..98009fcf 100644 --- a/package-lock.json +++ b/package-lock.json @@ -16,7 +16,7 @@ "fs-extra": "^10.1.0", "globby": "^13.1.3", "lodash": "^4.17.23", - "minimatch": "^5.1.7", + "minimatch": "^5.1.9", "semver": "^7.3.8", "vscode-extension-telemetry-wrapper": "^0.15.0", "vscode-tas-client": "^0.1.75" @@ -1004,9 +1004,9 @@ } }, "node_modules/@vscode/vsce/node_modules/minimatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.3.tgz", - "integrity": "sha512-M2GCs7Vk83NxkUyQV1bkABc4yxgz9kILhHImZiBPAZ9ybuvCb0/H7lEl5XvIg3g+9d4eNotkZA5IWwYl0tibaA==", + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", "dev": true, "dependencies": { "brace-expansion": "^1.1.7" @@ -2784,9 +2784,9 @@ } }, "node_modules/glob/node_modules/minimatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.3.tgz", - "integrity": "sha512-M2GCs7Vk83NxkUyQV1bkABc4yxgz9kILhHImZiBPAZ9ybuvCb0/H7lEl5XvIg3g+9d4eNotkZA5IWwYl0tibaA==", + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", "dev": true, "dependencies": { "brace-expansion": "^1.1.7" @@ -3651,9 +3651,9 @@ } }, "node_modules/minimatch": { - "version": "5.1.7", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.7.tgz", - "integrity": "sha512-FjiwU9HaHW6YB3H4a1sFudnv93lvydNjz2lmyUXR6IwKhGI+bgL3SOZrBGn6kvvX2pJvhEkGSGjyTHN47O4rqA==", + "version": "5.1.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.9.tgz", + "integrity": "sha512-7o1wEA2RyMP7Iu7GNba9vc0RWWGACJOCZBJX2GJWip0ikV+wcOsgVuY9uE8CPiyQhkGFSlhuSkZPavN7u1c2Fw==", "dependencies": { "brace-expansion": "^2.0.1" }, @@ -3734,27 +3734,6 @@ "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, - "node_modules/mocha/node_modules/balanced-match": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", - "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", - "dev": true, - "engines": { - "node": "18 || 20 || >=22" - } - }, - "node_modules/mocha/node_modules/brace-expansion": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.3.tgz", - "integrity": "sha512-fy6KJm2RawA5RcHkLa1z/ScpBeA762UF9KmZQxwIbDtRJrgLzM10depAiEQ+CXYcoiqW1/m96OAAoke2nE9EeA==", - "dev": true, - "dependencies": { - "balanced-match": "^4.0.2" - }, - "engines": { - "node": "18 || 20 || >=22" - } - }, "node_modules/mocha/node_modules/glob": { "version": "10.5.0", "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz", @@ -3791,12 +3770,12 @@ } }, "node_modules/mocha/node_modules/minimatch": { - "version": "9.0.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.6.tgz", - "integrity": "sha512-kQAVowdR33euIqeA0+VZTDqU+qo1IeVY+hrKYtZMio3Pg0P0vuh/kwRylLUddJhB6pf3q/botcOvRtx4IN1wqQ==", + "version": "9.0.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", + "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", "dev": true, "dependencies": { - "brace-expansion": "^5.0.2" + "brace-expansion": "^2.0.2" }, "engines": { "node": ">=16 || 14 >=14.17" @@ -5592,9 +5571,9 @@ } }, "node_modules/tslint/node_modules/minimatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.3.tgz", - "integrity": "sha512-M2GCs7Vk83NxkUyQV1bkABc4yxgz9kILhHImZiBPAZ9ybuvCb0/H7lEl5XvIg3g+9d4eNotkZA5IWwYl0tibaA==", + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", "dev": true, "dependencies": { "brace-expansion": "^1.1.7" @@ -5846,27 +5825,6 @@ "selenium-webdriver": "^4.6.1" } }, - "node_modules/vscode-extension-tester/node_modules/balanced-match": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", - "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", - "dev": true, - "engines": { - "node": "18 || 20 || >=22" - } - }, - "node_modules/vscode-extension-tester/node_modules/brace-expansion": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.3.tgz", - "integrity": "sha512-fy6KJm2RawA5RcHkLa1z/ScpBeA762UF9KmZQxwIbDtRJrgLzM10depAiEQ+CXYcoiqW1/m96OAAoke2nE9EeA==", - "dev": true, - "dependencies": { - "balanced-match": "^4.0.2" - }, - "engines": { - "node": "18 || 20 || >=22" - } - }, "node_modules/vscode-extension-tester/node_modules/commander": { "version": "11.1.0", "resolved": "https://registry.npmjs.org/commander/-/commander-11.1.0.tgz", @@ -5913,12 +5871,12 @@ } }, "node_modules/vscode-extension-tester/node_modules/minimatch": { - "version": "9.0.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.6.tgz", - "integrity": "sha512-kQAVowdR33euIqeA0+VZTDqU+qo1IeVY+hrKYtZMio3Pg0P0vuh/kwRylLUddJhB6pf3q/botcOvRtx4IN1wqQ==", + "version": "9.0.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", + "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", "dev": true, "dependencies": { - "brace-expansion": "^5.0.2" + "brace-expansion": "^2.0.2" }, "engines": { "node": ">=16 || 14 >=14.17" @@ -7063,9 +7021,9 @@ "dev": true }, "minimatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.3.tgz", - "integrity": "sha512-M2GCs7Vk83NxkUyQV1bkABc4yxgz9kILhHImZiBPAZ9ybuvCb0/H7lEl5XvIg3g+9d4eNotkZA5IWwYl0tibaA==", + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", "dev": true, "requires": { "brace-expansion": "^1.1.7" @@ -8358,9 +8316,9 @@ } }, "minimatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.3.tgz", - "integrity": "sha512-M2GCs7Vk83NxkUyQV1bkABc4yxgz9kILhHImZiBPAZ9ybuvCb0/H7lEl5XvIg3g+9d4eNotkZA5IWwYl0tibaA==", + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", "dev": true, "requires": { "brace-expansion": "^1.1.7" @@ -8980,9 +8938,9 @@ "dev": true }, "minimatch": { - "version": "5.1.7", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.7.tgz", - "integrity": "sha512-FjiwU9HaHW6YB3H4a1sFudnv93lvydNjz2lmyUXR6IwKhGI+bgL3SOZrBGn6kvvX2pJvhEkGSGjyTHN47O4rqA==", + "version": "5.1.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.9.tgz", + "integrity": "sha512-7o1wEA2RyMP7Iu7GNba9vc0RWWGACJOCZBJX2GJWip0ikV+wcOsgVuY9uE8CPiyQhkGFSlhuSkZPavN7u1c2Fw==", "requires": { "brace-expansion": "^2.0.1" } @@ -9044,21 +9002,6 @@ "yargs-unparser": "^2.0.0" }, "dependencies": { - "balanced-match": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", - "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", - "dev": true - }, - "brace-expansion": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.3.tgz", - "integrity": "sha512-fy6KJm2RawA5RcHkLa1z/ScpBeA762UF9KmZQxwIbDtRJrgLzM10depAiEQ+CXYcoiqW1/m96OAAoke2nE9EeA==", - "dev": true, - "requires": { - "balanced-match": "^4.0.2" - } - }, "glob": { "version": "10.5.0", "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz", @@ -9084,12 +9027,12 @@ } }, "minimatch": { - "version": "9.0.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.6.tgz", - "integrity": "sha512-kQAVowdR33euIqeA0+VZTDqU+qo1IeVY+hrKYtZMio3Pg0P0vuh/kwRylLUddJhB6pf3q/botcOvRtx4IN1wqQ==", + "version": "9.0.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", + "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", "dev": true, "requires": { - "brace-expansion": "^5.0.2" + "brace-expansion": "^2.0.2" } }, "ms": { @@ -10372,9 +10315,9 @@ } }, "minimatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.3.tgz", - "integrity": "sha512-M2GCs7Vk83NxkUyQV1bkABc4yxgz9kILhHImZiBPAZ9ybuvCb0/H7lEl5XvIg3g+9d4eNotkZA5IWwYl0tibaA==", + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", "dev": true, "requires": { "brace-expansion": "^1.1.7" @@ -10559,21 +10502,6 @@ "vscode-extension-tester-locators": "^3.10.0" }, "dependencies": { - "balanced-match": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", - "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", - "dev": true - }, - "brace-expansion": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.3.tgz", - "integrity": "sha512-fy6KJm2RawA5RcHkLa1z/ScpBeA762UF9KmZQxwIbDtRJrgLzM10depAiEQ+CXYcoiqW1/m96OAAoke2nE9EeA==", - "dev": true, - "requires": { - "balanced-match": "^4.0.2" - } - }, "commander": { "version": "11.1.0", "resolved": "https://registry.npmjs.org/commander/-/commander-11.1.0.tgz", @@ -10605,12 +10533,12 @@ } }, "minimatch": { - "version": "9.0.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.6.tgz", - "integrity": "sha512-kQAVowdR33euIqeA0+VZTDqU+qo1IeVY+hrKYtZMio3Pg0P0vuh/kwRylLUddJhB6pf3q/botcOvRtx4IN1wqQ==", + "version": "9.0.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", + "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", "dev": true, "requires": { - "brace-expansion": "^5.0.2" + "brace-expansion": "^2.0.2" } } } diff --git a/package.json b/package.json index 33696d97..eff7e216 100644 --- a/package.json +++ b/package.json @@ -1117,7 +1117,7 @@ "fs-extra": "^10.1.0", "globby": "^13.1.3", "lodash": "^4.17.23", - "minimatch": "^5.1.7", + "minimatch": "^5.1.9", "semver": "^7.3.8", "vscode-extension-telemetry-wrapper": "^0.15.0", "vscode-tas-client": "^0.1.75" From 3249b00e0d23996deff4c7bda659014e7942e245 Mon Sep 17 00:00:00 2001 From: wenyt <75360946+wenytang-ms@users.noreply.github.com> Date: Mon, 9 Mar 2026 11:15:32 +0800 Subject: [PATCH 274/352] ci: update the pool (#970) --- .azure-pipelines/nightly.yml | 2 +- .azure-pipelines/rc.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.azure-pipelines/nightly.yml b/.azure-pipelines/nightly.yml index f7ca5cc1..f4747f62 100644 --- a/.azure-pipelines/nightly.yml +++ b/.azure-pipelines/nightly.yml @@ -20,7 +20,7 @@ extends: template: azure-pipelines/MicroBuild.1ES.Official.yml@MicroBuildTemplate parameters: pool: - name: VSEngSS-MicroBuild2022-1ES + name: VSEng-MicroBuildVSStable settings: networkIsolationPolicy: Permissive stages: diff --git a/.azure-pipelines/rc.yml b/.azure-pipelines/rc.yml index bb353bb6..1f7bd599 100644 --- a/.azure-pipelines/rc.yml +++ b/.azure-pipelines/rc.yml @@ -15,7 +15,7 @@ extends: template: azure-pipelines/MicroBuild.1ES.Official.yml@MicroBuildTemplate parameters: pool: - name: VSEngSS-MicroBuild2022-1ES + name: VSEng-MicroBuildVSStable settings: networkIsolationPolicy: Permissive stages: From 8ef1af7fd14f4674a7d83c80dde0ffd046bb345b Mon Sep 17 00:00:00 2001 From: wenyt <75360946+wenytang-ms@users.noreply.github.com> Date: Wed, 18 Mar 2026 13:12:06 +0800 Subject: [PATCH 275/352] feat: lsp tools exp (#972) * feat: lmt for lsp * fix: update * feat: update * fix: update * fix: adjust the prompt to load lsp java tools to replace search subagent * perf: update when * feat: lsp tools and chat instrument * feat: update the feature in exp * docs: remove unusless id * feat: update * docs: update * fix: update the code to fix the comments * fix: update * fix: chat instrument --- README.md | 2 +- .../com.microsoft.jdtls.ext.core/plugin.xml | 1 + .../jdtls/ext/core/AiContextCommand.java | 223 +++++++++++ .../jdtls/ext/core/CommandHandler.java | 2 + .../ext/core/model/ClassDetailResult.java | 49 +++ .../core/model/DependencyDetailsResult.java | 37 ++ .../ext/core/model/FileImportsResult.java | 46 +++ .../ext/core/model/ProjectContextResult.java | 42 ++ package-lock.json | 19 +- package.json | 183 ++++++++- package.nls.json | 1 + .../javaLspContext.instructions.md | 51 +++ resources/skills/java-lsp-tools/SKILL.md | 93 +++++ src/commands.ts | 2 + src/copilot/tools/javaContextTools.ts | 378 ++++++++++++++++++ src/extension.ts | 8 +- 16 files changed, 1122 insertions(+), 15 deletions(-) create mode 100644 jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/AiContextCommand.java create mode 100644 jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/model/ClassDetailResult.java create mode 100644 jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/model/DependencyDetailsResult.java create mode 100644 jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/model/FileImportsResult.java create mode 100644 jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/model/ProjectContextResult.java create mode 100644 resources/instruments/javaLspContext.instructions.md create mode 100644 resources/skills/java-lsp-tools/SKILL.md create mode 100644 src/copilot/tools/javaContextTools.ts diff --git a/README.md b/README.md index 341985ff..ac4954d9 100644 --- a/README.md +++ b/README.md @@ -57,7 +57,7 @@ You can tell that the glob pattern is supported. And here's more - you can incl ## Requirements -- VS Code (version 1.83.1+) +- VS Code (version 1.95.0+) - [Language Support for Java by Red Hat](https://marketplace.visualstudio.com/items?itemName=redhat.java) diff --git a/jdtls.ext/com.microsoft.jdtls.ext.core/plugin.xml b/jdtls.ext/com.microsoft.jdtls.ext.core/plugin.xml index a469ec92..4966a319 100644 --- a/jdtls.ext/com.microsoft.jdtls.ext.core/plugin.xml +++ b/jdtls.ext/com.microsoft.jdtls.ext.core/plugin.xml @@ -12,6 +12,7 @@ + JDK_PREFIXES = new HashSet<>(); + static { + JDK_PREFIXES.add("java."); + JDK_PREFIXES.add("javax."); + JDK_PREFIXES.add("jdk."); + JDK_PREFIXES.add("sun."); + JDK_PREFIXES.add("com.sun."); + JDK_PREFIXES.add("org.xml."); + JDK_PREFIXES.add("org.w3c."); + JDK_PREFIXES.add("jakarta."); // Jakarta EE (post Java EE) + } + + /** + * Get the classified import list of a Java file. + * This is a lightweight AST-only operation — it reads import declarations + * without doing any type resolution (findType) or classpath resolution. + * + * Typical response time: < 5ms + * + * @param arguments List containing the file URI as the first element + * @param monitor Progress monitor for cancellation support + * @return FileImportsResult with classified imports + */ + public static FileImportsResult getFileImports(List arguments, IProgressMonitor monitor) { + FileImportsResult result = new FileImportsResult(); + result.imports = new ArrayList<>(); + result.staticImports = new ArrayList<>(); + + if (arguments == null || arguments.isEmpty()) { + result.error = "No arguments provided"; + return result; + } + + try { + String fileUri = (String) arguments.get(0); + if (fileUri == null || fileUri.trim().isEmpty()) { + result.error = "Invalid file URI"; + return result; + } + + // Resolve compilation unit from URI — this is fast, just a model lookup + java.net.URI uri = JDTUtils.toURI(fileUri); + ICompilationUnit compilationUnit = JDTUtils.resolveCompilationUnit(uri); + + if (compilationUnit == null || !compilationUnit.exists()) { + result.error = "File not found or not a Java file: " + fileUri; + return result; + } + + // Get project-relative file path (strip the leading project segment + // from the Eclipse workspace-relative path, e.g. "/my-project/src/Foo.java" → "src/Foo.java") + IJavaProject javaProject = compilationUnit.getJavaProject(); + result.file = compilationUnit.getPath().removeFirstSegments(1).toString(); + + // Collect project source package names for classification + Set projectPackages = collectProjectPackages(javaProject); + + // Read import declarations — pure AST operation, no type resolution + IImportDeclaration[] imports = compilationUnit.getImports(); + if (imports == null || imports.length == 0) { + return result; // No imports, return empty (not an error) + } + + for (IImportDeclaration imp : imports) { + if (monitor.isCanceled()) { + break; + } + + String name = imp.getElementName(); + boolean isStatic = Flags.isStatic(imp.getFlags()); + boolean isOnDemand = name.endsWith(".*"); + + if (isStatic) { + StaticImportEntry entry = new StaticImportEntry(); + entry.name = name; + entry.memberKind = "unknown"; // Would need findType to know — skip + entry.source = classifyByPackageName(name, projectPackages); + result.staticImports.add(entry); + } else { + ImportEntry entry = new ImportEntry(); + entry.name = name; + entry.kind = "unknown"; // Would need findType to know — skip + entry.source = classifyByPackageName(name, projectPackages); + entry.artifact = null; // Would need classpath attributes — skip for now + entry.isOnDemand = isOnDemand; + result.imports.add(entry); + } + } + + return result; + + } catch (Exception e) { + JdtlsExtActivator.logException("Error in getFileImports", e); + result.error = "Exception: " + e.getMessage(); + return result; + } + } + + /** + * Classify an import by its package name prefix. + * This is a heuristic — no type resolution involved. + * + * @param qualifiedName the fully qualified name of the import + * @param projectPackages set of package names found in the project's source roots + * @return "jdk", "project", or "external" + */ + private static String classifyByPackageName(String qualifiedName, Set projectPackages) { + // Check JDK + for (String prefix : JDK_PREFIXES) { + if (qualifiedName.startsWith(prefix)) { + return "jdk"; + } + } + + // Check project packages + String packageName = getPackageName(qualifiedName); + if (packageName != null && projectPackages.contains(packageName)) { + return "project"; + } + + // Check if any project package is a prefix of this import + for (String projPkg : projectPackages) { + if (qualifiedName.startsWith(projPkg + ".")) { + return "project"; + } + } + + return "external"; + } + + /** + * Get the package name from a fully qualified name. + * e.g., "com.example.model.Order" → "com.example.model" + * "com.example.model.*" → "com.example.model" + */ + private static String getPackageName(String qualifiedName) { + if (qualifiedName == null) { + return null; + } + // Handle wildcard imports + if (qualifiedName.endsWith(".*")) { + return qualifiedName.substring(0, qualifiedName.length() - 2); + } + int lastDot = qualifiedName.lastIndexOf('.'); + if (lastDot > 0) { + return qualifiedName.substring(0, lastDot); + } + return null; + } + + /** + * Collect all package names that exist in the project's source roots. + * This uses getPackageFragmentRoots(K_SOURCE) which is fast — it reads + * the project model, not the filesystem. + */ + private static Set collectProjectPackages(IJavaProject javaProject) { + Set packages = new HashSet<>(); + if (javaProject == null) { + return packages; + } + + try { + IPackageFragmentRoot[] roots = javaProject.getPackageFragmentRoots(); + for (IPackageFragmentRoot root : roots) { + if (root.getKind() == IPackageFragmentRoot.K_SOURCE) { + org.eclipse.jdt.core.IJavaElement[] children = root.getChildren(); + for (org.eclipse.jdt.core.IJavaElement child : children) { + if (child instanceof org.eclipse.jdt.core.IPackageFragment) { + String pkgName = child.getElementName(); + if (pkgName != null && !pkgName.isEmpty()) { + packages.add(pkgName); + } + } + } + } + } + } catch (Exception e) { + // Non-critical — fall back to treating everything as external + JdtlsExtActivator.logException("Error collecting project packages", e); + } + + return packages; + } +} diff --git a/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/CommandHandler.java b/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/CommandHandler.java index 390dda27..49db346f 100644 --- a/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/CommandHandler.java +++ b/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/CommandHandler.java @@ -41,6 +41,8 @@ public Object executeCommand(String commandId, List arguments, IProgress return ProjectCommand.getImportClassContent(arguments, monitor); case "java.project.getDependencies": return ProjectCommand.getProjectDependencies(arguments, monitor); + case "java.project.getFileImports": + return AiContextCommand.getFileImports(arguments, monitor); default: break; } diff --git a/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/model/ClassDetailResult.java b/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/model/ClassDetailResult.java new file mode 100644 index 00000000..1c050cdc --- /dev/null +++ b/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/model/ClassDetailResult.java @@ -0,0 +1,49 @@ +package com.microsoft.jdtls.ext.core.model; + +import java.util.List; + +/** + * L1: Detailed class information. + * AI calls this for specific classes it needs to understand, not for all imports. + */ +public class ClassDetailResult { + + public String qualifiedName; // "com.example.model.Order" + public String kind; // "class" | "interface" | "enum" | "annotation" + public String uri; // file URI (for project source) or jar URI + public String source; // "project" | "external" | "jdk" + public String artifact; // GAV for external: "com.google.code.gson:gson:2.10.1" + + public String signature; // "public class Order implements Serializable" + public String superClass; // "java.lang.Object" (null if Object) + public List interfaces; // ["java.io.Serializable"] + public List annotations; // ["@Entity", "@Table(name = \"orders\")"] + + public String javadocSummary; // First sentence only, null if none + + public List constructors; // ["Order()", "Order(String orderId, Customer customer)"] + public List methods; // ["String getOrderId()", "void setStatus(OrderStatus)"] + public List fields; // ["private String orderId", "private List items"] + + public int totalMethodCount; // actual total (methods list may be truncated) + public int totalFieldCount; // actual total + + public String error; // null if success + + /** + * Builder-style static factories for common cases + */ + public static ClassDetailResult notFound(String qualifiedName) { + ClassDetailResult r = new ClassDetailResult(); + r.qualifiedName = qualifiedName; + r.error = "Type not found: " + qualifiedName; + return r; + } + + public static ClassDetailResult error(String qualifiedName, String message) { + ClassDetailResult r = new ClassDetailResult(); + r.qualifiedName = qualifiedName; + r.error = message; + return r; + } +} diff --git a/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/model/DependencyDetailsResult.java b/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/model/DependencyDetailsResult.java new file mode 100644 index 00000000..dc373de8 --- /dev/null +++ b/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/model/DependencyDetailsResult.java @@ -0,0 +1,37 @@ +package com.microsoft.jdtls.ext.core.model; + +import java.util.List; + +/** + * L1: Detailed dependency information with query filtering. + * AI calls this when it needs to investigate specific dependencies. + */ +public class DependencyDetailsResult { + + public List dependencies; + public String error; // null if success + + public static class DependencyEntry { + public String groupId; // "com.google.code.gson" + public String artifactId; // "gson" + public String version; // "2.10.1" + public String scope; // "compile" | "test" | "runtime" | "provided" | "system" + public boolean isDirect; // true = declared in pom.xml/build.gradle + public String broughtBy; // for transitive: "com.google.guava:guava:32.1.3-jre" + public String jarFileName; // "gson-2.10.1.jar" + + public DependencyEntry() {} + + public DependencyEntry(String groupId, String artifactId, String version, + String scope, boolean isDirect, String broughtBy, + String jarFileName) { + this.groupId = groupId; + this.artifactId = artifactId; + this.version = version; + this.scope = scope; + this.isDirect = isDirect; + this.broughtBy = broughtBy; + this.jarFileName = jarFileName; + } + } +} diff --git a/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/model/FileImportsResult.java b/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/model/FileImportsResult.java new file mode 100644 index 00000000..5ef31fdc --- /dev/null +++ b/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/model/FileImportsResult.java @@ -0,0 +1,46 @@ +package com.microsoft.jdtls.ext.core.model; + +import java.util.List; + +/** + * L0: Import list for a Java file. + * Returns classified imports without expanding class details. + */ +public class FileImportsResult { + + public String file; // project-relative file path (e.g. "src/main/java/com/example/Foo.java") + public List imports; + public List staticImports; + public String error; // null if success + + public static class ImportEntry { + public String name; // fully qualified name: "com.example.model.Order" + public String kind; // "class" | "interface" | "enum" | "annotation" | "unknown" + public String source; // "project" | "external" | "jdk" + public String artifact; // only for "external": "spring-context", null for others + public boolean isOnDemand; // true for wildcard imports (e.g. "import com.example.model.*") + + public ImportEntry() {} + + public ImportEntry(String name, String kind, String source, String artifact) { + this.name = name; + this.kind = kind; + this.source = source; + this.artifact = artifact; + } + } + + public static class StaticImportEntry { + public String name; // "org.junit.Assert.assertEquals" + public String memberKind; // "method" | "field" | "unknown" + public String source; // "project" | "external" | "jdk" + + public StaticImportEntry() {} + + public StaticImportEntry(String name, String memberKind, String source) { + this.name = name; + this.memberKind = memberKind; + this.source = source; + } + } +} diff --git a/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/model/ProjectContextResult.java b/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/model/ProjectContextResult.java new file mode 100644 index 00000000..113c0c9f --- /dev/null +++ b/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/model/ProjectContextResult.java @@ -0,0 +1,42 @@ +package com.microsoft.jdtls.ext.core.model; + +/** + * Structured result models for Java Context Tools. + * These models are designed for AI consumption — small, structured, layered. + * + * Design principles: + * 1. Each result should serialize to < 200 tokens of JSON + * 2. Use structured fields instead of freeform text + * 3. Only include information the AI actually needs at this granularity level + */ + +import java.util.List; + +/** + * L0: Project-level context overview. + * First thing AI should request when entering a Java project. + */ +public class ProjectContextResult { + + public ProjectMeta project; + public DependencySummary dependencies; + public List projectReferences; + public String error; // null if success + + public static class ProjectMeta { + public String name; + public String buildTool; // "Maven" | "Gradle" | "Unknown" + public String javaVersion; // compiler compliance level + public String sourceLevel; + public String targetLevel; + public List sourceRoots; // relative paths: ["src/main/java", "src/test/java"] + public String moduleName; // Java module name, null if not modular + } + + public static class DependencySummary { + public int total; + public int directCount; + public int transitiveCount; + public List direct; // GAV strings: ["group:artifact:version", ...] + } +} diff --git a/package-lock.json b/package-lock.json index 98009fcf..7a306550 100644 --- a/package-lock.json +++ b/package-lock.json @@ -29,7 +29,7 @@ "@types/mocha": "^9.1.1", "@types/node": "20.x", "@types/semver": "^7.3.13", - "@types/vscode": "1.83.1", + "@types/vscode": "1.95.0", "@vscode/test-electron": "^2.4.1", "copy-webpack-plugin": "^11.0.0", "glob": "^7.2.3", @@ -42,7 +42,7 @@ "webpack-cli": "^4.10.0" }, "engines": { - "vscode": "^1.83.1" + "vscode": "^1.95.0" } }, "node_modules/@babel/code-frame": { @@ -843,10 +843,11 @@ "dev": true }, "node_modules/@types/vscode": { - "version": "1.83.1", - "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.83.1.tgz", - "integrity": "sha512-BHu51NaNKOtDf3BOonY3sKFFmZKEpRkzqkZVpSYxowLbs5JqjOQemYFob7Gs5rpxE5tiGhfpnMpcdF/oKrLg4w==", - "dev": true + "version": "1.95.0", + "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.95.0.tgz", + "integrity": "sha512-0LBD8TEiNbet3NvWsmn59zLzOFu/txSlGxnv5yAFHCrhG9WvAnR3IvfHzMOs2aeWqgvNjq9pO99IUw8d3n+unw==", + "dev": true, + "license": "MIT" }, "node_modules/@types/ws": { "version": "8.5.10", @@ -6891,9 +6892,9 @@ "dev": true }, "@types/vscode": { - "version": "1.83.1", - "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.83.1.tgz", - "integrity": "sha512-BHu51NaNKOtDf3BOonY3sKFFmZKEpRkzqkZVpSYxowLbs5JqjOQemYFob7Gs5rpxE5tiGhfpnMpcdF/oKrLg4w==", + "version": "1.95.0", + "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.95.0.tgz", + "integrity": "sha512-0LBD8TEiNbet3NvWsmn59zLzOFu/txSlGxnv5yAFHCrhG9WvAnR3IvfHzMOs2aeWqgvNjq9pO99IUw8d3n+unw==", "dev": true }, "@types/ws": { diff --git a/package.json b/package.json index eff7e216..35c08426 100644 --- a/package.json +++ b/package.json @@ -12,8 +12,9 @@ "explorer" ], "engines": { - "vscode": "^1.83.1" + "vscode": "^1.95.0" }, + "enabledApiProposals": ["chatPromptFiles"], "repository": { "type": "git", "url": "https://github.com/Microsoft/vscode-java-dependency.git" @@ -48,6 +49,162 @@ "javaExtensions": [ "./server/com.microsoft.jdtls.ext.core-0.24.1.jar" ], + "languageModelTools": [ + { + "name": "lsp_java_getFileStructure", + "toolReferenceName": "javaFileStructure", + "modelDescription": "Get the structure (classes, methods, fields, inner classes) of a Java file. Returns a hierarchical outline with symbol kinds and line ranges. Use this first when you need to understand a file's layout before reading specific sections.", + "displayName": "Java: Get File Structure", + "canBeReferencedInPrompt": true, + "icon": "$(symbol-class)", + "when": "config.vscode-java-dependency.enableLspTools && javaLSReady", + "inputSchema": { + "type": "object", + "properties": { + "uri": { + "type": "string", + "description": "Java file path (workspace-relative or full URI)" + } + }, + "required": ["uri"] + } + }, + { + "name": "lsp_java_findSymbol", + "toolReferenceName": "javaFindSymbol", + "modelDescription": "Search for Java symbols (classes, interfaces, methods, fields) across the workspace by name. Supports partial/fuzzy matching. Use this to find where a class or method is defined.", + "displayName": "Java: Find Symbol", + "canBeReferencedInPrompt": true, + "icon": "$(search)", + "when": "config.vscode-java-dependency.enableLspTools && javaLSReady", + "inputSchema": { + "type": "object", + "properties": { + "query": { + "type": "string", + "description": "Symbol name or pattern to search for" + }, + "limit": { + "type": "number", + "description": "Maximum results (default: 20, max: 50)" + } + }, + "required": ["query"] + } + }, + { + "name": "lsp_java_getFileImports", + "toolReferenceName": "javaFileImports", + "modelDescription": "Get all import statements from a Java file, classified by source (jdk/project/external).", + "displayName": "Java: Get File Imports", + "canBeReferencedInPrompt": true, + "icon": "$(references)", + "when": "config.vscode-java-dependency.enableLspTools && javaLSReady", + "inputSchema": { + "type": "object", + "properties": { + "uri": { + "type": "string", + "description": "Java file path (workspace-relative or full URI)" + } + }, + "required": ["uri"] + } + }, + { + "name": "lsp_java_getTypeAtPosition", + "toolReferenceName": "javaTypeAtPosition", + "modelDescription": "Get the compiler-resolved type signature at a specific position. Returns fully qualified type, method signature, or field declaration. Use this when you see var, lambdas, or generics and need the exact type.", + "displayName": "Java: Get Type at Position", + "canBeReferencedInPrompt": true, + "icon": "$(symbol-field)", + "when": "config.vscode-java-dependency.enableLspTools && javaLSReady", + "inputSchema": { + "type": "object", + "properties": { + "uri": { + "type": "string", + "description": "Java file path (workspace-relative or full URI)" + }, + "line": { + "type": "number", + "description": "Zero-based line number" + }, + "character": { + "type": "number", + "description": "Zero-based character offset" + } + }, + "required": ["uri", "line", "character"] + } + }, + { + "name": "lsp_java_getCallHierarchy", + "toolReferenceName": "javaCallHierarchy", + "modelDescription": "Get incoming callers or outgoing callees of a method. PREFER THIS over grep_search when you need to find which methods call a specific method — returns precise call sites without noise from comments, imports, or string matches. Use 'incoming' for callers, 'outgoing' for callees.", + "displayName": "Java: Get Call Hierarchy", + "canBeReferencedInPrompt": true, + "icon": "$(call-incoming)", + "when": "config.vscode-java-dependency.enableLspTools && javaLSReady", + "inputSchema": { + "type": "object", + "properties": { + "uri": { + "type": "string", + "description": "Java file path (workspace-relative or full URI)" + }, + "line": { + "type": "number", + "description": "Zero-based line number of the method" + }, + "character": { + "type": "number", + "description": "Zero-based character offset within the method name" + }, + "direction": { + "type": "string", + "enum": ["incoming", "outgoing"], + "default": "incoming", + "description": "'incoming' for callers, 'outgoing' for callees" + } + }, + "required": ["uri", "line", "character", "direction"] + } + }, + { + "name": "lsp_java_getTypeHierarchy", + "toolReferenceName": "javaTypeHierarchy", + "modelDescription": "Get supertypes or subtypes/implementors of a type. PREFER THIS over grep_search('extends|implements') — returns only actual inheritance relationships. Use 'supertypes' for parents, 'subtypes' for children.", + "displayName": "Java: Get Type Hierarchy", + "canBeReferencedInPrompt": true, + "icon": "$(type-hierarchy)", + "when": "config.vscode-java-dependency.enableLspTools && javaLSReady", + "inputSchema": { + "type": "object", + "properties": { + "uri": { + "type": "string", + "description": "Java file path (workspace-relative or full URI)" + }, + "line": { + "type": "number", + "description": "Zero-based line number of the type" + }, + "character": { + "type": "number", + "description": "Zero-based character offset within the type name" + }, + "direction": { + "type": "string", + "enum": ["supertypes", "subtypes"], + "default": "supertypes", + "description": "'supertypes' for parents, 'subtypes' for children" + } + }, + "required": ["uri", "line", "character", "direction"] + } + } + ], "commands": [ { "command": "java.project.create", @@ -360,6 +517,16 @@ "type": "boolean", "description": "%configuration.java.project.explorer.showNonJavaResources%", "default": true + }, + "vscode-java-dependency.enableLspTools": { + "type": "boolean", + "scope": "application", + "description": "%configuration.vscode-java-dependency.enableLspTools.description%", + "default": false, + "tags": ["experimental"], + "experiment": { + "mode": "startup" + } } } }, @@ -1078,6 +1245,18 @@ } } } + ], + "chatSkills": [ + { + "path": "./resources/skills/java-lsp-tools/SKILL.md", + "when": "config.vscode-java-dependency.enableLspTools && javaLSReady" + } + ], + "chatInstructions": [ + { + "path": "./resources/instruments/javaLspContext.instructions.md", + "when": "config.vscode-java-dependency.enableLspTools && javaLSReady" + } ] }, "scripts": { @@ -1097,7 +1276,7 @@ "@types/mocha": "^9.1.1", "@types/node": "20.x", "@types/semver": "^7.3.13", - "@types/vscode": "1.83.1", + "@types/vscode": "1.95.0", "@vscode/test-electron": "^2.4.1", "copy-webpack-plugin": "^11.0.0", "glob": "^7.2.3", diff --git a/package.nls.json b/package.nls.json index 95052e18..a163a415 100644 --- a/package.nls.json +++ b/package.nls.json @@ -50,6 +50,7 @@ "configuration.java.project.exportJar.targetPath.customization": "The output path of the exported jar. Leave it empty if you want to manually pick the output location.", "configuration.java.project.exportJar.targetPath.workspaceFolder": "Export the jar file into the workspace folder. Its name is the same as the folder's.", "configuration.java.project.exportJar.targetPath.select": "Select output location manually when exporting the jar file.", + "configuration.vscode-java-dependency.enableLspTools.description": "Enable LSP tools for Java projects.", "taskDefinitions.java.project.exportJar.label": "The label of export jar task.", "taskDefinitions.java.project.exportJar.elements": "The content list of the exported jar.", "taskDefinitions.java.project.exportJar.mainClass": "The main class in the manifest of the exported jar.", diff --git a/resources/instruments/javaLspContext.instructions.md b/resources/instruments/javaLspContext.instructions.md new file mode 100644 index 00000000..492598c7 --- /dev/null +++ b/resources/instruments/javaLspContext.instructions.md @@ -0,0 +1,51 @@ +--- +description: Unconditionally loaded for all Java projects. Provides Java LSP tools (lsp_java_*) for compiler-accurate code navigation — significantly faster and more precise than grep_search, search_subagent, or read_file for locating Java symbols, callers, implementations, and types. +applyTo: '*' +--- + +# Java LSP Tools — Mandatory Initialization + +This workspace contains Java code. You have access to 6 compiler-accurate LSP tools that are **faster and more precise** than generic search for Java code navigation. These tools return structured results in ~20-100 tokens vs ~500-3000 tokens from grep_search, with zero false positives. + +## Step 1: Load Tools (REQUIRED — do this FIRST) + +Before ANY operation, load all 6 tools by calling `tool_search_tool_regex` **twice** (the API returns at most 5 tools per call): + +**Call 1** — basic navigation tools: +``` +lsp_java_findSymbol|lsp_java_getFileStructure|lsp_java_getFileImports +``` + +**Call 2** — hierarchy and type tools: +``` +lsp_java_getCallHierarchy|lsp_java_getTypeHierarchy|lsp_java_getTypeAtPosition +``` + +All 6 tools must be returned across the two calls. If any are missing, retry that call once. Do NOT use `grep_search`, `read_file`, `semantic_search`, `search_subagent`, or `runSubagent` on `.java` files until all tools are loaded. + +## Step 2: Always Prefer LSP Tools for Java + +| Task | ✅ Use | ❌ Not | +|---|---|---| +| Find class/method/field definition | `lsp_java_findSymbol` | `grep_search`, `semantic_search`, `search_subagent` | +| See file outline (methods, fields) | `lsp_java_getFileStructure` | `read_file` full scan | +| Find all callers of a method | `lsp_java_getCallHierarchy("incoming")` | `grep_search`, `search_subagent` | +| Find all implementations | `lsp_java_getTypeHierarchy("subtypes")` | `grep_search`, `search_subagent` | +| Resolve var/lambda/generic type | `lsp_java_getTypeAtPosition` | Guessing from code | +| Check imports | `lsp_java_getFileImports` | `read_file` first lines | +| Explore Java codebase structure | `lsp_java_*` tools above | `search_subagent`, `runSubagent` | + +**Keep using `grep_search`** for: non-Java files (xml, yaml, gradle), string literals, comments. + +**Self-check**: Before every `.java` operation, ask: "Is there a `lsp_java_*` tool for this?" If yes, use it instead of `grep_search`, `search_subagent`, or `runSubagent`. + +## Typical Workflow + +**findSymbol → getFileStructure → targeted tool → read_file (specific lines only)** + +## Fallback + +- `findSymbol` returns empty → retry with shorter keyword, then fall back to `grep_search` +- Path error → use `findSymbol` to discover correct path first +- Tool error / jdtls not ready → fall back to `read_file` + `grep_search`, don't retry more than once + diff --git a/resources/skills/java-lsp-tools/SKILL.md b/resources/skills/java-lsp-tools/SKILL.md new file mode 100644 index 00000000..6fd6633c --- /dev/null +++ b/resources/skills/java-lsp-tools/SKILL.md @@ -0,0 +1,93 @@ +--- +name: java-lsp-tools +description: Compiler-accurate Java code intelligence tools powered by the Java Language Server. ALWAYS load this skill when the workspace contains Java, Maven (pom.xml), or Gradle (build.gradle) projects. Use these tools to find symbol definitions, get type/call hierarchies, resolve types, inspect file outlines, and check imports in Java source files. Prefer over grep_search or read_file for any Java code navigation, understanding, debugging, or refactoring task. +--- + +# Java LSP Tools + +Compiler-accurate Java code intelligence via the Java Language Server (jdtls). These 6 tools provide structured, low-token answers that are more precise than `grep_search` or `read_file` for Java code. + +## Activation + +These tools are **deferred** and must be discovered before first use. Activate all 6 tools at once with `tool_search_tool_regex` using pattern: + +`lsp_java_findSymbol|lsp_java_getFileStructure|lsp_java_getCallHierarchy|lsp_java_getTypeHierarchy|lsp_java_getTypeAtPosition|lsp_java_getFileImports` + +You only need to do this **once per session**. + +## When to Replace grep_search + +For Java source files, **always prefer these tools over generic alternatives**: + +| You're doing... | Use instead | Why | +|---|---|---| +| Find where a class/method is defined | `lsp_java_findSymbol` | ~60 tokens vs ~500 for grep (no comment/import noise) | +| Find all callers of a method | `lsp_java_getCallHierarchy("incoming")` | ~80 tokens vs ~3000 for grep (precise call sites only) | +| Find all implementations of an interface | `lsp_java_getTypeHierarchy("subtypes")` | ~60 tokens vs ~1000 for grep | +| Check a `var`/lambda/generic type | `lsp_java_getTypeAtPosition` | ~20 tokens vs guessing wrong | +| Search in non-Java files (xml, yaml, gradle) | Keep using `grep_search` | lsp_java_* tools only work on Java source | +| Search for string literals or comments | Keep using `grep_search` | lsp_java_* tools return symbol definitions only | + +**Rule of thumb**: If you're searching for a Java symbol name in `.java` files, there is almost always a `lsp_java_*` tool that returns more precise results with fewer tokens than `grep_search`. + +## Anti-patterns (Avoid these) + +❌ **Don't**: Use `grep_search("decodeLbs")` to find who calls `decodeLbs()` + - Returns 8+ matches including declaration, comments, imports → ~3000 output tokens + +✅ **Do**: Use `lsp_java_getCallHierarchy(uri, line, char, "incoming")` + - Returns only actual call sites → ~80 output tokens + +❌ **Don't**: Use `grep_search("class.*extends BaseDecoder")` to find subclasses +✅ **Do**: Use `lsp_java_getTypeHierarchy(uri, line, char, "subtypes")` + +❌ **Don't**: Read entire 1000+ line file to understand its structure +✅ **Do**: Use `lsp_java_getFileStructure(uri)` first, then `read_file` on specific line ranges + +## Tools + +All tools accept **workspace-relative paths** (e.g. `src/main/java/com/example/MyClass.java`) or full file URIs. All return structured JSON, each response < 200 tokens. + +### `lsp_java_getFileStructure` +Get hierarchical outline (classes, methods, fields) with line ranges. +Input: `{ uri }` → Output: symbol tree with `[L start-end]` ranges (~100 tokens) + +### `lsp_java_findSymbol` +Search for symbol definitions by name across the workspace. Supports partial/fuzzy matching. +Input: `{ query }` → Output: up to 20 results with `{ name, kind, location }` (~60 tokens) + +### `lsp_java_getFileImports` +Get all imports classified by source (jdk/project/external). +Input: `{ uri }` → Output: classified import list (~80 tokens) + +### `lsp_java_getTypeAtPosition` +Get compiler-resolved type signature at a specific position. +Input: `{ uri, line, character }` (0-based) → Output: fully resolved type (~20 tokens) + +### `lsp_java_getCallHierarchy` +Find all callers (incoming) or callees (outgoing) of a method. +Input: `{ uri, line, character, direction }` (0-based, direction: `"incoming"` | `"outgoing"`) → Output: list of `{ name, detail, location }` (~80 tokens) + +### `lsp_java_getTypeHierarchy` +Find supertypes or subtypes/implementors of a type. +Input: `{ uri, line, character, direction }` (0-based, direction: `"supertypes"` | `"subtypes"`) → Output: list of `{ name, kind, location }` (~60 tokens) + +## Common Workflows + +Most tasks follow the pattern: **findSymbol → getFileStructure → targeted tool**. + +| Scenario | Workflow | Trigger | +|---|---|---| +| Debug a bug | `findSymbol` → `getFileStructure` → `read_file` (buggy method) → **`getCallHierarchy("incoming")`** → `read_file` (caller context) | When you found the buggy method and need to know ALL callers | +| Analyze impact | `findSymbol` → `getFileStructure` → `getCallHierarchy("incoming")` | Before editing a method, check who depends on it | +| Understand inheritance | `findSymbol` → `getTypeHierarchy("subtypes")` | When you see a base class and need all implementations | +| Check dependencies | `getFileImports` → `findSymbol` (dependency) → `getFileStructure` | When understanding external library usage | +| Resolve type ambiguity | `getFileStructure` → `getTypeAtPosition` | When you see `var`, generics, or lambda and need exact type | + +## Fallback + +- **`lsp_java_findSymbol` returns empty**: + - Symbol may not exist yet → switch to `read_file` + `grep_search` to confirm, then create it + - Spelling/query too specific → retry once with a shorter keyword (e.g. `"UserSvc"` instead of `"UserServiceImpl"`) +- **Path error** (e.g. "Unable to resolve nonexistent file"): Use `lsp_java_findSymbol` to discover the correct file path first, then retry. +- **Tool error / empty result** (jdtls not ready, file not in project): Fall back to `read_file` + `grep_search`. Don't retry more than once. diff --git a/src/commands.ts b/src/commands.ts index 0e7a69cd..5331ab3e 100644 --- a/src/commands.ts +++ b/src/commands.ts @@ -138,6 +138,8 @@ export namespace Commands { export const JAVA_PROJECT_GET_IMPORT_CLASS_CONTENT = "java.project.getImportClassContent"; + export const JAVA_PROJECT_GET_FILE_IMPORTS = "java.project.getFileImports"; + export const JAVA_UPGRADE_WITH_COPILOT = "_java.upgradeWithCopilot"; /** diff --git a/src/copilot/tools/javaContextTools.ts b/src/copilot/tools/javaContextTools.ts new file mode 100644 index 00000000..423f6eac --- /dev/null +++ b/src/copilot/tools/javaContextTools.ts @@ -0,0 +1,378 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +/** + * Java Context Tools — First Batch (Zero-Blocking) + * + * These 6 tools are all non-blocking after jdtls is ready: + * 1. lsp_java_getFileStructure — LSP documentSymbol + * 2. lsp_java_findSymbol — LSP workspaceSymbol + * 3. lsp_java_getFileImports — jdtls AST-only command (no type resolution) + * 4. lsp_java_getTypeAtPosition — LSP hover (post-processed) + * 5. lsp_java_getCallHierarchy — LSP call hierarchy + * 6. lsp_java_getTypeHierarchy — LSP type hierarchy + * + * Design principles: + * - Each tool returns < 200 tokens + * - Structured JSON output + * - No classpath resolution, no dependency download + */ + +import * as vscode from "vscode"; +import { Commands } from "../../commands"; + +// Hard caps to keep tool responses within the < 200 token budget. +const MAX_SYMBOL_DEPTH = 3; +const MAX_SYMBOL_NODES = 80; +const MAX_CALL_RESULTS = 50; +const MAX_TYPE_RESULTS = 50; +const MAX_IMPORTS = 50; + +function toResult(data: unknown): vscode.LanguageModelToolResult { + const text = typeof data === "string" ? data : JSON.stringify(data, null, 2); + return new vscode.LanguageModelToolResult([ + new vscode.LanguageModelTextPart(text), + ]); +} + +/** + * Resolve a file path to a vscode.Uri. + * Accepts: + * - Full file URI: "file:///home/user/project/src/Main.java" + * - Relative path: "src/main/java/Main.java" + * - Absolute path: "/home/user/project/src/Main.java" or "C:\\Users\\...\\Main.java" + * + * Relative paths are resolved against the first workspace folder. + * The resolved URI must use the file: scheme and fall under a workspace folder. + */ +function resolveFileUri(input: string): vscode.Uri { + const folders = vscode.workspace.workspaceFolders; + if (!folders || folders.length === 0) { + throw new Error("No workspace folder is open."); + } + + let uri: vscode.Uri; + + // Full URI — only allow the file: scheme + if (/^[a-zA-Z][a-zA-Z0-9+.-]*:\/\//.test(input) || /^[a-zA-Z][a-zA-Z0-9+.-]*:/.test(input)) { + uri = vscode.Uri.parse(input); + if (uri.scheme !== "file") { + throw new Error(`Unsupported URI scheme "${uri.scheme}". Only file: URIs are allowed.`); + } + } else if (input.startsWith("/") || /^[a-zA-Z]:[/\\]/.test(input)) { + // Absolute path (Unix or Windows) + uri = vscode.Uri.file(input); + } else { + // Relative path — resolve against first workspace folder + uri = vscode.Uri.joinPath(folders[0].uri, input); + } + + // Ensure the resolved path is under a workspace folder + const resolvedPath = uri.fsPath.toLowerCase(); + const isUnderWorkspace = folders.some(folder => { + const folderPath = folder.uri.fsPath.toLowerCase(); + return resolvedPath === folderPath || resolvedPath.startsWith(folderPath + (process.platform === "win32" ? "\\" : "/")); + }); + if (!isUnderWorkspace) { + throw new Error("The resolved path is outside the current workspace."); + } + + return uri; +} + +// ============================================================ +// Tool 1: lsp_java_getFileStructure (LSP — Document Symbol) +// ============================================================ + +interface FileStructureInput { + uri: string; +} + +const fileStructureTool: vscode.LanguageModelTool = { + async invoke(options, _token) { + const uri = resolveFileUri(options.input.uri); + const symbols = await vscode.commands.executeCommand( + "vscode.executeDocumentSymbolProvider", uri, + ); + if (!symbols || symbols.length === 0) { + return toResult({ error: "No symbols found. The file may not be recognized by the Java language server." }); + } + const counter = { count: 0 }; + const result = symbolsToJson(symbols, 0, counter); + const truncated = counter.count >= MAX_SYMBOL_NODES; + return toResult({ symbols: result, ...(truncated && { truncated: true }) }); + }, +}; + +interface SymbolNode { + name: string; + kind: string; + range: string; + detail?: string; + children?: SymbolNode[]; +} + +function symbolsToJson(symbols: vscode.DocumentSymbol[], depth: number, counter: { count: number }): SymbolNode[] { + const result: SymbolNode[] = []; + for (const s of symbols) { + if (counter.count >= MAX_SYMBOL_NODES) { + break; + } + counter.count++; + const node: SymbolNode = { + name: s.name, + kind: vscode.SymbolKind[s.kind], + range: `L${s.range.start.line + 1}-${s.range.end.line + 1}`, + }; + if (s.detail) { + node.detail = s.detail; + } + if (s.children?.length && depth < MAX_SYMBOL_DEPTH) { + node.children = symbolsToJson(s.children, depth + 1, counter); + } + result.push(node); + } + return result; +} + +// ============================================================ +// Tool 2: lsp_java_findSymbol (LSP — Workspace Symbol) +// ============================================================ + +interface FindSymbolInput { + query: string; + limit?: number; +} + +const findSymbolTool: vscode.LanguageModelTool = { + async invoke(options, _token) { + const symbols = await vscode.commands.executeCommand( + "vscode.executeWorkspaceSymbolProvider", options.input.query, + ); + if (!symbols || symbols.length === 0) { + return toResult({ results: [], message: `No symbols matching '${options.input.query}' found.` }); + } + const limit = Math.min(Math.max(options.input.limit || 20, 1), 50); + const results = symbols.slice(0, limit).map(s => ({ + name: s.name, + kind: vscode.SymbolKind[s.kind], + location: `${vscode.workspace.asRelativePath(s.location.uri)}:${s.location.range.start.line + 1}`, + })); + return toResult({ results, total: symbols.length }); + }, +}; + +// ============================================================ +// Tool 3: lsp_java_getFileImports (jdtls — AST-only, non-blocking) +// ============================================================ + +interface FileImportsInput { + uri: string; +} + +const fileImportsTool: vscode.LanguageModelTool = { + async invoke(options, _token) { + const uri = resolveFileUri(options.input.uri); + const result = await vscode.commands.executeCommand( + Commands.EXECUTE_WORKSPACE_COMMAND, + Commands.JAVA_PROJECT_GET_FILE_IMPORTS, + uri.toString(), + ); + if (!result) { + return toResult({ error: "No result from Java language server. It may still be loading." }); + } + if (Array.isArray(result) && result.length > MAX_IMPORTS) { + return toResult({ imports: result.slice(0, MAX_IMPORTS), total: result.length, truncated: true }); + } + return toResult(result); + }, +}; + +// ============================================================ +// Tool 4: lsp_java_getTypeAtPosition (LSP — Hover post-processed) +// ============================================================ + +interface TypeAtPositionInput { + uri: string; + line: number; + character: number; +} + +const typeAtPositionTool: vscode.LanguageModelTool = { + async invoke(options, _token) { + const uri = resolveFileUri(options.input.uri); + const position = new vscode.Position(options.input.line, options.input.character); + const hovers = await vscode.commands.executeCommand( + "vscode.executeHoverProvider", uri, position, + ); + return toResult(extractTypeSignature(hovers)); + }, +}; + +/** + * Extract type signature from jdtls hover result. + * jdtls returns Markdown with ```java code blocks containing the type info. + * We extract just the signature, stripping Javadoc to minimize tokens. + */ +function extractTypeSignature(hovers: vscode.Hover[] | undefined): object { + if (!hovers?.length) { + return { error: "No type information at this position" }; + } + for (const hover of hovers) { + for (const content of hover.contents) { + if (content instanceof vscode.MarkdownString) { + const match = content.value.match(/```java\n([\s\S]*?)```/); + if (match) { + const lines = match[1].trim().split("\n").filter(l => { + const trimmed = l.trim(); + if (trimmed.length === 0) { + return false; + } + // Strip Javadoc and block comment lines + if (trimmed.startsWith("/**") || trimmed.startsWith("*/") || trimmed.startsWith("* ") || trimmed === "*") { + return false; + } + // Strip single-line comments + if (trimmed.startsWith("//")) { + return false; + } + return true; + }); + return { type: lines.join("\n") }; + } + } + } + } + return { error: "Could not extract type from hover result" }; +} + +// ============================================================ +// Tool 5: lsp_java_getCallHierarchy (LSP — Call Hierarchy) +// ============================================================ + +interface CallHierarchyInput { + uri: string; + line: number; + character: number; + direction: "incoming" | "outgoing"; +} + +const callHierarchyTool: vscode.LanguageModelTool = { + async invoke(options, _token) { + const uri = resolveFileUri(options.input.uri); + const position = new vscode.Position(options.input.line, options.input.character); + + // Step 1: Prepare call hierarchy item at the given position + const items = await vscode.commands.executeCommand( + "vscode.prepareCallHierarchy", uri, position, + ); + if (!items?.length) { + return toResult({ error: "No callable symbol at this position" }); + } + + // Step 2: Get incoming or outgoing calls + const isIncoming = options.input.direction === "incoming"; + const command = isIncoming ? "vscode.provideIncomingCalls" : "vscode.provideOutgoingCalls"; + const calls = await vscode.commands.executeCommand(command, items[0]); + + if (!calls || calls.length === 0) { + return toResult({ + symbol: items[0].name, + direction: options.input.direction, + calls: [], + message: `No ${options.input.direction} calls found for '${items[0].name}'`, + }); + } + + const truncated = calls.length > MAX_CALL_RESULTS; + const capped = truncated ? calls.slice(0, MAX_CALL_RESULTS) : calls; + const results = capped.map((call: any) => { + const item = isIncoming ? call.from : call.to; + return { + name: item.name, + detail: item.detail || undefined, + location: `${vscode.workspace.asRelativePath(item.uri)}:${item.range.start.line + 1}`, + }; + }); + + return toResult({ + symbol: items[0].name, + direction: options.input.direction, + calls: results, + ...(truncated && { total: calls.length, truncated: true }), + }); + }, +}; + +// ============================================================ +// Tool 6: lsp_java_getTypeHierarchy (LSP — Type Hierarchy) +// ============================================================ + +interface TypeHierarchyInput { + uri: string; + line: number; + character: number; + direction: "supertypes" | "subtypes"; +} + +const typeHierarchyTool: vscode.LanguageModelTool = { + async invoke(options, _token) { + const uri = resolveFileUri(options.input.uri); + const position = new vscode.Position(options.input.line, options.input.character); + + // Step 1: Prepare type hierarchy item at the given position + const items = await vscode.commands.executeCommand( + "vscode.prepareTypeHierarchy", uri, position, + ); + if (!items?.length) { + return toResult({ error: "No type at this position" }); + } + + // Step 2: Get supertypes or subtypes + const isSuper = options.input.direction === "supertypes"; + const command = isSuper ? "vscode.provideSupertypes" : "vscode.provideSubtypes"; + const types = await vscode.commands.executeCommand(command, items[0]); + + if (!types || types.length === 0) { + return toResult({ + symbol: items[0].name, + direction: options.input.direction, + types: [], + message: `No ${options.input.direction} found for '${items[0].name}'`, + }); + } + + const truncated = types.length > MAX_TYPE_RESULTS; + const capped = truncated ? types.slice(0, MAX_TYPE_RESULTS) : types; + const results = capped.map(t => ({ + name: t.name, + kind: vscode.SymbolKind[t.kind], + detail: t.detail || undefined, + location: `${vscode.workspace.asRelativePath(t.uri)}:${t.range.start.line + 1}`, + })); + + return toResult({ + symbol: items[0].name, + direction: options.input.direction, + types: results, + ...(truncated && { total: types.length, truncated: true }), + }); + }, +}; + +// ============================================================ +// Registration +// ============================================================ + +export function registerJavaContextTools(context: vscode.ExtensionContext): void { + context.subscriptions.push( + vscode.lm.registerTool("lsp_java_getFileStructure", fileStructureTool), + vscode.lm.registerTool("lsp_java_findSymbol", findSymbolTool), + vscode.lm.registerTool("lsp_java_getFileImports", fileImportsTool), + vscode.lm.registerTool("lsp_java_getTypeAtPosition", typeAtPositionTool), + vscode.lm.registerTool("lsp_java_getCallHierarchy", callHierarchyTool), + vscode.lm.registerTool("lsp_java_getTypeHierarchy", typeHierarchyTool), + ); +} diff --git a/src/extension.ts b/src/extension.ts index c89b6547..aa915423 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -21,7 +21,7 @@ import { setContextForDeprecatedTasks, updateExportTaskType } from "./tasks/buil import { CodeActionProvider } from "./tasks/buildArtifact/migration/CodeActionProvider"; import { newJavaFile } from "./explorerCommands/new"; import upgradeManager from "./upgrade/upgradeManager"; -import { registerCopilotContextProviders } from "./copilot/contextProvider"; +import { registerJavaContextTools } from "./copilot/tools/javaContextTools"; import { languageServerApiManager } from "./languageServerApi/languageServerApiManager"; export async function activate(context: ExtensionContext): Promise { @@ -88,8 +88,10 @@ async function activateExtension(_operationId: string, context: ExtensionContext // Register Copilot context providers after Java Language Server is ready languageServerApiManager.ready().then((isReady) => { - if (isReady) { - registerCopilotContextProviders(context); + const config = workspace.getConfiguration("vscode-java-dependency"); + const isSettingEnabled = config.get("enableLspTools", true); + if (isReady && isSettingEnabled) { + registerJavaContextTools(context); } }); } From 4a3ff5f0aedd5ac7ae4ce917f86af8a88c25007d Mon Sep 17 00:00:00 2001 From: wenyt <75360946+wenytang-ms@users.noreply.github.com> Date: Wed, 18 Mar 2026 15:40:41 +0800 Subject: [PATCH 276/352] ci: update publish scropt (#973) --- .azure-pipelines/release-nightly.yml | 2 +- .azure-pipelines/release.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.azure-pipelines/release-nightly.yml b/.azure-pipelines/release-nightly.yml index a47d9b2d..f7576f0a 100644 --- a/.azure-pipelines/release-nightly.yml +++ b/.azure-pipelines/release-nightly.yml @@ -52,4 +52,4 @@ extends: azureSubscription: 'VSCode-Ext-Publishing' scriptType: pscore scriptLocation: inlineScript - inlineScript: 'npx @vscode/vsce@latest publish -i ''$(Build.SourcesDirectory)/extension.vsix'' --manifestPath ''$(Build.SourcesDirectory)/extension.manifest'' --signaturePath ''$(Build.SourcesDirectory)/extension.signature.p7s'' --azure-credential' \ No newline at end of file + inlineScript: 'npx @vscode/vsce@latest publish -i ''$(Build.SourcesDirectory)/extension.vsix'' --manifestPath ''$(Build.SourcesDirectory)/extension.manifest'' --signaturePath ''$(Build.SourcesDirectory)/extension.signature.p7s'' --allow-proposed-apis chatPromptFiles --azure-credential' \ No newline at end of file diff --git a/.azure-pipelines/release.yml b/.azure-pipelines/release.yml index a47d9b2d..f7576f0a 100644 --- a/.azure-pipelines/release.yml +++ b/.azure-pipelines/release.yml @@ -52,4 +52,4 @@ extends: azureSubscription: 'VSCode-Ext-Publishing' scriptType: pscore scriptLocation: inlineScript - inlineScript: 'npx @vscode/vsce@latest publish -i ''$(Build.SourcesDirectory)/extension.vsix'' --manifestPath ''$(Build.SourcesDirectory)/extension.manifest'' --signaturePath ''$(Build.SourcesDirectory)/extension.signature.p7s'' --azure-credential' \ No newline at end of file + inlineScript: 'npx @vscode/vsce@latest publish -i ''$(Build.SourcesDirectory)/extension.vsix'' --manifestPath ''$(Build.SourcesDirectory)/extension.manifest'' --signaturePath ''$(Build.SourcesDirectory)/extension.signature.p7s'' --allow-proposed-apis chatPromptFiles --azure-credential' \ No newline at end of file From de8621120762c293f14b5c7df7aaad16e92fb5ad Mon Sep 17 00:00:00 2001 From: wenyt <75360946+wenytang-ms@users.noreply.github.com> Date: Wed, 18 Mar 2026 22:22:52 +0800 Subject: [PATCH 277/352] fix: chat instrument (#975) --- package.json | 1 - 1 file changed, 1 deletion(-) diff --git a/package.json b/package.json index 35c08426..7e5c0038 100644 --- a/package.json +++ b/package.json @@ -14,7 +14,6 @@ "engines": { "vscode": "^1.95.0" }, - "enabledApiProposals": ["chatPromptFiles"], "repository": { "type": "git", "url": "https://github.com/Microsoft/vscode-java-dependency.git" From be626533ed701adc75f25672de21c556c536732d Mon Sep 17 00:00:00 2001 From: wenyt <75360946+wenytang-ms@users.noreply.github.com> Date: Thu, 19 Mar 2026 19:25:52 +0800 Subject: [PATCH 278/352] perf: add telemetry event for lsp tool call (#976) * perf: add telemetry event for lsp tool call * perf: adjust telemetry event --- src/copilot/tools/javaContextTools.ts | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/copilot/tools/javaContextTools.ts b/src/copilot/tools/javaContextTools.ts index 423f6eac..24b43594 100644 --- a/src/copilot/tools/javaContextTools.ts +++ b/src/copilot/tools/javaContextTools.ts @@ -22,6 +22,7 @@ import * as vscode from "vscode"; import { Commands } from "../../commands"; +import { sendInfo } from "vscode-extension-telemetry-wrapper"; // Hard caps to keep tool responses within the < 200 token budget. const MAX_SYMBOL_DEPTH = 3; @@ -92,6 +93,7 @@ interface FileStructureInput { const fileStructureTool: vscode.LanguageModelTool = { async invoke(options, _token) { + sendInfo("", { operationName: "lmTool.getFileStructure" }); const uri = resolveFileUri(options.input.uri); const symbols = await vscode.commands.executeCommand( "vscode.executeDocumentSymbolProvider", uri, @@ -148,6 +150,7 @@ interface FindSymbolInput { const findSymbolTool: vscode.LanguageModelTool = { async invoke(options, _token) { + sendInfo("", { operationName: "lmTool.findSymbol" }); const symbols = await vscode.commands.executeCommand( "vscode.executeWorkspaceSymbolProvider", options.input.query, ); @@ -174,6 +177,7 @@ interface FileImportsInput { const fileImportsTool: vscode.LanguageModelTool = { async invoke(options, _token) { + sendInfo("", { operationName: "lmTool.getFileImports" }); const uri = resolveFileUri(options.input.uri); const result = await vscode.commands.executeCommand( Commands.EXECUTE_WORKSPACE_COMMAND, @@ -202,6 +206,7 @@ interface TypeAtPositionInput { const typeAtPositionTool: vscode.LanguageModelTool = { async invoke(options, _token) { + sendInfo("", { operationName: "lmTool.getTypeAtPosition" }); const uri = resolveFileUri(options.input.uri); const position = new vscode.Position(options.input.line, options.input.character); const hovers = await vscode.commands.executeCommand( @@ -261,6 +266,7 @@ interface CallHierarchyInput { const callHierarchyTool: vscode.LanguageModelTool = { async invoke(options, _token) { + sendInfo("", { operationName: "lmTool.getCallHierarchy" }); const uri = resolveFileUri(options.input.uri); const position = new vscode.Position(options.input.line, options.input.character); @@ -319,6 +325,7 @@ interface TypeHierarchyInput { const typeHierarchyTool: vscode.LanguageModelTool = { async invoke(options, _token) { + sendInfo("", { operationName: "lmTool.getTypeHierarchy" }); const uri = resolveFileUri(options.input.uri); const position = new vscode.Position(options.input.line, options.input.character); @@ -367,6 +374,7 @@ const typeHierarchyTool: vscode.LanguageModelTool = { // ============================================================ export function registerJavaContextTools(context: vscode.ExtensionContext): void { + sendInfo("", { operationName: "lmTool.register" }); context.subscriptions.push( vscode.lm.registerTool("lsp_java_getFileStructure", fileStructureTool), vscode.lm.registerTool("lsp_java_findSymbol", findSymbolTool), From f5bc3ed8bc406f6bdc3558ba1baa3060f488e008 Mon Sep 17 00:00:00 2001 From: Frank Liu <63277848+frankliu20@users.noreply.github.com> Date: Fri, 20 Mar 2026 13:15:05 +0800 Subject: [PATCH 279/352] chore: update upgrade prompt after merging extension (#971) * chore: update upgarde prompt after merging extension * fix * fix: address Copilot review comments --------- Co-authored-by: app_modernization Co-authored-by: wenyt <75360946+wenytang-ms@users.noreply.github.com> --- src/commands.ts | 4 ++-- src/constants.ts | 3 ++- src/upgrade/dependency.metadata.ts | 2 +- src/upgrade/upgradeManager.ts | 2 +- src/upgrade/utility.ts | 9 ++++----- 5 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/commands.ts b/src/commands.ts index 5331ab3e..ec7934cc 100644 --- a/src/commands.ts +++ b/src/commands.ts @@ -167,9 +167,9 @@ export namespace Commands { export const BUILD_PROJECT = "java.project.build"; /** - * Commands from Java Upgrade Tool + * Commands from appmod (Java Upgrade Tool) */ - export const GOTO_AGENT_MODE = "javaupgrade.gotoAgentMode"; + export const GOTO_AGENT_MODE = "appmod.javaUpgrade.gotoAgentMode"; /** * Get the project settings diff --git a/src/constants.ts b/src/constants.ts index 8bb176a5..0345b5a0 100644 --- a/src/constants.ts +++ b/src/constants.ts @@ -34,7 +34,8 @@ export namespace Explorer { export namespace ExtensionName { export const JAVA_LANGUAGE_SUPPORT: string = "redhat.java"; export const APP_MODERNIZATION_FOR_JAVA = "vscjava.migrate-java-to-azure"; - export const APP_MODERNIZATION_UPGRADE_FOR_JAVA = "vscjava.vscode-java-upgrade"; + // Java upgrade extension is merged into app modernization extension + export const APP_MODERNIZATION_UPGRADE_FOR_JAVA = APP_MODERNIZATION_FOR_JAVA; export const APP_MODERNIZATION_EXTENSION_NAME = "GitHub Copilot app modernization"; } diff --git a/src/upgrade/dependency.metadata.ts b/src/upgrade/dependency.metadata.ts index f676f72a..df7b3380 100644 --- a/src/upgrade/dependency.metadata.ts +++ b/src/upgrade/dependency.metadata.ts @@ -4,7 +4,7 @@ import { Upgrade } from "../constants"; import { UpgradeReason, type DependencyCheckMetadata } from "./type"; -const MATURE_JAVA_LTS_VERSION = 21; +const MATURE_JAVA_LTS_VERSION = 25; export const DEPENDENCY_JAVA_RUNTIME = { "name": "Java Runtime", diff --git a/src/upgrade/upgradeManager.ts b/src/upgrade/upgradeManager.ts index 155eda17..1f9f1d3a 100644 --- a/src/upgrade/upgradeManager.ts +++ b/src/upgrade/upgradeManager.ts @@ -28,7 +28,7 @@ class UpgradeManager { context.subscriptions.push(instrumentOperationAsVsCodeCommand(Commands.JAVA_UPGRADE_WITH_COPILOT, async (promptText?: string) => { await checkOrInstallAppModExtensionForUpgrade(ExtensionName.APP_MODERNIZATION_UPGRADE_FOR_JAVA); const promptToUse = promptText ?? DEFAULT_UPGRADE_PROMPT; - await commands.executeCommand(Commands.GOTO_AGENT_MODE, { prompt: promptToUse }); + await commands.executeCommand(Commands.GOTO_AGENT_MODE, { prompt: promptToUse, useCustomAgent: true }); })); // Show modernization view diff --git a/src/upgrade/utility.ts b/src/upgrade/utility.ts index 9db7e829..40fb2de2 100644 --- a/src/upgrade/utility.ts +++ b/src/upgrade/utility.ts @@ -34,7 +34,7 @@ export function buildNotificationMessage(issue: UpgradeIssue, hasExtension: bool const upgradeWord = hasExtension ? "upgrade" : `install ${ExtensionName.APP_MODERNIZATION_EXTENSION_NAME} extension and upgrade`; if (packageId === Upgrade.PACKAGE_ID_FOR_JAVA_RUNTIME) { - return `This project is using an older Java runtime (${currentVersion}). Would you like to ${upgradeWord} it to ${suggestedVersionName} (LTS)?`; + return `This project is using an older Java runtime (${currentVersion}). Would you like to ${upgradeWord} it to the latest LTS version?`; } switch (reason) { @@ -94,16 +94,15 @@ export function buildFixPrompt(issue: UpgradeIssue): string { switch (reason) { case UpgradeReason.JRE_TOO_OLD: { - const { suggestedVersion: { name: suggestedVersionName } } = issue; - return `upgrade java runtime to the LTS version ${suggestedVersionName} using java upgrade tools by invoking #generate_upgrade_plan`; + return `upgrade java runtime to the latest LTS version`; } case UpgradeReason.END_OF_LIFE: case UpgradeReason.DEPRECATED: { const { suggestedVersion: { name: suggestedVersionName } } = issue; - return `upgrade ${packageDisplayName} to ${suggestedVersionName} using java upgrade tools by invoking #generate_upgrade_plan`; + return `upgrade ${packageDisplayName} to ${suggestedVersionName}`; } case UpgradeReason.CVE: { - return `fix all critical and high-severity CVE vulnerabilities in this project by invoking #validate_cves_for_java`; + return `fix all critical and high-severity CVE vulnerabilities in this project by invoking #appmod-validate-cves-for-java`; } } } From 6fcc4eda6c6165d5b205256aed44f29f88c6938a Mon Sep 17 00:00:00 2001 From: wenyt <75360946+wenytang-ms@users.noreply.github.com> Date: Fri, 20 Mar 2026 16:31:21 +0800 Subject: [PATCH 280/352] ci: fix ui test on windows (#974) * ci: fix ci * chore: update * ci: fix ui test case * fix: fix ui test on linux * fix: improve Windows UI test stability - renameFile: use command palette to save instead of TextEditor.save() which fails with ElementNotInteractableError after rename dialog - invisible project: add sleep after workspace switch for UI to settle - Add dismissModalDialogIfPresent() helper to handle modal dialogs (e.g. workspace trust) that block sidebar clicks on Windows CI - Call dialog dismissal in expandInJavaProjects, invisible project test, and java.project.create test Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * fix: retry finding Java Projects section on Linux CI The javaProjectExplorer.focus command may not render the section immediately on Linux. Add retry loop with re-issuing the command. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * refactor: replace fixed sleep() with polling helpers in UI tests Replace 12 fixed sleep() calls with condition-based polling: - waitForTreeItem / waitForTreeItemGone: poll tree view for item presence - waitForFileExists / waitForFileGone: poll filesystem for file state - waitForModalDialog: poll for dialog appearance with graceful fallback - waitForEditorTitle: poll for editor to show expected file title This makes tests resilient to CI timing variations instead of relying on hardcoded delays that may be too short on slow machines. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * fix: address lint errors in UI test helpers - Use const instead of let for simpleItem (prefer-const) - Add braces to all single-line if statements (curly) Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --------- Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .github/workflows/linuxUI.yml | 9 +- .github/workflows/windowsUI.yml | 9 +- package-lock.json | 6870 ++++++++++++++++++++++++------- package.json | 4 +- test/ui/command.test.ts | 217 +- test/ui/index.ts | 19 +- tsconfig.json | 3 +- 7 files changed, 5501 insertions(+), 1630 deletions(-) diff --git a/.github/workflows/linuxUI.yml b/.github/workflows/linuxUI.yml index 89deaf32..b8c5f837 100644 --- a/.github/workflows/linuxUI.yml +++ b/.github/workflows/linuxUI.yml @@ -12,7 +12,7 @@ jobs: runs-on: ubuntu-latest timeout-minutes: 30 steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v4 - name: Setup Build Environment run: | @@ -22,12 +22,13 @@ jobs: sleep 3 - name: Set up JDK 21 - uses: actions/setup-java@v1 + uses: actions/setup-java@v4 with: java-version: '21' + distribution: 'temurin' - name: Setup Node.js environment - uses: actions/setup-node@v2 + uses: actions/setup-node@v4 with: node-version: 20 @@ -35,7 +36,7 @@ jobs: run: npm install - name: Install VSCE - run: npm install -g vsce + run: npm install -g @vscode/vsce - name: Build OSGi bundle run: npm run build-server diff --git a/.github/workflows/windowsUI.yml b/.github/workflows/windowsUI.yml index 90a7f322..a952e1a7 100644 --- a/.github/workflows/windowsUI.yml +++ b/.github/workflows/windowsUI.yml @@ -12,15 +12,16 @@ jobs: runs-on: windows-latest timeout-minutes: 30 steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v4 - name: Set up JDK 21 - uses: actions/setup-java@v1 + uses: actions/setup-java@v4 with: java-version: '21' + distribution: 'temurin' - name: Setup Node.js environment - uses: actions/setup-node@v2 + uses: actions/setup-node@v4 with: node-version: 20 @@ -28,7 +29,7 @@ jobs: run: npm install - name: Install VSCE - run: npm install -g vsce + run: npm install -g @vscode/vsce - name: Lint run: npm run tslint diff --git a/package-lock.json b/package-lock.json index 7a306550..1dc95bfe 100644 --- a/package-lock.json +++ b/package-lock.json @@ -30,14 +30,14 @@ "@types/node": "20.x", "@types/semver": "^7.3.13", "@types/vscode": "1.95.0", - "@vscode/test-electron": "^2.4.1", + "@vscode/test-electron": "^2.5.2", "copy-webpack-plugin": "^11.0.0", "glob": "^7.2.3", "mocha": "^11.7.5", "ts-loader": "^9.4.2", "tslint": "^6.1.3", "typescript": "^4.9.4", - "vscode-extension-tester": "^7.0.0", + "vscode-extension-tester": "^8.23.0", "webpack": "^5.105.0", "webpack-cli": "^4.10.0" }, @@ -45,110 +45,288 @@ "vscode": "^1.95.0" } }, - "node_modules/@babel/code-frame": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.5.tgz", - "integrity": "sha512-Xmwn266vad+6DAqEB2A6V/CcZVp62BbwVmcOJc2RPuwih1kw02TjQvWVWlcKGbBPd+8/0V5DEkOcizRGYsspYQ==", + "node_modules/@azu/format-text": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@azu/format-text/-/format-text-1.0.2.tgz", + "integrity": "sha512-Swi4N7Edy1Eqq82GxgEECXSSLyn6GOb5htRFPzBDdUkECGXtlf12ynO5oJSpWKPwCaUssOu7NfhDcCWpIC6Ywg==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/@azu/style-format": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@azu/style-format/-/style-format-1.0.1.tgz", + "integrity": "sha512-AHcTojlNBdD/3/KxIKlg8sxIWHfOtQszLvOpagLTO+bjC3u7SAszu1lf//u7JJC50aUSH+BVWDD/KvaA6Gfn5g==", + "dev": true, + "license": "WTFPL", + "dependencies": { + "@azu/format-text": "^1.0.1" + } + }, + "node_modules/@azure/abort-controller": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@azure/abort-controller/-/abort-controller-2.1.2.tgz", + "integrity": "sha512-nBrLsEWm4J2u5LpAPjxADTlq3trDgVZZXHNKabeXZtpq3d3AbN/KGO82R87rdDz5/lYB024rtEf10/q0urNgsA==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/highlight": "^7.22.5" + "tslib": "^2.6.2" }, "engines": { - "node": ">=6.9.0" + "node": ">=18.0.0" } }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz", - "integrity": "sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==", + "node_modules/@azure/abort-controller/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "dev": true, + "license": "0BSD" + }, + "node_modules/@azure/core-auth": { + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/@azure/core-auth/-/core-auth-1.10.1.tgz", + "integrity": "sha512-ykRMW8PjVAn+RS6ww5cmK9U2CyH9p4Q88YJwvUslfuMmN98w/2rdGRLPqJYObapBCdzBVeDgYWdJnFPFb7qzpg==", "dev": true, + "license": "MIT", + "dependencies": { + "@azure/abort-controller": "^2.1.2", + "@azure/core-util": "^1.13.0", + "tslib": "^2.6.2" + }, "engines": { - "node": ">=6.9.0" + "node": ">=20.0.0" } }, - "node_modules/@babel/highlight": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.5.tgz", - "integrity": "sha512-BSKlD1hgnedS5XRnGOljZawtag7H1yPfQp0tdNJCHoH6AZ+Pcm9VvkrK59/Yy593Ypg0zMxH2BxD1VPYUQ7UIw==", + "node_modules/@azure/core-auth/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "dev": true, + "license": "0BSD" + }, + "node_modules/@azure/core-client": { + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/@azure/core-client/-/core-client-1.10.1.tgz", + "integrity": "sha512-Nh5PhEOeY6PrnxNPsEHRr9eimxLwgLlpmguQaHKBinFYA/RU9+kOYVOQqOrTsCL+KSxrLLl1gD8Dk5BFW/7l/w==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-validator-identifier": "^7.22.5", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" + "@azure/abort-controller": "^2.1.2", + "@azure/core-auth": "^1.10.0", + "@azure/core-rest-pipeline": "^1.22.0", + "@azure/core-tracing": "^1.3.0", + "@azure/core-util": "^1.13.0", + "@azure/logger": "^1.3.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=6.9.0" + "node": ">=20.0.0" } }, - "node_modules/@babel/highlight/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==", + "node_modules/@azure/core-client/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "dev": true, + "license": "0BSD" + }, + "node_modules/@azure/core-rest-pipeline": { + "version": "1.23.0", + "resolved": "https://registry.npmjs.org/@azure/core-rest-pipeline/-/core-rest-pipeline-1.23.0.tgz", + "integrity": "sha512-Evs1INHo+jUjwHi1T6SG6Ua/LHOQBCLuKEEE6efIpt4ZOoNonaT1kP32GoOcdNDbfqsD2445CPri3MubBy5DEQ==", "dev": true, + "license": "MIT", "dependencies": { - "color-convert": "^1.9.0" + "@azure/abort-controller": "^2.1.2", + "@azure/core-auth": "^1.10.0", + "@azure/core-tracing": "^1.3.0", + "@azure/core-util": "^1.13.0", + "@azure/logger": "^1.3.0", + "@typespec/ts-http-runtime": "^0.3.4", + "tslib": "^2.6.2" }, "engines": { - "node": ">=4" + "node": ">=20.0.0" } }, - "node_modules/@babel/highlight/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==", + "node_modules/@azure/core-rest-pipeline/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "dev": true, + "license": "0BSD" + }, + "node_modules/@azure/core-tracing": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@azure/core-tracing/-/core-tracing-1.3.1.tgz", + "integrity": "sha512-9MWKevR7Hz8kNzzPLfX4EAtGM2b8mr50HPDBvio96bURP/9C+HjdH3sBlLSNNrvRAr5/k/svoH457gB5IKpmwQ==", "dev": true, + "license": "MIT", "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "tslib": "^2.6.2" }, "engines": { - "node": ">=4" + "node": ">=20.0.0" } }, - "node_modules/@babel/highlight/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==", + "node_modules/@azure/core-tracing/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "dev": true, + "license": "0BSD" + }, + "node_modules/@azure/core-util": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/@azure/core-util/-/core-util-1.13.1.tgz", + "integrity": "sha512-XPArKLzsvl0Hf0CaGyKHUyVgF7oDnhKoP85Xv6M4StF/1AhfORhZudHtOyf2s+FcbuQ9dPRAjB8J2KvRRMUK2A==", "dev": true, + "license": "MIT", "dependencies": { - "color-name": "1.1.3" + "@azure/abort-controller": "^2.1.2", + "@typespec/ts-http-runtime": "^0.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" } }, - "node_modules/@babel/highlight/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 + "node_modules/@azure/core-util/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "dev": true, + "license": "0BSD" }, - "node_modules/@babel/highlight/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==", + "node_modules/@azure/identity": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/@azure/identity/-/identity-4.13.0.tgz", + "integrity": "sha512-uWC0fssc+hs1TGGVkkghiaFkkS7NkTxfnCH+Hdg+yTehTpMcehpok4PgUKKdyCH+9ldu6FhiHRv84Ntqj1vVcw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@azure/abort-controller": "^2.0.0", + "@azure/core-auth": "^1.9.0", + "@azure/core-client": "^1.9.2", + "@azure/core-rest-pipeline": "^1.17.0", + "@azure/core-tracing": "^1.0.0", + "@azure/core-util": "^1.11.0", + "@azure/logger": "^1.0.0", + "@azure/msal-browser": "^4.2.0", + "@azure/msal-node": "^3.5.0", + "open": "^10.1.0", + "tslib": "^2.2.0" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@azure/identity/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "dev": true, + "license": "0BSD" + }, + "node_modules/@azure/logger": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@azure/logger/-/logger-1.3.0.tgz", + "integrity": "sha512-fCqPIfOcLE+CGqGPd66c8bZpwAji98tZ4JI9i/mlTNTlsIWslCfpg48s/ypyLxZTump5sypjrKn2/kY7q8oAbA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typespec/ts-http-runtime": "^0.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@azure/logger/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", "dev": true, + "license": "0BSD" + }, + "node_modules/@azure/msal-browser": { + "version": "4.29.1", + "resolved": "https://registry.npmjs.org/@azure/msal-browser/-/msal-browser-4.29.1.tgz", + "integrity": "sha512-1Vrt27du1cl4QHkzLc6L4aeXqliPIDIs5l/1I4hWWMXkXccY/EznJT1+pBdoVze0azTAI8sCyq5B4cBVYG1t9w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@azure/msal-common": "15.16.1" + }, "engines": { "node": ">=0.8.0" } }, - "node_modules/@babel/highlight/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==", + "node_modules/@azure/msal-common": { + "version": "15.16.1", + "resolved": "https://registry.npmjs.org/@azure/msal-common/-/msal-common-15.16.1.tgz", + "integrity": "sha512-qxUG9TCl+TVSSX58onVDHDWrvT5CE0+NeeUAbkQqaESpSm79u5IePLnPWMMjCUnUR2zJd4+Bt9vioVRzLmJb2g==", "dev": true, + "license": "MIT", "engines": { - "node": ">=4" + "node": ">=0.8.0" } }, - "node_modules/@babel/highlight/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==", + "node_modules/@azure/msal-node": { + "version": "3.8.9", + "resolved": "https://registry.npmjs.org/@azure/msal-node/-/msal-node-3.8.9.tgz", + "integrity": "sha512-jZ0pw/BbdEUWGhomCaAiVDfXRI/9K56m5hTNqB/CzcbZEYhXm5qpK1cDngN1iXfwSfmUMorOUQ2FC0dyuQ9uRg==", "dev": true, + "license": "MIT", "dependencies": { - "has-flag": "^3.0.0" + "@azure/msal-common": "15.16.1", + "jsonwebtoken": "^9.0.0", + "uuid": "^8.3.0" }, "engines": { - "node": ">=4" + "node": ">=16" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.0.tgz", + "integrity": "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.28.5", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", + "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@bazel/runfiles": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@bazel/runfiles/-/runfiles-6.5.0.tgz", + "integrity": "sha512-RzahvqTkfpY2jsDxo8YItPX+/iZ6hbiikw1YhE0bA9EKBR5Og8Pa6FHn9PO9M0zaXRVsr0GFQLKbB/0rzy9SzA==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/@bcoe/v8-coverage": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-1.0.2.tgz", + "integrity": "sha512-6zABk/ECA/QYSCQ1NGiVwwbQerUCZ+TQbp64Q3AgmfNvurHH0j8TtXa1qbShXA6qqkpAj4V5W8pP6mLe1mcMqA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" } }, "node_modules/@discoveryjs/json-ext": { @@ -340,6 +518,16 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, + "node_modules/@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/@jridgewell/gen-mapping": { "version": "0.3.13", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", @@ -385,6 +573,13 @@ "@jridgewell/sourcemap-codec": "^1.4.14" } }, + "node_modules/@keyv/serialize": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@keyv/serialize/-/serialize-1.1.1.tgz", + "integrity": "sha512-dXn3FZhPv0US+7dtJsIi2R+c7qWYiReoEh5zUntWCf4oSpMNib8FDhSoed6m3QyZdx5hK7iLFkYk3rNxwt8vTA==", + "dev": true, + "license": "MIT" + }, "node_modules/@microsoft/1ds-core-js": { "version": "4.3.10", "resolved": "https://registry.npmjs.org/@microsoft/1ds-core-js/-/1ds-core-js-4.3.10.tgz", @@ -719,124 +914,465 @@ "node": ">=14" } }, - "node_modules/@sindresorhus/is": { - "version": "5.5.2", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-5.5.2.tgz", - "integrity": "sha512-8ZMK+V6YpeZFfW6hU9uAeWVuq8v3t7BaG276gIO+kVqnAcLrHCXdFUOf7kgouyfAarkZtuavIqY3RsXTsTWviw==", + "node_modules/@redhat-developer/locators": { + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/@redhat-developer/locators/-/locators-1.20.0.tgz", + "integrity": "sha512-SvS9lABIHDpTU0w7jTN3qsMxDSceAbbc3j0xba9Cd8xrDEMWpysnvt3WY4vtYalikMhXtkcSAf3L3adYTS7iqg==", "dev": true, - "engines": { - "node": ">=14.16" + "license": "Apache-2.0", + "peerDependencies": { + "@redhat-developer/page-objects": ">=1.0.0", + "selenium-webdriver": ">=4.6.1" + } + }, + "node_modules/@redhat-developer/page-objects": { + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/@redhat-developer/page-objects/-/page-objects-1.20.0.tgz", + "integrity": "sha512-akY6gXRbUmlf2Cayp1A/TwoT0/eyK+/LReSBo7Nmfotk7QfR262k7ZilAmL3Vf/jmX3Gg0D8UrDZRFk8RTxS2Q==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "clipboardy": "^5.3.1", + "clone-deep": "^4.0.1", + "compare-versions": "^6.1.1", + "fs-extra": "^11.3.4", + "type-fest": "^4.41.0" }, - "funding": { - "url": "https://github.com/sindresorhus/is?sponsor=1" + "peerDependencies": { + "selenium-webdriver": ">=4.6.1", + "typescript": ">=4.6.2" } }, - "node_modules/@szmarczak/http-timer": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-5.0.1.tgz", - "integrity": "sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==", + "node_modules/@redhat-developer/page-objects/node_modules/fs-extra": { + "version": "11.3.4", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.4.tgz", + "integrity": "sha512-CTXd6rk/M3/ULNQj8FBqBWHYBVYybQ3VPBw0xGKFe3tuH7ytT6ACnvzpIQ3UZtB8yvUKC2cXn1a+x+5EVQLovA==", "dev": true, + "license": "MIT", "dependencies": { - "defer-to-connect": "^2.0.1" + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" }, "engines": { - "node": ">=14.16" + "node": ">=14.14" } }, - "node_modules/@types/eslint": { - "version": "9.6.1", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-9.6.1.tgz", - "integrity": "sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==", + "node_modules/@sec-ant/readable-stream": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@sec-ant/readable-stream/-/readable-stream-0.4.1.tgz", + "integrity": "sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@secretlint/config-creator": { + "version": "10.2.2", + "resolved": "https://registry.npmjs.org/@secretlint/config-creator/-/config-creator-10.2.2.tgz", + "integrity": "sha512-BynOBe7Hn3LJjb3CqCHZjeNB09s/vgf0baBaHVw67w7gHF0d25c3ZsZ5+vv8TgwSchRdUCRrbbcq5i2B1fJ2QQ==", "dev": true, + "license": "MIT", "dependencies": { - "@types/estree": "*", - "@types/json-schema": "*" + "@secretlint/types": "^10.2.2" + }, + "engines": { + "node": ">=20.0.0" } }, - "node_modules/@types/eslint-scope": { - "version": "3.7.7", - "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz", - "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==", + "node_modules/@secretlint/config-loader": { + "version": "10.2.2", + "resolved": "https://registry.npmjs.org/@secretlint/config-loader/-/config-loader-10.2.2.tgz", + "integrity": "sha512-ndjjQNgLg4DIcMJp4iaRD6xb9ijWQZVbd9694Ol2IszBIbGPPkwZHzJYKICbTBmh6AH/pLr0CiCaWdGJU7RbpQ==", "dev": true, + "license": "MIT", "dependencies": { - "@types/eslint": "*", - "@types/estree": "*" + "@secretlint/profiler": "^10.2.2", + "@secretlint/resolver": "^10.2.2", + "@secretlint/types": "^10.2.2", + "ajv": "^8.17.1", + "debug": "^4.4.1", + "rc-config-loader": "^4.1.3" + }, + "engines": { + "node": ">=20.0.0" } }, - "node_modules/@types/estree": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", - "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", - "dev": true - }, - "node_modules/@types/fs-extra": { - "version": "9.0.13", - "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-9.0.13.tgz", - "integrity": "sha512-nEnwB++1u5lVDM2UI4c1+5R+FYaKfaAzS4OococimjVm3nQw3TuzH5UNsocrcTBbhnerblyHj4A49qXbIiZdpA==", + "node_modules/@secretlint/core": { + "version": "10.2.2", + "resolved": "https://registry.npmjs.org/@secretlint/core/-/core-10.2.2.tgz", + "integrity": "sha512-6rdwBwLP9+TO3rRjMVW1tX+lQeo5gBbxl1I5F8nh8bgGtKwdlCMhMKsBWzWg1ostxx/tIG7OjZI0/BxsP8bUgw==", "dev": true, + "license": "MIT", "dependencies": { - "@types/node": "*" + "@secretlint/profiler": "^10.2.2", + "@secretlint/types": "^10.2.2", + "debug": "^4.4.1", + "structured-source": "^4.0.0" + }, + "engines": { + "node": ">=20.0.0" } }, - "node_modules/@types/glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==", + "node_modules/@secretlint/formatter": { + "version": "10.2.2", + "resolved": "https://registry.npmjs.org/@secretlint/formatter/-/formatter-10.2.2.tgz", + "integrity": "sha512-10f/eKV+8YdGKNQmoDUD1QnYL7TzhI2kzyx95vsJKbEa8akzLAR5ZrWIZ3LbcMmBLzxlSQMMccRmi05yDQ5YDA==", "dev": true, + "license": "MIT", "dependencies": { - "@types/minimatch": "*", - "@types/node": "*" + "@secretlint/resolver": "^10.2.2", + "@secretlint/types": "^10.2.2", + "@textlint/linter-formatter": "^15.2.0", + "@textlint/module-interop": "^15.2.0", + "@textlint/types": "^15.2.0", + "chalk": "^5.4.1", + "debug": "^4.4.1", + "pluralize": "^8.0.0", + "strip-ansi": "^7.1.0", + "table": "^6.9.0", + "terminal-link": "^4.0.0" + }, + "engines": { + "node": ">=20.0.0" } }, - "node_modules/@types/http-cache-semantics": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.1.tgz", - "integrity": "sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ==", - "dev": true - }, - "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 - }, - "node_modules/@types/lodash": { - "version": "4.14.195", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.195.tgz", - "integrity": "sha512-Hwx9EUgdwf2GLarOjQp5ZH8ZmblzcbTBC2wtQWNKARBSxM9ezRIAUpeDTgoQRAFB0+8CNWXVA9+MaSOzOF3nPg==", - "dev": true - }, - "node_modules/@types/minimatch": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.5.tgz", - "integrity": "sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==", - "dev": true + "node_modules/@secretlint/formatter/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } }, - "node_modules/@types/mocha": { - "version": "9.1.1", - "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-9.1.1.tgz", - "integrity": "sha512-Z61JK7DKDtdKTWwLeElSEBcWGRLY8g95ic5FoQqI9CMx0ns/Ghep3B4DfcEimiKMvtamNVULVNKEsiwV3aQmXw==", - "dev": true + "node_modules/@secretlint/formatter/node_modules/chalk": { + "version": "5.6.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", + "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } }, - "node_modules/@types/node": { - "version": "20.16.1", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.16.1.tgz", - "integrity": "sha512-zJDo7wEadFtSyNz5QITDfRcrhqDvQI1xQNQ0VoizPjM/dVAODqqIUWbJPkvsxmTI0MYRGRikcdjMPhOssnPejQ==", + "node_modules/@secretlint/formatter/node_modules/strip-ansi": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", "dev": true, + "license": "MIT", "dependencies": { - "undici-types": "~6.19.2" + "ansi-regex": "^6.2.2" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, - "node_modules/@types/selenium-webdriver": { - "version": "4.1.21", - "resolved": "https://registry.npmjs.org/@types/selenium-webdriver/-/selenium-webdriver-4.1.21.tgz", - "integrity": "sha512-QGURnImvxYlIQz5DVhvHdqpYNLBjhJ2Vm+cnQI2G9QZzkWlZm0LkLcvDcHp+qE6N2KBz4CeuvXgPO7W3XQ0Tyw==", + "node_modules/@secretlint/node": { + "version": "10.2.2", + "resolved": "https://registry.npmjs.org/@secretlint/node/-/node-10.2.2.tgz", + "integrity": "sha512-eZGJQgcg/3WRBwX1bRnss7RmHHK/YlP/l7zOQsrjexYt6l+JJa5YhUmHbuGXS94yW0++3YkEJp0kQGYhiw1DMQ==", "dev": true, + "license": "MIT", "dependencies": { - "@types/ws": "*" + "@secretlint/config-loader": "^10.2.2", + "@secretlint/core": "^10.2.2", + "@secretlint/formatter": "^10.2.2", + "@secretlint/profiler": "^10.2.2", + "@secretlint/source-creator": "^10.2.2", + "@secretlint/types": "^10.2.2", + "debug": "^4.4.1", + "p-map": "^7.0.3" + }, + "engines": { + "node": ">=20.0.0" } }, - "node_modules/@types/semver": { + "node_modules/@secretlint/profiler": { + "version": "10.2.2", + "resolved": "https://registry.npmjs.org/@secretlint/profiler/-/profiler-10.2.2.tgz", + "integrity": "sha512-qm9rWfkh/o8OvzMIfY8a5bCmgIniSpltbVlUVl983zDG1bUuQNd1/5lUEeWx5o/WJ99bXxS7yNI4/KIXfHexig==", + "dev": true, + "license": "MIT" + }, + "node_modules/@secretlint/resolver": { + "version": "10.2.2", + "resolved": "https://registry.npmjs.org/@secretlint/resolver/-/resolver-10.2.2.tgz", + "integrity": "sha512-3md0cp12e+Ae5V+crPQYGd6aaO7ahw95s28OlULGyclyyUtf861UoRGS2prnUrKh7MZb23kdDOyGCYb9br5e4w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@secretlint/secretlint-formatter-sarif": { + "version": "10.2.2", + "resolved": "https://registry.npmjs.org/@secretlint/secretlint-formatter-sarif/-/secretlint-formatter-sarif-10.2.2.tgz", + "integrity": "sha512-ojiF9TGRKJJw308DnYBucHxkpNovDNu1XvPh7IfUp0A12gzTtxuWDqdpuVezL7/IP8Ua7mp5/VkDMN9OLp1doQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "node-sarif-builder": "^3.2.0" + } + }, + "node_modules/@secretlint/secretlint-rule-no-dotenv": { + "version": "10.2.2", + "resolved": "https://registry.npmjs.org/@secretlint/secretlint-rule-no-dotenv/-/secretlint-rule-no-dotenv-10.2.2.tgz", + "integrity": "sha512-KJRbIShA9DVc5Va3yArtJ6QDzGjg3PRa1uYp9As4RsyKtKSSZjI64jVca57FZ8gbuk4em0/0Jq+uy6485wxIdg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@secretlint/types": "^10.2.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@secretlint/secretlint-rule-preset-recommend": { + "version": "10.2.2", + "resolved": "https://registry.npmjs.org/@secretlint/secretlint-rule-preset-recommend/-/secretlint-rule-preset-recommend-10.2.2.tgz", + "integrity": "sha512-K3jPqjva8bQndDKJqctnGfwuAxU2n9XNCPtbXVI5JvC7FnQiNg/yWlQPbMUlBXtBoBGFYp08A94m6fvtc9v+zA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@secretlint/source-creator": { + "version": "10.2.2", + "resolved": "https://registry.npmjs.org/@secretlint/source-creator/-/source-creator-10.2.2.tgz", + "integrity": "sha512-h6I87xJfwfUTgQ7irWq7UTdq/Bm1RuQ/fYhA3dtTIAop5BwSFmZyrchph4WcoEvbN460BWKmk4RYSvPElIIvxw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@secretlint/types": "^10.2.2", + "istextorbinary": "^9.5.0" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@secretlint/types": { + "version": "10.2.2", + "resolved": "https://registry.npmjs.org/@secretlint/types/-/types-10.2.2.tgz", + "integrity": "sha512-Nqc90v4lWCXyakD6xNyNACBJNJ0tNCwj2WNk/7ivyacYHxiITVgmLUFXTBOeCdy79iz6HtN9Y31uw/jbLrdOAg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@sindresorhus/is": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-7.2.0.tgz", + "integrity": "sha512-P1Cz1dWaFfR4IR+U13mqqiGsLFf1KbayybWwdd2vfctdV6hDpUkgCY0nKOLLTMSoRd/jJNjtbqzf13K8DCCXQw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sindresorhus/is?sponsor=1" + } + }, + "node_modules/@sindresorhus/merge-streams": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/merge-streams/-/merge-streams-4.0.0.tgz", + "integrity": "sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@textlint/ast-node-types": { + "version": "15.5.2", + "resolved": "https://registry.npmjs.org/@textlint/ast-node-types/-/ast-node-types-15.5.2.tgz", + "integrity": "sha512-fCaOxoup5LIyBEo7R1oYWE7V4bSX0KQeHh66twon9e9usaLE3ijgF8QjYsR6joCssdeCHVd0wHm7ppsEyTr6vg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@textlint/linter-formatter": { + "version": "15.5.2", + "resolved": "https://registry.npmjs.org/@textlint/linter-formatter/-/linter-formatter-15.5.2.tgz", + "integrity": "sha512-jAw7jWM8+wU9cG6Uu31jGyD1B+PAVePCvnPKC/oov+2iBPKk3ao30zc/Itmi7FvXo4oPaL9PmzPPQhyniPVgVg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@azu/format-text": "^1.0.2", + "@azu/style-format": "^1.0.1", + "@textlint/module-interop": "15.5.2", + "@textlint/resolver": "15.5.2", + "@textlint/types": "15.5.2", + "chalk": "^4.1.2", + "debug": "^4.4.3", + "js-yaml": "^4.1.1", + "lodash": "^4.17.23", + "pluralize": "^2.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "table": "^6.9.0", + "text-table": "^0.2.0" + } + }, + "node_modules/@textlint/linter-formatter/node_modules/pluralize": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-2.0.0.tgz", + "integrity": "sha512-TqNZzQCD4S42De9IfnnBvILN7HAW7riLqsCyp8lgjXeysyPlX5HhqKAcJHHHb9XskE4/a+7VGC9zzx8Ls0jOAw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@textlint/module-interop": { + "version": "15.5.2", + "resolved": "https://registry.npmjs.org/@textlint/module-interop/-/module-interop-15.5.2.tgz", + "integrity": "sha512-mg6rMQ3+YjwiXCYoQXbyVfDucpTa1q5mhspd/9qHBxUq4uY6W8GU42rmT3GW0V1yOfQ9z/iRrgPtkp71s8JzXg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@textlint/resolver": { + "version": "15.5.2", + "resolved": "https://registry.npmjs.org/@textlint/resolver/-/resolver-15.5.2.tgz", + "integrity": "sha512-YEITdjRiJaQrGLUWxWXl4TEg+d2C7+TNNjbGPHPH7V7CCnXm+S9GTjGAL7Q2WSGJyFEKt88Jvx6XdJffRv4HEA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@textlint/types": { + "version": "15.5.2", + "resolved": "https://registry.npmjs.org/@textlint/types/-/types-15.5.2.tgz", + "integrity": "sha512-sJOrlVLLXp4/EZtiWKWq9y2fWyZlI8GP+24rnU5avtPWBIMm/1w97yzKrAqYF8czx2MqR391z5akhnfhj2f/AQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@textlint/ast-node-types": "15.5.2" + } + }, + "node_modules/@types/eslint": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-9.6.1.tgz", + "integrity": "sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==", + "dev": true, + "dependencies": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "node_modules/@types/eslint-scope": { + "version": "3.7.7", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz", + "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==", + "dev": true, + "dependencies": { + "@types/eslint": "*", + "@types/estree": "*" + } + }, + "node_modules/@types/estree": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "dev": true + }, + "node_modules/@types/fs-extra": { + "version": "9.0.13", + "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-9.0.13.tgz", + "integrity": "sha512-nEnwB++1u5lVDM2UI4c1+5R+FYaKfaAzS4OococimjVm3nQw3TuzH5UNsocrcTBbhnerblyHj4A49qXbIiZdpA==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==", + "dev": true, + "dependencies": { + "@types/minimatch": "*", + "@types/node": "*" + } + }, + "node_modules/@types/http-cache-semantics": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz", + "integrity": "sha512-L3LgimLHXtGkWikKnsPg0/VFx9OGZaC+eN1u4r+OB1XRqH3meBIAVC2zr1WdMH+RHmnRkqliQAOHNJ/E0j/e0Q==", + "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", + "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", + "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 + }, + "node_modules/@types/lodash": { + "version": "4.14.195", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.195.tgz", + "integrity": "sha512-Hwx9EUgdwf2GLarOjQp5ZH8ZmblzcbTBC2wtQWNKARBSxM9ezRIAUpeDTgoQRAFB0+8CNWXVA9+MaSOzOF3nPg==", + "dev": true + }, + "node_modules/@types/minimatch": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.5.tgz", + "integrity": "sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==", + "dev": true + }, + "node_modules/@types/mocha": { + "version": "9.1.1", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-9.1.1.tgz", + "integrity": "sha512-Z61JK7DKDtdKTWwLeElSEBcWGRLY8g95ic5FoQqI9CMx0ns/Ghep3B4DfcEimiKMvtamNVULVNKEsiwV3aQmXw==", + "dev": true + }, + "node_modules/@types/node": { + "version": "20.16.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.16.1.tgz", + "integrity": "sha512-zJDo7wEadFtSyNz5QITDfRcrhqDvQI1xQNQ0VoizPjM/dVAODqqIUWbJPkvsxmTI0MYRGRikcdjMPhOssnPejQ==", + "dev": true, + "dependencies": { + "undici-types": "~6.19.2" + } + }, + "node_modules/@types/normalize-package-data": { + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz", + "integrity": "sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/sarif": { + "version": "2.1.7", + "resolved": "https://registry.npmjs.org/@types/sarif/-/sarif-2.1.7.tgz", + "integrity": "sha512-kRz0VEkJqWLf1LLVN4pT1cg1Z9wAuvI6L97V3m2f5B76Tg8d413ddvLBPTEHAZJlnn4XSvu0FkZtViCQGVyrXQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/selenium-webdriver": { + "version": "4.35.5", + "resolved": "https://registry.npmjs.org/@types/selenium-webdriver/-/selenium-webdriver-4.35.5.tgz", + "integrity": "sha512-wCQCjWmahRkUAO7S703UAvBFkxz4o/rjX4T2AOSWKXSi0sTQPsrXxR0GjtFUT0ompedLkYH4R5HO5Urz0hyeog==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "@types/ws": "*" + } + }, + "node_modules/@types/semver": { "version": "7.5.0", "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.0.tgz", "integrity": "sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw==", @@ -850,14 +1386,37 @@ "license": "MIT" }, "node_modules/@types/ws": { - "version": "8.5.10", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.10.tgz", - "integrity": "sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A==", + "version": "8.18.1", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.18.1.tgz", + "integrity": "sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==", "dev": true, + "license": "MIT", "dependencies": { "@types/node": "*" } }, + "node_modules/@typespec/ts-http-runtime": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/@typespec/ts-http-runtime/-/ts-http-runtime-0.3.4.tgz", + "integrity": "sha512-CI0NhTrz4EBaa0U+HaaUZrJhPoso8sG7ZFya8uQoBA57fjzrjRSv87ekCjLZOFExN+gXE/z0xuN2QfH4H2HrLQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "http-proxy-agent": "^7.0.0", + "https-proxy-agent": "^7.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@typespec/ts-http-runtime/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "dev": true, + "license": "0BSD" + }, "node_modules/@vscode/extension-telemetry": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/@vscode/extension-telemetry/-/extension-telemetry-1.2.0.tgz", @@ -873,15 +1432,16 @@ } }, "node_modules/@vscode/test-electron": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/@vscode/test-electron/-/test-electron-2.4.1.tgz", - "integrity": "sha512-Gc6EdaLANdktQ1t+zozoBVRynfIsMKMc94Svu1QreOBC8y76x4tvaK32TljrLi1LI2+PK58sDVbL7ALdqf3VRQ==", + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/@vscode/test-electron/-/test-electron-2.5.2.tgz", + "integrity": "sha512-8ukpxv4wYe0iWMRQU18jhzJOHkeGKbnw7xWRX3Zw1WJA4cEKbHcmmLPdPrPtL6rhDcrlCZN+xKRpv09n4gRHYg==", "dev": true, + "license": "MIT", "dependencies": { "http-proxy-agent": "^7.0.2", "https-proxy-agent": "^7.0.5", "jszip": "^3.10.1", - "ora": "^7.0.1", + "ora": "^8.1.0", "semver": "^7.6.2" }, "engines": { @@ -889,26 +1449,36 @@ } }, "node_modules/@vscode/vsce": { - "version": "2.22.0", - "resolved": "https://registry.npmjs.org/@vscode/vsce/-/vsce-2.22.0.tgz", - "integrity": "sha512-8df4uJiM3C6GZ2Sx/KilSKVxsetrTBBIUb3c0W4B1EWHcddioVs5mkyDKtMNP0khP/xBILVSzlXxhV+nm2rC9A==", + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/@vscode/vsce/-/vsce-3.7.1.tgz", + "integrity": "sha512-OTm2XdMt2YkpSn2Nx7z2EJtSuhRHsTPYsSK59hr3v8jRArK+2UEoju4Jumn1CmpgoBLGI6ReHLJ/czYltNUW3g==", "dev": true, + "license": "MIT", "dependencies": { - "azure-devops-node-api": "^11.0.1", - "chalk": "^2.4.2", + "@azure/identity": "^4.1.0", + "@secretlint/node": "^10.1.2", + "@secretlint/secretlint-formatter-sarif": "^10.1.2", + "@secretlint/secretlint-rule-no-dotenv": "^10.1.2", + "@secretlint/secretlint-rule-preset-recommend": "^10.1.2", + "@vscode/vsce-sign": "^2.0.0", + "azure-devops-node-api": "^12.5.0", + "chalk": "^4.1.2", "cheerio": "^1.0.0-rc.9", - "commander": "^6.2.1", - "glob": "^7.0.6", + "cockatiel": "^3.1.2", + "commander": "^12.1.0", + "form-data": "^4.0.0", + "glob": "^11.0.0", "hosted-git-info": "^4.0.2", "jsonc-parser": "^3.2.0", "leven": "^3.1.0", - "markdown-it": "^12.3.2", + "markdown-it": "^14.1.0", "mime": "^1.3.4", "minimatch": "^3.0.3", "parse-semver": "^1.1.1", "read": "^1.0.7", + "secretlint": "^10.1.2", "semver": "^7.5.2", - "tmp": "^0.2.1", + "tmp": "^0.2.3", "typed-rest-client": "^1.8.4", "url-join": "^4.0.1", "xml2js": "^0.5.0", @@ -919,23 +1489,156 @@ "vsce": "vsce" }, "engines": { - "node": ">= 14" + "node": ">= 20" }, "optionalDependencies": { "keytar": "^7.7.0" } }, - "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==", + "node_modules/@vscode/vsce-sign": { + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/@vscode/vsce-sign/-/vsce-sign-2.0.9.tgz", + "integrity": "sha512-8IvaRvtFyzUnGGl3f5+1Cnor3LqaUWvhaUjAYO8Y39OUYlOf3cRd+dowuQYLpZcP3uwSG+mURwjEBOSq4SOJ0g==", "dev": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } + "hasInstallScript": true, + "license": "SEE LICENSE IN LICENSE.txt", + "optionalDependencies": { + "@vscode/vsce-sign-alpine-arm64": "2.0.6", + "@vscode/vsce-sign-alpine-x64": "2.0.6", + "@vscode/vsce-sign-darwin-arm64": "2.0.6", + "@vscode/vsce-sign-darwin-x64": "2.0.6", + "@vscode/vsce-sign-linux-arm": "2.0.6", + "@vscode/vsce-sign-linux-arm64": "2.0.6", + "@vscode/vsce-sign-linux-x64": "2.0.6", + "@vscode/vsce-sign-win32-arm64": "2.0.6", + "@vscode/vsce-sign-win32-x64": "2.0.6" + } + }, + "node_modules/@vscode/vsce-sign-alpine-arm64": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@vscode/vsce-sign-alpine-arm64/-/vsce-sign-alpine-arm64-2.0.6.tgz", + "integrity": "sha512-wKkJBsvKF+f0GfsUuGT0tSW0kZL87QggEiqNqK6/8hvqsXvpx8OsTEc3mnE1kejkh5r+qUyQ7PtF8jZYN0mo8Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "SEE LICENSE IN LICENSE.txt", + "optional": true, + "os": [ + "alpine" + ] + }, + "node_modules/@vscode/vsce-sign-alpine-x64": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@vscode/vsce-sign-alpine-x64/-/vsce-sign-alpine-x64-2.0.6.tgz", + "integrity": "sha512-YoAGlmdK39vKi9jA18i4ufBbd95OqGJxRvF3n6ZbCyziwy3O+JgOpIUPxv5tjeO6gQfx29qBivQ8ZZTUF2Ba0w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "SEE LICENSE IN LICENSE.txt", + "optional": true, + "os": [ + "alpine" + ] + }, + "node_modules/@vscode/vsce-sign-darwin-arm64": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@vscode/vsce-sign-darwin-arm64/-/vsce-sign-darwin-arm64-2.0.6.tgz", + "integrity": "sha512-5HMHaJRIQuozm/XQIiJiA0W9uhdblwwl2ZNDSSAeXGO9YhB9MH5C4KIHOmvyjUnKy4UCuiP43VKpIxW1VWP4tQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "SEE LICENSE IN LICENSE.txt", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@vscode/vsce-sign-darwin-x64": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@vscode/vsce-sign-darwin-x64/-/vsce-sign-darwin-x64-2.0.6.tgz", + "integrity": "sha512-25GsUbTAiNfHSuRItoQafXOIpxlYj+IXb4/qarrXu7kmbH94jlm5sdWSCKrrREs8+GsXF1b+l3OB7VJy5jsykw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "SEE LICENSE IN LICENSE.txt", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@vscode/vsce-sign-linux-arm": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@vscode/vsce-sign-linux-arm/-/vsce-sign-linux-arm-2.0.6.tgz", + "integrity": "sha512-UndEc2Xlq4HsuMPnwu7420uqceXjs4yb5W8E2/UkaHBB9OWCwMd3/bRe/1eLe3D8kPpxzcaeTyXiK3RdzS/1CA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "SEE LICENSE IN LICENSE.txt", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@vscode/vsce-sign-linux-arm64": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@vscode/vsce-sign-linux-arm64/-/vsce-sign-linux-arm64-2.0.6.tgz", + "integrity": "sha512-cfb1qK7lygtMa4NUl2582nP7aliLYuDEVpAbXJMkDq1qE+olIw/es+C8j1LJwvcRq1I2yWGtSn3EkDp9Dq5FdA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "SEE LICENSE IN LICENSE.txt", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@vscode/vsce-sign-linux-x64": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@vscode/vsce-sign-linux-x64/-/vsce-sign-linux-x64-2.0.6.tgz", + "integrity": "sha512-/olerl1A4sOqdP+hjvJ1sbQjKN07Y3DVnxO4gnbn/ahtQvFrdhUi0G1VsZXDNjfqmXw57DmPi5ASnj/8PGZhAA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "SEE LICENSE IN LICENSE.txt", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@vscode/vsce-sign-win32-arm64": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@vscode/vsce-sign-win32-arm64/-/vsce-sign-win32-arm64-2.0.6.tgz", + "integrity": "sha512-ivM/MiGIY0PJNZBoGtlRBM/xDpwbdlCWomUWuLmIxbi1Cxe/1nooYrEQoaHD8ojVRgzdQEUzMsRbyF5cJJgYOg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "SEE LICENSE IN LICENSE.txt", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@vscode/vsce-sign-win32-x64": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@vscode/vsce-sign-win32-x64/-/vsce-sign-win32-x64-2.0.6.tgz", + "integrity": "sha512-mgth9Kvze+u8CruYMmhHw6Zgy3GRX2S+Ed5oSokDEK5vPEwGGKnmuXua9tmFhomeAnhgJnL4DCna3TiNuGrBTQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "SEE LICENSE IN LICENSE.txt", + "optional": true, + "os": [ + "win32" + ] }, "node_modules/@vscode/vsce/node_modules/brace-expansion": { "version": "1.1.12", @@ -948,60 +1651,88 @@ "concat-map": "0.0.1" } }, - "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==", + "node_modules/@vscode/vsce/node_modules/commander": { + "version": "12.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz", + "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/@vscode/vsce/node_modules/glob": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-11.1.0.tgz", + "integrity": "sha512-vuNwKSaKiqm7g0THUBu2x7ckSs3XJLXE+2ssL7/MfTGPLLcrJQ/4Uq1CjPTtO5cCIiRxqvN6Twy1qOwhL0Xjcw==", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", "dev": true, + "license": "BlueOak-1.0.0", "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "foreground-child": "^3.3.1", + "jackspeak": "^4.1.1", + "minimatch": "^10.1.1", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^2.0.0" + }, + "bin": { + "glob": "dist/esm/bin.mjs" }, "engines": { - "node": ">=4" + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "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==", + "node_modules/@vscode/vsce/node_modules/glob/node_modules/balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", "dev": true, - "dependencies": { - "color-name": "1.1.3" + "license": "MIT", + "engines": { + "node": "18 || 20 || >=22" } }, - "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 - }, - "node_modules/@vscode/vsce/node_modules/commander": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz", - "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==", + "node_modules/@vscode/vsce/node_modules/glob/node_modules/brace-expansion": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.4.tgz", + "integrity": "sha512-h+DEnpVvxmfVefa4jFbCf5HdH5YMDXRsmKflpf1pILZWRFlTbJpxeU55nJl4Smt5HQaGzg1o6RHFPJaOqnmBDg==", "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^4.0.2" + }, "engines": { - "node": ">= 6" + "node": "18 || 20 || >=22" } }, - "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==", + "node_modules/@vscode/vsce/node_modules/glob/node_modules/minimatch": { + "version": "10.2.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.4.tgz", + "integrity": "sha512-oRjTw/97aTBN0RHbYCdtF1MQfvusSIBQM0IZEgzl6426+8jSC0nF1a/GmnVLpfB9yyr6g6FTqWqiZVbxrtaCIg==", "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "brace-expansion": "^5.0.2" + }, "engines": { - "node": ">=0.8.0" + "node": "18 || 20 || >=22" + }, + "funding": { + "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==", + "node_modules/@vscode/vsce/node_modules/lru-cache": { + "version": "11.2.7", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.7.tgz", + "integrity": "sha512-aY/R+aEsRelme17KGQa/1ZSIpLpNYYrhcrepKTZgE+W3WM16YMCaPwOHLHsmopZHELU0Ojin1lPVxKR0MihncA==", "dev": true, + "license": "BlueOak-1.0.0", "engines": { - "node": ">=4" + "node": "20 || >=22" } }, "node_modules/@vscode/vsce/node_modules/minimatch": { @@ -1009,6 +1740,7 @@ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", "dev": true, + "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -1016,16 +1748,21 @@ "node": "*" } }, - "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==", + "node_modules/@vscode/vsce/node_modules/path-scurry": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.2.tgz", + "integrity": "sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg==", "dev": true, + "license": "BlueOak-1.0.0", "dependencies": { - "has-flag": "^3.0.0" + "lru-cache": "^11.0.0", + "minipass": "^7.1.2" }, "engines": { - "node": ">=4" + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, "node_modules/@webassemblyjs/ast": { @@ -1259,15 +1996,16 @@ } }, "node_modules/ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.18.0.tgz", + "integrity": "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==", "dev": true, + "license": "MIT", "dependencies": { - "fast-deep-equal": "^3.1.1", + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" + "require-from-string": "^2.0.2" }, "funding": { "type": "github", @@ -1303,6 +2041,22 @@ "ajv": "^8.8.2" } }, + "node_modules/ansi-escapes": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-7.3.0.tgz", + "integrity": "sha512-BvU8nYgGQBxcmMuEeUEmNTvrMVjJNSH7RgW24vXexN4Ven6qCvy4TntnvlnwnMLTVlcRQQdbRY8NKnaIoeWDNg==", + "dev": true, + "license": "MIT", + "dependencies": { + "environment": "^1.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/ansi-regex": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", @@ -1333,6 +2087,16 @@ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", "dev": true }, + "node_modules/astral-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", @@ -1354,10 +2118,11 @@ } }, "node_modules/azure-devops-node-api": { - "version": "11.2.0", - "resolved": "https://registry.npmjs.org/azure-devops-node-api/-/azure-devops-node-api-11.2.0.tgz", - "integrity": "sha512-XdiGPhrpaT5J8wdERRKs5g8E0Zy1pvOYTli7z9E8nmOn3YGp4FhtjhrOyFmX/8veWCwdI69mCHKJw6l+4J/bHA==", + "version": "12.5.0", + "resolved": "https://registry.npmjs.org/azure-devops-node-api/-/azure-devops-node-api-12.5.0.tgz", + "integrity": "sha512-R5eFskGvOm3U/GzeAuxRkUsAl0hrAwGgWn6zAd2KrZmrEhWZVqLew4OOupbQlXUuojUzpGtq62SmdhJ06N88og==", "dev": true, + "license": "MIT", "dependencies": { "tunnel": "0.0.6", "typed-rest-client": "^1.8.4" @@ -1386,7 +2151,9 @@ "type": "consulting", "url": "https://feross.org/support" } - ] + ], + "license": "MIT", + "optional": true }, "node_modules/baseline-browser-mapping": { "version": "2.9.19", @@ -1402,26 +2169,20 @@ "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-3.0.2.tgz", "integrity": "sha512-Nik3Sc0ncrMK4UUdXQmAnRtzmNQTAAXmXIopizwZ1W1t8QmfJj+zL4OA2I7XPTPW5z5TDqv4hRo/JzouDJnX3A==" }, - "node_modules/big-integer": { - "version": "1.6.51", - "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.51.tgz", - "integrity": "sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg==", - "dev": true, - "engines": { - "node": ">=0.6" - } - }, - "node_modules/binary": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/binary/-/binary-0.3.0.tgz", - "integrity": "sha512-D4H1y5KYwpJgK8wk1Cue5LLPgmwHKYSChkbspQg5JtVuR5ulGckxfR62H3AE9UDkdMC8yyXlqYihuz3Aqg2XZg==", + "node_modules/binaryextensions": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/binaryextensions/-/binaryextensions-6.11.0.tgz", + "integrity": "sha512-sXnYK/Ij80TO3lcqZVV2YgfKN5QjUWIRk/XSm2J/4bd/lPko3lvk0O4ZppH6m+6hB2/GTu+ptNwVFe1xh+QLQw==", "dev": true, + "license": "Artistic-2.0", "dependencies": { - "buffers": "~0.1.1", - "chainsaw": "~0.1.0" + "editions": "^6.21.0" }, "engines": { - "node": "*" + "node": ">=4" + }, + "funding": { + "url": "https://bevry.me/fund" } }, "node_modules/bl": { @@ -1429,6 +2190,7 @@ "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", "dev": true, + "license": "MIT", "optional": true, "dependencies": { "buffer": "^5.5.0", @@ -1441,6 +2203,7 @@ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", "dev": true, + "license": "MIT", "optional": true, "dependencies": { "inherits": "^2.0.3", @@ -1452,16 +2215,25 @@ } }, "node_modules/bluebird": { - "version": "3.4.7", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.4.7.tgz", - "integrity": "sha512-iD3898SR7sWVRHbiQv+sHUtHnMvC1o3nW5rAcqnq3uOn07DSAppZYUkIGslDz6gXC7HfunPe7YVBgoEJASPcHA==", - "dev": true + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", + "dev": true, + "license": "MIT" }, "node_modules/boolbase": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", - "dev": true + "dev": true, + "license": "ISC" + }, + "node_modules/boundary": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/boundary/-/boundary-2.0.0.tgz", + "integrity": "sha512-rJKn5ooC9u8q13IMCrW0RSp31pxBCHE3y9V/tp3TdWSLf8Em3p6Di4NBpfzbJge9YjjFEsD0RtFEjtvHL5VyEA==", + "dev": true, + "license": "BSD-2-Clause" }, "node_modules/brace-expansion": { "version": "2.0.2", @@ -1541,6 +2313,7 @@ "url": "https://feross.org/support" } ], + "license": "MIT", "optional": true, "dependencies": { "base64-js": "^1.3.1", @@ -1568,10 +2341,18 @@ "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", "dev": true, + "license": "MIT", "engines": { "node": "*" } }, + "node_modules/buffer-equal-constant-time": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", + "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==", + "dev": true, + "license": "BSD-3-Clause" + }, "node_modules/buffer-fill": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz", @@ -1584,31 +2365,76 @@ "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", "dev": true }, - "node_modules/buffer-indexof-polyfill": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/buffer-indexof-polyfill/-/buffer-indexof-polyfill-1.0.2.tgz", - "integrity": "sha512-I7wzHwA3t1/lwXQh+A5PbNvJxgfo5r3xulgpYDB5zckTu/Z9oUK9biouBKQUjEqzaz3HnAT6TYoovmE+GqSf7A==", + "node_modules/builtin-modules": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", + "integrity": "sha512-wxXCdllwGhI2kCC0MnvTGYTMvnVZTvqgypkiTI8Pa5tcz2i6VqsqwYGgqwXji+4RgCzms6EajE4IxiUH6HH8nQ==", "dev": true, "engines": { - "node": ">=0.10" + "node": ">=0.10.0" } }, - "node_modules/buffers": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/buffers/-/buffers-0.1.1.tgz", - "integrity": "sha512-9q/rDEGSb/Qsvv2qvzIzdluL5k7AaJOTrw23z9reQthrbF7is4CtlT0DXyO1oei2DCp4uojjzQ7igaSHp1kAEQ==", + "node_modules/bundle-name": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-4.1.0.tgz", + "integrity": "sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==", "dev": true, + "license": "MIT", + "dependencies": { + "run-applescript": "^7.0.0" + }, "engines": { - "node": ">=0.2.0" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/builtin-modules": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", - "integrity": "sha512-wxXCdllwGhI2kCC0MnvTGYTMvnVZTvqgypkiTI8Pa5tcz2i6VqsqwYGgqwXji+4RgCzms6EajE4IxiUH6HH8nQ==", + "node_modules/byte-counter": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/byte-counter/-/byte-counter-0.1.0.tgz", + "integrity": "sha512-jheRLVMeUKrDBjVw2O5+k4EvR4t9wtxHL+bo/LxfkxsVeuGMy3a5SEGgXdAFA4FSzTrU8rQXQIrsZ3oBq5a0pQ==", "dev": true, + "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/c8": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/c8/-/c8-11.0.0.tgz", + "integrity": "sha512-e/uRViGHSVIJv7zsaDKM7VRn2390TgHXqUSvYwPHBQaU6L7E9L0n9JbdkwdYPvshDT0KymBmmlwSpms3yBaMNg==", + "dev": true, + "license": "ISC", + "dependencies": { + "@bcoe/v8-coverage": "^1.0.1", + "@istanbuljs/schema": "^0.1.3", + "find-up": "^5.0.0", + "foreground-child": "^3.1.1", + "istanbul-lib-coverage": "^3.2.0", + "istanbul-lib-report": "^3.0.1", + "istanbul-reports": "^3.1.6", + "test-exclude": "^8.0.0", + "v8-to-istanbul": "^9.0.0", + "yargs": "^17.7.2", + "yargs-parser": "^21.1.1" + }, + "bin": { + "c8": "bin/c8.js" + }, + "engines": { + "node": "20 || >=22" + }, + "peerDependencies": { + "monocart-coverage-reports": "^2" + }, + "peerDependenciesMeta": { + "monocart-coverage-reports": { + "optional": true + } } }, "node_modules/cacheable-lookup": { @@ -1616,26 +2442,28 @@ "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-7.0.0.tgz", "integrity": "sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w==", "dev": true, + "license": "MIT", "engines": { "node": ">=14.16" } }, "node_modules/cacheable-request": { - "version": "10.2.12", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-10.2.12.tgz", - "integrity": "sha512-qtWGB5kn2OLjx47pYUkWicyOpK1vy9XZhq8yRTXOy+KAmjjESSRLx6SiExnnaGGUP1NM6/vmygMu0fGylNh9tw==", + "version": "13.0.18", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-13.0.18.tgz", + "integrity": "sha512-rFWadDRKJs3s2eYdXlGggnBZKG7MTblkFBB0YllFds+UYnfogDp2wcR6JN97FhRkHTvq59n2vhNoHNZn29dh/Q==", "dev": true, + "license": "MIT", "dependencies": { - "@types/http-cache-semantics": "^4.0.1", - "get-stream": "^6.0.1", - "http-cache-semantics": "^4.1.1", - "keyv": "^4.5.2", + "@types/http-cache-semantics": "^4.0.4", + "get-stream": "^9.0.1", + "http-cache-semantics": "^4.2.0", + "keyv": "^5.5.5", "mimic-response": "^4.0.0", - "normalize-url": "^8.0.0", - "responselike": "^3.0.0" + "normalize-url": "^8.1.1", + "responselike": "^4.0.2" }, "engines": { - "node": ">=14.16" + "node": ">=18" } }, "node_modules/call-bind-apply-helpers": { @@ -1655,6 +2483,7 @@ "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", "dev": true, + "license": "MIT", "dependencies": { "call-bind-apply-helpers": "^1.0.2", "get-intrinsic": "^1.3.0" @@ -1698,18 +2527,6 @@ } ] }, - "node_modules/chainsaw": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/chainsaw/-/chainsaw-0.1.0.tgz", - "integrity": "sha512-75kWfWt6MEKNC8xYXIdRpDehRYY/tNSgwKaJq+dbbDcxORuVrrQ+SEHoWsniVn9XPYfP4gmdWIeDk/4YNp1rNQ==", - "dev": true, - "dependencies": { - "traverse": ">=0.3.0 <0.4" - }, - "engines": { - "node": "*" - } - }, "node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", @@ -1739,21 +2556,26 @@ } }, "node_modules/cheerio": { - "version": "1.0.0-rc.12", - "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.12.tgz", - "integrity": "sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.2.0.tgz", + "integrity": "sha512-WDrybc/gKFpTYQutKIK6UvfcuxijIZfMfXaYm8NMsPQxSYvf+13fXUJ4rztGGbJcBQ/GF55gvrZ0Bc0bj/mqvg==", "dev": true, + "license": "MIT", "dependencies": { "cheerio-select": "^2.1.0", "dom-serializer": "^2.0.0", "domhandler": "^5.0.3", - "domutils": "^3.0.1", - "htmlparser2": "^8.0.1", - "parse5": "^7.0.0", - "parse5-htmlparser2-tree-adapter": "^7.0.0" + "domutils": "^3.2.2", + "encoding-sniffer": "^0.2.1", + "htmlparser2": "^10.1.0", + "parse5": "^7.3.0", + "parse5-htmlparser2-tree-adapter": "^7.1.0", + "parse5-parser-stream": "^7.1.2", + "undici": "^7.19.0", + "whatwg-mimetype": "^4.0.0" }, "engines": { - "node": ">= 6" + "node": ">=20.18.1" }, "funding": { "url": "https://github.com/cheeriojs/cheerio?sponsor=1" @@ -1764,6 +2586,7 @@ "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-2.1.0.tgz", "integrity": "sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "boolbase": "^1.0.0", "css-select": "^5.1.0", @@ -1807,15 +2630,16 @@ } }, "node_modules/cli-cursor": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-4.0.0.tgz", - "integrity": "sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-5.0.0.tgz", + "integrity": "sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==", "dev": true, + "license": "MIT", "dependencies": { - "restore-cursor": "^4.0.0" + "restore-cursor": "^5.0.0" }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -1826,6 +2650,7 @@ "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" }, @@ -1833,18 +2658,41 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/clipboard-image": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/clipboard-image/-/clipboard-image-0.1.0.tgz", + "integrity": "sha512-SWk7FgaXLNFld19peQ/rTe0n97lwR1WbkqxV6JKCAOh7U52AKV/PeMFCyt/8IhBdqyDA8rdyewQMKZqvWT5Akg==", + "dev": true, + "license": "MIT", + "dependencies": { + "run-jxa": "^3.0.0" + }, + "bin": { + "clipboard-image": "cli.js" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/clipboardy": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/clipboardy/-/clipboardy-4.0.0.tgz", - "integrity": "sha512-5mOlNS0mhX0707P2I0aZ2V/cmHUEO/fL7VFLqszkhUsxt7RwnmrInf/eEQKlf5GzvYeHIjT+Ov1HRfNmymlG0w==", + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/clipboardy/-/clipboardy-5.3.1.tgz", + "integrity": "sha512-fPWgBqpp9ctiOQCkE5yjYGzv11ZU55g6ahEgr3COiio6dXdt1mbchCPXQrSR2Y9sZqfi8L7QD3+UosgXVIuPdg==", "dev": true, + "license": "MIT", "dependencies": { - "execa": "^8.0.1", + "clipboard-image": "^0.1.0", + "execa": "^9.6.1", + "is-wayland": "^0.1.0", "is-wsl": "^3.1.0", - "is64bit": "^2.0.0" + "is64bit": "^2.0.0", + "powershell-utils": "^0.2.0" }, "engines": { - "node": ">=18" + "node": ">=20" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -1878,6 +2726,16 @@ "node": ">=6" } }, + "node_modules/cockatiel": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/cockatiel/-/cockatiel-3.2.1.tgz", + "integrity": "sha512-gfrHV6ZPkquExvMh9IOkKsBzNDk6sDuZ6DdBGUBkvFnTCqCxzpuq48RySgP0AnaqQkw2zynOFj9yly6T1Q2G5Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=16" + } + }, "node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -1920,10 +2778,11 @@ "dev": true }, "node_modules/compare-versions": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-6.1.0.tgz", - "integrity": "sha512-LNZQXhqUvqUTotpZ00qLSaify3b4VFD588aRr8MKFw4CMUr98ytzCW5wDH5qx/DEY5kCDXcbcRuCqL0szEf2tg==", - "dev": true + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-6.1.1.tgz", + "integrity": "sha512-4hm4VPpIecmlg59CHXnRDnqGplJFrbLG4aFEl5vl6cK1u76ws3LLvX7ikFnTDl5vo39sjWD6AaDPYodJp/NNHg==", + "dev": true, + "license": "MIT" }, "node_modules/concat-map": { "version": "0.0.1", @@ -1931,6 +2790,13 @@ "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", "dev": true }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true, + "license": "MIT" + }, "node_modules/copy-webpack-plugin": { "version": "11.0.0", "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-11.0.0.tgz", @@ -1976,11 +2842,41 @@ "node": ">= 8" } }, + "node_modules/crypto-random-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-4.0.0.tgz", + "integrity": "sha512-x8dy3RnvYdlUcPOjkEHqozhiwzKNSq7GcPuXFbnyMOCHxX8V3OgIg/pYuabl2sbUPfIJaeAQB7PMOK8DFIdoRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "type-fest": "^1.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/crypto-random-string/node_modules/type-fest": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", + "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/css-select": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", - "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==", + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.2.2.tgz", + "integrity": "sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "boolbase": "^1.0.0", "css-what": "^6.1.0", @@ -1993,10 +2889,11 @@ } }, "node_modules/css-what": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", - "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.2.2.tgz", + "integrity": "sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==", "dev": true, + "license": "BSD-2-Clause", "engines": { "node": ">= 6" }, @@ -2005,12 +2902,13 @@ } }, "node_modules/debug": { - "version": "4.3.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.6.tgz", - "integrity": "sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==", + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", "dev": true, + "license": "MIT", "dependencies": { - "ms": "2.1.2" + "ms": "^2.1.3" }, "engines": { "node": ">=6.0" @@ -2034,49 +2932,73 @@ } }, "node_modules/decompress-response": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", - "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-10.0.0.tgz", + "integrity": "sha512-oj7KWToJuuxlPr7VV0vabvxEIiqNMo+q0NueIiL3XhtwC6FVOX7Hr1c0C4eD0bmf7Zr+S/dSf2xvkH3Ad6sU3Q==", "dev": true, + "license": "MIT", "dependencies": { - "mimic-response": "^3.1.0" + "mimic-response": "^4.0.0" }, "engines": { - "node": ">=10" + "node": ">=20" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/decompress-response/node_modules/mimic-response": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", - "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", + "node_modules/deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/default-browser": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-5.5.0.tgz", + "integrity": "sha512-H9LMLr5zwIbSxrmvikGuI/5KGhZ8E2zH3stkMgM5LpOWDutGM2JZaj460Udnf1a+946zc7YBgrqEWwbk7zHvGw==", "dev": true, + "license": "MIT", + "dependencies": { + "bundle-name": "^4.1.0", + "default-browser-id": "^5.0.0" + }, "engines": { - "node": ">=10" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/deep-extend": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "node_modules/default-browser-id": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-5.0.1.tgz", + "integrity": "sha512-x1VCxdX4t+8wVfd1so/9w+vQ4vx7lKd2Qp5tDRutErwmR85OgmfX7RlLRMWafRMY7hbEiXIbudNrjOAPa/hL8Q==", "dev": true, - "optional": true, + "license": "MIT", "engines": { - "node": ">=4.0.0" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/defer-to-connect": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", - "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", + "node_modules/define-lazy-prop": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz", + "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==", "dev": true, + "license": "MIT", "engines": { - "node": ">=10" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/delayed-stream": { @@ -2088,10 +3010,11 @@ } }, "node_modules/detect-libc": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.2.tgz", - "integrity": "sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", "dev": true, + "license": "Apache-2.0", "optional": true, "engines": { "node": ">=8" @@ -2122,6 +3045,7 @@ "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", "dev": true, + "license": "MIT", "dependencies": { "domelementtype": "^2.3.0", "domhandler": "^5.0.2", @@ -2141,13 +3065,15 @@ "type": "github", "url": "https://github.com/sponsors/fb55" } - ] + ], + "license": "BSD-2-Clause" }, "node_modules/domhandler": { "version": "5.0.3", "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "domelementtype": "^2.3.0" }, @@ -2159,10 +3085,11 @@ } }, "node_modules/domutils": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz", - "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz", + "integrity": "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "dom-serializer": "^2.0.0", "domelementtype": "^2.3.0", @@ -2190,6 +3117,7 @@ "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", "integrity": "sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "readable-stream": "^2.0.2" } @@ -2200,6 +3128,33 @@ "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", "dev": true }, + "node_modules/ecdsa-sig-formatter": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", + "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "safe-buffer": "^5.0.1" + } + }, + "node_modules/editions": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/editions/-/editions-6.22.0.tgz", + "integrity": "sha512-UgGlf8IW75je7HZjNDpJdCv4cGJWIi6yumFdZ0R7A8/CIhQiWUjyGLCxdHpd8bmyD1gnkfUNK0oeOXqUS2cpfQ==", + "dev": true, + "license": "Artistic-2.0", + "dependencies": { + "version-range": "^4.15.0" + }, + "engines": { + "ecmascript": ">= es5", + "node": ">=4" + }, + "funding": { + "url": "https://bevry.me/fund" + } + }, "node_modules/electron-to-chromium": { "version": "1.5.286", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.286.tgz", @@ -2212,6 +3167,20 @@ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "dev": true }, + "node_modules/encoding-sniffer": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/encoding-sniffer/-/encoding-sniffer-0.2.1.tgz", + "integrity": "sha512-5gvq20T6vfpekVtqrYQsSCFZ1wEg5+wW0/QaZMWkFr6BqD3NfKs0rLCx4rrVlSWJeZb5NBJgVLswK/w2MWU+Gw==", + "dev": true, + "license": "MIT", + "dependencies": { + "iconv-lite": "^0.6.3", + "whatwg-encoding": "^3.1.1" + }, + "funding": { + "url": "https://github.com/fb55/encoding-sniffer?sponsor=1" + } + }, "node_modules/end-of-stream": { "version": "1.4.4", "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", @@ -2239,6 +3208,7 @@ "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", "dev": true, + "license": "BSD-2-Clause", "engines": { "node": ">=0.12" }, @@ -2258,6 +3228,19 @@ "node": ">=4" } }, + "node_modules/environment": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/environment/-/environment-1.1.0.tgz", + "integrity": "sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/es-define-property": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", @@ -2392,35 +3375,40 @@ } }, "node_modules/execa": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz", - "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==", + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-9.6.1.tgz", + "integrity": "sha512-9Be3ZoN4LmYR90tUoVu2te2BsbzHfhJyfEiAVfz7N5/zv+jduIfLrV2xdQXOHbaD6KgpGdO9PRPM1Y4Q9QkPkA==", "dev": true, + "license": "MIT", "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^8.0.1", - "human-signals": "^5.0.0", - "is-stream": "^3.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^5.1.0", - "onetime": "^6.0.0", + "@sindresorhus/merge-streams": "^4.0.0", + "cross-spawn": "^7.0.6", + "figures": "^6.1.0", + "get-stream": "^9.0.0", + "human-signals": "^8.0.1", + "is-plain-obj": "^4.1.0", + "is-stream": "^4.0.1", + "npm-run-path": "^6.0.0", + "pretty-ms": "^9.2.0", "signal-exit": "^4.1.0", - "strip-final-newline": "^3.0.0" + "strip-final-newline": "^4.0.0", + "yoctocolors": "^2.1.1" }, "engines": { - "node": ">=16.17" + "node": "^18.19.0 || >=20.5.0" }, "funding": { "url": "https://github.com/sindresorhus/execa?sponsor=1" } }, - "node_modules/execa/node_modules/get-stream": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz", - "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==", + "node_modules/execa/node_modules/is-plain-obj": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", + "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", "dev": true, + "license": "MIT", "engines": { - "node": ">=16" + "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -2431,6 +3419,7 @@ "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==", "dev": true, + "license": "(MIT OR WTFPL)", "optional": true, "engines": { "node": ">=6" @@ -2458,15 +3447,16 @@ "dev": true }, "node_modules/fast-glob": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", - "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", + "license": "MIT", "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", "glob-parent": "^5.1.2", "merge2": "^1.3.0", - "micromatch": "^4.0.4" + "micromatch": "^4.0.8" }, "engines": { "node": ">=8.6.0" @@ -2483,6 +3473,23 @@ "node": ">= 6" } }, + "node_modules/fast-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.0.tgz", + "integrity": "sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "BSD-3-Clause" + }, "node_modules/fastest-levenshtein": { "version": "1.0.16", "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", @@ -2505,10 +3512,40 @@ "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", "dev": true, + "license": "MIT", "dependencies": { "pend": "~1.2.0" } }, + "node_modules/figures": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-6.1.0.tgz", + "integrity": "sha512-d+l3qxjSesT4V7v2fh+QnmFnUWv9lSpjarhShNTgBOfA0ttejbQUAlHLitbjkoRiDulW0OPoQPYIGhIC8ohejg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-unicode-supported": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/figures/node_modules/is-unicode-supported": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-2.1.0.tgz", + "integrity": "sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/fill-range": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", @@ -2573,12 +3610,13 @@ } }, "node_modules/foreground-child": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz", - "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", + "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", "dev": true, + "license": "ISC", "dependencies": { - "cross-spawn": "^7.0.0", + "cross-spawn": "^7.0.6", "signal-exit": "^4.0.1" }, "engines": { @@ -2604,12 +3642,13 @@ } }, "node_modules/form-data-encoder": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-2.1.4.tgz", - "integrity": "sha512-yDYSgNMraqvnxiEXO4hi88+YZxaHC6QKzb5N84iRCTDeRO7ZALpir/lVmf/uXUhnwUr2O4HU8s/n6x+yNjQkHw==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-4.1.0.tgz", + "integrity": "sha512-G6NsmEW15s0Uw9XnCg+33H3ViYRyiM0hMrMhhqQOR8NFc5GhYrI+6I3u7OTw7b91J2g8rtvMBZJDbcGb2YUniw==", "dev": true, + "license": "MIT", "engines": { - "node": ">= 14.17" + "node": ">= 18" } }, "node_modules/fs-constants": { @@ -2637,33 +3676,6 @@ "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", "dev": true }, - "node_modules/fstream": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.12.tgz", - "integrity": "sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.1.2", - "inherits": "~2.0.0", - "mkdirp": ">=0.5 0", - "rimraf": "2" - }, - "engines": { - "node": ">=0.6" - } - }, - "node_modules/fstream/node_modules/rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - } - }, "node_modules/function-bind": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", @@ -2681,6 +3693,19 @@ "node": "6.* || 8.* || >= 10.*" } }, + "node_modules/get-east-asian-width": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.5.0.tgz", + "integrity": "sha512-CQ+bEO+Tva/qlmw24dCejulK5pMzVnUOFOijVogd3KQs07HnRIgp8TGipvCCRT06xeYEbpbgwaCxglFyiuIcmA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/get-intrinsic": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", @@ -2717,12 +3742,17 @@ } }, "node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-9.0.1.tgz", + "integrity": "sha512-kVCxPF3vQM/N0B1PmoqVUqgHP+EeVjmZSQn+1oCRPxd2P21P2F19lIgbR3HBosbB1PUhOAoctJnfEn2GbN2eZA==", "dev": true, + "license": "MIT", + "dependencies": { + "@sec-ant/readable-stream": "^0.4.1", + "is-stream": "^4.0.1" + }, "engines": { - "node": ">=10" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -2733,6 +3763,7 @@ "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==", "dev": true, + "license": "MIT", "optional": true }, "node_modules/glob": { @@ -2826,25 +3857,27 @@ } }, "node_modules/got": { - "version": "13.0.0", - "resolved": "https://registry.npmjs.org/got/-/got-13.0.0.tgz", - "integrity": "sha512-XfBk1CxOOScDcMr9O1yKkNaQyy865NbYs+F7dr4H0LZMVgCj2Le59k6PqbNHoL5ToeaEQUYh6c6yMfVcc6SJxA==", + "version": "14.6.6", + "resolved": "https://registry.npmjs.org/got/-/got-14.6.6.tgz", + "integrity": "sha512-QLV1qeYSo5l13mQzWgP/y0LbMr5Plr5fJilgAIwgnwseproEbtNym8xpLsDzeZ6MWXgNE6kdWGBjdh3zT/Qerg==", "dev": true, + "license": "MIT", "dependencies": { - "@sindresorhus/is": "^5.2.0", - "@szmarczak/http-timer": "^5.0.1", + "@sindresorhus/is": "^7.0.1", + "byte-counter": "^0.1.0", "cacheable-lookup": "^7.0.0", - "cacheable-request": "^10.2.8", - "decompress-response": "^6.0.0", - "form-data-encoder": "^2.1.2", - "get-stream": "^6.0.1", - "http2-wrapper": "^2.1.10", + "cacheable-request": "^13.0.12", + "decompress-response": "^10.0.0", + "form-data-encoder": "^4.0.2", + "http2-wrapper": "^2.2.1", + "keyv": "^5.5.3", "lowercase-keys": "^3.0.0", - "p-cancelable": "^3.0.0", - "responselike": "^3.0.0" + "p-cancelable": "^4.0.1", + "responselike": "^4.0.2", + "type-fest": "^4.26.1" }, "engines": { - "node": ">=16" + "node": ">=20" }, "funding": { "url": "https://github.com/sindresorhus/got?sponsor=1" @@ -2926,6 +3959,7 @@ "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" }, @@ -2942,10 +3976,17 @@ "node": ">=14" } }, + "node_modules/html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true, + "license": "MIT" + }, "node_modules/htmlparser2": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.2.tgz", - "integrity": "sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==", + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-10.1.0.tgz", + "integrity": "sha512-VTZkM9GWRAtEpveh7MSF6SjjrpNVNNVJfFup7xTY3UpFtm67foy9HDVXneLtFVt4pMz5kZtgNcvCniNFb1hlEQ==", "dev": true, "funding": [ "https://github.com/fb55/htmlparser2?sponsor=1", @@ -2954,18 +3995,33 @@ "url": "https://github.com/sponsors/fb55" } ], + "license": "MIT", "dependencies": { "domelementtype": "^2.3.0", "domhandler": "^5.0.3", - "domutils": "^3.0.1", - "entities": "^4.4.0" + "domutils": "^3.2.2", + "entities": "^7.0.1" + } + }, + "node_modules/htmlparser2/node_modules/entities": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-7.0.1.tgz", + "integrity": "sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" } }, "node_modules/http-cache-semantics": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", - "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==", - "dev": true + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz", + "integrity": "sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==", + "dev": true, + "license": "BSD-2-Clause" }, "node_modules/http-proxy-agent": { "version": "7.0.2", @@ -2981,10 +4037,11 @@ } }, "node_modules/http2-wrapper": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-2.2.0.tgz", - "integrity": "sha512-kZB0wxMo0sh1PehyjJUWRFEd99KC5TLjZ2cULC4f9iqJBAmKQQXEICjxl5iPJRwP40dpeHFqqhm7tYCvODpqpQ==", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-2.2.1.tgz", + "integrity": "sha512-V5nVw1PAOgfI3Lmeaj2Exmeg7fenjhRUgz1lPSezy1CuhPYbgQtbQj4jZfEAEMlaL+vupsvhjqCyjzob0yxsmQ==", "dev": true, + "license": "MIT", "dependencies": { "quick-lru": "^5.1.1", "resolve-alpn": "^1.2.0" @@ -3007,12 +4064,26 @@ } }, "node_modules/human-signals": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz", - "integrity": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==", + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-8.0.1.tgz", + "integrity": "sha512-eKCa6bwnJhvxj14kZk5NCPc6Hb6BdsU9DZcOnmQKSnO1VKrfV0zCvtttPZUsBvjmNDn8rpcJfpwSYnHBjc95MQ==", "dev": true, + "license": "Apache-2.0", "engines": { - "node": ">=16.17.0" + "node": ">=18.18.0" + } + }, + "node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" } }, "node_modules/ieee754": { @@ -3033,7 +4104,9 @@ "type": "consulting", "url": "https://feross.org/support" } - ] + ], + "license": "BSD-3-Clause", + "optional": true }, "node_modules/ignore": { "version": "5.2.4", @@ -3068,6 +4141,19 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/index-to-position": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/index-to-position/-/index-to-position-1.2.0.tgz", + "integrity": "sha512-Yg7+ztRkqslMAS2iFaU+Oa4KTSidr63OsFGlOrJoW981kIYO3CGCS3wA95P1mUi/IVSJkn0D479KTJpVpvFNuw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", @@ -3089,6 +4175,7 @@ "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", "dev": true, + "license": "ISC", "optional": true }, "node_modules/interpret": { @@ -3117,6 +4204,7 @@ "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", "dev": true, + "license": "MIT", "bin": { "is-docker": "cli.js" }, @@ -3160,6 +4248,7 @@ "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz", "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==", "dev": true, + "license": "MIT", "dependencies": { "is-docker": "^3.0.0" }, @@ -3178,6 +4267,7 @@ "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-2.0.0.tgz", "integrity": "sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=12" }, @@ -3224,12 +4314,13 @@ } }, "node_modules/is-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", - "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-4.0.1.tgz", + "integrity": "sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A==", "dev": true, + "license": "MIT", "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -3247,11 +4338,25 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/is-wayland": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-wayland/-/is-wayland-0.1.0.tgz", + "integrity": "sha512-QkbMsWkIfkrzOPxenwye0h56iAXirZYHG9eHVPb22fO9y+wPbaX/CHacOWBa/I++4ohTcByimhM1/nyCsH8KNA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/is-wsl": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.0.tgz", - "integrity": "sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.1.tgz", + "integrity": "sha512-e6rvdUCiQCAuumZslxRJWR/Doq4VpPR82kqclvcS0efgt430SlGIk05vdCN58+VrzgtIcfNODjozVielycD4Sw==", "dev": true, + "license": "MIT", "dependencies": { "is-inside-container": "^1.0.0" }, @@ -3267,6 +4372,7 @@ "resolved": "https://registry.npmjs.org/is64bit/-/is64bit-2.0.0.tgz", "integrity": "sha512-jv+8jaWCl0g2lSBkNSVXdzfBA0npK1HGC2KtWM9FumFRoGS94g3NbCCLVnCYHLjp4GrW2KZeeSTMo5ddtznmGw==", "dev": true, + "license": "MIT", "dependencies": { "system-architecture": "^0.1.0" }, @@ -3298,22 +4404,100 @@ "node": ">=0.10.0" } }, + "node_modules/istanbul-lib-coverage": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", + "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-report": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", + "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^4.0.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-report/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/istanbul-reports": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.2.0.tgz", + "integrity": "sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istextorbinary": { + "version": "9.5.0", + "resolved": "https://registry.npmjs.org/istextorbinary/-/istextorbinary-9.5.0.tgz", + "integrity": "sha512-5mbUj3SiZXCuRf9fT3ibzbSSEWiy63gFfksmGfdOzujPjW3k+z8WvIBxcJHBoQNlaZaiyB25deviif2+osLmLw==", + "dev": true, + "license": "Artistic-2.0", + "dependencies": { + "binaryextensions": "^6.11.0", + "editions": "^6.21.0", + "textextensions": "^6.11.0" + }, + "engines": { + "node": ">=4" + }, + "funding": { + "url": "https://bevry.me/fund" + } + }, "node_modules/jackspeak": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz", - "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-4.2.3.tgz", + "integrity": "sha512-ykkVRwrYvFm1nb2AJfKKYPr0emF6IiXDYUaFx4Zn9ZuIH7MrzEZ3sD5RlqGXNRpHtvUHJyOnCEFxOlNDtGo7wg==", "dev": true, + "license": "BlueOak-1.0.0", "dependencies": { - "@isaacs/cliui": "^8.0.2" + "@isaacs/cliui": "^9.0.0" }, "engines": { - "node": ">=14" + "node": "20 || >=22" }, "funding": { "url": "https://github.com/sponsors/isaacs" - }, - "optionalDependencies": { - "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/jackspeak/node_modules/@isaacs/cliui": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-9.0.0.tgz", + "integrity": "sha512-AokJm4tuBHillT+FpMtxQ60n8ObyXBatq7jD2/JA9dxbDDokKQm8KMht5ibGzLVU9IJDIKK4TPKgMHEYMn3lMg==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=18" } }, "node_modules/jest-worker": { @@ -3334,7 +4518,8 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/js-yaml": { "version": "4.1.1", @@ -3348,12 +4533,6 @@ "js-yaml": "bin/js-yaml.js" } }, - "node_modules/json-buffer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", - "dev": true - }, "node_modules/json-parse-even-better-errors": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", @@ -3366,11 +4545,25 @@ "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", "dev": true }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/jsonc-parser": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", - "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==", - "dev": true + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.3.1.tgz", + "integrity": "sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==", + "dev": true, + "license": "MIT" }, "node_modules/jsonfile": { "version": "6.1.0", @@ -3383,6 +4576,29 @@ "graceful-fs": "^4.1.6" } }, + "node_modules/jsonwebtoken": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.3.tgz", + "integrity": "sha512-MT/xP0CrubFRNLNKvxJ2BYfy53Zkm++5bX9dtuPbqAeQpTVe0MQTFhao8+Cp//EmJp244xt6Drw/GVEGCUj40g==", + "dev": true, + "license": "MIT", + "dependencies": { + "jws": "^4.0.1", + "lodash.includes": "^4.3.0", + "lodash.isboolean": "^3.0.3", + "lodash.isinteger": "^4.0.4", + "lodash.isnumber": "^3.0.3", + "lodash.isplainobject": "^4.0.6", + "lodash.isstring": "^4.0.1", + "lodash.once": "^4.0.0", + "ms": "^2.1.1", + "semver": "^7.5.4" + }, + "engines": { + "node": ">=12", + "npm": ">=6" + } + }, "node_modules/jszip": { "version": "3.10.1", "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.10.1.tgz", @@ -3395,12 +4611,36 @@ "setimmediate": "^1.0.5" } }, + "node_modules/jwa": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.1.tgz", + "integrity": "sha512-hRF04fqJIP8Abbkq5NKGN0Bbr3JxlQ+qhZufXVr0DvujKy93ZCbXZMHDL4EOtodSbCWxOqR8MS1tXA5hwqCXDg==", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer-equal-constant-time": "^1.0.1", + "ecdsa-sig-formatter": "1.0.11", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/jws": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/jws/-/jws-4.0.1.tgz", + "integrity": "sha512-EKI/M/yqPncGUUh44xz0PxSidXFr/+r0pA70+gIYhjv+et7yxM+s29Y+VGDkovRofQem0fs7Uvf4+YmAdyRduA==", + "dev": true, + "license": "MIT", + "dependencies": { + "jwa": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, "node_modules/keytar": { "version": "7.9.0", "resolved": "https://registry.npmjs.org/keytar/-/keytar-7.9.0.tgz", "integrity": "sha512-VPD8mtVtm5JNtA2AErl6Chp06JBfy7diFQ7TQQhdpWOl6MrCRB+eRbvAZUsbGQS9kiMq0coJsy0W0vHpDCkWsQ==", "dev": true, "hasInstallScript": true, + "license": "MIT", "optional": true, "dependencies": { "node-addon-api": "^4.3.0", @@ -3408,12 +4648,13 @@ } }, "node_modules/keyv": { - "version": "4.5.3", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.3.tgz", - "integrity": "sha512-QCiSav9WaX1PgETJ+SpNnx2PRRapJ/oRSXM4VO5OGYGSjrxbKPVFVhB3l2OCbLCk329N8qyAtsJjSjvVBWzEug==", + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-5.6.0.tgz", + "integrity": "sha512-CYDD3SOtsHtyXeEORYRx2qBtpDJFjRTGXUtmNEMGyzYOKj1TE3tycdlho7kA1Ufx9OYWZzg52QFBGALTirzDSw==", "dev": true, + "license": "MIT", "dependencies": { - "json-buffer": "3.0.1" + "@keyv/serialize": "^1.1.1" } }, "node_modules/kind-of": { @@ -3430,6 +4671,7 @@ "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } @@ -3444,20 +4686,15 @@ } }, "node_modules/linkify-it": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-3.0.3.tgz", - "integrity": "sha512-ynTsyrFSdE5oZ/O9GEf00kPngmOfVwazR5GKDq6EYfhlpFug3J2zybX56a2PRRpc9P+FuSoGNAwjlbDs9jJBPQ==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-5.0.0.tgz", + "integrity": "sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==", "dev": true, + "license": "MIT", "dependencies": { - "uc.micro": "^1.0.1" + "uc.micro": "^2.0.0" } }, - "node_modules/listenercount": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/listenercount/-/listenercount-1.0.1.tgz", - "integrity": "sha512-3mk/Zag0+IJxeDrxSgaDPy4zZ3w05PRZeJNnlWhzFz5OkX49J4krc+A8X2d2M69vGMBEX0uyl8M+W+8gH+kBqQ==", - "dev": true - }, "node_modules/loader-runner": { "version": "4.3.1", "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.1.tgz", @@ -3491,6 +4728,62 @@ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.23.tgz", "integrity": "sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w==" }, + "node_modules/lodash.includes": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", + "integrity": "sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.isboolean": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", + "integrity": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.isinteger": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", + "integrity": "sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.isnumber": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", + "integrity": "sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.isstring": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", + "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.once": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", + "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.truncate": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", + "integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==", + "dev": true, + "license": "MIT" + }, "node_modules/log-symbols": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", @@ -3512,6 +4805,7 @@ "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-3.0.0.tgz", "integrity": "sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==", "dev": true, + "license": "MIT", "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, @@ -3524,6 +4818,7 @@ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dev": true, + "license": "ISC", "dependencies": { "yallist": "^4.0.0" }, @@ -3531,29 +4826,54 @@ "node": ">=10" } }, - "node_modules/markdown-it": { - "version": "12.3.2", - "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-12.3.2.tgz", - "integrity": "sha512-TchMembfxfNVpHkbtriWltGWc+m3xszaRD0CZup7GFFhzIgQqxIfn3eGj1yZpfuflzPvfkt611B2Q/Bsk1YnGg==", + "node_modules/macos-version": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/macos-version/-/macos-version-6.0.0.tgz", + "integrity": "sha512-O2S8voA+pMfCHhBn/TIYDXzJ1qNHpPDU32oFxglKnVdJABiYYITt45oLkV9yhwA3E2FDwn3tQqUFrTsr1p3sBQ==", "dev": true, + "license": "MIT", "dependencies": { - "argparse": "^2.0.1", - "entities": "~2.1.0", - "linkify-it": "^3.0.1", - "mdurl": "^1.0.1", - "uc.micro": "^1.0.5" + "semver": "^7.3.5" }, - "bin": { - "markdown-it": "bin/markdown-it.js" + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/markdown-it/node_modules/entities": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.1.0.tgz", - "integrity": "sha512-hCx1oky9PFrJ611mf0ifBLBRW8lUUVRlFolb5gWRfIELabBlbp9xZvrqZLZAs+NxFnbfQoeGd8wDkygjg7U85w==", + "node_modules/make-dir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", + "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + }, "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/markdown-it": { + "version": "14.1.1", + "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-14.1.1.tgz", + "integrity": "sha512-BuU2qnTti9YKgK5N+IeMubp14ZUKUUw7yeJbkjtosvHiP0AZ5c8IAgEMk79D0eC8F23r4Ac/q8cAIFdm2FtyoA==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1", + "entities": "^4.4.0", + "linkify-it": "^5.0.0", + "mdurl": "^2.0.0", + "punycode.js": "^2.3.1", + "uc.micro": "^2.1.0" + }, + "bin": { + "markdown-it": "bin/markdown-it.mjs" } }, "node_modules/math-intrinsics": { @@ -3565,10 +4885,11 @@ } }, "node_modules/mdurl": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", - "integrity": "sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==", - "dev": true + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-2.0.0.tgz", + "integrity": "sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==", + "dev": true, + "license": "MIT" }, "node_modules/merge-stream": { "version": "2.0.0", @@ -3601,6 +4922,7 @@ "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", "dev": true, + "license": "MIT", "bin": { "mime": "cli.js" }, @@ -3628,12 +4950,23 @@ } }, "node_modules/mimic-fn": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", - "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", "dev": true, + "license": "MIT", "engines": { - "node": ">=12" + "node": ">=6" + } + }, + "node_modules/mimic-function": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/mimic-function/-/mimic-function-5.0.1.tgz", + "integrity": "sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -3644,6 +4977,7 @@ "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-4.0.0.tgz", "integrity": "sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg==", "dev": true, + "license": "MIT", "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, @@ -3672,10 +5006,11 @@ } }, "node_modules/minipass": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", - "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz", + "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==", "dev": true, + "license": "BlueOak-1.0.0", "engines": { "node": ">=16 || 14 >=14.17" } @@ -3697,6 +5032,7 @@ "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", "dev": true, + "license": "MIT", "optional": true }, "node_modules/mocha": { @@ -3785,60 +5121,26 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/mocha/node_modules/ms": { + "node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true - }, - "node_modules/monaco-page-objects": { - "version": "3.12.0", - "resolved": "https://registry.npmjs.org/monaco-page-objects/-/monaco-page-objects-3.12.0.tgz", - "integrity": "sha512-JiA24MmjeilFUumMtch9v/nzHWFt1TgMt9oRYmQJ7BwOFucFFxU+ksNmEwp5Je3b3tn1F+gDI3A1QwEhdOxXOg==", - "dev": true, - "dependencies": { - "clipboardy": "^4.0.0", - "clone-deep": "^4.0.1", - "compare-versions": "^6.1.0", - "fs-extra": "^11.2.0", - "ts-essentials": "^9.4.1" - }, - "peerDependencies": { - "selenium-webdriver": "^4.6.1", - "typescript": ">=4.6.2" - } - }, - "node_modules/monaco-page-objects/node_modules/fs-extra": { - "version": "11.2.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", - "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", "dev": true, - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=14.14" - } - }, - "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true + "license": "MIT" }, "node_modules/mute-stream": { "version": "0.0.8", "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/napi-build-utils": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz", - "integrity": "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-2.0.0.tgz", + "integrity": "sha512-GEbrYkbfF7MoNaoh2iGG84Mnf/WZfB0GdGEsM8wz7Expx/LlWf5U8t9nvJKXSp3qr5IsEbK04cBGhol/KwOsWA==", "dev": true, + "license": "MIT", "optional": true }, "node_modules/neo-async": { @@ -3848,10 +5150,11 @@ "dev": true }, "node_modules/node-abi": { - "version": "3.54.0", - "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.54.0.tgz", - "integrity": "sha512-p7eGEiQil0YUV3ItH4/tBb781L5impVmmx2E9FRKF7d18XXzp4PGT2tdYMFY6wQqgxD0IwNZOiSJ0/K0fSi/OA==", + "version": "3.89.0", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.89.0.tgz", + "integrity": "sha512-6u9UwL0HlAl21+agMN3YAMXcKByMqwGx+pq+P76vii5f7hTPtKDp08/H9py6DY+cfDw7kQNTGEj/rly3IgbNQA==", "dev": true, + "license": "MIT", "optional": true, "dependencies": { "semver": "^7.3.5" @@ -3865,14 +5168,86 @@ "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-4.3.0.tgz", "integrity": "sha512-73sE9+3UaLYYFmDsFZnqCInzPyh3MqIwZO9cw58yIqAZhONrrabrYyYe3TuIqtIiOuTXVhsGau8hcrhhwSsDIQ==", "dev": true, + "license": "MIT", "optional": true }, + "node_modules/node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", + "dev": true, + "license": "MIT" + }, "node_modules/node-releases": { "version": "2.0.27", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.27.tgz", "integrity": "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==", "dev": true }, + "node_modules/node-sarif-builder": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/node-sarif-builder/-/node-sarif-builder-3.4.0.tgz", + "integrity": "sha512-tGnJW6OKRii9u/b2WiUViTJS+h7Apxx17qsMUjsUeNDiMMX5ZFf8F8Fcz7PAQ6omvOxHZtvDTmOYKJQwmfpjeg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/sarif": "^2.1.7", + "fs-extra": "^11.1.1" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/node-sarif-builder/node_modules/fs-extra": { + "version": "11.3.4", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.4.tgz", + "integrity": "sha512-CTXd6rk/M3/ULNQj8FBqBWHYBVYybQ3VPBw0xGKFe3tuH7ytT6ACnvzpIQ3UZtB8yvUKC2cXn1a+x+5EVQLovA==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/normalize-package-data": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-6.0.2.tgz", + "integrity": "sha512-V6gygoYb/5EmNI+MEGrWkC+e6+Rr7mTmfHrxDbLzxQogBkgzo76rkok0Am6thgSF7Mv2nLOajAJj5vDJZEFn7g==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "hosted-git-info": "^7.0.0", + "semver": "^7.3.5", + "validate-npm-package-license": "^3.0.4" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/normalize-package-data/node_modules/hosted-git-info": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-7.0.2.tgz", + "integrity": "sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w==", + "dev": true, + "license": "ISC", + "dependencies": { + "lru-cache": "^10.0.1" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/normalize-package-data/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/normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", @@ -3883,10 +5258,11 @@ } }, "node_modules/normalize-url": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-8.0.0.tgz", - "integrity": "sha512-uVFpKhj5MheNBJRTiMZ9pE/7hD1QTeEvugSJW/OmLzAp78PB5O6adfMNTvmfKhXBkvCzC+rqifWcVYpGFwTjnw==", + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-8.1.1.tgz", + "integrity": "sha512-JYc0DPlpGWB40kH5g07gGTrYuMqV653k3uBKY6uITPWds3M0ov3GaWGp9lbE3Bzngx8+XkfzgvASb9vk9JDFXQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=14.16" }, @@ -3895,15 +5271,17 @@ } }, "node_modules/npm-run-path": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.2.0.tgz", - "integrity": "sha512-W4/tgAXFqFA0iL7fk0+uQ3g7wkL8xJmx3XdK0VGb4cHW//eZTtKGvFBBoRKVTpY7n6ze4NL9ly7rgXcHufqXKg==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-6.0.0.tgz", + "integrity": "sha512-9qny7Z9DsQU8Ou39ERsPU4OZQlSTP47ShQzuKZ6PRXpYLtIFgl/DEBYEXKlvcEa+9tHVcK8CF81Y2V72qaZhWA==", "dev": true, + "license": "MIT", "dependencies": { - "path-key": "^4.0.0" + "path-key": "^4.0.0", + "unicorn-magic": "^0.3.0" }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -3914,6 +5292,7 @@ "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=12" }, @@ -3926,6 +5305,7 @@ "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "boolbase": "^1.0.0" }, @@ -3938,6 +5318,7 @@ "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -3955,48 +5336,70 @@ } }, "node_modules/onetime": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", - "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-7.0.0.tgz", + "integrity": "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-function": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/open": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/open/-/open-10.2.0.tgz", + "integrity": "sha512-YgBpdJHPyQ2UE5x+hlSXcnejzAvD0b22U2OuAP+8OnlJT+PjWPxtgmGqKKc+RgTM63U9gN0YzrYc71R2WT/hTA==", "dev": true, + "license": "MIT", "dependencies": { - "mimic-fn": "^4.0.0" + "default-browser": "^5.2.1", + "define-lazy-prop": "^3.0.0", + "is-inside-container": "^1.0.0", + "wsl-utils": "^0.1.0" }, "engines": { - "node": ">=12" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/ora": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/ora/-/ora-7.0.1.tgz", - "integrity": "sha512-0TUxTiFJWv+JnjWm4o9yvuskpEJLXTcng8MJuKd+SzAzp2o+OP3HWqNhB4OdJRt1Vsd9/mR0oyaEYlOnL7XIRw==", + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/ora/-/ora-8.2.0.tgz", + "integrity": "sha512-weP+BZ8MVNnlCm8c0Qdc1WSWq4Qn7I+9CJGm7Qali6g44e/PUzbjNqJX5NJ9ljlNMosfJvg1fKEGILklK9cwnw==", "dev": true, + "license": "MIT", "dependencies": { "chalk": "^5.3.0", - "cli-cursor": "^4.0.0", - "cli-spinners": "^2.9.0", + "cli-cursor": "^5.0.0", + "cli-spinners": "^2.9.2", "is-interactive": "^2.0.0", - "is-unicode-supported": "^1.3.0", - "log-symbols": "^5.1.0", - "stdin-discarder": "^0.1.0", - "string-width": "^6.1.0", + "is-unicode-supported": "^2.0.0", + "log-symbols": "^6.0.0", + "stdin-discarder": "^0.2.2", + "string-width": "^7.2.0", "strip-ansi": "^7.1.0" }, "engines": { - "node": ">=16" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/ora/node_modules/ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", "dev": true, + "license": "MIT", "engines": { "node": ">=12" }, @@ -4005,10 +5408,11 @@ } }, "node_modules/ora/node_modules/chalk": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", - "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", + "version": "5.6.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", + "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", "dev": true, + "license": "MIT", "engines": { "node": "^12.17.0 || ^14.13 || >=16.0.0" }, @@ -4017,32 +5421,48 @@ } }, "node_modules/ora/node_modules/emoji-regex": { - "version": "10.3.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.3.0.tgz", - "integrity": "sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw==", - "dev": true + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz", + "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==", + "dev": true, + "license": "MIT" }, "node_modules/ora/node_modules/is-unicode-supported": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-1.3.0.tgz", - "integrity": "sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-2.1.0.tgz", + "integrity": "sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==", "dev": true, + "license": "MIT", "engines": { - "node": ">=12" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/ora/node_modules/log-symbols": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-5.1.0.tgz", - "integrity": "sha512-l0x2DvrW294C9uDCoQe1VSU4gf529FkSZ6leBl4TiqZH/e+0R7hSfHQBNut2mNygDgHwvYHfFLn6Oxb3VWj2rA==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-6.0.0.tgz", + "integrity": "sha512-i24m8rpwhmPIS4zscNzK6MSEhk0DUWa/8iYQWxhffV8jkI4Phvs3F+quL5xvS0gdQR0FyTCMMH33Y78dDTzzIw==", "dev": true, + "license": "MIT", "dependencies": { - "chalk": "^5.0.0", - "is-unicode-supported": "^1.1.0" + "chalk": "^5.3.0", + "is-unicode-supported": "^1.3.0" + }, + "engines": { + "node": ">=18" }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ora/node_modules/log-symbols/node_modules/is-unicode-supported": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-1.3.0.tgz", + "integrity": "sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==", + "dev": true, + "license": "MIT", "engines": { "node": ">=12" }, @@ -4051,29 +5471,31 @@ } }, "node_modules/ora/node_modules/string-width": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-6.1.0.tgz", - "integrity": "sha512-k01swCJAgQmuADB0YIc+7TuatfNvTBVOoaUWJjTB9R4VJzR5vNWzf5t42ESVZFPS8xTySF7CAdV4t/aaIm3UnQ==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", "dev": true, + "license": "MIT", "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^10.2.1", - "strip-ansi": "^7.0.1" + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" }, "engines": { - "node": ">=16" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/ora/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", "dev": true, + "license": "MIT", "dependencies": { - "ansi-regex": "^6.0.1" + "ansi-regex": "^6.2.2" }, "engines": { "node": ">=12" @@ -4083,12 +5505,13 @@ } }, "node_modules/p-cancelable": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-3.0.0.tgz", - "integrity": "sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-4.0.1.tgz", + "integrity": "sha512-wBowNApzd45EIKdO1LaU+LrMBwAcjfPaYtVzV3lmfM3gf8Z4CHZsiIqlM8TZZ8okYvh5A1cP6gTfCRQtwUpaUg==", "dev": true, + "license": "MIT", "engines": { - "node": ">=12.20" + "node": ">=14.16" } }, "node_modules/p-limit": { @@ -4121,6 +5544,19 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/p-map": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-7.0.4.tgz", + "integrity": "sha512-tkAQEw8ysMzmkhgw8k+1U/iPhWNhykKnSk4Rd5zLoPJCuJaGRPo6YposrZgaxHKzDHdDWWZvE/Sk7hsL2X/CpQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/p-try": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", @@ -4142,11 +5578,43 @@ "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", "dev": true }, + "node_modules/parse-json": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-8.3.0.tgz", + "integrity": "sha512-ybiGyvspI+fAoRQbIPRddCcSTV9/LsJbf0e/S85VLowVGzRmokfneg2kwVW/KU5rOXrPSbF1qAKPMgNTqqROQQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.26.2", + "index-to-position": "^1.1.0", + "type-fest": "^4.39.1" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parse-ms": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-ms/-/parse-ms-4.0.0.tgz", + "integrity": "sha512-TXfryirbmq34y8QBwgqCVLi+8oA3oWx2eAnSn62ITyEhEYaWRlVZ2DvMM9eZbMs/RfxPu/PK/aBLyGj4IrqMHw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/parse-semver": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/parse-semver/-/parse-semver-1.1.1.tgz", "integrity": "sha512-Eg1OuNntBMH0ojvEKSrvDSnwLmvVuUOSdylH/pSCPNMIspLlweJyIWXCE+k/5hm3cj/EBUYwmWkjhBALNP4LXQ==", "dev": true, + "license": "MIT", "dependencies": { "semver": "^5.1.0" } @@ -4156,35 +5624,64 @@ "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", "dev": true, + "license": "ISC", "bin": { "semver": "bin/semver" } }, "node_modules/parse5": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", - "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.3.0.tgz", + "integrity": "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==", "dev": true, + "license": "MIT", "dependencies": { - "entities": "^4.4.0" + "entities": "^6.0.0" }, "funding": { "url": "https://github.com/inikulin/parse5?sponsor=1" } }, "node_modules/parse5-htmlparser2-tree-adapter": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.0.0.tgz", - "integrity": "sha512-B77tOZrqqfUfnVcOrUvfdLbz4pu4RopLD/4vmu3HUPswwTA8OH0EMW9BlWR2B0RCoiZRAHEUu7IxeP1Pd1UU+g==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.1.0.tgz", + "integrity": "sha512-ruw5xyKs6lrpo9x9rCZqZZnIUntICjQAd0Wsmp396Ul9lN/h+ifgVV1x1gZHi8euej6wTfpqX8j+BFQxF0NS/g==", "dev": true, + "license": "MIT", + "dependencies": { + "domhandler": "^5.0.3", + "parse5": "^7.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parse5-parser-stream": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/parse5-parser-stream/-/parse5-parser-stream-7.1.2.tgz", + "integrity": "sha512-JyeQc9iwFLn5TbvvqACIF/VXG6abODeB3Fwmv/TGdLk2LfbWkaySGY72at4+Ty7EkPZj854u4CrICqNk2qIbow==", + "dev": true, + "license": "MIT", "dependencies": { - "domhandler": "^5.0.2", "parse5": "^7.0.0" }, "funding": { "url": "https://github.com/inikulin/parse5?sponsor=1" } }, + "node_modules/parse5/node_modules/entities": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", + "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, "node_modules/path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", @@ -4252,7 +5749,8 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/picocolors": { "version": "1.1.1", @@ -4335,11 +5833,36 @@ "node": ">=8" } }, + "node_modules/pluralize": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz", + "integrity": "sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/powershell-utils": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/powershell-utils/-/powershell-utils-0.2.0.tgz", + "integrity": "sha512-ZlsFlG7MtSFCoc5xreOvBAozCJ6Pf06opgJjh9ONEv418xpZSAzNjstD36C6+JwOnfSqOW/9uDkqKjezTdxZhw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/prebuild-install": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.1.tgz", - "integrity": "sha512-jAXscXWMcCK8GgCoHOfIr0ODh5ai8mj63L2nWrjuAgXE6tDyYGnx4/8o/rCgU+B4JSyZBKbeZqzhtwtC3ovxjw==", + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.3.tgz", + "integrity": "sha512-8Mf2cbV7x1cXPUILADGI3wuhfqWvtiLA1iclTDbFRZkgRQS0NqsPZphna9V+HyTEadheuPmjaJMsbzKQFOzLug==", + "deprecated": "No longer maintained. Please contact the author of the relevant native addon; alternatives are available.", "dev": true, + "license": "MIT", "optional": true, "dependencies": { "detect-libc": "^2.0.0", @@ -4347,7 +5870,7 @@ "github-from-package": "0.0.0", "minimist": "^1.2.3", "mkdirp-classic": "^0.5.3", - "napi-build-utils": "^1.0.1", + "napi-build-utils": "^2.0.0", "node-abi": "^3.3.0", "pump": "^3.0.0", "rc": "^1.2.7", @@ -4362,6 +5885,22 @@ "node": ">=10" } }, + "node_modules/pretty-ms": { + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/pretty-ms/-/pretty-ms-9.3.0.tgz", + "integrity": "sha512-gjVS5hOP+M3wMm5nmNOucbIrqudzs9v/57bWRHQWLYklXqoXKrVfYW2W9+glfGsqtPgpiz5WwyEEB+ksXIx3gQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "parse-ms": "^4.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/process-nextick-args": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", @@ -4374,21 +5913,23 @@ "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" }, "node_modules/pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.4.tgz", + "integrity": "sha512-VS7sjc6KR7e1ukRFhQSY5LM2uBWAUPiOPa/A3mkKmiMwSmRFUITt0xuj+/lesgnCv+dPIEYlkzrcyXgquIHMcA==", "dev": true, + "license": "MIT", "optional": true, "dependencies": { "end-of-stream": "^1.1.0", "once": "^1.3.1" } }, - "node_modules/punycode": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", - "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", + "node_modules/punycode.js": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode.js/-/punycode.js-2.3.1.tgz", + "integrity": "sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } @@ -4398,6 +5939,7 @@ "resolved": "https://registry.npmjs.org/qs/-/qs-6.15.0.tgz", "integrity": "sha512-mAZTtNCeetKMH+pSjrb76NAM8V9a05I9aBZOHztWy/UqcJdQYNsf59vrRKWnojAT9Y+GbIvoTBC++CPHqpDBhQ==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "side-channel": "^1.1.0" }, @@ -4432,6 +5974,7 @@ "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" }, @@ -4453,6 +5996,7 @@ "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", "dev": true, + "license": "(BSD-2-Clause OR MIT OR Apache-2.0)", "optional": true, "dependencies": { "deep-extend": "^0.6.0", @@ -4464,11 +6008,25 @@ "rc": "cli.js" } }, + "node_modules/rc-config-loader": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/rc-config-loader/-/rc-config-loader-4.1.4.tgz", + "integrity": "sha512-3GiwEzklkbXTDp52UR5nT8iXgYAx1V9ZG/kDZT7p60u2GCv2XTwQq4NzinMoMpNtXhmt3WkhYXcj6HH8HdwCEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.4.3", + "js-yaml": "^4.1.1", + "json5": "^2.2.3", + "require-from-string": "^2.0.2" + } + }, "node_modules/rc/node_modules/strip-json-comments": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", "dev": true, + "license": "MIT", "optional": true, "engines": { "node": ">=0.10.0" @@ -4479,6 +6037,7 @@ "resolved": "https://registry.npmjs.org/read/-/read-1.0.7.tgz", "integrity": "sha512-rSOKNYUmaxy0om1BNjMN4ezNT6VKK+2xF4GBhc81mkH7L60i6dp8qPYrkndNLT3QPphoII3maL9PVC9XmhHwVQ==", "dev": true, + "license": "ISC", "dependencies": { "mute-stream": "~0.0.4" }, @@ -4486,6 +6045,39 @@ "node": ">=0.8" } }, + "node_modules/read-pkg": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-9.0.1.tgz", + "integrity": "sha512-9viLL4/n1BJUCT1NXVTdS1jtm80yDEgR5T4yCelII49Mbj0v1rZdKqj7zCiYdbB0CuCgdrvHcNogAKTFPBocFA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/normalize-package-data": "^2.4.3", + "normalize-package-data": "^6.0.0", + "parse-json": "^8.0.0", + "type-fest": "^4.6.0", + "unicorn-magic": "^0.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/read-pkg/node_modules/unicorn-magic": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.1.0.tgz", + "integrity": "sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/readable-stream": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", @@ -4565,7 +6157,8 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/resolve-cwd": { "version": "3.0.0", @@ -4589,28 +6182,71 @@ } }, "node_modules/responselike": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-3.0.0.tgz", - "integrity": "sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-4.0.2.tgz", + "integrity": "sha512-cGk8IbWEAnaCpdAt1BHzJ3Ahz5ewDJa0KseTsE3qIRMJ3C698W8psM7byCeWVpd/Ha7FUYzuRVzXoKoM6nRUbA==", "dev": true, + "license": "MIT", "dependencies": { "lowercase-keys": "^3.0.0" }, "engines": { - "node": ">=14.16" + "node": ">=20" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/restore-cursor": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-4.0.0.tgz", - "integrity": "sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-5.1.0.tgz", + "integrity": "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==", + "dev": true, + "license": "MIT", + "dependencies": { + "onetime": "^7.0.0", + "signal-exit": "^4.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/run-applescript": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-7.1.0.tgz", + "integrity": "sha512-DPe5pVFaAsinSaV6QjQ6gdiedWDcRCbUuiQfQa2wmWV7+xC9bGulGI8+TdRmoFkAPaBXk8CrAbnlY2ISniJ47Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/run-jxa": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/run-jxa/-/run-jxa-3.0.0.tgz", + "integrity": "sha512-4f2CrY7H+sXkKXJn/cE6qRA3z+NMVO7zvlZ/nUV0e62yWftpiLAfw5eV9ZdomzWd2TXWwEIiGjAT57+lWIzzvA==", "dev": true, + "license": "MIT", "dependencies": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" + "execa": "^5.1.1", + "macos-version": "^6.0.0", + "subsume": "^4.0.0", + "type-fest": "^2.0.0" }, "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" @@ -4619,20 +6255,85 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/restore-cursor/node_modules/mimic-fn": { + "node_modules/run-jxa/node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, + "license": "MIT", + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/run-jxa/node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/run-jxa/node_modules/human-signals": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", "dev": true, + "license": "Apache-2.0", "engines": { - "node": ">=6" + "node": ">=10.17.0" + } + }, + "node_modules/run-jxa/node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/run-jxa/node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" } }, - "node_modules/restore-cursor/node_modules/onetime": { + "node_modules/run-jxa/node_modules/onetime": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", "dev": true, + "license": "MIT", "dependencies": { "mimic-fn": "^2.1.0" }, @@ -4643,34 +6344,34 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/restore-cursor/node_modules/signal-exit": { + "node_modules/run-jxa/node_modules/signal-exit": { "version": "3.0.7", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true - }, - "node_modules/reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, + "license": "ISC" + }, + "node_modules/run-jxa/node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true, + "license": "MIT", "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" + "node": ">=6" } }, - "node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "node_modules/run-jxa/node_modules/type-fest": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", + "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", "dev": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=12.20" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/run-parallel": { @@ -4701,6 +6402,13 @@ "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", "dev": true }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true, + "license": "MIT" + }, "node_modules/sanitize-filename": { "version": "1.6.3", "resolved": "https://registry.npmjs.org/sanitize-filename/-/sanitize-filename-1.6.3.tgz", @@ -4711,10 +6419,14 @@ } }, "node_modules/sax": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.3.0.tgz", - "integrity": "sha512-0s+oAmw9zLl1V1cS9BtZN7JAd0cW5e0QH4W3LWEK6a4LaLEA2OTpGYWDY+6XasBLtz6wkm3u1xRw95mRuJ59WA==", - "dev": true + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.6.0.tgz", + "integrity": "sha512-6R3J5M4AcbtLUdZmRv2SygeVaM7IhrLXu9BmnOGmmACak8fiUtOsYNWUS4uK7upbmHIBbLBeFeI//477BKLBzA==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=11.0.0" + } }, "node_modules/schema-utils": { "version": "4.3.3", @@ -4735,18 +6447,122 @@ "url": "https://opencollective.com/webpack" } }, + "node_modules/secretlint": { + "version": "10.2.2", + "resolved": "https://registry.npmjs.org/secretlint/-/secretlint-10.2.2.tgz", + "integrity": "sha512-xVpkeHV/aoWe4vP4TansF622nBEImzCY73y/0042DuJ29iKIaqgoJ8fGxre3rVSHHbxar4FdJobmTnLp9AU0eg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@secretlint/config-creator": "^10.2.2", + "@secretlint/formatter": "^10.2.2", + "@secretlint/node": "^10.2.2", + "@secretlint/profiler": "^10.2.2", + "debug": "^4.4.1", + "globby": "^14.1.0", + "read-pkg": "^9.0.1" + }, + "bin": { + "secretlint": "bin/secretlint.js" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/secretlint/node_modules/@sindresorhus/merge-streams": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/merge-streams/-/merge-streams-2.3.0.tgz", + "integrity": "sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/secretlint/node_modules/globby": { + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-14.1.0.tgz", + "integrity": "sha512-0Ia46fDOaT7k4og1PDW4YbodWWr3scS2vAr2lTbsplOt2WkKp0vQbkI9wKis/T5LV/dqPjO3bpS/z6GTJB82LA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@sindresorhus/merge-streams": "^2.1.0", + "fast-glob": "^3.3.3", + "ignore": "^7.0.3", + "path-type": "^6.0.0", + "slash": "^5.1.0", + "unicorn-magic": "^0.3.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/secretlint/node_modules/ignore": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", + "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/secretlint/node_modules/path-type": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-6.0.0.tgz", + "integrity": "sha512-Vj7sf++t5pBD637NSfkxpHSMfWaeig5+DKWLhcqIYx6mWQz5hdJTGDVMQiJcw1ZYkhs7AazKDGpRVji1LJCZUQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/secretlint/node_modules/slash": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-5.1.0.tgz", + "integrity": "sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/selenium-webdriver": { - "version": "4.16.0", - "resolved": "https://registry.npmjs.org/selenium-webdriver/-/selenium-webdriver-4.16.0.tgz", - "integrity": "sha512-IbqpRpfGE7JDGgXHJeWuCqT/tUqnLvZ14csSwt+S8o4nJo3RtQoE9VR4jB47tP/A8ArkYsh/THuMY6kyRP6kuA==", + "version": "4.41.0", + "resolved": "https://registry.npmjs.org/selenium-webdriver/-/selenium-webdriver-4.41.0.tgz", + "integrity": "sha512-1XxuKVhr9az24xwixPBEDGSZP+P0z3ZOnCmr9Oiep0MlJN2Mk+flIjD3iBS9BgyjS4g14dikMqnrYUPIjhQBhA==", "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/SeleniumHQ" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/selenium" + } + ], + "license": "Apache-2.0", "dependencies": { + "@bazel/runfiles": "^6.5.0", "jszip": "^3.10.1", - "tmp": "^0.2.1", - "ws": ">=8.14.2" + "tmp": "^0.2.5", + "ws": "^8.19.0" }, "engines": { - "node": ">= 14.20.0" + "node": ">= 20.0.0" } }, "node_modules/semver": { @@ -4813,6 +6629,7 @@ "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", "dev": true, + "license": "MIT", "dependencies": { "es-errors": "^1.3.0", "object-inspect": "^1.13.3", @@ -4832,6 +6649,7 @@ "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", "dev": true, + "license": "MIT", "dependencies": { "es-errors": "^1.3.0", "object-inspect": "^1.13.3" @@ -4848,6 +6666,7 @@ "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", "dev": true, + "license": "MIT", "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", @@ -4866,6 +6685,7 @@ "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", "dev": true, + "license": "MIT", "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", @@ -4911,6 +6731,7 @@ "url": "https://feross.org/support" } ], + "license": "MIT", "optional": true }, "node_modules/simple-get": { @@ -4932,6 +6753,7 @@ "url": "https://feross.org/support" } ], + "license": "MIT", "optional": true, "dependencies": { "decompress-response": "^6.0.0", @@ -4939,6 +6761,37 @@ "simple-concat": "^1.0.0" } }, + "node_modules/simple-get/node_modules/decompress-response": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "mimic-response": "^3.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/simple-get/node_modules/mimic-response": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/slash": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", @@ -4950,6 +6803,24 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/slice-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, "node_modules/source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -4969,74 +6840,59 @@ "source-map": "^0.6.0" } }, - "node_modules/sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", - "dev": true - }, - "node_modules/stdin-discarder": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/stdin-discarder/-/stdin-discarder-0.1.0.tgz", - "integrity": "sha512-xhV7w8S+bUwlPTb4bAOUQhv8/cSS5offJuX8GQGq32ONF0ZtDWKfkdomM3HMRA+LhX6um/FZ0COqlwsjD53LeQ==", + "node_modules/spdx-correct": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", + "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", "dev": true, + "license": "Apache-2.0", "dependencies": { - "bl": "^5.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" } }, - "node_modules/stdin-discarder/node_modules/bl": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-5.1.0.tgz", - "integrity": "sha512-tv1ZJHLfTDnXE6tMHv73YgSJaWR2AFuPwMntBe7XL/GBFHnT0CLnsHMogfk5+GzCDC5ZWarSCYaIGATZt9dNsQ==", + "node_modules/spdx-exceptions": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", + "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==", "dev": true, - "dependencies": { - "buffer": "^6.0.3", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" - } + "license": "CC-BY-3.0" }, - "node_modules/stdin-discarder/node_modules/buffer": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "node_modules/spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], + "license": "MIT", "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" } }, - "node_modules/stdin-discarder/node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "node_modules/spdx-license-ids": { + "version": "3.0.23", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.23.tgz", + "integrity": "sha512-CWLcCCH7VLu13TgOH+r8p1O/Znwhqv/dbb6lqWy67G+pT1kHmeD/+V36AVb/vq8QMIQwVShJ6Ssl5FPh0fuSdw==", "dev": true, - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, + "license": "CC0-1.0" + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true + }, + "node_modules/stdin-discarder": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/stdin-discarder/-/stdin-discarder-0.2.2.tgz", + "integrity": "sha512-UhDfHmA92YAlNnCfhmq0VeNL5bDbiZGg7sZ2IvPsXubGkiNa9EC+tUTsjBRsYUAz87btI6/1wf4XoVvQ3uRnmQ==", + "dev": true, + "license": "MIT", "engines": { - "node": ">= 6" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/string_decoder": { @@ -5103,12 +6959,13 @@ } }, "node_modules/strip-final-newline": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", - "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-4.0.0.tgz", + "integrity": "sha512-aulFJcD6YK8V1G7iRB5tigAP4TsHBZZrOV8pjV++zdUwmeV8uzbY7yn6h9MswN62adStNZFuCIx4haBnRuMDaw==", "dev": true, + "license": "MIT", "engines": { - "node": ">=12" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -5120,25 +6977,95 @@ "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", "dev": true, "engines": { - "node": ">=8" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/structured-source": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/structured-source/-/structured-source-4.0.0.tgz", + "integrity": "sha512-qGzRFNJDjFieQkl/sVOI2dUjHKRyL9dAJi2gCPGJLbJHBIkyOHxjuocpIEfbLioX+qSJpvbYdT49/YCdMznKxA==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "boundary": "^2.0.0" + } + }, + "node_modules/subsume": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/subsume/-/subsume-4.0.0.tgz", + "integrity": "sha512-BWnYJElmHbYZ/zKevy+TG+SsyoFCmRPDHJbR1MzLxkPOv1Jp/4hGhVUtP98s+wZBsBsHwCXvPTP0x287/WMjGg==", + "dev": true, + "license": "MIT", + "dependencies": { + "escape-string-regexp": "^5.0.0", + "unique-string": "^3.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/subsume/node_modules/escape-string-regexp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/supports-hyperlinks": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-3.2.0.tgz", + "integrity": "sha512-zFObLMyZeEwzAoKCyu1B91U79K2t7ApXuQfo8OuxwXLDgcKxuwM+YvcbIhm6QWqz7mHUH1TVytR1PwVVjEuMig==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0", + "supports-color": "^7.0.0" + }, + "engines": { + "node": ">=14.18" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/chalk/supports-hyperlinks?sponsor=1" } }, - "node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "node_modules/supports-hyperlinks/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": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" + "node": ">=8" } }, "node_modules/supports-preserve-symlinks-flag": { @@ -5158,6 +7085,7 @@ "resolved": "https://registry.npmjs.org/system-architecture/-/system-architecture-0.1.0.tgz", "integrity": "sha512-ulAk51I9UVUyJgxlv9M6lFot2WP3e7t8Kz9+IS6D4rVba1tR9kON+Ey69f+1R4Q8cd45Lod6a4IcJIxnzGc/zA==", "dev": true, + "license": "MIT", "engines": { "node": ">=18" }, @@ -5165,6 +7093,23 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/table": { + "version": "6.9.0", + "resolved": "https://registry.npmjs.org/table/-/table-6.9.0.tgz", + "integrity": "sha512-9kY+CygyYM6j02t5YFHbNz2FN5QmYGv9zAjVp4lCDjlCw7amdckXlEt/bjMhUIfj4ThGRE4gCUH5+yGnNuPo5A==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "ajv": "^8.0.1", + "lodash.truncate": "^4.4.2", + "slice-ansi": "^4.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=10.0.0" + } + }, "node_modules/tapable": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.0.tgz", @@ -5179,9 +7124,9 @@ } }, "node_modules/tar-fs": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.3.tgz", - "integrity": "sha512-090nwYJDmlhwFwEW3QQl+vaNnxsO2yVsd45eTKRBzSzu+hlb1w2K9inVq5b0ngXuLVqQ4ApvsUHHnu/zQNkWAg==", + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.4.tgz", + "integrity": "sha512-mDAjwmZdh7LTT6pNleZ05Yt65HC3E+NiQzl672vQG38jIrehtJk/J3mNwIg+vShQPcLF/LV7CMnDW6vjj6sfYQ==", "dev": true, "license": "MIT", "optional": true, @@ -5197,6 +7142,7 @@ "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", "dev": true, + "license": "MIT", "optional": true, "dependencies": { "bl": "^4.0.3", @@ -5214,6 +7160,7 @@ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", "dev": true, + "license": "MIT", "optional": true, "dependencies": { "inherits": "^2.0.3", @@ -5292,6 +7239,23 @@ "axios": "^1.6.1" } }, + "node_modules/terminal-link": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-4.0.0.tgz", + "integrity": "sha512-lk+vH+MccxNqgVqSnkMVKx4VLJfnLjDBGzH16JVZjKE2DoxP57s6/vt6JmXV5I3jBcfGrxNrYtC+mPtU7WJztA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-escapes": "^7.0.0", + "supports-hyperlinks": "^3.2.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/terser": { "version": "5.46.0", "resolved": "https://registry.npmjs.org/terser/-/terser-5.46.0.tgz", @@ -5344,16 +7308,136 @@ } } }, - "node_modules/tmp": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", - "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", + "node_modules/test-exclude": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-8.0.0.tgz", + "integrity": "sha512-ZOffsNrXYggvU1mDGHk54I96r26P8SyMjO5slMKSc7+IWmtB/MQKnEC2fP51imB3/pT6YK5cT5E8f+Dd9KdyOQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^13.0.6", + "minimatch": "^10.2.2" + }, + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/test-exclude/node_modules/balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/test-exclude/node_modules/brace-expansion": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.4.tgz", + "integrity": "sha512-h+DEnpVvxmfVefa4jFbCf5HdH5YMDXRsmKflpf1pILZWRFlTbJpxeU55nJl4Smt5HQaGzg1o6RHFPJaOqnmBDg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/test-exclude/node_modules/glob": { + "version": "13.0.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-13.0.6.tgz", + "integrity": "sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw==", "dev": true, + "license": "BlueOak-1.0.0", "dependencies": { - "rimraf": "^3.0.0" + "minimatch": "^10.2.2", + "minipass": "^7.1.3", + "path-scurry": "^2.0.2" }, "engines": { - "node": ">=8.17.0" + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/test-exclude/node_modules/lru-cache": { + "version": "11.2.7", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.7.tgz", + "integrity": "sha512-aY/R+aEsRelme17KGQa/1ZSIpLpNYYrhcrepKTZgE+W3WM16YMCaPwOHLHsmopZHELU0Ojin1lPVxKR0MihncA==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/test-exclude/node_modules/minimatch": { + "version": "10.2.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.4.tgz", + "integrity": "sha512-oRjTw/97aTBN0RHbYCdtF1MQfvusSIBQM0IZEgzl6426+8jSC0nF1a/GmnVLpfB9yyr6g6FTqWqiZVbxrtaCIg==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "brace-expansion": "^5.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/test-exclude/node_modules/path-scurry": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.2.tgz", + "integrity": "sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^11.0.0", + "minipass": "^7.1.2" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true, + "license": "MIT" + }, + "node_modules/textextensions": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/textextensions/-/textextensions-6.11.0.tgz", + "integrity": "sha512-tXJwSr9355kFJI3lbCkPpUH5cP8/M0GGy2xLO34aZCjMXBaK3SoPnZwr/oWmo1FdCnELcs4npdCIOFtq9W3ruQ==", + "dev": true, + "license": "Artistic-2.0", + "dependencies": { + "editions": "^6.21.0" + }, + "engines": { + "node": ">=4" + }, + "funding": { + "url": "https://bevry.me/fund" + } + }, + "node_modules/tmp": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.5.tgz", + "integrity": "sha512-voyz6MApa1rQGUxT3E+BK7/ROe8itEx7vD8/HEvt4xwXucvQ5G5oeEiHkmHZJuBO21RpOf+YYm9MOivj709jow==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.14" } }, "node_modules/to-buffer": { @@ -5373,15 +7457,6 @@ "node": ">=8.0" } }, - "node_modules/traverse": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.3.9.tgz", - "integrity": "sha512-iawgk0hLP3SxGKDfnDJf8wTz4p2qImnyihM5Hh/sGvQ3K37dPi/w8sRhdNIxYA1TwFwc5mDhIJq+O0RsvXBKdQ==", - "dev": true, - "engines": { - "node": "*" - } - }, "node_modules/truncate-utf8-bytes": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/truncate-utf8-bytes/-/truncate-utf8-bytes-1.0.2.tgz", @@ -5391,20 +7466,6 @@ "utf8-byte-length": "^1.0.1" } }, - "node_modules/ts-essentials": { - "version": "9.4.1", - "resolved": "https://registry.npmjs.org/ts-essentials/-/ts-essentials-9.4.1.tgz", - "integrity": "sha512-oke0rI2EN9pzHsesdmrOrnqv1eQODmJpd/noJjwj2ZPC3Z4N2wbjrOEqnsEgmvlO2+4fBb0a794DCna2elEVIQ==", - "dev": true, - "peerDependencies": { - "typescript": ">=4.1.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, "node_modules/ts-loader": { "version": "9.5.1", "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.5.1.tgz", @@ -5621,6 +7682,7 @@ "resolved": "https://registry.npmjs.org/tunnel/-/tunnel-0.0.6.tgz", "integrity": "sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.6.11 <=0.7.0 || >=0.7.3" } @@ -5630,6 +7692,7 @@ "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", "dev": true, + "license": "Apache-2.0", "optional": true, "dependencies": { "safe-buffer": "^5.0.1" @@ -5638,11 +7701,25 @@ "node": "*" } }, + "node_modules/type-fest": { + "version": "4.41.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.41.0.tgz", + "integrity": "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/typed-rest-client": { "version": "1.8.11", "resolved": "https://registry.npmjs.org/typed-rest-client/-/typed-rest-client-1.8.11.tgz", "integrity": "sha512-5UvfMpd1oelmUPRbbaVnq+rHP7ng2cE4qoQkQeAqxRL6PklkxsM0g32/HL0yfvruK6ojQ5x8EE+HF4YV6DtuCA==", "dev": true, + "license": "MIT", "dependencies": { "qs": "^6.9.1", "tunnel": "0.0.6", @@ -5663,16 +7740,28 @@ } }, "node_modules/uc.micro": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz", - "integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==", - "dev": true + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-2.1.0.tgz", + "integrity": "sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==", + "dev": true, + "license": "MIT" }, "node_modules/underscore": { - "version": "1.13.6", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.6.tgz", - "integrity": "sha512-+A5Sja4HP1M08MaXya7p5LvjuM7K6q/2EaC0+iovj/wOcMsTzMvDFbasi/oSapiwOlt252IqsKqPjCl7huKS0A==", - "dev": true + "version": "1.13.8", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.8.tgz", + "integrity": "sha512-DXtD3ZtEQzc7M8m4cXotyHR+FAS18C64asBYY5vqZexfYryNNnDc02W4hKg3rdQuqOYas1jkseX0+nZXjTXnvQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/undici": { + "version": "7.24.4", + "resolved": "https://registry.npmjs.org/undici/-/undici-7.24.4.tgz", + "integrity": "sha512-BM/JzwwaRXxrLdElV2Uo6cTLEjhSb3WXboncJamZ15NgUURmvlXvxa6xkwIOILIjPNo9i8ku136ZvWV0Uly8+w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20.18.1" + } }, "node_modules/undici-types": { "version": "6.19.8", @@ -5680,6 +7769,35 @@ "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==", "dev": true }, + "node_modules/unicorn-magic": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.3.0.tgz", + "integrity": "sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/unique-string": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-3.0.0.tgz", + "integrity": "sha512-VGXBUVwxKMBUznyffQweQABPRRW1vHZAbadFZud4pLFAqRGvv/96vafgjWFqzourzr8YonlQiPgH0YCJfawoGQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "crypto-random-string": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/universal-user-agent": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-7.0.3.tgz", @@ -5694,21 +7812,32 @@ } }, "node_modules/unzipper": { - "version": "0.10.14", - "resolved": "https://registry.npmjs.org/unzipper/-/unzipper-0.10.14.tgz", - "integrity": "sha512-ti4wZj+0bQTiX2KmKWuwj7lhV+2n//uXEotUmGuQqrbVZSEGFMbI68+c6JCQ8aAmUWYvtHEz2A8K6wXvueR/6g==", + "version": "0.12.3", + "resolved": "https://registry.npmjs.org/unzipper/-/unzipper-0.12.3.tgz", + "integrity": "sha512-PZ8hTS+AqcGxsaQntl3IRBw65QrBI6lxzqDEL7IAo/XCEqRTKGfOX56Vea5TH9SZczRVxuzk1re04z/YjuYCJA==", "dev": true, + "license": "MIT", "dependencies": { - "big-integer": "^1.6.17", - "binary": "~0.3.0", - "bluebird": "~3.4.1", - "buffer-indexof-polyfill": "~1.0.0", + "bluebird": "~3.7.2", "duplexer2": "~0.1.4", - "fstream": "^1.0.12", + "fs-extra": "^11.2.0", "graceful-fs": "^4.2.2", - "listenercount": "~1.0.1", - "readable-stream": "~2.3.6", - "setimmediate": "~1.0.4" + "node-int64": "^0.4.0" + } + }, + "node_modules/unzipper/node_modules/fs-extra": { + "version": "11.3.4", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.4.tgz", + "integrity": "sha512-CTXd6rk/M3/ULNQj8FBqBWHYBVYybQ3VPBw0xGKFe3tuH7ytT6ACnvzpIQ3UZtB8yvUKC2cXn1a+x+5EVQLovA==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" } }, "node_modules/update-browserslist-db": { @@ -5741,20 +7870,12 @@ "browserslist": ">= 4.21.0" } }, - "node_modules/uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, - "dependencies": { - "punycode": "^2.1.0" - } - }, "node_modules/url-join": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/url-join/-/url-join-4.0.1.tgz", "integrity": "sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/utf8-byte-length": { "version": "1.0.4", @@ -5776,116 +7897,275 @@ "uuid": "dist/bin/uuid" } }, - "node_modules/vscode-extension-telemetry-wrapper": { - "version": "0.15.0", - "resolved": "https://registry.npmjs.org/vscode-extension-telemetry-wrapper/-/vscode-extension-telemetry-wrapper-0.15.0.tgz", - "integrity": "sha512-Uioj6zqmaHBOyRsryazdvgc8mZdRRUJSCL+Z68jG9QoZ5cwHlcaodou0BwqfTjfpwA+hUSseXRrSHrzGkXpGcQ==", + "node_modules/v8-to-istanbul": { + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.3.0.tgz", + "integrity": "sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==", + "dev": true, + "license": "ISC", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.12", + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^2.0.0" + }, + "engines": { + "node": ">=10.12.0" + } + }, + "node_modules/validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "node_modules/version-range": { + "version": "4.15.0", + "resolved": "https://registry.npmjs.org/version-range/-/version-range-4.15.0.tgz", + "integrity": "sha512-Ck0EJbAGxHwprkzFO966t4/5QkRuzh+/I1RxhLgUKKwEn+Cd8NwM60mE3AqBZg5gYODoXW0EFsQvbZjRlvdqbg==", + "dev": true, + "license": "Artistic-2.0", + "engines": { + "node": ">=4" + }, + "funding": { + "url": "https://bevry.me/fund" + } + }, + "node_modules/vscode-extension-telemetry-wrapper": { + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/vscode-extension-telemetry-wrapper/-/vscode-extension-telemetry-wrapper-0.15.0.tgz", + "integrity": "sha512-Uioj6zqmaHBOyRsryazdvgc8mZdRRUJSCL+Z68jG9QoZ5cwHlcaodou0BwqfTjfpwA+hUSseXRrSHrzGkXpGcQ==", + "license": "MIT", + "dependencies": { + "@vscode/extension-telemetry": "^1.2.0", + "uuid": "^8.3.2" + } + }, + "node_modules/vscode-extension-tester": { + "version": "8.23.0", + "resolved": "https://registry.npmjs.org/vscode-extension-tester/-/vscode-extension-tester-8.23.0.tgz", + "integrity": "sha512-YElhRDkOjvmGFv44aCMnEnUM5RmFqWByQ8TBr7/6N9K/b5o1gu2fo9EgTef6VmrB4kyFnSrkPVAbiZBfKQA1mQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@redhat-developer/locators": "^1.20.0", + "@redhat-developer/page-objects": "^1.20.0", + "@types/selenium-webdriver": "^4.35.5", + "@vscode/vsce": "^3.7.1", + "c8": "^11.0.0", + "commander": "^14.0.3", + "compare-versions": "^6.1.1", + "find-up": "8.0.0", + "fs-extra": "^11.3.4", + "glob": "^13.0.6", + "got": "^14.6.6", + "hpagent": "^1.2.0", + "js-yaml": "^4.1.1", + "sanitize-filename": "^1.6.3", + "selenium-webdriver": "^4.41.0", + "targz": "^1.0.1", + "unzipper": "^0.12.3" + }, + "bin": { + "extest": "out/cli.js" + }, + "peerDependencies": { + "mocha": ">=5.2.0", + "typescript": ">=4.6.2" + } + }, + "node_modules/vscode-extension-tester/node_modules/balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/vscode-extension-tester/node_modules/brace-expansion": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.4.tgz", + "integrity": "sha512-h+DEnpVvxmfVefa4jFbCf5HdH5YMDXRsmKflpf1pILZWRFlTbJpxeU55nJl4Smt5HQaGzg1o6RHFPJaOqnmBDg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/vscode-extension-tester/node_modules/commander": { + "version": "14.0.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-14.0.3.tgz", + "integrity": "sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20" + } + }, + "node_modules/vscode-extension-tester/node_modules/find-up": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-8.0.0.tgz", + "integrity": "sha512-JGG8pvDi2C+JxidYdIwQDyS/CgcrIdh18cvgxcBge3wSHRQOrooMD3GlFBcmMJAN9M42SAZjDp5zv1dglJjwww==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^8.0.0", + "unicorn-magic": "^0.3.0" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/vscode-extension-tester/node_modules/fs-extra": { + "version": "11.3.4", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.4.tgz", + "integrity": "sha512-CTXd6rk/M3/ULNQj8FBqBWHYBVYybQ3VPBw0xGKFe3tuH7ytT6ACnvzpIQ3UZtB8yvUKC2cXn1a+x+5EVQLovA==", + "dev": true, "license": "MIT", "dependencies": { - "@vscode/extension-telemetry": "^1.2.0", - "uuid": "^8.3.2" + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" } }, - "node_modules/vscode-extension-tester": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/vscode-extension-tester/-/vscode-extension-tester-7.0.0.tgz", - "integrity": "sha512-ICl/ITfPZnvx9ofY2gcOg5ZndQo3MSGu6iNa2TdkPLysAYnm5H/hY3IrmwqQqjXI+id+kcxoZMB/SZlsBlxiVw==", + "node_modules/vscode-extension-tester/node_modules/glob": { + "version": "13.0.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-13.0.6.tgz", + "integrity": "sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw==", "dev": true, + "license": "BlueOak-1.0.0", "dependencies": { - "@types/selenium-webdriver": "^4.1.21", - "@vscode/vsce": "^2.22.0", - "commander": "^11.1.0", - "compare-versions": "^6.1.0", - "fs-extra": "^11.2.0", - "glob": "^10.3.10", - "got": "^13.0.0", - "hpagent": "^1.2.0", - "js-yaml": "^4.1.0", - "monaco-page-objects": "^3.12.0", - "sanitize-filename": "^1.6.3", - "selenium-webdriver": "^4.16.0", - "targz": "^1.0.1", - "unzipper": "^0.10.14", - "vscode-extension-tester-locators": "^3.10.0" + "minimatch": "^10.2.2", + "minipass": "^7.1.3", + "path-scurry": "^2.0.2" }, - "bin": { - "extest": "out/cli.js" + "engines": { + "node": "18 || 20 || >=22" }, - "peerDependencies": { - "mocha": ">=5.2.0", - "typescript": ">=4.6.2" + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/vscode-extension-tester-locators": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/vscode-extension-tester-locators/-/vscode-extension-tester-locators-3.10.0.tgz", - "integrity": "sha512-smhCxci1FtaK1ZHVnRtrnv+5YIDAFPkXBWRkyKzrf7CBA4Zpg5hleLKipEVEygBj/MrFCW4oYexqti9hOJX3bw==", + "node_modules/vscode-extension-tester/node_modules/locate-path": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-8.0.0.tgz", + "integrity": "sha512-XT9ewWAC43tiAV7xDAPflMkG0qOPn2QjHqlgX8FOqmWa/rxnyYDulF9T0F7tRy1u+TVTmK/M//6VIOye+2zDXg==", "dev": true, - "peerDependencies": { - "monaco-page-objects": "^3.12.0", - "selenium-webdriver": "^4.6.1" + "license": "MIT", + "dependencies": { + "p-locate": "^6.0.0" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/vscode-extension-tester/node_modules/commander": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-11.1.0.tgz", - "integrity": "sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==", + "node_modules/vscode-extension-tester/node_modules/lru-cache": { + "version": "11.2.7", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.7.tgz", + "integrity": "sha512-aY/R+aEsRelme17KGQa/1ZSIpLpNYYrhcrepKTZgE+W3WM16YMCaPwOHLHsmopZHELU0Ojin1lPVxKR0MihncA==", "dev": true, + "license": "BlueOak-1.0.0", "engines": { - "node": ">=16" + "node": "20 || >=22" } }, - "node_modules/vscode-extension-tester/node_modules/fs-extra": { - "version": "11.2.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", - "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", + "node_modules/vscode-extension-tester/node_modules/minimatch": { + "version": "10.2.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.4.tgz", + "integrity": "sha512-oRjTw/97aTBN0RHbYCdtF1MQfvusSIBQM0IZEgzl6426+8jSC0nF1a/GmnVLpfB9yyr6g6FTqWqiZVbxrtaCIg==", "dev": true, + "license": "BlueOak-1.0.0", "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" + "brace-expansion": "^5.0.2" }, "engines": { - "node": ">=14.14" + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/vscode-extension-tester/node_modules/glob": { - "version": "10.3.10", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", - "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", + "node_modules/vscode-extension-tester/node_modules/p-limit": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", + "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", "dev": true, + "license": "MIT", "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^2.3.5", - "minimatch": "^9.0.1", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", - "path-scurry": "^1.10.1" + "yocto-queue": "^1.0.0" }, - "bin": { - "glob": "dist/esm/bin.mjs" + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/vscode-extension-tester/node_modules/p-locate": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz", + "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^4.0.0" }, "engines": { - "node": ">=16 || 14 >=14.17" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/vscode-extension-tester/node_modules/minimatch": { - "version": "9.0.9", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", - "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", + "node_modules/vscode-extension-tester/node_modules/path-scurry": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.2.tgz", + "integrity": "sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg==", "dev": true, + "license": "BlueOak-1.0.0", "dependencies": { - "brace-expansion": "^2.0.2" + "lru-cache": "^11.0.0", + "minipass": "^7.1.2" }, "engines": { - "node": ">=16 || 14 >=14.17" + "node": "18 || 20 || >=22" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/vscode-extension-tester/node_modules/yocto-queue": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.2.2.tgz", + "integrity": "sha512-4LCcse/U2MHZ63HAJVE+v71o7yOdIe4cZ70Wpf8D/IyjDKYQLV5GD46B+hSTjJsvV5PztjvHoU580EftxjDZFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/vscode-jsonrpc": { "version": "8.2.0", "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-8.2.0.tgz", @@ -6061,6 +8341,30 @@ "node": ">=10.13.0" } }, + "node_modules/whatwg-encoding": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-3.1.1.tgz", + "integrity": "sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==", + "deprecated": "Use @exodus/bytes instead for a more spec-conformant and faster implementation", + "dev": true, + "license": "MIT", + "dependencies": { + "iconv-lite": "0.6.3" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/whatwg-mimetype": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-4.0.0.tgz", + "integrity": "sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", @@ -6130,10 +8434,11 @@ "dev": true }, "node_modules/ws": { - "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz", - "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==", + "version": "8.19.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.19.0.tgz", + "integrity": "sha512-blAT2mjOEIi0ZzruJfIhb3nps74PRWTCz1IjglWEEpQl5XS/UNama6u2/rjFkDDouqr4L67ry+1aGIALViWjDg==", "dev": true, + "license": "MIT", "engines": { "node": ">=10.0.0" }, @@ -6150,11 +8455,28 @@ } } }, + "node_modules/wsl-utils": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/wsl-utils/-/wsl-utils-0.1.0.tgz", + "integrity": "sha512-h3Fbisa2nKGPxCpm89Hk33lBLsnaGBvctQopaBSOW/uIs6FTe1ATyAnKFJrzVs9vpGdsTe73WF3V4lIsk4Gacw==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-wsl": "^3.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/xml2js": { "version": "0.5.0", "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.5.0.tgz", "integrity": "sha512-drPFnkQJik/O+uPKpqSgr22mpuFHqKdbS835iAQrUC73L2F5WkboIRd63ai/2Yg6I1jzifPFKH2NTK+cfglkIA==", "dev": true, + "license": "MIT", "dependencies": { "sax": ">=0.6.0", "xmlbuilder": "~11.0.0" @@ -6168,6 +8490,7 @@ "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", "dev": true, + "license": "MIT", "engines": { "node": ">=4.0" } @@ -6194,7 +8517,8 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/yargs": { "version": "17.7.2", @@ -6243,6 +8567,7 @@ "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", "dev": true, + "license": "MIT", "dependencies": { "buffer-crc32": "~0.2.3", "fd-slicer": "~1.1.0" @@ -6253,6 +8578,7 @@ "resolved": "https://registry.npmjs.org/yazl/-/yazl-2.5.1.tgz", "integrity": "sha512-phENi2PLiHnHb6QBVot+dJnaAZ0xosj7p3fWl+znIjBDlnMI2PsZCJZ306BPTFOaHf5qdDEI8x5qFrSOBN5vrw==", "dev": true, + "license": "MIT", "dependencies": { "buffer-crc32": "~0.2.3" } @@ -6268,93 +8594,255 @@ "funding": { "url": "https://github.com/sponsors/sindresorhus" } + }, + "node_modules/yoctocolors": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yoctocolors/-/yoctocolors-2.1.2.tgz", + "integrity": "sha512-CzhO+pFNo8ajLM2d2IW/R93ipy99LWjtwblvC1RsoSUMZgyLbYFr221TnSNT7GjGdYui6P459mw9JH/g/zW2ug==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } } }, "dependencies": { - "@babel/code-frame": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.5.tgz", - "integrity": "sha512-Xmwn266vad+6DAqEB2A6V/CcZVp62BbwVmcOJc2RPuwih1kw02TjQvWVWlcKGbBPd+8/0V5DEkOcizRGYsspYQ==", + "@azu/format-text": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@azu/format-text/-/format-text-1.0.2.tgz", + "integrity": "sha512-Swi4N7Edy1Eqq82GxgEECXSSLyn6GOb5htRFPzBDdUkECGXtlf12ynO5oJSpWKPwCaUssOu7NfhDcCWpIC6Ywg==", + "dev": true + }, + "@azu/style-format": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@azu/style-format/-/style-format-1.0.1.tgz", + "integrity": "sha512-AHcTojlNBdD/3/KxIKlg8sxIWHfOtQszLvOpagLTO+bjC3u7SAszu1lf//u7JJC50aUSH+BVWDD/KvaA6Gfn5g==", "dev": true, "requires": { - "@babel/highlight": "^7.22.5" + "@azu/format-text": "^1.0.1" } }, - "@babel/helper-validator-identifier": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz", - "integrity": "sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==", - "dev": true + "@azure/abort-controller": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@azure/abort-controller/-/abort-controller-2.1.2.tgz", + "integrity": "sha512-nBrLsEWm4J2u5LpAPjxADTlq3trDgVZZXHNKabeXZtpq3d3AbN/KGO82R87rdDz5/lYB024rtEf10/q0urNgsA==", + "dev": true, + "requires": { + "tslib": "^2.6.2" + }, + "dependencies": { + "tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "dev": true + } + } }, - "@babel/highlight": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.5.tgz", - "integrity": "sha512-BSKlD1hgnedS5XRnGOljZawtag7H1yPfQp0tdNJCHoH6AZ+Pcm9VvkrK59/Yy593Ypg0zMxH2BxD1VPYUQ7UIw==", + "@azure/core-auth": { + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/@azure/core-auth/-/core-auth-1.10.1.tgz", + "integrity": "sha512-ykRMW8PjVAn+RS6ww5cmK9U2CyH9p4Q88YJwvUslfuMmN98w/2rdGRLPqJYObapBCdzBVeDgYWdJnFPFb7qzpg==", "dev": true, "requires": { - "@babel/helper-validator-identifier": "^7.22.5", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" + "@azure/abort-controller": "^2.1.2", + "@azure/core-util": "^1.13.0", + "tslib": "^2.6.2" }, "dependencies": { - "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, - "requires": { - "color-convert": "^1.9.0" - } - }, - "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, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "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, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", "dev": true - }, - "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==", + } + } + }, + "@azure/core-client": { + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/@azure/core-client/-/core-client-1.10.1.tgz", + "integrity": "sha512-Nh5PhEOeY6PrnxNPsEHRr9eimxLwgLlpmguQaHKBinFYA/RU9+kOYVOQqOrTsCL+KSxrLLl1gD8Dk5BFW/7l/w==", + "dev": true, + "requires": { + "@azure/abort-controller": "^2.1.2", + "@azure/core-auth": "^1.10.0", + "@azure/core-rest-pipeline": "^1.22.0", + "@azure/core-tracing": "^1.3.0", + "@azure/core-util": "^1.13.0", + "@azure/logger": "^1.3.0", + "tslib": "^2.6.2" + }, + "dependencies": { + "tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", "dev": true - }, - "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==", + } + } + }, + "@azure/core-rest-pipeline": { + "version": "1.23.0", + "resolved": "https://registry.npmjs.org/@azure/core-rest-pipeline/-/core-rest-pipeline-1.23.0.tgz", + "integrity": "sha512-Evs1INHo+jUjwHi1T6SG6Ua/LHOQBCLuKEEE6efIpt4ZOoNonaT1kP32GoOcdNDbfqsD2445CPri3MubBy5DEQ==", + "dev": true, + "requires": { + "@azure/abort-controller": "^2.1.2", + "@azure/core-auth": "^1.10.0", + "@azure/core-tracing": "^1.3.0", + "@azure/core-util": "^1.13.0", + "@azure/logger": "^1.3.0", + "@typespec/ts-http-runtime": "^0.3.4", + "tslib": "^2.6.2" + }, + "dependencies": { + "tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "dev": true + } + } + }, + "@azure/core-tracing": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@azure/core-tracing/-/core-tracing-1.3.1.tgz", + "integrity": "sha512-9MWKevR7Hz8kNzzPLfX4EAtGM2b8mr50HPDBvio96bURP/9C+HjdH3sBlLSNNrvRAr5/k/svoH457gB5IKpmwQ==", + "dev": true, + "requires": { + "tslib": "^2.6.2" + }, + "dependencies": { + "tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "dev": true + } + } + }, + "@azure/core-util": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/@azure/core-util/-/core-util-1.13.1.tgz", + "integrity": "sha512-XPArKLzsvl0Hf0CaGyKHUyVgF7oDnhKoP85Xv6M4StF/1AhfORhZudHtOyf2s+FcbuQ9dPRAjB8J2KvRRMUK2A==", + "dev": true, + "requires": { + "@azure/abort-controller": "^2.1.2", + "@typespec/ts-http-runtime": "^0.3.0", + "tslib": "^2.6.2" + }, + "dependencies": { + "tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "dev": true + } + } + }, + "@azure/identity": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/@azure/identity/-/identity-4.13.0.tgz", + "integrity": "sha512-uWC0fssc+hs1TGGVkkghiaFkkS7NkTxfnCH+Hdg+yTehTpMcehpok4PgUKKdyCH+9ldu6FhiHRv84Ntqj1vVcw==", + "dev": true, + "requires": { + "@azure/abort-controller": "^2.0.0", + "@azure/core-auth": "^1.9.0", + "@azure/core-client": "^1.9.2", + "@azure/core-rest-pipeline": "^1.17.0", + "@azure/core-tracing": "^1.0.0", + "@azure/core-util": "^1.11.0", + "@azure/logger": "^1.0.0", + "@azure/msal-browser": "^4.2.0", + "@azure/msal-node": "^3.5.0", + "open": "^10.1.0", + "tslib": "^2.2.0" + }, + "dependencies": { + "tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "dev": true + } + } + }, + "@azure/logger": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@azure/logger/-/logger-1.3.0.tgz", + "integrity": "sha512-fCqPIfOcLE+CGqGPd66c8bZpwAji98tZ4JI9i/mlTNTlsIWslCfpg48s/ypyLxZTump5sypjrKn2/kY7q8oAbA==", + "dev": true, + "requires": { + "@typespec/ts-http-runtime": "^0.3.0", + "tslib": "^2.6.2" + }, + "dependencies": { + "tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", "dev": true - }, - "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, - "requires": { - "has-flag": "^3.0.0" - } } } }, + "@azure/msal-browser": { + "version": "4.29.1", + "resolved": "https://registry.npmjs.org/@azure/msal-browser/-/msal-browser-4.29.1.tgz", + "integrity": "sha512-1Vrt27du1cl4QHkzLc6L4aeXqliPIDIs5l/1I4hWWMXkXccY/EznJT1+pBdoVze0azTAI8sCyq5B4cBVYG1t9w==", + "dev": true, + "requires": { + "@azure/msal-common": "15.16.1" + } + }, + "@azure/msal-common": { + "version": "15.16.1", + "resolved": "https://registry.npmjs.org/@azure/msal-common/-/msal-common-15.16.1.tgz", + "integrity": "sha512-qxUG9TCl+TVSSX58onVDHDWrvT5CE0+NeeUAbkQqaESpSm79u5IePLnPWMMjCUnUR2zJd4+Bt9vioVRzLmJb2g==", + "dev": true + }, + "@azure/msal-node": { + "version": "3.8.9", + "resolved": "https://registry.npmjs.org/@azure/msal-node/-/msal-node-3.8.9.tgz", + "integrity": "sha512-jZ0pw/BbdEUWGhomCaAiVDfXRI/9K56m5hTNqB/CzcbZEYhXm5qpK1cDngN1iXfwSfmUMorOUQ2FC0dyuQ9uRg==", + "dev": true, + "requires": { + "@azure/msal-common": "15.16.1", + "jsonwebtoken": "^9.0.0", + "uuid": "^8.3.0" + } + }, + "@babel/code-frame": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.0.tgz", + "integrity": "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.28.5", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", + "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", + "dev": true + }, + "@bazel/runfiles": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@bazel/runfiles/-/runfiles-6.5.0.tgz", + "integrity": "sha512-RzahvqTkfpY2jsDxo8YItPX+/iZ6hbiikw1YhE0bA9EKBR5Og8Pa6FHn9PO9M0zaXRVsr0GFQLKbB/0rzy9SzA==", + "dev": true + }, + "@bcoe/v8-coverage": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-1.0.2.tgz", + "integrity": "sha512-6zABk/ECA/QYSCQ1NGiVwwbQerUCZ+TQbp64Q3AgmfNvurHH0j8TtXa1qbShXA6qqkpAj4V5W8pP6mLe1mcMqA==", + "dev": true + }, "@discoveryjs/json-ext": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", @@ -6469,6 +8957,12 @@ } } }, + "@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "dev": true + }, "@jridgewell/gen-mapping": { "version": "0.3.13", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", @@ -6511,6 +9005,12 @@ "@jridgewell/sourcemap-codec": "^1.4.14" } }, + "@keyv/serialize": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@keyv/serialize/-/serialize-1.1.1.tgz", + "integrity": "sha512-dXn3FZhPv0US+7dtJsIi2R+c7qWYiReoEh5zUntWCf4oSpMNib8FDhSoed6m3QyZdx5hK7iLFkYk3rNxwt8vTA==", + "dev": true + }, "@microsoft/1ds-core-js": { "version": "4.3.10", "resolved": "https://registry.npmjs.org/@microsoft/1ds-core-js/-/1ds-core-js-4.3.10.tgz", @@ -6777,19 +9277,257 @@ "dev": true, "optional": true }, + "@redhat-developer/locators": { + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/@redhat-developer/locators/-/locators-1.20.0.tgz", + "integrity": "sha512-SvS9lABIHDpTU0w7jTN3qsMxDSceAbbc3j0xba9Cd8xrDEMWpysnvt3WY4vtYalikMhXtkcSAf3L3adYTS7iqg==", + "dev": true, + "requires": {} + }, + "@redhat-developer/page-objects": { + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/@redhat-developer/page-objects/-/page-objects-1.20.0.tgz", + "integrity": "sha512-akY6gXRbUmlf2Cayp1A/TwoT0/eyK+/LReSBo7Nmfotk7QfR262k7ZilAmL3Vf/jmX3Gg0D8UrDZRFk8RTxS2Q==", + "dev": true, + "requires": { + "clipboardy": "^5.3.1", + "clone-deep": "^4.0.1", + "compare-versions": "^6.1.1", + "fs-extra": "^11.3.4", + "type-fest": "^4.41.0" + }, + "dependencies": { + "fs-extra": { + "version": "11.3.4", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.4.tgz", + "integrity": "sha512-CTXd6rk/M3/ULNQj8FBqBWHYBVYybQ3VPBw0xGKFe3tuH7ytT6ACnvzpIQ3UZtB8yvUKC2cXn1a+x+5EVQLovA==", + "dev": true, + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + } + } + } + }, + "@sec-ant/readable-stream": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@sec-ant/readable-stream/-/readable-stream-0.4.1.tgz", + "integrity": "sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg==", + "dev": true + }, + "@secretlint/config-creator": { + "version": "10.2.2", + "resolved": "https://registry.npmjs.org/@secretlint/config-creator/-/config-creator-10.2.2.tgz", + "integrity": "sha512-BynOBe7Hn3LJjb3CqCHZjeNB09s/vgf0baBaHVw67w7gHF0d25c3ZsZ5+vv8TgwSchRdUCRrbbcq5i2B1fJ2QQ==", + "dev": true, + "requires": { + "@secretlint/types": "^10.2.2" + } + }, + "@secretlint/config-loader": { + "version": "10.2.2", + "resolved": "https://registry.npmjs.org/@secretlint/config-loader/-/config-loader-10.2.2.tgz", + "integrity": "sha512-ndjjQNgLg4DIcMJp4iaRD6xb9ijWQZVbd9694Ol2IszBIbGPPkwZHzJYKICbTBmh6AH/pLr0CiCaWdGJU7RbpQ==", + "dev": true, + "requires": { + "@secretlint/profiler": "^10.2.2", + "@secretlint/resolver": "^10.2.2", + "@secretlint/types": "^10.2.2", + "ajv": "^8.17.1", + "debug": "^4.4.1", + "rc-config-loader": "^4.1.3" + } + }, + "@secretlint/core": { + "version": "10.2.2", + "resolved": "https://registry.npmjs.org/@secretlint/core/-/core-10.2.2.tgz", + "integrity": "sha512-6rdwBwLP9+TO3rRjMVW1tX+lQeo5gBbxl1I5F8nh8bgGtKwdlCMhMKsBWzWg1ostxx/tIG7OjZI0/BxsP8bUgw==", + "dev": true, + "requires": { + "@secretlint/profiler": "^10.2.2", + "@secretlint/types": "^10.2.2", + "debug": "^4.4.1", + "structured-source": "^4.0.0" + } + }, + "@secretlint/formatter": { + "version": "10.2.2", + "resolved": "https://registry.npmjs.org/@secretlint/formatter/-/formatter-10.2.2.tgz", + "integrity": "sha512-10f/eKV+8YdGKNQmoDUD1QnYL7TzhI2kzyx95vsJKbEa8akzLAR5ZrWIZ3LbcMmBLzxlSQMMccRmi05yDQ5YDA==", + "dev": true, + "requires": { + "@secretlint/resolver": "^10.2.2", + "@secretlint/types": "^10.2.2", + "@textlint/linter-formatter": "^15.2.0", + "@textlint/module-interop": "^15.2.0", + "@textlint/types": "^15.2.0", + "chalk": "^5.4.1", + "debug": "^4.4.1", + "pluralize": "^8.0.0", + "strip-ansi": "^7.1.0", + "table": "^6.9.0", + "terminal-link": "^4.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "dev": true + }, + "chalk": { + "version": "5.6.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", + "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", + "dev": true + }, + "strip-ansi": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", + "dev": true, + "requires": { + "ansi-regex": "^6.2.2" + } + } + } + }, + "@secretlint/node": { + "version": "10.2.2", + "resolved": "https://registry.npmjs.org/@secretlint/node/-/node-10.2.2.tgz", + "integrity": "sha512-eZGJQgcg/3WRBwX1bRnss7RmHHK/YlP/l7zOQsrjexYt6l+JJa5YhUmHbuGXS94yW0++3YkEJp0kQGYhiw1DMQ==", + "dev": true, + "requires": { + "@secretlint/config-loader": "^10.2.2", + "@secretlint/core": "^10.2.2", + "@secretlint/formatter": "^10.2.2", + "@secretlint/profiler": "^10.2.2", + "@secretlint/source-creator": "^10.2.2", + "@secretlint/types": "^10.2.2", + "debug": "^4.4.1", + "p-map": "^7.0.3" + } + }, + "@secretlint/profiler": { + "version": "10.2.2", + "resolved": "https://registry.npmjs.org/@secretlint/profiler/-/profiler-10.2.2.tgz", + "integrity": "sha512-qm9rWfkh/o8OvzMIfY8a5bCmgIniSpltbVlUVl983zDG1bUuQNd1/5lUEeWx5o/WJ99bXxS7yNI4/KIXfHexig==", + "dev": true + }, + "@secretlint/resolver": { + "version": "10.2.2", + "resolved": "https://registry.npmjs.org/@secretlint/resolver/-/resolver-10.2.2.tgz", + "integrity": "sha512-3md0cp12e+Ae5V+crPQYGd6aaO7ahw95s28OlULGyclyyUtf861UoRGS2prnUrKh7MZb23kdDOyGCYb9br5e4w==", + "dev": true + }, + "@secretlint/secretlint-formatter-sarif": { + "version": "10.2.2", + "resolved": "https://registry.npmjs.org/@secretlint/secretlint-formatter-sarif/-/secretlint-formatter-sarif-10.2.2.tgz", + "integrity": "sha512-ojiF9TGRKJJw308DnYBucHxkpNovDNu1XvPh7IfUp0A12gzTtxuWDqdpuVezL7/IP8Ua7mp5/VkDMN9OLp1doQ==", + "dev": true, + "requires": { + "node-sarif-builder": "^3.2.0" + } + }, + "@secretlint/secretlint-rule-no-dotenv": { + "version": "10.2.2", + "resolved": "https://registry.npmjs.org/@secretlint/secretlint-rule-no-dotenv/-/secretlint-rule-no-dotenv-10.2.2.tgz", + "integrity": "sha512-KJRbIShA9DVc5Va3yArtJ6QDzGjg3PRa1uYp9As4RsyKtKSSZjI64jVca57FZ8gbuk4em0/0Jq+uy6485wxIdg==", + "dev": true, + "requires": { + "@secretlint/types": "^10.2.2" + } + }, + "@secretlint/secretlint-rule-preset-recommend": { + "version": "10.2.2", + "resolved": "https://registry.npmjs.org/@secretlint/secretlint-rule-preset-recommend/-/secretlint-rule-preset-recommend-10.2.2.tgz", + "integrity": "sha512-K3jPqjva8bQndDKJqctnGfwuAxU2n9XNCPtbXVI5JvC7FnQiNg/yWlQPbMUlBXtBoBGFYp08A94m6fvtc9v+zA==", + "dev": true + }, + "@secretlint/source-creator": { + "version": "10.2.2", + "resolved": "https://registry.npmjs.org/@secretlint/source-creator/-/source-creator-10.2.2.tgz", + "integrity": "sha512-h6I87xJfwfUTgQ7irWq7UTdq/Bm1RuQ/fYhA3dtTIAop5BwSFmZyrchph4WcoEvbN460BWKmk4RYSvPElIIvxw==", + "dev": true, + "requires": { + "@secretlint/types": "^10.2.2", + "istextorbinary": "^9.5.0" + } + }, + "@secretlint/types": { + "version": "10.2.2", + "resolved": "https://registry.npmjs.org/@secretlint/types/-/types-10.2.2.tgz", + "integrity": "sha512-Nqc90v4lWCXyakD6xNyNACBJNJ0tNCwj2WNk/7ivyacYHxiITVgmLUFXTBOeCdy79iz6HtN9Y31uw/jbLrdOAg==", + "dev": true + }, "@sindresorhus/is": { - "version": "5.5.2", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-5.5.2.tgz", - "integrity": "sha512-8ZMK+V6YpeZFfW6hU9uAeWVuq8v3t7BaG276gIO+kVqnAcLrHCXdFUOf7kgouyfAarkZtuavIqY3RsXTsTWviw==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-7.2.0.tgz", + "integrity": "sha512-P1Cz1dWaFfR4IR+U13mqqiGsLFf1KbayybWwdd2vfctdV6hDpUkgCY0nKOLLTMSoRd/jJNjtbqzf13K8DCCXQw==", "dev": true }, - "@szmarczak/http-timer": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-5.0.1.tgz", - "integrity": "sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==", + "@sindresorhus/merge-streams": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/merge-streams/-/merge-streams-4.0.0.tgz", + "integrity": "sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ==", + "dev": true + }, + "@textlint/ast-node-types": { + "version": "15.5.2", + "resolved": "https://registry.npmjs.org/@textlint/ast-node-types/-/ast-node-types-15.5.2.tgz", + "integrity": "sha512-fCaOxoup5LIyBEo7R1oYWE7V4bSX0KQeHh66twon9e9usaLE3ijgF8QjYsR6joCssdeCHVd0wHm7ppsEyTr6vg==", + "dev": true + }, + "@textlint/linter-formatter": { + "version": "15.5.2", + "resolved": "https://registry.npmjs.org/@textlint/linter-formatter/-/linter-formatter-15.5.2.tgz", + "integrity": "sha512-jAw7jWM8+wU9cG6Uu31jGyD1B+PAVePCvnPKC/oov+2iBPKk3ao30zc/Itmi7FvXo4oPaL9PmzPPQhyniPVgVg==", + "dev": true, + "requires": { + "@azu/format-text": "^1.0.2", + "@azu/style-format": "^1.0.1", + "@textlint/module-interop": "15.5.2", + "@textlint/resolver": "15.5.2", + "@textlint/types": "15.5.2", + "chalk": "^4.1.2", + "debug": "^4.4.3", + "js-yaml": "^4.1.1", + "lodash": "^4.17.23", + "pluralize": "^2.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "table": "^6.9.0", + "text-table": "^0.2.0" + }, + "dependencies": { + "pluralize": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-2.0.0.tgz", + "integrity": "sha512-TqNZzQCD4S42De9IfnnBvILN7HAW7riLqsCyp8lgjXeysyPlX5HhqKAcJHHHb9XskE4/a+7VGC9zzx8Ls0jOAw==", + "dev": true + } + } + }, + "@textlint/module-interop": { + "version": "15.5.2", + "resolved": "https://registry.npmjs.org/@textlint/module-interop/-/module-interop-15.5.2.tgz", + "integrity": "sha512-mg6rMQ3+YjwiXCYoQXbyVfDucpTa1q5mhspd/9qHBxUq4uY6W8GU42rmT3GW0V1yOfQ9z/iRrgPtkp71s8JzXg==", + "dev": true + }, + "@textlint/resolver": { + "version": "15.5.2", + "resolved": "https://registry.npmjs.org/@textlint/resolver/-/resolver-15.5.2.tgz", + "integrity": "sha512-YEITdjRiJaQrGLUWxWXl4TEg+d2C7+TNNjbGPHPH7V7CCnXm+S9GTjGAL7Q2WSGJyFEKt88Jvx6XdJffRv4HEA==", + "dev": true + }, + "@textlint/types": { + "version": "15.5.2", + "resolved": "https://registry.npmjs.org/@textlint/types/-/types-15.5.2.tgz", + "integrity": "sha512-sJOrlVLLXp4/EZtiWKWq9y2fWyZlI8GP+24rnU5avtPWBIMm/1w97yzKrAqYF8czx2MqR391z5akhnfhj2f/AQ==", "dev": true, "requires": { - "defer-to-connect": "^2.0.1" + "@textlint/ast-node-types": "15.5.2" } }, "@types/eslint": { @@ -6838,9 +9576,15 @@ } }, "@types/http-cache-semantics": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.1.tgz", - "integrity": "sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz", + "integrity": "sha512-L3LgimLHXtGkWikKnsPg0/VFx9OGZaC+eN1u4r+OB1XRqH3meBIAVC2zr1WdMH+RHmnRkqliQAOHNJ/E0j/e0Q==", + "dev": true + }, + "@types/istanbul-lib-coverage": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", + "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", "dev": true }, "@types/json-schema": { @@ -6876,12 +9620,25 @@ "undici-types": "~6.19.2" } }, + "@types/normalize-package-data": { + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz", + "integrity": "sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==", + "dev": true + }, + "@types/sarif": { + "version": "2.1.7", + "resolved": "https://registry.npmjs.org/@types/sarif/-/sarif-2.1.7.tgz", + "integrity": "sha512-kRz0VEkJqWLf1LLVN4pT1cg1Z9wAuvI6L97V3m2f5B76Tg8d413ddvLBPTEHAZJlnn4XSvu0FkZtViCQGVyrXQ==", + "dev": true + }, "@types/selenium-webdriver": { - "version": "4.1.21", - "resolved": "https://registry.npmjs.org/@types/selenium-webdriver/-/selenium-webdriver-4.1.21.tgz", - "integrity": "sha512-QGURnImvxYlIQz5DVhvHdqpYNLBjhJ2Vm+cnQI2G9QZzkWlZm0LkLcvDcHp+qE6N2KBz4CeuvXgPO7W3XQ0Tyw==", + "version": "4.35.5", + "resolved": "https://registry.npmjs.org/@types/selenium-webdriver/-/selenium-webdriver-4.35.5.tgz", + "integrity": "sha512-wCQCjWmahRkUAO7S703UAvBFkxz4o/rjX4T2AOSWKXSi0sTQPsrXxR0GjtFUT0ompedLkYH4R5HO5Urz0hyeog==", "dev": true, "requires": { + "@types/node": "*", "@types/ws": "*" } }, @@ -6898,14 +9655,33 @@ "dev": true }, "@types/ws": { - "version": "8.5.10", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.10.tgz", - "integrity": "sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A==", + "version": "8.18.1", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.18.1.tgz", + "integrity": "sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==", "dev": true, "requires": { "@types/node": "*" } }, + "@typespec/ts-http-runtime": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/@typespec/ts-http-runtime/-/ts-http-runtime-0.3.4.tgz", + "integrity": "sha512-CI0NhTrz4EBaa0U+HaaUZrJhPoso8sG7ZFya8uQoBA57fjzrjRSv87ekCjLZOFExN+gXE/z0xuN2QfH4H2HrLQ==", + "dev": true, + "requires": { + "http-proxy-agent": "^7.0.0", + "https-proxy-agent": "^7.0.0", + "tslib": "^2.6.2" + }, + "dependencies": { + "tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "dev": true + } + } + }, "@vscode/extension-telemetry": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/@vscode/extension-telemetry/-/extension-telemetry-1.2.0.tgz", @@ -6917,40 +9693,49 @@ } }, "@vscode/test-electron": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/@vscode/test-electron/-/test-electron-2.4.1.tgz", - "integrity": "sha512-Gc6EdaLANdktQ1t+zozoBVRynfIsMKMc94Svu1QreOBC8y76x4tvaK32TljrLi1LI2+PK58sDVbL7ALdqf3VRQ==", + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/@vscode/test-electron/-/test-electron-2.5.2.tgz", + "integrity": "sha512-8ukpxv4wYe0iWMRQU18jhzJOHkeGKbnw7xWRX3Zw1WJA4cEKbHcmmLPdPrPtL6rhDcrlCZN+xKRpv09n4gRHYg==", "dev": true, "requires": { "http-proxy-agent": "^7.0.2", "https-proxy-agent": "^7.0.5", "jszip": "^3.10.1", - "ora": "^7.0.1", + "ora": "^8.1.0", "semver": "^7.6.2" } }, "@vscode/vsce": { - "version": "2.22.0", - "resolved": "https://registry.npmjs.org/@vscode/vsce/-/vsce-2.22.0.tgz", - "integrity": "sha512-8df4uJiM3C6GZ2Sx/KilSKVxsetrTBBIUb3c0W4B1EWHcddioVs5mkyDKtMNP0khP/xBILVSzlXxhV+nm2rC9A==", - "dev": true, - "requires": { - "azure-devops-node-api": "^11.0.1", - "chalk": "^2.4.2", + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/@vscode/vsce/-/vsce-3.7.1.tgz", + "integrity": "sha512-OTm2XdMt2YkpSn2Nx7z2EJtSuhRHsTPYsSK59hr3v8jRArK+2UEoju4Jumn1CmpgoBLGI6ReHLJ/czYltNUW3g==", + "dev": true, + "requires": { + "@azure/identity": "^4.1.0", + "@secretlint/node": "^10.1.2", + "@secretlint/secretlint-formatter-sarif": "^10.1.2", + "@secretlint/secretlint-rule-no-dotenv": "^10.1.2", + "@secretlint/secretlint-rule-preset-recommend": "^10.1.2", + "@vscode/vsce-sign": "^2.0.0", + "azure-devops-node-api": "^12.5.0", + "chalk": "^4.1.2", "cheerio": "^1.0.0-rc.9", - "commander": "^6.2.1", - "glob": "^7.0.6", + "cockatiel": "^3.1.2", + "commander": "^12.1.0", + "form-data": "^4.0.0", + "glob": "^11.0.0", "hosted-git-info": "^4.0.2", "jsonc-parser": "^3.2.0", "keytar": "^7.7.0", "leven": "^3.1.0", - "markdown-it": "^12.3.2", + "markdown-it": "^14.1.0", "mime": "^1.3.4", "minimatch": "^3.0.3", "parse-semver": "^1.1.1", "read": "^1.0.7", + "secretlint": "^10.1.2", "semver": "^7.5.2", - "tmp": "^0.2.1", + "tmp": "^0.2.3", "typed-rest-client": "^1.8.4", "url-join": "^4.0.1", "xml2js": "^0.5.0", @@ -6958,15 +9743,6 @@ "yazl": "^2.2.2" }, "dependencies": { - "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, - "requires": { - "color-convert": "^1.9.0" - } - }, "brace-expansion": { "version": "1.1.12", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", @@ -6977,48 +9753,56 @@ "concat-map": "0.0.1" } }, - "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, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } + "commander": { + "version": "12.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz", + "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", + "dev": true }, - "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==", + "glob": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-11.1.0.tgz", + "integrity": "sha512-vuNwKSaKiqm7g0THUBu2x7ckSs3XJLXE+2ssL7/MfTGPLLcrJQ/4Uq1CjPTtO5cCIiRxqvN6Twy1qOwhL0Xjcw==", "dev": true, "requires": { - "color-name": "1.1.3" + "foreground-child": "^3.3.1", + "jackspeak": "^4.1.1", + "minimatch": "^10.1.1", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^2.0.0" + }, + "dependencies": { + "balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "dev": true + }, + "brace-expansion": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.4.tgz", + "integrity": "sha512-h+DEnpVvxmfVefa4jFbCf5HdH5YMDXRsmKflpf1pILZWRFlTbJpxeU55nJl4Smt5HQaGzg1o6RHFPJaOqnmBDg==", + "dev": true, + "requires": { + "balanced-match": "^4.0.2" + } + }, + "minimatch": { + "version": "10.2.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.4.tgz", + "integrity": "sha512-oRjTw/97aTBN0RHbYCdtF1MQfvusSIBQM0IZEgzl6426+8jSC0nF1a/GmnVLpfB9yyr6g6FTqWqiZVbxrtaCIg==", + "dev": true, + "requires": { + "brace-expansion": "^5.0.2" + } + } } }, - "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 - }, - "commander": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz", - "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==", - "dev": true - }, - "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 - }, - "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==", + "lru-cache": { + "version": "11.2.7", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.7.tgz", + "integrity": "sha512-aY/R+aEsRelme17KGQa/1ZSIpLpNYYrhcrepKTZgE+W3WM16YMCaPwOHLHsmopZHELU0Ojin1lPVxKR0MihncA==", "dev": true }, "minimatch": { @@ -7030,17 +9814,98 @@ "brace-expansion": "^1.1.7" } }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "path-scurry": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.2.tgz", + "integrity": "sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg==", "dev": true, "requires": { - "has-flag": "^3.0.0" + "lru-cache": "^11.0.0", + "minipass": "^7.1.2" } } } }, + "@vscode/vsce-sign": { + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/@vscode/vsce-sign/-/vsce-sign-2.0.9.tgz", + "integrity": "sha512-8IvaRvtFyzUnGGl3f5+1Cnor3LqaUWvhaUjAYO8Y39OUYlOf3cRd+dowuQYLpZcP3uwSG+mURwjEBOSq4SOJ0g==", + "dev": true, + "requires": { + "@vscode/vsce-sign-alpine-arm64": "2.0.6", + "@vscode/vsce-sign-alpine-x64": "2.0.6", + "@vscode/vsce-sign-darwin-arm64": "2.0.6", + "@vscode/vsce-sign-darwin-x64": "2.0.6", + "@vscode/vsce-sign-linux-arm": "2.0.6", + "@vscode/vsce-sign-linux-arm64": "2.0.6", + "@vscode/vsce-sign-linux-x64": "2.0.6", + "@vscode/vsce-sign-win32-arm64": "2.0.6", + "@vscode/vsce-sign-win32-x64": "2.0.6" + } + }, + "@vscode/vsce-sign-alpine-arm64": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@vscode/vsce-sign-alpine-arm64/-/vsce-sign-alpine-arm64-2.0.6.tgz", + "integrity": "sha512-wKkJBsvKF+f0GfsUuGT0tSW0kZL87QggEiqNqK6/8hvqsXvpx8OsTEc3mnE1kejkh5r+qUyQ7PtF8jZYN0mo8Q==", + "dev": true, + "optional": true + }, + "@vscode/vsce-sign-alpine-x64": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@vscode/vsce-sign-alpine-x64/-/vsce-sign-alpine-x64-2.0.6.tgz", + "integrity": "sha512-YoAGlmdK39vKi9jA18i4ufBbd95OqGJxRvF3n6ZbCyziwy3O+JgOpIUPxv5tjeO6gQfx29qBivQ8ZZTUF2Ba0w==", + "dev": true, + "optional": true + }, + "@vscode/vsce-sign-darwin-arm64": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@vscode/vsce-sign-darwin-arm64/-/vsce-sign-darwin-arm64-2.0.6.tgz", + "integrity": "sha512-5HMHaJRIQuozm/XQIiJiA0W9uhdblwwl2ZNDSSAeXGO9YhB9MH5C4KIHOmvyjUnKy4UCuiP43VKpIxW1VWP4tQ==", + "dev": true, + "optional": true + }, + "@vscode/vsce-sign-darwin-x64": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@vscode/vsce-sign-darwin-x64/-/vsce-sign-darwin-x64-2.0.6.tgz", + "integrity": "sha512-25GsUbTAiNfHSuRItoQafXOIpxlYj+IXb4/qarrXu7kmbH94jlm5sdWSCKrrREs8+GsXF1b+l3OB7VJy5jsykw==", + "dev": true, + "optional": true + }, + "@vscode/vsce-sign-linux-arm": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@vscode/vsce-sign-linux-arm/-/vsce-sign-linux-arm-2.0.6.tgz", + "integrity": "sha512-UndEc2Xlq4HsuMPnwu7420uqceXjs4yb5W8E2/UkaHBB9OWCwMd3/bRe/1eLe3D8kPpxzcaeTyXiK3RdzS/1CA==", + "dev": true, + "optional": true + }, + "@vscode/vsce-sign-linux-arm64": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@vscode/vsce-sign-linux-arm64/-/vsce-sign-linux-arm64-2.0.6.tgz", + "integrity": "sha512-cfb1qK7lygtMa4NUl2582nP7aliLYuDEVpAbXJMkDq1qE+olIw/es+C8j1LJwvcRq1I2yWGtSn3EkDp9Dq5FdA==", + "dev": true, + "optional": true + }, + "@vscode/vsce-sign-linux-x64": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@vscode/vsce-sign-linux-x64/-/vsce-sign-linux-x64-2.0.6.tgz", + "integrity": "sha512-/olerl1A4sOqdP+hjvJ1sbQjKN07Y3DVnxO4gnbn/ahtQvFrdhUi0G1VsZXDNjfqmXw57DmPi5ASnj/8PGZhAA==", + "dev": true, + "optional": true + }, + "@vscode/vsce-sign-win32-arm64": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@vscode/vsce-sign-win32-arm64/-/vsce-sign-win32-arm64-2.0.6.tgz", + "integrity": "sha512-ivM/MiGIY0PJNZBoGtlRBM/xDpwbdlCWomUWuLmIxbi1Cxe/1nooYrEQoaHD8ojVRgzdQEUzMsRbyF5cJJgYOg==", + "dev": true, + "optional": true + }, + "@vscode/vsce-sign-win32-x64": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@vscode/vsce-sign-win32-x64/-/vsce-sign-win32-x64-2.0.6.tgz", + "integrity": "sha512-mgth9Kvze+u8CruYMmhHw6Zgy3GRX2S+Ed5oSokDEK5vPEwGGKnmuXua9tmFhomeAnhgJnL4DCna3TiNuGrBTQ==", + "dev": true, + "optional": true + }, "@webassemblyjs/ast": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.14.1.tgz", @@ -7245,15 +10110,15 @@ } }, "ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.18.0.tgz", + "integrity": "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==", "dev": true, "requires": { - "fast-deep-equal": "^3.1.1", + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" + "require-from-string": "^2.0.2" } }, "ajv-formats": { @@ -7274,6 +10139,15 @@ "fast-deep-equal": "^3.1.3" } }, + "ansi-escapes": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-7.3.0.tgz", + "integrity": "sha512-BvU8nYgGQBxcmMuEeUEmNTvrMVjJNSH7RgW24vXexN4Ven6qCvy4TntnvlnwnMLTVlcRQQdbRY8NKnaIoeWDNg==", + "dev": true, + "requires": { + "environment": "^1.0.0" + } + }, "ansi-regex": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", @@ -7295,6 +10169,12 @@ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", "dev": true }, + "astral-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", + "dev": true + }, "asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", @@ -7316,9 +10196,9 @@ } }, "azure-devops-node-api": { - "version": "11.2.0", - "resolved": "https://registry.npmjs.org/azure-devops-node-api/-/azure-devops-node-api-11.2.0.tgz", - "integrity": "sha512-XdiGPhrpaT5J8wdERRKs5g8E0Zy1pvOYTli7z9E8nmOn3YGp4FhtjhrOyFmX/8veWCwdI69mCHKJw6l+4J/bHA==", + "version": "12.5.0", + "resolved": "https://registry.npmjs.org/azure-devops-node-api/-/azure-devops-node-api-12.5.0.tgz", + "integrity": "sha512-R5eFskGvOm3U/GzeAuxRkUsAl0hrAwGgWn6zAd2KrZmrEhWZVqLew4OOupbQlXUuojUzpGtq62SmdhJ06N88og==", "dev": true, "requires": { "tunnel": "0.0.6", @@ -7334,7 +10214,8 @@ "version": "1.5.1", "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "dev": true + "dev": true, + "optional": true }, "baseline-browser-mapping": { "version": "2.9.19", @@ -7347,20 +10228,13 @@ "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-3.0.2.tgz", "integrity": "sha512-Nik3Sc0ncrMK4UUdXQmAnRtzmNQTAAXmXIopizwZ1W1t8QmfJj+zL4OA2I7XPTPW5z5TDqv4hRo/JzouDJnX3A==" }, - "big-integer": { - "version": "1.6.51", - "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.51.tgz", - "integrity": "sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg==", - "dev": true - }, - "binary": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/binary/-/binary-0.3.0.tgz", - "integrity": "sha512-D4H1y5KYwpJgK8wk1Cue5LLPgmwHKYSChkbspQg5JtVuR5ulGckxfR62H3AE9UDkdMC8yyXlqYihuz3Aqg2XZg==", + "binaryextensions": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/binaryextensions/-/binaryextensions-6.11.0.tgz", + "integrity": "sha512-sXnYK/Ij80TO3lcqZVV2YgfKN5QjUWIRk/XSm2J/4bd/lPko3lvk0O4ZppH6m+6hB2/GTu+ptNwVFe1xh+QLQw==", "dev": true, "requires": { - "buffers": "~0.1.1", - "chainsaw": "~0.1.0" + "editions": "^6.21.0" } }, "bl": { @@ -7390,9 +10264,9 @@ } }, "bluebird": { - "version": "3.4.7", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.4.7.tgz", - "integrity": "sha512-iD3898SR7sWVRHbiQv+sHUtHnMvC1o3nW5rAcqnq3uOn07DSAppZYUkIGslDz6gXC7HfunPe7YVBgoEJASPcHA==", + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", "dev": true }, "boolbase": { @@ -7401,6 +10275,12 @@ "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", "dev": true }, + "boundary": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/boundary/-/boundary-2.0.0.tgz", + "integrity": "sha512-rJKn5ooC9u8q13IMCrW0RSp31pxBCHE3y9V/tp3TdWSLf8Em3p6Di4NBpfzbJge9YjjFEsD0RtFEjtvHL5VyEA==", + "dev": true + }, "brace-expansion": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", @@ -7469,6 +10349,12 @@ "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", "dev": true }, + "buffer-equal-constant-time": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", + "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==", + "dev": true + }, "buffer-fill": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz", @@ -7481,24 +10367,46 @@ "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", "dev": true }, - "buffer-indexof-polyfill": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/buffer-indexof-polyfill/-/buffer-indexof-polyfill-1.0.2.tgz", - "integrity": "sha512-I7wzHwA3t1/lwXQh+A5PbNvJxgfo5r3xulgpYDB5zckTu/Z9oUK9biouBKQUjEqzaz3HnAT6TYoovmE+GqSf7A==", - "dev": true - }, - "buffers": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/buffers/-/buffers-0.1.1.tgz", - "integrity": "sha512-9q/rDEGSb/Qsvv2qvzIzdluL5k7AaJOTrw23z9reQthrbF7is4CtlT0DXyO1oei2DCp4uojjzQ7igaSHp1kAEQ==", - "dev": true - }, "builtin-modules": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", "integrity": "sha512-wxXCdllwGhI2kCC0MnvTGYTMvnVZTvqgypkiTI8Pa5tcz2i6VqsqwYGgqwXji+4RgCzms6EajE4IxiUH6HH8nQ==", "dev": true }, + "bundle-name": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-4.1.0.tgz", + "integrity": "sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==", + "dev": true, + "requires": { + "run-applescript": "^7.0.0" + } + }, + "byte-counter": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/byte-counter/-/byte-counter-0.1.0.tgz", + "integrity": "sha512-jheRLVMeUKrDBjVw2O5+k4EvR4t9wtxHL+bo/LxfkxsVeuGMy3a5SEGgXdAFA4FSzTrU8rQXQIrsZ3oBq5a0pQ==", + "dev": true + }, + "c8": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/c8/-/c8-11.0.0.tgz", + "integrity": "sha512-e/uRViGHSVIJv7zsaDKM7VRn2390TgHXqUSvYwPHBQaU6L7E9L0n9JbdkwdYPvshDT0KymBmmlwSpms3yBaMNg==", + "dev": true, + "requires": { + "@bcoe/v8-coverage": "^1.0.1", + "@istanbuljs/schema": "^0.1.3", + "find-up": "^5.0.0", + "foreground-child": "^3.1.1", + "istanbul-lib-coverage": "^3.2.0", + "istanbul-lib-report": "^3.0.1", + "istanbul-reports": "^3.1.6", + "test-exclude": "^8.0.0", + "v8-to-istanbul": "^9.0.0", + "yargs": "^17.7.2", + "yargs-parser": "^21.1.1" + } + }, "cacheable-lookup": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-7.0.0.tgz", @@ -7506,18 +10414,18 @@ "dev": true }, "cacheable-request": { - "version": "10.2.12", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-10.2.12.tgz", - "integrity": "sha512-qtWGB5kn2OLjx47pYUkWicyOpK1vy9XZhq8yRTXOy+KAmjjESSRLx6SiExnnaGGUP1NM6/vmygMu0fGylNh9tw==", + "version": "13.0.18", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-13.0.18.tgz", + "integrity": "sha512-rFWadDRKJs3s2eYdXlGggnBZKG7MTblkFBB0YllFds+UYnfogDp2wcR6JN97FhRkHTvq59n2vhNoHNZn29dh/Q==", "dev": true, "requires": { - "@types/http-cache-semantics": "^4.0.1", - "get-stream": "^6.0.1", - "http-cache-semantics": "^4.1.1", - "keyv": "^4.5.2", + "@types/http-cache-semantics": "^4.0.4", + "get-stream": "^9.0.1", + "http-cache-semantics": "^4.2.0", + "keyv": "^5.5.5", "mimic-response": "^4.0.0", - "normalize-url": "^8.0.0", - "responselike": "^3.0.0" + "normalize-url": "^8.1.1", + "responselike": "^4.0.2" } }, "call-bind-apply-helpers": { @@ -7551,15 +10459,6 @@ "integrity": "sha512-BCfFL1sHijQlBGWBMuJyhZUhzo7wer5sVj9hqekB/7xn0Ypy+pER/edCYQm4exbXj4WiySGp40P8UuTh6w1srg==", "dev": true }, - "chainsaw": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/chainsaw/-/chainsaw-0.1.0.tgz", - "integrity": "sha512-75kWfWt6MEKNC8xYXIdRpDehRYY/tNSgwKaJq+dbbDcxORuVrrQ+SEHoWsniVn9XPYfP4gmdWIeDk/4YNp1rNQ==", - "dev": true, - "requires": { - "traverse": ">=0.3.0 <0.4" - } - }, "chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", @@ -7582,18 +10481,22 @@ } }, "cheerio": { - "version": "1.0.0-rc.12", - "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.12.tgz", - "integrity": "sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.2.0.tgz", + "integrity": "sha512-WDrybc/gKFpTYQutKIK6UvfcuxijIZfMfXaYm8NMsPQxSYvf+13fXUJ4rztGGbJcBQ/GF55gvrZ0Bc0bj/mqvg==", "dev": true, "requires": { "cheerio-select": "^2.1.0", "dom-serializer": "^2.0.0", "domhandler": "^5.0.3", - "domutils": "^3.0.1", - "htmlparser2": "^8.0.1", - "parse5": "^7.0.0", - "parse5-htmlparser2-tree-adapter": "^7.0.0" + "domutils": "^3.2.2", + "encoding-sniffer": "^0.2.1", + "htmlparser2": "^10.1.0", + "parse5": "^7.3.0", + "parse5-htmlparser2-tree-adapter": "^7.1.0", + "parse5-parser-stream": "^7.1.2", + "undici": "^7.19.0", + "whatwg-mimetype": "^4.0.0" } }, "cheerio-select": { @@ -7632,12 +10535,12 @@ "dev": true }, "cli-cursor": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-4.0.0.tgz", - "integrity": "sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-5.0.0.tgz", + "integrity": "sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==", "dev": true, "requires": { - "restore-cursor": "^4.0.0" + "restore-cursor": "^5.0.0" } }, "cli-spinners": { @@ -7646,15 +10549,27 @@ "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", "dev": true }, + "clipboard-image": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/clipboard-image/-/clipboard-image-0.1.0.tgz", + "integrity": "sha512-SWk7FgaXLNFld19peQ/rTe0n97lwR1WbkqxV6JKCAOh7U52AKV/PeMFCyt/8IhBdqyDA8rdyewQMKZqvWT5Akg==", + "dev": true, + "requires": { + "run-jxa": "^3.0.0" + } + }, "clipboardy": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/clipboardy/-/clipboardy-4.0.0.tgz", - "integrity": "sha512-5mOlNS0mhX0707P2I0aZ2V/cmHUEO/fL7VFLqszkhUsxt7RwnmrInf/eEQKlf5GzvYeHIjT+Ov1HRfNmymlG0w==", + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/clipboardy/-/clipboardy-5.3.1.tgz", + "integrity": "sha512-fPWgBqpp9ctiOQCkE5yjYGzv11ZU55g6ahEgr3COiio6dXdt1mbchCPXQrSR2Y9sZqfi8L7QD3+UosgXVIuPdg==", "dev": true, "requires": { - "execa": "^8.0.1", + "clipboard-image": "^0.1.0", + "execa": "^9.6.1", + "is-wayland": "^0.1.0", "is-wsl": "^3.1.0", - "is64bit": "^2.0.0" + "is64bit": "^2.0.0", + "powershell-utils": "^0.2.0" } }, "cliui": { @@ -7679,6 +10594,12 @@ "shallow-clone": "^3.0.0" } }, + "cockatiel": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/cockatiel/-/cockatiel-3.2.1.tgz", + "integrity": "sha512-gfrHV6ZPkquExvMh9IOkKsBzNDk6sDuZ6DdBGUBkvFnTCqCxzpuq48RySgP0AnaqQkw2zynOFj9yly6T1Q2G5Q==", + "dev": true + }, "color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -7715,9 +10636,9 @@ "dev": true }, "compare-versions": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-6.1.0.tgz", - "integrity": "sha512-LNZQXhqUvqUTotpZ00qLSaify3b4VFD588aRr8MKFw4CMUr98ytzCW5wDH5qx/DEY5kCDXcbcRuCqL0szEf2tg==", + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-6.1.1.tgz", + "integrity": "sha512-4hm4VPpIecmlg59CHXnRDnqGplJFrbLG4aFEl5vl6cK1u76ws3LLvX7ikFnTDl5vo39sjWD6AaDPYodJp/NNHg==", "dev": true }, "concat-map": { @@ -7726,6 +10647,12 @@ "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", "dev": true }, + "convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true + }, "copy-webpack-plugin": { "version": "11.0.0", "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-11.0.0.tgz", @@ -7757,10 +10684,27 @@ "which": "^2.0.1" } }, + "crypto-random-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-4.0.0.tgz", + "integrity": "sha512-x8dy3RnvYdlUcPOjkEHqozhiwzKNSq7GcPuXFbnyMOCHxX8V3OgIg/pYuabl2sbUPfIJaeAQB7PMOK8DFIdoRA==", + "dev": true, + "requires": { + "type-fest": "^1.0.1" + }, + "dependencies": { + "type-fest": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", + "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", + "dev": true + } + } + }, "css-select": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", - "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==", + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.2.2.tgz", + "integrity": "sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw==", "dev": true, "requires": { "boolbase": "^1.0.0", @@ -7771,18 +10715,18 @@ } }, "css-what": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", - "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.2.2.tgz", + "integrity": "sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==", "dev": true }, "debug": { - "version": "4.3.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.6.tgz", - "integrity": "sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==", + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", "dev": true, "requires": { - "ms": "2.1.2" + "ms": "^2.1.3" } }, "decamelize": { @@ -7792,20 +10736,12 @@ "dev": true }, "decompress-response": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", - "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-10.0.0.tgz", + "integrity": "sha512-oj7KWToJuuxlPr7VV0vabvxEIiqNMo+q0NueIiL3XhtwC6FVOX7Hr1c0C4eD0bmf7Zr+S/dSf2xvkH3Ad6sU3Q==", "dev": true, "requires": { - "mimic-response": "^3.1.0" - }, - "dependencies": { - "mimic-response": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", - "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", - "dev": true - } + "mimic-response": "^4.0.0" } }, "deep-extend": { @@ -7815,10 +10751,26 @@ "dev": true, "optional": true }, - "defer-to-connect": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", - "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", + "default-browser": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-5.5.0.tgz", + "integrity": "sha512-H9LMLr5zwIbSxrmvikGuI/5KGhZ8E2zH3stkMgM5LpOWDutGM2JZaj460Udnf1a+946zc7YBgrqEWwbk7zHvGw==", + "dev": true, + "requires": { + "bundle-name": "^4.1.0", + "default-browser-id": "^5.0.0" + } + }, + "default-browser-id": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-5.0.1.tgz", + "integrity": "sha512-x1VCxdX4t+8wVfd1so/9w+vQ4vx7lKd2Qp5tDRutErwmR85OgmfX7RlLRMWafRMY7hbEiXIbudNrjOAPa/hL8Q==", + "dev": true + }, + "define-lazy-prop": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz", + "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==", "dev": true }, "delayed-stream": { @@ -7827,9 +10779,9 @@ "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==" }, "detect-libc": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.2.tgz", - "integrity": "sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", "dev": true, "optional": true }, @@ -7874,9 +10826,9 @@ } }, "domutils": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz", - "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz", + "integrity": "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==", "dev": true, "requires": { "dom-serializer": "^2.0.0", @@ -7909,6 +10861,24 @@ "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", "dev": true }, + "ecdsa-sig-formatter": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", + "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", + "dev": true, + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "editions": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/editions/-/editions-6.22.0.tgz", + "integrity": "sha512-UgGlf8IW75je7HZjNDpJdCv4cGJWIi6yumFdZ0R7A8/CIhQiWUjyGLCxdHpd8bmyD1gnkfUNK0oeOXqUS2cpfQ==", + "dev": true, + "requires": { + "version-range": "^4.15.0" + } + }, "electron-to-chromium": { "version": "1.5.286", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.286.tgz", @@ -7921,6 +10891,16 @@ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "dev": true }, + "encoding-sniffer": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/encoding-sniffer/-/encoding-sniffer-0.2.1.tgz", + "integrity": "sha512-5gvq20T6vfpekVtqrYQsSCFZ1wEg5+wW0/QaZMWkFr6BqD3NfKs0rLCx4rrVlSWJeZb5NBJgVLswK/w2MWU+Gw==", + "dev": true, + "requires": { + "iconv-lite": "^0.6.3", + "whatwg-encoding": "^3.1.1" + } + }, "end-of-stream": { "version": "1.4.4", "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", @@ -7952,6 +10932,12 @@ "integrity": "sha512-ZtUjZO6l5mwTHvc1L9+1q5p/R3wTopcfqMW8r5t8SJSKqeVI/LtajORwRFEKpEFuekjD0VBjwu1HMxL4UalIRw==", "dev": true }, + "environment": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/environment/-/environment-1.1.0.tgz", + "integrity": "sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==", + "dev": true + }, "es-define-property": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", @@ -8045,26 +11031,29 @@ "dev": true }, "execa": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz", - "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==", - "dev": true, - "requires": { - "cross-spawn": "^7.0.3", - "get-stream": "^8.0.1", - "human-signals": "^5.0.0", - "is-stream": "^3.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^5.1.0", - "onetime": "^6.0.0", + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-9.6.1.tgz", + "integrity": "sha512-9Be3ZoN4LmYR90tUoVu2te2BsbzHfhJyfEiAVfz7N5/zv+jduIfLrV2xdQXOHbaD6KgpGdO9PRPM1Y4Q9QkPkA==", + "dev": true, + "requires": { + "@sindresorhus/merge-streams": "^4.0.0", + "cross-spawn": "^7.0.6", + "figures": "^6.1.0", + "get-stream": "^9.0.0", + "human-signals": "^8.0.1", + "is-plain-obj": "^4.1.0", + "is-stream": "^4.0.1", + "npm-run-path": "^6.0.0", + "pretty-ms": "^9.2.0", "signal-exit": "^4.1.0", - "strip-final-newline": "^3.0.0" + "strip-final-newline": "^4.0.0", + "yoctocolors": "^2.1.1" }, "dependencies": { - "get-stream": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz", - "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==", + "is-plain-obj": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", + "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", "dev": true } } @@ -8088,15 +11077,15 @@ "dev": true }, "fast-glob": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", - "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", "requires": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", "glob-parent": "^5.1.2", "merge2": "^1.3.0", - "micromatch": "^4.0.4" + "micromatch": "^4.0.8" }, "dependencies": { "glob-parent": { @@ -8109,6 +11098,12 @@ } } }, + "fast-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.0.tgz", + "integrity": "sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==", + "dev": true + }, "fastest-levenshtein": { "version": "1.0.16", "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", @@ -8132,6 +11127,23 @@ "pend": "~1.2.0" } }, + "figures": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-6.1.0.tgz", + "integrity": "sha512-d+l3qxjSesT4V7v2fh+QnmFnUWv9lSpjarhShNTgBOfA0ttejbQUAlHLitbjkoRiDulW0OPoQPYIGhIC8ohejg==", + "dev": true, + "requires": { + "is-unicode-supported": "^2.0.0" + }, + "dependencies": { + "is-unicode-supported": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-2.1.0.tgz", + "integrity": "sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==", + "dev": true + } + } + }, "fill-range": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", @@ -8170,12 +11182,12 @@ "integrity": "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==" }, "foreground-child": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz", - "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", + "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", "dev": true, "requires": { - "cross-spawn": "^7.0.0", + "cross-spawn": "^7.0.6", "signal-exit": "^4.0.1" } }, @@ -8192,9 +11204,9 @@ } }, "form-data-encoder": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-2.1.4.tgz", - "integrity": "sha512-yDYSgNMraqvnxiEXO4hi88+YZxaHC6QKzb5N84iRCTDeRO7ZALpir/lVmf/uXUhnwUr2O4HU8s/n6x+yNjQkHw==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-4.1.0.tgz", + "integrity": "sha512-G6NsmEW15s0Uw9XnCg+33H3ViYRyiM0hMrMhhqQOR8NFc5GhYrI+6I3u7OTw7b91J2g8rtvMBZJDbcGb2YUniw==", "dev": true }, "fs-constants": { @@ -8219,29 +11231,6 @@ "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", "dev": true }, - "fstream": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.12.tgz", - "integrity": "sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "inherits": "~2.0.0", - "mkdirp": ">=0.5 0", - "rimraf": "2" - }, - "dependencies": { - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - } - } - }, "function-bind": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", @@ -8253,6 +11242,12 @@ "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", "dev": true }, + "get-east-asian-width": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.5.0.tgz", + "integrity": "sha512-CQ+bEO+Tva/qlmw24dCejulK5pMzVnUOFOijVogd3KQs07HnRIgp8TGipvCCRT06xeYEbpbgwaCxglFyiuIcmA==", + "dev": true + }, "get-intrinsic": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", @@ -8280,10 +11275,14 @@ } }, "get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "dev": true + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-9.0.1.tgz", + "integrity": "sha512-kVCxPF3vQM/N0B1PmoqVUqgHP+EeVjmZSQn+1oCRPxd2P21P2F19lIgbR3HBosbB1PUhOAoctJnfEn2GbN2eZA==", + "dev": true, + "requires": { + "@sec-ant/readable-stream": "^0.4.1", + "is-stream": "^4.0.1" + } }, "github-from-package": { "version": "0.0.0", @@ -8360,22 +11359,23 @@ "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==" }, "got": { - "version": "13.0.0", - "resolved": "https://registry.npmjs.org/got/-/got-13.0.0.tgz", - "integrity": "sha512-XfBk1CxOOScDcMr9O1yKkNaQyy865NbYs+F7dr4H0LZMVgCj2Le59k6PqbNHoL5ToeaEQUYh6c6yMfVcc6SJxA==", + "version": "14.6.6", + "resolved": "https://registry.npmjs.org/got/-/got-14.6.6.tgz", + "integrity": "sha512-QLV1qeYSo5l13mQzWgP/y0LbMr5Plr5fJilgAIwgnwseproEbtNym8xpLsDzeZ6MWXgNE6kdWGBjdh3zT/Qerg==", "dev": true, "requires": { - "@sindresorhus/is": "^5.2.0", - "@szmarczak/http-timer": "^5.0.1", + "@sindresorhus/is": "^7.0.1", + "byte-counter": "^0.1.0", "cacheable-lookup": "^7.0.0", - "cacheable-request": "^10.2.8", - "decompress-response": "^6.0.0", - "form-data-encoder": "^2.1.2", - "get-stream": "^6.0.1", - "http2-wrapper": "^2.1.10", + "cacheable-request": "^13.0.12", + "decompress-response": "^10.0.0", + "form-data-encoder": "^4.0.2", + "http2-wrapper": "^2.2.1", + "keyv": "^5.5.3", "lowercase-keys": "^3.0.0", - "p-cancelable": "^3.0.0", - "responselike": "^3.0.0" + "p-cancelable": "^4.0.1", + "responselike": "^4.0.2", + "type-fest": "^4.26.1" } }, "graceful-fs": { @@ -8440,22 +11440,36 @@ "integrity": "sha512-A91dYTeIB6NoXG+PxTQpCCDDnfHsW9kc06Lvpu1TEe9gnd6ZFeiBoRO9JvzEv6xK7EX97/dUE8g/vBMTqTS3CA==", "dev": true }, + "html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true + }, "htmlparser2": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.2.tgz", - "integrity": "sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==", + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-10.1.0.tgz", + "integrity": "sha512-VTZkM9GWRAtEpveh7MSF6SjjrpNVNNVJfFup7xTY3UpFtm67foy9HDVXneLtFVt4pMz5kZtgNcvCniNFb1hlEQ==", "dev": true, "requires": { "domelementtype": "^2.3.0", "domhandler": "^5.0.3", - "domutils": "^3.0.1", - "entities": "^4.4.0" + "domutils": "^3.2.2", + "entities": "^7.0.1" + }, + "dependencies": { + "entities": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-7.0.1.tgz", + "integrity": "sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==", + "dev": true + } } }, "http-cache-semantics": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", - "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz", + "integrity": "sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==", "dev": true }, "http-proxy-agent": { @@ -8469,9 +11483,9 @@ } }, "http2-wrapper": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-2.2.0.tgz", - "integrity": "sha512-kZB0wxMo0sh1PehyjJUWRFEd99KC5TLjZ2cULC4f9iqJBAmKQQXEICjxl5iPJRwP40dpeHFqqhm7tYCvODpqpQ==", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-2.2.1.tgz", + "integrity": "sha512-V5nVw1PAOgfI3Lmeaj2Exmeg7fenjhRUgz1lPSezy1CuhPYbgQtbQj4jZfEAEMlaL+vupsvhjqCyjzob0yxsmQ==", "dev": true, "requires": { "quick-lru": "^5.1.1", @@ -8489,16 +11503,26 @@ } }, "human-signals": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz", - "integrity": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==", + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-8.0.1.tgz", + "integrity": "sha512-eKCa6bwnJhvxj14kZk5NCPc6Hb6BdsU9DZcOnmQKSnO1VKrfV0zCvtttPZUsBvjmNDn8rpcJfpwSYnHBjc95MQ==", "dev": true }, + "iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + } + }, "ieee754": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "dev": true + "dev": true, + "optional": true }, "ignore": { "version": "5.2.4", @@ -8521,6 +11545,12 @@ "resolve-cwd": "^3.0.0" } }, + "index-to-position": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/index-to-position/-/index-to-position-1.2.0.tgz", + "integrity": "sha512-Yg7+ztRkqslMAS2iFaU+Oa4KTSidr63OsFGlOrJoW981kIYO3CGCS3wA95P1mUi/IVSJkn0D479KTJpVpvFNuw==", + "dev": true + }, "inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", @@ -8626,9 +11656,9 @@ } }, "is-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", - "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-4.0.1.tgz", + "integrity": "sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A==", "dev": true }, "is-unicode-supported": { @@ -8637,10 +11667,16 @@ "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", "dev": true }, + "is-wayland": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-wayland/-/is-wayland-0.1.0.tgz", + "integrity": "sha512-QkbMsWkIfkrzOPxenwye0h56iAXirZYHG9eHVPb22fO9y+wPbaX/CHacOWBa/I++4ohTcByimhM1/nyCsH8KNA==", + "dev": true + }, "is-wsl": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.0.tgz", - "integrity": "sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.1.tgz", + "integrity": "sha512-e6rvdUCiQCAuumZslxRJWR/Doq4VpPR82kqclvcS0efgt430SlGIk05vdCN58+VrzgtIcfNODjozVielycD4Sw==", "dev": true, "requires": { "is-inside-container": "^1.0.0" @@ -8673,14 +11709,70 @@ "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", "dev": true }, + "istanbul-lib-coverage": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", + "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", + "dev": true + }, + "istanbul-lib-report": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", + "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", + "dev": true, + "requires": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^4.0.0", + "supports-color": "^7.1.0" + }, + "dependencies": { + "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, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "istanbul-reports": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.2.0.tgz", + "integrity": "sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==", + "dev": true, + "requires": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + } + }, + "istextorbinary": { + "version": "9.5.0", + "resolved": "https://registry.npmjs.org/istextorbinary/-/istextorbinary-9.5.0.tgz", + "integrity": "sha512-5mbUj3SiZXCuRf9fT3ibzbSSEWiy63gFfksmGfdOzujPjW3k+z8WvIBxcJHBoQNlaZaiyB25deviif2+osLmLw==", + "dev": true, + "requires": { + "binaryextensions": "^6.11.0", + "editions": "^6.21.0", + "textextensions": "^6.11.0" + } + }, "jackspeak": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz", - "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-4.2.3.tgz", + "integrity": "sha512-ykkVRwrYvFm1nb2AJfKKYPr0emF6IiXDYUaFx4Zn9ZuIH7MrzEZ3sD5RlqGXNRpHtvUHJyOnCEFxOlNDtGo7wg==", "dev": true, "requires": { - "@isaacs/cliui": "^8.0.2", - "@pkgjs/parseargs": "^0.11.0" + "@isaacs/cliui": "^9.0.0" + }, + "dependencies": { + "@isaacs/cliui": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-9.0.0.tgz", + "integrity": "sha512-AokJm4tuBHillT+FpMtxQ60n8ObyXBatq7jD2/JA9dxbDDokKQm8KMht5ibGzLVU9IJDIKK4TPKgMHEYMn3lMg==", + "dev": true + } } }, "jest-worker": { @@ -8709,12 +11801,6 @@ "argparse": "^2.0.1" } }, - "json-buffer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", - "dev": true - }, "json-parse-even-better-errors": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", @@ -8727,10 +11813,16 @@ "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", "dev": true }, + "json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true + }, "jsonc-parser": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", - "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.3.1.tgz", + "integrity": "sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==", "dev": true }, "jsonfile": { @@ -8742,6 +11834,24 @@ "universalify": "^2.0.0" } }, + "jsonwebtoken": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.3.tgz", + "integrity": "sha512-MT/xP0CrubFRNLNKvxJ2BYfy53Zkm++5bX9dtuPbqAeQpTVe0MQTFhao8+Cp//EmJp244xt6Drw/GVEGCUj40g==", + "dev": true, + "requires": { + "jws": "^4.0.1", + "lodash.includes": "^4.3.0", + "lodash.isboolean": "^3.0.3", + "lodash.isinteger": "^4.0.4", + "lodash.isnumber": "^3.0.3", + "lodash.isplainobject": "^4.0.6", + "lodash.isstring": "^4.0.1", + "lodash.once": "^4.0.0", + "ms": "^2.1.1", + "semver": "^7.5.4" + } + }, "jszip": { "version": "3.10.1", "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.10.1.tgz", @@ -8754,6 +11864,27 @@ "setimmediate": "^1.0.5" } }, + "jwa": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.1.tgz", + "integrity": "sha512-hRF04fqJIP8Abbkq5NKGN0Bbr3JxlQ+qhZufXVr0DvujKy93ZCbXZMHDL4EOtodSbCWxOqR8MS1tXA5hwqCXDg==", + "dev": true, + "requires": { + "buffer-equal-constant-time": "^1.0.1", + "ecdsa-sig-formatter": "1.0.11", + "safe-buffer": "^5.0.1" + } + }, + "jws": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/jws/-/jws-4.0.1.tgz", + "integrity": "sha512-EKI/M/yqPncGUUh44xz0PxSidXFr/+r0pA70+gIYhjv+et7yxM+s29Y+VGDkovRofQem0fs7Uvf4+YmAdyRduA==", + "dev": true, + "requires": { + "jwa": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, "keytar": { "version": "7.9.0", "resolved": "https://registry.npmjs.org/keytar/-/keytar-7.9.0.tgz", @@ -8766,12 +11897,12 @@ } }, "keyv": { - "version": "4.5.3", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.3.tgz", - "integrity": "sha512-QCiSav9WaX1PgETJ+SpNnx2PRRapJ/oRSXM4VO5OGYGSjrxbKPVFVhB3l2OCbLCk329N8qyAtsJjSjvVBWzEug==", + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-5.6.0.tgz", + "integrity": "sha512-CYDD3SOtsHtyXeEORYRx2qBtpDJFjRTGXUtmNEMGyzYOKj1TE3tycdlho7kA1Ufx9OYWZzg52QFBGALTirzDSw==", "dev": true, "requires": { - "json-buffer": "3.0.1" + "@keyv/serialize": "^1.1.1" } }, "kind-of": { @@ -8796,39 +11927,81 @@ } }, "linkify-it": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-3.0.3.tgz", - "integrity": "sha512-ynTsyrFSdE5oZ/O9GEf00kPngmOfVwazR5GKDq6EYfhlpFug3J2zybX56a2PRRpc9P+FuSoGNAwjlbDs9jJBPQ==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-5.0.0.tgz", + "integrity": "sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==", "dev": true, "requires": { - "uc.micro": "^1.0.1" + "uc.micro": "^2.0.0" } }, - "listenercount": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/listenercount/-/listenercount-1.0.1.tgz", - "integrity": "sha512-3mk/Zag0+IJxeDrxSgaDPy4zZ3w05PRZeJNnlWhzFz5OkX49J4krc+A8X2d2M69vGMBEX0uyl8M+W+8gH+kBqQ==", - "dev": true - }, "loader-runner": { "version": "4.3.1", "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.1.tgz", "integrity": "sha512-IWqP2SCPhyVFTBtRcgMHdzlf9ul25NwaFx4wCEH/KjAXuuHY4yNjvPXsBokp8jCB936PyWRaPKUNh8NvylLp2Q==", "dev": true }, - "locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "requires": { - "p-locate": "^5.0.0" - } + "locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "requires": { + "p-locate": "^5.0.0" + } + }, + "lodash": { + "version": "4.17.23", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.23.tgz", + "integrity": "sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w==" + }, + "lodash.includes": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", + "integrity": "sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==", + "dev": true + }, + "lodash.isboolean": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", + "integrity": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==", + "dev": true + }, + "lodash.isinteger": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", + "integrity": "sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==", + "dev": true + }, + "lodash.isnumber": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", + "integrity": "sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==", + "dev": true + }, + "lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==", + "dev": true + }, + "lodash.isstring": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", + "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==", + "dev": true + }, + "lodash.once": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", + "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==", + "dev": true }, - "lodash": { - "version": "4.17.23", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.23.tgz", - "integrity": "sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w==" + "lodash.truncate": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", + "integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==", + "dev": true }, "log-symbols": { "version": "4.1.0", @@ -8855,25 +12028,36 @@ "yallist": "^4.0.0" } }, + "macos-version": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/macos-version/-/macos-version-6.0.0.tgz", + "integrity": "sha512-O2S8voA+pMfCHhBn/TIYDXzJ1qNHpPDU32oFxglKnVdJABiYYITt45oLkV9yhwA3E2FDwn3tQqUFrTsr1p3sBQ==", + "dev": true, + "requires": { + "semver": "^7.3.5" + } + }, + "make-dir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", + "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", + "dev": true, + "requires": { + "semver": "^7.5.3" + } + }, "markdown-it": { - "version": "12.3.2", - "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-12.3.2.tgz", - "integrity": "sha512-TchMembfxfNVpHkbtriWltGWc+m3xszaRD0CZup7GFFhzIgQqxIfn3eGj1yZpfuflzPvfkt611B2Q/Bsk1YnGg==", + "version": "14.1.1", + "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-14.1.1.tgz", + "integrity": "sha512-BuU2qnTti9YKgK5N+IeMubp14ZUKUUw7yeJbkjtosvHiP0AZ5c8IAgEMk79D0eC8F23r4Ac/q8cAIFdm2FtyoA==", "dev": true, "requires": { "argparse": "^2.0.1", - "entities": "~2.1.0", - "linkify-it": "^3.0.1", - "mdurl": "^1.0.1", - "uc.micro": "^1.0.5" - }, - "dependencies": { - "entities": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.1.0.tgz", - "integrity": "sha512-hCx1oky9PFrJ611mf0ifBLBRW8lUUVRlFolb5gWRfIELabBlbp9xZvrqZLZAs+NxFnbfQoeGd8wDkygjg7U85w==", - "dev": true - } + "entities": "^4.4.0", + "linkify-it": "^5.0.0", + "mdurl": "^2.0.0", + "punycode.js": "^2.3.1", + "uc.micro": "^2.1.0" } }, "math-intrinsics": { @@ -8882,9 +12066,9 @@ "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==" }, "mdurl": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", - "integrity": "sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-2.0.0.tgz", + "integrity": "sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==", "dev": true }, "merge-stream": { @@ -8927,9 +12111,15 @@ } }, "mimic-fn": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", - "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true + }, + "mimic-function": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/mimic-function/-/mimic-function-5.0.1.tgz", + "integrity": "sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==", "dev": true }, "mimic-response": { @@ -8953,9 +12143,9 @@ "dev": true }, "minipass": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", - "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz", + "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==", "dev": true }, "mkdirp": { @@ -9035,45 +12225,13 @@ "requires": { "brace-expansion": "^2.0.2" } - }, - "ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true - } - } - }, - "monaco-page-objects": { - "version": "3.12.0", - "resolved": "https://registry.npmjs.org/monaco-page-objects/-/monaco-page-objects-3.12.0.tgz", - "integrity": "sha512-JiA24MmjeilFUumMtch9v/nzHWFt1TgMt9oRYmQJ7BwOFucFFxU+ksNmEwp5Je3b3tn1F+gDI3A1QwEhdOxXOg==", - "dev": true, - "requires": { - "clipboardy": "^4.0.0", - "clone-deep": "^4.0.1", - "compare-versions": "^6.1.0", - "fs-extra": "^11.2.0", - "ts-essentials": "^9.4.1" - }, - "dependencies": { - "fs-extra": { - "version": "11.2.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", - "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", - "dev": true, - "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - } } } }, "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "dev": true }, "mute-stream": { @@ -9083,9 +12241,9 @@ "dev": true }, "napi-build-utils": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz", - "integrity": "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-2.0.0.tgz", + "integrity": "sha512-GEbrYkbfF7MoNaoh2iGG84Mnf/WZfB0GdGEsM8wz7Expx/LlWf5U8t9nvJKXSp3qr5IsEbK04cBGhol/KwOsWA==", "dev": true, "optional": true }, @@ -9096,9 +12254,9 @@ "dev": true }, "node-abi": { - "version": "3.54.0", - "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.54.0.tgz", - "integrity": "sha512-p7eGEiQil0YUV3ItH4/tBb781L5impVmmx2E9FRKF7d18XXzp4PGT2tdYMFY6wQqgxD0IwNZOiSJ0/K0fSi/OA==", + "version": "3.89.0", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.89.0.tgz", + "integrity": "sha512-6u9UwL0HlAl21+agMN3YAMXcKByMqwGx+pq+P76vii5f7hTPtKDp08/H9py6DY+cfDw7kQNTGEj/rly3IgbNQA==", "dev": true, "optional": true, "requires": { @@ -9112,12 +12270,69 @@ "dev": true, "optional": true }, + "node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", + "dev": true + }, "node-releases": { "version": "2.0.27", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.27.tgz", "integrity": "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==", "dev": true }, + "node-sarif-builder": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/node-sarif-builder/-/node-sarif-builder-3.4.0.tgz", + "integrity": "sha512-tGnJW6OKRii9u/b2WiUViTJS+h7Apxx17qsMUjsUeNDiMMX5ZFf8F8Fcz7PAQ6omvOxHZtvDTmOYKJQwmfpjeg==", + "dev": true, + "requires": { + "@types/sarif": "^2.1.7", + "fs-extra": "^11.1.1" + }, + "dependencies": { + "fs-extra": { + "version": "11.3.4", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.4.tgz", + "integrity": "sha512-CTXd6rk/M3/ULNQj8FBqBWHYBVYybQ3VPBw0xGKFe3tuH7ytT6ACnvzpIQ3UZtB8yvUKC2cXn1a+x+5EVQLovA==", + "dev": true, + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + } + } + } + }, + "normalize-package-data": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-6.0.2.tgz", + "integrity": "sha512-V6gygoYb/5EmNI+MEGrWkC+e6+Rr7mTmfHrxDbLzxQogBkgzo76rkok0Am6thgSF7Mv2nLOajAJj5vDJZEFn7g==", + "dev": true, + "requires": { + "hosted-git-info": "^7.0.0", + "semver": "^7.3.5", + "validate-npm-package-license": "^3.0.4" + }, + "dependencies": { + "hosted-git-info": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-7.0.2.tgz", + "integrity": "sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w==", + "dev": true, + "requires": { + "lru-cache": "^10.0.1" + } + }, + "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 + } + } + }, "normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", @@ -9125,18 +12340,19 @@ "dev": true }, "normalize-url": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-8.0.0.tgz", - "integrity": "sha512-uVFpKhj5MheNBJRTiMZ9pE/7hD1QTeEvugSJW/OmLzAp78PB5O6adfMNTvmfKhXBkvCzC+rqifWcVYpGFwTjnw==", + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-8.1.1.tgz", + "integrity": "sha512-JYc0DPlpGWB40kH5g07gGTrYuMqV653k3uBKY6uITPWds3M0ov3GaWGp9lbE3Bzngx8+XkfzgvASb9vk9JDFXQ==", "dev": true }, "npm-run-path": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.2.0.tgz", - "integrity": "sha512-W4/tgAXFqFA0iL7fk0+uQ3g7wkL8xJmx3XdK0VGb4cHW//eZTtKGvFBBoRKVTpY7n6ze4NL9ly7rgXcHufqXKg==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-6.0.0.tgz", + "integrity": "sha512-9qny7Z9DsQU8Ou39ERsPU4OZQlSTP47ShQzuKZ6PRXpYLtIFgl/DEBYEXKlvcEa+9tHVcK8CF81Y2V72qaZhWA==", "dev": true, "requires": { - "path-key": "^4.0.0" + "path-key": "^4.0.0", + "unicorn-magic": "^0.3.0" }, "dependencies": { "path-key": { @@ -9172,91 +12388,111 @@ } }, "onetime": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", - "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-7.0.0.tgz", + "integrity": "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==", + "dev": true, + "requires": { + "mimic-function": "^5.0.0" + } + }, + "open": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/open/-/open-10.2.0.tgz", + "integrity": "sha512-YgBpdJHPyQ2UE5x+hlSXcnejzAvD0b22U2OuAP+8OnlJT+PjWPxtgmGqKKc+RgTM63U9gN0YzrYc71R2WT/hTA==", "dev": true, "requires": { - "mimic-fn": "^4.0.0" + "default-browser": "^5.2.1", + "define-lazy-prop": "^3.0.0", + "is-inside-container": "^1.0.0", + "wsl-utils": "^0.1.0" } }, "ora": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/ora/-/ora-7.0.1.tgz", - "integrity": "sha512-0TUxTiFJWv+JnjWm4o9yvuskpEJLXTcng8MJuKd+SzAzp2o+OP3HWqNhB4OdJRt1Vsd9/mR0oyaEYlOnL7XIRw==", + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/ora/-/ora-8.2.0.tgz", + "integrity": "sha512-weP+BZ8MVNnlCm8c0Qdc1WSWq4Qn7I+9CJGm7Qali6g44e/PUzbjNqJX5NJ9ljlNMosfJvg1fKEGILklK9cwnw==", "dev": true, "requires": { "chalk": "^5.3.0", - "cli-cursor": "^4.0.0", - "cli-spinners": "^2.9.0", + "cli-cursor": "^5.0.0", + "cli-spinners": "^2.9.2", "is-interactive": "^2.0.0", - "is-unicode-supported": "^1.3.0", - "log-symbols": "^5.1.0", - "stdin-discarder": "^0.1.0", - "string-width": "^6.1.0", + "is-unicode-supported": "^2.0.0", + "log-symbols": "^6.0.0", + "stdin-discarder": "^0.2.2", + "string-width": "^7.2.0", "strip-ansi": "^7.1.0" }, "dependencies": { "ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", "dev": true }, "chalk": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", - "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", + "version": "5.6.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", + "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", "dev": true }, "emoji-regex": { - "version": "10.3.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.3.0.tgz", - "integrity": "sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw==", + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz", + "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==", "dev": true }, "is-unicode-supported": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-1.3.0.tgz", - "integrity": "sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-2.1.0.tgz", + "integrity": "sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==", "dev": true }, "log-symbols": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-5.1.0.tgz", - "integrity": "sha512-l0x2DvrW294C9uDCoQe1VSU4gf529FkSZ6leBl4TiqZH/e+0R7hSfHQBNut2mNygDgHwvYHfFLn6Oxb3VWj2rA==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-6.0.0.tgz", + "integrity": "sha512-i24m8rpwhmPIS4zscNzK6MSEhk0DUWa/8iYQWxhffV8jkI4Phvs3F+quL5xvS0gdQR0FyTCMMH33Y78dDTzzIw==", "dev": true, "requires": { - "chalk": "^5.0.0", - "is-unicode-supported": "^1.1.0" + "chalk": "^5.3.0", + "is-unicode-supported": "^1.3.0" + }, + "dependencies": { + "is-unicode-supported": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-1.3.0.tgz", + "integrity": "sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==", + "dev": true + } } }, "string-width": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-6.1.0.tgz", - "integrity": "sha512-k01swCJAgQmuADB0YIc+7TuatfNvTBVOoaUWJjTB9R4VJzR5vNWzf5t42ESVZFPS8xTySF7CAdV4t/aaIm3UnQ==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", "dev": true, "requires": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^10.2.1", - "strip-ansi": "^7.0.1" + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" } }, "strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", "dev": true, "requires": { - "ansi-regex": "^6.0.1" + "ansi-regex": "^6.2.2" } } } }, "p-cancelable": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-3.0.0.tgz", - "integrity": "sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-4.0.1.tgz", + "integrity": "sha512-wBowNApzd45EIKdO1LaU+LrMBwAcjfPaYtVzV3lmfM3gf8Z4CHZsiIqlM8TZZ8okYvh5A1cP6gTfCRQtwUpaUg==", "dev": true }, "p-limit": { @@ -9277,6 +12513,12 @@ "p-limit": "^3.0.2" } }, + "p-map": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-7.0.4.tgz", + "integrity": "sha512-tkAQEw8ysMzmkhgw8k+1U/iPhWNhykKnSk4Rd5zLoPJCuJaGRPo6YposrZgaxHKzDHdDWWZvE/Sk7hsL2X/CpQ==", + "dev": true + }, "p-try": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", @@ -9295,6 +12537,23 @@ "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", "dev": true }, + "parse-json": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-8.3.0.tgz", + "integrity": "sha512-ybiGyvspI+fAoRQbIPRddCcSTV9/LsJbf0e/S85VLowVGzRmokfneg2kwVW/KU5rOXrPSbF1qAKPMgNTqqROQQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.26.2", + "index-to-position": "^1.1.0", + "type-fest": "^4.39.1" + } + }, + "parse-ms": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-ms/-/parse-ms-4.0.0.tgz", + "integrity": "sha512-TXfryirbmq34y8QBwgqCVLi+8oA3oWx2eAnSn62ITyEhEYaWRlVZ2DvMM9eZbMs/RfxPu/PK/aBLyGj4IrqMHw==", + "dev": true + }, "parse-semver": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/parse-semver/-/parse-semver-1.1.1.tgz", @@ -9313,21 +12572,38 @@ } }, "parse5": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", - "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.3.0.tgz", + "integrity": "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==", "dev": true, "requires": { - "entities": "^4.4.0" + "entities": "^6.0.0" + }, + "dependencies": { + "entities": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", + "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", + "dev": true + } } }, "parse5-htmlparser2-tree-adapter": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.0.0.tgz", - "integrity": "sha512-B77tOZrqqfUfnVcOrUvfdLbz4pu4RopLD/4vmu3HUPswwTA8OH0EMW9BlWR2B0RCoiZRAHEUu7IxeP1Pd1UU+g==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.1.0.tgz", + "integrity": "sha512-ruw5xyKs6lrpo9x9rCZqZZnIUntICjQAd0Wsmp396Ul9lN/h+ifgVV1x1gZHi8euej6wTfpqX8j+BFQxF0NS/g==", + "dev": true, + "requires": { + "domhandler": "^5.0.3", + "parse5": "^7.0.0" + } + }, + "parse5-parser-stream": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/parse5-parser-stream/-/parse5-parser-stream-7.1.2.tgz", + "integrity": "sha512-JyeQc9iwFLn5TbvvqACIF/VXG6abODeB3Fwmv/TGdLk2LfbWkaySGY72at4+Ty7EkPZj854u4CrICqNk2qIbow==", "dev": true, "requires": { - "domhandler": "^5.0.2", "parse5": "^7.0.0" } }, @@ -9443,10 +12719,22 @@ } } }, + "pluralize": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz", + "integrity": "sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==", + "dev": true + }, + "powershell-utils": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/powershell-utils/-/powershell-utils-0.2.0.tgz", + "integrity": "sha512-ZlsFlG7MtSFCoc5xreOvBAozCJ6Pf06opgJjh9ONEv418xpZSAzNjstD36C6+JwOnfSqOW/9uDkqKjezTdxZhw==", + "dev": true + }, "prebuild-install": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.1.tgz", - "integrity": "sha512-jAXscXWMcCK8GgCoHOfIr0ODh5ai8mj63L2nWrjuAgXE6tDyYGnx4/8o/rCgU+B4JSyZBKbeZqzhtwtC3ovxjw==", + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.3.tgz", + "integrity": "sha512-8Mf2cbV7x1cXPUILADGI3wuhfqWvtiLA1iclTDbFRZkgRQS0NqsPZphna9V+HyTEadheuPmjaJMsbzKQFOzLug==", "dev": true, "optional": true, "requires": { @@ -9455,7 +12743,7 @@ "github-from-package": "0.0.0", "minimist": "^1.2.3", "mkdirp-classic": "^0.5.3", - "napi-build-utils": "^1.0.1", + "napi-build-utils": "^2.0.0", "node-abi": "^3.3.0", "pump": "^3.0.0", "rc": "^1.2.7", @@ -9464,6 +12752,15 @@ "tunnel-agent": "^0.6.0" } }, + "pretty-ms": { + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/pretty-ms/-/pretty-ms-9.3.0.tgz", + "integrity": "sha512-gjVS5hOP+M3wMm5nmNOucbIrqudzs9v/57bWRHQWLYklXqoXKrVfYW2W9+glfGsqtPgpiz5WwyEEB+ksXIx3gQ==", + "dev": true, + "requires": { + "parse-ms": "^4.0.0" + } + }, "process-nextick-args": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", @@ -9476,9 +12773,9 @@ "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" }, "pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.4.tgz", + "integrity": "sha512-VS7sjc6KR7e1ukRFhQSY5LM2uBWAUPiOPa/A3mkKmiMwSmRFUITt0xuj+/lesgnCv+dPIEYlkzrcyXgquIHMcA==", "dev": true, "optional": true, "requires": { @@ -9486,10 +12783,10 @@ "once": "^1.3.1" } }, - "punycode": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", - "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", + "punycode.js": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode.js/-/punycode.js-2.3.1.tgz", + "integrity": "sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==", "dev": true }, "qs": { @@ -9543,6 +12840,18 @@ } } }, + "rc-config-loader": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/rc-config-loader/-/rc-config-loader-4.1.4.tgz", + "integrity": "sha512-3GiwEzklkbXTDp52UR5nT8iXgYAx1V9ZG/kDZT7p60u2GCv2XTwQq4NzinMoMpNtXhmt3WkhYXcj6HH8HdwCEQ==", + "dev": true, + "requires": { + "debug": "^4.4.3", + "js-yaml": "^4.1.1", + "json5": "^2.2.3", + "require-from-string": "^2.0.2" + } + }, "read": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/read/-/read-1.0.7.tgz", @@ -9552,6 +12861,27 @@ "mute-stream": "~0.0.4" } }, + "read-pkg": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-9.0.1.tgz", + "integrity": "sha512-9viLL4/n1BJUCT1NXVTdS1jtm80yDEgR5T4yCelII49Mbj0v1rZdKqj7zCiYdbB0CuCgdrvHcNogAKTFPBocFA==", + "dev": true, + "requires": { + "@types/normalize-package-data": "^2.4.3", + "normalize-package-data": "^6.0.0", + "parse-json": "^8.0.0", + "type-fest": "^4.6.0", + "unicorn-magic": "^0.1.0" + }, + "dependencies": { + "unicorn-magic": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.1.0.tgz", + "integrity": "sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==", + "dev": true + } + } + }, "readable-stream": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", @@ -9627,30 +12957,91 @@ "dev": true }, "responselike": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-3.0.0.tgz", - "integrity": "sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-4.0.2.tgz", + "integrity": "sha512-cGk8IbWEAnaCpdAt1BHzJ3Ahz5ewDJa0KseTsE3qIRMJ3C698W8psM7byCeWVpd/Ha7FUYzuRVzXoKoM6nRUbA==", "dev": true, "requires": { "lowercase-keys": "^3.0.0" } }, "restore-cursor": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-4.0.0.tgz", - "integrity": "sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-5.1.0.tgz", + "integrity": "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==", + "dev": true, + "requires": { + "onetime": "^7.0.0", + "signal-exit": "^4.1.0" + } + }, + "reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==" + }, + "run-applescript": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-7.1.0.tgz", + "integrity": "sha512-DPe5pVFaAsinSaV6QjQ6gdiedWDcRCbUuiQfQa2wmWV7+xC9bGulGI8+TdRmoFkAPaBXk8CrAbnlY2ISniJ47Q==", + "dev": true + }, + "run-jxa": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/run-jxa/-/run-jxa-3.0.0.tgz", + "integrity": "sha512-4f2CrY7H+sXkKXJn/cE6qRA3z+NMVO7zvlZ/nUV0e62yWftpiLAfw5eV9ZdomzWd2TXWwEIiGjAT57+lWIzzvA==", "dev": true, "requires": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" + "execa": "^5.1.1", + "macos-version": "^6.0.0", + "subsume": "^4.0.0", + "type-fest": "^2.0.0" }, "dependencies": { - "mimic-fn": { + "execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + } + }, + "get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true + }, + "human-signals": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true + }, + "is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", "dev": true }, + "npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "requires": { + "path-key": "^3.0.0" + } + }, "onetime": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", @@ -9665,23 +13056,21 @@ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", "dev": true + }, + "strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true + }, + "type-fest": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", + "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", + "dev": true } } }, - "reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==" - }, - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, "run-parallel": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", @@ -9696,6 +13085,12 @@ "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", "dev": true }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, "sanitize-filename": { "version": "1.6.3", "resolved": "https://registry.npmjs.org/sanitize-filename/-/sanitize-filename-1.6.3.tgz", @@ -9706,9 +13101,9 @@ } }, "sax": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.3.0.tgz", - "integrity": "sha512-0s+oAmw9zLl1V1cS9BtZN7JAd0cW5e0QH4W3LWEK6a4LaLEA2OTpGYWDY+6XasBLtz6wkm3u1xRw95mRuJ59WA==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.6.0.tgz", + "integrity": "sha512-6R3J5M4AcbtLUdZmRv2SygeVaM7IhrLXu9BmnOGmmACak8fiUtOsYNWUS4uK7upbmHIBbLBeFeI//477BKLBzA==", "dev": true }, "schema-utils": { @@ -9723,15 +13118,71 @@ "ajv-keywords": "^5.1.0" } }, + "secretlint": { + "version": "10.2.2", + "resolved": "https://registry.npmjs.org/secretlint/-/secretlint-10.2.2.tgz", + "integrity": "sha512-xVpkeHV/aoWe4vP4TansF622nBEImzCY73y/0042DuJ29iKIaqgoJ8fGxre3rVSHHbxar4FdJobmTnLp9AU0eg==", + "dev": true, + "requires": { + "@secretlint/config-creator": "^10.2.2", + "@secretlint/formatter": "^10.2.2", + "@secretlint/node": "^10.2.2", + "@secretlint/profiler": "^10.2.2", + "debug": "^4.4.1", + "globby": "^14.1.0", + "read-pkg": "^9.0.1" + }, + "dependencies": { + "@sindresorhus/merge-streams": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/merge-streams/-/merge-streams-2.3.0.tgz", + "integrity": "sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg==", + "dev": true + }, + "globby": { + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-14.1.0.tgz", + "integrity": "sha512-0Ia46fDOaT7k4og1PDW4YbodWWr3scS2vAr2lTbsplOt2WkKp0vQbkI9wKis/T5LV/dqPjO3bpS/z6GTJB82LA==", + "dev": true, + "requires": { + "@sindresorhus/merge-streams": "^2.1.0", + "fast-glob": "^3.3.3", + "ignore": "^7.0.3", + "path-type": "^6.0.0", + "slash": "^5.1.0", + "unicorn-magic": "^0.3.0" + } + }, + "ignore": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", + "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", + "dev": true + }, + "path-type": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-6.0.0.tgz", + "integrity": "sha512-Vj7sf++t5pBD637NSfkxpHSMfWaeig5+DKWLhcqIYx6mWQz5hdJTGDVMQiJcw1ZYkhs7AazKDGpRVji1LJCZUQ==", + "dev": true + }, + "slash": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-5.1.0.tgz", + "integrity": "sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==", + "dev": true + } + } + }, "selenium-webdriver": { - "version": "4.16.0", - "resolved": "https://registry.npmjs.org/selenium-webdriver/-/selenium-webdriver-4.16.0.tgz", - "integrity": "sha512-IbqpRpfGE7JDGgXHJeWuCqT/tUqnLvZ14csSwt+S8o4nJo3RtQoE9VR4jB47tP/A8ArkYsh/THuMY6kyRP6kuA==", + "version": "4.41.0", + "resolved": "https://registry.npmjs.org/selenium-webdriver/-/selenium-webdriver-4.41.0.tgz", + "integrity": "sha512-1XxuKVhr9az24xwixPBEDGSZP+P0z3ZOnCmr9Oiep0MlJN2Mk+flIjD3iBS9BgyjS4g14dikMqnrYUPIjhQBhA==", "dev": true, "requires": { + "@bazel/runfiles": "^6.5.0", "jszip": "^3.10.1", - "tmp": "^0.2.1", - "ws": ">=8.14.2" + "tmp": "^0.2.5", + "ws": "^8.19.0" } }, "semver": { @@ -9849,6 +13300,25 @@ "decompress-response": "^6.0.0", "once": "^1.3.1", "simple-concat": "^1.0.0" + }, + "dependencies": { + "decompress-response": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "dev": true, + "optional": true, + "requires": { + "mimic-response": "^3.1.0" + } + }, + "mimic-response": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", + "dev": true, + "optional": true + } } }, "slash": { @@ -9856,6 +13326,17 @@ "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==" }, + "slice-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + } + }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -9872,6 +13353,38 @@ "source-map": "^0.6.0" } }, + "spdx-correct": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", + "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", + "dev": true, + "requires": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-exceptions": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", + "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==", + "dev": true + }, + "spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dev": true, + "requires": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-license-ids": { + "version": "3.0.23", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.23.tgz", + "integrity": "sha512-CWLcCCH7VLu13TgOH+r8p1O/Znwhqv/dbb6lqWy67G+pT1kHmeD/+V36AVb/vq8QMIQwVShJ6Ssl5FPh0fuSdw==", + "dev": true + }, "sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", @@ -9879,47 +13392,10 @@ "dev": true }, "stdin-discarder": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/stdin-discarder/-/stdin-discarder-0.1.0.tgz", - "integrity": "sha512-xhV7w8S+bUwlPTb4bAOUQhv8/cSS5offJuX8GQGq32ONF0ZtDWKfkdomM3HMRA+LhX6um/FZ0COqlwsjD53LeQ==", - "dev": true, - "requires": { - "bl": "^5.0.0" - }, - "dependencies": { - "bl": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-5.1.0.tgz", - "integrity": "sha512-tv1ZJHLfTDnXE6tMHv73YgSJaWR2AFuPwMntBe7XL/GBFHnT0CLnsHMogfk5+GzCDC5ZWarSCYaIGATZt9dNsQ==", - "dev": true, - "requires": { - "buffer": "^6.0.3", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" - } - }, - "buffer": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", - "dev": true, - "requires": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" - } - }, - "readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - } - } + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/stdin-discarder/-/stdin-discarder-0.2.2.tgz", + "integrity": "sha512-UhDfHmA92YAlNnCfhmq0VeNL5bDbiZGg7sZ2IvPsXubGkiNa9EC+tUTsjBRsYUAz87btI6/1wf4XoVvQ3uRnmQ==", + "dev": true }, "string_decoder": { "version": "1.1.1", @@ -9971,9 +13447,9 @@ } }, "strip-final-newline": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", - "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-4.0.0.tgz", + "integrity": "sha512-aulFJcD6YK8V1G7iRB5tigAP4TsHBZZrOV8pjV++zdUwmeV8uzbY7yn6h9MswN62adStNZFuCIx4haBnRuMDaw==", "dev": true }, "strip-json-comments": { @@ -9982,6 +13458,33 @@ "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", "dev": true }, + "structured-source": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/structured-source/-/structured-source-4.0.0.tgz", + "integrity": "sha512-qGzRFNJDjFieQkl/sVOI2dUjHKRyL9dAJi2gCPGJLbJHBIkyOHxjuocpIEfbLioX+qSJpvbYdT49/YCdMznKxA==", + "dev": true, + "requires": { + "boundary": "^2.0.0" + } + }, + "subsume": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/subsume/-/subsume-4.0.0.tgz", + "integrity": "sha512-BWnYJElmHbYZ/zKevy+TG+SsyoFCmRPDHJbR1MzLxkPOv1Jp/4hGhVUtP98s+wZBsBsHwCXvPTP0x287/WMjGg==", + "dev": true, + "requires": { + "escape-string-regexp": "^5.0.0", + "unique-string": "^3.0.0" + }, + "dependencies": { + "escape-string-regexp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", + "dev": true + } + } + }, "supports-color": { "version": "8.1.1", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", @@ -9991,6 +13494,27 @@ "has-flag": "^4.0.0" } }, + "supports-hyperlinks": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-3.2.0.tgz", + "integrity": "sha512-zFObLMyZeEwzAoKCyu1B91U79K2t7ApXuQfo8OuxwXLDgcKxuwM+YvcbIhm6QWqz7mHUH1TVytR1PwVVjEuMig==", + "dev": true, + "requires": { + "has-flag": "^4.0.0", + "supports-color": "^7.0.0" + }, + "dependencies": { + "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, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, "supports-preserve-symlinks-flag": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", @@ -10003,6 +13527,19 @@ "integrity": "sha512-ulAk51I9UVUyJgxlv9M6lFot2WP3e7t8Kz9+IS6D4rVba1tR9kON+Ey69f+1R4Q8cd45Lod6a4IcJIxnzGc/zA==", "dev": true }, + "table": { + "version": "6.9.0", + "resolved": "https://registry.npmjs.org/table/-/table-6.9.0.tgz", + "integrity": "sha512-9kY+CygyYM6j02t5YFHbNz2FN5QmYGv9zAjVp4lCDjlCw7amdckXlEt/bjMhUIfj4ThGRE4gCUH5+yGnNuPo5A==", + "dev": true, + "requires": { + "ajv": "^8.0.1", + "lodash.truncate": "^4.4.2", + "slice-ansi": "^4.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1" + } + }, "tapable": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.0.tgz", @@ -10010,9 +13547,9 @@ "dev": true }, "tar-fs": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.3.tgz", - "integrity": "sha512-090nwYJDmlhwFwEW3QQl+vaNnxsO2yVsd45eTKRBzSzu+hlb1w2K9inVq5b0ngXuLVqQ4ApvsUHHnu/zQNkWAg==", + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.4.tgz", + "integrity": "sha512-mDAjwmZdh7LTT6pNleZ05Yt65HC3E+NiQzl672vQG38jIrehtJk/J3mNwIg+vShQPcLF/LV7CMnDW6vjj6sfYQ==", "dev": true, "optional": true, "requires": { @@ -10116,6 +13653,16 @@ "axios": "^1.6.1" } }, + "terminal-link": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-4.0.0.tgz", + "integrity": "sha512-lk+vH+MccxNqgVqSnkMVKx4VLJfnLjDBGzH16JVZjKE2DoxP57s6/vt6JmXV5I3jBcfGrxNrYtC+mPtU7WJztA==", + "dev": true, + "requires": { + "ansi-escapes": "^7.0.0", + "supports-hyperlinks": "^3.2.0" + } + }, "terser": { "version": "5.46.0", "resolved": "https://registry.npmjs.org/terser/-/terser-5.46.0.tgz", @@ -10141,15 +13688,91 @@ "terser": "^5.31.1" } }, - "tmp": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", - "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", + "test-exclude": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-8.0.0.tgz", + "integrity": "sha512-ZOffsNrXYggvU1mDGHk54I96r26P8SyMjO5slMKSc7+IWmtB/MQKnEC2fP51imB3/pT6YK5cT5E8f+Dd9KdyOQ==", + "dev": true, + "requires": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^13.0.6", + "minimatch": "^10.2.2" + }, + "dependencies": { + "balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "dev": true + }, + "brace-expansion": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.4.tgz", + "integrity": "sha512-h+DEnpVvxmfVefa4jFbCf5HdH5YMDXRsmKflpf1pILZWRFlTbJpxeU55nJl4Smt5HQaGzg1o6RHFPJaOqnmBDg==", + "dev": true, + "requires": { + "balanced-match": "^4.0.2" + } + }, + "glob": { + "version": "13.0.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-13.0.6.tgz", + "integrity": "sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw==", + "dev": true, + "requires": { + "minimatch": "^10.2.2", + "minipass": "^7.1.3", + "path-scurry": "^2.0.2" + } + }, + "lru-cache": { + "version": "11.2.7", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.7.tgz", + "integrity": "sha512-aY/R+aEsRelme17KGQa/1ZSIpLpNYYrhcrepKTZgE+W3WM16YMCaPwOHLHsmopZHELU0Ojin1lPVxKR0MihncA==", + "dev": true + }, + "minimatch": { + "version": "10.2.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.4.tgz", + "integrity": "sha512-oRjTw/97aTBN0RHbYCdtF1MQfvusSIBQM0IZEgzl6426+8jSC0nF1a/GmnVLpfB9yyr6g6FTqWqiZVbxrtaCIg==", + "dev": true, + "requires": { + "brace-expansion": "^5.0.2" + } + }, + "path-scurry": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.2.tgz", + "integrity": "sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg==", + "dev": true, + "requires": { + "lru-cache": "^11.0.0", + "minipass": "^7.1.2" + } + } + } + }, + "text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true + }, + "textextensions": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/textextensions/-/textextensions-6.11.0.tgz", + "integrity": "sha512-tXJwSr9355kFJI3lbCkPpUH5cP8/M0GGy2xLO34aZCjMXBaK3SoPnZwr/oWmo1FdCnELcs4npdCIOFtq9W3ruQ==", "dev": true, "requires": { - "rimraf": "^3.0.0" + "editions": "^6.21.0" } }, + "tmp": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.5.tgz", + "integrity": "sha512-voyz6MApa1rQGUxT3E+BK7/ROe8itEx7vD8/HEvt4xwXucvQ5G5oeEiHkmHZJuBO21RpOf+YYm9MOivj709jow==", + "dev": true + }, "to-buffer": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/to-buffer/-/to-buffer-1.1.1.tgz", @@ -10164,12 +13787,6 @@ "is-number": "^7.0.0" } }, - "traverse": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.3.9.tgz", - "integrity": "sha512-iawgk0hLP3SxGKDfnDJf8wTz4p2qImnyihM5Hh/sGvQ3K37dPi/w8sRhdNIxYA1TwFwc5mDhIJq+O0RsvXBKdQ==", - "dev": true - }, "truncate-utf8-bytes": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/truncate-utf8-bytes/-/truncate-utf8-bytes-1.0.2.tgz", @@ -10179,13 +13796,6 @@ "utf8-byte-length": "^1.0.1" } }, - "ts-essentials": { - "version": "9.4.1", - "resolved": "https://registry.npmjs.org/ts-essentials/-/ts-essentials-9.4.1.tgz", - "integrity": "sha512-oke0rI2EN9pzHsesdmrOrnqv1eQODmJpd/noJjwj2ZPC3Z4N2wbjrOEqnsEgmvlO2+4fBb0a794DCna2elEVIQ==", - "dev": true, - "requires": {} - }, "ts-loader": { "version": "9.5.1", "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.5.1.tgz", @@ -10366,6 +13976,12 @@ "safe-buffer": "^5.0.1" } }, + "type-fest": { + "version": "4.41.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.41.0.tgz", + "integrity": "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==", + "dev": true + }, "typed-rest-client": { "version": "1.8.11", "resolved": "https://registry.npmjs.org/typed-rest-client/-/typed-rest-client-1.8.11.tgz", @@ -10384,15 +14000,21 @@ "dev": true }, "uc.micro": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz", - "integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-2.1.0.tgz", + "integrity": "sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==", "dev": true }, "underscore": { - "version": "1.13.6", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.6.tgz", - "integrity": "sha512-+A5Sja4HP1M08MaXya7p5LvjuM7K6q/2EaC0+iovj/wOcMsTzMvDFbasi/oSapiwOlt252IqsKqPjCl7huKS0A==", + "version": "1.13.8", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.8.tgz", + "integrity": "sha512-DXtD3ZtEQzc7M8m4cXotyHR+FAS18C64asBYY5vqZexfYryNNnDc02W4hKg3rdQuqOYas1jkseX0+nZXjTXnvQ==", + "dev": true + }, + "undici": { + "version": "7.24.4", + "resolved": "https://registry.npmjs.org/undici/-/undici-7.24.4.tgz", + "integrity": "sha512-BM/JzwwaRXxrLdElV2Uo6cTLEjhSb3WXboncJamZ15NgUURmvlXvxa6xkwIOILIjPNo9i8ku136ZvWV0Uly8+w==", "dev": true }, "undici-types": { @@ -10401,6 +14023,21 @@ "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==", "dev": true }, + "unicorn-magic": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.3.0.tgz", + "integrity": "sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==", + "dev": true + }, + "unique-string": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-3.0.0.tgz", + "integrity": "sha512-VGXBUVwxKMBUznyffQweQABPRRW1vHZAbadFZud4pLFAqRGvv/96vafgjWFqzourzr8YonlQiPgH0YCJfawoGQ==", + "dev": true, + "requires": { + "crypto-random-string": "^4.0.0" + } + }, "universal-user-agent": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-7.0.3.tgz", @@ -10412,21 +14049,29 @@ "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==" }, "unzipper": { - "version": "0.10.14", - "resolved": "https://registry.npmjs.org/unzipper/-/unzipper-0.10.14.tgz", - "integrity": "sha512-ti4wZj+0bQTiX2KmKWuwj7lhV+2n//uXEotUmGuQqrbVZSEGFMbI68+c6JCQ8aAmUWYvtHEz2A8K6wXvueR/6g==", + "version": "0.12.3", + "resolved": "https://registry.npmjs.org/unzipper/-/unzipper-0.12.3.tgz", + "integrity": "sha512-PZ8hTS+AqcGxsaQntl3IRBw65QrBI6lxzqDEL7IAo/XCEqRTKGfOX56Vea5TH9SZczRVxuzk1re04z/YjuYCJA==", "dev": true, "requires": { - "big-integer": "^1.6.17", - "binary": "~0.3.0", - "bluebird": "~3.4.1", - "buffer-indexof-polyfill": "~1.0.0", + "bluebird": "~3.7.2", "duplexer2": "~0.1.4", - "fstream": "^1.0.12", + "fs-extra": "^11.2.0", "graceful-fs": "^4.2.2", - "listenercount": "~1.0.1", - "readable-stream": "~2.3.6", - "setimmediate": "~1.0.4" + "node-int64": "^0.4.0" + }, + "dependencies": { + "fs-extra": { + "version": "11.3.4", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.4.tgz", + "integrity": "sha512-CTXd6rk/M3/ULNQj8FBqBWHYBVYybQ3VPBw0xGKFe3tuH7ytT6ACnvzpIQ3UZtB8yvUKC2cXn1a+x+5EVQLovA==", + "dev": true, + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + } + } } }, "update-browserslist-db": { @@ -10439,15 +14084,6 @@ "picocolors": "^1.1.1" } }, - "uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, - "requires": { - "punycode": "^2.1.0" - } - }, "url-join": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/url-join/-/url-join-4.0.1.tgz", @@ -10471,6 +14107,33 @@ "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==" }, + "v8-to-istanbul": { + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.3.0.tgz", + "integrity": "sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==", + "dev": true, + "requires": { + "@jridgewell/trace-mapping": "^0.3.12", + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^2.0.0" + } + }, + "validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, + "requires": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "version-range": { + "version": "4.15.0", + "resolved": "https://registry.npmjs.org/version-range/-/version-range-4.15.0.tgz", + "integrity": "sha512-Ck0EJbAGxHwprkzFO966t4/5QkRuzh+/I1RxhLgUKKwEn+Cd8NwM60mE3AqBZg5gYODoXW0EFsQvbZjRlvdqbg==", + "dev": true + }, "vscode-extension-telemetry-wrapper": { "version": "0.15.0", "resolved": "https://registry.npmjs.org/vscode-extension-telemetry-wrapper/-/vscode-extension-telemetry-wrapper-0.15.0.tgz", @@ -10481,38 +14144,65 @@ } }, "vscode-extension-tester": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/vscode-extension-tester/-/vscode-extension-tester-7.0.0.tgz", - "integrity": "sha512-ICl/ITfPZnvx9ofY2gcOg5ZndQo3MSGu6iNa2TdkPLysAYnm5H/hY3IrmwqQqjXI+id+kcxoZMB/SZlsBlxiVw==", - "dev": true, - "requires": { - "@types/selenium-webdriver": "^4.1.21", - "@vscode/vsce": "^2.22.0", - "commander": "^11.1.0", - "compare-versions": "^6.1.0", - "fs-extra": "^11.2.0", - "glob": "^10.3.10", - "got": "^13.0.0", + "version": "8.23.0", + "resolved": "https://registry.npmjs.org/vscode-extension-tester/-/vscode-extension-tester-8.23.0.tgz", + "integrity": "sha512-YElhRDkOjvmGFv44aCMnEnUM5RmFqWByQ8TBr7/6N9K/b5o1gu2fo9EgTef6VmrB4kyFnSrkPVAbiZBfKQA1mQ==", + "dev": true, + "requires": { + "@redhat-developer/locators": "^1.20.0", + "@redhat-developer/page-objects": "^1.20.0", + "@types/selenium-webdriver": "^4.35.5", + "@vscode/vsce": "^3.7.1", + "c8": "^11.0.0", + "commander": "^14.0.3", + "compare-versions": "^6.1.1", + "find-up": "8.0.0", + "fs-extra": "^11.3.4", + "glob": "^13.0.6", + "got": "^14.6.6", "hpagent": "^1.2.0", - "js-yaml": "^4.1.0", - "monaco-page-objects": "^3.12.0", + "js-yaml": "^4.1.1", "sanitize-filename": "^1.6.3", - "selenium-webdriver": "^4.16.0", + "selenium-webdriver": "^4.41.0", "targz": "^1.0.1", - "unzipper": "^0.10.14", - "vscode-extension-tester-locators": "^3.10.0" + "unzipper": "^0.12.3" }, "dependencies": { + "balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "dev": true + }, + "brace-expansion": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.4.tgz", + "integrity": "sha512-h+DEnpVvxmfVefa4jFbCf5HdH5YMDXRsmKflpf1pILZWRFlTbJpxeU55nJl4Smt5HQaGzg1o6RHFPJaOqnmBDg==", + "dev": true, + "requires": { + "balanced-match": "^4.0.2" + } + }, "commander": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-11.1.0.tgz", - "integrity": "sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==", + "version": "14.0.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-14.0.3.tgz", + "integrity": "sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw==", "dev": true }, + "find-up": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-8.0.0.tgz", + "integrity": "sha512-JGG8pvDi2C+JxidYdIwQDyS/CgcrIdh18cvgxcBge3wSHRQOrooMD3GlFBcmMJAN9M42SAZjDp5zv1dglJjwww==", + "dev": true, + "requires": { + "locate-path": "^8.0.0", + "unicorn-magic": "^0.3.0" + } + }, "fs-extra": { - "version": "11.2.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", - "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", + "version": "11.3.4", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.4.tgz", + "integrity": "sha512-CTXd6rk/M3/ULNQj8FBqBWHYBVYybQ3VPBw0xGKFe3tuH7ytT6ACnvzpIQ3UZtB8yvUKC2cXn1a+x+5EVQLovA==", "dev": true, "requires": { "graceful-fs": "^4.2.0", @@ -10521,36 +14211,76 @@ } }, "glob": { - "version": "10.3.10", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", - "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", + "version": "13.0.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-13.0.6.tgz", + "integrity": "sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw==", "dev": true, "requires": { - "foreground-child": "^3.1.0", - "jackspeak": "^2.3.5", - "minimatch": "^9.0.1", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", - "path-scurry": "^1.10.1" + "minimatch": "^10.2.2", + "minipass": "^7.1.3", + "path-scurry": "^2.0.2" } }, + "locate-path": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-8.0.0.tgz", + "integrity": "sha512-XT9ewWAC43tiAV7xDAPflMkG0qOPn2QjHqlgX8FOqmWa/rxnyYDulF9T0F7tRy1u+TVTmK/M//6VIOye+2zDXg==", + "dev": true, + "requires": { + "p-locate": "^6.0.0" + } + }, + "lru-cache": { + "version": "11.2.7", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.7.tgz", + "integrity": "sha512-aY/R+aEsRelme17KGQa/1ZSIpLpNYYrhcrepKTZgE+W3WM16YMCaPwOHLHsmopZHELU0Ojin1lPVxKR0MihncA==", + "dev": true + }, "minimatch": { - "version": "9.0.9", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", - "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", + "version": "10.2.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.4.tgz", + "integrity": "sha512-oRjTw/97aTBN0RHbYCdtF1MQfvusSIBQM0IZEgzl6426+8jSC0nF1a/GmnVLpfB9yyr6g6FTqWqiZVbxrtaCIg==", "dev": true, "requires": { - "brace-expansion": "^2.0.2" + "brace-expansion": "^5.0.2" + } + }, + "p-limit": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", + "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", + "dev": true, + "requires": { + "yocto-queue": "^1.0.0" + } + }, + "p-locate": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz", + "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==", + "dev": true, + "requires": { + "p-limit": "^4.0.0" + } + }, + "path-scurry": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.2.tgz", + "integrity": "sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg==", + "dev": true, + "requires": { + "lru-cache": "^11.0.0", + "minipass": "^7.1.2" } + }, + "yocto-queue": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.2.2.tgz", + "integrity": "sha512-4LCcse/U2MHZ63HAJVE+v71o7yOdIe4cZ70Wpf8D/IyjDKYQLV5GD46B+hSTjJsvV5PztjvHoU580EftxjDZFQ==", + "dev": true } } }, - "vscode-extension-tester-locators": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/vscode-extension-tester-locators/-/vscode-extension-tester-locators-3.10.0.tgz", - "integrity": "sha512-smhCxci1FtaK1ZHVnRtrnv+5YIDAFPkXBWRkyKzrf7CBA4Zpg5hleLKipEVEygBj/MrFCW4oYexqti9hOJX3bw==", - "dev": true, - "requires": {} - }, "vscode-jsonrpc": { "version": "8.2.0", "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-8.2.0.tgz", @@ -10665,6 +14395,21 @@ "integrity": "sha512-yd1RBzSGanHkitROoPFd6qsrxt+oFhg/129YzheDGqeustzX0vTZJZsSsQjVQC4yzBQ56K55XU8gaNCtIzOnTg==", "dev": true }, + "whatwg-encoding": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-3.1.1.tgz", + "integrity": "sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==", + "dev": true, + "requires": { + "iconv-lite": "0.6.3" + } + }, + "whatwg-mimetype": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-4.0.0.tgz", + "integrity": "sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==", + "dev": true + }, "which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", @@ -10715,12 +14460,21 @@ "dev": true }, "ws": { - "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz", - "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==", + "version": "8.19.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.19.0.tgz", + "integrity": "sha512-blAT2mjOEIi0ZzruJfIhb3nps74PRWTCz1IjglWEEpQl5XS/UNama6u2/rjFkDDouqr4L67ry+1aGIALViWjDg==", "dev": true, "requires": {} }, + "wsl-utils": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/wsl-utils/-/wsl-utils-0.1.0.tgz", + "integrity": "sha512-h3Fbisa2nKGPxCpm89Hk33lBLsnaGBvctQopaBSOW/uIs6FTe1ATyAnKFJrzVs9vpGdsTe73WF3V4lIsk4Gacw==", + "dev": true, + "requires": { + "is-wsl": "^3.1.0" + } + }, "xml2js": { "version": "0.5.0", "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.5.0.tgz", @@ -10812,6 +14566,12 @@ "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", "dev": true + }, + "yoctocolors": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yoctocolors/-/yoctocolors-2.1.2.tgz", + "integrity": "sha512-CzhO+pFNo8ajLM2d2IW/R93ipy99LWjtwblvC1RsoSUMZgyLbYFr221TnSNT7GjGdYui6P459mw9JH/g/zW2ug==", + "dev": true } } } diff --git a/package.json b/package.json index 7e5c0038..25e76efd 100644 --- a/package.json +++ b/package.json @@ -1276,14 +1276,14 @@ "@types/node": "20.x", "@types/semver": "^7.3.13", "@types/vscode": "1.95.0", - "@vscode/test-electron": "^2.4.1", + "@vscode/test-electron": "^2.5.2", "copy-webpack-plugin": "^11.0.0", "glob": "^7.2.3", "mocha": "^11.7.5", "ts-loader": "^9.4.2", "tslint": "^6.1.3", "typescript": "^4.9.4", - "vscode-extension-tester": "^7.0.0", + "vscode-extension-tester": "^8.23.0", "webpack": "^5.105.0", "webpack-cli": "^4.10.0" }, diff --git a/test/ui/command.test.ts b/test/ui/command.test.ts index d9f28cd0..3f317918 100644 --- a/test/ui/command.test.ts +++ b/test/ui/command.test.ts @@ -27,7 +27,7 @@ const invisibleJavaFilePath = path.join("src", "App.java"); describe("Command Tests", function() { - this.timeout(2 * 60 * 1000 /*ms*/); + this.timeout(5 * 60 * 1000 /*ms*/); const mavenProjectTmpFolders: string[] = []; let currentProjectPath: string | undefined; let statusBar: StatusBar; @@ -60,20 +60,21 @@ describe("Command Tests", function() { } async function waitForLanguageServerReady() { - while (true) { - const language = await statusBar.getCurrentLanguage(); - if (language === 'Java') { - break; - } - } - while (true) { + // Wait until the language server is no longer indexing. + // Use a max wait to avoid infinite loops if the status UI changes between VS Code versions. + const maxWaitMs = 3 * 60 * 1000; + const startTime = Date.now(); + while (Date.now() - startTime < maxWaitMs) { try { const languageStatus = await statusBar.findElement(By.xpath('//*[@id="status.languageStatus"]')); await languageStatus.click(); - await languageStatus.findElement(By.xpath(`//div[contains(@class, 'context-view')]//div[contains(@class, 'hover-language-status')]//span[contains(@class, 'codicon-thumbsup')]`)); + // Accept either codicon-thumbsup (older VS Code) or codicon-pass (newer VS Code) + await languageStatus.findElement(By.xpath( + `//div[contains(@class, 'context-view')]//div[contains(@class, 'hover-language-status')]//*[contains(@class, 'codicon-thumbsup') or contains(@class, 'codicon-pass')]` + )); break; } catch (e) { - await sleep(100); + await sleep(1000); } } } @@ -85,16 +86,32 @@ describe("Command Tests", function() { }); after(async function() { - mavenProjectTmpFolders.forEach(mavenProjectTmpFolder => { - fse.rmSync(mavenProjectTmpFolder, {force: true, recursive: true}); - }); + for (const mavenProjectTmpFolder of mavenProjectTmpFolders) { + try { + fse.rmSync(mavenProjectTmpFolder, {force: true, recursive: true}); + } catch (e) { + // Ignore EBUSY and other cleanup errors on Windows when VS Code still holds file locks + console.warn(`Warning: failed to clean up temp folder ${mavenProjectTmpFolder}: ${e}`); + } + } }); it("Test javaProjectExplorer.focus", async function() { await new Workbench().executeCommand("javaProjectExplorer.focus"); - const section = await new SideBarView().getContent().getSection("Java Projects"); - assert.ok(section.isExpanded(), `Section "Java Projects" should be expanded`); + // Retry finding the section since it may take time to render after the command + let section: ViewSection | undefined; + for (let i = 0; i < 5; i++) { + try { + section = await new SideBarView().getContent().getSection("Java Projects"); + break; + } catch (_e) { + await sleep(2000); + await new Workbench().executeCommand("javaProjectExplorer.focus"); + } + } + assert.ok(section, `Section "Java Projects" should be found`); + assert.ok(section!.isExpanded(), `Section "Java Projects" should be expanded`); }); (platform() === "darwin" ? it.skip : it)("Test java.view.package.linkWithFolderExplorer", async function() { @@ -135,10 +152,9 @@ describe("Command Tests", function() { assert.ok(await inputBox.getPlaceHolder() === "Input the class name", `InputBox "Input the class name" should appear`); await inputBox.setText("App2"); await inputBox.confirm(); - await sleep(1000); - const editor = new TextEditor(); - await editor.save(); - assert.ok(await editor.getTitle() === "App2.java", `Editor's title should be "App2.java"`); + const editor = await waitForEditorTitle("App2.java"); + assert.ok(editor, `Editor's title should be "App2.java"`); + await editor!.save(); assert.ok(await fse.pathExists(path.join(currentProjectPath!, "src", "main", "java", "App2.java")), `"App2.java" should be created in correct path`); }); @@ -155,8 +171,7 @@ describe("Command Tests", function() { inputBox = await InputBox.create(); await inputBox.setText("com.mycompany.app2"); await inputBox.confirm(); - await sleep(1000); - assert.ok(await fse.pathExists(path.join(currentProjectPath!, "src", "main", "java", "com", "mycompany", "app2")), `New package should be created in correct path`); + assert.ok(await waitForFileExists(path.join(currentProjectPath!, "src", "main", "java", "com", "mycompany", "app2")), `New package should be created in correct path`); }); (platform() === "darwin" ? it.skip : it)("Test java.view.package.revealInProjectExplorer", async function() { @@ -192,19 +207,20 @@ describe("Command Tests", function() { const inputBox = await InputBox.create(); await inputBox.setText("AppRenamed"); await inputBox.confirm(); - await sleep(1000); - const dialog = new ModalDialog(); - const buttons = await dialog.getButtons(); + const dialog = await waitForModalDialog(); + assert.ok(dialog, `Rename confirmation dialog should appear`); + const buttons = await dialog!.getButtons(); for (const button of buttons) { if (await button.getText() === "OK") { await button.click(); break; } } - await sleep(5000); - const editor = new TextEditor(); - await editor.save(); - assert.ok(await editor.getTitle() === "AppRenamed.java", `Editor's title should be "AppRenamed.java"`); + const editor = await waitForEditorTitle("AppRenamed.java"); + assert.ok(editor, `Editor's title should be "AppRenamed.java"`); + // Use command palette to save because the editor input area may not be + // interactable right after the rename refactoring dialog is dismissed. + await new Workbench().executeCommand('workbench.action.files.save'); assert.ok(await section.findItem("AppRenamed"), `Item in Java Project section should be "AppRenamed"`); }); @@ -223,20 +239,26 @@ describe("Command Tests", function() { } assert.ok(deleteItem, `"Delete" item should be found`); await deleteItem!.click(); - const dialog = new ModalDialog(); - const buttons = await dialog.getButtons(); - for (const button of buttons) { - if (await button.getText() === "Move to Recycle Bin") { - await button.click(); - break; + const dialog = await waitForModalDialog(); + if (dialog) { + const buttons = await dialog.getButtons(); + for (const button of buttons) { + const text = await button.getText(); + if (text === "Move to Recycle Bin" || text === "Delete") { + await button.click(); + break; + } } } - await sleep(1000); - assert.ok(!await fse.pathExists(path.join(currentProjectPath!, "src", "main", "java", "AppToDelete.java")), `The source file "AppToDelete.java" should be deleted`); + assert.ok(await waitForFileGone(path.join(currentProjectPath!, "src", "main", "java", "AppToDelete.java")), `The source file "AppToDelete.java" should be deleted`); }); it("Test change to invisible project", async function() { await openProject(invisibleProjectPath); + // Allow VS Code to finish the workspace transition before opening files + await sleep(3000); + // Dismiss any modal dialog (e.g. workspace trust) that may appear after opening a new project + await dismissModalDialogIfPresent(); await openFile(invisibleJavaFilePath); await waitForLanguageServerReady(); const fileSections = await new SideBarView().getContent().getSections(); @@ -252,16 +274,14 @@ describe("Command Tests", function() { const input = await InputBox.create(); await input.setText(path.join(invisibleProjectPath, "libSource", "simple.jar")); await input.confirm(); - await sleep(5000); + await sleep(1000); referencedItem = await section.findItem("Referenced Libraries") as TreeItem; await referencedItem.expand(); - let simpleItem = await section.findItem("simple.jar") as TreeItem; + const simpleItem = await waitForTreeItem(section, "simple.jar") as TreeItem; assert.ok(simpleItem, `Library "simple.jar" should be found`); await simpleItem.click(); await clickActionButton(simpleItem, 'Remove from Project Classpath'); - await sleep(5000); - simpleItem = await section.findItem("simple.jar") as TreeItem; - assert.ok(!simpleItem, `Library "simple.jar" should not be found`); + assert.ok(await waitForTreeItemGone(section, "simple.jar"), `Library "simple.jar" should not be found`); }); it("Test java.project.addLibraryFolders", async function() { @@ -275,17 +295,17 @@ describe("Command Tests", function() { .click(button) .keyUp(seleniumWebdriver.Key.ALT) .perform(); - await sleep(5000); const input = await InputBox.create(); await input.setText(path.join(invisibleProjectPath, "libSource")); await input.confirm(); - await sleep(5000); + await sleep(1000); referencedItem = await section.findItem("Referenced Libraries") as TreeItem; await referencedItem.expand(); - assert.ok(await section.findItem("simple.jar"), `Library "simple.jar" should be found`); + assert.ok(await waitForTreeItem(section, "simple.jar"), `Library "simple.jar" should be found`); }); it("Test java.project.create", async function() { + await dismissModalDialogIfPresent(); const projectFolder = createTmpProjectFolder("newProject"); await fse.ensureDir(projectFolder); await new Workbench().executeCommand("java.project.create"); @@ -293,17 +313,16 @@ describe("Command Tests", function() { const picks = await inputBox.getQuickPicks(); assert.equal("No build tools", await picks[0].getLabel()); await picks[0].select(); - await sleep(3000); + await sleep(1000); inputBox = await InputBox.create(); await inputBox.setText(projectFolder); await inputBox.confirm(); - await sleep(3000); + await sleep(1000); inputBox = await InputBox.create(); await inputBox.setText(newProjectName); await inputBox.confirm(); - await sleep(5000); - assert.ok(await fse.pathExists(path.join(projectFolder, newProjectName, "src", "App.java")), `The template source file should be created`); - assert.ok(await fse.pathExists(path.join(projectFolder, newProjectName, "README.md")), `The template README file should be created`); + assert.ok(await waitForFileExists(path.join(projectFolder, newProjectName, "src", "App.java")), `The template source file should be created`); + assert.ok(await waitForFileExists(path.join(projectFolder, newProjectName, "README.md")), `The template README file should be created`); }); @@ -327,6 +346,8 @@ async function expandMainCodeInJavaProjects() { } async function expandInJavaProjects(label: string, ...otherLabels: string[]): Promise<[TreeItem, ViewSection]> { + // Dismiss any lingering modal dialog that could block sidebar clicks + await dismissModalDialogIfPresent(); // Collapse file section to make sure that the AppToRename tree item fits in the current viewport. // .findItem will only find tree items in the current viewport. await collapseFileSection(); @@ -384,6 +405,104 @@ async function getActionButton(item: TreeItem, label: string) { return item.findElement(By.xpath(`.//a[contains(@class, 'action-label') and @role='button' and contains(@aria-label, '${label}')]`)); } +async function dismissModalDialogIfPresent() { + try { + const dialog = new ModalDialog(); + const buttons = await dialog.getButtons(); + for (const button of buttons) { + const text = await button.getText(); + if (["Yes, I trust the authors", "OK", "Yes", "Continue", "I Trust the Authors"].includes(text)) { + await button.click(); + await sleep(1000); + return; + } + } + // Dismiss by clicking the first available button as a fallback + if (buttons.length > 0) { + await buttons[0].click(); + await sleep(1000); + } + } catch (_e) { + // No modal dialog present — nothing to dismiss + } +} + +async function waitForTreeItem(section: ViewSection, label: string, timeoutMs = 15000): Promise { + const start = Date.now(); + while (Date.now() - start < timeoutMs) { + const item = await section.findItem(label) as TreeItem; + if (item) { + return item; + } + await sleep(1000); + } + return undefined; +} + +async function waitForTreeItemGone(section: ViewSection, label: string, timeoutMs = 15000): Promise { + const start = Date.now(); + while (Date.now() - start < timeoutMs) { + const item = await section.findItem(label) as TreeItem; + if (!item) { + return true; + } + await sleep(1000); + } + return false; +} + +async function waitForFileExists(filePath: string, timeoutMs = 15000): Promise { + const start = Date.now(); + while (Date.now() - start < timeoutMs) { + if (await fse.pathExists(filePath)) { + return true; + } + await sleep(1000); + } + return false; +} + +async function waitForFileGone(filePath: string, timeoutMs = 15000): Promise { + const start = Date.now(); + while (Date.now() - start < timeoutMs) { + if (!await fse.pathExists(filePath)) { + return true; + } + await sleep(1000); + } + return false; +} + +async function waitForModalDialog(timeoutMs = 10000): Promise { + const start = Date.now(); + while (Date.now() - start < timeoutMs) { + try { + const dialog = new ModalDialog(); + await dialog.getButtons(); + return dialog; + } catch (_e) { + await sleep(500); + } + } + return undefined; +} + +async function waitForEditorTitle(expectedTitle: string, timeoutMs = 15000): Promise { + const start = Date.now(); + while (Date.now() - start < timeoutMs) { + try { + const editor = new TextEditor(); + if (await editor.getTitle() === expectedTitle) { + return editor; + } + } catch (_e) { + // Editor may not be ready yet + } + await sleep(1000); + } + return undefined; +} + async function ensureExplorerIsOpen() { const control = await new ActivityBar().getViewControl('Explorer'); if (control === undefined) { diff --git a/test/ui/index.ts b/test/ui/index.ts index 09de28d9..e8067d24 100644 --- a/test/ui/index.ts +++ b/test/ui/index.ts @@ -1,32 +1,21 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT license. -import * as fse from "fs-extra"; import * as path from "path"; -import * as semver from "semver"; import { ExTester } from "vscode-extension-tester"; /* tslint:disable:no-console */ async function main(): Promise { try { // Run UI command tests - const packageContent = await fse.readFile(path.join(__dirname, "..", "..", "..", "package.json")); - const packageJSON = JSON.parse(packageContent.toString()); - let vscodeVersion = packageJSON.engines.vscode; - if (!vscodeVersion) { - console.log("No valid version of VSCode engine was found in package.json"); - process.exit(1); - } - vscodeVersion = semver.minVersion(vscodeVersion); - const version = vscodeVersion.version; const testPath = path.join(__dirname, "command.test.js"); const exTester = new ExTester(); - await exTester.downloadCode(version); + await exTester.downloadCode(); await exTester.installVsix(); await exTester.installFromMarketplace("redhat.java"); - await exTester.downloadChromeDriver(version); - await exTester.setupRequirements({vscodeVersion: version}); - process.exit(await exTester.runTests(testPath, {vscodeVersion: version, resources: []})); + await exTester.downloadChromeDriver(); + await exTester.setupRequirements(); + process.exit(await exTester.runTests(testPath, {resources: []})); } catch (err) { console.log(err); process.exit(1); diff --git a/tsconfig.json b/tsconfig.json index 20c38219..9e2f8fa8 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -15,7 +15,8 @@ "noImplicitReturns": true, "noUnusedParameters": true, "strictNullChecks": true, - "alwaysStrict": true + "alwaysStrict": true, + "skipLibCheck": true }, "exclude": [ "node_modules", From 1bc6805256771db933db5963babb90c97e7b43cb Mon Sep 17 00:00:00 2001 From: wenyt <75360946+wenytang-ms@users.noreply.github.com> Date: Wed, 25 Mar 2026 14:02:51 +0800 Subject: [PATCH 281/352] ci: separate stable and prerelease release (#979) * ci: separate stable and prerelease * perf: update --- .azure-pipelines/rc.yml | 7 +++++++ package-lock.json | 2 +- package.json | 2 +- scripts/prepare-nightly-build.js | 10 +++++++--- scripts/prepare-stable-build.js | 17 +++++++++++++++++ src/extension.ts | 12 +++++++++--- 6 files changed, 42 insertions(+), 8 deletions(-) create mode 100644 scripts/prepare-stable-build.js diff --git a/.azure-pipelines/rc.yml b/.azure-pipelines/rc.yml index 1f7bd599..07ab4763 100644 --- a/.azure-pipelines/rc.yml +++ b/.azure-pipelines/rc.yml @@ -88,6 +88,13 @@ extends: displayName: Replace AI Key inputs: script: npx json@9.0.6 -I -f package.json -e "this.aiKey=\"%AI_KEY%\"" + - task: PowerShell@2 + displayName: Update package.json for stable + inputs: + targetType: inline + script: |- + node ./scripts/prepare-stable-build.js + Move-Item -Path "./package.stable.json" -Destination "./package.json" -Force - task: CmdLine@2 displayName: vsce package inputs: diff --git a/package-lock.json b/package-lock.json index 1dc95bfe..4078800b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "vscode-java-dependency", - "version": "0.27.0", + "version": "0.27.1", "lockfileVersion": 2, "requires": true, "packages": { diff --git a/package.json b/package.json index 25e76efd..b43d2647 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "vscode-java-dependency", "displayName": "Project Manager for Java", "description": "%description%", - "version": "0.27.0", + "version": "0.27.1", "publisher": "vscjava", "preview": false, "aiKey": "5c642b22-e845-4400-badb-3f8509a70777", diff --git a/scripts/prepare-nightly-build.js b/scripts/prepare-nightly-build.js index 7e40038b..a41983f3 100644 --- a/scripts/prepare-nightly-build.js +++ b/scripts/prepare-nightly-build.js @@ -2,12 +2,15 @@ const fs = require("fs"); const json = JSON.parse(fs.readFileSync("./package.json").toString()); const stableVersion = json.version.match(/(\d+)\.(\d+)\.(\d+)/); +if (!stableVersion) { + throw new Error(`Invalid stable version: ${json.version}`); +} const major = stableVersion[1]; const minor = stableVersion[2]; function prependZero(number) { if (number > 99) { - throw "Unexpected value to prepend with zero"; + throw new Error("Unexpected value to prepend with zero"); } return `${number < 10 ? "0" : ""}${number}`; } @@ -16,10 +19,11 @@ const date = new Date(); const month = date.getMonth() + 1; const day = date.getDate(); const hours = date.getHours(); -patch = `${date.getFullYear()}${prependZero(month)}${prependZero(day)}${prependZero(hours)}`; +const patch = `${date.getFullYear()}${prependZero(month)}${prependZero(day)}${prependZero(hours)}`; const insiderPackageJson = Object.assign(json, { version: `${major}.${minor}.${patch}`, + preview: true, }); -fs.writeFileSync("./package.insiders.json", JSON.stringify(insiderPackageJson)); \ No newline at end of file +fs.writeFileSync("./package.insiders.json", `${JSON.stringify(insiderPackageJson, null, 2)}\n`); \ No newline at end of file diff --git a/scripts/prepare-stable-build.js b/scripts/prepare-stable-build.js new file mode 100644 index 00000000..2596a598 --- /dev/null +++ b/scripts/prepare-stable-build.js @@ -0,0 +1,17 @@ +const fs = require("fs"); + +const packageJsonPath = "./package.json"; +const packageJson = JSON.parse(fs.readFileSync(packageJsonPath).toString()); +packageJson.preview = false; + +if (packageJson.contributes) { + delete packageJson.contributes.languageModelTools; + delete packageJson.contributes.chatSkills; + delete packageJson.contributes.chatInstructions; + + if (packageJson.contributes.configuration && packageJson.contributes.configuration.properties) { + delete packageJson.contributes.configuration.properties["vscode-java-dependency.enableLspTools"]; + } +} + +fs.writeFileSync("./package.stable.json", `${JSON.stringify(packageJson, null, 2)}\n`); diff --git a/src/extension.ts b/src/extension.ts index aa915423..4c5c9637 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -2,8 +2,10 @@ // Licensed under the MIT license. import * as path from "path"; -import { commands, Diagnostic, Extension, ExtensionContext, extensions, languages, - Range, tasks, TextDocument, TextEditor, Uri, window, workspace } from "vscode"; +import { + commands, Diagnostic, Extension, ExtensionContext, extensions, languages, + Range, tasks, TextDocument, TextEditor, Uri, window, workspace +} from "vscode"; import { dispose as disposeTelemetryWrapper, initializeFromJsonFile, instrumentOperation, instrumentOperationAsVsCodeCommand, sendInfo } from "vscode-extension-telemetry-wrapper"; import { Commands, contextManager } from "../extension.bundle"; import { BuildTaskProvider } from "./tasks/build/buildTaskProvider"; @@ -87,9 +89,13 @@ async function activateExtension(_operationId: string, context: ExtensionContext setContextForDeprecatedTasks(); // Register Copilot context providers after Java Language Server is ready + const isPrereleaseBuild = context.extension.packageJSON.preview === true; + if (!isPrereleaseBuild) { + return; + } languageServerApiManager.ready().then((isReady) => { const config = workspace.getConfiguration("vscode-java-dependency"); - const isSettingEnabled = config.get("enableLspTools", true); + const isSettingEnabled = config.get("enableLspTools", false); if (isReady && isSettingEnabled) { registerJavaContextTools(context); } From adf5f07fd2f35b798a0ff8a3eb9faaa7a0b9dc7a Mon Sep 17 00:00:00 2001 From: Frank Liu <63277848+frankliu20@users.noreply.github.com> Date: Wed, 25 Mar 2026 14:57:07 +0800 Subject: [PATCH 282/352] docs: add changelog for PR #971 (#977) * chore: add changelog for PR #971 * Update changelog wording for 0.27.1 --------- Co-authored-by: app_modernization Co-authored-by: wenyt <75360946+wenytang-ms@users.noreply.github.com> --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 25917fde..f46b3c3e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,10 @@ All notable changes to the "vscode-java-dependency" extension will be documented The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/) and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html). +## 0.27.1 + +- Enhancement - Update upgrade prompt after merging extension in https://github.com/microsoft/vscode-java-dependency/pull/971 + ## 0.27.0 - feat - Add CVE checking to notify users to fix the critical/high-severity CVE issues in https://github.com/microsoft/vscode-java-dependency/pull/948 From c677dbcb91fc06cfcbaff4b62f40f2c647cd0f76 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 26 Mar 2026 09:34:59 +0800 Subject: [PATCH 283/352] chore(deps): Bump picomatch from 2.3.1 to 2.3.2 (#980) Bumps [picomatch](https://github.com/micromatch/picomatch) from 2.3.1 to 2.3.2. - [Release notes](https://github.com/micromatch/picomatch/releases) - [Changelog](https://github.com/micromatch/picomatch/blob/master/CHANGELOG.md) - [Commits](https://github.com/micromatch/picomatch/compare/2.3.1...2.3.2) --- updated-dependencies: - dependency-name: picomatch dependency-version: 2.3.2 dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/package-lock.json b/package-lock.json index 4078800b..064a4575 100644 --- a/package-lock.json +++ b/package-lock.json @@ -6,7 +6,7 @@ "packages": { "": { "name": "vscode-java-dependency", - "version": "0.27.0", + "version": "0.27.1", "license": "MIT", "dependencies": { "@github/copilot-language-server": "^1.388.0", @@ -5759,9 +5759,9 @@ "dev": true }, "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", "engines": { "node": ">=8.6" }, @@ -12667,9 +12667,9 @@ "dev": true }, "picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==" + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==" }, "pkg-dir": { "version": "4.2.0", From ff3671a361799c6ef0ee7c826f24d8f5c7f894d8 Mon Sep 17 00:00:00 2001 From: Changyong Gong Date: Mon, 30 Mar 2026 19:39:21 +0800 Subject: [PATCH 284/352] feat: progressive project tree view during import (#982) * feat: progressive project tree view during import Show Java project names in the tree view progressively as they are imported, instead of waiting for the entire import to complete. Key changes: - Use serverRunning() API (v0.14) instead of serverReady() so the tree view can start rendering before import finishes - Add addProgressiveProjects() to create ProjectNode items directly from ProjectsImported notification URIs without querying the server - Guard getChildren() from entering getRootNodes() during progressive loading to avoid blocking on server queries - Keep TreeView progress spinner visible until first items arrive - After import completes, trigger full refresh to replace placeholder items with complete data from the server This reduces perceived loading time for large projects (e.g., 436 Gradle subprojects) from ~7 minutes to ~1 minute. * Downgrade version from 0.27.1 to 0.27.0 * Update version to 0.27.1 in package-lock.json * fix: address review feedback on progressive loading - Extract startServerReadyWait() and call it unconditionally in initializeJavaLanguageServerApis() so isServerReady is set correctly even if onDidProjectsImport fires before ready() (fixes #6) - Restore ready() to not start serverReady() wait inline, keeping its semantics consistent for other callers like syncHandler, upgradeManager, BuildArtifactTaskProvider (fixes #4) - Add .catch() on serverReady().then() to avoid unhandled promise rejections if the server fails to start (fixes #5) - Restore debounce=true on onDidClasspathUpdate when server is ready to avoid burst refreshes (fixes #7) - Add 30s timeout on _progressiveItemsReady await to prevent getChildren() from hanging indefinitely (fixes #2) - Resolve _progressiveItemsReady in doRefresh() to prevent stale getChildren() calls from hanging * fix: remove console.error to satisfy no-console tslint rule * Fix: fall through to getRootNodes() when no progressive items arrive After the 30s timeout, if no progressive notifications were received (e.g., eclipse.jdt.ls progressive notifications not yet available), fall through to the normal getRootNodes() path instead of returning an empty array. This ensures the worst case matches today's behavior. Addresses review comment from wenytang-ms. * Simplify progressive loading: remove timeout fallback and return root items directly --- src/commands.ts | 2 + .../languageServerApiManager.ts | 77 ++++++++++++++++- src/views/dependencyDataProvider.ts | 86 +++++++++++++++++++ 3 files changed, 161 insertions(+), 4 deletions(-) diff --git a/src/commands.ts b/src/commands.ts index ec7934cc..572a81c7 100644 --- a/src/commands.ts +++ b/src/commands.ts @@ -26,6 +26,8 @@ export namespace Commands { export const VIEW_PACKAGE_INTERNAL_REFRESH = "_java.view.package.internal.refresh"; + export const VIEW_PACKAGE_INTERNAL_ADD_PROJECTS = "_java.view.package.internal.addProjects"; + export const VIEW_PACKAGE_OUTLINE = "java.view.package.outline"; export const VIEW_PACKAGE_REVEAL_FILE_OS = "java.view.package.revealFileInOS"; diff --git a/src/languageServerApi/languageServerApiManager.ts b/src/languageServerApi/languageServerApiManager.ts index 494c08a4..7affb88c 100644 --- a/src/languageServerApi/languageServerApiManager.ts +++ b/src/languageServerApi/languageServerApiManager.ts @@ -13,6 +13,8 @@ class LanguageServerApiManager { private extensionApi: any; private isServerReady: boolean = false; + private isServerRunning: boolean = false; + private serverReadyWaitStarted: boolean = false; public async ready(): Promise { if (this.isServerReady) { @@ -28,11 +30,49 @@ class LanguageServerApiManager { return false; } + // Use serverRunning() if available (API >= 0.14) for progressive loading. + // This resolves when the server process is alive and can handle requests, + // even if project imports haven't completed yet. This enables the tree view + // to show projects incrementally as they are imported. + if (!this.isServerRunning && this.extensionApi.serverRunning) { + await this.extensionApi.serverRunning(); + this.isServerRunning = true; + return true; + } + if (this.isServerRunning) { + return true; + } + + // Fallback for older API versions: wait for full server readiness await this.extensionApi.serverReady(); this.isServerReady = true; return true; } + /** + * Start a background wait for full server readiness (import complete). + * When the server finishes importing, trigger a full refresh to replace + * progressive placeholder items with proper data from the server. + * Guarded so it only starts once regardless of call order. + */ + private startServerReadyWait(): void { + if (this.serverReadyWaitStarted || this.isServerReady) { + return; + } + if (this.extensionApi?.serverReady) { + this.serverReadyWaitStarted = true; + this.extensionApi.serverReady() + .then(() => { + this.isServerReady = true; + commands.executeCommand(Commands.VIEW_PACKAGE_INTERNAL_REFRESH, /* debounce = */false); + }) + .catch((_error: unknown) => { + // Server failed to become ready (e.g., startup failure). + // Leave isServerReady as false; progressive items remain as-is. + }); + } + } + public async initializeJavaLanguageServerApis(): Promise { if (this.isApiInitialized()) { return; @@ -49,18 +89,39 @@ class LanguageServerApiManager { } this.extensionApi = extensionApi; + // Start background wait for full server readiness unconditionally. + // This ensures isServerReady is set and final refresh fires even + // if onDidProjectsImport sets isServerRunning before ready() runs. + this.startServerReadyWait(); + if (extensionApi.onDidClasspathUpdate) { const onDidClasspathUpdate: Event = extensionApi.onDidClasspathUpdate; - contextManager.context.subscriptions.push(onDidClasspathUpdate(() => { - commands.executeCommand(Commands.VIEW_PACKAGE_INTERNAL_REFRESH, /* debounce = */true); + contextManager.context.subscriptions.push(onDidClasspathUpdate((uri: Uri) => { + if (this.isServerReady) { + // Server is fully ready — do a normal refresh to get full project data. + commands.executeCommand(Commands.VIEW_PACKAGE_INTERNAL_REFRESH, /* debounce = */true); + } else { + // During import, the server is blocked and can't respond to queries. + // Don't clear progressive items. Try to add the project if not + // already present (typically a no-op since ProjectsImported fires first). + commands.executeCommand(Commands.VIEW_PACKAGE_INTERNAL_ADD_PROJECTS, [uri.toString()]); + } syncHandler.updateFileWatcher(Settings.autoRefresh()); })); } if (extensionApi.onDidProjectsImport) { const onDidProjectsImport: Event = extensionApi.onDidProjectsImport; - contextManager.context.subscriptions.push(onDidProjectsImport(() => { - commands.executeCommand(Commands.VIEW_PACKAGE_INTERNAL_REFRESH, /* debounce = */true); + contextManager.context.subscriptions.push(onDidProjectsImport((uris: Uri[]) => { + // Server is sending project data, so it's definitely running. + // Mark as running so ready() returns immediately on subsequent calls. + this.isServerRunning = true; + // During import, the JDTLS server is blocked by Eclipse workspace + // operations and cannot respond to queries. Instead of triggering + // a refresh (which queries the server), directly add projects to + // the tree view from the notification data. + const projectUris = uris.map(u => u.toString()); + commands.executeCommand(Commands.VIEW_PACKAGE_INTERNAL_ADD_PROJECTS, projectUris); syncHandler.updateFileWatcher(Settings.autoRefresh()); })); } @@ -91,6 +152,14 @@ class LanguageServerApiManager { return this.extensionApi !== undefined; } + /** + * Returns true if the server has fully completed initialization (import finished). + * During progressive loading, this returns false even though ready() has resolved. + */ + public isFullyReady(): boolean { + return this.isServerReady; + } + /** * Check if the language server is ready in the given timeout. * @param timeout the timeout in milliseconds to wait diff --git a/src/views/dependencyDataProvider.ts b/src/views/dependencyDataProvider.ts index 12001be2..0a1ec956 100644 --- a/src/views/dependencyDataProvider.ts +++ b/src/views/dependencyDataProvider.ts @@ -37,11 +37,16 @@ export class DependencyDataProvider implements TreeDataProvider { * `null` means no node is pending. */ private pendingRefreshElement: ExplorerNode | undefined | null; + /** Resolved when the first batch of progressive items arrives. */ + private _progressiveItemsReady: Promise | undefined; + private _resolveProgressiveItems: (() => void) | undefined; constructor(public readonly context: ExtensionContext) { // commands that do not send back telemetry context.subscriptions.push(commands.registerCommand(Commands.VIEW_PACKAGE_INTERNAL_REFRESH, (debounce?: boolean, element?: ExplorerNode) => this.refresh(debounce, element))); + context.subscriptions.push(commands.registerCommand(Commands.VIEW_PACKAGE_INTERNAL_ADD_PROJECTS, (projectUris: string[]) => + this.addProgressiveProjects(projectUris))); context.subscriptions.push(commands.registerCommand(Commands.EXPORT_JAR_REPORT, (terminalId: string, message: string) => { appendOutput(terminalId, message); })); @@ -117,10 +122,35 @@ export class DependencyDataProvider implements TreeDataProvider { } public async getChildren(element?: ExplorerNode): Promise { + // Fast path: if root items are already populated by progressive loading + // (addProgressiveProjects), return them directly without querying the + // server, which may be blocked during long-running imports. + if (!element && this._rootItems && this._rootItems.length > 0) { + explorerNodeCache.saveNodes(this._rootItems); + return this._rootItems; + } + if (!await languageServerApiManager.ready()) { return []; } + // During progressive loading (server running but not fully ready after + // a clean workspace), don't enter getRootNodes() — its server queries + // will block for the entire import duration. Instead, keep the TreeView + // progress spinner visible by awaiting until the first progressive + // notification delivers items. + if (!element && !languageServerApiManager.isFullyReady()) { + if (!this._rootItems || this._rootItems.length === 0) { + if (!this._progressiveItemsReady) { + this._progressiveItemsReady = new Promise((resolve) => { + this._resolveProgressiveItems = resolve; + }); + } + await this._progressiveItemsReady; + } + return this._rootItems || []; + } + const children = (!this._rootItems || !element) ? await this.getRootNodes() : await element.getChildren(); @@ -167,12 +197,68 @@ export class DependencyDataProvider implements TreeDataProvider { private doRefresh(element?: ExplorerNode): void { if (!element) { this._rootItems = undefined; + // Resolve any pending progressive await so getChildren() doesn't hang + if (this._resolveProgressiveItems) { + this._resolveProgressiveItems(); + this._resolveProgressiveItems = undefined; + this._progressiveItemsReady = undefined; + } } explorerNodeCache.removeNodeChildren(element); this._onDidChangeTreeData.fire(element); this.pendingRefreshElement = null; } + /** + * Add projects progressively from ProjectsImported notifications. + * This directly creates ProjectNode items from URIs without querying + * the JDTLS server, which may be blocked during long-running imports. + */ + public addProgressiveProjects(projectUris: string[]): void { + const folders = workspace.workspaceFolders; + if (!folders || !folders.length) { + return; + } + + if (!this._rootItems) { + this._rootItems = []; + } + + const existingUris = new Set( + this._rootItems + .filter((n): n is ProjectNode => n instanceof ProjectNode) + .map((n) => n.uri) + ); + + let added = false; + for (const uriStr of projectUris) { + if (existingUris.has(uriStr)) { + continue; + } + // Extract project name from URI (last non-empty path segment) + const name = uriStr.replace(/\/+$/, "").split("/").pop() || "unknown"; + const nodeData: INodeData = { + name, + uri: uriStr, + kind: NodeKind.Project, + }; + this._rootItems.push(new ProjectNode(nodeData, undefined)); + existingUris.add(uriStr); + added = true; + } + + if (added) { + // Resolve the pending getChildren() promise so the TreeView + // spinner stops and items appear. + if (this._resolveProgressiveItems) { + this._resolveProgressiveItems(); + this._resolveProgressiveItems = undefined; + this._progressiveItemsReady = undefined; + } + this._onDidChangeTreeData.fire(undefined); + } + } + private async getRootNodes(): Promise { try { await explorerLock.acquireAsync(); From abf89fd9c62123fd55de3fe544a23a6d9f0a8cfc Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 31 Mar 2026 09:11:39 +0800 Subject: [PATCH 285/352] chore(deps): Bump brace-expansion (#983) Bumps and [brace-expansion](https://github.com/juliangruber/brace-expansion). These dependencies needed to be updated together. Updates `brace-expansion` from 2.0.2 to 2.0.3 - [Release notes](https://github.com/juliangruber/brace-expansion/releases) - [Commits](https://github.com/juliangruber/brace-expansion/compare/v2.0.2...v2.0.3) Updates `brace-expansion` from 1.1.12 to 1.1.13 - [Release notes](https://github.com/juliangruber/brace-expansion/releases) - [Commits](https://github.com/juliangruber/brace-expansion/compare/v2.0.2...v2.0.3) Updates `brace-expansion` from 5.0.4 to 5.0.5 - [Release notes](https://github.com/juliangruber/brace-expansion/releases) - [Commits](https://github.com/juliangruber/brace-expansion/compare/v2.0.2...v2.0.3) --- updated-dependencies: - dependency-name: brace-expansion dependency-version: 2.0.3 dependency-type: indirect - dependency-name: brace-expansion dependency-version: 1.1.13 dependency-type: indirect - dependency-name: brace-expansion dependency-version: 5.0.5 dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Changyong Gong --- package-lock.json | 91 ++++++++++++++++++++++------------------------- 1 file changed, 42 insertions(+), 49 deletions(-) diff --git a/package-lock.json b/package-lock.json index 064a4575..2bea9b8d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1641,11 +1641,10 @@ ] }, "node_modules/@vscode/vsce/node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.13.tgz", + "integrity": "sha512-9ZLprWS6EENmhEOpjCYW2c8VkmOvckIJZfkr7rBW6dObmfgJ/L1GpSYW5Hpo9lDz4D1+n0Ckz8rU7FwHDQiG/w==", "dev": true, - "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -1697,11 +1696,10 @@ } }, "node_modules/@vscode/vsce/node_modules/glob/node_modules/brace-expansion": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.4.tgz", - "integrity": "sha512-h+DEnpVvxmfVefa4jFbCf5HdH5YMDXRsmKflpf1pILZWRFlTbJpxeU55nJl4Smt5HQaGzg1o6RHFPJaOqnmBDg==", + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.5.tgz", + "integrity": "sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ==", "dev": true, - "license": "MIT", "dependencies": { "balanced-match": "^4.0.2" }, @@ -2236,10 +2234,9 @@ "license": "BSD-2-Clause" }, "node_modules/brace-expansion": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", - "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", - "license": "MIT", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.3.tgz", + "integrity": "sha512-MCV/fYJEbqx68aE58kv2cA/kiky1G8vux3OR6/jbS+jIMe/6fJWa0DTzJU7dqijOWYwHi1t29FlfYI9uytqlpA==", "dependencies": { "balanced-match": "^1.0.0" } @@ -3805,11 +3802,10 @@ "dev": true }, "node_modules/glob/node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.13.tgz", + "integrity": "sha512-9ZLprWS6EENmhEOpjCYW2c8VkmOvckIJZfkr7rBW6dObmfgJ/L1GpSYW5Hpo9lDz4D1+n0Ckz8rU7FwHDQiG/w==", "dev": true, - "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -7334,11 +7330,10 @@ } }, "node_modules/test-exclude/node_modules/brace-expansion": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.4.tgz", - "integrity": "sha512-h+DEnpVvxmfVefa4jFbCf5HdH5YMDXRsmKflpf1pILZWRFlTbJpxeU55nJl4Smt5HQaGzg1o6RHFPJaOqnmBDg==", + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.5.tgz", + "integrity": "sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ==", "dev": true, - "license": "MIT", "dependencies": { "balanced-match": "^4.0.2" }, @@ -7553,11 +7548,10 @@ } }, "node_modules/tslint/node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.13.tgz", + "integrity": "sha512-9ZLprWS6EENmhEOpjCYW2c8VkmOvckIJZfkr7rBW6dObmfgJ/L1GpSYW5Hpo9lDz4D1+n0Ckz8rU7FwHDQiG/w==", "dev": true, - "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -7990,11 +7984,10 @@ } }, "node_modules/vscode-extension-tester/node_modules/brace-expansion": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.4.tgz", - "integrity": "sha512-h+DEnpVvxmfVefa4jFbCf5HdH5YMDXRsmKflpf1pILZWRFlTbJpxeU55nJl4Smt5HQaGzg1o6RHFPJaOqnmBDg==", + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.5.tgz", + "integrity": "sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ==", "dev": true, - "license": "MIT", "dependencies": { "balanced-match": "^4.0.2" }, @@ -9744,9 +9737,9 @@ }, "dependencies": { "brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.13.tgz", + "integrity": "sha512-9ZLprWS6EENmhEOpjCYW2c8VkmOvckIJZfkr7rBW6dObmfgJ/L1GpSYW5Hpo9lDz4D1+n0Ckz8rU7FwHDQiG/w==", "dev": true, "requires": { "balanced-match": "^1.0.0", @@ -9780,9 +9773,9 @@ "dev": true }, "brace-expansion": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.4.tgz", - "integrity": "sha512-h+DEnpVvxmfVefa4jFbCf5HdH5YMDXRsmKflpf1pILZWRFlTbJpxeU55nJl4Smt5HQaGzg1o6RHFPJaOqnmBDg==", + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.5.tgz", + "integrity": "sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ==", "dev": true, "requires": { "balanced-match": "^4.0.2" @@ -10282,9 +10275,9 @@ "dev": true }, "brace-expansion": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", - "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.3.tgz", + "integrity": "sha512-MCV/fYJEbqx68aE58kv2cA/kiky1G8vux3OR6/jbS+jIMe/6fJWa0DTzJU7dqijOWYwHi1t29FlfYI9uytqlpA==", "requires": { "balanced-match": "^1.0.0" } @@ -11306,9 +11299,9 @@ }, "dependencies": { "brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.13.tgz", + "integrity": "sha512-9ZLprWS6EENmhEOpjCYW2c8VkmOvckIJZfkr7rBW6dObmfgJ/L1GpSYW5Hpo9lDz4D1+n0Ckz8rU7FwHDQiG/w==", "dev": true, "requires": { "balanced-match": "^1.0.0", @@ -13706,9 +13699,9 @@ "dev": true }, "brace-expansion": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.4.tgz", - "integrity": "sha512-h+DEnpVvxmfVefa4jFbCf5HdH5YMDXRsmKflpf1pILZWRFlTbJpxeU55nJl4Smt5HQaGzg1o6RHFPJaOqnmBDg==", + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.5.tgz", + "integrity": "sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ==", "dev": true, "requires": { "balanced-match": "^4.0.2" @@ -13862,9 +13855,9 @@ } }, "brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.13.tgz", + "integrity": "sha512-9ZLprWS6EENmhEOpjCYW2c8VkmOvckIJZfkr7rBW6dObmfgJ/L1GpSYW5Hpo9lDz4D1+n0Ckz8rU7FwHDQiG/w==", "dev": true, "requires": { "balanced-match": "^1.0.0", @@ -14175,9 +14168,9 @@ "dev": true }, "brace-expansion": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.4.tgz", - "integrity": "sha512-h+DEnpVvxmfVefa4jFbCf5HdH5YMDXRsmKflpf1pILZWRFlTbJpxeU55nJl4Smt5HQaGzg1o6RHFPJaOqnmBDg==", + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.5.tgz", + "integrity": "sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ==", "dev": true, "requires": { "balanced-match": "^4.0.2" From c942b47202b3864bc6089594ddba45cc2efb5145 Mon Sep 17 00:00:00 2001 From: wenyt <75360946+wenytang-ms@users.noreply.github.com> Date: Wed, 1 Apr 2026 12:59:45 +0800 Subject: [PATCH 286/352] test: upgrade e2e test framework (#985) * test: upgrade e2e test framework * test: add screen shot * test: update * ci: update pipeline * ci: update pipeline * test: update * test: update * test: update * test: update * test: update test case * fix: update * test: update * docs: remove agents.md * fix: use context menus for rename/delete, skip native dialog test - Rename/delete commands have 'when: false' in command palette, so executeCommand cannot find them. Use right-click context menu instead, matching the approach used in the old UI test suite. - Skip 'create with no build tools' test because scaffoldSimpleProject() opens a native OS file dialog that Playwright cannot automate. - Add selectContextMenuItem() helper to VscodeOperator. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * fix: click menuitem role instead of action-item container The .action-item div is a presentation container; VS Code only handles click events on the inner anchor. Use getByRole to find and click the correct element, and wait for menu dismissal to confirm the click registered. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * fix: use keyboard shortcuts instead of context menu clicks Playwright's click() does not reliably trigger actions on VS Code Electron context menu items (the menu stays open). Switch to: 1. Right-click to select tree item and set focusedView 2. Escape to close context menu (returns focus to tree) 3. F2/Delete keyboard shortcut to trigger rename/delete commands Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * fix: use dispatchEvent mouseup for context menu items VS Code menus internally handle mouseup events, not click events. Playwright's simulated .click() in Electron does not reliably trigger the mouseup handler. Use dispatchEvent('mouseup') to directly dispatch the event that VS Code's menu system listens for. Previous approaches that failed: - .click() on .action-item container: menu stays open - getByRole('menuitem').click(): menu stays open - keyboard shortcut (F2/Delete): focusedView not set after Escape Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * fix: use page.mouse.click with bounding box for context menu Neither .click(), dispatchEvent('mouseup'), nor keyboard shortcuts reliably trigger VS Code Electron context menu items via Playwright. Switch to raw page.mouse.click() at the element's bounding box center coordinates, which sends CDP-level InputDispatchMouseEvent that Electron's native event handling processes correctly. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * fix: context menu click with hover+focused wait, auto-dismiss native dialogs Root causes found and fixed: 1. Context menu click requires hover first to trigger VS Code's menu focus state (.action-item.focused), then click works reliably. 2. redhat.java shows an Electron native dialog (dialog.showMessageBox) for refactoring confirmation on file rename. Playwright Page API cannot interact with native dialogs. Monkey-patch showMessageBox in the Electron main process to auto-return OK. Verified locally: both rename and delete tests pass. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * fix: find OK button by label in showMessageBox, handle Refactor Preview On Linux the button order in dialog.showMessageBox differs from Windows, so response:0 selects 'Show Preview' instead of 'OK'. Fix by scanning the buttons array for the 'OK' label. Also handle the Refactor Preview panel (Apply/Discard) as a fallback in case the dialog still enters preview mode. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * fix: match Delete/Move to Trash in showMessageBox monkey-patch On Linux CI (headless, no recycle bin), the delete confirmation uses 'Delete' or 'Move to Trash' as button labels, not 'OK'. Expand the regex to match all known confirm labels. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * refactor: address PR review comments - Remove unused imports in fileOperations.test.ts and libraries.test.ts - Clean up skipped test bodies and dead beforeEach in libraries.test.ts - Fix JSDoc comment in vscodeOperator.ts to reflect actual CSS fallbacks - Increase Playwright timeout from 180s to 240s for LS readiness margin - Remove cliArgs spread from Electron launch (avoid CLI-only flags) - Remove VSIX install from globalSetup (extensionDevelopmentPath suffices) Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --------- Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .github/workflows/linuxUI.yml | 40 +--- .github/workflows/windowsUI.yml | 40 +--- package.json | 2 + test/e2e/fixtures/baseTest.ts | 201 ++++++++++++++++++ test/e2e/globalSetup.ts | 34 +++ test/e2e/playwright.config.ts | 29 +++ test/e2e/tests/fileOperations.test.ts | 130 ++++++++++++ test/e2e/tests/libraries.test.ts | 39 ++++ test/e2e/tests/projectExplorer.test.ts | 62 ++++++ test/e2e/utils/constants.ts | 61 ++++++ test/e2e/utils/javaOperator.ts | 145 +++++++++++++ test/e2e/utils/vscodeOperator.ts | 283 +++++++++++++++++++++++++ test/simple/.project | 39 ++-- tsconfig.json | 3 +- 14 files changed, 1031 insertions(+), 77 deletions(-) create mode 100644 test/e2e/fixtures/baseTest.ts create mode 100644 test/e2e/globalSetup.ts create mode 100644 test/e2e/playwright.config.ts create mode 100644 test/e2e/tests/fileOperations.test.ts create mode 100644 test/e2e/tests/libraries.test.ts create mode 100644 test/e2e/tests/projectExplorer.test.ts create mode 100644 test/e2e/utils/constants.ts create mode 100644 test/e2e/utils/javaOperator.ts create mode 100644 test/e2e/utils/vscodeOperator.ts diff --git a/.github/workflows/linuxUI.yml b/.github/workflows/linuxUI.yml index b8c5f837..cb09c4f5 100644 --- a/.github/workflows/linuxUI.yml +++ b/.github/workflows/linuxUI.yml @@ -44,35 +44,13 @@ jobs: - name: Build VSIX file run: vsce package - - name: UI Test - continue-on-error: true - id: test - run: DISPLAY=:99 npm run test-ui + - name: E2E Test (Playwright) + run: DISPLAY=:99 npm run test-e2e - - name: Retry UI Test 1 - continue-on-error: true - if: steps.test.outcome=='failure' - id: retry1 - run: | - git reset --hard - git clean -fd - DISPLAY=:99 npm run test-ui - - - name: Retry UI Test 2 - continue-on-error: true - if: steps.retry1.outcome=='failure' - id: retry2 - run: | - git reset --hard - git clean -fd - DISPLAY=:99 npm run test-ui - - - name: Set test status - if: ${{ steps.test.outcome=='failure' && steps.retry1.outcome=='failure' && steps.retry2.outcome=='failure' }} - run: | - echo "Tests failed" - exit 1 - - - name: Print language server Log - if: ${{ failure() }} - run: find ./test-resources/settings/User/workspaceStorage/*/redhat.java/jdt_ws/.metadata/.log -print -exec cat '{}' \;; + - name: Upload test results + if: ${{ always() }} + uses: actions/upload-artifact@v4 + with: + name: e2e-results-linux + path: test-results/ + retention-days: 7 diff --git a/.github/workflows/windowsUI.yml b/.github/workflows/windowsUI.yml index a952e1a7..aad11d73 100644 --- a/.github/workflows/windowsUI.yml +++ b/.github/workflows/windowsUI.yml @@ -44,35 +44,13 @@ jobs: - name: Build VSIX file run: vsce package - - name: UI Test - continue-on-error: true - id: test - run: npm run test-ui + - name: E2E Test (Playwright) + run: npm run test-e2e - - name: Retry UI Test 1 - continue-on-error: true - if: steps.test.outcome=='failure' - id: retry1 - run: | - git reset --hard - git clean -fd - npm run test-ui - - - name: Retry UI Test 2 - continue-on-error: true - if: steps.retry1.outcome=='failure' - id: retry2 - run: | - git reset --hard - git clean -fd - npm run test-ui - - - name: Set test status - if: ${{ steps.test.outcome=='failure' && steps.retry1.outcome=='failure' && steps.retry2.outcome=='failure' }} - run: | - echo "Tests failed" - exit 1 - - - name: Print language server Log if job failed - if: ${{ failure() }} - run: Get-ChildItem -Path ./test-resources/settings/User/workspaceStorage/*/redhat.java/jdt_ws/.metadata/.log | cat + - name: Upload test results + if: ${{ always() }} + uses: actions/upload-artifact@v4 + with: + name: e2e-results-windows + path: test-results/ + retention-days: 7 diff --git a/package.json b/package.json index b43d2647..e8d02977 100644 --- a/package.json +++ b/package.json @@ -1263,6 +1263,7 @@ "watch": "webpack --mode development --watch", "test": "tsc -p . && webpack --config webpack.config.js --mode development && node ./dist/test/index.js", "test-ui": "tsc -p . && webpack --config webpack.config.js --mode development && node ./dist/test/ui/index.js", + "test-e2e": "npx playwright test --config test/e2e/playwright.config.ts", "build-server": "node scripts/buildJdtlsExt.js", "vscode:prepublish": "tsc -p ./ && webpack --mode production", "tslint": "tslint -t verbose --project tsconfig.json" @@ -1284,6 +1285,7 @@ "tslint": "^6.1.3", "typescript": "^4.9.4", "vscode-extension-tester": "^8.23.0", + "@playwright/test": "^1.50.0", "webpack": "^5.105.0", "webpack-cli": "^4.10.0" }, diff --git a/test/e2e/fixtures/baseTest.ts b/test/e2e/fixtures/baseTest.ts new file mode 100644 index 00000000..2d33a497 --- /dev/null +++ b/test/e2e/fixtures/baseTest.ts @@ -0,0 +1,201 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT license. + +/** + * Playwright test fixture that launches VS Code via Electron, + * opens a temporary copy of a test project, and tears everything + * down after the test. + * + * Usage in test files: + * + * import { test, expect } from "../fixtures/baseTest"; + * + * test("my test", async ({ page }) => { + * // `page` is a Playwright Page attached to VS Code + * }); + */ + +import { _electron, test as base, type Page } from "@playwright/test"; +import { downloadAndUnzipVSCode } from "@vscode/test-electron"; +import * as fs from "fs-extra"; +import * as os from "os"; +import * as path from "path"; + +export { expect } from "@playwright/test"; + +// Root of the extension source tree +const EXTENSION_ROOT = path.join(__dirname, "..", "..", ".."); +// Root of the test data projects +const TEST_DATA_ROOT = path.join(EXTENSION_ROOT, "test"); + +export type TestOptions = { + /** VS Code version to download, default "stable" */ + vscodeVersion: string; + /** Relative path under `test/` to the project to open (e.g. "maven") */ + testProjectDir: string; +}; + +type TestFixtures = TestOptions & { + /** Playwright Page connected to the VS Code Electron window */ + page: Page; +}; + +export const test = base.extend({ + vscodeVersion: [process.env.VSCODE_VERSION || "stable", { option: true }], + testProjectDir: ["maven", { option: true }], + + page: async ({ vscodeVersion, testProjectDir }, use, testInfo) => { + // 1. Create a temp directory and copy the test project into it. + const tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), "java-dep-e2e-")); + const projectName = path.basename(testProjectDir); + const projectDir = path.join(tmpDir, projectName); + fs.copySync(path.join(TEST_DATA_ROOT, testProjectDir), projectDir); + + // Write VS Code settings to suppress telemetry prompts and notification noise + const vscodeDir = path.join(projectDir, ".vscode"); + fs.ensureDirSync(vscodeDir); + const settingsPath = path.join(vscodeDir, "settings.json"); + let existingSettings: Record = {}; + if (fs.existsSync(settingsPath)) { + // settings.json may contain JS-style comments (JSONC), strip them before parsing + const raw = fs.readFileSync(settingsPath, "utf-8"); + const stripped = raw.replace(/\/\/.*$/gm, "").replace(/\/\*[\s\S]*?\*\//g, ""); + try { + existingSettings = JSON.parse(stripped); + } catch { + // If still invalid, start fresh — our injected settings are more important + existingSettings = {}; + } + } + const mergedSettings = { + ...existingSettings, + "telemetry.telemetryLevel": "off", + "redhat.telemetry.enabled": false, + "workbench.colorTheme": "Default Dark Modern", + "update.mode": "none", + "extensions.ignoreRecommendations": true, + }; + fs.writeFileSync(settingsPath, JSON.stringify(mergedSettings, null, 4)); + + // 2. Resolve VS Code executable. + const vscodePath = await downloadAndUnzipVSCode(vscodeVersion); + // resolveCliArgsFromVSCodeExecutablePath returns CLI-specific args + // (e.g. --ms-enable-electron-run-as-node) that are unsuitable for + // Electron UI launch. Extract only --extensions-dir and --user-data-dir. + const vscodeTestDir = path.join(EXTENSION_ROOT, ".vscode-test"); + const extensionsDir = path.join(vscodeTestDir, "extensions"); + const userDataDir = path.join(vscodeTestDir, "user-data"); + + // 3. Launch VS Code as an Electron app. + const electronApp = await _electron.launch({ + executablePath: vscodePath, + env: { ...process.env, NODE_ENV: "development" }, + args: [ + "--no-sandbox", + "--disable-gpu-sandbox", + "--disable-updates", + "--skip-welcome", + "--skip-release-notes", + "--disable-workspace-trust", + "--password-store=basic", + // Suppress notifications that block UI interactions + "--disable-telemetry", + `--extensions-dir=${extensionsDir}`, + `--user-data-dir=${userDataDir}`, + `--extensionDevelopmentPath=${EXTENSION_ROOT}`, + projectDir, + ], + }); + + const page = await electronApp.firstWindow(); + + // Auto-dismiss Electron native dialogs (e.g. redhat.java refactoring + // confirmation, delete file confirmation). These dialogs are outside + // the renderer DOM and cannot be handled via Playwright Page API. + // Monkey-patch dialog.showMessageBox to find and click the confirm + // button by label, falling back to the first button. + await electronApp.evaluate(({ dialog }) => { + const confirmLabels = /^(OK|Delete|Move to Recycle Bin|Move to Trash)$/i; + dialog.showMessageBox = async (_win: any, opts: any) => { + const options = opts || _win; + const buttons: string[] = options?.buttons || []; + let idx = buttons.findIndex((b: string) => confirmLabels.test(b)); + if (idx < 0) idx = 0; + return { response: idx, checkboxChecked: true }; + }; + dialog.showMessageBoxSync = (_win: any, opts: any) => { + const options = opts || _win; + const buttons: string[] = options?.buttons || []; + let idx = buttons.findIndex((b: string) => confirmLabels.test(b)); + if (idx < 0) idx = 0; + return idx; + }; + }); + + // Dismiss any startup notifications/dialogs before handing off to tests + await page.waitForTimeout(3_000); + await dismissAllNotifications(page); + + // 4. Optional tracing + if (testInfo.retry > 0 || !process.env.CI) { + await page.context().tracing.start({ screenshots: true, snapshots: true, title: testInfo.title }); + } + + // ---- hand off to the test ---- + await use(page); + + // ---- teardown ---- + // Save trace on failure/retry + if (testInfo.status !== "passed" || testInfo.retry > 0) { + const tracePath = testInfo.outputPath("trace.zip"); + try { + await page.context().tracing.stop({ path: tracePath }); + testInfo.attachments.push({ name: "trace", path: tracePath, contentType: "application/zip" }); + } catch { + // Tracing may not have been started + } + } + + await electronApp.close(); + + // Clean up temp directory + try { + fs.rmSync(tmpDir, { force: true, recursive: true }); + } catch (e) { + console.warn(`Warning: failed to clean up ${tmpDir}: ${e}`); + } + }, +}); + +/** + * Dismiss all VS Code notification toasts (telemetry prompts, theme suggestions, etc.). + * These notifications can steal focus and block Quick Open / Command Palette interactions. + */ +async function dismissAllNotifications(page: Page): Promise { + try { + // Click "Clear All Notifications" if the notification center button is visible + const clearAll = page.locator(".notifications-toasts .codicon-notifications-clear-all, .notification-toast .codicon-close"); + let count = await clearAll.count().catch(() => 0); + while (count > 0) { + await clearAll.first().click(); + await page.waitForTimeout(500); + count = await clearAll.count().catch(() => 0); + } + + // Also try the command palette approach as a fallback + const notificationToasts = page.locator(".notification-toast"); + if (await notificationToasts.count().catch(() => 0) > 0) { + // Use keyboard shortcut to clear all notifications + await page.keyboard.press("Control+Shift+P"); + const input = page.locator(".quick-input-widget input.input"); + if (await input.isVisible({ timeout: 3_000 }).catch(() => false)) { + await input.fill("Notifications: Clear All Notifications"); + await page.waitForTimeout(500); + await input.press("Enter"); + await page.waitForTimeout(500); + } + } + } catch { + // Best effort + } +} diff --git a/test/e2e/globalSetup.ts b/test/e2e/globalSetup.ts new file mode 100644 index 00000000..37eabd23 --- /dev/null +++ b/test/e2e/globalSetup.ts @@ -0,0 +1,34 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT license. + +import { downloadAndUnzipVSCode, resolveCliArgsFromVSCodeExecutablePath } from "@vscode/test-electron"; +import * as childProcess from "child_process"; + +/** + * Global setup runs once before all test files. + * It downloads VS Code and installs the redhat.java extension so that + * every test run starts from an identical, pre-provisioned state. + * + * Our own extension is loaded at launch time via --extensionDevelopmentPath + * (see baseTest.ts), so there is no need to install a VSIX here. + */ +export default async function globalSetup(): Promise { + // Download VS Code stable (or the version configured via VSCODE_VERSION env). + const vscodeVersion = process.env.VSCODE_VERSION || "stable"; + console.log(`[globalSetup] Downloading VS Code ${vscodeVersion}…`); + const vscodePath = await downloadAndUnzipVSCode(vscodeVersion); + const [cli, ...cliArgs] = resolveCliArgsFromVSCodeExecutablePath(vscodePath); + + // On Windows, the CLI is a .cmd batch file which requires shell: true. + const isWindows = process.platform === "win32"; + const execOptions: childProcess.ExecFileSyncOptions = { + encoding: "utf-8", + stdio: "inherit", + timeout: 120_000, + shell: isWindows, + }; + + // Install the Language Support for Java extension from the Marketplace. + console.log("[globalSetup] Installing redhat.java extension…"); + childProcess.execFileSync(cli, [...cliArgs, "--install-extension", "redhat.java"], execOptions); +} diff --git a/test/e2e/playwright.config.ts b/test/e2e/playwright.config.ts new file mode 100644 index 00000000..91b6e7eb --- /dev/null +++ b/test/e2e/playwright.config.ts @@ -0,0 +1,29 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT license. + +import { defineConfig } from "@playwright/test"; +import * as path from "path"; + +export default defineConfig({ + testDir: path.join(__dirname, "tests"), + reporter: process.env.CI + ? [["list"], ["junit", { outputFile: path.join(__dirname, "..", "..", "test-results", "e2e-results.xml") }]] + : "list", + // Java Language Server can take 2-3 minutes to fully index on first run. + timeout: 240_000, + // Run tests sequentially — launching multiple VS Code instances is too resource-heavy. + workers: 1, + // Allow one retry in CI to handle transient environment issues. + retries: process.env.CI ? 1 : 0, + expect: { + timeout: 30_000, + }, + globalSetup: path.join(__dirname, "globalSetup.ts"), + use: { + // Automatically take a screenshot when a test fails. + screenshot: "only-on-failure", + // Capture full trace on retry for deep debugging (includes screenshots, DOM snapshots, network). + trace: "on-first-retry", + }, + outputDir: path.join(__dirname, "..", "..", "test-results", "e2e"), +}); diff --git a/test/e2e/tests/fileOperations.test.ts b/test/e2e/tests/fileOperations.test.ts new file mode 100644 index 00000000..97998e2e --- /dev/null +++ b/test/e2e/tests/fileOperations.test.ts @@ -0,0 +1,130 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT license. + +/** + * E2E tests for file / resource operations in the Java Projects view. + * + * Covers: + * - java.view.package.newJavaClass + * - java.view.package.newPackage + * - java.view.package.renameFile + * - java.view.package.moveFileToTrash + */ + +import { test, expect } from "../fixtures/baseTest"; +import { Timeout, VSCode } from "../utils/constants"; +import JavaOperator from "../utils/javaOperator"; +import VscodeOperator from "../utils/vscodeOperator"; + +test.describe("File Operations", () => { + + test.use({ testProjectDir: "maven" }); + + test.beforeEach(async ({ page }) => { + await VscodeOperator.dismissModalDialog(page); + await JavaOperator.openFile(page, "App.java"); + await JavaOperator.waitForJavaLSReady(page); + await JavaOperator.focusJavaProjects(page); + }); + + test("create new Java class", async ({ page }) => { + // Trigger New... on the project node + await JavaOperator.triggerNewResource(page, "my-app"); + + // Select "Java Class" (first item) + await VscodeOperator.selectQuickPickIndex(page, 0); + + // Select source folder "src/main/java" + await VscodeOperator.selectQuickPickItem(page, "src/main/java"); + + // Type class name and confirm + await VscodeOperator.fillQuickInput(page, "App2"); + + // Editor should open with the new file + const tabFound = await VscodeOperator.waitForEditorTab(page, "App2.java"); + expect(tabFound).toBeTruthy(); + }); + + test("create new package", async ({ page }) => { + await JavaOperator.triggerNewResource(page, "my-app"); + + // Select "Package" + await VscodeOperator.selectQuickPickItem(page, "Package"); + + // Select source folder + await VscodeOperator.selectQuickPickItem(page, "src/main/java"); + + // Type package name and confirm + await VscodeOperator.fillQuickInput(page, "com.mycompany.newpkg"); + + // Wait briefly for directory creation + await page.waitForTimeout(Timeout.TREE_EXPAND); + }); + + test("rename Java file", async ({ page }) => { + await JavaOperator.collapseFileExplorer(page); + + // Expand to AppToRename + await JavaOperator.expandTreePath(page, "my-app", "src/main/java", "com.mycompany.app"); + + // Right-click AppToRename to select it AND open the context menu. + // We do NOT left-click first because that opens the file in the editor + // and steals focus away from the tree view. + const appToRename = page.getByRole(VSCode.TREE_ITEM_ROLE, { name: "AppToRename" }).first(); + await VscodeOperator.selectContextMenuItem(page, appToRename, /^Rename/); + + // The extension shows a showInputBox (quick-input) for the new name + await VscodeOperator.fillQuickInput(page, "AppRenamed"); + + // Handle extension's own rename confirmation dialog if it appears. + // The Electron native refactoring dialog from redhat.java is + // auto-dismissed by the showMessageBox monkey-patch in baseTest.ts. + try { + await VscodeOperator.clickDialogButton(page, "OK", 5_000); + } catch { + // Dialog may not appear in all cases + } + + // On Linux, if the refactoring dialog resolved to "Show Preview", + // VS Code shows a Refactor Preview panel with "Apply" / "Discard" + // buttons. Click "Apply" to complete the rename. + try { + const applyBtn = page.getByRole(VSCode.BUTTON_ROLE, { name: "Apply" }); + if (await applyBtn.isVisible({ timeout: 3_000 }).catch(() => false)) { + await applyBtn.click(); + await page.waitForTimeout(Timeout.CLICK); + } + } catch { + // No refactor preview + } + + // Editor should open with renamed file + const tabFound = await VscodeOperator.waitForEditorTab(page, "AppRenamed.java"); + expect(tabFound).toBeTruthy(); + }); + + test("delete Java file", async ({ page }) => { + await JavaOperator.collapseFileExplorer(page); + await JavaOperator.expandTreePath(page, "my-app", "src/main/java", "com.mycompany.app"); + + // Right-click AppToDelete directly (no left-click to avoid opening + // the file and losing tree focus). + const appToDelete = page.getByRole(VSCode.TREE_ITEM_ROLE, { name: "AppToDelete" }).first(); + await VscodeOperator.selectContextMenuItem(page, appToDelete, /^Delete/); + + // Confirm deletion in dialog + try { + const dialog = page.locator(".monaco-dialog-box"); + await dialog.waitFor({ state: "visible", timeout: 5_000 }); + const confirmBtn = dialog.getByRole(VSCode.BUTTON_ROLE) + .filter({ hasText: /Move to Trash|Move to Recycle Bin|Delete|OK/ }); + await confirmBtn.first().click(); + } catch { + // Dialog may not appear + } + + // Wait for tree item to disappear + const gone = await VscodeOperator.waitForTreeItemGone(page, "AppToDelete"); + expect(gone).toBeTruthy(); + }); +}); diff --git a/test/e2e/tests/libraries.test.ts b/test/e2e/tests/libraries.test.ts new file mode 100644 index 00000000..0fb5844e --- /dev/null +++ b/test/e2e/tests/libraries.test.ts @@ -0,0 +1,39 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT license. + +/** + * E2E tests for library management and project creation. + * + * Covers: + * - java.project.addLibraries + * - java.project.addLibraryFolders + * - java.project.create + */ + +import { test } from "../fixtures/baseTest"; + +test.describe("Libraries & Project Creation", () => { + + test.describe("invisible project library management", () => { + + test.use({ testProjectDir: "invisible" }); + + test.skip("add and remove JAR library", async () => { + // Skip: the addLibraries command opens a native OS file dialog + // (vscode.window.showOpenDialog) which Playwright cannot automate. + // This test requires Electron dialog mocking support. + }); + }); + + test.describe("create new project", () => { + + test.use({ testProjectDir: "invisible" }); + + test.skip("java.project.create with no build tools", async () => { + // Skip: after selecting "No build tools", scaffoldSimpleProject() + // calls vscode.window.showOpenDialog() which opens a native OS file + // dialog that Playwright cannot automate. This test requires + // Electron dialog mocking support. + }); + }); +}); diff --git a/test/e2e/tests/projectExplorer.test.ts b/test/e2e/tests/projectExplorer.test.ts new file mode 100644 index 00000000..b32a58df --- /dev/null +++ b/test/e2e/tests/projectExplorer.test.ts @@ -0,0 +1,62 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT license. + +/** + * E2E tests for the Java Projects explorer view. + * + * Covers: + * - javaProjectExplorer.focus + * - java.view.package.linkWithFolderExplorer + * - java.view.package.unlinkWithFolderExplorer + */ + +import { test, expect } from "../fixtures/baseTest"; +import { Timeout, VSCode } from "../utils/constants"; +import JavaOperator from "../utils/javaOperator"; +import VscodeOperator from "../utils/vscodeOperator"; + +test.describe("Project Explorer", () => { + + test.use({ testProjectDir: "maven" }); + + test.beforeEach(async ({ page }) => { + await VscodeOperator.dismissModalDialog(page); + // Open a Java file so the language server activates + await JavaOperator.openFile(page, "App.java"); + await JavaOperator.waitForJavaLSReady(page); + await JavaOperator.focusJavaProjects(page); + }); + + test("javaProjectExplorer.focus shows Java Projects section", async ({ page }) => { + // beforeEach already focuses Java Projects; verify the tree is populated + const found = await VscodeOperator.waitForTreeItem(page, "my-app", 15_000); + expect(found).toBeTruthy(); + }); + + test("linkWithFolderExplorer reveals active file in tree", async ({ page }) => { + // Expand project to source level + await JavaOperator.expandTreePath(page, "my-app", "src/main/java"); + + // The package node should expand and reveal the class + const packageVisible = await VscodeOperator.waitForTreeItem(page, "com.mycompany.app", 15_000); + expect(packageVisible).toBeTruthy(); + + // Use exact match to avoid matching "app", "App.java", "AppToDelete" etc. + const classVisible = await page.getByRole(VSCode.TREE_ITEM_ROLE, { name: "App", exact: true }) + .isVisible().catch(() => false); + expect(classVisible).toBeTruthy(); + }); + + test("unlinkWithFolderExplorer stops auto-reveal", async ({ page }) => { + // Use command to unlink + await VscodeOperator.executeCommand(page, "Java: Unlink with Editor"); + await page.waitForTimeout(Timeout.CLICK); + + // Open a different file — tree should NOT auto-expand + await JavaOperator.openFile(page, "AppToRename.java"); + await page.waitForTimeout(Timeout.TREE_EXPAND); + + // Re-link for cleanup + await VscodeOperator.executeCommand(page, "Java: Link with Editor"); + }); +}); diff --git a/test/e2e/utils/constants.ts b/test/e2e/utils/constants.ts new file mode 100644 index 00000000..8a409e74 --- /dev/null +++ b/test/e2e/utils/constants.ts @@ -0,0 +1,61 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT license. + +/** + * Centralized constants for VS Code E2E tests. + * Keep ARIA role strings, timeouts, and selector patterns here + * so that tests and operators stay tidy. + */ + +// --------------------------------------------------------------------------- +// Timeouts (milliseconds) +// --------------------------------------------------------------------------- + +export const Timeout = { + /** Short pause after a click or keystroke */ + CLICK: 1_000, + /** Longer pause after expanding a tree item (DOM needs time to render children) */ + TREE_EXPAND: 3_000, + /** Wait before the first assertion in a test (let VS Code settle) */ + PREPARE: 5_000, + /** Wait for a heavy extension to activate */ + EXTENSION_ACTIVATE: 10_000, + /** Maximum wait for Java Language Server to report "Ready" */ + JAVA_LS_READY: 180_000, + /** Interval between polls when waiting for LS readiness */ + JAVA_LS_POLL_INTERVAL: 2_000, +} as const; + +// --------------------------------------------------------------------------- +// VS Code ARIA roles & selectors +// --------------------------------------------------------------------------- + +export const VSCode = { + // Command palette + CMD_PALETTE_KEY: "F1", + CMD_PALETTE_ROLE: "combobox" as const, + CMD_PALETTE_INPUT_NAME: "INPUT", + OPTION_ROLE: "option" as const, + LISTBOX_ROLE: "listbox" as const, + // Side bar / activity bar + TAB_ROLE: "tab" as const, + // Tree view + TREE_ITEM_ROLE: "treeitem" as const, + // Buttons & toolbars + BUTTON_ROLE: "button" as const, + TOOLBAR_ROLE: "toolbar" as const, + // Keys + ENTER: "Enter", + ESCAPE: "Escape", + // Elements + LINK: "a", +} as const; + +// --------------------------------------------------------------------------- +// Java-specific +// --------------------------------------------------------------------------- + +export const Java = { + JAVA_PROJECTS_SECTION: "Java Projects", + JAVA_LS_STATUS_LABEL: "Language Status", +} as const; diff --git a/test/e2e/utils/javaOperator.ts b/test/e2e/utils/javaOperator.ts new file mode 100644 index 00000000..67d2657f --- /dev/null +++ b/test/e2e/utils/javaOperator.ts @@ -0,0 +1,145 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT license. + +/** + * Java-specific helpers for E2E tests. + * + * The most important one is `waitForJavaLSReady()` which polls the status bar + * until Language Support for Java reports a "ready" state, using Playwright's + * `expect.poll` so that the test automatically retries and fails cleanly if + * the LS never reaches readiness. + */ + +import { expect, Page } from "@playwright/test"; +import { Timeout, VSCode } from "./constants"; +import VscodeOperator from "./vscodeOperator"; + +export default class JavaOperator { + + /** + * Waits for the Java Language Server to finish indexing. + * + * Strategy: poll the status bar for a button whose accessible name + * contains "Java: Ready" (e.g. "coffee Java: Ready, Show Java status menu"). + * This is more reliable than clicking a hover because it doesn't depend + * on internal VS Code DOM IDs that vary across versions. + */ + static async waitForJavaLSReady(page: Page, timeoutMs = Timeout.JAVA_LS_READY): Promise { + // Give the extension a moment to register its status bar item + await page.waitForTimeout(Timeout.EXTENSION_ACTIVATE); + + await expect.poll(async () => { + try { + const javaReadyButton = page.getByRole(VSCode.BUTTON_ROLE, { name: /Java:\s*Ready/i }); + if (await javaReadyButton.isVisible().catch(() => false)) { + return "ready"; + } + return "not-ready"; + } catch { + return "not-ready"; + } + }, { + message: "Java Language Server did not become ready in time", + timeout: timeoutMs, + intervals: [Timeout.JAVA_LS_POLL_INTERVAL], + }).toBe("ready"); + } + + /** + * Focuses the Java Projects view and waits for it to render. + * + * Directly clicks the "Java Projects Section" button in the Explorer + * sidebar rather than going through the command palette, which may + * fail to find the view-focus command by its ID. + */ + static async focusJavaProjects(page: Page): Promise { + const sectionButton = page.getByRole(VSCode.BUTTON_ROLE, { name: /Java Projects Section/i }); + if (await sectionButton.isVisible({ timeout: 5_000 }).catch(() => false)) { + // Only click to expand if the section is currently collapsed + const expanded = await sectionButton.getAttribute("aria-expanded"); + if (expanded !== "true") { + await sectionButton.click(); + } + } else { + // Fallback: try via command palette + await VscodeOperator.executeCommand(page, "Java Projects: Focus on Java Projects View"); + } + await page.waitForTimeout(Timeout.TREE_EXPAND); + } + + /** + * Expands tree items along a path (e.g. "my-app" → "src/main/java" → "com.mycompany.app"). + * + * Waits for each item's `aria-expanded` attribute to appear before clicking, + * because VS Code only sets it after the tree data provider's `getChildren()` + * has returned — until then the node is treated as a leaf. + */ + static async expandTreePath(page: Page, ...labels: string[]): Promise { + for (const label of labels) { + const item = page.getByRole(VSCode.TREE_ITEM_ROLE, { name: label }).first(); + await item.waitFor({ state: "visible", timeout: 15_000 }); + + // Wait for the node to become expandable (aria-expanded present). + await expect.poll(async () => { + return await item.getAttribute("aria-expanded"); + }, { + message: `Tree item "${label}" did not become expandable`, + timeout: 15_000, + }).toBeTruthy(); + + const expanded = await item.getAttribute("aria-expanded"); + if (expanded !== "true") { + await item.click(); + await page.waitForTimeout(Timeout.TREE_EXPAND); + } + } + } + + /** + * Collapses the default file explorer section so that tree items in the + * Java Projects view are within the viewport. + */ + static async collapseFileExplorer(page: Page): Promise { + try { + // Try to collapse any expanded section above Java Projects + const sections = page.locator(".split-view-view .pane-header[aria-expanded='true']"); + const count = await sections.count(); + if (count > 0) { + await sections.first().click(); + await page.waitForTimeout(Timeout.CLICK); + } + } catch { + // Best-effort + } + } + + /** + * Opens a file in the editor via Quick Open (Ctrl+P). + */ + static async openFile(page: Page, filePath: string): Promise { + // Use Ctrl+P directly instead of going through command palette + await page.keyboard.press("Control+P"); + const input = page.locator(".quick-input-widget input.input"); + await input.waitFor({ state: "visible", timeout: 10_000 }); + await input.fill(filePath); + await page.waitForTimeout(Timeout.CLICK); + // Wait for file matches to appear, then select the first one + const firstMatch = page.locator(".quick-input-widget .quick-input-list .monaco-list-row").first(); + if (await firstMatch.isVisible({ timeout: 3_000 }).catch(() => false)) { + await firstMatch.click(); + } else { + await input.press(VSCode.ENTER); + } + await page.waitForTimeout(Timeout.TREE_EXPAND); + } + + /** + * Triggers the "New..." action on a project node. + * This opens the resource-type quick-pick. + */ + static async triggerNewResource(page: Page, projectName: string): Promise { + await JavaOperator.collapseFileExplorer(page); + await VscodeOperator.clickTreeItem(page, projectName); + await VscodeOperator.clickTreeItemAction(page, projectName, "New..."); + } +} diff --git a/test/e2e/utils/vscodeOperator.ts b/test/e2e/utils/vscodeOperator.ts new file mode 100644 index 00000000..6dd34a80 --- /dev/null +++ b/test/e2e/utils/vscodeOperator.ts @@ -0,0 +1,283 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT license. + +/** + * Generic VS Code UI helpers built on Playwright Page. + * + * These helpers prefer ARIA roles / labels over CSS classes where possible + * to better survive VS Code version upgrades, but some fall back to CSS + * selectors when needed. + */ + +import { Page } from "@playwright/test"; +import { Timeout, VSCode } from "./constants"; + +export default class VscodeOperator { + + // ----------------------------------------------------------------------- + // Command palette + // ----------------------------------------------------------------------- + + /** + * Opens the command palette, types the given command, and runs it. + */ + static async executeCommand(page: Page, command: string): Promise { + await page.keyboard.press(VSCode.CMD_PALETTE_KEY); + // Wait for the quick-input widget to appear + const input = page.locator(".quick-input-widget input.input"); + await input.waitFor({ state: "visible", timeout: 10_000 }); + // F1 opens command palette with ">" prefix; fill() must preserve it + // so VS Code searches commands rather than files. + await input.fill(">" + command); + await page.waitForTimeout(Timeout.CLICK); + // Press Enter on the first matching option in the list + const firstOption = page.locator(".quick-input-widget .quick-input-list .monaco-list-row").first(); + if (await firstOption.isVisible({ timeout: 3_000 }).catch(() => false)) { + await firstOption.click(); + } else { + await input.press(VSCode.ENTER); + } + await page.waitForTimeout(Timeout.CLICK); + } + + /** + * Select a quick-pick option by its visible label text. + */ + static async selectQuickPickItem(page: Page, label: string): Promise { + const option = page.locator(".quick-input-widget .quick-input-list .monaco-list-row", { hasText: label }); + await option.first().waitFor({ state: "visible", timeout: 10_000 }); + await option.first().click(); + await page.waitForTimeout(Timeout.CLICK); + } + + /** + * Select a quick-pick option by its zero-based index. + */ + static async selectQuickPickIndex(page: Page, index: number): Promise { + const option = page.locator(".quick-input-widget .quick-input-list .monaco-list-row").nth(index); + await option.waitFor({ state: "visible", timeout: 10_000 }); + await option.click(); + await page.waitForTimeout(Timeout.CLICK); + } + + // ----------------------------------------------------------------------- + // Quick input box + // ----------------------------------------------------------------------- + + /** + * Waits for the quick-input box to appear and returns the input locator. + */ + static async getQuickInput(page: Page): Promise> { + const input = page.locator(".quick-input-widget input.input"); + await input.waitFor({ state: "visible", timeout: 10_000 }); + return input; + } + + /** + * Types text into the quick-input and confirms with Enter. + */ + static async fillQuickInput(page: Page, text: string): Promise { + const input = await VscodeOperator.getQuickInput(page); + await input.fill(text); + await page.waitForTimeout(Timeout.CLICK); + await input.press(VSCode.ENTER); + await page.waitForTimeout(Timeout.CLICK); + } + + // ----------------------------------------------------------------------- + // Side bar / Activity bar + // ----------------------------------------------------------------------- + + /** + * Clicks a side-bar tab by its accessibility label (e.g. "Explorer", "Java Projects"). + */ + static async activateSideTab(page: Page, tabName: string, timeout = Timeout.CLICK): Promise { + await page.getByRole(VSCode.TAB_ROLE, { name: tabName }).locator(VSCode.LINK).click(); + await page.waitForTimeout(timeout); + } + + static async isSideTabVisible(page: Page, tabName: string): Promise { + return page.getByRole(VSCode.TAB_ROLE, { name: tabName }).isVisible(); + } + + // ----------------------------------------------------------------------- + // Tree items + // ----------------------------------------------------------------------- + + /** + * Returns whether a tree item with the given name is visible. + */ + static async isTreeItemVisible(page: Page, name: string): Promise { + return page.getByRole(VSCode.TREE_ITEM_ROLE, { name }).isVisible(); + } + + /** + * Clicks a tree item by name. + */ + static async clickTreeItem(page: Page, name: string): Promise { + await page.getByRole(VSCode.TREE_ITEM_ROLE, { name }).locator(VSCode.LINK).first().click(); + await page.waitForTimeout(Timeout.TREE_EXPAND); + } + + /** + * Waits for a tree item to appear in the DOM and become visible. + * Returns `true` if the item was found within `timeoutMs`. + */ + static async waitForTreeItem(page: Page, name: string, timeoutMs = 30_000): Promise { + try { + await page.getByRole(VSCode.TREE_ITEM_ROLE, { name }).first().waitFor({ + state: "visible", + timeout: timeoutMs, + }); + return true; + } catch { + return false; + } + } + + /** + * Waits until a tree item disappears from the view. + */ + static async waitForTreeItemGone(page: Page, name: string, timeoutMs = 15_000): Promise { + try { + await page.getByRole(VSCode.TREE_ITEM_ROLE, { name }).first().waitFor({ + state: "hidden", + timeout: timeoutMs, + }); + return true; + } catch { + return false; + } + } + + /** + * Clicks an inline action button on a tree item (the small icons that appear on hover). + * Uses aria-label matching so it works across VS Code versions. + */ + static async clickTreeItemAction(page: Page, itemName: string, actionLabel: string): Promise { + const treeItem = page.getByRole(VSCode.TREE_ITEM_ROLE, { name: itemName }); + // Hover to reveal inline action buttons + await treeItem.hover(); + await page.waitForTimeout(500); + await treeItem.locator(`a.action-label[role="button"][aria-label*="${actionLabel}"]`).click(); + await page.waitForTimeout(Timeout.CLICK); + } + + // ----------------------------------------------------------------------- + // Context menus + // ----------------------------------------------------------------------- + + /** + * Right-clicks an element and selects an item from the context menu. + * + * Scopes the search to `.monaco-menu-container .monaco-menu` to avoid + * matching menubar items. Hovers the item first to trigger VS Code's + * menu focus, then waits for the `.focused` CSS class before clicking. + */ + static async selectContextMenuItem(page: Page, target: ReturnType, menuItemName: string | RegExp): Promise { + await target.click({ button: "right" }); + const menu = page.locator(".monaco-menu-container .monaco-menu"); + await menu.waitFor({ state: "visible", timeout: 5_000 }); + const menuItem = menu.getByRole("menuitem", { name: menuItemName }); + await menuItem.first().waitFor({ state: "visible", timeout: 5_000 }); + await menuItem.first().hover(); + await page.locator(".monaco-menu-container .action-item.focused").waitFor({ + state: "visible", + timeout: 5_000, + }); + await menuItem.first().click(); + await page.waitForTimeout(Timeout.CLICK); + } + + // ----------------------------------------------------------------------- + // Dialogs + // ----------------------------------------------------------------------- + + /** + * Tries to dismiss a modal dialog (workspace-trust, update prompts, etc.) + * by clicking a button whose label matches one of the well-known accept labels. + * Silently succeeds if no dialog is present. + */ + static async dismissModalDialog(page: Page): Promise { + const acceptLabels = ["Yes, I trust the authors", "OK", "Yes", "Continue", "I Trust the Authors"]; + try { + // Handle modal dialogs + const dialog = page.locator(".monaco-dialog-box"); + if (await dialog.isVisible({ timeout: 2_000 }).catch(() => false)) { + for (const label of acceptLabels) { + const btn = dialog.getByRole(VSCode.BUTTON_ROLE, { name: label }); + if (await btn.isVisible().catch(() => false)) { + await btn.click(); + await page.waitForTimeout(Timeout.CLICK); + break; + } + } + } + } catch { + // No modal dialog — nothing to dismiss + } + + // Also dismiss notification toasts (telemetry prompts, theme suggestions, etc.) + try { + const closeButtons = page.locator(".notification-toast .codicon-close"); + let count = await closeButtons.count().catch(() => 0); + while (count > 0) { + await closeButtons.first().click(); + await page.waitForTimeout(500); + count = await closeButtons.count().catch(() => 0); + } + } catch { + // Best effort + } + } + + /** + * Waits for a modal dialog to appear and clicks a button by its label. + */ + static async clickDialogButton(page: Page, buttonLabel: string, timeoutMs = 10_000): Promise { + const dialog = page.locator(".monaco-dialog-box"); + await dialog.waitFor({ state: "visible", timeout: timeoutMs }); + await dialog.getByRole(VSCode.BUTTON_ROLE, { name: buttonLabel }).click(); + await page.waitForTimeout(Timeout.CLICK); + } + + /** + * Clicks a button inside a notification toast (e.g. refactoring confirmations + * from extensions that use `window.showInformationMessage` with action buttons). + */ + static async clickNotificationButton(page: Page, buttonLabel: string, timeoutMs = 10_000): Promise { + const notification = page.locator(".notification-toast"); + await notification.first().waitFor({ state: "visible", timeout: timeoutMs }); + const btn = notification.getByRole(VSCode.BUTTON_ROLE, { name: buttonLabel }); + await btn.first().waitFor({ state: "visible", timeout: timeoutMs }); + await btn.first().click(); + await page.waitForTimeout(Timeout.CLICK); + } + + // ----------------------------------------------------------------------- + // Editor + // ----------------------------------------------------------------------- + + /** + * Waits for an editor tab with the given title to become active. + */ + static async waitForEditorTab(page: Page, title: string, timeoutMs = 15_000): Promise { + try { + await page.getByRole(VSCode.TAB_ROLE, { name: title }).first().waitFor({ + state: "visible", + timeout: timeoutMs, + }); + return true; + } catch { + return false; + } + } + + /** + * Saves the currently active editor using the command palette. + * (More reliable than Ctrl+S because focus might not be on the editor.) + */ + static async saveActiveEditor(page: Page): Promise { + await VscodeOperator.executeCommand(page, "workbench.action.files.save"); + } +} diff --git a/test/simple/.project b/test/simple/.project index e86159b9..fa6f3f7a 100644 --- a/test/simple/.project +++ b/test/simple/.project @@ -1,17 +1,28 @@ - 1.helloworld - - - - - - org.eclipse.jdt.core.javabuilder - - - - - - org.eclipse.jdt.core.javanature - + 1.helloworld + + + + + + org.eclipse.jdt.core.javabuilder + + + + + + org.eclipse.jdt.core.javanature + + + + 1774876132513 + + 30 + + org.eclipse.core.resources.regexFilterMatcher + node_modules|\.git|__CREATED_BY_JAVA_LANGUAGE_SERVER__ + + + diff --git a/tsconfig.json b/tsconfig.json index 9e2f8fa8..98f55334 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -21,6 +21,7 @@ "exclude": [ "node_modules", ".vscode-test", - "test-resources" + "test-resources", + "test/e2e" ] } From 3a886bd0952d5400adbc6c81f217a1126d0b605a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 1 Apr 2026 14:52:43 +0800 Subject: [PATCH 287/352] chore(deps): Bump tar-fs from 1.16.5 to 1.16.6 (#986) Bumps [tar-fs](https://github.com/mafintosh/tar-fs) from 1.16.5 to 1.16.6. - [Commits](https://github.com/mafintosh/tar-fs/compare/v1.16.5...v1.16.6) --- updated-dependencies: - dependency-name: tar-fs dependency-version: 1.16.6 dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: wenyt <75360946+wenytang-ms@users.noreply.github.com> --- package-lock.json | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/package-lock.json b/package-lock.json index 2bea9b8d..e05ade58 100644 --- a/package-lock.json +++ b/package-lock.json @@ -7197,11 +7197,10 @@ } }, "node_modules/targz/node_modules/tar-fs": { - "version": "1.16.5", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-1.16.5.tgz", - "integrity": "sha512-1ergVCCysmwHQNrOS+Pjm4DQ4nrGp43+Xnu4MRGjCnQu/m3hEgLNS78d5z+B8OJ1hN5EejJdCSFZE1oM6AQXAQ==", + "version": "1.16.6", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-1.16.6.tgz", + "integrity": "sha512-JkOgFt3FxM/2v2CNpAVHqMW2QASjc/Hxo7IGfNd3MHaDYSW/sBFiS7YVmmhmr8x6vwN1VFQDQGdT2MWpmIuVKA==", "dev": true, - "license": "MIT", "dependencies": { "chownr": "^1.0.1", "mkdirp": "^0.5.1", @@ -13610,9 +13609,9 @@ } }, "tar-fs": { - "version": "1.16.5", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-1.16.5.tgz", - "integrity": "sha512-1ergVCCysmwHQNrOS+Pjm4DQ4nrGp43+Xnu4MRGjCnQu/m3hEgLNS78d5z+B8OJ1hN5EejJdCSFZE1oM6AQXAQ==", + "version": "1.16.6", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-1.16.6.tgz", + "integrity": "sha512-JkOgFt3FxM/2v2CNpAVHqMW2QASjc/Hxo7IGfNd3MHaDYSW/sBFiS7YVmmhmr8x6vwN1VFQDQGdT2MWpmIuVKA==", "dev": true, "requires": { "chownr": "^1.0.1", From cdd189ce3b218f8800f4f5ec58605eba7e7bf3ba Mon Sep 17 00:00:00 2001 From: wenyt <75360946+wenytang-ms@users.noreply.github.com> Date: Wed, 1 Apr 2026 15:24:09 +0800 Subject: [PATCH 288/352] test: enable Playwright trace on all E2E test runs (#987) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * test: enable Playwright trace on all E2E test runs Change trace from 'on-first-retry' to 'on' so every test run captures screenshots and DOM snapshots at each Playwright action. This makes debugging easier — especially when traces are reviewed by AI — since the full interaction flow is always available, not just on retries. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * fix: use retain-on-failure in CI, remove manual tracing Address review comments: - Use 'retain-on-failure' in CI to limit artifact size, 'on' locally - Remove manual tracing.start/stop from fixture — Playwright's built-in use.trace config handles it automatically, avoiding 'Tracing has been already started' conflicts Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --------- Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- test/e2e/fixtures/baseTest.ts | 18 ++++-------------- test/e2e/playwright.config.ts | 8 ++++---- 2 files changed, 8 insertions(+), 18 deletions(-) diff --git a/test/e2e/fixtures/baseTest.ts b/test/e2e/fixtures/baseTest.ts index 2d33a497..83c7f8a9 100644 --- a/test/e2e/fixtures/baseTest.ts +++ b/test/e2e/fixtures/baseTest.ts @@ -136,25 +136,15 @@ export const test = base.extend({ await page.waitForTimeout(3_000); await dismissAllNotifications(page); - // 4. Optional tracing - if (testInfo.retry > 0 || !process.env.CI) { - await page.context().tracing.start({ screenshots: true, snapshots: true, title: testInfo.title }); - } + // Tracing is handled by Playwright's built-in `use.trace` config + // (see playwright.config.ts). No manual tracing.start/stop needed. // ---- hand off to the test ---- await use(page); // ---- teardown ---- - // Save trace on failure/retry - if (testInfo.status !== "passed" || testInfo.retry > 0) { - const tracePath = testInfo.outputPath("trace.zip"); - try { - await page.context().tracing.stop({ path: tracePath }); - testInfo.attachments.push({ name: "trace", path: tracePath, contentType: "application/zip" }); - } catch { - // Tracing may not have been started - } - } + // Trace saving is handled automatically by Playwright's `use.trace` + // config — no manual tracing.stop() needed here. await electronApp.close(); diff --git a/test/e2e/playwright.config.ts b/test/e2e/playwright.config.ts index 91b6e7eb..4af6182b 100644 --- a/test/e2e/playwright.config.ts +++ b/test/e2e/playwright.config.ts @@ -20,10 +20,10 @@ export default defineConfig({ }, globalSetup: path.join(__dirname, "globalSetup.ts"), use: { - // Automatically take a screenshot when a test fails. - screenshot: "only-on-failure", - // Capture full trace on retry for deep debugging (includes screenshots, DOM snapshots, network). - trace: "on-first-retry", + // Capture full trace on every test run locally (includes screenshots, + // DOM snapshots, and network at each Playwright action). In CI, + // retain traces only for failing tests to limit artifact size. + trace: process.env.CI ? "retain-on-failure" : "on", }, outputDir: path.join(__dirname, "..", "..", "test-results", "e2e"), }); From 8291b01c6f378af2dfe60ac0e9b8681e12e347d1 Mon Sep 17 00:00:00 2001 From: Changyong Gong Date: Wed, 8 Apr 2026 14:40:23 +0800 Subject: [PATCH 289/352] fix: update vulnerable dependencies (lodash, serialize-javascript) (#989) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Update direct lodash dependency: 4.17.23 → 4.18.0 (CVE-2026-4800, CVE-2026-2950) - Add npm override for serialize-javascript: 6.0.2 → 7.0.5 (CVE-2026-34043, GHSA-5c6j-r48x-rmvq) Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- package-lock.json | 157 ++++++++++++++++++++++++++++++++++------------ package.json | 5 +- 2 files changed, 121 insertions(+), 41 deletions(-) diff --git a/package-lock.json b/package-lock.json index e05ade58..e622e1fc 100644 --- a/package-lock.json +++ b/package-lock.json @@ -15,13 +15,14 @@ "fmtr": "^1.1.4", "fs-extra": "^10.1.0", "globby": "^13.1.3", - "lodash": "^4.17.23", + "lodash": "^4.18.0", "minimatch": "^5.1.9", "semver": "^7.3.8", "vscode-extension-telemetry-wrapper": "^0.15.0", "vscode-tas-client": "^0.1.75" }, "devDependencies": { + "@playwright/test": "^1.50.0", "@types/fs-extra": "^9.0.13", "@types/glob": "^7.2.0", "@types/lodash": "^4.14.191", @@ -914,6 +915,22 @@ "node": ">=14" } }, + "node_modules/@playwright/test": { + "version": "1.59.1", + "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.59.1.tgz", + "integrity": "sha512-PG6q63nQg5c9rIi4/Z5lR5IVF7yU5MqmKaPOe0HSc0O2cX1fPi96sUQu5j7eo4gKCkB2AnNGoWt7y4/Xx3Kcqg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "playwright": "1.59.1" + }, + "bin": { + "playwright": "cli.js" + }, + "engines": { + "node": ">=18" + } + }, "node_modules/@redhat-developer/locators": { "version": "1.20.0", "resolved": "https://registry.npmjs.org/@redhat-developer/locators/-/locators-1.20.0.tgz", @@ -3673,6 +3690,21 @@ "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", "dev": true }, + "node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, "node_modules/function-bind": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", @@ -4720,9 +4752,10 @@ } }, "node_modules/lodash": { - "version": "4.17.23", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.23.tgz", - "integrity": "sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w==" + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.18.1.tgz", + "integrity": "sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==", + "license": "MIT" }, "node_modules/lodash.includes": { "version": "4.3.0", @@ -5829,6 +5862,38 @@ "node": ">=8" } }, + "node_modules/playwright": { + "version": "1.59.1", + "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.59.1.tgz", + "integrity": "sha512-C8oWjPR3F81yljW9o5OxcWzfh6avkVwDD2VYdwIGqTkl+OGFISgypqzfu7dOe4QNLL2aqcWBmI3PMtLIK233lw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "playwright-core": "1.59.1" + }, + "bin": { + "playwright": "cli.js" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "fsevents": "2.3.2" + } + }, + "node_modules/playwright-core": { + "version": "1.59.1", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.59.1.tgz", + "integrity": "sha512-HBV/RJg81z5BiiZ9yPzIiClYV/QMsDCKUyogwH9p3MCP6IYjUFu/MActgYAvK0oWyV9NlwM3GLBjADyWgydVyg==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "playwright-core": "cli.js" + }, + "engines": { + "node": ">=18" + } + }, "node_modules/pluralize": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz", @@ -5978,15 +6043,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "dev": true, - "dependencies": { - "safe-buffer": "^5.1.0" - } - }, "node_modules/rc": { "version": "1.2.8", "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", @@ -6573,12 +6629,13 @@ } }, "node_modules/serialize-javascript": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", - "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-7.0.5.tgz", + "integrity": "sha512-F4LcB0UqUl1zErq+1nYEEzSHJnIwb3AF2XWB94b+afhrekOUijwooAYqFyRbjYkm2PAKBabx6oYv/xDxNi8IBw==", "dev": true, - "dependencies": { - "randombytes": "^2.1.0" + "license": "BSD-3-Clause", + "engines": { + "node": ">=20.0.0" } }, "node_modules/setimmediate": { @@ -9269,6 +9326,15 @@ "dev": true, "optional": true }, + "@playwright/test": { + "version": "1.59.1", + "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.59.1.tgz", + "integrity": "sha512-PG6q63nQg5c9rIi4/Z5lR5IVF7yU5MqmKaPOe0HSc0O2cX1fPi96sUQu5j7eo4gKCkB2AnNGoWt7y4/Xx3Kcqg==", + "dev": true, + "requires": { + "playwright": "1.59.1" + } + }, "@redhat-developer/locators": { "version": "1.20.0", "resolved": "https://registry.npmjs.org/@redhat-developer/locators/-/locators-1.20.0.tgz", @@ -10656,7 +10722,7 @@ "globby": "^13.1.1", "normalize-path": "^3.0.0", "schema-utils": "^4.0.0", - "serialize-javascript": "^6.0.0" + "serialize-javascript": ">=7.0.5" } }, "core-util-is": { @@ -11223,6 +11289,13 @@ "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", "dev": true }, + "fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "optional": true + }, "function-bind": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", @@ -11943,9 +12016,9 @@ } }, "lodash": { - "version": "4.17.23", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.23.tgz", - "integrity": "sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w==" + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.18.1.tgz", + "integrity": "sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==" }, "lodash.includes": { "version": "4.3.0", @@ -12176,7 +12249,7 @@ "minimatch": "^9.0.5", "ms": "^2.1.3", "picocolors": "^1.1.1", - "serialize-javascript": "^6.0.2", + "serialize-javascript": ">=7.0.5", "strip-json-comments": "^3.1.1", "supports-color": "^8.1.1", "workerpool": "^9.2.0", @@ -12711,6 +12784,22 @@ } } }, + "playwright": { + "version": "1.59.1", + "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.59.1.tgz", + "integrity": "sha512-C8oWjPR3F81yljW9o5OxcWzfh6avkVwDD2VYdwIGqTkl+OGFISgypqzfu7dOe4QNLL2aqcWBmI3PMtLIK233lw==", + "dev": true, + "requires": { + "fsevents": "2.3.2", + "playwright-core": "1.59.1" + } + }, + "playwright-core": { + "version": "1.59.1", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.59.1.tgz", + "integrity": "sha512-HBV/RJg81z5BiiZ9yPzIiClYV/QMsDCKUyogwH9p3MCP6IYjUFu/MActgYAvK0oWyV9NlwM3GLBjADyWgydVyg==", + "dev": true + }, "pluralize": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz", @@ -12801,15 +12890,6 @@ "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", "dev": true }, - "randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "dev": true, - "requires": { - "safe-buffer": "^5.1.0" - } - }, "rc": { "version": "1.2.8", "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", @@ -13183,13 +13263,10 @@ "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==" }, "serialize-javascript": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", - "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", - "dev": true, - "requires": { - "randombytes": "^2.1.0" - } + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-7.0.5.tgz", + "integrity": "sha512-F4LcB0UqUl1zErq+1nYEEzSHJnIwb3AF2XWB94b+afhrekOUijwooAYqFyRbjYkm2PAKBabx6oYv/xDxNi8IBw==", + "dev": true }, "setimmediate": { "version": "1.0.5", @@ -13676,7 +13753,7 @@ "@jridgewell/trace-mapping": "^0.3.25", "jest-worker": "^27.4.5", "schema-utils": "^4.3.0", - "serialize-javascript": "^6.0.2", + "serialize-javascript": ">=7.0.5", "terser": "^5.31.1" } }, diff --git a/package.json b/package.json index e8d02977..72fe913c 100644 --- a/package.json +++ b/package.json @@ -1296,10 +1296,13 @@ "fmtr": "^1.1.4", "fs-extra": "^10.1.0", "globby": "^13.1.3", - "lodash": "^4.17.23", + "lodash": "^4.18.0", "minimatch": "^5.1.9", "semver": "^7.3.8", "vscode-extension-telemetry-wrapper": "^0.15.0", "vscode-tas-client": "^0.1.75" + }, + "overrides": { + "serialize-javascript": ">=7.0.5" } } \ No newline at end of file From 0df98e6a812f965c12c900323212a89f2cb7c8c6 Mon Sep 17 00:00:00 2001 From: Changyong Gong Date: Thu, 9 Apr 2026 14:27:39 +0800 Subject: [PATCH 290/352] bump version to 0.27.2 (#990) --- CHANGELOG.md | 4 ++++ package-lock.json | 4 ++-- package.json | 2 +- 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f46b3c3e..38567da0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,10 @@ All notable changes to the "vscode-java-dependency" extension will be documented The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/) and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html). +## 0.27.2 + +- perf - Progressive project tree view during import in https://github.com/microsoft/vscode-java-dependency/pull/982 + ## 0.27.1 - Enhancement - Update upgrade prompt after merging extension in https://github.com/microsoft/vscode-java-dependency/pull/971 diff --git a/package-lock.json b/package-lock.json index e622e1fc..e788b49e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "vscode-java-dependency", - "version": "0.27.1", + "version": "0.27.2", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "vscode-java-dependency", - "version": "0.27.1", + "version": "0.27.2", "license": "MIT", "dependencies": { "@github/copilot-language-server": "^1.388.0", diff --git a/package.json b/package.json index 72fe913c..aa9cf9ce 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "vscode-java-dependency", "displayName": "Project Manager for Java", "description": "%description%", - "version": "0.27.1", + "version": "0.27.2", "publisher": "vscjava", "preview": false, "aiKey": "5c642b22-e845-4400-badb-3f8509a70777", From fdacbcc1bbb4d5e46201f758224fda23d24a0e7b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 13 Apr 2026 11:15:54 +0800 Subject: [PATCH 291/352] chore(deps): Bump axios from 1.13.5 to 1.15.0 (#991) Bumps [axios](https://github.com/axios/axios) from 1.13.5 to 1.15.0. - [Release notes](https://github.com/axios/axios/releases) - [Changelog](https://github.com/axios/axios/blob/v1.x/CHANGELOG.md) - [Commits](https://github.com/axios/axios/compare/v1.13.5...v1.15.0) --- updated-dependencies: - dependency-name: axios dependency-version: 1.15.0 dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 31 +++++++++++++++++-------------- 1 file changed, 17 insertions(+), 14 deletions(-) diff --git a/package-lock.json b/package-lock.json index e788b49e..772b3a2c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2123,13 +2123,13 @@ "integrity": "sha512-aDczADvlvTGajTDjcjpJMqRkOF6Qdz3YbPZm/PyW6tKPkx2hlYBzxMhEywM/tU72HrVZjgl5VCdRuMlA7pZ8Gw==" }, "node_modules/axios": { - "version": "1.13.5", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.13.5.tgz", - "integrity": "sha512-cz4ur7Vb0xS4/KUN0tPWe44eqxrIu31me+fbang3ijiNscE129POzipJJA6zniq2C/Z6sJCjMimjS8Lc/GAs8Q==", + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.15.0.tgz", + "integrity": "sha512-wWyJDlAatxk30ZJer+GeCWS209sA42X+N5jU2jy6oHTp7ufw8uzUTVFBX9+wTfAlhiJXGS0Bq7X6efruWjuK9Q==", "dependencies": { "follow-redirects": "^1.15.11", "form-data": "^4.0.5", - "proxy-from-env": "^1.1.0" + "proxy-from-env": "^2.1.0" } }, "node_modules/azure-devops-node-api": { @@ -5969,9 +5969,12 @@ "dev": true }, "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==" + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-2.1.0.tgz", + "integrity": "sha512-cJ+oHTW1VAEa8cJslgmUZrc+sjRKgAKl3Zyse6+PV38hZe/V6Z14TbCuXcan9F9ghlz4QrFr2c92TNF82UkYHA==", + "engines": { + "node": ">=10" + } }, "node_modules/pump": { "version": "3.0.4", @@ -10244,13 +10247,13 @@ "integrity": "sha512-aDczADvlvTGajTDjcjpJMqRkOF6Qdz3YbPZm/PyW6tKPkx2hlYBzxMhEywM/tU72HrVZjgl5VCdRuMlA7pZ8Gw==" }, "axios": { - "version": "1.13.5", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.13.5.tgz", - "integrity": "sha512-cz4ur7Vb0xS4/KUN0tPWe44eqxrIu31me+fbang3ijiNscE129POzipJJA6zniq2C/Z6sJCjMimjS8Lc/GAs8Q==", + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.15.0.tgz", + "integrity": "sha512-wWyJDlAatxk30ZJer+GeCWS209sA42X+N5jU2jy6oHTp7ufw8uzUTVFBX9+wTfAlhiJXGS0Bq7X6efruWjuK9Q==", "requires": { "follow-redirects": "^1.15.11", "form-data": "^4.0.5", - "proxy-from-env": "^1.1.0" + "proxy-from-env": "^2.1.0" } }, "azure-devops-node-api": { @@ -12849,9 +12852,9 @@ "dev": true }, "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==" + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-2.1.0.tgz", + "integrity": "sha512-cJ+oHTW1VAEa8cJslgmUZrc+sjRKgAKl3Zyse6+PV38hZe/V6Z14TbCuXcan9F9ghlz4QrFr2c92TNF82UkYHA==" }, "pump": { "version": "3.0.4", From adfdb2e8139ec8db50a8944c50aa56d02a26fd2c Mon Sep 17 00:00:00 2001 From: wenyt <75360946+wenytang-ms@users.noreply.github.com> Date: Thu, 23 Apr 2026 10:52:34 +0800 Subject: [PATCH 292/352] fix: support Unicode identifiers in Java class name validation (#789) (#993) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * fix: support Unicode identifiers in Java class name validation (#789) Change isJavaIdentifier() regex from ASCII-only /^([a-zA-Z_$][a-zA-Z\d_$]*)$/ to Unicode-aware regex using ES2018 property escapes per JLS §3.8. This allows non-ASCII identifiers (e.g., Japanese ほげ, Chinese 中文类名, accented Ñoño) to be accepted in the New Java File and Rename wizards. Fixes microsoft/vscode-java-dependency#789 Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * test: fix flaky simple project name assertion The .project file defined name '1.helloworld' but JDT LS may override it with the folder name 'simple'. Align .project name with folder name to eliminate the inconsistency. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * test: use name-based lookups instead of hardcoded indices JDT LS may return additional source roots (e.g. target/generated-sources) that shift node indices. Replace hardcoded array indices with find()-by-name lookups to make tests resilient to JDT LS version differences. - Maven: find containers by name instead of [2]/[3] - Maven: check specific nodes hidden instead of exact count - Gradle: find nodes by name, increase timeout to 120s - Multi-module: add assertion guard before getChildren() Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * ci: upgrade GitHub Actions to v4, fix multi-module test LS readiness - Upgrade actions/checkout@v2 -> @v4, actions/setup-java@v1 -> @v4, actions/setup-node@v2 -> @v4 across all 3 CI workflows - setup-java@v4 with distribution: temurin fixes macOS ARM64 JAVA_HOME - Multi-module test: add languageServerApiManager.ready() to suiteSetup so Maven module names are fully resolved before assertions - Accept folder name or .project name variants for level1 submodule Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --------- Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .github/workflows/linux.yml | 7 ++-- .github/workflows/macOS.yml | 7 ++-- .github/workflows/windows.yml | 7 ++-- src/utility.ts | 4 ++- test/gradle-suite/projectView.test.ts | 17 ++++++---- test/maven-suite/projectView.test.ts | 36 +++++++++++++-------- test/multi-module-suite/projectView.test.ts | 15 +++++++-- test/simple-suite/projectView.test.ts | 2 +- test/simple/.project | 2 +- 9 files changed, 62 insertions(+), 35 deletions(-) diff --git a/.github/workflows/linux.yml b/.github/workflows/linux.yml index 7f07ce1d..eddfbdb9 100644 --- a/.github/workflows/linux.yml +++ b/.github/workflows/linux.yml @@ -12,7 +12,7 @@ jobs: runs-on: ubuntu-latest timeout-minutes: 30 steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v4 - name: Setup Build Environment run: | @@ -22,12 +22,13 @@ jobs: sleep 3 - name: Set up JDK 21 - uses: actions/setup-java@v1 + uses: actions/setup-java@v4 with: + distribution: 'temurin' java-version: '21' - name: Setup Node.js environment - uses: actions/setup-node@v2 + uses: actions/setup-node@v4 with: node-version: 20 diff --git a/.github/workflows/macOS.yml b/.github/workflows/macOS.yml index 80250d13..3e6d373f 100644 --- a/.github/workflows/macOS.yml +++ b/.github/workflows/macOS.yml @@ -12,15 +12,16 @@ jobs: runs-on: macos-latest timeout-minutes: 30 steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v4 - name: Set up JDK 21 - uses: actions/setup-java@v1 + uses: actions/setup-java@v4 with: + distribution: 'temurin' java-version: '21' - name: Setup Node.js environment - uses: actions/setup-node@v2 + uses: actions/setup-node@v4 with: node-version: 20 diff --git a/.github/workflows/windows.yml b/.github/workflows/windows.yml index a55b6a5c..79bd1f35 100644 --- a/.github/workflows/windows.yml +++ b/.github/workflows/windows.yml @@ -12,15 +12,16 @@ jobs: runs-on: windows-latest timeout-minutes: 30 steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v4 - name: Set up JDK 21 - uses: actions/setup-java@v1 + uses: actions/setup-java@v4 with: + distribution: 'temurin' java-version: '21' - name: Setup Node.js environment - uses: actions/setup-node@v2 + uses: actions/setup-node@v4 with: node-version: 20 diff --git a/src/utility.ts b/src/utility.ts index ee647dca..9ea08371 100644 --- a/src/utility.ts +++ b/src/utility.ts @@ -88,7 +88,9 @@ export function isKeyword(identifier: string): boolean { return keywords.has(identifier); } -const identifierRegExp: RegExp = /^([a-zA-Z_$][a-zA-Z\d_$]*)$/; +// Java identifier per JLS §3.8: start with a Unicode letter, underscore, or dollar sign; +// continue with Unicode letters, digits, underscore, dollar sign, or combining marks. +const identifierRegExp: RegExp = /^[\p{L}\p{Nl}_$][\p{L}\p{Nl}\p{Nd}\p{Mn}\p{Mc}\p{Pc}_$\u200c\u200d]*$/u; export function isJavaIdentifier(identifier: string): boolean { return identifierRegExp.test(identifier); } diff --git a/test/gradle-suite/projectView.test.ts b/test/gradle-suite/projectView.test.ts index 4a4e6776..6e23a088 100644 --- a/test/gradle-suite/projectView.test.ts +++ b/test/gradle-suite/projectView.test.ts @@ -16,6 +16,7 @@ suite("Gradle Project View Tests", () => { }); test("Can node render correctly", async function() { + this.timeout(120000); const explorer = DependencyExplorer.getInstance(contextManager.context); // validate root nodes @@ -28,13 +29,13 @@ suite("Gradle Project View Tests", () => { const projectChildren = await projectNode.getChildren(); assert.ok(!!projectChildren.find((c: DataNode) => c.name === "build.gradle")); assert.ok(!!projectChildren.find((c: DataNode) => c.name === ".vscode")); - const mainPackage = projectChildren[0] as PackageRootNode; - assert.equal(mainPackage.name, "src/main/java", "Package name should be \"src/main/java\""); - const systemLibrary = projectChildren[1] as ContainerNode; - const gradleDependency = projectChildren[2] as ContainerNode; + const mainPackage = projectChildren.find((c: DataNode) => c.name === "src/main/java") as PackageRootNode; + assert.ok(mainPackage, "Should have src/main/java package root"); + const systemLibrary = projectChildren.find((c: DataNode) => c.name.startsWith("JRE System Library")) as ContainerNode; + const gradleDependency = projectChildren.find((c: DataNode) => c.name === "Project and External Dependencies") as ContainerNode; // only match prefix of system library since JDK version may differ - assert.ok(systemLibrary.name.startsWith("JRE System Library"), "Container name should start with JRE System Library"); - assert.equal(gradleDependency.name, "Project and External Dependencies", "Container name should be \"Project and External Dependencies\""); + assert.ok(systemLibrary, "Should have JRE System Library container"); + assert.ok(gradleDependency, "Should have Project and External Dependencies container"); // validate innermost layer nodes const mainClasses = await mainPackage.getChildren(); @@ -47,7 +48,9 @@ suite("Gradle Project View Tests", () => { const explorer = DependencyExplorer.getInstance(contextManager.context); const projectNode = (await explorer.dataProvider.getChildren())![0] as ProjectNode; - const mainPackage = (await projectNode.getChildren())[0] as PackageRootNode; + const projectChildren = await projectNode.getChildren(); + const mainPackage = projectChildren.find((c: DataNode) => c.name === "src/main/java") as PackageRootNode; + assert.ok(mainPackage, "Should have src/main/java"); const mainClass = (await mainPackage.getChildren())[0] as PrimaryTypeNode; assert.equal(fsPath(projectNode), Uris.GRADLE_PROJECT_NODE, "Project uri incorrect"); diff --git a/test/maven-suite/projectView.test.ts b/test/maven-suite/projectView.test.ts index ec305edd..c3999802 100644 --- a/test/maven-suite/projectView.test.ts +++ b/test/maven-suite/projectView.test.ts @@ -29,8 +29,9 @@ suite("Maven Project View Tests", () => { const projectChildren = await projectNode.getChildren(); assert.ok(!!projectChildren.find((c: DataNode) => c.name === "pom.xml")); assert.ok(!!projectChildren.find((c: DataNode) => c.name === ".vscode")); - assert.equal(projectChildren.length, 8, `Number of children should be 8, but was ${projectChildren.length}.\n${printNodes(projectChildren)}`); - const mainPackage = projectChildren[0] as PackageRootNode; + assert.ok(projectChildren.length >= 8, `Number of children should be at least 8, but was ${projectChildren.length}.\n${printNodes(projectChildren)}`); + const mainPackage = projectChildren.find((c: DataNode) => c.name === "src/main/java") as PackageRootNode; + assert.ok(mainPackage, "Should have src/main/java package root"); assert.equal(mainPackage.name, "src/main/java", "Package name should be \"src/main/java\""); const mainSourceSetChildren = await mainPackage.getChildren(); @@ -78,15 +79,15 @@ suite("Maven Project View Tests", () => { const projectChildren = await projectNode.getChildren(); assert.ok(!!projectChildren.find((c: DataNode) => c.name === "pom.xml")); assert.ok(!!projectChildren.find((c: DataNode) => c.name === ".vscode")); - const mainPackage = projectChildren[0] as PackageRootNode; - const testPackage = projectChildren[1] as PackageRootNode; - assert.equal(mainPackage.name, "src/main/java", "Package name should be \"src/main/java\""); - assert.equal(testPackage.name, "src/test/java", "Package name should be \"src/test/java\""); - const systemLibrary = projectChildren[2] as ContainerNode; - const mavenDependency = projectChildren[3] as ContainerNode; + const mainPackage = projectChildren.find((c: DataNode) => c.name === "src/main/java") as PackageRootNode; + const testPackage = projectChildren.find((c: DataNode) => c.name === "src/test/java") as PackageRootNode; + assert.ok(mainPackage, "Should have src/main/java package root"); + assert.ok(testPackage, "Should have src/test/java package root"); + const systemLibrary = projectChildren.find((c: DataNode) => c.name.startsWith("JRE System Library")) as ContainerNode; + const mavenDependency = projectChildren.find((c: DataNode) => c.name === "Maven Dependencies") as ContainerNode; // only match prefix of system library since JDK version may differ - assert.ok(systemLibrary.name.startsWith("JRE System Library"), "Container name should start with JRE System Library"); - assert.equal(mavenDependency.name, "Maven Dependencies", "Container name should be \"Maven Dependencies\""); + assert.ok(systemLibrary, "Should have JRE System Library container"); + assert.ok(mavenDependency, "Should have Maven Dependencies container"); // validate package nodes const mainSourceSetChildren = await mainPackage.getChildren(); @@ -129,8 +130,10 @@ suite("Maven Project View Tests", () => { const projectNode = (await explorer.dataProvider.getChildren())![0] as ProjectNode; const packageRoots = await projectNode.getChildren(); - const mainPackage = packageRoots[0] as PackageRootNode; - const testPackage = packageRoots[1] as PackageRootNode; + const mainPackage = packageRoots.find((c: DataNode) => c.name === "src/main/java") as PackageRootNode; + const testPackage = packageRoots.find((c: DataNode) => c.name === "src/test/java") as PackageRootNode; + assert.ok(mainPackage, "Should have src/main/java"); + assert.ok(testPackage, "Should have src/test/java"); const mainSubPackage = (await mainPackage.getChildren())[0] as PackageNode; const testSubPackage = (await testPackage.getChildren())[0] as PackageNode; const mainClass = (await mainSubPackage.getChildren())[0] as PrimaryTypeNode; @@ -253,7 +256,11 @@ suite("Maven Project View Tests", () => { const projectNode = (await explorer.dataProvider.getChildren())![0] as ProjectNode; const projectChildren = await projectNode.getChildren(); - assert.equal(projectChildren.length, 4); + // When showNonJavaResources is false, non-Java resource nodes (pom.xml, .vscode, .settings, etc.) should be hidden + assert.ok(!projectChildren.find((c: DataNode) => c.name === "pom.xml"), "pom.xml should be hidden"); + assert.ok(!projectChildren.find((c: DataNode) => c.name === ".vscode"), ".vscode should be hidden"); + assert.ok(!projectChildren.find((c: DataNode) => c.name === ".classpath"), ".classpath should be hidden"); + assert.ok(!projectChildren.find((c: DataNode) => c.name === ".project"), ".project should be hidden"); }); test("Can maven dependency nodes display in correct groupId:artifactId:version format", async function() { @@ -262,7 +269,8 @@ suite("Maven Project View Tests", () => { const roots = await explorer.dataProvider.getChildren(); const projectNode = roots![0] as ProjectNode; const projectChildren = await projectNode.getChildren(); - const mavenDependency = projectChildren[3] as ContainerNode; + const mavenDependency = projectChildren.find((c: DataNode) => c.name === "Maven Dependencies") as ContainerNode; + assert.ok(mavenDependency, "Should have Maven Dependencies container"); const mavenChildren = await mavenDependency.getChildren(); assert.equal(mavenChildren[0].getDisplayName(), "org.hamcrest:hamcrest-core:1.3"); diff --git a/test/multi-module-suite/projectView.test.ts b/test/multi-module-suite/projectView.test.ts index e54e9336..5776ae80 100644 --- a/test/multi-module-suite/projectView.test.ts +++ b/test/multi-module-suite/projectView.test.ts @@ -4,21 +4,32 @@ import * as assert from "assert"; import { contextManager, DependencyExplorer, FileNode, + languageServerApiManager, ProjectNode } from "../../extension.bundle"; import { printNodes, setupTestEnv } from "../shared"; // tslint:disable: only-arrow-functions suite("Multi Module Tests", () => { - suiteSetup(setupTestEnv); + suiteSetup(async () => { + await setupTestEnv(); + await languageServerApiManager.ready(); + }); test("Can open module with name equal or longer than folder name correctly", async function() { + this.timeout(120000); const explorer = DependencyExplorer.getInstance(contextManager.context); const roots = await explorer.dataProvider.getChildren(); + // Find the level1 submodule - LS may use .project name or folder name const nestedProjectNode = roots?.find(project => - project instanceof ProjectNode && project.name === 'de.myorg.myservice.level1') as ProjectNode; + project instanceof ProjectNode && ( + project.name === 'de.myorg.myservice.level1' || + project.name === 'fvclaus-de.myorg.myservice.level1' || + project.name === 'level1' + )) as ProjectNode; + assert.ok(nestedProjectNode, `Expected to find level1 project in roots:\n${roots?.map(r => (r as ProjectNode).name).join(', ')}`); const projectChildren = await nestedProjectNode.getChildren(); assert.ok(!!projectChildren.find(child => child instanceof FileNode && child.path?.endsWith('level1/pom.xml'), `Expected to find FileNode with level1 pom.xml in:\n${printNodes(projectChildren)}`)); }); diff --git a/test/simple-suite/projectView.test.ts b/test/simple-suite/projectView.test.ts index 862b28d4..29e39b97 100644 --- a/test/simple-suite/projectView.test.ts +++ b/test/simple-suite/projectView.test.ts @@ -18,7 +18,7 @@ suite("Simple Project View Tests", () => { const roots = await explorer.dataProvider.getChildren(); assert.equal(roots?.length, 1, "Number of root node should be 1"); const projectNode = roots![0] as ProjectNode; - assert.equal(projectNode.name, "1.helloworld", "Project name should be \"1.helloworld\""); + assert.equal(projectNode.name, "simple", "Project name should be \"simple\""); // validate package root/dependency nodes const projectChildren = await projectNode.getChildren(); diff --git a/test/simple/.project b/test/simple/.project index fa6f3f7a..ac7b1767 100644 --- a/test/simple/.project +++ b/test/simple/.project @@ -1,6 +1,6 @@ - 1.helloworld + simple From 9fdb617fbad2a9cad0cb0927fb2915ed1d45043a Mon Sep 17 00:00:00 2001 From: wenyt <75360946+wenytang-ms@users.noreply.github.com> Date: Thu, 23 Apr 2026 15:31:09 +0800 Subject: [PATCH 293/352] perf: adjust exp (#994) * perf: adjust instrument and skill, add more telemetry to lsp tool * perf: adjust the instrument * ci: fix ci * chore: update --- package.json | 116 +----------------- .../javaLspContext.instructions.md | 51 ++------ resources/skills/java-lsp-tools/SKILL.md | 98 ++++----------- src/copilot/tools/javaContextTools.ts | 92 +++++++++----- 4 files changed, 92 insertions(+), 265 deletions(-) diff --git a/package.json b/package.json index aa9cf9ce..a058e657 100644 --- a/package.json +++ b/package.json @@ -52,7 +52,7 @@ { "name": "lsp_java_getFileStructure", "toolReferenceName": "javaFileStructure", - "modelDescription": "Get the structure (classes, methods, fields, inner classes) of a Java file. Returns a hierarchical outline with symbol kinds and line ranges. Use this first when you need to understand a file's layout before reading specific sections.", + "modelDescription": "Get the structure (classes, methods, fields, inner classes) of a Java file. Returns a hierarchical outline with symbol kinds and line ranges in ~100 tokens.\n\nWhen to use:\n- Before reading a Java file, to understand its layout and find specific line ranges\n- Instead of read_file on the entire file — use this first, then read_file on specific lines\n- When you need to know what methods/fields a class has\n\nWhen NOT to use:\n- For non-Java files (use read_file instead)\n- To search across multiple files (use lsp_java_findSymbol instead)", "displayName": "Java: Get File Structure", "canBeReferencedInPrompt": true, "icon": "$(symbol-class)", @@ -71,7 +71,7 @@ { "name": "lsp_java_findSymbol", "toolReferenceName": "javaFindSymbol", - "modelDescription": "Search for Java symbols (classes, interfaces, methods, fields) across the workspace by name. Supports partial/fuzzy matching. Use this to find where a class or method is defined.", + "modelDescription": "Search for Java symbol definitions (classes, interfaces, methods, fields) across the entire workspace by name. Returns precise locations in ~60 tokens vs ~500+ tokens from grep_search.\n\nWhen to use:\n- To find where a class, method, or field is defined — faster and more precise than grep_search\n- To discover file paths before using other tools\n- Supports partial matching (e.g. 'UserSvc' finds 'UserServiceImpl')\n\nWhen NOT to use:\n- For non-Java files\n- To search for string literals, comments, or non-symbol text (use grep_search)", "displayName": "Java: Find Symbol", "canBeReferencedInPrompt": true, "icon": "$(search)", @@ -90,118 +90,6 @@ }, "required": ["query"] } - }, - { - "name": "lsp_java_getFileImports", - "toolReferenceName": "javaFileImports", - "modelDescription": "Get all import statements from a Java file, classified by source (jdk/project/external).", - "displayName": "Java: Get File Imports", - "canBeReferencedInPrompt": true, - "icon": "$(references)", - "when": "config.vscode-java-dependency.enableLspTools && javaLSReady", - "inputSchema": { - "type": "object", - "properties": { - "uri": { - "type": "string", - "description": "Java file path (workspace-relative or full URI)" - } - }, - "required": ["uri"] - } - }, - { - "name": "lsp_java_getTypeAtPosition", - "toolReferenceName": "javaTypeAtPosition", - "modelDescription": "Get the compiler-resolved type signature at a specific position. Returns fully qualified type, method signature, or field declaration. Use this when you see var, lambdas, or generics and need the exact type.", - "displayName": "Java: Get Type at Position", - "canBeReferencedInPrompt": true, - "icon": "$(symbol-field)", - "when": "config.vscode-java-dependency.enableLspTools && javaLSReady", - "inputSchema": { - "type": "object", - "properties": { - "uri": { - "type": "string", - "description": "Java file path (workspace-relative or full URI)" - }, - "line": { - "type": "number", - "description": "Zero-based line number" - }, - "character": { - "type": "number", - "description": "Zero-based character offset" - } - }, - "required": ["uri", "line", "character"] - } - }, - { - "name": "lsp_java_getCallHierarchy", - "toolReferenceName": "javaCallHierarchy", - "modelDescription": "Get incoming callers or outgoing callees of a method. PREFER THIS over grep_search when you need to find which methods call a specific method — returns precise call sites without noise from comments, imports, or string matches. Use 'incoming' for callers, 'outgoing' for callees.", - "displayName": "Java: Get Call Hierarchy", - "canBeReferencedInPrompt": true, - "icon": "$(call-incoming)", - "when": "config.vscode-java-dependency.enableLspTools && javaLSReady", - "inputSchema": { - "type": "object", - "properties": { - "uri": { - "type": "string", - "description": "Java file path (workspace-relative or full URI)" - }, - "line": { - "type": "number", - "description": "Zero-based line number of the method" - }, - "character": { - "type": "number", - "description": "Zero-based character offset within the method name" - }, - "direction": { - "type": "string", - "enum": ["incoming", "outgoing"], - "default": "incoming", - "description": "'incoming' for callers, 'outgoing' for callees" - } - }, - "required": ["uri", "line", "character", "direction"] - } - }, - { - "name": "lsp_java_getTypeHierarchy", - "toolReferenceName": "javaTypeHierarchy", - "modelDescription": "Get supertypes or subtypes/implementors of a type. PREFER THIS over grep_search('extends|implements') — returns only actual inheritance relationships. Use 'supertypes' for parents, 'subtypes' for children.", - "displayName": "Java: Get Type Hierarchy", - "canBeReferencedInPrompt": true, - "icon": "$(type-hierarchy)", - "when": "config.vscode-java-dependency.enableLspTools && javaLSReady", - "inputSchema": { - "type": "object", - "properties": { - "uri": { - "type": "string", - "description": "Java file path (workspace-relative or full URI)" - }, - "line": { - "type": "number", - "description": "Zero-based line number of the type" - }, - "character": { - "type": "number", - "description": "Zero-based character offset within the type name" - }, - "direction": { - "type": "string", - "enum": ["supertypes", "subtypes"], - "default": "supertypes", - "description": "'supertypes' for parents, 'subtypes' for children" - } - }, - "required": ["uri", "line", "character", "direction"] - } } ], "commands": [ diff --git a/resources/instruments/javaLspContext.instructions.md b/resources/instruments/javaLspContext.instructions.md index 492598c7..be0d015c 100644 --- a/resources/instruments/javaLspContext.instructions.md +++ b/resources/instruments/javaLspContext.instructions.md @@ -1,51 +1,14 @@ --- -description: Unconditionally loaded for all Java projects. Provides Java LSP tools (lsp_java_*) for compiler-accurate code navigation — significantly faster and more precise than grep_search, search_subagent, or read_file for locating Java symbols, callers, implementations, and types. -applyTo: '*' +description: REQUIRED for Java files. Provides compiler-accurate lsp_java_findSymbol and lsp_java_getFileStructure tools that replace grep_search, search_subagent, semantic_search, and file_search for Java symbol navigation. +applyTo: '**/*.java' --- -# Java LSP Tools — Mandatory Initialization +For Java files, two compiler-accurate `lsp_java_*` tools are available and return structured results in ~50 tokens vs ~500+ from generic search: -This workspace contains Java code. You have access to 6 compiler-accurate LSP tools that are **faster and more precise** than generic search for Java code navigation. These tools return structured results in ~20-100 tokens vs ~500-3000 tokens from grep_search, with zero false positives. +- `lsp_java_findSymbol(query)` — find class/method/field definitions by name across the workspace +- `lsp_java_getFileStructure(uri)` — get file outline (classes, methods, fields) with line ranges -## Step 1: Load Tools (REQUIRED — do this FIRST) +These are deferred tools. Load them with `tool_search_tool_regex` using pattern `lsp_java_` before first use. -Before ANY operation, load all 6 tools by calling `tool_search_tool_regex` **twice** (the API returns at most 5 tools per call): - -**Call 1** — basic navigation tools: -``` -lsp_java_findSymbol|lsp_java_getFileStructure|lsp_java_getFileImports -``` - -**Call 2** — hierarchy and type tools: -``` -lsp_java_getCallHierarchy|lsp_java_getTypeHierarchy|lsp_java_getTypeAtPosition -``` - -All 6 tools must be returned across the two calls. If any are missing, retry that call once. Do NOT use `grep_search`, `read_file`, `semantic_search`, `search_subagent`, or `runSubagent` on `.java` files until all tools are loaded. - -## Step 2: Always Prefer LSP Tools for Java - -| Task | ✅ Use | ❌ Not | -|---|---|---| -| Find class/method/field definition | `lsp_java_findSymbol` | `grep_search`, `semantic_search`, `search_subagent` | -| See file outline (methods, fields) | `lsp_java_getFileStructure` | `read_file` full scan | -| Find all callers of a method | `lsp_java_getCallHierarchy("incoming")` | `grep_search`, `search_subagent` | -| Find all implementations | `lsp_java_getTypeHierarchy("subtypes")` | `grep_search`, `search_subagent` | -| Resolve var/lambda/generic type | `lsp_java_getTypeAtPosition` | Guessing from code | -| Check imports | `lsp_java_getFileImports` | `read_file` first lines | -| Explore Java codebase structure | `lsp_java_*` tools above | `search_subagent`, `runSubagent` | - -**Keep using `grep_search`** for: non-Java files (xml, yaml, gradle), string literals, comments. - -**Self-check**: Before every `.java` operation, ask: "Is there a `lsp_java_*` tool for this?" If yes, use it instead of `grep_search`, `search_subagent`, or `runSubagent`. - -## Typical Workflow - -**findSymbol → getFileStructure → targeted tool → read_file (specific lines only)** - -## Fallback - -- `findSymbol` returns empty → retry with shorter keyword, then fall back to `grep_search` -- Path error → use `findSymbol` to discover correct path first -- Tool error / jdtls not ready → fall back to `read_file` + `grep_search`, don't retry more than once +Prefer these over `grep_search`, `search_subagent`, `semantic_search`, `file_search`, or full-file `read_file` when navigating Java symbols. Fall back to `grep_search` if a tool returns empty or errors. diff --git a/resources/skills/java-lsp-tools/SKILL.md b/resources/skills/java-lsp-tools/SKILL.md index 6fd6633c..04936e92 100644 --- a/resources/skills/java-lsp-tools/SKILL.md +++ b/resources/skills/java-lsp-tools/SKILL.md @@ -1,93 +1,41 @@ --- name: java-lsp-tools -description: Compiler-accurate Java code intelligence tools powered by the Java Language Server. ALWAYS load this skill when the workspace contains Java, Maven (pom.xml), or Gradle (build.gradle) projects. Use these tools to find symbol definitions, get type/call hierarchies, resolve types, inspect file outlines, and check imports in Java source files. Prefer over grep_search or read_file for any Java code navigation, understanding, debugging, or refactoring task. +description: Compiler-accurate Java code navigation via the Java Language Server. Use lsp_java_findSymbol to locate symbols and lsp_java_getFileStructure to inspect file outlines. Prefer over grep_search for Java symbol navigation. --- # Java LSP Tools -Compiler-accurate Java code intelligence via the Java Language Server (jdtls). These 6 tools provide structured, low-token answers that are more precise than `grep_search` or `read_file` for Java code. - -## Activation - -These tools are **deferred** and must be discovered before first use. Activate all 6 tools at once with `tool_search_tool_regex` using pattern: - -`lsp_java_findSymbol|lsp_java_getFileStructure|lsp_java_getCallHierarchy|lsp_java_getTypeHierarchy|lsp_java_getTypeAtPosition|lsp_java_getFileImports` - -You only need to do this **once per session**. - -## When to Replace grep_search - -For Java source files, **always prefer these tools over generic alternatives**: - -| You're doing... | Use instead | Why | -|---|---|---| -| Find where a class/method is defined | `lsp_java_findSymbol` | ~60 tokens vs ~500 for grep (no comment/import noise) | -| Find all callers of a method | `lsp_java_getCallHierarchy("incoming")` | ~80 tokens vs ~3000 for grep (precise call sites only) | -| Find all implementations of an interface | `lsp_java_getTypeHierarchy("subtypes")` | ~60 tokens vs ~1000 for grep | -| Check a `var`/lambda/generic type | `lsp_java_getTypeAtPosition` | ~20 tokens vs guessing wrong | -| Search in non-Java files (xml, yaml, gradle) | Keep using `grep_search` | lsp_java_* tools only work on Java source | -| Search for string literals or comments | Keep using `grep_search` | lsp_java_* tools return symbol definitions only | - -**Rule of thumb**: If you're searching for a Java symbol name in `.java` files, there is almost always a `lsp_java_*` tool that returns more precise results with fewer tokens than `grep_search`. - -## Anti-patterns (Avoid these) - -❌ **Don't**: Use `grep_search("decodeLbs")` to find who calls `decodeLbs()` - - Returns 8+ matches including declaration, comments, imports → ~3000 output tokens - -✅ **Do**: Use `lsp_java_getCallHierarchy(uri, line, char, "incoming")` - - Returns only actual call sites → ~80 output tokens - -❌ **Don't**: Use `grep_search("class.*extends BaseDecoder")` to find subclasses -✅ **Do**: Use `lsp_java_getTypeHierarchy(uri, line, char, "subtypes")` - -❌ **Don't**: Read entire 1000+ line file to understand its structure -✅ **Do**: Use `lsp_java_getFileStructure(uri)` first, then `read_file` on specific line ranges +Two compiler-accurate tools backed by the Java Language Server (jdtls). They return structured JSON with fewer tokens than `grep_search` or `read_file`. ## Tools -All tools accept **workspace-relative paths** (e.g. `src/main/java/com/example/MyClass.java`) or full file URIs. All return structured JSON, each response < 200 tokens. - -### `lsp_java_getFileStructure` -Get hierarchical outline (classes, methods, fields) with line ranges. -Input: `{ uri }` → Output: symbol tree with `[L start-end]` ranges (~100 tokens) - ### `lsp_java_findSymbol` -Search for symbol definitions by name across the workspace. Supports partial/fuzzy matching. -Input: `{ query }` → Output: up to 20 results with `{ name, kind, location }` (~60 tokens) +Search for Java symbol definitions (classes, methods, fields) by name across the workspace. Supports partial matching. +- Input: `{ query, limit? }` — limit defaults to 20, max 50 +- Output: `{ name, kind, location }` per result (~60 tokens) +- **Use instead of** `grep_search` when looking for where a class/method is defined -### `lsp_java_getFileImports` -Get all imports classified by source (jdk/project/external). -Input: `{ uri }` → Output: classified import list (~80 tokens) - -### `lsp_java_getTypeAtPosition` -Get compiler-resolved type signature at a specific position. -Input: `{ uri, line, character }` (0-based) → Output: fully resolved type (~20 tokens) - -### `lsp_java_getCallHierarchy` -Find all callers (incoming) or callees (outgoing) of a method. -Input: `{ uri, line, character, direction }` (0-based, direction: `"incoming"` | `"outgoing"`) → Output: list of `{ name, detail, location }` (~80 tokens) +### `lsp_java_getFileStructure` +Get hierarchical outline of a Java file (classes, methods, fields) with line ranges. +- Input: `{ uri }` — workspace-relative path or full URI +- Output: symbol tree with `L start-end` ranges (~100 tokens) +- **Use instead of** `read_file` full scan when you need to understand a file's layout -### `lsp_java_getTypeHierarchy` -Find supertypes or subtypes/implementors of a type. -Input: `{ uri, line, character, direction }` (0-based, direction: `"supertypes"` | `"subtypes"`) → Output: list of `{ name, kind, location }` (~60 tokens) +## When to Use -## Common Workflows +| Task | Use | Not | +|---|---|---| +| Find class/method/field definition | `lsp_java_findSymbol` | `grep_search` | +| See file outline before reading | `lsp_java_getFileStructure` | `read_file` full file | +| Search non-Java files (xml, gradle) | `grep_search` | lsp tools | +| Search string literals or comments | `grep_search` | lsp tools | -Most tasks follow the pattern: **findSymbol → getFileStructure → targeted tool**. +## Typical Workflow -| Scenario | Workflow | Trigger | -|---|---|---| -| Debug a bug | `findSymbol` → `getFileStructure` → `read_file` (buggy method) → **`getCallHierarchy("incoming")`** → `read_file` (caller context) | When you found the buggy method and need to know ALL callers | -| Analyze impact | `findSymbol` → `getFileStructure` → `getCallHierarchy("incoming")` | Before editing a method, check who depends on it | -| Understand inheritance | `findSymbol` → `getTypeHierarchy("subtypes")` | When you see a base class and need all implementations | -| Check dependencies | `getFileImports` → `findSymbol` (dependency) → `getFileStructure` | When understanding external library usage | -| Resolve type ambiguity | `getFileStructure` → `getTypeAtPosition` | When you see `var`, generics, or lambda and need exact type | +**findSymbol → getFileStructure → read_file (specific lines only)** ## Fallback -- **`lsp_java_findSymbol` returns empty**: - - Symbol may not exist yet → switch to `read_file` + `grep_search` to confirm, then create it - - Spelling/query too specific → retry once with a shorter keyword (e.g. `"UserSvc"` instead of `"UserServiceImpl"`) -- **Path error** (e.g. "Unable to resolve nonexistent file"): Use `lsp_java_findSymbol` to discover the correct file path first, then retry. -- **Tool error / empty result** (jdtls not ready, file not in project): Fall back to `read_file` + `grep_search`. Don't retry more than once. +- `findSymbol` returns empty → retry with shorter keyword, then fall back to `grep_search` +- Path error → use `findSymbol` to discover correct path first +- Tool error / jdtls not ready → fall back to `grep_search` + `read_file`, don't retry more than once diff --git a/src/copilot/tools/javaContextTools.ts b/src/copilot/tools/javaContextTools.ts index 24b43594..47573089 100644 --- a/src/copilot/tools/javaContextTools.ts +++ b/src/copilot/tools/javaContextTools.ts @@ -93,18 +93,34 @@ interface FileStructureInput { const fileStructureTool: vscode.LanguageModelTool = { async invoke(options, _token) { - sendInfo("", { operationName: "lmTool.getFileStructure" }); - const uri = resolveFileUri(options.input.uri); - const symbols = await vscode.commands.executeCommand( - "vscode.executeDocumentSymbolProvider", uri, - ); - if (!symbols || symbols.length === 0) { - return toResult({ error: "No symbols found. The file may not be recognized by the Java language server." }); + const startTime = Date.now(); + let resultCount = 0; + let status = "success"; + try { + const uri = resolveFileUri(options.input.uri); + const symbols = await vscode.commands.executeCommand( + "vscode.executeDocumentSymbolProvider", uri, + ); + if (!symbols || symbols.length === 0) { + status = "empty"; + return toResult({ error: "No symbols found. The file may not be recognized by the Java language server." }); + } + const counter = { count: 0 }; + const result = symbolsToJson(symbols, 0, counter); + const truncated = counter.count >= MAX_SYMBOL_NODES; + resultCount = counter.count; + return toResult({ symbols: result, ...(truncated && { truncated: true }) }); + } catch (e) { + status = "error"; + throw e; + } finally { + sendInfo("", { + operationName: "lmTool.getFileStructure", + status, + resultCount: String(resultCount), + durationMs: String(Date.now() - startTime), + }); } - const counter = { count: 0 }; - const result = symbolsToJson(symbols, 0, counter); - const truncated = counter.count >= MAX_SYMBOL_NODES; - return toResult({ symbols: result, ...(truncated && { truncated: true }) }); }, }; @@ -150,20 +166,36 @@ interface FindSymbolInput { const findSymbolTool: vscode.LanguageModelTool = { async invoke(options, _token) { - sendInfo("", { operationName: "lmTool.findSymbol" }); - const symbols = await vscode.commands.executeCommand( - "vscode.executeWorkspaceSymbolProvider", options.input.query, - ); - if (!symbols || symbols.length === 0) { - return toResult({ results: [], message: `No symbols matching '${options.input.query}' found.` }); + const startTime = Date.now(); + let resultCount = 0; + let status = "success"; + try { + const symbols = await vscode.commands.executeCommand( + "vscode.executeWorkspaceSymbolProvider", options.input.query, + ); + if (!symbols || symbols.length === 0) { + status = "empty"; + return toResult({ results: [], message: `No symbols matching '${options.input.query}' found.` }); + } + const limit = Math.min(Math.max(options.input.limit || 20, 1), 50); + const results = symbols.slice(0, limit).map(s => ({ + name: s.name, + kind: vscode.SymbolKind[s.kind], + location: `${vscode.workspace.asRelativePath(s.location.uri)}:${s.location.range.start.line + 1}`, + })); + resultCount = results.length; + return toResult({ results, total: symbols.length }); + } catch (e) { + status = "error"; + throw e; + } finally { + sendInfo("", { + operationName: "lmTool.findSymbol", + status, + resultCount: String(resultCount), + durationMs: String(Date.now() - startTime), + }); } - const limit = Math.min(Math.max(options.input.limit || 20, 1), 50); - const results = symbols.slice(0, limit).map(s => ({ - name: s.name, - kind: vscode.SymbolKind[s.kind], - location: `${vscode.workspace.asRelativePath(s.location.uri)}:${s.location.range.start.line + 1}`, - })); - return toResult({ results, total: symbols.length }); }, }; @@ -175,7 +207,7 @@ interface FileImportsInput { uri: string; } -const fileImportsTool: vscode.LanguageModelTool = { +export const _fileImportsTool: vscode.LanguageModelTool = { async invoke(options, _token) { sendInfo("", { operationName: "lmTool.getFileImports" }); const uri = resolveFileUri(options.input.uri); @@ -204,7 +236,7 @@ interface TypeAtPositionInput { character: number; } -const typeAtPositionTool: vscode.LanguageModelTool = { +export const _typeAtPositionTool: vscode.LanguageModelTool = { async invoke(options, _token) { sendInfo("", { operationName: "lmTool.getTypeAtPosition" }); const uri = resolveFileUri(options.input.uri); @@ -264,7 +296,7 @@ interface CallHierarchyInput { direction: "incoming" | "outgoing"; } -const callHierarchyTool: vscode.LanguageModelTool = { +export const _callHierarchyTool: vscode.LanguageModelTool = { async invoke(options, _token) { sendInfo("", { operationName: "lmTool.getCallHierarchy" }); const uri = resolveFileUri(options.input.uri); @@ -323,7 +355,7 @@ interface TypeHierarchyInput { direction: "supertypes" | "subtypes"; } -const typeHierarchyTool: vscode.LanguageModelTool = { +export const _typeHierarchyTool: vscode.LanguageModelTool = { async invoke(options, _token) { sendInfo("", { operationName: "lmTool.getTypeHierarchy" }); const uri = resolveFileUri(options.input.uri); @@ -378,9 +410,5 @@ export function registerJavaContextTools(context: vscode.ExtensionContext): void context.subscriptions.push( vscode.lm.registerTool("lsp_java_getFileStructure", fileStructureTool), vscode.lm.registerTool("lsp_java_findSymbol", findSymbolTool), - vscode.lm.registerTool("lsp_java_getFileImports", fileImportsTool), - vscode.lm.registerTool("lsp_java_getTypeAtPosition", typeAtPositionTool), - vscode.lm.registerTool("lsp_java_getCallHierarchy", callHierarchyTool), - vscode.lm.registerTool("lsp_java_getTypeHierarchy", typeHierarchyTool), ); } From e02fd0f88a82ce3121a48845c480a56825a5e495 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 23 Apr 2026 16:17:00 +0800 Subject: [PATCH 294/352] chore(deps): Bump follow-redirects from 1.15.11 to 1.16.0 (#992) Bumps [follow-redirects](https://github.com/follow-redirects/follow-redirects) from 1.15.11 to 1.16.0. - [Release notes](https://github.com/follow-redirects/follow-redirects/releases) - [Commits](https://github.com/follow-redirects/follow-redirects/compare/v1.15.11...v1.16.0) --- updated-dependencies: - dependency-name: follow-redirects dependency-version: 1.16.0 dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index 772b3a2c..3c0c48e7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -3605,9 +3605,9 @@ } }, "node_modules/follow-redirects": { - "version": "1.15.11", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.11.tgz", - "integrity": "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==", + "version": "1.16.0", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.16.0.tgz", + "integrity": "sha512-y5rN/uOsadFT/JfYwhxRS5R7Qce+g3zG97+JrtFZlC9klX/W5hD7iiLzScI4nZqUS7DNUdhPgw4xI8W2LuXlUw==", "funding": [ { "type": "individual", @@ -11238,9 +11238,9 @@ } }, "follow-redirects": { - "version": "1.15.11", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.11.tgz", - "integrity": "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==" + "version": "1.16.0", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.16.0.tgz", + "integrity": "sha512-y5rN/uOsadFT/JfYwhxRS5R7Qce+g3zG97+JrtFZlC9klX/W5hD7iiLzScI4nZqUS7DNUdhPgw4xI8W2LuXlUw==" }, "foreground-child": { "version": "3.3.1", From e166e6973e1a6f49f5b9530b132d095bba43dcdc Mon Sep 17 00:00:00 2001 From: wenyt <75360946+wenytang-ms@users.noreply.github.com> Date: Fri, 24 Apr 2026 11:28:47 +0800 Subject: [PATCH 295/352] test: migrate e2e tests from Playwright to autotest YAML framework (#995) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * fix: support Unicode identifiers in Java class name validation (#789) Change isJavaIdentifier() regex from ASCII-only /^([a-zA-Z_$][a-zA-Z\d_$]*)$/ to Unicode-aware regex using ES2018 property escapes per JLS §3.8. This allows non-ASCII identifiers (e.g., Japanese ほげ, Chinese 中文类名, accented Ñoño) to be accepted in the New Java File and Rename wizards. Fixes microsoft/vscode-java-dependency#789 Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * test: fix flaky simple project name assertion The .project file defined name '1.helloworld' but JDT LS may override it with the folder name 'simple'. Align .project name with folder name to eliminate the inconsistency. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * test: use name-based lookups instead of hardcoded indices JDT LS may return additional source roots (e.g. target/generated-sources) that shift node indices. Replace hardcoded array indices with find()-by-name lookups to make tests resilient to JDT LS version differences. - Maven: find containers by name instead of [2]/[3] - Maven: check specific nodes hidden instead of exact count - Gradle: find nodes by name, increase timeout to 120s - Multi-module: add assertion guard before getChildren() Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * ci: upgrade GitHub Actions to v4, fix multi-module test LS readiness - Upgrade actions/checkout@v2 -> @v4, actions/setup-java@v1 -> @v4, actions/setup-node@v2 -> @v4 across all 3 CI workflows - setup-java@v4 with distribution: temurin fixes macOS ARM64 JAVA_HOME - Multi-module test: add languageServerApiManager.ready() to suiteSetup so Maven module names are fully resolved before assertions - Accept folder name or .project name variants for level1 submodule Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * feat: migrate e2e tests from Playwright to autotest YAML framework Replace the Playwright-based e2e test suite with autotest YAML test plans: - Add test/e2e-plans/java-dep-project-explorer.yaml Covers: focus Java Projects, link/unlink with editor, tree expansion - Add test/e2e-plans/java-dep-file-operations.yaml Covers: create class, create package, rename file, delete file - Update linuxUI.yml and windowsUI.yml CI workflows to: Build VSIX → clone/build autotest → run-all test plans Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * fix: use npm install for autotest, fix rename flow for Linux CI - CI: replace git clone + build with 'npm install -g github:...' - Fix rename test: use open-file + link-with-editor instead of manual tree expansion (avoids tree hierarchy change after package creation) Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * fix: use npm registry for autotest install Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * fix: add wait before rename input, increase stability on Linux Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * fix: add LLM env vars to CI, fix rename flow stability - CI: add AZURE_OPENAI_* env vars, remove --no-llm - Rename test: click to select before context menu, add waitBefore - Rename test: add waitBefore to fillQuickInput for input box timing Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * fix: use fillAnyInput for rename (handles both inline and quick input) On Linux, context menu Rename may trigger VSCode's built-in inline tree rename instead of the extension's showInputBox. fillAnyInput detects whichever input appears and fills it. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * fix: rename uses fillAnyInput + confirmDialog, fix tab title - Rename: use fillAnyInput (handles both inline and quick input) - Rename: use confirmDialog instead of tryClickDialogButton OK - Fix verify tab title: 'AppRenamed' not 'AppRenamed.java' Local verification: 44/44 passed (31/31 + 13/13) Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --------- Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .github/workflows/linuxUI.yml | 16 +- .github/workflows/windowsUI.yml | 14 +- test/e2e-plans/java-dep-file-operations.yaml | 170 ++++++++++++++++++ test/e2e-plans/java-dep-project-explorer.yaml | 87 +++++++++ 4 files changed, 281 insertions(+), 6 deletions(-) create mode 100644 test/e2e-plans/java-dep-file-operations.yaml create mode 100644 test/e2e-plans/java-dep-project-explorer.yaml diff --git a/.github/workflows/linuxUI.yml b/.github/workflows/linuxUI.yml index cb09c4f5..583db06a 100644 --- a/.github/workflows/linuxUI.yml +++ b/.github/workflows/linuxUI.yml @@ -42,10 +42,20 @@ jobs: run: npm run build-server - name: Build VSIX file - run: vsce package + run: vsce package -o vscode-java-dependency.vsix - - name: E2E Test (Playwright) - run: DISPLAY=:99 npm run test-e2e + - name: Setup autotest + run: npm install -g @vscjava/vscode-autotest + + - name: E2E Test (autotest) + env: + AZURE_OPENAI_ENDPOINT: ${{ secrets.AZURE_OPENAI_ENDPOINT }} + AZURE_OPENAI_API_KEY: ${{ secrets.AZURE_OPENAI_API_KEY }} + AZURE_OPENAI_DEPLOYMENT: ${{ secrets.AZURE_OPENAI_DEPLOYMENT }} + run: | + DISPLAY=:99 autotest run-all test/e2e-plans \ + --vsix $(pwd)/vscode-java-dependency.vsix \ + --output test-results - name: Upload test results if: ${{ always() }} diff --git a/.github/workflows/windowsUI.yml b/.github/workflows/windowsUI.yml index aad11d73..bd3c274f 100644 --- a/.github/workflows/windowsUI.yml +++ b/.github/workflows/windowsUI.yml @@ -42,10 +42,18 @@ jobs: run: npm run build-server - name: Build VSIX file - run: vsce package + run: vsce package -o vscode-java-dependency.vsix - - name: E2E Test (Playwright) - run: npm run test-e2e + - name: Setup autotest + run: npm install -g @vscjava/vscode-autotest + + - name: E2E Test (autotest) + env: + AZURE_OPENAI_ENDPOINT: ${{ secrets.AZURE_OPENAI_ENDPOINT }} + AZURE_OPENAI_API_KEY: ${{ secrets.AZURE_OPENAI_API_KEY }} + AZURE_OPENAI_DEPLOYMENT: ${{ secrets.AZURE_OPENAI_DEPLOYMENT }} + run: | + autotest run-all test/e2e-plans --vsix "$((Get-Location).Path)\vscode-java-dependency.vsix" --output test-results - name: Upload test results if: ${{ always() }} diff --git a/test/e2e-plans/java-dep-file-operations.yaml b/test/e2e-plans/java-dep-file-operations.yaml new file mode 100644 index 00000000..b06d3532 --- /dev/null +++ b/test/e2e-plans/java-dep-file-operations.yaml @@ -0,0 +1,170 @@ +# Test Plan: Java Dependency — File Operations +# +# Covers fileOperations.test.ts scenarios: +# - create new Java class +# - create new package +# - rename Java file +# - delete Java file +# +# Note: The workspace is auto-copied to a temp directory by autotest, +# so rename/delete operations don't pollute the source test fixtures. +# +# Usage: +# npx autotest run test/e2e-plans/java-dep-file-operations.yaml --vsix + +name: "Java Dependency — File Operations" +description: | + Tests file/resource operations in the Java Projects view: + create class, create package, rename file, delete file. + Replaces test/e2e/tests/fileOperations.test.ts. + +setup: + extension: "redhat.java" + vscodeVersion: "stable" + workspace: "../maven" + timeout: 180 + settings: + java.configuration.checkProjectSettingsExclusions: false + +steps: + # ── Setup: wait for LS, focus Java Projects ── + - id: "ls-ready" + action: "waitForLanguageServer" + verify: "Java Language Server is ready" + timeout: 180 + + - id: "focus-java-projects" + action: "run command Java Projects: Focus on Java Projects View" + verify: "Java Projects view is focused" + + - id: "wait-tree-load" + action: "wait 3 seconds" + + # ── Test 1: create new Java class ── + - id: "click-project-node" + action: "click my-app tree item" + + - id: "trigger-new-resource" + action: "clickTreeItemAction my-app New..." + verify: "New resource quick pick opened" + + - id: "select-java-class" + action: "selectOptionByIndex 0" + verify: "Java Class selected" + + - id: "select-source-folder" + action: "select src/main/java option" + verify: "Source folder selected" + + - id: "enter-class-name" + action: "fillQuickInput App2" + verify: "Class name entered" + + - id: "verify-new-class-tab" + action: "wait 2 seconds" + verify: "Editor tab App2.java should appear" + verifyEditorTab: + title: "App2.java" + timeout: 15 + + # ── Test 2: create new package ── + - id: "focus-java-projects-2" + action: "run command Java Projects: Focus on Java Projects View" + + - id: "click-project-node-2" + action: "click my-app tree item" + + - id: "trigger-new-resource-2" + action: "clickTreeItemAction my-app New..." + + - id: "select-package" + action: "select Package option" + verify: "Package selected" + + - id: "select-source-folder-2" + action: "select src/main/java option" + + - id: "enter-package-name" + action: "fillQuickInput com.mycompany.newpkg" + verify: "Package name entered" + + - id: "wait-package-creation" + action: "wait 3 seconds" + verify: "Package directory created" + + # ── Test 3: rename Java file ── + # Open the target file, let link-with-editor reveal it in the tree, + # then click to select it and trigger rename via context menu. + - id: "open-rename-target" + action: "open file AppToRename.java" + waitBefore: 3 + + - id: "focus-java-projects-3" + action: "run command Java Projects: Focus on Java Projects View" + waitBefore: 3 + + # Click the tree item first to select it + - id: "select-rename-target" + action: "click AppToRename tree item" + waitBefore: 2 + + # Use context menu to trigger extension's rename (shows showInputBox) + - id: "rename-context-menu" + action: "contextMenu AppToRename Rename" + verify: "Rename input box opened" + + - id: "enter-new-name" + action: "fillAnyInput AppRenamed" + verify: "New name entered and confirmed" + waitBefore: 2 + + # Handle optional rename confirmation dialog — may not appear on all platforms + # (Electron native dialog is auto-dismissed by monkey-patch) + - id: "handle-rename-dialog" + action: "confirmDialog" + verify: "Rename confirmation handled (if present)" + + # Handle optional Refactor Preview panel + - id: "handle-refactor-preview" + action: "tryClickButton Apply" + verify: "Refactor preview applied (if present)" + + - id: "wait-rename" + action: "wait 3 seconds" + + - id: "verify-renamed-tab" + action: "wait 1 seconds" + verify: "Editor tab AppRenamed should appear" + verifyEditorTab: + title: "AppRenamed" + timeout: 15 + + # ── Test 4: delete Java file ── + # Instead of manually expanding the tree (which requires viewport space), + # open the file and let link-with-editor reveal it in the tree. + - id: "open-delete-target" + action: "open file AppToDelete.java" + waitBefore: 5 + + - id: "focus-java-projects-4" + action: "run command Java Projects: Focus on Java Projects View" + waitBefore: 2 + + - id: "delete-context-menu" + action: "contextMenu AppToDelete Delete" + verify: "Delete confirmation triggered" + + # VSCode shows a platform-specific confirmation dialog for delete + - id: "confirm-delete" + action: "confirmDialog" + + - id: "wait-delete" + action: "wait 3 seconds" + + - id: "verify-deleted" + action: "wait 1 seconds" + verify: "AppToDelete tree item should disappear" + verifyTreeItem: + name: "AppToDelete" + visible: false + timeout: 15 diff --git a/test/e2e-plans/java-dep-project-explorer.yaml b/test/e2e-plans/java-dep-project-explorer.yaml new file mode 100644 index 00000000..e14a4f81 --- /dev/null +++ b/test/e2e-plans/java-dep-project-explorer.yaml @@ -0,0 +1,87 @@ +# Test Plan: Java Dependency — Project Explorer +# +# Covers projectExplorer.test.ts scenarios: +# - javaProjectExplorer.focus shows Java Projects section +# - linkWithFolderExplorer reveals active file in tree +# - unlinkWithFolderExplorer stops auto-reveal +# +# Usage: +# npx autotest run test/e2e-plans/java-dep-project-explorer.yaml --vsix + +name: "Java Dependency — Project Explorer" +description: | + Tests the Java Projects explorer view: focus, link/unlink with editor. + Replaces test/e2e/tests/projectExplorer.test.ts. + +setup: + extension: "redhat.java" + vscodeVersion: "stable" + workspace: "../maven" + timeout: 180 + settings: + java.configuration.checkProjectSettingsExclusions: false + +steps: + # ── Wait for LS ready ── + - id: "ls-ready" + action: "waitForLanguageServer" + verify: "Java Language Server is ready" + timeout: 180 + + # ── Test 1: javaProjectExplorer.focus ── + - id: "focus-java-projects" + action: "run command Java Projects: Focus on Java Projects View" + verify: "Java Projects view is focused" + + - id: "wait-tree-load" + action: "wait 3 seconds" + + - id: "verify-project-node" + action: "wait 1 seconds" + verify: "my-app project node is visible in the tree" + verifyTreeItem: + name: "my-app" + timeout: 15 + + # ── Test 2: linkWithFolderExplorer ── + - id: "expand-project" + action: "expand my-app tree item" + + - id: "expand-src" + action: "expand src/main/java tree item" + waitBefore: 2 + + - id: "verify-package" + action: "wait 1 seconds" + verify: "Package com.mycompany.app is visible" + verifyTreeItem: + name: "com.mycompany.app" + timeout: 15 + + - id: "expand-package" + action: "expand com.mycompany.app tree item" + waitBefore: 2 + + - id: "verify-app-class" + action: "wait 1 seconds" + verify: "App class node is visible (exact match, not App.java or AppToDelete)" + verifyTreeItem: + name: "App" + exact: true + timeout: 15 + + # ── Test 3: unlinkWithFolderExplorer ── + - id: "unlink-editor" + action: "run command Java: Unlink with Editor" + verify: "Editor unlinked from tree" + + - id: "open-rename-file" + action: "open file AppToRename.java" + + - id: "wait-after-open" + action: "wait 3 seconds" + verify: "Tree should not auto-expand to AppToRename" + + - id: "relink-editor" + action: "run command Java: Link with Editor" + verify: "Editor re-linked with tree" From 247c7370d2d4c3b0ba23282a19520e324bcc3d6e Mon Sep 17 00:00:00 2001 From: wenyt <75360946+wenytang-ms@users.noreply.github.com> Date: Fri, 24 Apr 2026 15:27:16 +0800 Subject: [PATCH 296/352] feat: replace all e2e/UI tests with autotest, add revealInProjectExplorer (#996) - Delete test/e2e/ (Playwright) and test/ui/ (vscode-extension-tester) - Remove @playwright/test and vscode-extension-tester deps - Remove test-ui script, update test-e2e to use autotest - Add revealInProjectExplorer test to project-explorer plan - Add Write Job Summary step to CI workflows - Add LLM env vars to CI for failure analysis Coverage: 48 steps across 2 plans covering 8 scenarios: - Project Explorer: focus, link, unlink, revealInProjectExplorer - File Operations: create class, create package, rename, delete Scenarios NOT migrated (require native OS file dialogs): - addLibraries, addLibraryFolders, java.project.create Local verification: 48/48 passed (31/31 + 17/17) --- .github/workflows/linuxUI.yml | 7 + .github/workflows/windowsUI.yml | 8 + package.json | 5 +- test/e2e-plans/java-dep-project-explorer.yaml | 29 +- test/e2e/fixtures/baseTest.ts | 191 ------- test/e2e/globalSetup.ts | 34 -- test/e2e/playwright.config.ts | 29 - test/e2e/tests/fileOperations.test.ts | 130 ----- test/e2e/tests/libraries.test.ts | 39 -- test/e2e/tests/projectExplorer.test.ts | 62 --- test/e2e/utils/constants.ts | 61 --- test/e2e/utils/javaOperator.ts | 145 ----- test/e2e/utils/vscodeOperator.ts | 283 ---------- test/invisible/lib/simple.jar | Bin 0 -> 901 bytes test/ui/command.test.ts | 513 ------------------ test/ui/index.ts | 25 - 16 files changed, 42 insertions(+), 1519 deletions(-) delete mode 100644 test/e2e/fixtures/baseTest.ts delete mode 100644 test/e2e/globalSetup.ts delete mode 100644 test/e2e/playwright.config.ts delete mode 100644 test/e2e/tests/fileOperations.test.ts delete mode 100644 test/e2e/tests/libraries.test.ts delete mode 100644 test/e2e/tests/projectExplorer.test.ts delete mode 100644 test/e2e/utils/constants.ts delete mode 100644 test/e2e/utils/javaOperator.ts delete mode 100644 test/e2e/utils/vscodeOperator.ts create mode 100644 test/invisible/lib/simple.jar delete mode 100644 test/ui/command.test.ts delete mode 100644 test/ui/index.ts diff --git a/.github/workflows/linuxUI.yml b/.github/workflows/linuxUI.yml index 583db06a..ac24e494 100644 --- a/.github/workflows/linuxUI.yml +++ b/.github/workflows/linuxUI.yml @@ -64,3 +64,10 @@ jobs: name: e2e-results-linux path: test-results/ retention-days: 7 + + - name: Write Job Summary + if: always() + run: | + if [ -f test-results/summary.md ]; then + cat test-results/summary.md >> "$GITHUB_STEP_SUMMARY" + fi diff --git a/.github/workflows/windowsUI.yml b/.github/workflows/windowsUI.yml index bd3c274f..c92c6640 100644 --- a/.github/workflows/windowsUI.yml +++ b/.github/workflows/windowsUI.yml @@ -62,3 +62,11 @@ jobs: name: e2e-results-windows path: test-results/ retention-days: 7 + + - name: Write Job Summary + if: always() + shell: bash + run: | + if [ -f test-results/summary.md ]; then + cat test-results/summary.md >> "$GITHUB_STEP_SUMMARY" + fi diff --git a/package.json b/package.json index a058e657..e62892da 100644 --- a/package.json +++ b/package.json @@ -1150,8 +1150,7 @@ "compile": "tsc -p . && webpack --config webpack.config.js --mode development", "watch": "webpack --mode development --watch", "test": "tsc -p . && webpack --config webpack.config.js --mode development && node ./dist/test/index.js", - "test-ui": "tsc -p . && webpack --config webpack.config.js --mode development && node ./dist/test/ui/index.js", - "test-e2e": "npx playwright test --config test/e2e/playwright.config.ts", + "test-e2e": "autotest run-all test/e2e-plans --no-llm", "build-server": "node scripts/buildJdtlsExt.js", "vscode:prepublish": "tsc -p ./ && webpack --mode production", "tslint": "tslint -t verbose --project tsconfig.json" @@ -1172,8 +1171,6 @@ "ts-loader": "^9.4.2", "tslint": "^6.1.3", "typescript": "^4.9.4", - "vscode-extension-tester": "^8.23.0", - "@playwright/test": "^1.50.0", "webpack": "^5.105.0", "webpack-cli": "^4.10.0" }, diff --git a/test/e2e-plans/java-dep-project-explorer.yaml b/test/e2e-plans/java-dep-project-explorer.yaml index e14a4f81..1bdb3656 100644 --- a/test/e2e-plans/java-dep-project-explorer.yaml +++ b/test/e2e-plans/java-dep-project-explorer.yaml @@ -1,17 +1,18 @@ # Test Plan: Java Dependency — Project Explorer # -# Covers projectExplorer.test.ts scenarios: +# Covers scenarios: # - javaProjectExplorer.focus shows Java Projects section # - linkWithFolderExplorer reveals active file in tree # - unlinkWithFolderExplorer stops auto-reveal +# - revealInProjectExplorer reveals file from File Explorer context menu # # Usage: # npx autotest run test/e2e-plans/java-dep-project-explorer.yaml --vsix name: "Java Dependency — Project Explorer" description: | - Tests the Java Projects explorer view: focus, link/unlink with editor. - Replaces test/e2e/tests/projectExplorer.test.ts. + Tests the Java Projects explorer view: focus, link/unlink with editor, + reveal in project explorer. setup: extension: "redhat.java" @@ -85,3 +86,25 @@ steps: - id: "relink-editor" action: "run command Java: Link with Editor" verify: "Editor re-linked with tree" + + # ── Test 4: revealInProjectExplorer ── + # Collapse all tree nodes, then reveal App.java from editor + - id: "collapse-all" + action: "run command View: Collapse All" + verify: "Collapse tree to reset state" + + - id: "open-app-file" + action: "open file App.java" + waitBefore: 2 + + - id: "reveal-in-project-explorer" + action: "run command Java: Reveal in Java Project Explorer" + waitBefore: 2 + + - id: "verify-revealed" + action: "wait 2 seconds" + verify: "App class should be revealed in Java Projects tree" + verifyTreeItem: + name: "App" + exact: true + timeout: 15 diff --git a/test/e2e/fixtures/baseTest.ts b/test/e2e/fixtures/baseTest.ts deleted file mode 100644 index 83c7f8a9..00000000 --- a/test/e2e/fixtures/baseTest.ts +++ /dev/null @@ -1,191 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT license. - -/** - * Playwright test fixture that launches VS Code via Electron, - * opens a temporary copy of a test project, and tears everything - * down after the test. - * - * Usage in test files: - * - * import { test, expect } from "../fixtures/baseTest"; - * - * test("my test", async ({ page }) => { - * // `page` is a Playwright Page attached to VS Code - * }); - */ - -import { _electron, test as base, type Page } from "@playwright/test"; -import { downloadAndUnzipVSCode } from "@vscode/test-electron"; -import * as fs from "fs-extra"; -import * as os from "os"; -import * as path from "path"; - -export { expect } from "@playwright/test"; - -// Root of the extension source tree -const EXTENSION_ROOT = path.join(__dirname, "..", "..", ".."); -// Root of the test data projects -const TEST_DATA_ROOT = path.join(EXTENSION_ROOT, "test"); - -export type TestOptions = { - /** VS Code version to download, default "stable" */ - vscodeVersion: string; - /** Relative path under `test/` to the project to open (e.g. "maven") */ - testProjectDir: string; -}; - -type TestFixtures = TestOptions & { - /** Playwright Page connected to the VS Code Electron window */ - page: Page; -}; - -export const test = base.extend({ - vscodeVersion: [process.env.VSCODE_VERSION || "stable", { option: true }], - testProjectDir: ["maven", { option: true }], - - page: async ({ vscodeVersion, testProjectDir }, use, testInfo) => { - // 1. Create a temp directory and copy the test project into it. - const tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), "java-dep-e2e-")); - const projectName = path.basename(testProjectDir); - const projectDir = path.join(tmpDir, projectName); - fs.copySync(path.join(TEST_DATA_ROOT, testProjectDir), projectDir); - - // Write VS Code settings to suppress telemetry prompts and notification noise - const vscodeDir = path.join(projectDir, ".vscode"); - fs.ensureDirSync(vscodeDir); - const settingsPath = path.join(vscodeDir, "settings.json"); - let existingSettings: Record = {}; - if (fs.existsSync(settingsPath)) { - // settings.json may contain JS-style comments (JSONC), strip them before parsing - const raw = fs.readFileSync(settingsPath, "utf-8"); - const stripped = raw.replace(/\/\/.*$/gm, "").replace(/\/\*[\s\S]*?\*\//g, ""); - try { - existingSettings = JSON.parse(stripped); - } catch { - // If still invalid, start fresh — our injected settings are more important - existingSettings = {}; - } - } - const mergedSettings = { - ...existingSettings, - "telemetry.telemetryLevel": "off", - "redhat.telemetry.enabled": false, - "workbench.colorTheme": "Default Dark Modern", - "update.mode": "none", - "extensions.ignoreRecommendations": true, - }; - fs.writeFileSync(settingsPath, JSON.stringify(mergedSettings, null, 4)); - - // 2. Resolve VS Code executable. - const vscodePath = await downloadAndUnzipVSCode(vscodeVersion); - // resolveCliArgsFromVSCodeExecutablePath returns CLI-specific args - // (e.g. --ms-enable-electron-run-as-node) that are unsuitable for - // Electron UI launch. Extract only --extensions-dir and --user-data-dir. - const vscodeTestDir = path.join(EXTENSION_ROOT, ".vscode-test"); - const extensionsDir = path.join(vscodeTestDir, "extensions"); - const userDataDir = path.join(vscodeTestDir, "user-data"); - - // 3. Launch VS Code as an Electron app. - const electronApp = await _electron.launch({ - executablePath: vscodePath, - env: { ...process.env, NODE_ENV: "development" }, - args: [ - "--no-sandbox", - "--disable-gpu-sandbox", - "--disable-updates", - "--skip-welcome", - "--skip-release-notes", - "--disable-workspace-trust", - "--password-store=basic", - // Suppress notifications that block UI interactions - "--disable-telemetry", - `--extensions-dir=${extensionsDir}`, - `--user-data-dir=${userDataDir}`, - `--extensionDevelopmentPath=${EXTENSION_ROOT}`, - projectDir, - ], - }); - - const page = await electronApp.firstWindow(); - - // Auto-dismiss Electron native dialogs (e.g. redhat.java refactoring - // confirmation, delete file confirmation). These dialogs are outside - // the renderer DOM and cannot be handled via Playwright Page API. - // Monkey-patch dialog.showMessageBox to find and click the confirm - // button by label, falling back to the first button. - await electronApp.evaluate(({ dialog }) => { - const confirmLabels = /^(OK|Delete|Move to Recycle Bin|Move to Trash)$/i; - dialog.showMessageBox = async (_win: any, opts: any) => { - const options = opts || _win; - const buttons: string[] = options?.buttons || []; - let idx = buttons.findIndex((b: string) => confirmLabels.test(b)); - if (idx < 0) idx = 0; - return { response: idx, checkboxChecked: true }; - }; - dialog.showMessageBoxSync = (_win: any, opts: any) => { - const options = opts || _win; - const buttons: string[] = options?.buttons || []; - let idx = buttons.findIndex((b: string) => confirmLabels.test(b)); - if (idx < 0) idx = 0; - return idx; - }; - }); - - // Dismiss any startup notifications/dialogs before handing off to tests - await page.waitForTimeout(3_000); - await dismissAllNotifications(page); - - // Tracing is handled by Playwright's built-in `use.trace` config - // (see playwright.config.ts). No manual tracing.start/stop needed. - - // ---- hand off to the test ---- - await use(page); - - // ---- teardown ---- - // Trace saving is handled automatically by Playwright's `use.trace` - // config — no manual tracing.stop() needed here. - - await electronApp.close(); - - // Clean up temp directory - try { - fs.rmSync(tmpDir, { force: true, recursive: true }); - } catch (e) { - console.warn(`Warning: failed to clean up ${tmpDir}: ${e}`); - } - }, -}); - -/** - * Dismiss all VS Code notification toasts (telemetry prompts, theme suggestions, etc.). - * These notifications can steal focus and block Quick Open / Command Palette interactions. - */ -async function dismissAllNotifications(page: Page): Promise { - try { - // Click "Clear All Notifications" if the notification center button is visible - const clearAll = page.locator(".notifications-toasts .codicon-notifications-clear-all, .notification-toast .codicon-close"); - let count = await clearAll.count().catch(() => 0); - while (count > 0) { - await clearAll.first().click(); - await page.waitForTimeout(500); - count = await clearAll.count().catch(() => 0); - } - - // Also try the command palette approach as a fallback - const notificationToasts = page.locator(".notification-toast"); - if (await notificationToasts.count().catch(() => 0) > 0) { - // Use keyboard shortcut to clear all notifications - await page.keyboard.press("Control+Shift+P"); - const input = page.locator(".quick-input-widget input.input"); - if (await input.isVisible({ timeout: 3_000 }).catch(() => false)) { - await input.fill("Notifications: Clear All Notifications"); - await page.waitForTimeout(500); - await input.press("Enter"); - await page.waitForTimeout(500); - } - } - } catch { - // Best effort - } -} diff --git a/test/e2e/globalSetup.ts b/test/e2e/globalSetup.ts deleted file mode 100644 index 37eabd23..00000000 --- a/test/e2e/globalSetup.ts +++ /dev/null @@ -1,34 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT license. - -import { downloadAndUnzipVSCode, resolveCliArgsFromVSCodeExecutablePath } from "@vscode/test-electron"; -import * as childProcess from "child_process"; - -/** - * Global setup runs once before all test files. - * It downloads VS Code and installs the redhat.java extension so that - * every test run starts from an identical, pre-provisioned state. - * - * Our own extension is loaded at launch time via --extensionDevelopmentPath - * (see baseTest.ts), so there is no need to install a VSIX here. - */ -export default async function globalSetup(): Promise { - // Download VS Code stable (or the version configured via VSCODE_VERSION env). - const vscodeVersion = process.env.VSCODE_VERSION || "stable"; - console.log(`[globalSetup] Downloading VS Code ${vscodeVersion}…`); - const vscodePath = await downloadAndUnzipVSCode(vscodeVersion); - const [cli, ...cliArgs] = resolveCliArgsFromVSCodeExecutablePath(vscodePath); - - // On Windows, the CLI is a .cmd batch file which requires shell: true. - const isWindows = process.platform === "win32"; - const execOptions: childProcess.ExecFileSyncOptions = { - encoding: "utf-8", - stdio: "inherit", - timeout: 120_000, - shell: isWindows, - }; - - // Install the Language Support for Java extension from the Marketplace. - console.log("[globalSetup] Installing redhat.java extension…"); - childProcess.execFileSync(cli, [...cliArgs, "--install-extension", "redhat.java"], execOptions); -} diff --git a/test/e2e/playwright.config.ts b/test/e2e/playwright.config.ts deleted file mode 100644 index 4af6182b..00000000 --- a/test/e2e/playwright.config.ts +++ /dev/null @@ -1,29 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT license. - -import { defineConfig } from "@playwright/test"; -import * as path from "path"; - -export default defineConfig({ - testDir: path.join(__dirname, "tests"), - reporter: process.env.CI - ? [["list"], ["junit", { outputFile: path.join(__dirname, "..", "..", "test-results", "e2e-results.xml") }]] - : "list", - // Java Language Server can take 2-3 minutes to fully index on first run. - timeout: 240_000, - // Run tests sequentially — launching multiple VS Code instances is too resource-heavy. - workers: 1, - // Allow one retry in CI to handle transient environment issues. - retries: process.env.CI ? 1 : 0, - expect: { - timeout: 30_000, - }, - globalSetup: path.join(__dirname, "globalSetup.ts"), - use: { - // Capture full trace on every test run locally (includes screenshots, - // DOM snapshots, and network at each Playwright action). In CI, - // retain traces only for failing tests to limit artifact size. - trace: process.env.CI ? "retain-on-failure" : "on", - }, - outputDir: path.join(__dirname, "..", "..", "test-results", "e2e"), -}); diff --git a/test/e2e/tests/fileOperations.test.ts b/test/e2e/tests/fileOperations.test.ts deleted file mode 100644 index 97998e2e..00000000 --- a/test/e2e/tests/fileOperations.test.ts +++ /dev/null @@ -1,130 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT license. - -/** - * E2E tests for file / resource operations in the Java Projects view. - * - * Covers: - * - java.view.package.newJavaClass - * - java.view.package.newPackage - * - java.view.package.renameFile - * - java.view.package.moveFileToTrash - */ - -import { test, expect } from "../fixtures/baseTest"; -import { Timeout, VSCode } from "../utils/constants"; -import JavaOperator from "../utils/javaOperator"; -import VscodeOperator from "../utils/vscodeOperator"; - -test.describe("File Operations", () => { - - test.use({ testProjectDir: "maven" }); - - test.beforeEach(async ({ page }) => { - await VscodeOperator.dismissModalDialog(page); - await JavaOperator.openFile(page, "App.java"); - await JavaOperator.waitForJavaLSReady(page); - await JavaOperator.focusJavaProjects(page); - }); - - test("create new Java class", async ({ page }) => { - // Trigger New... on the project node - await JavaOperator.triggerNewResource(page, "my-app"); - - // Select "Java Class" (first item) - await VscodeOperator.selectQuickPickIndex(page, 0); - - // Select source folder "src/main/java" - await VscodeOperator.selectQuickPickItem(page, "src/main/java"); - - // Type class name and confirm - await VscodeOperator.fillQuickInput(page, "App2"); - - // Editor should open with the new file - const tabFound = await VscodeOperator.waitForEditorTab(page, "App2.java"); - expect(tabFound).toBeTruthy(); - }); - - test("create new package", async ({ page }) => { - await JavaOperator.triggerNewResource(page, "my-app"); - - // Select "Package" - await VscodeOperator.selectQuickPickItem(page, "Package"); - - // Select source folder - await VscodeOperator.selectQuickPickItem(page, "src/main/java"); - - // Type package name and confirm - await VscodeOperator.fillQuickInput(page, "com.mycompany.newpkg"); - - // Wait briefly for directory creation - await page.waitForTimeout(Timeout.TREE_EXPAND); - }); - - test("rename Java file", async ({ page }) => { - await JavaOperator.collapseFileExplorer(page); - - // Expand to AppToRename - await JavaOperator.expandTreePath(page, "my-app", "src/main/java", "com.mycompany.app"); - - // Right-click AppToRename to select it AND open the context menu. - // We do NOT left-click first because that opens the file in the editor - // and steals focus away from the tree view. - const appToRename = page.getByRole(VSCode.TREE_ITEM_ROLE, { name: "AppToRename" }).first(); - await VscodeOperator.selectContextMenuItem(page, appToRename, /^Rename/); - - // The extension shows a showInputBox (quick-input) for the new name - await VscodeOperator.fillQuickInput(page, "AppRenamed"); - - // Handle extension's own rename confirmation dialog if it appears. - // The Electron native refactoring dialog from redhat.java is - // auto-dismissed by the showMessageBox monkey-patch in baseTest.ts. - try { - await VscodeOperator.clickDialogButton(page, "OK", 5_000); - } catch { - // Dialog may not appear in all cases - } - - // On Linux, if the refactoring dialog resolved to "Show Preview", - // VS Code shows a Refactor Preview panel with "Apply" / "Discard" - // buttons. Click "Apply" to complete the rename. - try { - const applyBtn = page.getByRole(VSCode.BUTTON_ROLE, { name: "Apply" }); - if (await applyBtn.isVisible({ timeout: 3_000 }).catch(() => false)) { - await applyBtn.click(); - await page.waitForTimeout(Timeout.CLICK); - } - } catch { - // No refactor preview - } - - // Editor should open with renamed file - const tabFound = await VscodeOperator.waitForEditorTab(page, "AppRenamed.java"); - expect(tabFound).toBeTruthy(); - }); - - test("delete Java file", async ({ page }) => { - await JavaOperator.collapseFileExplorer(page); - await JavaOperator.expandTreePath(page, "my-app", "src/main/java", "com.mycompany.app"); - - // Right-click AppToDelete directly (no left-click to avoid opening - // the file and losing tree focus). - const appToDelete = page.getByRole(VSCode.TREE_ITEM_ROLE, { name: "AppToDelete" }).first(); - await VscodeOperator.selectContextMenuItem(page, appToDelete, /^Delete/); - - // Confirm deletion in dialog - try { - const dialog = page.locator(".monaco-dialog-box"); - await dialog.waitFor({ state: "visible", timeout: 5_000 }); - const confirmBtn = dialog.getByRole(VSCode.BUTTON_ROLE) - .filter({ hasText: /Move to Trash|Move to Recycle Bin|Delete|OK/ }); - await confirmBtn.first().click(); - } catch { - // Dialog may not appear - } - - // Wait for tree item to disappear - const gone = await VscodeOperator.waitForTreeItemGone(page, "AppToDelete"); - expect(gone).toBeTruthy(); - }); -}); diff --git a/test/e2e/tests/libraries.test.ts b/test/e2e/tests/libraries.test.ts deleted file mode 100644 index 0fb5844e..00000000 --- a/test/e2e/tests/libraries.test.ts +++ /dev/null @@ -1,39 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT license. - -/** - * E2E tests for library management and project creation. - * - * Covers: - * - java.project.addLibraries - * - java.project.addLibraryFolders - * - java.project.create - */ - -import { test } from "../fixtures/baseTest"; - -test.describe("Libraries & Project Creation", () => { - - test.describe("invisible project library management", () => { - - test.use({ testProjectDir: "invisible" }); - - test.skip("add and remove JAR library", async () => { - // Skip: the addLibraries command opens a native OS file dialog - // (vscode.window.showOpenDialog) which Playwright cannot automate. - // This test requires Electron dialog mocking support. - }); - }); - - test.describe("create new project", () => { - - test.use({ testProjectDir: "invisible" }); - - test.skip("java.project.create with no build tools", async () => { - // Skip: after selecting "No build tools", scaffoldSimpleProject() - // calls vscode.window.showOpenDialog() which opens a native OS file - // dialog that Playwright cannot automate. This test requires - // Electron dialog mocking support. - }); - }); -}); diff --git a/test/e2e/tests/projectExplorer.test.ts b/test/e2e/tests/projectExplorer.test.ts deleted file mode 100644 index b32a58df..00000000 --- a/test/e2e/tests/projectExplorer.test.ts +++ /dev/null @@ -1,62 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT license. - -/** - * E2E tests for the Java Projects explorer view. - * - * Covers: - * - javaProjectExplorer.focus - * - java.view.package.linkWithFolderExplorer - * - java.view.package.unlinkWithFolderExplorer - */ - -import { test, expect } from "../fixtures/baseTest"; -import { Timeout, VSCode } from "../utils/constants"; -import JavaOperator from "../utils/javaOperator"; -import VscodeOperator from "../utils/vscodeOperator"; - -test.describe("Project Explorer", () => { - - test.use({ testProjectDir: "maven" }); - - test.beforeEach(async ({ page }) => { - await VscodeOperator.dismissModalDialog(page); - // Open a Java file so the language server activates - await JavaOperator.openFile(page, "App.java"); - await JavaOperator.waitForJavaLSReady(page); - await JavaOperator.focusJavaProjects(page); - }); - - test("javaProjectExplorer.focus shows Java Projects section", async ({ page }) => { - // beforeEach already focuses Java Projects; verify the tree is populated - const found = await VscodeOperator.waitForTreeItem(page, "my-app", 15_000); - expect(found).toBeTruthy(); - }); - - test("linkWithFolderExplorer reveals active file in tree", async ({ page }) => { - // Expand project to source level - await JavaOperator.expandTreePath(page, "my-app", "src/main/java"); - - // The package node should expand and reveal the class - const packageVisible = await VscodeOperator.waitForTreeItem(page, "com.mycompany.app", 15_000); - expect(packageVisible).toBeTruthy(); - - // Use exact match to avoid matching "app", "App.java", "AppToDelete" etc. - const classVisible = await page.getByRole(VSCode.TREE_ITEM_ROLE, { name: "App", exact: true }) - .isVisible().catch(() => false); - expect(classVisible).toBeTruthy(); - }); - - test("unlinkWithFolderExplorer stops auto-reveal", async ({ page }) => { - // Use command to unlink - await VscodeOperator.executeCommand(page, "Java: Unlink with Editor"); - await page.waitForTimeout(Timeout.CLICK); - - // Open a different file — tree should NOT auto-expand - await JavaOperator.openFile(page, "AppToRename.java"); - await page.waitForTimeout(Timeout.TREE_EXPAND); - - // Re-link for cleanup - await VscodeOperator.executeCommand(page, "Java: Link with Editor"); - }); -}); diff --git a/test/e2e/utils/constants.ts b/test/e2e/utils/constants.ts deleted file mode 100644 index 8a409e74..00000000 --- a/test/e2e/utils/constants.ts +++ /dev/null @@ -1,61 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT license. - -/** - * Centralized constants for VS Code E2E tests. - * Keep ARIA role strings, timeouts, and selector patterns here - * so that tests and operators stay tidy. - */ - -// --------------------------------------------------------------------------- -// Timeouts (milliseconds) -// --------------------------------------------------------------------------- - -export const Timeout = { - /** Short pause after a click or keystroke */ - CLICK: 1_000, - /** Longer pause after expanding a tree item (DOM needs time to render children) */ - TREE_EXPAND: 3_000, - /** Wait before the first assertion in a test (let VS Code settle) */ - PREPARE: 5_000, - /** Wait for a heavy extension to activate */ - EXTENSION_ACTIVATE: 10_000, - /** Maximum wait for Java Language Server to report "Ready" */ - JAVA_LS_READY: 180_000, - /** Interval between polls when waiting for LS readiness */ - JAVA_LS_POLL_INTERVAL: 2_000, -} as const; - -// --------------------------------------------------------------------------- -// VS Code ARIA roles & selectors -// --------------------------------------------------------------------------- - -export const VSCode = { - // Command palette - CMD_PALETTE_KEY: "F1", - CMD_PALETTE_ROLE: "combobox" as const, - CMD_PALETTE_INPUT_NAME: "INPUT", - OPTION_ROLE: "option" as const, - LISTBOX_ROLE: "listbox" as const, - // Side bar / activity bar - TAB_ROLE: "tab" as const, - // Tree view - TREE_ITEM_ROLE: "treeitem" as const, - // Buttons & toolbars - BUTTON_ROLE: "button" as const, - TOOLBAR_ROLE: "toolbar" as const, - // Keys - ENTER: "Enter", - ESCAPE: "Escape", - // Elements - LINK: "a", -} as const; - -// --------------------------------------------------------------------------- -// Java-specific -// --------------------------------------------------------------------------- - -export const Java = { - JAVA_PROJECTS_SECTION: "Java Projects", - JAVA_LS_STATUS_LABEL: "Language Status", -} as const; diff --git a/test/e2e/utils/javaOperator.ts b/test/e2e/utils/javaOperator.ts deleted file mode 100644 index 67d2657f..00000000 --- a/test/e2e/utils/javaOperator.ts +++ /dev/null @@ -1,145 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT license. - -/** - * Java-specific helpers for E2E tests. - * - * The most important one is `waitForJavaLSReady()` which polls the status bar - * until Language Support for Java reports a "ready" state, using Playwright's - * `expect.poll` so that the test automatically retries and fails cleanly if - * the LS never reaches readiness. - */ - -import { expect, Page } from "@playwright/test"; -import { Timeout, VSCode } from "./constants"; -import VscodeOperator from "./vscodeOperator"; - -export default class JavaOperator { - - /** - * Waits for the Java Language Server to finish indexing. - * - * Strategy: poll the status bar for a button whose accessible name - * contains "Java: Ready" (e.g. "coffee Java: Ready, Show Java status menu"). - * This is more reliable than clicking a hover because it doesn't depend - * on internal VS Code DOM IDs that vary across versions. - */ - static async waitForJavaLSReady(page: Page, timeoutMs = Timeout.JAVA_LS_READY): Promise { - // Give the extension a moment to register its status bar item - await page.waitForTimeout(Timeout.EXTENSION_ACTIVATE); - - await expect.poll(async () => { - try { - const javaReadyButton = page.getByRole(VSCode.BUTTON_ROLE, { name: /Java:\s*Ready/i }); - if (await javaReadyButton.isVisible().catch(() => false)) { - return "ready"; - } - return "not-ready"; - } catch { - return "not-ready"; - } - }, { - message: "Java Language Server did not become ready in time", - timeout: timeoutMs, - intervals: [Timeout.JAVA_LS_POLL_INTERVAL], - }).toBe("ready"); - } - - /** - * Focuses the Java Projects view and waits for it to render. - * - * Directly clicks the "Java Projects Section" button in the Explorer - * sidebar rather than going through the command palette, which may - * fail to find the view-focus command by its ID. - */ - static async focusJavaProjects(page: Page): Promise { - const sectionButton = page.getByRole(VSCode.BUTTON_ROLE, { name: /Java Projects Section/i }); - if (await sectionButton.isVisible({ timeout: 5_000 }).catch(() => false)) { - // Only click to expand if the section is currently collapsed - const expanded = await sectionButton.getAttribute("aria-expanded"); - if (expanded !== "true") { - await sectionButton.click(); - } - } else { - // Fallback: try via command palette - await VscodeOperator.executeCommand(page, "Java Projects: Focus on Java Projects View"); - } - await page.waitForTimeout(Timeout.TREE_EXPAND); - } - - /** - * Expands tree items along a path (e.g. "my-app" → "src/main/java" → "com.mycompany.app"). - * - * Waits for each item's `aria-expanded` attribute to appear before clicking, - * because VS Code only sets it after the tree data provider's `getChildren()` - * has returned — until then the node is treated as a leaf. - */ - static async expandTreePath(page: Page, ...labels: string[]): Promise { - for (const label of labels) { - const item = page.getByRole(VSCode.TREE_ITEM_ROLE, { name: label }).first(); - await item.waitFor({ state: "visible", timeout: 15_000 }); - - // Wait for the node to become expandable (aria-expanded present). - await expect.poll(async () => { - return await item.getAttribute("aria-expanded"); - }, { - message: `Tree item "${label}" did not become expandable`, - timeout: 15_000, - }).toBeTruthy(); - - const expanded = await item.getAttribute("aria-expanded"); - if (expanded !== "true") { - await item.click(); - await page.waitForTimeout(Timeout.TREE_EXPAND); - } - } - } - - /** - * Collapses the default file explorer section so that tree items in the - * Java Projects view are within the viewport. - */ - static async collapseFileExplorer(page: Page): Promise { - try { - // Try to collapse any expanded section above Java Projects - const sections = page.locator(".split-view-view .pane-header[aria-expanded='true']"); - const count = await sections.count(); - if (count > 0) { - await sections.first().click(); - await page.waitForTimeout(Timeout.CLICK); - } - } catch { - // Best-effort - } - } - - /** - * Opens a file in the editor via Quick Open (Ctrl+P). - */ - static async openFile(page: Page, filePath: string): Promise { - // Use Ctrl+P directly instead of going through command palette - await page.keyboard.press("Control+P"); - const input = page.locator(".quick-input-widget input.input"); - await input.waitFor({ state: "visible", timeout: 10_000 }); - await input.fill(filePath); - await page.waitForTimeout(Timeout.CLICK); - // Wait for file matches to appear, then select the first one - const firstMatch = page.locator(".quick-input-widget .quick-input-list .monaco-list-row").first(); - if (await firstMatch.isVisible({ timeout: 3_000 }).catch(() => false)) { - await firstMatch.click(); - } else { - await input.press(VSCode.ENTER); - } - await page.waitForTimeout(Timeout.TREE_EXPAND); - } - - /** - * Triggers the "New..." action on a project node. - * This opens the resource-type quick-pick. - */ - static async triggerNewResource(page: Page, projectName: string): Promise { - await JavaOperator.collapseFileExplorer(page); - await VscodeOperator.clickTreeItem(page, projectName); - await VscodeOperator.clickTreeItemAction(page, projectName, "New..."); - } -} diff --git a/test/e2e/utils/vscodeOperator.ts b/test/e2e/utils/vscodeOperator.ts deleted file mode 100644 index 6dd34a80..00000000 --- a/test/e2e/utils/vscodeOperator.ts +++ /dev/null @@ -1,283 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT license. - -/** - * Generic VS Code UI helpers built on Playwright Page. - * - * These helpers prefer ARIA roles / labels over CSS classes where possible - * to better survive VS Code version upgrades, but some fall back to CSS - * selectors when needed. - */ - -import { Page } from "@playwright/test"; -import { Timeout, VSCode } from "./constants"; - -export default class VscodeOperator { - - // ----------------------------------------------------------------------- - // Command palette - // ----------------------------------------------------------------------- - - /** - * Opens the command palette, types the given command, and runs it. - */ - static async executeCommand(page: Page, command: string): Promise { - await page.keyboard.press(VSCode.CMD_PALETTE_KEY); - // Wait for the quick-input widget to appear - const input = page.locator(".quick-input-widget input.input"); - await input.waitFor({ state: "visible", timeout: 10_000 }); - // F1 opens command palette with ">" prefix; fill() must preserve it - // so VS Code searches commands rather than files. - await input.fill(">" + command); - await page.waitForTimeout(Timeout.CLICK); - // Press Enter on the first matching option in the list - const firstOption = page.locator(".quick-input-widget .quick-input-list .monaco-list-row").first(); - if (await firstOption.isVisible({ timeout: 3_000 }).catch(() => false)) { - await firstOption.click(); - } else { - await input.press(VSCode.ENTER); - } - await page.waitForTimeout(Timeout.CLICK); - } - - /** - * Select a quick-pick option by its visible label text. - */ - static async selectQuickPickItem(page: Page, label: string): Promise { - const option = page.locator(".quick-input-widget .quick-input-list .monaco-list-row", { hasText: label }); - await option.first().waitFor({ state: "visible", timeout: 10_000 }); - await option.first().click(); - await page.waitForTimeout(Timeout.CLICK); - } - - /** - * Select a quick-pick option by its zero-based index. - */ - static async selectQuickPickIndex(page: Page, index: number): Promise { - const option = page.locator(".quick-input-widget .quick-input-list .monaco-list-row").nth(index); - await option.waitFor({ state: "visible", timeout: 10_000 }); - await option.click(); - await page.waitForTimeout(Timeout.CLICK); - } - - // ----------------------------------------------------------------------- - // Quick input box - // ----------------------------------------------------------------------- - - /** - * Waits for the quick-input box to appear and returns the input locator. - */ - static async getQuickInput(page: Page): Promise> { - const input = page.locator(".quick-input-widget input.input"); - await input.waitFor({ state: "visible", timeout: 10_000 }); - return input; - } - - /** - * Types text into the quick-input and confirms with Enter. - */ - static async fillQuickInput(page: Page, text: string): Promise { - const input = await VscodeOperator.getQuickInput(page); - await input.fill(text); - await page.waitForTimeout(Timeout.CLICK); - await input.press(VSCode.ENTER); - await page.waitForTimeout(Timeout.CLICK); - } - - // ----------------------------------------------------------------------- - // Side bar / Activity bar - // ----------------------------------------------------------------------- - - /** - * Clicks a side-bar tab by its accessibility label (e.g. "Explorer", "Java Projects"). - */ - static async activateSideTab(page: Page, tabName: string, timeout = Timeout.CLICK): Promise { - await page.getByRole(VSCode.TAB_ROLE, { name: tabName }).locator(VSCode.LINK).click(); - await page.waitForTimeout(timeout); - } - - static async isSideTabVisible(page: Page, tabName: string): Promise { - return page.getByRole(VSCode.TAB_ROLE, { name: tabName }).isVisible(); - } - - // ----------------------------------------------------------------------- - // Tree items - // ----------------------------------------------------------------------- - - /** - * Returns whether a tree item with the given name is visible. - */ - static async isTreeItemVisible(page: Page, name: string): Promise { - return page.getByRole(VSCode.TREE_ITEM_ROLE, { name }).isVisible(); - } - - /** - * Clicks a tree item by name. - */ - static async clickTreeItem(page: Page, name: string): Promise { - await page.getByRole(VSCode.TREE_ITEM_ROLE, { name }).locator(VSCode.LINK).first().click(); - await page.waitForTimeout(Timeout.TREE_EXPAND); - } - - /** - * Waits for a tree item to appear in the DOM and become visible. - * Returns `true` if the item was found within `timeoutMs`. - */ - static async waitForTreeItem(page: Page, name: string, timeoutMs = 30_000): Promise { - try { - await page.getByRole(VSCode.TREE_ITEM_ROLE, { name }).first().waitFor({ - state: "visible", - timeout: timeoutMs, - }); - return true; - } catch { - return false; - } - } - - /** - * Waits until a tree item disappears from the view. - */ - static async waitForTreeItemGone(page: Page, name: string, timeoutMs = 15_000): Promise { - try { - await page.getByRole(VSCode.TREE_ITEM_ROLE, { name }).first().waitFor({ - state: "hidden", - timeout: timeoutMs, - }); - return true; - } catch { - return false; - } - } - - /** - * Clicks an inline action button on a tree item (the small icons that appear on hover). - * Uses aria-label matching so it works across VS Code versions. - */ - static async clickTreeItemAction(page: Page, itemName: string, actionLabel: string): Promise { - const treeItem = page.getByRole(VSCode.TREE_ITEM_ROLE, { name: itemName }); - // Hover to reveal inline action buttons - await treeItem.hover(); - await page.waitForTimeout(500); - await treeItem.locator(`a.action-label[role="button"][aria-label*="${actionLabel}"]`).click(); - await page.waitForTimeout(Timeout.CLICK); - } - - // ----------------------------------------------------------------------- - // Context menus - // ----------------------------------------------------------------------- - - /** - * Right-clicks an element and selects an item from the context menu. - * - * Scopes the search to `.monaco-menu-container .monaco-menu` to avoid - * matching menubar items. Hovers the item first to trigger VS Code's - * menu focus, then waits for the `.focused` CSS class before clicking. - */ - static async selectContextMenuItem(page: Page, target: ReturnType, menuItemName: string | RegExp): Promise { - await target.click({ button: "right" }); - const menu = page.locator(".monaco-menu-container .monaco-menu"); - await menu.waitFor({ state: "visible", timeout: 5_000 }); - const menuItem = menu.getByRole("menuitem", { name: menuItemName }); - await menuItem.first().waitFor({ state: "visible", timeout: 5_000 }); - await menuItem.first().hover(); - await page.locator(".monaco-menu-container .action-item.focused").waitFor({ - state: "visible", - timeout: 5_000, - }); - await menuItem.first().click(); - await page.waitForTimeout(Timeout.CLICK); - } - - // ----------------------------------------------------------------------- - // Dialogs - // ----------------------------------------------------------------------- - - /** - * Tries to dismiss a modal dialog (workspace-trust, update prompts, etc.) - * by clicking a button whose label matches one of the well-known accept labels. - * Silently succeeds if no dialog is present. - */ - static async dismissModalDialog(page: Page): Promise { - const acceptLabels = ["Yes, I trust the authors", "OK", "Yes", "Continue", "I Trust the Authors"]; - try { - // Handle modal dialogs - const dialog = page.locator(".monaco-dialog-box"); - if (await dialog.isVisible({ timeout: 2_000 }).catch(() => false)) { - for (const label of acceptLabels) { - const btn = dialog.getByRole(VSCode.BUTTON_ROLE, { name: label }); - if (await btn.isVisible().catch(() => false)) { - await btn.click(); - await page.waitForTimeout(Timeout.CLICK); - break; - } - } - } - } catch { - // No modal dialog — nothing to dismiss - } - - // Also dismiss notification toasts (telemetry prompts, theme suggestions, etc.) - try { - const closeButtons = page.locator(".notification-toast .codicon-close"); - let count = await closeButtons.count().catch(() => 0); - while (count > 0) { - await closeButtons.first().click(); - await page.waitForTimeout(500); - count = await closeButtons.count().catch(() => 0); - } - } catch { - // Best effort - } - } - - /** - * Waits for a modal dialog to appear and clicks a button by its label. - */ - static async clickDialogButton(page: Page, buttonLabel: string, timeoutMs = 10_000): Promise { - const dialog = page.locator(".monaco-dialog-box"); - await dialog.waitFor({ state: "visible", timeout: timeoutMs }); - await dialog.getByRole(VSCode.BUTTON_ROLE, { name: buttonLabel }).click(); - await page.waitForTimeout(Timeout.CLICK); - } - - /** - * Clicks a button inside a notification toast (e.g. refactoring confirmations - * from extensions that use `window.showInformationMessage` with action buttons). - */ - static async clickNotificationButton(page: Page, buttonLabel: string, timeoutMs = 10_000): Promise { - const notification = page.locator(".notification-toast"); - await notification.first().waitFor({ state: "visible", timeout: timeoutMs }); - const btn = notification.getByRole(VSCode.BUTTON_ROLE, { name: buttonLabel }); - await btn.first().waitFor({ state: "visible", timeout: timeoutMs }); - await btn.first().click(); - await page.waitForTimeout(Timeout.CLICK); - } - - // ----------------------------------------------------------------------- - // Editor - // ----------------------------------------------------------------------- - - /** - * Waits for an editor tab with the given title to become active. - */ - static async waitForEditorTab(page: Page, title: string, timeoutMs = 15_000): Promise { - try { - await page.getByRole(VSCode.TAB_ROLE, { name: title }).first().waitFor({ - state: "visible", - timeout: timeoutMs, - }); - return true; - } catch { - return false; - } - } - - /** - * Saves the currently active editor using the command palette. - * (More reliable than Ctrl+S because focus might not be on the editor.) - */ - static async saveActiveEditor(page: Page): Promise { - await VscodeOperator.executeCommand(page, "workbench.action.files.save"); - } -} diff --git a/test/invisible/lib/simple.jar b/test/invisible/lib/simple.jar new file mode 100644 index 0000000000000000000000000000000000000000..d8cc4e6f4c1e70f26f29749bda44b67b6c644ce6 GIT binary patch literal 901 zcmWIWW@Zs#;Nak3n4R}0hye+RFt9NAx`sIFdiuHP`#So0y1532==r++JH^28+4sz8 zA8%c~i@e^tTIbH3-yCFc#rVO~Prhf)TrNH5siU_o=!3`ElPCGl>!0#``1H|JCWZiS zc8(*LzepJatuO@Q0Jz07(JU4K%6g>c$Cd^0s&DOS!vU z7Ur-s$h~}9@Wb;@rHoHEUN%ztpu9%0VS&SztXs!E$1P9XvHnY2D#wvke!<&c?aDs& z{m6=n_GcR#!sdppxp3>EZ?wY1>fpIy>nhh}ZrA=O3ss-}W$-sO0>e%rne8Yr^fnf?WD8(@{i7+4%J926SC3aMRE9oPf0!q2aHh@wt0#pK- X=;=7Xo0Scuf(Zy)fb?si+ZY%C!fI$z literal 0 HcmV?d00001 diff --git a/test/ui/command.test.ts b/test/ui/command.test.ts deleted file mode 100644 index 3f317918..00000000 --- a/test/ui/command.test.ts +++ /dev/null @@ -1,513 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT license. - -import * as assert from "assert"; -import * as fse from "fs-extra"; -import { platform, tmpdir } from "os"; -import * as path from "path"; -import * as seleniumWebdriver from "selenium-webdriver"; -import { ActivityBar, By, InputBox, ModalDialog, SideBarView, StatusBar, TextEditor, TreeItem, VSBrowser, ViewSection, Workbench } from "vscode-extension-tester"; -import { sleep } from "../util"; - -// tslint:disable: only-arrow-functions -const newProjectName = "helloworld"; -const testFolder = path.join(__dirname, "..", "..", "..", "test"); -const mavenProjectPath = path.join(testFolder, "maven"); -const mavenJavaFilePath = path.join("src", "main", "java", "com", "mycompany", "app", "App.java"); -const invisibleProjectPath = path.join(testFolder, "invisible"); -const invisibleJavaFilePath = path.join("src", "App.java"); - -// async function pauseInPipeline(timeInMs: number): Promise { -// if (process.env.GITHUB_ACTIONS) { -// return sleep(timeInMs); -// } else { -// return Promise.resolve(); -// } -// } - -describe("Command Tests", function() { - - this.timeout(5 * 60 * 1000 /*ms*/); - const mavenProjectTmpFolders: string[] = []; - let currentProjectPath: string | undefined; - let statusBar: StatusBar; - - function createTmpProjectFolder(projectName: string) { - const tmpFolder = fse.mkdtempSync(path.join(tmpdir(), 'vscode-java-dependency-ui-test')); - // Keep the folder name. - const projectFolder = path.join(tmpFolder, projectName); - fse.mkdirSync(projectFolder); - mavenProjectTmpFolders.push(tmpFolder); - return projectFolder; - } - - async function openProject(projectPath: string) { - const projectFolder = createTmpProjectFolder(path.basename(projectPath)); - // Copy to avoid restoring after each test run to revert changes done during the test. - fse.copySync(projectPath, projectFolder); - await VSBrowser.instance.openResources(projectFolder); - currentProjectPath = projectFolder; - await ensureExplorerIsOpen(); - } - - async function openFile(filePath: string) { - statusBar = new StatusBar(); - if (path.isAbsolute(filePath)) { - await VSBrowser.instance.openResources(filePath); - } else { - await VSBrowser.instance.openResources(path.join(currentProjectPath!, filePath)); - } - } - - async function waitForLanguageServerReady() { - // Wait until the language server is no longer indexing. - // Use a max wait to avoid infinite loops if the status UI changes between VS Code versions. - const maxWaitMs = 3 * 60 * 1000; - const startTime = Date.now(); - while (Date.now() - startTime < maxWaitMs) { - try { - const languageStatus = await statusBar.findElement(By.xpath('//*[@id="status.languageStatus"]')); - await languageStatus.click(); - // Accept either codicon-thumbsup (older VS Code) or codicon-pass (newer VS Code) - await languageStatus.findElement(By.xpath( - `//div[contains(@class, 'context-view')]//div[contains(@class, 'hover-language-status')]//*[contains(@class, 'codicon-thumbsup') or contains(@class, 'codicon-pass')]` - )); - break; - } catch (e) { - await sleep(1000); - } - } - } - - before(async function() { - await openProject(mavenProjectPath); - await openFile(mavenJavaFilePath); - await waitForLanguageServerReady(); - }); - - after(async function() { - for (const mavenProjectTmpFolder of mavenProjectTmpFolders) { - try { - fse.rmSync(mavenProjectTmpFolder, {force: true, recursive: true}); - } catch (e) { - // Ignore EBUSY and other cleanup errors on Windows when VS Code still holds file locks - console.warn(`Warning: failed to clean up temp folder ${mavenProjectTmpFolder}: ${e}`); - } - } - }); - - - it("Test javaProjectExplorer.focus", async function() { - await new Workbench().executeCommand("javaProjectExplorer.focus"); - // Retry finding the section since it may take time to render after the command - let section: ViewSection | undefined; - for (let i = 0; i < 5; i++) { - try { - section = await new SideBarView().getContent().getSection("Java Projects"); - break; - } catch (_e) { - await sleep(2000); - await new Workbench().executeCommand("javaProjectExplorer.focus"); - } - } - assert.ok(section, `Section "Java Projects" should be found`); - assert.ok(section!.isExpanded(), `Section "Java Projects" should be expanded`); - }); - - (platform() === "darwin" ? it.skip : it)("Test java.view.package.linkWithFolderExplorer", async function() { - await openFile(mavenJavaFilePath); - await sleep(1000); - const [, section] = await expandInJavaProjects('my-app'); - const packageNode = await section.findItem("com.mycompany.app") as TreeItem; - assert.ok(await packageNode.isExpanded(), `Package node "com.mycompany.app" should be expanded`); - const classNode = await section.findItem("App") as TreeItem; - assert.ok(await classNode.isDisplayed(), `Class node "App" should be revealed`); - await packageNode.collapse(); - }); - - (platform() === "darwin" ? it.skip : it)("Test java.view.package.unLinkWithFolderExplorer", async function() { - const [, section] = await expandInJavaProjects('my-app'); - await section.click(); - let moreActions = await section.moreActions(); - const desynchronize = await moreActions!.getItem("Unlink with Editor"); - await desynchronize!.click(); - await openFile(mavenJavaFilePath); - await sleep(1000); - const packageNode = await section.findItem("com.mycompany.app") as TreeItem; - assert.ok(!await packageNode.isExpanded(), `Package "com.mycompany.app" should not be expanded`); - moreActions = await section.moreActions(); - const link = await moreActions!.getItem("Link with Editor"); - await link!.click(); - }); - - it("Test java.view.package.newJavaClass", async function() { - let inputBox = await createJavaResource(); - const javaClassQuickPick = await inputBox.findQuickPick(0); - await javaClassQuickPick!.click(); - assert.ok(await inputBox.getPlaceHolder() === "Choose a source folder", `InputBox "Choose a source folder" should appear`); - const quickPick = await inputBox.findQuickPick("src/main/java"); - assert.ok(quickPick, `Quickpick item "src/main/java" should be found`); - await quickPick!.click(); - inputBox = await InputBox.create(); - assert.ok(await inputBox.getPlaceHolder() === "Input the class name", `InputBox "Input the class name" should appear`); - await inputBox.setText("App2"); - await inputBox.confirm(); - const editor = await waitForEditorTitle("App2.java"); - assert.ok(editor, `Editor's title should be "App2.java"`); - await editor!.save(); - assert.ok(await fse.pathExists(path.join(currentProjectPath!, "src", "main", "java", "App2.java")), `"App2.java" should be created in correct path`); - }); - - (platform() === "darwin" ? it.skip : it)("Test java.view.package.newPackage", async function() { - // The current UI test framework doesn't support mac title bar and context menus. - // See: https://github.com/redhat-developer/vscode-extension-tester#requirements - // So we dismiss some UI tests on mac. - let inputBox = await createJavaResource(); - const packageQuickPick = await inputBox.findQuickPick('Package'); - await packageQuickPick!.click(); - const quickPick = await inputBox.findQuickPick("src/main/java"); - assert.ok(quickPick, `"src/main/java" should be found in quickpick items`); - await quickPick!.click(); - inputBox = await InputBox.create(); - await inputBox.setText("com.mycompany.app2"); - await inputBox.confirm(); - assert.ok(await waitForFileExists(path.join(currentProjectPath!, "src", "main", "java", "com", "mycompany", "app2")), `New package should be created in correct path`); - }); - - (platform() === "darwin" ? it.skip : it)("Test java.view.package.revealInProjectExplorer", async function() { - // Make sure App.java is not currently revealed in Java Projects - const section = await new SideBarView().getContent().getSection("Java Projects"); - const item = await section.findItem("my-app") as TreeItem; - await item.collapse(); - const [fileSection, fileNode] = await openAppJavaSourceCode(); - await fileNode.openContextMenu(); - // menu.getItem(label) does not work. I did not investigate this further. - // This is a global selector on purpose. The context-menu is located near the root node. - const revealItem = await fileNode.findElement(By.xpath(`//div[contains(@class, 'context-view')]//a[@role='menuitem' and span[contains(text(), 'Reveal in Java Project Explorer')]]`)); - // const revealItem = await menu.getItem("Reveal in Java Project Explorer"); - assert.ok(revealItem, `Item "Reveal in Java Project Explorer" should be found in context menu`); - await revealItem!.click(); - const classNode = await section.findItem("App") as TreeItem; - assert.ok(await classNode.isDisplayed(), `Class Node "App" should be revealed`); - await fileSection.collapse(); - }); - - (platform() === "darwin" ? it.skip : it)("Test java.view.package.renameFile", async function() { - // Collapse file section to make sure that the AppToRename tree item fits in the current viewport. - // .findItem will only find tree items in the current viewport. - await collapseFileSection(); - const section = await expandMainCodeInJavaProjects(); - const classNode = await section.findItem("AppToRename") as TreeItem; - assert.ok(classNode, `AppToRename.java should be found`); - await classNode.click(); - const menu = await classNode.openContextMenu(); - const renameItem = await menu.getItem("Rename"); - assert.ok(renameItem, `"Rename" item should be found`); - await renameItem!.click(); - const inputBox = await InputBox.create(); - await inputBox.setText("AppRenamed"); - await inputBox.confirm(); - const dialog = await waitForModalDialog(); - assert.ok(dialog, `Rename confirmation dialog should appear`); - const buttons = await dialog!.getButtons(); - for (const button of buttons) { - if (await button.getText() === "OK") { - await button.click(); - break; - } - } - const editor = await waitForEditorTitle("AppRenamed.java"); - assert.ok(editor, `Editor's title should be "AppRenamed.java"`); - // Use command palette to save because the editor input area may not be - // interactable right after the rename refactoring dialog is dismissed. - await new Workbench().executeCommand('workbench.action.files.save'); - assert.ok(await section.findItem("AppRenamed"), `Item in Java Project section should be "AppRenamed"`); - }); - - (platform() === "darwin" ? it.skip : it)("Test java.view.package.moveFileToTrash", async function() { - // Collapse file section to make sure that the AppToRename tree item fits in the current viewport. - // .findItem will only find tree items in the current viewport. - await collapseFileSection(); - const section = await expandMainCodeInJavaProjects(); - const classNode = await section.findItem("AppToDelete") as TreeItem; - await classNode.click(); - const menu = await classNode.openContextMenu(); - let deleteItem = await menu.getItem("Delete"); - // Not sure why sometimes one is visible and other times the other. - if (deleteItem === undefined) { - deleteItem = await menu.getItem("Delete Permanently"); - } - assert.ok(deleteItem, `"Delete" item should be found`); - await deleteItem!.click(); - const dialog = await waitForModalDialog(); - if (dialog) { - const buttons = await dialog.getButtons(); - for (const button of buttons) { - const text = await button.getText(); - if (text === "Move to Recycle Bin" || text === "Delete") { - await button.click(); - break; - } - } - } - assert.ok(await waitForFileGone(path.join(currentProjectPath!, "src", "main", "java", "AppToDelete.java")), `The source file "AppToDelete.java" should be deleted`); - }); - - it("Test change to invisible project", async function() { - await openProject(invisibleProjectPath); - // Allow VS Code to finish the workspace transition before opening files - await sleep(3000); - // Dismiss any modal dialog (e.g. workspace trust) that may appear after opening a new project - await dismissModalDialogIfPresent(); - await openFile(invisibleJavaFilePath); - await waitForLanguageServerReady(); - const fileSections = await new SideBarView().getContent().getSections(); - await fileSections[0].collapse(); - await new Workbench().executeCommand("javaProjectExplorer.focus"); - }); - - it("Test java.project.addLibraries", async function() { - // tslint:disable-next-line:prefer-const - let [referencedItem, section] = await expandInJavaProjects('invisible', 'Referenced Libraries'); - await referencedItem.click(); - await clickActionButton(referencedItem, `Add Jar Libraries to Project Classpath...`); - const input = await InputBox.create(); - await input.setText(path.join(invisibleProjectPath, "libSource", "simple.jar")); - await input.confirm(); - await sleep(1000); - referencedItem = await section.findItem("Referenced Libraries") as TreeItem; - await referencedItem.expand(); - const simpleItem = await waitForTreeItem(section, "simple.jar") as TreeItem; - assert.ok(simpleItem, `Library "simple.jar" should be found`); - await simpleItem.click(); - await clickActionButton(simpleItem, 'Remove from Project Classpath'); - assert.ok(await waitForTreeItemGone(section, "simple.jar"), `Library "simple.jar" should not be found`); - }); - - it("Test java.project.addLibraryFolders", async function() { - // tslint:disable-next-line:prefer-const - let [referencedItem, section] = await expandInJavaProjects('invisible', 'Referenced Libraries'); - await referencedItem.click(); - const button = await getActionButton(referencedItem, `Add Jar Libraries to Project Classpath...`); - await button.getDriver().actions() - // .mouseMove(buttons[0]) - .keyDown(seleniumWebdriver.Key.ALT) - .click(button) - .keyUp(seleniumWebdriver.Key.ALT) - .perform(); - const input = await InputBox.create(); - await input.setText(path.join(invisibleProjectPath, "libSource")); - await input.confirm(); - await sleep(1000); - referencedItem = await section.findItem("Referenced Libraries") as TreeItem; - await referencedItem.expand(); - assert.ok(await waitForTreeItem(section, "simple.jar"), `Library "simple.jar" should be found`); - }); - - it("Test java.project.create", async function() { - await dismissModalDialogIfPresent(); - const projectFolder = createTmpProjectFolder("newProject"); - await fse.ensureDir(projectFolder); - await new Workbench().executeCommand("java.project.create"); - let inputBox = await InputBox.create(); - const picks = await inputBox.getQuickPicks(); - assert.equal("No build tools", await picks[0].getLabel()); - await picks[0].select(); - await sleep(1000); - inputBox = await InputBox.create(); - await inputBox.setText(projectFolder); - await inputBox.confirm(); - await sleep(1000); - inputBox = await InputBox.create(); - await inputBox.setText(newProjectName); - await inputBox.confirm(); - assert.ok(await waitForFileExists(path.join(projectFolder, newProjectName, "src", "App.java")), `The template source file should be created`); - assert.ok(await waitForFileExists(path.join(projectFolder, newProjectName, "README.md")), `The template README file should be created`); - }); - - -}); - -async function collapseFileSection() { - const fileSections = await new SideBarView().getContent().getSections(); - await fileSections[0].collapse(); -} - -async function expandMainCodeInJavaProjects() { - const section = await new SideBarView().getContent().getSection("Java Projects"); - await section.click(); - const appNode = await section.findItem("my-app") as TreeItem; - await appNode.expand(); - const srcFolderNode = await section.findItem('src/main/java') as TreeItem; - await srcFolderNode.expand(); - const packageNode = await section.findItem("com.mycompany.app") as TreeItem; - await packageNode.expand(); - return section; -} - -async function expandInJavaProjects(label: string, ...otherLabels: string[]): Promise<[TreeItem, ViewSection]> { - // Dismiss any lingering modal dialog that could block sidebar clicks - await dismissModalDialogIfPresent(); - // Collapse file section to make sure that the AppToRename tree item fits in the current viewport. - // .findItem will only find tree items in the current viewport. - await collapseFileSection(); - const section = await new SideBarView().getContent().getSection("Java Projects"); - await section.click(); - let lastNode = await section.findItem(label) as TreeItem; - await lastNode.expand(); - for (const otherLabel of otherLabels) { - lastNode = await section.findItem(otherLabel) as TreeItem; - await lastNode.expand(); - } - return [lastNode, section]; -} - -async function openAppJavaSourceCode(): Promise<[ViewSection, TreeItem]> { - const fileSections = await new SideBarView().getContent().getSections(); - await fileSections[0].expand(); - const srcNode = await fileSections[0].findItem("src") as TreeItem; - await srcNode.expand(); - const folderNode = await fileSections[0].findItem("main") as TreeItem; - await folderNode.expand(); - const subFolderNode = await fileSections[0].findItem("com") as TreeItem; - await subFolderNode.expand(); - const appFolderNode = await fileSections[0].findItem("app") as TreeItem; - await appFolderNode.expand(); - const fileNode = await fileSections[0].findItem("App.java") as TreeItem; - await fileNode.click(); - return [fileSections[0], fileNode]; -} - -async function createJavaResource() { - await collapseFileSection(); - const section = await new SideBarView().getContent().getSection("Java Projects"); - const item = await section.findItem("my-app") as TreeItem; - assert.ok(item, `Project "my-app" should be found`); - await item.click(); - await clickActionButton(item, 'New...'); - const inputBox = await InputBox.create(); - assert.ok(await inputBox.getPlaceHolder() === "Select resource type to create.", - `InputBox "Select resource type to create" should appear.`); - return inputBox; -} - -async function clickActionButton(item: TreeItem, label: string) { - const button = await getActionButton(item, label); - await button.click(); -} - -async function getActionButton(item: TreeItem, label: string) { - // Using item.getActionButton('New...') throws an error: - // tslint:disable-next-line:max-line-length - // "no such element: Unable to locate element: {\"method\":\"xpath\",\"selector\":\".//a[contains(@class, 'action-label') and @role='button' and @title='New...']\"} - // This should be filled as an issue (I haven't find one). - // The problem is the @title='New...' which should be @aria-label='New...' for vscode 1.83.1 (and probably above). - return item.findElement(By.xpath(`.//a[contains(@class, 'action-label') and @role='button' and contains(@aria-label, '${label}')]`)); -} - -async function dismissModalDialogIfPresent() { - try { - const dialog = new ModalDialog(); - const buttons = await dialog.getButtons(); - for (const button of buttons) { - const text = await button.getText(); - if (["Yes, I trust the authors", "OK", "Yes", "Continue", "I Trust the Authors"].includes(text)) { - await button.click(); - await sleep(1000); - return; - } - } - // Dismiss by clicking the first available button as a fallback - if (buttons.length > 0) { - await buttons[0].click(); - await sleep(1000); - } - } catch (_e) { - // No modal dialog present — nothing to dismiss - } -} - -async function waitForTreeItem(section: ViewSection, label: string, timeoutMs = 15000): Promise { - const start = Date.now(); - while (Date.now() - start < timeoutMs) { - const item = await section.findItem(label) as TreeItem; - if (item) { - return item; - } - await sleep(1000); - } - return undefined; -} - -async function waitForTreeItemGone(section: ViewSection, label: string, timeoutMs = 15000): Promise { - const start = Date.now(); - while (Date.now() - start < timeoutMs) { - const item = await section.findItem(label) as TreeItem; - if (!item) { - return true; - } - await sleep(1000); - } - return false; -} - -async function waitForFileExists(filePath: string, timeoutMs = 15000): Promise { - const start = Date.now(); - while (Date.now() - start < timeoutMs) { - if (await fse.pathExists(filePath)) { - return true; - } - await sleep(1000); - } - return false; -} - -async function waitForFileGone(filePath: string, timeoutMs = 15000): Promise { - const start = Date.now(); - while (Date.now() - start < timeoutMs) { - if (!await fse.pathExists(filePath)) { - return true; - } - await sleep(1000); - } - return false; -} - -async function waitForModalDialog(timeoutMs = 10000): Promise { - const start = Date.now(); - while (Date.now() - start < timeoutMs) { - try { - const dialog = new ModalDialog(); - await dialog.getButtons(); - return dialog; - } catch (_e) { - await sleep(500); - } - } - return undefined; -} - -async function waitForEditorTitle(expectedTitle: string, timeoutMs = 15000): Promise { - const start = Date.now(); - while (Date.now() - start < timeoutMs) { - try { - const editor = new TextEditor(); - if (await editor.getTitle() === expectedTitle) { - return editor; - } - } catch (_e) { - // Editor may not be ready yet - } - await sleep(1000); - } - return undefined; -} - -async function ensureExplorerIsOpen() { - const control = await new ActivityBar().getViewControl('Explorer'); - if (control === undefined) { - throw new Error(`Explorer control should not be null.`); - } - await control.openView(); -} - diff --git a/test/ui/index.ts b/test/ui/index.ts deleted file mode 100644 index e8067d24..00000000 --- a/test/ui/index.ts +++ /dev/null @@ -1,25 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT license. - -import * as path from "path"; -import { ExTester } from "vscode-extension-tester"; - -/* tslint:disable:no-console */ -async function main(): Promise { - try { - // Run UI command tests - const testPath = path.join(__dirname, "command.test.js"); - const exTester = new ExTester(); - await exTester.downloadCode(); - await exTester.installVsix(); - await exTester.installFromMarketplace("redhat.java"); - await exTester.downloadChromeDriver(); - await exTester.setupRequirements(); - process.exit(await exTester.runTests(testPath, {resources: []})); - } catch (err) { - console.log(err); - process.exit(1); - } -} - -main(); From 16897a0062ed3657c5b58525639670affd6e1b02 Mon Sep 17 00:00:00 2001 From: wenyt <75360946+wenytang-ms@users.noreply.github.com> Date: Mon, 27 Apr 2026 16:47:34 +0800 Subject: [PATCH 297/352] chore: Update telemetry wrapper to 0.15.1 (#997) * Update telemetry wrapper to 0.15.1 Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Update telemetry wrapper to 0.15.2 Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --------- Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- package-lock.json | 11380 ++++++++------------------------------------ package.json | 16 +- 2 files changed, 1915 insertions(+), 9481 deletions(-) diff --git a/package-lock.json b/package-lock.json index 3c0c48e7..96412282 100644 --- a/package-lock.json +++ b/package-lock.json @@ -18,11 +18,10 @@ "lodash": "^4.18.0", "minimatch": "^5.1.9", "semver": "^7.3.8", - "vscode-extension-telemetry-wrapper": "^0.15.0", + "vscode-extension-telemetry-wrapper": "^0.15.2", "vscode-tas-client": "^0.1.75" }, "devDependencies": { - "@playwright/test": "^1.50.0", "@types/fs-extra": "^9.0.13", "@types/glob": "^7.2.0", "@types/lodash": "^4.14.191", @@ -38,7 +37,6 @@ "ts-loader": "^9.4.2", "tslint": "^6.1.3", "typescript": "^4.9.4", - "vscode-extension-tester": "^8.23.0", "webpack": "^5.105.0", "webpack-cli": "^4.10.0" }, @@ -46,248 +44,6 @@ "vscode": "^1.95.0" } }, - "node_modules/@azu/format-text": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@azu/format-text/-/format-text-1.0.2.tgz", - "integrity": "sha512-Swi4N7Edy1Eqq82GxgEECXSSLyn6GOb5htRFPzBDdUkECGXtlf12ynO5oJSpWKPwCaUssOu7NfhDcCWpIC6Ywg==", - "dev": true, - "license": "BSD-3-Clause" - }, - "node_modules/@azu/style-format": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@azu/style-format/-/style-format-1.0.1.tgz", - "integrity": "sha512-AHcTojlNBdD/3/KxIKlg8sxIWHfOtQszLvOpagLTO+bjC3u7SAszu1lf//u7JJC50aUSH+BVWDD/KvaA6Gfn5g==", - "dev": true, - "license": "WTFPL", - "dependencies": { - "@azu/format-text": "^1.0.1" - } - }, - "node_modules/@azure/abort-controller": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@azure/abort-controller/-/abort-controller-2.1.2.tgz", - "integrity": "sha512-nBrLsEWm4J2u5LpAPjxADTlq3trDgVZZXHNKabeXZtpq3d3AbN/KGO82R87rdDz5/lYB024rtEf10/q0urNgsA==", - "dev": true, - "license": "MIT", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@azure/abort-controller/node_modules/tslib": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "dev": true, - "license": "0BSD" - }, - "node_modules/@azure/core-auth": { - "version": "1.10.1", - "resolved": "https://registry.npmjs.org/@azure/core-auth/-/core-auth-1.10.1.tgz", - "integrity": "sha512-ykRMW8PjVAn+RS6ww5cmK9U2CyH9p4Q88YJwvUslfuMmN98w/2rdGRLPqJYObapBCdzBVeDgYWdJnFPFb7qzpg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@azure/abort-controller": "^2.1.2", - "@azure/core-util": "^1.13.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@azure/core-auth/node_modules/tslib": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "dev": true, - "license": "0BSD" - }, - "node_modules/@azure/core-client": { - "version": "1.10.1", - "resolved": "https://registry.npmjs.org/@azure/core-client/-/core-client-1.10.1.tgz", - "integrity": "sha512-Nh5PhEOeY6PrnxNPsEHRr9eimxLwgLlpmguQaHKBinFYA/RU9+kOYVOQqOrTsCL+KSxrLLl1gD8Dk5BFW/7l/w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@azure/abort-controller": "^2.1.2", - "@azure/core-auth": "^1.10.0", - "@azure/core-rest-pipeline": "^1.22.0", - "@azure/core-tracing": "^1.3.0", - "@azure/core-util": "^1.13.0", - "@azure/logger": "^1.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@azure/core-client/node_modules/tslib": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "dev": true, - "license": "0BSD" - }, - "node_modules/@azure/core-rest-pipeline": { - "version": "1.23.0", - "resolved": "https://registry.npmjs.org/@azure/core-rest-pipeline/-/core-rest-pipeline-1.23.0.tgz", - "integrity": "sha512-Evs1INHo+jUjwHi1T6SG6Ua/LHOQBCLuKEEE6efIpt4ZOoNonaT1kP32GoOcdNDbfqsD2445CPri3MubBy5DEQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@azure/abort-controller": "^2.1.2", - "@azure/core-auth": "^1.10.0", - "@azure/core-tracing": "^1.3.0", - "@azure/core-util": "^1.13.0", - "@azure/logger": "^1.3.0", - "@typespec/ts-http-runtime": "^0.3.4", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@azure/core-rest-pipeline/node_modules/tslib": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "dev": true, - "license": "0BSD" - }, - "node_modules/@azure/core-tracing": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/@azure/core-tracing/-/core-tracing-1.3.1.tgz", - "integrity": "sha512-9MWKevR7Hz8kNzzPLfX4EAtGM2b8mr50HPDBvio96bURP/9C+HjdH3sBlLSNNrvRAr5/k/svoH457gB5IKpmwQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@azure/core-tracing/node_modules/tslib": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "dev": true, - "license": "0BSD" - }, - "node_modules/@azure/core-util": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/@azure/core-util/-/core-util-1.13.1.tgz", - "integrity": "sha512-XPArKLzsvl0Hf0CaGyKHUyVgF7oDnhKoP85Xv6M4StF/1AhfORhZudHtOyf2s+FcbuQ9dPRAjB8J2KvRRMUK2A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@azure/abort-controller": "^2.1.2", - "@typespec/ts-http-runtime": "^0.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@azure/core-util/node_modules/tslib": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "dev": true, - "license": "0BSD" - }, - "node_modules/@azure/identity": { - "version": "4.13.0", - "resolved": "https://registry.npmjs.org/@azure/identity/-/identity-4.13.0.tgz", - "integrity": "sha512-uWC0fssc+hs1TGGVkkghiaFkkS7NkTxfnCH+Hdg+yTehTpMcehpok4PgUKKdyCH+9ldu6FhiHRv84Ntqj1vVcw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@azure/abort-controller": "^2.0.0", - "@azure/core-auth": "^1.9.0", - "@azure/core-client": "^1.9.2", - "@azure/core-rest-pipeline": "^1.17.0", - "@azure/core-tracing": "^1.0.0", - "@azure/core-util": "^1.11.0", - "@azure/logger": "^1.0.0", - "@azure/msal-browser": "^4.2.0", - "@azure/msal-node": "^3.5.0", - "open": "^10.1.0", - "tslib": "^2.2.0" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@azure/identity/node_modules/tslib": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "dev": true, - "license": "0BSD" - }, - "node_modules/@azure/logger": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@azure/logger/-/logger-1.3.0.tgz", - "integrity": "sha512-fCqPIfOcLE+CGqGPd66c8bZpwAji98tZ4JI9i/mlTNTlsIWslCfpg48s/ypyLxZTump5sypjrKn2/kY7q8oAbA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typespec/ts-http-runtime": "^0.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@azure/logger/node_modules/tslib": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "dev": true, - "license": "0BSD" - }, - "node_modules/@azure/msal-browser": { - "version": "4.29.1", - "resolved": "https://registry.npmjs.org/@azure/msal-browser/-/msal-browser-4.29.1.tgz", - "integrity": "sha512-1Vrt27du1cl4QHkzLc6L4aeXqliPIDIs5l/1I4hWWMXkXccY/EznJT1+pBdoVze0azTAI8sCyq5B4cBVYG1t9w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@azure/msal-common": "15.16.1" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/@azure/msal-common": { - "version": "15.16.1", - "resolved": "https://registry.npmjs.org/@azure/msal-common/-/msal-common-15.16.1.tgz", - "integrity": "sha512-qxUG9TCl+TVSSX58onVDHDWrvT5CE0+NeeUAbkQqaESpSm79u5IePLnPWMMjCUnUR2zJd4+Bt9vioVRzLmJb2g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/@azure/msal-node": { - "version": "3.8.9", - "resolved": "https://registry.npmjs.org/@azure/msal-node/-/msal-node-3.8.9.tgz", - "integrity": "sha512-jZ0pw/BbdEUWGhomCaAiVDfXRI/9K56m5hTNqB/CzcbZEYhXm5qpK1cDngN1iXfwSfmUMorOUQ2FC0dyuQ9uRg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@azure/msal-common": "15.16.1", - "jsonwebtoken": "^9.0.0", - "uuid": "^8.3.0" - }, - "engines": { - "node": ">=16" - } - }, "node_modules/@babel/code-frame": { "version": "7.29.0", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.0.tgz", @@ -313,23 +69,6 @@ "node": ">=6.9.0" } }, - "node_modules/@bazel/runfiles": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@bazel/runfiles/-/runfiles-6.5.0.tgz", - "integrity": "sha512-RzahvqTkfpY2jsDxo8YItPX+/iZ6hbiikw1YhE0bA9EKBR5Og8Pa6FHn9PO9M0zaXRVsr0GFQLKbB/0rzy9SzA==", - "dev": true, - "license": "Apache-2.0" - }, - "node_modules/@bcoe/v8-coverage": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-1.0.2.tgz", - "integrity": "sha512-6zABk/ECA/QYSCQ1NGiVwwbQerUCZ+TQbp64Q3AgmfNvurHH0j8TtXa1qbShXA6qqkpAj4V5W8pP6mLe1mcMqA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - } - }, "node_modules/@discoveryjs/json-ext": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", @@ -519,16 +258,6 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/@istanbuljs/schema": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", - "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/@jridgewell/gen-mapping": { "version": "0.3.13", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", @@ -574,13 +303,6 @@ "@jridgewell/sourcemap-codec": "^1.4.14" } }, - "node_modules/@keyv/serialize": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@keyv/serialize/-/serialize-1.1.1.tgz", - "integrity": "sha512-dXn3FZhPv0US+7dtJsIi2R+c7qWYiReoEh5zUntWCf4oSpMNib8FDhSoed6m3QyZdx5hK7iLFkYk3rNxwt8vTA==", - "dev": true, - "license": "MIT" - }, "node_modules/@microsoft/1ds-core-js": { "version": "4.3.10", "resolved": "https://registry.npmjs.org/@microsoft/1ds-core-js/-/1ds-core-js-4.3.10.tgz", @@ -691,18 +413,18 @@ } }, "node_modules/@nevware21/ts-async": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/@nevware21/ts-async/-/ts-async-0.5.4.tgz", - "integrity": "sha512-IBTyj29GwGlxfzXw2NPnzty+w0Adx61Eze1/lknH/XIVdxtF9UnOpk76tnrHXWa6j84a1RR9hsOcHQPFv9qJjA==", + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/@nevware21/ts-async/-/ts-async-0.5.5.tgz", + "integrity": "sha512-vwqaL05iJPjLeh5igPi8MeeAu10i+Aq7xko1fbo9F5Si6MnVN5505qaV7AhSdk5MCBJVT/UYMk3kgInNjDb4Ig==", "license": "MIT", "dependencies": { - "@nevware21/ts-utils": ">= 0.11.6 < 2.x" + "@nevware21/ts-utils": ">= 0.12.2 < 2.x" } }, "node_modules/@nevware21/ts-utils": { - "version": "0.12.5", - "resolved": "https://registry.npmjs.org/@nevware21/ts-utils/-/ts-utils-0.12.5.tgz", - "integrity": "sha512-JPQZWPKQJjj7kAftdEZL0XDFfbMgXCGiUAZe0d7EhLC3QlXTlZdSckGqqRIQ2QNl0VTEZyZUvRBw6Ednw089Fw==", + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/@nevware21/ts-utils/-/ts-utils-0.13.0.tgz", + "integrity": "sha512-F3mD+DsUn9OiZmZc5tg0oKqrJCtiCstwx+wE+DNzFYh2cCRUuzTYdK9zGGP/au2BWvbOQ6Tqlbjr2+dT1P3AlQ==", "license": "MIT" }, "node_modules/@nodelib/fs.scandir": { @@ -915,3554 +637,611 @@ "node": ">=14" } }, - "node_modules/@playwright/test": { - "version": "1.59.1", - "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.59.1.tgz", - "integrity": "sha512-PG6q63nQg5c9rIi4/Z5lR5IVF7yU5MqmKaPOe0HSc0O2cX1fPi96sUQu5j7eo4gKCkB2AnNGoWt7y4/Xx3Kcqg==", + "node_modules/@types/eslint": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-9.6.1.tgz", + "integrity": "sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==", "dev": true, - "license": "Apache-2.0", "dependencies": { - "playwright": "1.59.1" - }, - "bin": { - "playwright": "cli.js" - }, - "engines": { - "node": ">=18" + "@types/estree": "*", + "@types/json-schema": "*" } }, - "node_modules/@redhat-developer/locators": { - "version": "1.20.0", - "resolved": "https://registry.npmjs.org/@redhat-developer/locators/-/locators-1.20.0.tgz", - "integrity": "sha512-SvS9lABIHDpTU0w7jTN3qsMxDSceAbbc3j0xba9Cd8xrDEMWpysnvt3WY4vtYalikMhXtkcSAf3L3adYTS7iqg==", + "node_modules/@types/eslint-scope": { + "version": "3.7.7", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz", + "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==", "dev": true, - "license": "Apache-2.0", - "peerDependencies": { - "@redhat-developer/page-objects": ">=1.0.0", - "selenium-webdriver": ">=4.6.1" + "dependencies": { + "@types/eslint": "*", + "@types/estree": "*" } }, - "node_modules/@redhat-developer/page-objects": { - "version": "1.20.0", - "resolved": "https://registry.npmjs.org/@redhat-developer/page-objects/-/page-objects-1.20.0.tgz", - "integrity": "sha512-akY6gXRbUmlf2Cayp1A/TwoT0/eyK+/LReSBo7Nmfotk7QfR262k7ZilAmL3Vf/jmX3Gg0D8UrDZRFk8RTxS2Q==", + "node_modules/@types/estree": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "dev": true + }, + "node_modules/@types/fs-extra": { + "version": "9.0.13", + "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-9.0.13.tgz", + "integrity": "sha512-nEnwB++1u5lVDM2UI4c1+5R+FYaKfaAzS4OococimjVm3nQw3TuzH5UNsocrcTBbhnerblyHj4A49qXbIiZdpA==", "dev": true, - "license": "Apache-2.0", "dependencies": { - "clipboardy": "^5.3.1", - "clone-deep": "^4.0.1", - "compare-versions": "^6.1.1", - "fs-extra": "^11.3.4", - "type-fest": "^4.41.0" - }, - "peerDependencies": { - "selenium-webdriver": ">=4.6.1", - "typescript": ">=4.6.2" + "@types/node": "*" } }, - "node_modules/@redhat-developer/page-objects/node_modules/fs-extra": { - "version": "11.3.4", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.4.tgz", - "integrity": "sha512-CTXd6rk/M3/ULNQj8FBqBWHYBVYybQ3VPBw0xGKFe3tuH7ytT6ACnvzpIQ3UZtB8yvUKC2cXn1a+x+5EVQLovA==", + "node_modules/@types/glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==", "dev": true, - "license": "MIT", "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=14.14" + "@types/minimatch": "*", + "@types/node": "*" } }, - "node_modules/@sec-ant/readable-stream": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/@sec-ant/readable-stream/-/readable-stream-0.4.1.tgz", - "integrity": "sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg==", - "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 + }, + "node_modules/@types/lodash": { + "version": "4.14.195", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.195.tgz", + "integrity": "sha512-Hwx9EUgdwf2GLarOjQp5ZH8ZmblzcbTBC2wtQWNKARBSxM9ezRIAUpeDTgoQRAFB0+8CNWXVA9+MaSOzOF3nPg==", + "dev": true + }, + "node_modules/@types/minimatch": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.5.tgz", + "integrity": "sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==", + "dev": true + }, + "node_modules/@types/mocha": { + "version": "9.1.1", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-9.1.1.tgz", + "integrity": "sha512-Z61JK7DKDtdKTWwLeElSEBcWGRLY8g95ic5FoQqI9CMx0ns/Ghep3B4DfcEimiKMvtamNVULVNKEsiwV3aQmXw==", + "dev": true }, - "node_modules/@secretlint/config-creator": { - "version": "10.2.2", - "resolved": "https://registry.npmjs.org/@secretlint/config-creator/-/config-creator-10.2.2.tgz", - "integrity": "sha512-BynOBe7Hn3LJjb3CqCHZjeNB09s/vgf0baBaHVw67w7gHF0d25c3ZsZ5+vv8TgwSchRdUCRrbbcq5i2B1fJ2QQ==", + "node_modules/@types/node": { + "version": "20.16.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.16.1.tgz", + "integrity": "sha512-zJDo7wEadFtSyNz5QITDfRcrhqDvQI1xQNQ0VoizPjM/dVAODqqIUWbJPkvsxmTI0MYRGRikcdjMPhOssnPejQ==", "dev": true, - "license": "MIT", "dependencies": { - "@secretlint/types": "^10.2.2" - }, - "engines": { - "node": ">=20.0.0" + "undici-types": "~6.19.2" } }, - "node_modules/@secretlint/config-loader": { - "version": "10.2.2", - "resolved": "https://registry.npmjs.org/@secretlint/config-loader/-/config-loader-10.2.2.tgz", - "integrity": "sha512-ndjjQNgLg4DIcMJp4iaRD6xb9ijWQZVbd9694Ol2IszBIbGPPkwZHzJYKICbTBmh6AH/pLr0CiCaWdGJU7RbpQ==", + "node_modules/@types/semver": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.0.tgz", + "integrity": "sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw==", + "dev": true + }, + "node_modules/@types/vscode": { + "version": "1.95.0", + "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.95.0.tgz", + "integrity": "sha512-0LBD8TEiNbet3NvWsmn59zLzOFu/txSlGxnv5yAFHCrhG9WvAnR3IvfHzMOs2aeWqgvNjq9pO99IUw8d3n+unw==", "dev": true, + "license": "MIT" + }, + "node_modules/@vscode/extension-telemetry": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@vscode/extension-telemetry/-/extension-telemetry-1.2.0.tgz", + "integrity": "sha512-En6dTwfy5NFzSMibvOpx/lKq2jtgWuR4++KJbi3SpQ2iT8gm+PHo9868/scocW122KDwTxl4ruxZ7i4rHmJJnQ==", "license": "MIT", "dependencies": { - "@secretlint/profiler": "^10.2.2", - "@secretlint/resolver": "^10.2.2", - "@secretlint/types": "^10.2.2", - "ajv": "^8.17.1", - "debug": "^4.4.1", - "rc-config-loader": "^4.1.3" + "@microsoft/1ds-core-js": "^4.3.10", + "@microsoft/1ds-post-js": "^4.3.10", + "@microsoft/applicationinsights-web-basic": "^3.3.10" }, "engines": { - "node": ">=20.0.0" + "vscode": "^1.75.0" } }, - "node_modules/@secretlint/core": { - "version": "10.2.2", - "resolved": "https://registry.npmjs.org/@secretlint/core/-/core-10.2.2.tgz", - "integrity": "sha512-6rdwBwLP9+TO3rRjMVW1tX+lQeo5gBbxl1I5F8nh8bgGtKwdlCMhMKsBWzWg1ostxx/tIG7OjZI0/BxsP8bUgw==", + "node_modules/@vscode/test-electron": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/@vscode/test-electron/-/test-electron-2.5.2.tgz", + "integrity": "sha512-8ukpxv4wYe0iWMRQU18jhzJOHkeGKbnw7xWRX3Zw1WJA4cEKbHcmmLPdPrPtL6rhDcrlCZN+xKRpv09n4gRHYg==", "dev": true, "license": "MIT", "dependencies": { - "@secretlint/profiler": "^10.2.2", - "@secretlint/types": "^10.2.2", - "debug": "^4.4.1", - "structured-source": "^4.0.0" + "http-proxy-agent": "^7.0.2", + "https-proxy-agent": "^7.0.5", + "jszip": "^3.10.1", + "ora": "^8.1.0", + "semver": "^7.6.2" }, "engines": { - "node": ">=20.0.0" + "node": ">=16" } }, - "node_modules/@secretlint/formatter": { - "version": "10.2.2", - "resolved": "https://registry.npmjs.org/@secretlint/formatter/-/formatter-10.2.2.tgz", - "integrity": "sha512-10f/eKV+8YdGKNQmoDUD1QnYL7TzhI2kzyx95vsJKbEa8akzLAR5ZrWIZ3LbcMmBLzxlSQMMccRmi05yDQ5YDA==", + "node_modules/@webassemblyjs/ast": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.14.1.tgz", + "integrity": "sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==", "dev": true, - "license": "MIT", "dependencies": { - "@secretlint/resolver": "^10.2.2", - "@secretlint/types": "^10.2.2", - "@textlint/linter-formatter": "^15.2.0", - "@textlint/module-interop": "^15.2.0", - "@textlint/types": "^15.2.0", - "chalk": "^5.4.1", - "debug": "^4.4.1", - "pluralize": "^8.0.0", - "strip-ansi": "^7.1.0", - "table": "^6.9.0", - "terminal-link": "^4.0.0" - }, - "engines": { - "node": ">=20.0.0" + "@webassemblyjs/helper-numbers": "1.13.2", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2" } }, - "node_modules/@secretlint/formatter/node_modules/ansi-regex": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", - "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "node_modules/@webassemblyjs/floating-point-hex-parser": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz", + "integrity": "sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-api-error": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz", + "integrity": "sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-buffer": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.14.1.tgz", + "integrity": "sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-numbers": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.13.2.tgz", + "integrity": "sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==", "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" + "dependencies": { + "@webassemblyjs/floating-point-hex-parser": "1.13.2", + "@webassemblyjs/helper-api-error": "1.13.2", + "@xtuc/long": "4.2.2" } }, - "node_modules/@secretlint/formatter/node_modules/chalk": { - "version": "5.6.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", - "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", + "node_modules/@webassemblyjs/helper-wasm-bytecode": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz", + "integrity": "sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-wasm-section": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.14.1.tgz", + "integrity": "sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==", "dev": true, - "license": "MIT", - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/wasm-gen": "1.14.1" } }, - "node_modules/@secretlint/formatter/node_modules/strip-ansi": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", - "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", + "node_modules/@webassemblyjs/ieee754": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.13.2.tgz", + "integrity": "sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==", "dev": true, - "license": "MIT", "dependencies": { - "ansi-regex": "^6.2.2" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" + "@xtuc/ieee754": "^1.2.0" } }, - "node_modules/@secretlint/node": { - "version": "10.2.2", - "resolved": "https://registry.npmjs.org/@secretlint/node/-/node-10.2.2.tgz", - "integrity": "sha512-eZGJQgcg/3WRBwX1bRnss7RmHHK/YlP/l7zOQsrjexYt6l+JJa5YhUmHbuGXS94yW0++3YkEJp0kQGYhiw1DMQ==", + "node_modules/@webassemblyjs/leb128": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.13.2.tgz", + "integrity": "sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==", "dev": true, - "license": "MIT", "dependencies": { - "@secretlint/config-loader": "^10.2.2", - "@secretlint/core": "^10.2.2", - "@secretlint/formatter": "^10.2.2", - "@secretlint/profiler": "^10.2.2", - "@secretlint/source-creator": "^10.2.2", - "@secretlint/types": "^10.2.2", - "debug": "^4.4.1", - "p-map": "^7.0.3" - }, - "engines": { - "node": ">=20.0.0" + "@xtuc/long": "4.2.2" } }, - "node_modules/@secretlint/profiler": { - "version": "10.2.2", - "resolved": "https://registry.npmjs.org/@secretlint/profiler/-/profiler-10.2.2.tgz", - "integrity": "sha512-qm9rWfkh/o8OvzMIfY8a5bCmgIniSpltbVlUVl983zDG1bUuQNd1/5lUEeWx5o/WJ99bXxS7yNI4/KIXfHexig==", - "dev": true, - "license": "MIT" + "node_modules/@webassemblyjs/utf8": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.13.2.tgz", + "integrity": "sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==", + "dev": true }, - "node_modules/@secretlint/resolver": { - "version": "10.2.2", - "resolved": "https://registry.npmjs.org/@secretlint/resolver/-/resolver-10.2.2.tgz", - "integrity": "sha512-3md0cp12e+Ae5V+crPQYGd6aaO7ahw95s28OlULGyclyyUtf861UoRGS2prnUrKh7MZb23kdDOyGCYb9br5e4w==", + "node_modules/@webassemblyjs/wasm-edit": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.14.1.tgz", + "integrity": "sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==", "dev": true, - "license": "MIT" + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/helper-wasm-section": "1.14.1", + "@webassemblyjs/wasm-gen": "1.14.1", + "@webassemblyjs/wasm-opt": "1.14.1", + "@webassemblyjs/wasm-parser": "1.14.1", + "@webassemblyjs/wast-printer": "1.14.1" + } }, - "node_modules/@secretlint/secretlint-formatter-sarif": { - "version": "10.2.2", - "resolved": "https://registry.npmjs.org/@secretlint/secretlint-formatter-sarif/-/secretlint-formatter-sarif-10.2.2.tgz", - "integrity": "sha512-ojiF9TGRKJJw308DnYBucHxkpNovDNu1XvPh7IfUp0A12gzTtxuWDqdpuVezL7/IP8Ua7mp5/VkDMN9OLp1doQ==", + "node_modules/@webassemblyjs/wasm-gen": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.14.1.tgz", + "integrity": "sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==", "dev": true, - "license": "MIT", "dependencies": { - "node-sarif-builder": "^3.2.0" + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/ieee754": "1.13.2", + "@webassemblyjs/leb128": "1.13.2", + "@webassemblyjs/utf8": "1.13.2" } }, - "node_modules/@secretlint/secretlint-rule-no-dotenv": { - "version": "10.2.2", - "resolved": "https://registry.npmjs.org/@secretlint/secretlint-rule-no-dotenv/-/secretlint-rule-no-dotenv-10.2.2.tgz", - "integrity": "sha512-KJRbIShA9DVc5Va3yArtJ6QDzGjg3PRa1uYp9As4RsyKtKSSZjI64jVca57FZ8gbuk4em0/0Jq+uy6485wxIdg==", + "node_modules/@webassemblyjs/wasm-opt": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.14.1.tgz", + "integrity": "sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==", "dev": true, - "license": "MIT", "dependencies": { - "@secretlint/types": "^10.2.2" - }, - "engines": { - "node": ">=20.0.0" + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/wasm-gen": "1.14.1", + "@webassemblyjs/wasm-parser": "1.14.1" } }, - "node_modules/@secretlint/secretlint-rule-preset-recommend": { - "version": "10.2.2", - "resolved": "https://registry.npmjs.org/@secretlint/secretlint-rule-preset-recommend/-/secretlint-rule-preset-recommend-10.2.2.tgz", - "integrity": "sha512-K3jPqjva8bQndDKJqctnGfwuAxU2n9XNCPtbXVI5JvC7FnQiNg/yWlQPbMUlBXtBoBGFYp08A94m6fvtc9v+zA==", + "node_modules/@webassemblyjs/wasm-parser": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz", + "integrity": "sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==", "dev": true, - "license": "MIT", - "engines": { - "node": ">=20.0.0" + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-api-error": "1.13.2", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/ieee754": "1.13.2", + "@webassemblyjs/leb128": "1.13.2", + "@webassemblyjs/utf8": "1.13.2" } }, - "node_modules/@secretlint/source-creator": { - "version": "10.2.2", - "resolved": "https://registry.npmjs.org/@secretlint/source-creator/-/source-creator-10.2.2.tgz", - "integrity": "sha512-h6I87xJfwfUTgQ7irWq7UTdq/Bm1RuQ/fYhA3dtTIAop5BwSFmZyrchph4WcoEvbN460BWKmk4RYSvPElIIvxw==", + "node_modules/@webassemblyjs/wast-printer": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.14.1.tgz", + "integrity": "sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==", "dev": true, - "license": "MIT", "dependencies": { - "@secretlint/types": "^10.2.2", - "istextorbinary": "^9.5.0" - }, - "engines": { - "node": ">=20.0.0" + "@webassemblyjs/ast": "1.14.1", + "@xtuc/long": "4.2.2" } }, - "node_modules/@secretlint/types": { - "version": "10.2.2", - "resolved": "https://registry.npmjs.org/@secretlint/types/-/types-10.2.2.tgz", - "integrity": "sha512-Nqc90v4lWCXyakD6xNyNACBJNJ0tNCwj2WNk/7ivyacYHxiITVgmLUFXTBOeCdy79iz6HtN9Y31uw/jbLrdOAg==", + "node_modules/@webpack-cli/configtest": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-1.2.0.tgz", + "integrity": "sha512-4FB8Tj6xyVkyqjj1OaTqCjXYULB9FMkqQ8yGrZjRDrYh0nOE+7Lhs45WioWQQMV+ceFlE368Ukhe6xdvJM9Egg==", "dev": true, - "license": "MIT", - "engines": { - "node": ">=20.0.0" + "peerDependencies": { + "webpack": "4.x.x || 5.x.x", + "webpack-cli": "4.x.x" } }, - "node_modules/@sindresorhus/is": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-7.2.0.tgz", - "integrity": "sha512-P1Cz1dWaFfR4IR+U13mqqiGsLFf1KbayybWwdd2vfctdV6hDpUkgCY0nKOLLTMSoRd/jJNjtbqzf13K8DCCXQw==", + "node_modules/@webpack-cli/info": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-1.5.0.tgz", + "integrity": "sha512-e8tSXZpw2hPl2uMJY6fsMswaok5FdlGNRTktvFk2sD8RjH0hE2+XistawJx1vmKteh4NmGmNUrp+Tb2w+udPcQ==", "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" + "dependencies": { + "envinfo": "^7.7.3" }, - "funding": { - "url": "https://github.com/sindresorhus/is?sponsor=1" + "peerDependencies": { + "webpack-cli": "4.x.x" } }, - "node_modules/@sindresorhus/merge-streams": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/merge-streams/-/merge-streams-4.0.0.tgz", - "integrity": "sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ==", + "node_modules/@webpack-cli/serve": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-1.7.0.tgz", + "integrity": "sha512-oxnCNGj88fL+xzV+dacXs44HcDwf1ovs3AuEzvP7mqXw7fQntqIhQ1BRmynh4qEKQSSSRSWVyXRjmTbZIX9V2Q==", "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" + "peerDependencies": { + "webpack-cli": "4.x.x" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "peerDependenciesMeta": { + "webpack-dev-server": { + "optional": true + } } }, - "node_modules/@textlint/ast-node-types": { - "version": "15.5.2", - "resolved": "https://registry.npmjs.org/@textlint/ast-node-types/-/ast-node-types-15.5.2.tgz", - "integrity": "sha512-fCaOxoup5LIyBEo7R1oYWE7V4bSX0KQeHh66twon9e9usaLE3ijgF8QjYsR6joCssdeCHVd0wHm7ppsEyTr6vg==", - "dev": true, - "license": "MIT" + "node_modules/@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "dev": true }, - "node_modules/@textlint/linter-formatter": { - "version": "15.5.2", - "resolved": "https://registry.npmjs.org/@textlint/linter-formatter/-/linter-formatter-15.5.2.tgz", - "integrity": "sha512-jAw7jWM8+wU9cG6Uu31jGyD1B+PAVePCvnPKC/oov+2iBPKk3ao30zc/Itmi7FvXo4oPaL9PmzPPQhyniPVgVg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@azu/format-text": "^1.0.2", - "@azu/style-format": "^1.0.1", - "@textlint/module-interop": "15.5.2", - "@textlint/resolver": "15.5.2", - "@textlint/types": "15.5.2", - "chalk": "^4.1.2", - "debug": "^4.4.3", - "js-yaml": "^4.1.1", - "lodash": "^4.17.23", - "pluralize": "^2.0.0", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1", - "table": "^6.9.0", - "text-table": "^0.2.0" - } + "node_modules/@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", + "dev": true }, - "node_modules/@textlint/linter-formatter/node_modules/pluralize": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-2.0.0.tgz", - "integrity": "sha512-TqNZzQCD4S42De9IfnnBvILN7HAW7riLqsCyp8lgjXeysyPlX5HhqKAcJHHHb9XskE4/a+7VGC9zzx8Ls0jOAw==", + "node_modules/acorn": { + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", + "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", "dev": true, - "license": "MIT" + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } }, - "node_modules/@textlint/module-interop": { - "version": "15.5.2", - "resolved": "https://registry.npmjs.org/@textlint/module-interop/-/module-interop-15.5.2.tgz", - "integrity": "sha512-mg6rMQ3+YjwiXCYoQXbyVfDucpTa1q5mhspd/9qHBxUq4uY6W8GU42rmT3GW0V1yOfQ9z/iRrgPtkp71s8JzXg==", + "node_modules/acorn-import-phases": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/acorn-import-phases/-/acorn-import-phases-1.0.4.tgz", + "integrity": "sha512-wKmbr/DDiIXzEOiWrTTUcDm24kQ2vGfZQvM2fwg2vXqR5uW6aapr7ObPtj1th32b9u90/Pf4AItvdTh42fBmVQ==", "dev": true, - "license": "MIT" + "engines": { + "node": ">=10.13.0" + }, + "peerDependencies": { + "acorn": "^8.14.0" + } }, - "node_modules/@textlint/resolver": { - "version": "15.5.2", - "resolved": "https://registry.npmjs.org/@textlint/resolver/-/resolver-15.5.2.tgz", - "integrity": "sha512-YEITdjRiJaQrGLUWxWXl4TEg+d2C7+TNNjbGPHPH7V7CCnXm+S9GTjGAL7Q2WSGJyFEKt88Jvx6XdJffRv4HEA==", + "node_modules/agent-base": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz", + "integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==", "dev": true, - "license": "MIT" + "dependencies": { + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } }, - "node_modules/@textlint/types": { - "version": "15.5.2", - "resolved": "https://registry.npmjs.org/@textlint/types/-/types-15.5.2.tgz", - "integrity": "sha512-sJOrlVLLXp4/EZtiWKWq9y2fWyZlI8GP+24rnU5avtPWBIMm/1w97yzKrAqYF8czx2MqR391z5akhnfhj2f/AQ==", + "node_modules/ajv": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.18.0.tgz", + "integrity": "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==", "dev": true, "license": "MIT", "dependencies": { - "@textlint/ast-node-types": "15.5.2" + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/@types/eslint": { - "version": "9.6.1", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-9.6.1.tgz", - "integrity": "sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==", - "dev": true, - "dependencies": { - "@types/estree": "*", - "@types/json-schema": "*" - } - }, - "node_modules/@types/eslint-scope": { - "version": "3.7.7", - "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz", - "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==", - "dev": true, - "dependencies": { - "@types/eslint": "*", - "@types/estree": "*" - } - }, - "node_modules/@types/estree": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", - "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", - "dev": true - }, - "node_modules/@types/fs-extra": { - "version": "9.0.13", - "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-9.0.13.tgz", - "integrity": "sha512-nEnwB++1u5lVDM2UI4c1+5R+FYaKfaAzS4OococimjVm3nQw3TuzH5UNsocrcTBbhnerblyHj4A49qXbIiZdpA==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==", - "dev": true, - "dependencies": { - "@types/minimatch": "*", - "@types/node": "*" - } - }, - "node_modules/@types/http-cache-semantics": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz", - "integrity": "sha512-L3LgimLHXtGkWikKnsPg0/VFx9OGZaC+eN1u4r+OB1XRqH3meBIAVC2zr1WdMH+RHmnRkqliQAOHNJ/E0j/e0Q==", - "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", - "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", - "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 - }, - "node_modules/@types/lodash": { - "version": "4.14.195", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.195.tgz", - "integrity": "sha512-Hwx9EUgdwf2GLarOjQp5ZH8ZmblzcbTBC2wtQWNKARBSxM9ezRIAUpeDTgoQRAFB0+8CNWXVA9+MaSOzOF3nPg==", - "dev": true - }, - "node_modules/@types/minimatch": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.5.tgz", - "integrity": "sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==", - "dev": true - }, - "node_modules/@types/mocha": { - "version": "9.1.1", - "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-9.1.1.tgz", - "integrity": "sha512-Z61JK7DKDtdKTWwLeElSEBcWGRLY8g95ic5FoQqI9CMx0ns/Ghep3B4DfcEimiKMvtamNVULVNKEsiwV3aQmXw==", - "dev": true - }, - "node_modules/@types/node": { - "version": "20.16.1", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.16.1.tgz", - "integrity": "sha512-zJDo7wEadFtSyNz5QITDfRcrhqDvQI1xQNQ0VoizPjM/dVAODqqIUWbJPkvsxmTI0MYRGRikcdjMPhOssnPejQ==", - "dev": true, - "dependencies": { - "undici-types": "~6.19.2" - } - }, - "node_modules/@types/normalize-package-data": { - "version": "2.4.4", - "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz", - "integrity": "sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/sarif": { - "version": "2.1.7", - "resolved": "https://registry.npmjs.org/@types/sarif/-/sarif-2.1.7.tgz", - "integrity": "sha512-kRz0VEkJqWLf1LLVN4pT1cg1Z9wAuvI6L97V3m2f5B76Tg8d413ddvLBPTEHAZJlnn4XSvu0FkZtViCQGVyrXQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/selenium-webdriver": { - "version": "4.35.5", - "resolved": "https://registry.npmjs.org/@types/selenium-webdriver/-/selenium-webdriver-4.35.5.tgz", - "integrity": "sha512-wCQCjWmahRkUAO7S703UAvBFkxz4o/rjX4T2AOSWKXSi0sTQPsrXxR0GjtFUT0ompedLkYH4R5HO5Urz0hyeog==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*", - "@types/ws": "*" - } - }, - "node_modules/@types/semver": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.0.tgz", - "integrity": "sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw==", - "dev": true - }, - "node_modules/@types/vscode": { - "version": "1.95.0", - "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.95.0.tgz", - "integrity": "sha512-0LBD8TEiNbet3NvWsmn59zLzOFu/txSlGxnv5yAFHCrhG9WvAnR3IvfHzMOs2aeWqgvNjq9pO99IUw8d3n+unw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/ws": { - "version": "8.18.1", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.18.1.tgz", - "integrity": "sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@typespec/ts-http-runtime": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/@typespec/ts-http-runtime/-/ts-http-runtime-0.3.4.tgz", - "integrity": "sha512-CI0NhTrz4EBaa0U+HaaUZrJhPoso8sG7ZFya8uQoBA57fjzrjRSv87ekCjLZOFExN+gXE/z0xuN2QfH4H2HrLQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "http-proxy-agent": "^7.0.0", - "https-proxy-agent": "^7.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@typespec/ts-http-runtime/node_modules/tslib": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "dev": true, - "license": "0BSD" - }, - "node_modules/@vscode/extension-telemetry": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@vscode/extension-telemetry/-/extension-telemetry-1.2.0.tgz", - "integrity": "sha512-En6dTwfy5NFzSMibvOpx/lKq2jtgWuR4++KJbi3SpQ2iT8gm+PHo9868/scocW122KDwTxl4ruxZ7i4rHmJJnQ==", - "license": "MIT", - "dependencies": { - "@microsoft/1ds-core-js": "^4.3.10", - "@microsoft/1ds-post-js": "^4.3.10", - "@microsoft/applicationinsights-web-basic": "^3.3.10" - }, - "engines": { - "vscode": "^1.75.0" - } - }, - "node_modules/@vscode/test-electron": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/@vscode/test-electron/-/test-electron-2.5.2.tgz", - "integrity": "sha512-8ukpxv4wYe0iWMRQU18jhzJOHkeGKbnw7xWRX3Zw1WJA4cEKbHcmmLPdPrPtL6rhDcrlCZN+xKRpv09n4gRHYg==", - "dev": true, - "license": "MIT", - "dependencies": { - "http-proxy-agent": "^7.0.2", - "https-proxy-agent": "^7.0.5", - "jszip": "^3.10.1", - "ora": "^8.1.0", - "semver": "^7.6.2" - }, - "engines": { - "node": ">=16" - } - }, - "node_modules/@vscode/vsce": { - "version": "3.7.1", - "resolved": "https://registry.npmjs.org/@vscode/vsce/-/vsce-3.7.1.tgz", - "integrity": "sha512-OTm2XdMt2YkpSn2Nx7z2EJtSuhRHsTPYsSK59hr3v8jRArK+2UEoju4Jumn1CmpgoBLGI6ReHLJ/czYltNUW3g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@azure/identity": "^4.1.0", - "@secretlint/node": "^10.1.2", - "@secretlint/secretlint-formatter-sarif": "^10.1.2", - "@secretlint/secretlint-rule-no-dotenv": "^10.1.2", - "@secretlint/secretlint-rule-preset-recommend": "^10.1.2", - "@vscode/vsce-sign": "^2.0.0", - "azure-devops-node-api": "^12.5.0", - "chalk": "^4.1.2", - "cheerio": "^1.0.0-rc.9", - "cockatiel": "^3.1.2", - "commander": "^12.1.0", - "form-data": "^4.0.0", - "glob": "^11.0.0", - "hosted-git-info": "^4.0.2", - "jsonc-parser": "^3.2.0", - "leven": "^3.1.0", - "markdown-it": "^14.1.0", - "mime": "^1.3.4", - "minimatch": "^3.0.3", - "parse-semver": "^1.1.1", - "read": "^1.0.7", - "secretlint": "^10.1.2", - "semver": "^7.5.2", - "tmp": "^0.2.3", - "typed-rest-client": "^1.8.4", - "url-join": "^4.0.1", - "xml2js": "^0.5.0", - "yauzl": "^2.3.1", - "yazl": "^2.2.2" - }, - "bin": { - "vsce": "vsce" - }, - "engines": { - "node": ">= 20" - }, - "optionalDependencies": { - "keytar": "^7.7.0" - } - }, - "node_modules/@vscode/vsce-sign": { - "version": "2.0.9", - "resolved": "https://registry.npmjs.org/@vscode/vsce-sign/-/vsce-sign-2.0.9.tgz", - "integrity": "sha512-8IvaRvtFyzUnGGl3f5+1Cnor3LqaUWvhaUjAYO8Y39OUYlOf3cRd+dowuQYLpZcP3uwSG+mURwjEBOSq4SOJ0g==", - "dev": true, - "hasInstallScript": true, - "license": "SEE LICENSE IN LICENSE.txt", - "optionalDependencies": { - "@vscode/vsce-sign-alpine-arm64": "2.0.6", - "@vscode/vsce-sign-alpine-x64": "2.0.6", - "@vscode/vsce-sign-darwin-arm64": "2.0.6", - "@vscode/vsce-sign-darwin-x64": "2.0.6", - "@vscode/vsce-sign-linux-arm": "2.0.6", - "@vscode/vsce-sign-linux-arm64": "2.0.6", - "@vscode/vsce-sign-linux-x64": "2.0.6", - "@vscode/vsce-sign-win32-arm64": "2.0.6", - "@vscode/vsce-sign-win32-x64": "2.0.6" - } - }, - "node_modules/@vscode/vsce-sign-alpine-arm64": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@vscode/vsce-sign-alpine-arm64/-/vsce-sign-alpine-arm64-2.0.6.tgz", - "integrity": "sha512-wKkJBsvKF+f0GfsUuGT0tSW0kZL87QggEiqNqK6/8hvqsXvpx8OsTEc3mnE1kejkh5r+qUyQ7PtF8jZYN0mo8Q==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "SEE LICENSE IN LICENSE.txt", - "optional": true, - "os": [ - "alpine" - ] - }, - "node_modules/@vscode/vsce-sign-alpine-x64": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@vscode/vsce-sign-alpine-x64/-/vsce-sign-alpine-x64-2.0.6.tgz", - "integrity": "sha512-YoAGlmdK39vKi9jA18i4ufBbd95OqGJxRvF3n6ZbCyziwy3O+JgOpIUPxv5tjeO6gQfx29qBivQ8ZZTUF2Ba0w==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "SEE LICENSE IN LICENSE.txt", - "optional": true, - "os": [ - "alpine" - ] - }, - "node_modules/@vscode/vsce-sign-darwin-arm64": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@vscode/vsce-sign-darwin-arm64/-/vsce-sign-darwin-arm64-2.0.6.tgz", - "integrity": "sha512-5HMHaJRIQuozm/XQIiJiA0W9uhdblwwl2ZNDSSAeXGO9YhB9MH5C4KIHOmvyjUnKy4UCuiP43VKpIxW1VWP4tQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "SEE LICENSE IN LICENSE.txt", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@vscode/vsce-sign-darwin-x64": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@vscode/vsce-sign-darwin-x64/-/vsce-sign-darwin-x64-2.0.6.tgz", - "integrity": "sha512-25GsUbTAiNfHSuRItoQafXOIpxlYj+IXb4/qarrXu7kmbH94jlm5sdWSCKrrREs8+GsXF1b+l3OB7VJy5jsykw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "SEE LICENSE IN LICENSE.txt", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@vscode/vsce-sign-linux-arm": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@vscode/vsce-sign-linux-arm/-/vsce-sign-linux-arm-2.0.6.tgz", - "integrity": "sha512-UndEc2Xlq4HsuMPnwu7420uqceXjs4yb5W8E2/UkaHBB9OWCwMd3/bRe/1eLe3D8kPpxzcaeTyXiK3RdzS/1CA==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "SEE LICENSE IN LICENSE.txt", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@vscode/vsce-sign-linux-arm64": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@vscode/vsce-sign-linux-arm64/-/vsce-sign-linux-arm64-2.0.6.tgz", - "integrity": "sha512-cfb1qK7lygtMa4NUl2582nP7aliLYuDEVpAbXJMkDq1qE+olIw/es+C8j1LJwvcRq1I2yWGtSn3EkDp9Dq5FdA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "SEE LICENSE IN LICENSE.txt", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@vscode/vsce-sign-linux-x64": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@vscode/vsce-sign-linux-x64/-/vsce-sign-linux-x64-2.0.6.tgz", - "integrity": "sha512-/olerl1A4sOqdP+hjvJ1sbQjKN07Y3DVnxO4gnbn/ahtQvFrdhUi0G1VsZXDNjfqmXw57DmPi5ASnj/8PGZhAA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "SEE LICENSE IN LICENSE.txt", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@vscode/vsce-sign-win32-arm64": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@vscode/vsce-sign-win32-arm64/-/vsce-sign-win32-arm64-2.0.6.tgz", - "integrity": "sha512-ivM/MiGIY0PJNZBoGtlRBM/xDpwbdlCWomUWuLmIxbi1Cxe/1nooYrEQoaHD8ojVRgzdQEUzMsRbyF5cJJgYOg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "SEE LICENSE IN LICENSE.txt", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@vscode/vsce-sign-win32-x64": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@vscode/vsce-sign-win32-x64/-/vsce-sign-win32-x64-2.0.6.tgz", - "integrity": "sha512-mgth9Kvze+u8CruYMmhHw6Zgy3GRX2S+Ed5oSokDEK5vPEwGGKnmuXua9tmFhomeAnhgJnL4DCna3TiNuGrBTQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "SEE LICENSE IN LICENSE.txt", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@vscode/vsce/node_modules/brace-expansion": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.13.tgz", - "integrity": "sha512-9ZLprWS6EENmhEOpjCYW2c8VkmOvckIJZfkr7rBW6dObmfgJ/L1GpSYW5Hpo9lDz4D1+n0Ckz8rU7FwHDQiG/w==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/@vscode/vsce/node_modules/commander": { - "version": "12.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz", - "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "node_modules/@vscode/vsce/node_modules/glob": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-11.1.0.tgz", - "integrity": "sha512-vuNwKSaKiqm7g0THUBu2x7ckSs3XJLXE+2ssL7/MfTGPLLcrJQ/4Uq1CjPTtO5cCIiRxqvN6Twy1qOwhL0Xjcw==", - "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", - "dev": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "foreground-child": "^3.3.1", - "jackspeak": "^4.1.1", - "minimatch": "^10.1.1", - "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", - "path-scurry": "^2.0.0" - }, - "bin": { - "glob": "dist/esm/bin.mjs" - }, - "engines": { - "node": "20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@vscode/vsce/node_modules/glob/node_modules/balanced-match": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", - "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", - "dev": true, - "license": "MIT", - "engines": { - "node": "18 || 20 || >=22" - } - }, - "node_modules/@vscode/vsce/node_modules/glob/node_modules/brace-expansion": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.5.tgz", - "integrity": "sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ==", - "dev": true, - "dependencies": { - "balanced-match": "^4.0.2" - }, - "engines": { - "node": "18 || 20 || >=22" - } - }, - "node_modules/@vscode/vsce/node_modules/glob/node_modules/minimatch": { - "version": "10.2.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.4.tgz", - "integrity": "sha512-oRjTw/97aTBN0RHbYCdtF1MQfvusSIBQM0IZEgzl6426+8jSC0nF1a/GmnVLpfB9yyr6g6FTqWqiZVbxrtaCIg==", - "dev": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "brace-expansion": "^5.0.2" - }, - "engines": { - "node": "18 || 20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@vscode/vsce/node_modules/lru-cache": { - "version": "11.2.7", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.7.tgz", - "integrity": "sha512-aY/R+aEsRelme17KGQa/1ZSIpLpNYYrhcrepKTZgE+W3WM16YMCaPwOHLHsmopZHELU0Ojin1lPVxKR0MihncA==", - "dev": true, - "license": "BlueOak-1.0.0", - "engines": { - "node": "20 || >=22" - } - }, - "node_modules/@vscode/vsce/node_modules/minimatch": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", - "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/@vscode/vsce/node_modules/path-scurry": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.2.tgz", - "integrity": "sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg==", - "dev": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "lru-cache": "^11.0.0", - "minipass": "^7.1.2" - }, - "engines": { - "node": "18 || 20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@webassemblyjs/ast": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.14.1.tgz", - "integrity": "sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==", - "dev": true, - "dependencies": { - "@webassemblyjs/helper-numbers": "1.13.2", - "@webassemblyjs/helper-wasm-bytecode": "1.13.2" - } - }, - "node_modules/@webassemblyjs/floating-point-hex-parser": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz", - "integrity": "sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==", - "dev": true - }, - "node_modules/@webassemblyjs/helper-api-error": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz", - "integrity": "sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==", - "dev": true - }, - "node_modules/@webassemblyjs/helper-buffer": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.14.1.tgz", - "integrity": "sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==", - "dev": true - }, - "node_modules/@webassemblyjs/helper-numbers": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.13.2.tgz", - "integrity": "sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==", - "dev": true, - "dependencies": { - "@webassemblyjs/floating-point-hex-parser": "1.13.2", - "@webassemblyjs/helper-api-error": "1.13.2", - "@xtuc/long": "4.2.2" - } - }, - "node_modules/@webassemblyjs/helper-wasm-bytecode": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz", - "integrity": "sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==", - "dev": true - }, - "node_modules/@webassemblyjs/helper-wasm-section": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.14.1.tgz", - "integrity": "sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==", - "dev": true, - "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@webassemblyjs/helper-buffer": "1.14.1", - "@webassemblyjs/helper-wasm-bytecode": "1.13.2", - "@webassemblyjs/wasm-gen": "1.14.1" - } - }, - "node_modules/@webassemblyjs/ieee754": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.13.2.tgz", - "integrity": "sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==", - "dev": true, - "dependencies": { - "@xtuc/ieee754": "^1.2.0" - } - }, - "node_modules/@webassemblyjs/leb128": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.13.2.tgz", - "integrity": "sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==", - "dev": true, - "dependencies": { - "@xtuc/long": "4.2.2" - } - }, - "node_modules/@webassemblyjs/utf8": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.13.2.tgz", - "integrity": "sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==", - "dev": true - }, - "node_modules/@webassemblyjs/wasm-edit": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.14.1.tgz", - "integrity": "sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==", - "dev": true, - "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@webassemblyjs/helper-buffer": "1.14.1", - "@webassemblyjs/helper-wasm-bytecode": "1.13.2", - "@webassemblyjs/helper-wasm-section": "1.14.1", - "@webassemblyjs/wasm-gen": "1.14.1", - "@webassemblyjs/wasm-opt": "1.14.1", - "@webassemblyjs/wasm-parser": "1.14.1", - "@webassemblyjs/wast-printer": "1.14.1" - } - }, - "node_modules/@webassemblyjs/wasm-gen": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.14.1.tgz", - "integrity": "sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==", - "dev": true, - "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@webassemblyjs/helper-wasm-bytecode": "1.13.2", - "@webassemblyjs/ieee754": "1.13.2", - "@webassemblyjs/leb128": "1.13.2", - "@webassemblyjs/utf8": "1.13.2" - } - }, - "node_modules/@webassemblyjs/wasm-opt": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.14.1.tgz", - "integrity": "sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==", - "dev": true, - "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@webassemblyjs/helper-buffer": "1.14.1", - "@webassemblyjs/wasm-gen": "1.14.1", - "@webassemblyjs/wasm-parser": "1.14.1" - } - }, - "node_modules/@webassemblyjs/wasm-parser": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz", - "integrity": "sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==", - "dev": true, - "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@webassemblyjs/helper-api-error": "1.13.2", - "@webassemblyjs/helper-wasm-bytecode": "1.13.2", - "@webassemblyjs/ieee754": "1.13.2", - "@webassemblyjs/leb128": "1.13.2", - "@webassemblyjs/utf8": "1.13.2" - } - }, - "node_modules/@webassemblyjs/wast-printer": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.14.1.tgz", - "integrity": "sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==", - "dev": true, - "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@xtuc/long": "4.2.2" - } - }, - "node_modules/@webpack-cli/configtest": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-1.2.0.tgz", - "integrity": "sha512-4FB8Tj6xyVkyqjj1OaTqCjXYULB9FMkqQ8yGrZjRDrYh0nOE+7Lhs45WioWQQMV+ceFlE368Ukhe6xdvJM9Egg==", - "dev": true, - "peerDependencies": { - "webpack": "4.x.x || 5.x.x", - "webpack-cli": "4.x.x" - } - }, - "node_modules/@webpack-cli/info": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-1.5.0.tgz", - "integrity": "sha512-e8tSXZpw2hPl2uMJY6fsMswaok5FdlGNRTktvFk2sD8RjH0hE2+XistawJx1vmKteh4NmGmNUrp+Tb2w+udPcQ==", - "dev": true, - "dependencies": { - "envinfo": "^7.7.3" - }, - "peerDependencies": { - "webpack-cli": "4.x.x" - } - }, - "node_modules/@webpack-cli/serve": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-1.7.0.tgz", - "integrity": "sha512-oxnCNGj88fL+xzV+dacXs44HcDwf1ovs3AuEzvP7mqXw7fQntqIhQ1BRmynh4qEKQSSSRSWVyXRjmTbZIX9V2Q==", - "dev": true, - "peerDependencies": { - "webpack-cli": "4.x.x" - }, - "peerDependenciesMeta": { - "webpack-dev-server": { - "optional": true - } - } - }, - "node_modules/@xtuc/ieee754": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", - "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", - "dev": true - }, - "node_modules/@xtuc/long": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", - "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", - "dev": true - }, - "node_modules/acorn": { - "version": "8.15.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", - "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", - "dev": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-import-phases": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/acorn-import-phases/-/acorn-import-phases-1.0.4.tgz", - "integrity": "sha512-wKmbr/DDiIXzEOiWrTTUcDm24kQ2vGfZQvM2fwg2vXqR5uW6aapr7ObPtj1th32b9u90/Pf4AItvdTh42fBmVQ==", - "dev": true, - "engines": { - "node": ">=10.13.0" - }, - "peerDependencies": { - "acorn": "^8.14.0" - } - }, - "node_modules/agent-base": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz", - "integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==", - "dev": true, - "dependencies": { - "debug": "^4.3.4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/ajv": { - "version": "8.18.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.18.0.tgz", - "integrity": "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.3", - "fast-uri": "^3.0.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ajv-formats": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", - "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", - "dev": true, - "dependencies": { - "ajv": "^8.0.0" - }, - "peerDependencies": { - "ajv": "^8.0.0" - }, - "peerDependenciesMeta": { - "ajv": { - "optional": true - } - } - }, - "node_modules/ajv-keywords": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", - "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.3" - }, - "peerDependencies": { - "ajv": "^8.8.2" - } - }, - "node_modules/ansi-escapes": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-7.3.0.tgz", - "integrity": "sha512-BvU8nYgGQBxcmMuEeUEmNTvrMVjJNSH7RgW24vXexN4Ven6qCvy4TntnvlnwnMLTVlcRQQdbRY8NKnaIoeWDNg==", - "dev": true, - "license": "MIT", - "dependencies": { - "environment": "^1.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, - "node_modules/astral-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", - "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" - }, - "node_modules/await-lock": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/await-lock/-/await-lock-2.2.2.tgz", - "integrity": "sha512-aDczADvlvTGajTDjcjpJMqRkOF6Qdz3YbPZm/PyW6tKPkx2hlYBzxMhEywM/tU72HrVZjgl5VCdRuMlA7pZ8Gw==" - }, - "node_modules/axios": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.15.0.tgz", - "integrity": "sha512-wWyJDlAatxk30ZJer+GeCWS209sA42X+N5jU2jy6oHTp7ufw8uzUTVFBX9+wTfAlhiJXGS0Bq7X6efruWjuK9Q==", - "dependencies": { - "follow-redirects": "^1.15.11", - "form-data": "^4.0.5", - "proxy-from-env": "^2.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", - "integrity": "sha512-R5eFskGvOm3U/GzeAuxRkUsAl0hrAwGgWn6zAd2KrZmrEhWZVqLew4OOupbQlXUuojUzpGtq62SmdhJ06N88og==", - "dev": true, - "license": "MIT", - "dependencies": { - "tunnel": "0.0.6", - "typed-rest-client": "^1.8.4" - } - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" - }, - "node_modules/base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "optional": true - }, - "node_modules/baseline-browser-mapping": { - "version": "2.9.19", - "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.9.19.tgz", - "integrity": "sha512-ipDqC8FrAl/76p2SSWKSI+H9tFwm7vYqXQrItCuiVPt26Km0jS+NzSsBWAaBusvSbQcfJG+JitdMm+wZAgTYqg==", - "dev": true, - "bin": { - "baseline-browser-mapping": "dist/cli.js" - } - }, - "node_modules/before-after-hook": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-3.0.2.tgz", - "integrity": "sha512-Nik3Sc0ncrMK4UUdXQmAnRtzmNQTAAXmXIopizwZ1W1t8QmfJj+zL4OA2I7XPTPW5z5TDqv4hRo/JzouDJnX3A==" - }, - "node_modules/binaryextensions": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/binaryextensions/-/binaryextensions-6.11.0.tgz", - "integrity": "sha512-sXnYK/Ij80TO3lcqZVV2YgfKN5QjUWIRk/XSm2J/4bd/lPko3lvk0O4ZppH6m+6hB2/GTu+ptNwVFe1xh+QLQw==", - "dev": true, - "license": "Artistic-2.0", - "dependencies": { - "editions": "^6.21.0" - }, - "engines": { - "node": ">=4" - }, - "funding": { - "url": "https://bevry.me/fund" - } - }, - "node_modules/bl": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", - "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "buffer": "^5.5.0", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" - } - }, - "node_modules/bl/node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/bluebird": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", - "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", - "dev": true, - "license": "MIT" - }, - "node_modules/boolbase": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", - "dev": true, - "license": "ISC" - }, - "node_modules/boundary": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/boundary/-/boundary-2.0.0.tgz", - "integrity": "sha512-rJKn5ooC9u8q13IMCrW0RSp31pxBCHE3y9V/tp3TdWSLf8Em3p6Di4NBpfzbJge9YjjFEsD0RtFEjtvHL5VyEA==", - "dev": true, - "license": "BSD-2-Clause" - }, - "node_modules/brace-expansion": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.3.tgz", - "integrity": "sha512-MCV/fYJEbqx68aE58kv2cA/kiky1G8vux3OR6/jbS+jIMe/6fJWa0DTzJU7dqijOWYwHi1t29FlfYI9uytqlpA==", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/braces": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", - "dependencies": { - "fill-range": "^7.1.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/browser-stdout": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", - "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", - "dev": true - }, - "node_modules/browserslist": { - "version": "4.28.1", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.1.tgz", - "integrity": "sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "baseline-browser-mapping": "^2.9.0", - "caniuse-lite": "^1.0.30001759", - "electron-to-chromium": "^1.5.263", - "node-releases": "^2.0.27", - "update-browserslist-db": "^1.2.0" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, - "node_modules/buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "optional": true, - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - }, - "node_modules/buffer-alloc": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz", - "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==", - "dev": true, - "dependencies": { - "buffer-alloc-unsafe": "^1.1.0", - "buffer-fill": "^1.0.0" - } - }, - "node_modules/buffer-alloc-unsafe": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz", - "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==", - "dev": true - }, - "node_modules/buffer-crc32": { - "version": "0.2.13", - "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", - "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": "*" - } - }, - "node_modules/buffer-equal-constant-time": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", - "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==", - "dev": true, - "license": "BSD-3-Clause" - }, - "node_modules/buffer-fill": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz", - "integrity": "sha512-T7zexNBwiiaCOGDg9xNX9PBmjrubblRkENuptryuI64URkXDFum9il/JGL8Lm8wYfAXpredVXXZz7eMHilimiQ==", - "dev": true - }, - "node_modules/buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "dev": true - }, - "node_modules/builtin-modules": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", - "integrity": "sha512-wxXCdllwGhI2kCC0MnvTGYTMvnVZTvqgypkiTI8Pa5tcz2i6VqsqwYGgqwXji+4RgCzms6EajE4IxiUH6HH8nQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/bundle-name": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-4.1.0.tgz", - "integrity": "sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "run-applescript": "^7.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/byte-counter": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/byte-counter/-/byte-counter-0.1.0.tgz", - "integrity": "sha512-jheRLVMeUKrDBjVw2O5+k4EvR4t9wtxHL+bo/LxfkxsVeuGMy3a5SEGgXdAFA4FSzTrU8rQXQIrsZ3oBq5a0pQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/c8": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/c8/-/c8-11.0.0.tgz", - "integrity": "sha512-e/uRViGHSVIJv7zsaDKM7VRn2390TgHXqUSvYwPHBQaU6L7E9L0n9JbdkwdYPvshDT0KymBmmlwSpms3yBaMNg==", - "dev": true, - "license": "ISC", - "dependencies": { - "@bcoe/v8-coverage": "^1.0.1", - "@istanbuljs/schema": "^0.1.3", - "find-up": "^5.0.0", - "foreground-child": "^3.1.1", - "istanbul-lib-coverage": "^3.2.0", - "istanbul-lib-report": "^3.0.1", - "istanbul-reports": "^3.1.6", - "test-exclude": "^8.0.0", - "v8-to-istanbul": "^9.0.0", - "yargs": "^17.7.2", - "yargs-parser": "^21.1.1" - }, - "bin": { - "c8": "bin/c8.js" - }, - "engines": { - "node": "20 || >=22" - }, - "peerDependencies": { - "monocart-coverage-reports": "^2" - }, - "peerDependenciesMeta": { - "monocart-coverage-reports": { - "optional": true - } - } - }, - "node_modules/cacheable-lookup": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-7.0.0.tgz", - "integrity": "sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14.16" - } - }, - "node_modules/cacheable-request": { - "version": "13.0.18", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-13.0.18.tgz", - "integrity": "sha512-rFWadDRKJs3s2eYdXlGggnBZKG7MTblkFBB0YllFds+UYnfogDp2wcR6JN97FhRkHTvq59n2vhNoHNZn29dh/Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/http-cache-semantics": "^4.0.4", - "get-stream": "^9.0.1", - "http-cache-semantics": "^4.2.0", - "keyv": "^5.5.5", - "mimic-response": "^4.0.0", - "normalize-url": "^8.1.1", - "responselike": "^4.0.2" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/call-bind-apply-helpers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", - "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", - "dependencies": { - "es-errors": "^1.3.0", - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/call-bound": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", - "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.2", - "get-intrinsic": "^1.3.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/caniuse-lite": { - "version": "1.0.30001769", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001769.tgz", - "integrity": "sha512-BCfFL1sHijQlBGWBMuJyhZUhzo7wer5sVj9hqekB/7xn0Ypy+pER/edCYQm4exbXj4WiySGp40P8UuTh6w1srg==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ] - }, - "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, - "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/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==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cheerio": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.2.0.tgz", - "integrity": "sha512-WDrybc/gKFpTYQutKIK6UvfcuxijIZfMfXaYm8NMsPQxSYvf+13fXUJ4rztGGbJcBQ/GF55gvrZ0Bc0bj/mqvg==", - "dev": true, - "license": "MIT", - "dependencies": { - "cheerio-select": "^2.1.0", - "dom-serializer": "^2.0.0", - "domhandler": "^5.0.3", - "domutils": "^3.2.2", - "encoding-sniffer": "^0.2.1", - "htmlparser2": "^10.1.0", - "parse5": "^7.3.0", - "parse5-htmlparser2-tree-adapter": "^7.1.0", - "parse5-parser-stream": "^7.1.2", - "undici": "^7.19.0", - "whatwg-mimetype": "^4.0.0" - }, - "engines": { - "node": ">=20.18.1" - }, - "funding": { - "url": "https://github.com/cheeriojs/cheerio?sponsor=1" - } - }, - "node_modules/cheerio-select": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-2.1.0.tgz", - "integrity": "sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "boolbase": "^1.0.0", - "css-select": "^5.1.0", - "css-what": "^6.1.0", - "domelementtype": "^2.3.0", - "domhandler": "^5.0.3", - "domutils": "^3.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, - "node_modules/chokidar": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", - "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", - "dev": true, - "dependencies": { - "readdirp": "^4.0.1" - }, - "engines": { - "node": ">= 14.16.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/chownr": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", - "dev": true - }, - "node_modules/chrome-trace-event": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", - "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", - "dev": true, - "engines": { - "node": ">=6.0" - } - }, - "node_modules/cli-cursor": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-5.0.0.tgz", - "integrity": "sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==", - "dev": true, - "license": "MIT", - "dependencies": { - "restore-cursor": "^5.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cli-spinners": { - "version": "2.9.2", - "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", - "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/clipboard-image": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/clipboard-image/-/clipboard-image-0.1.0.tgz", - "integrity": "sha512-SWk7FgaXLNFld19peQ/rTe0n97lwR1WbkqxV6JKCAOh7U52AKV/PeMFCyt/8IhBdqyDA8rdyewQMKZqvWT5Akg==", - "dev": true, - "license": "MIT", - "dependencies": { - "run-jxa": "^3.0.0" - }, - "bin": { - "clipboard-image": "cli.js" - }, - "engines": { - "node": ">=20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/clipboardy": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/clipboardy/-/clipboardy-5.3.1.tgz", - "integrity": "sha512-fPWgBqpp9ctiOQCkE5yjYGzv11ZU55g6ahEgr3COiio6dXdt1mbchCPXQrSR2Y9sZqfi8L7QD3+UosgXVIuPdg==", - "dev": true, - "license": "MIT", - "dependencies": { - "clipboard-image": "^0.1.0", - "execa": "^9.6.1", - "is-wayland": "^0.1.0", - "is-wsl": "^3.1.0", - "is64bit": "^2.0.0", - "powershell-utils": "^0.2.0" - }, - "engines": { - "node": ">=20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cliui": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", - "dev": true, - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/clone-deep": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", - "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", - "dev": true, - "dependencies": { - "is-plain-object": "^2.0.4", - "kind-of": "^6.0.2", - "shallow-clone": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/cockatiel": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/cockatiel/-/cockatiel-3.2.1.tgz", - "integrity": "sha512-gfrHV6ZPkquExvMh9IOkKsBzNDk6sDuZ6DdBGUBkvFnTCqCxzpuq48RySgP0AnaqQkw2zynOFj9yly6T1Q2G5Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=16" - } - }, - "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, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/colorette": { - "version": "2.0.20", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", - "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", - "dev": true - }, - "node_modules/combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true - }, - "node_modules/compare-versions": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-6.1.1.tgz", - "integrity": "sha512-4hm4VPpIecmlg59CHXnRDnqGplJFrbLG4aFEl5vl6cK1u76ws3LLvX7ikFnTDl5vo39sjWD6AaDPYodJp/NNHg==", - "dev": true, - "license": "MIT" - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true - }, - "node_modules/convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "dev": true, - "license": "MIT" - }, - "node_modules/copy-webpack-plugin": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-11.0.0.tgz", - "integrity": "sha512-fX2MWpamkW0hZxMEg0+mYnA40LTosOSa5TqZ9GYIBzyJa9C3QUaMPSE2xAi/buNr8u89SfD9wHSQVBzrRa/SOQ==", - "dev": true, - "dependencies": { - "fast-glob": "^3.2.11", - "glob-parent": "^6.0.1", - "globby": "^13.1.1", - "normalize-path": "^3.0.0", - "schema-utils": "^4.0.0", - "serialize-javascript": "^6.0.0" - }, - "engines": { - "node": ">= 14.15.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.1.0" - } - }, - "node_modules/core-util-is": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", - "dev": true - }, - "node_modules/cross-spawn": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", - "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", - "dev": true, - "license": "MIT", - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/crypto-random-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-4.0.0.tgz", - "integrity": "sha512-x8dy3RnvYdlUcPOjkEHqozhiwzKNSq7GcPuXFbnyMOCHxX8V3OgIg/pYuabl2sbUPfIJaeAQB7PMOK8DFIdoRA==", - "dev": true, - "license": "MIT", - "dependencies": { - "type-fest": "^1.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/crypto-random-string/node_modules/type-fest": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", - "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", - "dev": true, - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/css-select": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.2.2.tgz", - "integrity": "sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "boolbase": "^1.0.0", - "css-what": "^6.1.0", - "domhandler": "^5.0.2", - "domutils": "^3.0.1", - "nth-check": "^2.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, - "node_modules/css-what": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.2.2.tgz", - "integrity": "sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">= 6" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, - "node_modules/debug": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", - "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/decamelize": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", - "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/decompress-response": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-10.0.0.tgz", - "integrity": "sha512-oj7KWToJuuxlPr7VV0vabvxEIiqNMo+q0NueIiL3XhtwC6FVOX7Hr1c0C4eD0bmf7Zr+S/dSf2xvkH3Ad6sU3Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "mimic-response": "^4.0.0" - }, - "engines": { - "node": ">=20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/deep-extend": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", - "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/default-browser": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-5.5.0.tgz", - "integrity": "sha512-H9LMLr5zwIbSxrmvikGuI/5KGhZ8E2zH3stkMgM5LpOWDutGM2JZaj460Udnf1a+946zc7YBgrqEWwbk7zHvGw==", - "dev": true, - "license": "MIT", - "dependencies": { - "bundle-name": "^4.1.0", - "default-browser-id": "^5.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/default-browser-id": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-5.0.1.tgz", - "integrity": "sha512-x1VCxdX4t+8wVfd1so/9w+vQ4vx7lKd2Qp5tDRutErwmR85OgmfX7RlLRMWafRMY7hbEiXIbudNrjOAPa/hL8Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/define-lazy-prop": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz", - "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/detect-libc": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", - "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", - "dev": true, - "license": "Apache-2.0", - "optional": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/diff": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-7.0.0.tgz", - "integrity": "sha512-PJWHUb1RFevKCwaFA9RlG5tCd+FO5iRh9A8HEtkmBH2Li03iJriB6m6JIN4rGz3K3JLawI7/veA1xzRKP6ISBw==", - "dev": true, - "engines": { - "node": ">=0.3.1" - } - }, - "node_modules/dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dependencies": { - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/dom-serializer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", - "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", - "dev": true, - "license": "MIT", - "dependencies": { - "domelementtype": "^2.3.0", - "domhandler": "^5.0.2", - "entities": "^4.2.0" - }, - "funding": { - "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" - } - }, - "node_modules/domelementtype": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", - "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ], - "license": "BSD-2-Clause" - }, - "node_modules/domhandler": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", - "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "domelementtype": "^2.3.0" - }, - "engines": { - "node": ">= 4" - }, - "funding": { - "url": "https://github.com/fb55/domhandler?sponsor=1" - } - }, - "node_modules/domutils": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz", - "integrity": "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "dom-serializer": "^2.0.0", - "domelementtype": "^2.3.0", - "domhandler": "^5.0.3" - }, - "funding": { - "url": "https://github.com/fb55/domutils?sponsor=1" - } - }, - "node_modules/dunder-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", - "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", - "dependencies": { - "call-bind-apply-helpers": "^1.0.1", - "es-errors": "^1.3.0", - "gopd": "^1.2.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/duplexer2": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", - "integrity": "sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "readable-stream": "^2.0.2" - } - }, - "node_modules/eastasianwidth": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", - "dev": true - }, - "node_modules/ecdsa-sig-formatter": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", - "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "safe-buffer": "^5.0.1" - } - }, - "node_modules/editions": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/editions/-/editions-6.22.0.tgz", - "integrity": "sha512-UgGlf8IW75je7HZjNDpJdCv4cGJWIi6yumFdZ0R7A8/CIhQiWUjyGLCxdHpd8bmyD1gnkfUNK0oeOXqUS2cpfQ==", - "dev": true, - "license": "Artistic-2.0", - "dependencies": { - "version-range": "^4.15.0" - }, - "engines": { - "ecmascript": ">= es5", - "node": ">=4" - }, - "funding": { - "url": "https://bevry.me/fund" - } - }, - "node_modules/electron-to-chromium": { - "version": "1.5.286", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.286.tgz", - "integrity": "sha512-9tfDXhJ4RKFNerfjdCcZfufu49vg620741MNs26a9+bhLThdB+plgMeou98CAaHu/WATj2iHOOHTp1hWtABj2A==", - "dev": true - }, - "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 - }, - "node_modules/encoding-sniffer": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/encoding-sniffer/-/encoding-sniffer-0.2.1.tgz", - "integrity": "sha512-5gvq20T6vfpekVtqrYQsSCFZ1wEg5+wW0/QaZMWkFr6BqD3NfKs0rLCx4rrVlSWJeZb5NBJgVLswK/w2MWU+Gw==", - "dev": true, - "license": "MIT", - "dependencies": { - "iconv-lite": "^0.6.3", - "whatwg-encoding": "^3.1.1" - }, - "funding": { - "url": "https://github.com/fb55/encoding-sniffer?sponsor=1" - } - }, - "node_modules/end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "dev": true, - "dependencies": { - "once": "^1.4.0" - } - }, - "node_modules/enhanced-resolve": { - "version": "5.19.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.19.0.tgz", - "integrity": "sha512-phv3E1Xl4tQOShqSte26C7Fl84EwUdZsyOuSSk9qtAGyyQs2s3jJzComh+Abf4g187lUUAvH+H26omrqia2aGg==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.2.4", - "tapable": "^2.3.0" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/entities": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", - "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/envinfo": { - "version": "7.10.0", - "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.10.0.tgz", - "integrity": "sha512-ZtUjZO6l5mwTHvc1L9+1q5p/R3wTopcfqMW8r5t8SJSKqeVI/LtajORwRFEKpEFuekjD0VBjwu1HMxL4UalIRw==", - "dev": true, - "bin": { - "envinfo": "dist/cli.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/environment": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/environment/-/environment-1.1.0.tgz", - "integrity": "sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/es-define-property": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", - "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-errors": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-module-lexer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-2.0.0.tgz", - "integrity": "sha512-5POEcUuZybH7IdmGsD8wlf0AI55wMecM9rVBTI/qEAy2c1kTOm3DjFYjrBdI2K3BaJjJYfYFeRtM0t9ssnRuxw==", - "dev": true - }, - "node_modules/es-object-atoms": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", - "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", - "dependencies": { - "es-errors": "^1.3.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-set-tostringtag": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", - "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", - "dependencies": { - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.6", - "has-tostringtag": "^1.0.2", - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/escalade": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", - "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "dev": true, - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true, - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, - "dependencies": { - "estraverse": "^5.2.0" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esrecurse/node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/events": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", - "dev": true, - "engines": { - "node": ">=0.8.x" - } - }, - "node_modules/execa": { - "version": "9.6.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-9.6.1.tgz", - "integrity": "sha512-9Be3ZoN4LmYR90tUoVu2te2BsbzHfhJyfEiAVfz7N5/zv+jduIfLrV2xdQXOHbaD6KgpGdO9PRPM1Y4Q9QkPkA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@sindresorhus/merge-streams": "^4.0.0", - "cross-spawn": "^7.0.6", - "figures": "^6.1.0", - "get-stream": "^9.0.0", - "human-signals": "^8.0.1", - "is-plain-obj": "^4.1.0", - "is-stream": "^4.0.1", - "npm-run-path": "^6.0.0", - "pretty-ms": "^9.2.0", - "signal-exit": "^4.1.0", - "strip-final-newline": "^4.0.0", - "yoctocolors": "^2.1.1" - }, - "engines": { - "node": "^18.19.0 || >=20.5.0" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/execa/node_modules/is-plain-obj": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", - "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/expand-template": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", - "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==", - "dev": true, - "license": "(MIT OR WTFPL)", - "optional": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/fast-content-type-parse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/fast-content-type-parse/-/fast-content-type-parse-2.0.1.tgz", - "integrity": "sha512-nGqtvLrj5w0naR6tDPfB4cUmYCqouzyQiz6C5y/LtcDllJdrcc6WaWW6iXyIIOErTa/XRybj28aasdn4LkVk6Q==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fastify" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/fastify" - } - ] - }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true - }, - "node_modules/fast-glob": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", - "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", - "license": "MIT", - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.8" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/fast-glob/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/fast-uri": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.0.tgz", - "integrity": "sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fastify" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/fastify" - } - ], - "license": "BSD-3-Clause" - }, - "node_modules/fastest-levenshtein": { - "version": "1.0.16", - "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", - "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==", - "dev": true, - "engines": { - "node": ">= 4.9.1" - } - }, - "node_modules/fastq": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", - "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", - "dependencies": { - "reusify": "^1.0.4" - } - }, - "node_modules/fd-slicer": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", - "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", - "dev": true, - "license": "MIT", - "dependencies": { - "pend": "~1.2.0" - } - }, - "node_modules/figures": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-6.1.0.tgz", - "integrity": "sha512-d+l3qxjSesT4V7v2fh+QnmFnUWv9lSpjarhShNTgBOfA0ttejbQUAlHLitbjkoRiDulW0OPoQPYIGhIC8ohejg==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-unicode-supported": "^2.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/figures/node_modules/is-unicode-supported": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-2.1.0.tgz", - "integrity": "sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/fill-range": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", - "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/flat": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", - "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", - "dev": true, - "bin": { - "flat": "cli.js" - } - }, - "node_modules/fmtr": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/fmtr/-/fmtr-1.1.4.tgz", - "integrity": "sha512-5qCv7eLlkR7LUDrcQdx0vGFo8tLgwFtO0JHkX9xfQm+DNnXpk9zQNSIldKlZ2VPZBwxTM9GB1esyeQuxhCVvmQ==", - "dependencies": { - "lodash": "^4.17.21" - } - }, - "node_modules/follow-redirects": { - "version": "1.16.0", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.16.0.tgz", - "integrity": "sha512-y5rN/uOsadFT/JfYwhxRS5R7Qce+g3zG97+JrtFZlC9klX/W5hD7iiLzScI4nZqUS7DNUdhPgw4xI8W2LuXlUw==", - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" - } - ], - "engines": { - "node": ">=4.0" - }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } - } - }, - "node_modules/foreground-child": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", - "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", - "dev": true, - "license": "ISC", - "dependencies": { - "cross-spawn": "^7.0.6", - "signal-exit": "^4.0.1" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/form-data": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz", - "integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "es-set-tostringtag": "^2.1.0", - "hasown": "^2.0.2", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/form-data-encoder": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-4.1.0.tgz", - "integrity": "sha512-G6NsmEW15s0Uw9XnCg+33H3ViYRyiM0hMrMhhqQOR8NFc5GhYrI+6I3u7OTw7b91J2g8rtvMBZJDbcGb2YUniw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 18" - } - }, - "node_modules/fs-constants": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", - "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", - "dev": true - }, - "node_modules/fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true - }, - "node_modules/fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true, - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "node_modules/get-east-asian-width": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.5.0.tgz", - "integrity": "sha512-CQ+bEO+Tva/qlmw24dCejulK5pMzVnUOFOijVogd3KQs07HnRIgp8TGipvCCRT06xeYEbpbgwaCxglFyiuIcmA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/get-intrinsic": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", - "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", - "dependencies": { - "call-bind-apply-helpers": "^1.0.2", - "es-define-property": "^1.0.1", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.1.1", - "function-bind": "^1.1.2", - "get-proto": "^1.0.1", - "gopd": "^1.2.0", - "has-symbols": "^1.1.0", - "hasown": "^2.0.2", - "math-intrinsics": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", - "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", - "dependencies": { - "dunder-proto": "^1.0.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/get-stream": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-9.0.1.tgz", - "integrity": "sha512-kVCxPF3vQM/N0B1PmoqVUqgHP+EeVjmZSQn+1oCRPxd2P21P2F19lIgbR3HBosbB1PUhOAoctJnfEn2GbN2eZA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@sec-ant/readable-stream": "^0.4.1", - "is-stream": "^4.0.1" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/github-from-package": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", - "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==", - "dev": true, - "license": "MIT", - "optional": true - }, - "node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "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/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/glob-to-regexp": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", - "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", - "dev": true - }, - "node_modules/glob/node_modules/brace-expansion": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.13.tgz", - "integrity": "sha512-9ZLprWS6EENmhEOpjCYW2c8VkmOvckIJZfkr7rBW6dObmfgJ/L1GpSYW5Hpo9lDz4D1+n0Ckz8rU7FwHDQiG/w==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/glob/node_modules/minimatch": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", - "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/globby": { - "version": "13.2.2", - "resolved": "https://registry.npmjs.org/globby/-/globby-13.2.2.tgz", - "integrity": "sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==", - "dependencies": { - "dir-glob": "^3.0.1", - "fast-glob": "^3.3.0", - "ignore": "^5.2.4", - "merge2": "^1.4.1", - "slash": "^4.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/gopd": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", - "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/got": { - "version": "14.6.6", - "resolved": "https://registry.npmjs.org/got/-/got-14.6.6.tgz", - "integrity": "sha512-QLV1qeYSo5l13mQzWgP/y0LbMr5Plr5fJilgAIwgnwseproEbtNym8xpLsDzeZ6MWXgNE6kdWGBjdh3zT/Qerg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@sindresorhus/is": "^7.0.1", - "byte-counter": "^0.1.0", - "cacheable-lookup": "^7.0.0", - "cacheable-request": "^13.0.12", - "decompress-response": "^10.0.0", - "form-data-encoder": "^4.0.2", - "http2-wrapper": "^2.2.1", - "keyv": "^5.5.3", - "lowercase-keys": "^3.0.0", - "p-cancelable": "^4.0.1", - "responselike": "^4.0.2", - "type-fest": "^4.26.1" - }, - "engines": { - "node": ">=20" - }, - "funding": { - "url": "https://github.com/sindresorhus/got?sponsor=1" - } - }, - "node_modules/graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" - }, - "node_modules/has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.1" - }, - "engines": { - "node": ">= 0.4.0" - } - }, - "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, - "engines": { - "node": ">=8" - } - }, - "node_modules/has-symbols": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", - "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-tostringtag": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", - "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", - "dependencies": { - "has-symbols": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/hasown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", - "dependencies": { - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/he": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", - "dev": true, - "bin": { - "he": "bin/he" - } - }, - "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/hpagent": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/hpagent/-/hpagent-1.2.0.tgz", - "integrity": "sha512-A91dYTeIB6NoXG+PxTQpCCDDnfHsW9kc06Lvpu1TEe9gnd6ZFeiBoRO9JvzEv6xK7EX97/dUE8g/vBMTqTS3CA==", - "dev": true, - "engines": { - "node": ">=14" - } - }, - "node_modules/html-escaper": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", - "dev": true, - "license": "MIT" - }, - "node_modules/htmlparser2": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-10.1.0.tgz", - "integrity": "sha512-VTZkM9GWRAtEpveh7MSF6SjjrpNVNNVJfFup7xTY3UpFtm67foy9HDVXneLtFVt4pMz5kZtgNcvCniNFb1hlEQ==", - "dev": true, - "funding": [ - "https://github.com/fb55/htmlparser2?sponsor=1", - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ], - "license": "MIT", - "dependencies": { - "domelementtype": "^2.3.0", - "domhandler": "^5.0.3", - "domutils": "^3.2.2", - "entities": "^7.0.1" - } - }, - "node_modules/htmlparser2/node_modules/entities": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/entities/-/entities-7.0.1.tgz", - "integrity": "sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/http-cache-semantics": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz", - "integrity": "sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==", - "dev": true, - "license": "BSD-2-Clause" - }, - "node_modules/http-proxy-agent": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", - "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", - "dev": true, - "dependencies": { - "agent-base": "^7.1.0", - "debug": "^4.3.4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/http2-wrapper": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-2.2.1.tgz", - "integrity": "sha512-V5nVw1PAOgfI3Lmeaj2Exmeg7fenjhRUgz1lPSezy1CuhPYbgQtbQj4jZfEAEMlaL+vupsvhjqCyjzob0yxsmQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "quick-lru": "^5.1.1", - "resolve-alpn": "^1.2.0" - }, - "engines": { - "node": ">=10.19.0" - } - }, - "node_modules/https-proxy-agent": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.5.tgz", - "integrity": "sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw==", - "dev": true, - "dependencies": { - "agent-base": "^7.0.2", - "debug": "4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/human-signals": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-8.0.1.tgz", - "integrity": "sha512-eKCa6bwnJhvxj14kZk5NCPc6Hb6BdsU9DZcOnmQKSnO1VKrfV0zCvtttPZUsBvjmNDn8rpcJfpwSYnHBjc95MQ==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=18.18.0" - } - }, - "node_modules/iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "dev": true, - "license": "MIT", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "BSD-3-Clause", - "optional": true - }, - "node_modules/ignore": { - "version": "5.2.4", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", - "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", - "engines": { - "node": ">= 4" - } - }, - "node_modules/immediate": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", - "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==", - "dev": true - }, - "node_modules/import-local": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", - "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", - "dev": true, - "dependencies": { - "pkg-dir": "^4.2.0", - "resolve-cwd": "^3.0.0" - }, - "bin": { - "import-local-fixture": "fixtures/cli.js" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/index-to-position": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/index-to-position/-/index-to-position-1.2.0.tgz", - "integrity": "sha512-Yg7+ztRkqslMAS2iFaU+Oa4KTSidr63OsFGlOrJoW981kIYO3CGCS3wA95P1mUi/IVSJkn0D479KTJpVpvFNuw==", + "node_modules/ajv-formats": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" + "dependencies": { + "ajv": "^8.0.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } } }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", "dev": true, "dependencies": { - "once": "^1.3.0", - "wrappy": "1" + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" } }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "node_modules/ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "dev": true, - "license": "ISC", - "optional": true - }, - "node_modules/interpret": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-2.2.0.tgz", - "integrity": "sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==", + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true, "engines": { - "node": ">= 0.10" + "node": ">=8" } }, - "node_modules/is-core-module": { - "version": "2.12.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.1.tgz", - "integrity": "sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg==", + "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, "dependencies": { - "has": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-docker": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", - "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", - "dev": true, - "license": "MIT", - "bin": { - "is-docker": "cli.js" + "color-convert": "^2.0.1" }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "node": ">=8" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "engines": { - "node": ">=0.10.0" - } + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "engines": { - "node": ">=8" - } + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "node_modules/await-lock": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/await-lock/-/await-lock-2.2.2.tgz", + "integrity": "sha512-aDczADvlvTGajTDjcjpJMqRkOF6Qdz3YbPZm/PyW6tKPkx2hlYBzxMhEywM/tU72HrVZjgl5VCdRuMlA7pZ8Gw==" + }, + "node_modules/axios": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.15.0.tgz", + "integrity": "sha512-wWyJDlAatxk30ZJer+GeCWS209sA42X+N5jU2jy6oHTp7ufw8uzUTVFBX9+wTfAlhiJXGS0Bq7X6efruWjuK9Q==", "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" + "follow-redirects": "^1.15.11", + "form-data": "^4.0.5", + "proxy-from-env": "^2.1.0" } }, - "node_modules/is-inside-container": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz", - "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==", + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "node_modules/baseline-browser-mapping": { + "version": "2.9.19", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.9.19.tgz", + "integrity": "sha512-ipDqC8FrAl/76p2SSWKSI+H9tFwm7vYqXQrItCuiVPt26Km0jS+NzSsBWAaBusvSbQcfJG+JitdMm+wZAgTYqg==", "dev": true, - "license": "MIT", - "dependencies": { - "is-docker": "^3.0.0" - }, "bin": { - "is-inside-container": "cli.js" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "baseline-browser-mapping": "dist/cli.js" } }, - "node_modules/is-interactive": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-2.0.0.tgz", - "integrity": "sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } + "node_modules/before-after-hook": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-3.0.2.tgz", + "integrity": "sha512-Nik3Sc0ncrMK4UUdXQmAnRtzmNQTAAXmXIopizwZ1W1t8QmfJj+zL4OA2I7XPTPW5z5TDqv4hRo/JzouDJnX3A==" }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "engines": { - "node": ">=0.12.0" + "node_modules/brace-expansion": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.3.tgz", + "integrity": "sha512-MCV/fYJEbqx68aE58kv2cA/kiky1G8vux3OR6/jbS+jIMe/6fJWa0DTzJU7dqijOWYwHi1t29FlfYI9uytqlpA==", + "dependencies": { + "balanced-match": "^1.0.0" } }, - "node_modules/is-path-inside": { + "node_modules/braces": { "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", - "dev": true, + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dependencies": { + "fill-range": "^7.1.1" + }, "engines": { "node": ">=8" } }, - "node_modules/is-plain-obj": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", - "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", - "dev": true, - "engines": { - "node": ">=8" - } + "node_modules/browser-stdout": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", + "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", + "dev": true }, - "node_modules/is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "node_modules/browserslist": { + "version": "4.28.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.1.tgz", + "integrity": "sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==", "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], "dependencies": { - "isobject": "^3.0.1" + "baseline-browser-mapping": "^2.9.0", + "caniuse-lite": "^1.0.30001759", + "electron-to-chromium": "^1.5.263", + "node-releases": "^2.0.27", + "update-browserslist-db": "^1.2.0" }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-stream": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-4.0.1.tgz", - "integrity": "sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" + "bin": { + "browserslist": "cli.js" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-unicode-supported": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", - "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", - "dev": true, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" } }, - "node_modules/is-wayland": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-wayland/-/is-wayland-0.1.0.tgz", - "integrity": "sha512-QkbMsWkIfkrzOPxenwye0h56iAXirZYHG9eHVPb22fO9y+wPbaX/CHacOWBa/I++4ohTcByimhM1/nyCsH8KNA==", + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true + }, + "node_modules/builtin-modules": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", + "integrity": "sha512-wxXCdllwGhI2kCC0MnvTGYTMvnVZTvqgypkiTI8Pa5tcz2i6VqsqwYGgqwXji+4RgCzms6EajE4IxiUH6HH8nQ==", "dev": true, - "license": "MIT", "engines": { - "node": ">=20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=0.10.0" } }, - "node_modules/is-wsl": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.1.tgz", - "integrity": "sha512-e6rvdUCiQCAuumZslxRJWR/Doq4VpPR82kqclvcS0efgt430SlGIk05vdCN58+VrzgtIcfNODjozVielycD4Sw==", - "dev": true, - "license": "MIT", + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", "dependencies": { - "is-inside-container": "^1.0.0" + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" }, "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">= 0.4" } }, - "node_modules/is64bit": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is64bit/-/is64bit-2.0.0.tgz", - "integrity": "sha512-jv+8jaWCl0g2lSBkNSVXdzfBA0npK1HGC2KtWM9FumFRoGS94g3NbCCLVnCYHLjp4GrW2KZeeSTMo5ddtznmGw==", + "node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", "dev": true, - "license": "MIT", - "dependencies": { - "system-architecture": "^0.1.0" - }, "engines": { - "node": ">=18" + "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "dev": true - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true - }, - "node_modules/isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/istanbul-lib-coverage": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", - "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", + "node_modules/caniuse-lite": { + "version": "1.0.30001769", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001769.tgz", + "integrity": "sha512-BCfFL1sHijQlBGWBMuJyhZUhzo7wer5sVj9hqekB/7xn0Ypy+pER/edCYQm4exbXj4WiySGp40P8UuTh6w1srg==", "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=8" - } + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ] }, - "node_modules/istanbul-lib-report": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", - "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", + "node_modules/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": "BSD-3-Clause", "dependencies": { - "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^4.0.0", + "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" }, "engines": { "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/istanbul-lib-report/node_modules/supports-color": { + "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==", "dev": true, - "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -4470,884 +1249,769 @@ "node": ">=8" } }, - "node_modules/istanbul-reports": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.2.0.tgz", - "integrity": "sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==", + "node_modules/chokidar": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", + "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", "dev": true, - "license": "BSD-3-Clause", "dependencies": { - "html-escaper": "^2.0.0", - "istanbul-lib-report": "^3.0.0" + "readdirp": "^4.0.1" }, "engines": { - "node": ">=8" + "node": ">= 14.16.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" } }, - "node_modules/istextorbinary": { - "version": "9.5.0", - "resolved": "https://registry.npmjs.org/istextorbinary/-/istextorbinary-9.5.0.tgz", - "integrity": "sha512-5mbUj3SiZXCuRf9fT3ibzbSSEWiy63gFfksmGfdOzujPjW3k+z8WvIBxcJHBoQNlaZaiyB25deviif2+osLmLw==", + "node_modules/chrome-trace-event": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", + "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", "dev": true, - "license": "Artistic-2.0", - "dependencies": { - "binaryextensions": "^6.11.0", - "editions": "^6.21.0", - "textextensions": "^6.11.0" - }, "engines": { - "node": ">=4" - }, - "funding": { - "url": "https://bevry.me/fund" + "node": ">=6.0" } }, - "node_modules/jackspeak": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-4.2.3.tgz", - "integrity": "sha512-ykkVRwrYvFm1nb2AJfKKYPr0emF6IiXDYUaFx4Zn9ZuIH7MrzEZ3sD5RlqGXNRpHtvUHJyOnCEFxOlNDtGo7wg==", + "node_modules/cli-cursor": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-5.0.0.tgz", + "integrity": "sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==", "dev": true, - "license": "BlueOak-1.0.0", + "license": "MIT", "dependencies": { - "@isaacs/cliui": "^9.0.0" + "restore-cursor": "^5.0.0" }, "engines": { - "node": "20 || >=22" + "node": ">=18" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/jackspeak/node_modules/@isaacs/cliui": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-9.0.0.tgz", - "integrity": "sha512-AokJm4tuBHillT+FpMtxQ60n8ObyXBatq7jD2/JA9dxbDDokKQm8KMht5ibGzLVU9IJDIKK4TPKgMHEYMn3lMg==", + "node_modules/cli-spinners": { + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", + "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", "dev": true, - "license": "BlueOak-1.0.0", + "license": "MIT", "engines": { - "node": ">=18" + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/jest-worker": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", - "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", "dev": true, "dependencies": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" }, "engines": { - "node": ">= 10.13.0" + "node": ">=12" } }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "node_modules/clone-deep": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", + "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", "dev": true, - "license": "MIT" + "dependencies": { + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" + }, + "engines": { + "node": ">=6" + } }, - "node_modules/js-yaml": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", - "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", + "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, "dependencies": { - "argparse": "^2.0.1" + "color-name": "~1.1.4" }, - "bin": { - "js-yaml": "bin/js-yaml.js" + "engines": { + "node": ">=7.0.0" } }, - "node_modules/json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "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 }, - "node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "node_modules/colorette": { + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", "dev": true }, - "node_modules/json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "dev": true, - "license": "MIT", - "bin": { - "json5": "lib/cli.js" + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dependencies": { + "delayed-stream": "~1.0.0" }, "engines": { - "node": ">=6" + "node": ">= 0.8" } }, - "node_modules/jsonc-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.3.1.tgz", - "integrity": "sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==", - "dev": true, - "license": "MIT" + "node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true }, - "node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true }, - "node_modules/jsonwebtoken": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.3.tgz", - "integrity": "sha512-MT/xP0CrubFRNLNKvxJ2BYfy53Zkm++5bX9dtuPbqAeQpTVe0MQTFhao8+Cp//EmJp244xt6Drw/GVEGCUj40g==", + "node_modules/copy-webpack-plugin": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-11.0.0.tgz", + "integrity": "sha512-fX2MWpamkW0hZxMEg0+mYnA40LTosOSa5TqZ9GYIBzyJa9C3QUaMPSE2xAi/buNr8u89SfD9wHSQVBzrRa/SOQ==", "dev": true, - "license": "MIT", "dependencies": { - "jws": "^4.0.1", - "lodash.includes": "^4.3.0", - "lodash.isboolean": "^3.0.3", - "lodash.isinteger": "^4.0.4", - "lodash.isnumber": "^3.0.3", - "lodash.isplainobject": "^4.0.6", - "lodash.isstring": "^4.0.1", - "lodash.once": "^4.0.0", - "ms": "^2.1.1", - "semver": "^7.5.4" + "fast-glob": "^3.2.11", + "glob-parent": "^6.0.1", + "globby": "^13.1.1", + "normalize-path": "^3.0.0", + "schema-utils": "^4.0.0", + "serialize-javascript": "^6.0.0" }, "engines": { - "node": ">=12", - "npm": ">=6" - } - }, - "node_modules/jszip": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.10.1.tgz", - "integrity": "sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==", - "dev": true, - "dependencies": { - "lie": "~3.3.0", - "pako": "~1.0.2", - "readable-stream": "~2.3.6", - "setimmediate": "^1.0.5" - } - }, - "node_modules/jwa": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.1.tgz", - "integrity": "sha512-hRF04fqJIP8Abbkq5NKGN0Bbr3JxlQ+qhZufXVr0DvujKy93ZCbXZMHDL4EOtodSbCWxOqR8MS1tXA5hwqCXDg==", - "dev": true, - "license": "MIT", - "dependencies": { - "buffer-equal-constant-time": "^1.0.1", - "ecdsa-sig-formatter": "1.0.11", - "safe-buffer": "^5.0.1" + "node": ">= 14.15.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" } }, - "node_modules/jws": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/jws/-/jws-4.0.1.tgz", - "integrity": "sha512-EKI/M/yqPncGUUh44xz0PxSidXFr/+r0pA70+gIYhjv+et7yxM+s29Y+VGDkovRofQem0fs7Uvf4+YmAdyRduA==", - "dev": true, - "license": "MIT", - "dependencies": { - "jwa": "^2.0.1", - "safe-buffer": "^5.0.1" - } + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "dev": true }, - "node_modules/keytar": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/keytar/-/keytar-7.9.0.tgz", - "integrity": "sha512-VPD8mtVtm5JNtA2AErl6Chp06JBfy7diFQ7TQQhdpWOl6MrCRB+eRbvAZUsbGQS9kiMq0coJsy0W0vHpDCkWsQ==", + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", "dev": true, - "hasInstallScript": true, "license": "MIT", - "optional": true, "dependencies": { - "node-addon-api": "^4.3.0", - "prebuild-install": "^7.0.1" + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" } }, - "node_modules/keyv": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-5.6.0.tgz", - "integrity": "sha512-CYDD3SOtsHtyXeEORYRx2qBtpDJFjRTGXUtmNEMGyzYOKj1TE3tycdlho7kA1Ufx9OYWZzg52QFBGALTirzDSw==", + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", "dev": true, "license": "MIT", "dependencies": { - "@keyv/serialize": "^1.1.1" + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, - "node_modules/kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "node_modules/decamelize": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", + "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", "dev": true, "engines": { - "node": ">=0.10.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/leven": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", - "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", - "dev": true, - "license": "MIT", + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", "engines": { - "node": ">=6" + "node": ">=0.4.0" } }, - "node_modules/lie": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", - "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", + "node_modules/diff": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-7.0.0.tgz", + "integrity": "sha512-PJWHUb1RFevKCwaFA9RlG5tCd+FO5iRh9A8HEtkmBH2Li03iJriB6m6JIN4rGz3K3JLawI7/veA1xzRKP6ISBw==", "dev": true, - "dependencies": { - "immediate": "~3.0.5" + "engines": { + "node": ">=0.3.1" } }, - "node_modules/linkify-it": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-5.0.0.tgz", - "integrity": "sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==", - "dev": true, - "license": "MIT", + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", "dependencies": { - "uc.micro": "^2.0.0" - } - }, - "node_modules/loader-runner": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.1.tgz", - "integrity": "sha512-IWqP2SCPhyVFTBtRcgMHdzlf9ul25NwaFx4wCEH/KjAXuuHY4yNjvPXsBokp8jCB936PyWRaPKUNh8NvylLp2Q==", - "dev": true, - "engines": { - "node": ">=6.11.5" + "path-type": "^4.0.0" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" + "engines": { + "node": ">=8" } }, - "node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", "dependencies": { - "p-locate": "^5.0.0" + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">= 0.4" } }, - "node_modules/lodash": { - "version": "4.18.1", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.18.1.tgz", - "integrity": "sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==", - "license": "MIT" - }, - "node_modules/lodash.includes": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", - "integrity": "sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==", - "dev": true, - "license": "MIT" - }, - "node_modules/lodash.isboolean": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", - "integrity": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==", - "dev": true, - "license": "MIT" - }, - "node_modules/lodash.isinteger": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", - "integrity": "sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==", - "dev": true, - "license": "MIT" - }, - "node_modules/lodash.isnumber": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", - "integrity": "sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==", - "dev": true, - "license": "MIT" - }, - "node_modules/lodash.isplainobject": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", - "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==", - "dev": true, - "license": "MIT" - }, - "node_modules/lodash.isstring": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", - "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==", - "dev": true, - "license": "MIT" + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true }, - "node_modules/lodash.once": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", - "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==", - "dev": true, - "license": "MIT" + "node_modules/electron-to-chromium": { + "version": "1.5.286", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.286.tgz", + "integrity": "sha512-9tfDXhJ4RKFNerfjdCcZfufu49vg620741MNs26a9+bhLThdB+plgMeou98CAaHu/WATj2iHOOHTp1hWtABj2A==", + "dev": true }, - "node_modules/lodash.truncate": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", - "integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==", - "dev": true, - "license": "MIT" + "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 }, - "node_modules/log-symbols": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", - "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "node_modules/enhanced-resolve": { + "version": "5.19.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.19.0.tgz", + "integrity": "sha512-phv3E1Xl4tQOShqSte26C7Fl84EwUdZsyOuSSk9qtAGyyQs2s3jJzComh+Abf4g187lUUAvH+H26omrqia2aGg==", "dev": true, "dependencies": { - "chalk": "^4.1.0", - "is-unicode-supported": "^0.1.0" + "graceful-fs": "^4.2.4", + "tapable": "^2.3.0" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=10.13.0" } }, - "node_modules/lowercase-keys": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-3.0.0.tgz", - "integrity": "sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==", + "node_modules/envinfo": { + "version": "7.10.0", + "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.10.0.tgz", + "integrity": "sha512-ZtUjZO6l5mwTHvc1L9+1q5p/R3wTopcfqMW8r5t8SJSKqeVI/LtajORwRFEKpEFuekjD0VBjwu1HMxL4UalIRw==", "dev": true, - "license": "MIT", - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "bin": { + "envinfo": "dist/cli.js" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "engines": { + "node": ">=4" } }, - "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==", - "dev": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", "engines": { - "node": ">=10" + "node": ">= 0.4" } }, - "node_modules/macos-version": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/macos-version/-/macos-version-6.0.0.tgz", - "integrity": "sha512-O2S8voA+pMfCHhBn/TIYDXzJ1qNHpPDU32oFxglKnVdJABiYYITt45oLkV9yhwA3E2FDwn3tQqUFrTsr1p3sBQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "semver": "^7.3.5" - }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">= 0.4" } }, - "node_modules/make-dir": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", - "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", - "dev": true, - "license": "MIT", + "node_modules/es-module-lexer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-2.0.0.tgz", + "integrity": "sha512-5POEcUuZybH7IdmGsD8wlf0AI55wMecM9rVBTI/qEAy2c1kTOm3DjFYjrBdI2K3BaJjJYfYFeRtM0t9ssnRuxw==", + "dev": true + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", "dependencies": { - "semver": "^7.5.3" + "es-errors": "^1.3.0" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">= 0.4" } }, - "node_modules/markdown-it": { - "version": "14.1.1", - "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-14.1.1.tgz", - "integrity": "sha512-BuU2qnTti9YKgK5N+IeMubp14ZUKUUw7yeJbkjtosvHiP0AZ5c8IAgEMk79D0eC8F23r4Ac/q8cAIFdm2FtyoA==", - "dev": true, - "license": "MIT", + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", "dependencies": { - "argparse": "^2.0.1", - "entities": "^4.4.0", - "linkify-it": "^5.0.0", - "mdurl": "^2.0.0", - "punycode.js": "^2.3.1", - "uc.micro": "^2.1.0" + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" }, - "bin": { - "markdown-it": "bin/markdown-it.mjs" + "engines": { + "node": ">= 0.4" } }, - "node_modules/math-intrinsics": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", - "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, "engines": { - "node": ">= 0.4" + "node": ">=6" } }, - "node_modules/mdurl": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-2.0.0.tgz", - "integrity": "sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==", + "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" - }, - "node_modules/merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true - }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", "engines": { - "node": ">= 8" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/micromatch": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", - "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, "dependencies": { - "braces": "^3.0.3", - "picomatch": "^2.3.1" + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" }, "engines": { - "node": ">=8.6" + "node": ">=8.0.0" } }, - "node_modules/mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", "dev": true, - "license": "MIT", "bin": { - "mime": "cli.js" + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" }, "engines": { "node": ">=4" } }, - "node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, "dependencies": { - "mime-db": "1.52.0" + "estraverse": "^5.2.0" }, "engines": { - "node": ">= 0.6" + "node": ">=4.0" } }, - "node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "node_modules/esrecurse/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true, - "license": "MIT", "engines": { - "node": ">=6" + "node": ">=4.0" } }, - "node_modules/mimic-function": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/mimic-function/-/mimic-function-5.0.1.tgz", - "integrity": "sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==", + "node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", "dev": true, - "license": "MIT", "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=4.0" } }, - "node_modules/mimic-response": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-4.0.0.tgz", - "integrity": "sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg==", + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", "dev": true, - "license": "MIT", "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "node": ">=0.8.x" + } + }, + "node_modules/fast-content-type-parse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fast-content-type-parse/-/fast-content-type-parse-2.0.1.tgz", + "integrity": "sha512-nGqtvLrj5w0naR6tDPfB4cUmYCqouzyQiz6C5y/LtcDllJdrcc6WaWW6iXyIIOErTa/XRybj28aasdn4LkVk6Q==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ] + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "node_modules/fast-glob": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.8" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "engines": { + "node": ">=8.6.0" } }, - "node_modules/minimatch": { - "version": "5.1.9", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.9.tgz", - "integrity": "sha512-7o1wEA2RyMP7Iu7GNba9vc0RWWGACJOCZBJX2GJWip0ikV+wcOsgVuY9uE8CPiyQhkGFSlhuSkZPavN7u1c2Fw==", + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "dependencies": { - "brace-expansion": "^2.0.1" + "is-glob": "^4.0.1" }, "engines": { - "node": ">=10" + "node": ">= 6" } }, - "node_modules/minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "node_modules/fast-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.0.tgz", + "integrity": "sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==", "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "BSD-3-Clause" }, - "node_modules/minipass": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz", - "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==", + "node_modules/fastest-levenshtein": { + "version": "1.0.16", + "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", + "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==", "dev": true, - "license": "BlueOak-1.0.0", "engines": { - "node": ">=16 || 14 >=14.17" + "node": ">= 4.9.1" } }, - "node_modules/mkdirp": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", - "dev": true, + "node_modules/fastq": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", + "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", "dependencies": { - "minimist": "^1.2.6" - }, - "bin": { - "mkdirp": "bin/cmd.js" + "reusify": "^1.0.4" } }, - "node_modules/mkdirp-classic": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", - "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", - "dev": true, - "license": "MIT", - "optional": true - }, - "node_modules/mocha": { - "version": "11.7.5", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-11.7.5.tgz", - "integrity": "sha512-mTT6RgopEYABzXWFx+GcJ+ZQ32kp4fMf0xvpZIIfSq9Z8lC/++MtcCnQ9t5FP2veYEP95FIYSvW+U9fV4xrlig==", - "dev": true, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", "dependencies": { - "browser-stdout": "^1.3.1", - "chokidar": "^4.0.1", - "debug": "^4.3.5", - "diff": "^7.0.0", - "escape-string-regexp": "^4.0.0", - "find-up": "^5.0.0", - "glob": "^10.4.5", - "he": "^1.2.0", - "is-path-inside": "^3.0.3", - "js-yaml": "^4.1.0", - "log-symbols": "^4.1.0", - "minimatch": "^9.0.5", - "ms": "^2.1.3", - "picocolors": "^1.1.1", - "serialize-javascript": "^6.0.2", - "strip-json-comments": "^3.1.1", - "supports-color": "^8.1.1", - "workerpool": "^9.2.0", - "yargs": "^17.7.2", - "yargs-parser": "^21.1.1", - "yargs-unparser": "^2.0.0" - }, - "bin": { - "_mocha": "bin/_mocha", - "mocha": "bin/mocha.js" + "to-regex-range": "^5.0.1" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": ">=8" } }, - "node_modules/mocha/node_modules/glob": { - "version": "10.5.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz", - "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==", + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", "dev": true, "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^3.1.2", - "minimatch": "^9.0.4", - "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", - "path-scurry": "^1.11.1" + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" }, - "bin": { - "glob": "dist/esm/bin.mjs" + "engines": { + "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/mocha/node_modules/jackspeak": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", - "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "node_modules/flat": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", "dev": true, + "bin": { + "flat": "cli.js" + } + }, + "node_modules/fmtr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/fmtr/-/fmtr-1.1.4.tgz", + "integrity": "sha512-5qCv7eLlkR7LUDrcQdx0vGFo8tLgwFtO0JHkX9xfQm+DNnXpk9zQNSIldKlZ2VPZBwxTM9GB1esyeQuxhCVvmQ==", "dependencies": { - "@isaacs/cliui": "^8.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "lodash": "^4.17.21" + } + }, + "node_modules/follow-redirects": { + "version": "1.16.0", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.16.0.tgz", + "integrity": "sha512-y5rN/uOsadFT/JfYwhxRS5R7Qce+g3zG97+JrtFZlC9klX/W5hD7iiLzScI4nZqUS7DNUdhPgw4xI8W2LuXlUw==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" }, - "optionalDependencies": { - "@pkgjs/parseargs": "^0.11.0" + "peerDependenciesMeta": { + "debug": { + "optional": true + } } }, - "node_modules/mocha/node_modules/minimatch": { - "version": "9.0.9", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", - "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", + "node_modules/foreground-child": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", + "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", "dev": true, + "license": "ISC", "dependencies": { - "brace-expansion": "^2.0.2" + "cross-spawn": "^7.0.6", + "signal-exit": "^4.0.1" }, "engines": { - "node": ">=16 || 14 >=14.17" + "node": ">=14" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true, - "license": "MIT" - }, - "node_modules/mute-stream": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", - "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", - "dev": true, - "license": "ISC" - }, - "node_modules/napi-build-utils": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-2.0.0.tgz", - "integrity": "sha512-GEbrYkbfF7MoNaoh2iGG84Mnf/WZfB0GdGEsM8wz7Expx/LlWf5U8t9nvJKXSp3qr5IsEbK04cBGhol/KwOsWA==", - "dev": true, - "license": "MIT", - "optional": true - }, - "node_modules/neo-async": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", - "dev": true - }, - "node_modules/node-abi": { - "version": "3.89.0", - "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.89.0.tgz", - "integrity": "sha512-6u9UwL0HlAl21+agMN3YAMXcKByMqwGx+pq+P76vii5f7hTPtKDp08/H9py6DY+cfDw7kQNTGEj/rly3IgbNQA==", - "dev": true, - "license": "MIT", - "optional": true, + "node_modules/form-data": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz", + "integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==", "dependencies": { - "semver": "^7.3.5" + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.2", + "mime-types": "^2.1.12" }, "engines": { - "node": ">=10" + "node": ">= 6" } }, - "node_modules/node-addon-api": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-4.3.0.tgz", - "integrity": "sha512-73sE9+3UaLYYFmDsFZnqCInzPyh3MqIwZO9cw58yIqAZhONrrabrYyYe3TuIqtIiOuTXVhsGau8hcrhhwSsDIQ==", - "dev": true, - "license": "MIT", - "optional": true - }, - "node_modules/node-int64": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", - "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", - "dev": true, - "license": "MIT" + "node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } }, - "node_modules/node-releases": { - "version": "2.0.27", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.27.tgz", - "integrity": "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==", + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", "dev": true }, - "node_modules/node-sarif-builder": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/node-sarif-builder/-/node-sarif-builder-3.4.0.tgz", - "integrity": "sha512-tGnJW6OKRii9u/b2WiUViTJS+h7Apxx17qsMUjsUeNDiMMX5ZFf8F8Fcz7PAQ6omvOxHZtvDTmOYKJQwmfpjeg==", + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", "dev": true, - "license": "MIT", - "dependencies": { - "@types/sarif": "^2.1.7", - "fs-extra": "^11.1.1" - }, "engines": { - "node": ">=20" + "node": "6.* || 8.* || >= 10.*" } }, - "node_modules/node-sarif-builder/node_modules/fs-extra": { - "version": "11.3.4", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.4.tgz", - "integrity": "sha512-CTXd6rk/M3/ULNQj8FBqBWHYBVYybQ3VPBw0xGKFe3tuH7ytT6ACnvzpIQ3UZtB8yvUKC2cXn1a+x+5EVQLovA==", + "node_modules/get-east-asian-width": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.5.0.tgz", + "integrity": "sha512-CQ+bEO+Tva/qlmw24dCejulK5pMzVnUOFOijVogd3KQs07HnRIgp8TGipvCCRT06xeYEbpbgwaCxglFyiuIcmA==", "dev": true, "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" }, "engines": { - "node": ">=14.14" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/normalize-package-data": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-6.0.2.tgz", - "integrity": "sha512-V6gygoYb/5EmNI+MEGrWkC+e6+Rr7mTmfHrxDbLzxQogBkgzo76rkok0Am6thgSF7Mv2nLOajAJj5vDJZEFn7g==", - "dev": true, - "license": "BSD-2-Clause", + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", "dependencies": { - "hosted-git-info": "^7.0.0", - "semver": "^7.3.5", - "validate-npm-package-license": "^3.0.4" + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" }, "engines": { - "node": "^16.14.0 || >=18.0.0" + "node": ">= 0.4" } }, - "node_modules/normalize-package-data/node_modules/hosted-git-info": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-7.0.2.tgz", - "integrity": "sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w==", + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "dev": true, - "license": "ISC", "dependencies": { - "lru-cache": "^10.0.1" + "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": "^16.14.0 || >=18.0.0" + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/normalize-package-data/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/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", "dev": true, + "dependencies": { + "is-glob": "^4.0.3" + }, "engines": { - "node": ">=0.10.0" + "node": ">=10.13.0" } }, - "node_modules/normalize-url": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-8.1.1.tgz", - "integrity": "sha512-JYc0DPlpGWB40kH5g07gGTrYuMqV653k3uBKY6uITPWds3M0ov3GaWGp9lbE3Bzngx8+XkfzgvASb9vk9JDFXQ==", + "node_modules/glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", + "dev": true + }, + "node_modules/glob/node_modules/brace-expansion": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.13.tgz", + "integrity": "sha512-9ZLprWS6EENmhEOpjCYW2c8VkmOvckIJZfkr7rBW6dObmfgJ/L1GpSYW5Hpo9lDz4D1+n0Ckz8rU7FwHDQiG/w==", "dev": true, - "license": "MIT", - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, - "node_modules/npm-run-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-6.0.0.tgz", - "integrity": "sha512-9qny7Z9DsQU8Ou39ERsPU4OZQlSTP47ShQzuKZ6PRXpYLtIFgl/DEBYEXKlvcEa+9tHVcK8CF81Y2V72qaZhWA==", + "node_modules/glob/node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", "dev": true, - "license": "MIT", "dependencies": { - "path-key": "^4.0.0", - "unicorn-magic": "^0.3.0" + "brace-expansion": "^1.1.7" }, "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": "*" } }, - "node_modules/npm-run-path/node_modules/path-key": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", - "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", - "dev": true, - "license": "MIT", + "node_modules/globby": { + "version": "13.2.2", + "resolved": "https://registry.npmjs.org/globby/-/globby-13.2.2.tgz", + "integrity": "sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==", + "dependencies": { + "dir-glob": "^3.0.1", + "fast-glob": "^3.3.0", + "ignore": "^5.2.4", + "merge2": "^1.4.1", + "slash": "^4.0.0" + }, "engines": { - "node": ">=12" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/nth-check": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", - "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "boolbase": "^1.0.0" - }, - "funding": { - "url": "https://github.com/fb55/nth-check?sponsor=1" - } - }, - "node_modules/object-inspect": { - "version": "1.13.4", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", - "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", - "dev": true, - "license": "MIT", + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", "engines": { "node": ">= 0.4" }, @@ -5355,763 +2019,747 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/once": { - "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, - "dependencies": { - "wrappy": "1" - } + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" }, - "node_modules/onetime": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-7.0.0.tgz", - "integrity": "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==", + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", "dev": true, - "license": "MIT", "dependencies": { - "mimic-function": "^5.0.0" + "function-bind": "^1.1.1" }, "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">= 0.4.0" } }, - "node_modules/open": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/open/-/open-10.2.0.tgz", - "integrity": "sha512-YgBpdJHPyQ2UE5x+hlSXcnejzAvD0b22U2OuAP+8OnlJT+PjWPxtgmGqKKc+RgTM63U9gN0YzrYc71R2WT/hTA==", + "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", - "dependencies": { - "default-browser": "^5.2.1", - "define-lazy-prop": "^3.0.0", - "is-inside-container": "^1.0.0", - "wsl-utils": "^0.1.0" - }, "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=8" } }, - "node_modules/ora": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/ora/-/ora-8.2.0.tgz", - "integrity": "sha512-weP+BZ8MVNnlCm8c0Qdc1WSWq4Qn7I+9CJGm7Qali6g44e/PUzbjNqJX5NJ9ljlNMosfJvg1fKEGILklK9cwnw==", - "dev": true, - "license": "MIT", - "dependencies": { - "chalk": "^5.3.0", - "cli-cursor": "^5.0.0", - "cli-spinners": "^2.9.2", - "is-interactive": "^2.0.0", - "is-unicode-supported": "^2.0.0", - "log-symbols": "^6.0.0", - "stdin-discarder": "^0.2.2", - "string-width": "^7.2.0", - "strip-ansi": "^7.1.0" - }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", "engines": { - "node": ">=18" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/ora/node_modules/ansi-regex": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", - "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", - "dev": true, - "license": "MIT", + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "dependencies": { + "has-symbols": "^1.0.3" + }, "engines": { - "node": ">=12" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/ora/node_modules/chalk": { - "version": "5.6.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", - "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dependencies": { + "function-bind": "^1.1.2" }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "engines": { + "node": ">= 0.4" } }, - "node_modules/ora/node_modules/emoji-regex": { - "version": "10.6.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz", - "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==", + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", "dev": true, - "license": "MIT" + "bin": { + "he": "bin/he" + } }, - "node_modules/ora/node_modules/is-unicode-supported": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-2.1.0.tgz", - "integrity": "sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==", + "node_modules/http-proxy-agent": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", + "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" + "dependencies": { + "agent-base": "^7.1.0", + "debug": "^4.3.4" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "engines": { + "node": ">= 14" } }, - "node_modules/ora/node_modules/log-symbols": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-6.0.0.tgz", - "integrity": "sha512-i24m8rpwhmPIS4zscNzK6MSEhk0DUWa/8iYQWxhffV8jkI4Phvs3F+quL5xvS0gdQR0FyTCMMH33Y78dDTzzIw==", + "node_modules/https-proxy-agent": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.5.tgz", + "integrity": "sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw==", "dev": true, - "license": "MIT", "dependencies": { - "chalk": "^5.3.0", - "is-unicode-supported": "^1.3.0" + "agent-base": "^7.0.2", + "debug": "4" }, "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">= 14" } }, - "node_modules/ora/node_modules/log-symbols/node_modules/is-unicode-supported": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-1.3.0.tgz", - "integrity": "sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==", - "dev": true, - "license": "MIT", + "node_modules/ignore": { + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", + "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">= 4" } }, - "node_modules/ora/node_modules/string-width": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", - "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", + "node_modules/immediate": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", + "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==", + "dev": true + }, + "node_modules/import-local": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", + "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", "dev": true, - "license": "MIT", "dependencies": { - "emoji-regex": "^10.3.0", - "get-east-asian-width": "^1.0.0", - "strip-ansi": "^7.1.0" + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + }, + "bin": { + "import-local-fixture": "fixtures/cli.js" }, "engines": { - "node": ">=18" + "node": ">=8" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/ora/node_modules/strip-ansi": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", - "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", "dev": true, - "license": "MIT", "dependencies": { - "ansi-regex": "^6.2.2" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" + "once": "^1.3.0", + "wrappy": "1" } }, - "node_modules/p-cancelable": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-4.0.1.tgz", - "integrity": "sha512-wBowNApzd45EIKdO1LaU+LrMBwAcjfPaYtVzV3lmfM3gf8Z4CHZsiIqlM8TZZ8okYvh5A1cP6gTfCRQtwUpaUg==", + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "node_modules/interpret": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-2.2.0.tgz", + "integrity": "sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==", "dev": true, - "license": "MIT", "engines": { - "node": ">=14.16" + "node": ">= 0.10" } }, - "node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "node_modules/is-core-module": { + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.1.tgz", + "integrity": "sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg==", "dev": true, "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" + "has": "^1.0.3" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "engines": { + "node": ">=0.10.0" } }, - "node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "dependencies": { - "p-limit": "^3.0.2" + "is-extglob": "^2.1.1" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=0.10.0" } }, - "node_modules/p-map": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-7.0.4.tgz", - "integrity": "sha512-tkAQEw8ysMzmkhgw8k+1U/iPhWNhykKnSk4Rd5zLoPJCuJaGRPo6YposrZgaxHKzDHdDWWZvE/Sk7hsL2X/CpQ==", + "node_modules/is-interactive": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-2.0.0.tgz", + "integrity": "sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==", "dev": true, "license": "MIT", "engines": { - "node": ">=18" + "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "engines": { - "node": ">=6" + "node": ">=0.12.0" } }, - "node_modules/package-json-from-dist": { - "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 + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true, + "engines": { + "node": ">=8" + } }, - "node_modules/pako": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", - "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", - "dev": true + "node_modules/is-plain-obj": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", + "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", + "dev": true, + "engines": { + "node": ">=8" + } }, - "node_modules/parse-json": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-8.3.0.tgz", - "integrity": "sha512-ybiGyvspI+fAoRQbIPRddCcSTV9/LsJbf0e/S85VLowVGzRmokfneg2kwVW/KU5rOXrPSbF1qAKPMgNTqqROQQ==", + "node_modules/is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.26.2", - "index-to-position": "^1.1.0", - "type-fest": "^4.39.1" + "isobject": "^3.0.1" }, "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=0.10.0" } }, - "node_modules/parse-ms": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-ms/-/parse-ms-4.0.0.tgz", - "integrity": "sha512-TXfryirbmq34y8QBwgqCVLi+8oA3oWx2eAnSn62ITyEhEYaWRlVZ2DvMM9eZbMs/RfxPu/PK/aBLyGj4IrqMHw==", + "node_modules/is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", "dev": true, - "license": "MIT", "engines": { - "node": ">=18" + "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/parse-semver": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/parse-semver/-/parse-semver-1.1.1.tgz", - "integrity": "sha512-Eg1OuNntBMH0ojvEKSrvDSnwLmvVuUOSdylH/pSCPNMIspLlweJyIWXCE+k/5hm3cj/EBUYwmWkjhBALNP4LXQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "semver": "^5.1.0" - } + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true }, - "node_modules/parse-semver/node_modules/semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver" + "engines": { + "node": ">=0.10.0" } }, - "node_modules/parse5": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.3.0.tgz", - "integrity": "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==", + "node_modules/jest-worker": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", + "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", "dev": true, - "license": "MIT", "dependencies": { - "entities": "^6.0.0" + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" }, - "funding": { - "url": "https://github.com/inikulin/parse5?sponsor=1" + "engines": { + "node": ">= 10.13.0" } }, - "node_modules/parse5-htmlparser2-tree-adapter": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.1.0.tgz", - "integrity": "sha512-ruw5xyKs6lrpo9x9rCZqZZnIUntICjQAd0Wsmp396Ul9lN/h+ifgVV1x1gZHi8euej6wTfpqX8j+BFQxF0NS/g==", + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/js-yaml": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", + "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", "dev": true, - "license": "MIT", "dependencies": { - "domhandler": "^5.0.3", - "parse5": "^7.0.0" + "argparse": "^2.0.1" }, - "funding": { - "url": "https://github.com/inikulin/parse5?sponsor=1" + "bin": { + "js-yaml": "bin/js-yaml.js" } }, - "node_modules/parse5-parser-stream": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/parse5-parser-stream/-/parse5-parser-stream-7.1.2.tgz", - "integrity": "sha512-JyeQc9iwFLn5TbvvqACIF/VXG6abODeB3Fwmv/TGdLk2LfbWkaySGY72at4+Ty7EkPZj854u4CrICqNk2qIbow==", - "dev": true, - "license": "MIT", + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true + }, + "node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", "dependencies": { - "parse5": "^7.0.0" + "universalify": "^2.0.0" }, - "funding": { - "url": "https://github.com/inikulin/parse5?sponsor=1" + "optionalDependencies": { + "graceful-fs": "^4.1.6" } }, - "node_modules/parse5/node_modules/entities": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", - "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", + "node_modules/jszip": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.10.1.tgz", + "integrity": "sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==", "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" + "dependencies": { + "lie": "~3.3.0", + "pako": "~1.0.2", + "readable-stream": "~2.3.6", + "setimmediate": "^1.0.5" } }, - "node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", "dev": true, "engines": { - "node": ">=8" + "node": ">=0.10.0" } }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "node_modules/lie": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", + "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", "dev": true, - "engines": { - "node": ">=0.10.0" + "dependencies": { + "immediate": "~3.0.5" } }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "node_modules/loader-runner": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.1.tgz", + "integrity": "sha512-IWqP2SCPhyVFTBtRcgMHdzlf9ul25NwaFx4wCEH/KjAXuuHY4yNjvPXsBokp8jCB936PyWRaPKUNh8NvylLp2Q==", "dev": true, "engines": { - "node": ">=8" + "node": ">=6.11.5" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" } }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true - }, - "node_modules/path-scurry": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", - "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", "dev": true, "dependencies": { - "lru-cache": "^10.2.0", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + "p-locate": "^5.0.0" }, "engines": { - "node": ">=16 || 14 >=14.18" + "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "url": "https://github.com/sponsors/sindresorhus" } }, - "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 + "node_modules/lodash": { + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.18.1.tgz", + "integrity": "sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==", + "license": "MIT" }, - "node_modules/path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "node_modules/log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + }, "engines": { - "node": ">=8" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/pend": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", - "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", - "dev": true, - "license": "MIT" + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "engines": { + "node": ">= 0.4" + } }, - "node_modules/picocolors": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", - "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", "dev": true }, - "node_modules/picomatch": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", - "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" + "node": ">= 8" } }, - "node_modules/pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "dev": true, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", "dependencies": { - "find-up": "^4.0.0" + "braces": "^3.0.3", + "picomatch": "^2.3.1" }, "engines": { - "node": ">=8" + "node": ">=8.6" } }, - "node_modules/pkg-dir/node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", "engines": { - "node": ">=8" + "node": ">= 0.6" } }, - "node_modules/pkg-dir/node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", "dependencies": { - "p-locate": "^4.1.0" + "mime-db": "1.52.0" }, "engines": { - "node": ">=8" + "node": ">= 0.6" } }, - "node_modules/pkg-dir/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "node_modules/mimic-function": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/mimic-function/-/mimic-function-5.0.1.tgz", + "integrity": "sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==", "dev": true, - "dependencies": { - "p-try": "^2.0.0" - }, + "license": "MIT", "engines": { - "node": ">=6" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/pkg-dir/node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, + "node_modules/minimatch": { + "version": "5.1.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.9.tgz", + "integrity": "sha512-7o1wEA2RyMP7Iu7GNba9vc0RWWGACJOCZBJX2GJWip0ikV+wcOsgVuY9uE8CPiyQhkGFSlhuSkZPavN7u1c2Fw==", "dependencies": { - "p-limit": "^2.2.0" + "brace-expansion": "^2.0.1" }, "engines": { - "node": ">=8" + "node": ">=10" } }, - "node_modules/playwright": { - "version": "1.59.1", - "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.59.1.tgz", - "integrity": "sha512-C8oWjPR3F81yljW9o5OxcWzfh6avkVwDD2VYdwIGqTkl+OGFISgypqzfu7dOe4QNLL2aqcWBmI3PMtLIK233lw==", + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", "dev": true, - "license": "Apache-2.0", - "dependencies": { - "playwright-core": "1.59.1" - }, - "bin": { - "playwright": "cli.js" - }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/minipass": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz", + "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==", + "dev": true, + "license": "BlueOak-1.0.0", "engines": { - "node": ">=18" - }, - "optionalDependencies": { - "fsevents": "2.3.2" + "node": ">=16 || 14 >=14.17" } }, - "node_modules/playwright-core": { - "version": "1.59.1", - "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.59.1.tgz", - "integrity": "sha512-HBV/RJg81z5BiiZ9yPzIiClYV/QMsDCKUyogwH9p3MCP6IYjUFu/MActgYAvK0oWyV9NlwM3GLBjADyWgydVyg==", + "node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", "dev": true, - "license": "Apache-2.0", - "bin": { - "playwright-core": "cli.js" + "dependencies": { + "minimist": "^1.2.6" }, - "engines": { - "node": ">=18" + "bin": { + "mkdirp": "bin/cmd.js" } }, - "node_modules/pluralize": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz", - "integrity": "sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==", + "node_modules/mocha": { + "version": "11.7.5", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-11.7.5.tgz", + "integrity": "sha512-mTT6RgopEYABzXWFx+GcJ+ZQ32kp4fMf0xvpZIIfSq9Z8lC/++MtcCnQ9t5FP2veYEP95FIYSvW+U9fV4xrlig==", "dev": true, - "license": "MIT", + "dependencies": { + "browser-stdout": "^1.3.1", + "chokidar": "^4.0.1", + "debug": "^4.3.5", + "diff": "^7.0.0", + "escape-string-regexp": "^4.0.0", + "find-up": "^5.0.0", + "glob": "^10.4.5", + "he": "^1.2.0", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", + "log-symbols": "^4.1.0", + "minimatch": "^9.0.5", + "ms": "^2.1.3", + "picocolors": "^1.1.1", + "serialize-javascript": "^6.0.2", + "strip-json-comments": "^3.1.1", + "supports-color": "^8.1.1", + "workerpool": "^9.2.0", + "yargs": "^17.7.2", + "yargs-parser": "^21.1.1", + "yargs-unparser": "^2.0.0" + }, + "bin": { + "_mocha": "bin/_mocha", + "mocha": "bin/mocha.js" + }, "engines": { - "node": ">=4" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, - "node_modules/powershell-utils": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/powershell-utils/-/powershell-utils-0.2.0.tgz", - "integrity": "sha512-ZlsFlG7MtSFCoc5xreOvBAozCJ6Pf06opgJjh9ONEv418xpZSAzNjstD36C6+JwOnfSqOW/9uDkqKjezTdxZhw==", + "node_modules/mocha/node_modules/glob": { + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz", + "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==", "dev": true, - "license": "MIT", - "engines": { - "node": ">=20" + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/prebuild-install": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.3.tgz", - "integrity": "sha512-8Mf2cbV7x1cXPUILADGI3wuhfqWvtiLA1iclTDbFRZkgRQS0NqsPZphna9V+HyTEadheuPmjaJMsbzKQFOzLug==", - "deprecated": "No longer maintained. Please contact the author of the relevant native addon; alternatives are available.", + "node_modules/mocha/node_modules/jackspeak": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", "dev": true, - "license": "MIT", - "optional": true, "dependencies": { - "detect-libc": "^2.0.0", - "expand-template": "^2.0.3", - "github-from-package": "0.0.0", - "minimist": "^1.2.3", - "mkdirp-classic": "^0.5.3", - "napi-build-utils": "^2.0.0", - "node-abi": "^3.3.0", - "pump": "^3.0.0", - "rc": "^1.2.7", - "simple-get": "^4.0.0", - "tar-fs": "^2.0.0", - "tunnel-agent": "^0.6.0" + "@isaacs/cliui": "^8.0.2" }, - "bin": { - "prebuild-install": "bin.js" + "funding": { + "url": "https://github.com/sponsors/isaacs" }, - "engines": { - "node": ">=10" + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" } }, - "node_modules/pretty-ms": { - "version": "9.3.0", - "resolved": "https://registry.npmjs.org/pretty-ms/-/pretty-ms-9.3.0.tgz", - "integrity": "sha512-gjVS5hOP+M3wMm5nmNOucbIrqudzs9v/57bWRHQWLYklXqoXKrVfYW2W9+glfGsqtPgpiz5WwyEEB+ksXIx3gQ==", + "node_modules/mocha/node_modules/minimatch": { + "version": "9.0.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", + "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", "dev": true, - "license": "MIT", "dependencies": { - "parse-ms": "^4.0.0" + "brace-expansion": "^2.0.2" }, "engines": { - "node": ">=18" + "node": ">=16 || 14 >=14.17" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", "dev": true }, - "node_modules/proxy-from-env": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-2.1.0.tgz", - "integrity": "sha512-cJ+oHTW1VAEa8cJslgmUZrc+sjRKgAKl3Zyse6+PV38hZe/V6Z14TbCuXcan9F9ghlz4QrFr2c92TNF82UkYHA==", + "node_modules/node-releases": { + "version": "2.0.27", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.27.tgz", + "integrity": "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==", + "dev": true + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, "engines": { - "node": ">=10" + "node": ">=0.10.0" } }, - "node_modules/pump": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.4.tgz", - "integrity": "sha512-VS7sjc6KR7e1ukRFhQSY5LM2uBWAUPiOPa/A3mkKmiMwSmRFUITt0xuj+/lesgnCv+dPIEYlkzrcyXgquIHMcA==", + "node_modules/once": { + "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": "MIT", - "optional": true, "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" + "wrappy": "1" } }, - "node_modules/punycode.js": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode.js/-/punycode.js-2.3.1.tgz", - "integrity": "sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==", + "node_modules/onetime": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-7.0.0.tgz", + "integrity": "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==", "dev": true, "license": "MIT", + "dependencies": { + "mimic-function": "^5.0.0" + }, "engines": { - "node": ">=6" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/qs": { - "version": "6.15.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.15.0.tgz", - "integrity": "sha512-mAZTtNCeetKMH+pSjrb76NAM8V9a05I9aBZOHztWy/UqcJdQYNsf59vrRKWnojAT9Y+GbIvoTBC++CPHqpDBhQ==", + "node_modules/ora": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/ora/-/ora-8.2.0.tgz", + "integrity": "sha512-weP+BZ8MVNnlCm8c0Qdc1WSWq4Qn7I+9CJGm7Qali6g44e/PUzbjNqJX5NJ9ljlNMosfJvg1fKEGILklK9cwnw==", "dev": true, - "license": "BSD-3-Clause", + "license": "MIT", "dependencies": { - "side-channel": "^1.1.0" + "chalk": "^5.3.0", + "cli-cursor": "^5.0.0", + "cli-spinners": "^2.9.2", + "is-interactive": "^2.0.0", + "is-unicode-supported": "^2.0.0", + "log-symbols": "^6.0.0", + "stdin-discarder": "^0.2.2", + "string-width": "^7.2.0", + "strip-ansi": "^7.1.0" }, "engines": { - "node": ">=0.6" + "node": ">=18" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/quick-lru": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", - "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", + "node_modules/ora/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", "dev": true, "license": "MIT", "engines": { - "node": ">=10" + "node": ">=12" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, - "node_modules/rc": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "node_modules/ora/node_modules/chalk": { + "version": "5.6.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", + "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", "dev": true, - "license": "(BSD-2-Clause OR MIT OR Apache-2.0)", - "optional": true, - "dependencies": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" + "license": "MIT", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" }, - "bin": { - "rc": "cli.js" + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/rc-config-loader": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/rc-config-loader/-/rc-config-loader-4.1.4.tgz", - "integrity": "sha512-3GiwEzklkbXTDp52UR5nT8iXgYAx1V9ZG/kDZT7p60u2GCv2XTwQq4NzinMoMpNtXhmt3WkhYXcj6HH8HdwCEQ==", + "node_modules/ora/node_modules/emoji-regex": { + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz", + "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==", "dev": true, - "license": "MIT", - "dependencies": { - "debug": "^4.4.3", - "js-yaml": "^4.1.1", - "json5": "^2.2.3", - "require-from-string": "^2.0.2" - } + "license": "MIT" }, - "node_modules/rc/node_modules/strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", + "node_modules/ora/node_modules/is-unicode-supported": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-2.1.0.tgz", + "integrity": "sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==", "dev": true, "license": "MIT", - "optional": true, "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/read": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/read/-/read-1.0.7.tgz", - "integrity": "sha512-rSOKNYUmaxy0om1BNjMN4ezNT6VKK+2xF4GBhc81mkH7L60i6dp8qPYrkndNLT3QPphoII3maL9PVC9XmhHwVQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "mute-stream": "~0.0.4" + "node": ">=18" }, - "engines": { - "node": ">=0.8" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/read-pkg": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-9.0.1.tgz", - "integrity": "sha512-9viLL4/n1BJUCT1NXVTdS1jtm80yDEgR5T4yCelII49Mbj0v1rZdKqj7zCiYdbB0CuCgdrvHcNogAKTFPBocFA==", + "node_modules/ora/node_modules/log-symbols": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-6.0.0.tgz", + "integrity": "sha512-i24m8rpwhmPIS4zscNzK6MSEhk0DUWa/8iYQWxhffV8jkI4Phvs3F+quL5xvS0gdQR0FyTCMMH33Y78dDTzzIw==", "dev": true, "license": "MIT", "dependencies": { - "@types/normalize-package-data": "^2.4.3", - "normalize-package-data": "^6.0.0", - "parse-json": "^8.0.0", - "type-fest": "^4.6.0", - "unicorn-magic": "^0.1.0" + "chalk": "^5.3.0", + "is-unicode-supported": "^1.3.0" }, "engines": { "node": ">=18" @@ -6120,277 +2768,228 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/read-pkg/node_modules/unicorn-magic": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.1.0.tgz", - "integrity": "sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==", + "node_modules/ora/node_modules/log-symbols/node_modules/is-unicode-supported": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-1.3.0.tgz", + "integrity": "sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==", "dev": true, "license": "MIT", "engines": { - "node": ">=18" + "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "node_modules/ora/node_modules/string-width": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", "dev": true, + "license": "MIT", "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/readdirp": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", - "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", - "dev": true, + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" + }, "engines": { - "node": ">= 14.18.0" + "node": ">=18" }, "funding": { - "type": "individual", - "url": "https://paulmillr.com/funding/" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/rechoir": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.7.1.tgz", - "integrity": "sha512-/njmZ8s1wVeR6pjTZ+0nCnv8SpZNRMT2D1RLOJQESlYFDBvwpTA4KWJpZ+sBJ4+vhjILRcK7JIFdGCdxEAAitg==", + "node_modules/ora/node_modules/strip-ansi": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", "dev": true, + "license": "MIT", "dependencies": { - "resolve": "^1.9.0" + "ansi-regex": "^6.2.2" }, "engines": { - "node": ">= 0.10" - } - }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/resolve": { - "version": "1.22.2", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz", - "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==", - "dev": true, - "dependencies": { - "is-core-module": "^2.11.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" + "node": ">=12" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, - "node_modules/resolve-alpn": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", - "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==", - "dev": true, - "license": "MIT" - }, - "node_modules/resolve-cwd": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", - "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "dev": true, "dependencies": { - "resolve-from": "^5.0.0" + "yocto-queue": "^0.1.0" }, "engines": { - "node": ">=8" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/resolve-from": { + "node_modules/p-locate": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/responselike": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-4.0.2.tgz", - "integrity": "sha512-cGk8IbWEAnaCpdAt1BHzJ3Ahz5ewDJa0KseTsE3qIRMJ3C698W8psM7byCeWVpd/Ha7FUYzuRVzXoKoM6nRUbA==", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", "dev": true, - "license": "MIT", "dependencies": { - "lowercase-keys": "^3.0.0" + "p-limit": "^3.0.2" }, "engines": { - "node": ">=20" + "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/restore-cursor": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-5.1.0.tgz", - "integrity": "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==", + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/package-json-from-dist": { + "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 + }, + "node_modules/pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", + "dev": true + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", "dev": true, - "license": "MIT", - "dependencies": { - "onetime": "^7.0.0", - "signal-exit": "^4.1.0" - }, "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=8" } }, - "node_modules/reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, "engines": { - "iojs": ">=1.0.0", "node": ">=0.10.0" } }, - "node_modules/run-applescript": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-7.1.0.tgz", - "integrity": "sha512-DPe5pVFaAsinSaV6QjQ6gdiedWDcRCbUuiQfQa2wmWV7+xC9bGulGI8+TdRmoFkAPaBXk8CrAbnlY2ISniJ47Q==", + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", "dev": true, - "license": "MIT", "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=8" } }, - "node_modules/run-jxa": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/run-jxa/-/run-jxa-3.0.0.tgz", - "integrity": "sha512-4f2CrY7H+sXkKXJn/cE6qRA3z+NMVO7zvlZ/nUV0e62yWftpiLAfw5eV9ZdomzWd2TXWwEIiGjAT57+lWIzzvA==", + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", "dev": true, - "license": "MIT", "dependencies": { - "execa": "^5.1.1", - "macos-version": "^6.0.0", - "subsume": "^4.0.0", - "type-fest": "^2.0.0" + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "node": ">=16 || 14 >=14.18" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/run-jxa/node_modules/execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "dev": true, - "license": "MIT", - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" - }, + "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 + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" + "node": ">=8" } }, - "node_modules/run-jxa/node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "dev": true, - "license": "MIT", + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true + }, + "node_modules/picomatch": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", "engines": { - "node": ">=10" + "node": ">=8.6" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/run-jxa/node_modules/human-signals": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", "dev": true, - "license": "Apache-2.0", + "dependencies": { + "find-up": "^4.0.0" + }, "engines": { - "node": ">=10.17.0" + "node": ">=8" } }, - "node_modules/run-jxa/node_modules/is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "node_modules/pkg-dir/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "dev": true, - "license": "MIT", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, "engines": { "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/run-jxa/node_modules/npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "node_modules/pkg-dir/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dev": true, - "license": "MIT", "dependencies": { - "path-key": "^3.0.0" + "p-locate": "^4.1.0" }, "engines": { "node": ">=8" } }, - "node_modules/run-jxa/node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "node_modules/pkg-dir/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dev": true, - "license": "MIT", "dependencies": { - "mimic-fn": "^2.1.0" + "p-try": "^2.0.0" }, "engines": { "node": ">=6" @@ -6399,40 +2998,36 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/run-jxa/node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/run-jxa/node_modules/strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "node_modules/pkg-dir/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "dev": true, - "license": "MIT", + "dependencies": { + "p-limit": "^2.2.0" + }, "engines": { - "node": ">=6" + "node": ">=8" } }, - "node_modules/run-jxa/node_modules/type-fest": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", - "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", - "dev": true, - "license": "(MIT OR CC0-1.0)", + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true + }, + "node_modules/proxy-from-env": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-2.1.0.tgz", + "integrity": "sha512-cJ+oHTW1VAEa8cJslgmUZrc+sjRKgAKl3Zyse6+PV38hZe/V6Z14TbCuXcan9F9ghlz4QrFr2c92TNF82UkYHA==", "engines": { - "node": ">=12.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=10" } }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", "funding": [ { "type": "github", @@ -6446,134 +3041,114 @@ "type": "consulting", "url": "https://feross.org/support" } - ], - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, - "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 - }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true, - "license": "MIT" + ] }, - "node_modules/sanitize-filename": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/sanitize-filename/-/sanitize-filename-1.6.3.tgz", - "integrity": "sha512-y/52Mcy7aw3gRm7IrcGDFx/bCk4AhRh2eI9luHOQM86nZsqwiRkkq2GekHXBBD+SmPidc8i2PqtYZl+pWJ8Oeg==", + "node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", "dev": true, "dependencies": { - "truncate-utf8-bytes": "^1.0.0" + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" } }, - "node_modules/sax": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.6.0.tgz", - "integrity": "sha512-6R3J5M4AcbtLUdZmRv2SygeVaM7IhrLXu9BmnOGmmACak8fiUtOsYNWUS4uK7upbmHIBbLBeFeI//477BKLBzA==", + "node_modules/readdirp": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", + "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", "dev": true, - "license": "BlueOak-1.0.0", "engines": { - "node": ">=11.0.0" + "node": ">= 14.18.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" } }, - "node_modules/schema-utils": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.3.tgz", - "integrity": "sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA==", + "node_modules/rechoir": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.7.1.tgz", + "integrity": "sha512-/njmZ8s1wVeR6pjTZ+0nCnv8SpZNRMT2D1RLOJQESlYFDBvwpTA4KWJpZ+sBJ4+vhjILRcK7JIFdGCdxEAAitg==", "dev": true, "dependencies": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.9.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.1.0" + "resolve": "^1.9.0" }, "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" + "node": ">= 0.10" } }, - "node_modules/secretlint": { - "version": "10.2.2", - "resolved": "https://registry.npmjs.org/secretlint/-/secretlint-10.2.2.tgz", - "integrity": "sha512-xVpkeHV/aoWe4vP4TansF622nBEImzCY73y/0042DuJ29iKIaqgoJ8fGxre3rVSHHbxar4FdJobmTnLp9AU0eg==", + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", "dev": true, - "license": "MIT", - "dependencies": { - "@secretlint/config-creator": "^10.2.2", - "@secretlint/formatter": "^10.2.2", - "@secretlint/node": "^10.2.2", - "@secretlint/profiler": "^10.2.2", - "debug": "^4.4.1", - "globby": "^14.1.0", - "read-pkg": "^9.0.1" - }, - "bin": { - "secretlint": "bin/secretlint.js" - }, "engines": { - "node": ">=20.0.0" + "node": ">=0.10.0" } }, - "node_modules/secretlint/node_modules/@sindresorhus/merge-streams": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/merge-streams/-/merge-streams-2.3.0.tgz", - "integrity": "sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg==", + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", "dev": true, - "license": "MIT", "engines": { - "node": ">=18" + "node": ">=0.10.0" + } + }, + "node_modules/resolve": { + "version": "1.22.2", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz", + "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==", + "dev": true, + "dependencies": { + "is-core-module": "^2.11.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/secretlint/node_modules/globby": { - "version": "14.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-14.1.0.tgz", - "integrity": "sha512-0Ia46fDOaT7k4og1PDW4YbodWWr3scS2vAr2lTbsplOt2WkKp0vQbkI9wKis/T5LV/dqPjO3bpS/z6GTJB82LA==", + "node_modules/resolve-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", "dev": true, - "license": "MIT", "dependencies": { - "@sindresorhus/merge-streams": "^2.1.0", - "fast-glob": "^3.3.3", - "ignore": "^7.0.3", - "path-type": "^6.0.0", - "slash": "^5.1.0", - "unicorn-magic": "^0.3.0" + "resolve-from": "^5.0.0" }, "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=8" } }, - "node_modules/secretlint/node_modules/ignore": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", - "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", + "node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", "dev": true, - "license": "MIT", "engines": { - "node": ">= 4" + "node": ">=8" } }, - "node_modules/secretlint/node_modules/path-type": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-6.0.0.tgz", - "integrity": "sha512-Vj7sf++t5pBD637NSfkxpHSMfWaeig5+DKWLhcqIYx6mWQz5hdJTGDVMQiJcw1ZYkhs7AazKDGpRVji1LJCZUQ==", + "node_modules/restore-cursor": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-5.1.0.tgz", + "integrity": "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==", "dev": true, "license": "MIT", + "dependencies": { + "onetime": "^7.0.0", + "signal-exit": "^4.1.0" + }, "engines": { "node": ">=18" }, @@ -6581,43 +3156,60 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/secretlint/node_modules/slash": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-5.1.0.tgz", - "integrity": "sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==", - "dev": true, - "license": "MIT", + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "iojs": ">=1.0.0", + "node": ">=0.10.0" } }, - "node_modules/selenium-webdriver": { - "version": "4.41.0", - "resolved": "https://registry.npmjs.org/selenium-webdriver/-/selenium-webdriver-4.41.0.tgz", - "integrity": "sha512-1XxuKVhr9az24xwixPBEDGSZP+P0z3ZOnCmr9Oiep0MlJN2Mk+flIjD3iBS9BgyjS4g14dikMqnrYUPIjhQBhA==", - "dev": true, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", "funding": [ { "type": "github", - "url": "https://github.com/sponsors/SeleniumHQ" + "url": "https://github.com/sponsors/feross" }, { - "type": "opencollective", - "url": "https://opencollective.com/selenium" + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" } ], - "license": "Apache-2.0", "dependencies": { - "@bazel/runfiles": "^6.5.0", - "jszip": "^3.10.1", - "tmp": "^0.2.5", - "ws": "^8.19.0" + "queue-microtask": "^1.2.2" + } + }, + "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 + }, + "node_modules/schema-utils": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.3.tgz", + "integrity": "sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" }, "engines": { - "node": ">= 20.0.0" + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" } }, "node_modules/semver": { @@ -6680,82 +3272,6 @@ "node": ">=8" } }, - "node_modules/side-channel": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", - "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "object-inspect": "^1.13.3", - "side-channel-list": "^1.0.0", - "side-channel-map": "^1.0.1", - "side-channel-weakmap": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel-list": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", - "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "object-inspect": "^1.13.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel-map": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", - "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.5", - "object-inspect": "^1.13.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel-weakmap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", - "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.5", - "object-inspect": "^1.13.3", - "side-channel-map": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/signal-exit": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", @@ -6768,86 +3284,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/simple-concat": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", - "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", - "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", - "optional": true - }, - "node_modules/simple-get": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz", - "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==", - "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", - "optional": true, - "dependencies": { - "decompress-response": "^6.0.0", - "once": "^1.3.1", - "simple-concat": "^1.0.0" - } - }, - "node_modules/simple-get/node_modules/decompress-response": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", - "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "mimic-response": "^3.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/simple-get/node_modules/mimic-response": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", - "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", - "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/slash": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", @@ -6859,24 +3295,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/slice-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", - "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/slice-ansi?sponsor=1" - } - }, "node_modules/source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -6896,42 +3314,6 @@ "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", - "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/spdx-exceptions": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", - "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==", - "dev": true, - "license": "CC-BY-3.0" - }, - "node_modules/spdx-expression-parse": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", - "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/spdx-license-ids": { - "version": "3.0.23", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.23.tgz", - "integrity": "sha512-CWLcCCH7VLu13TgOH+r8p1O/Znwhqv/dbb6lqWy67G+pT1kHmeD/+V36AVb/vq8QMIQwVShJ6Ssl5FPh0fuSdw==", - "dev": true, - "license": "CC0-1.0" - }, "node_modules/sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", @@ -6991,89 +3373,36 @@ }, "node_modules/strip-ansi": { "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-ansi-cjs": { - "name": "strip-ansi", - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-final-newline": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-4.0.0.tgz", - "integrity": "sha512-aulFJcD6YK8V1G7iRB5tigAP4TsHBZZrOV8pjV++zdUwmeV8uzbY7yn6h9MswN62adStNZFuCIx4haBnRuMDaw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/structured-source": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/structured-source/-/structured-source-4.0.0.tgz", - "integrity": "sha512-qGzRFNJDjFieQkl/sVOI2dUjHKRyL9dAJi2gCPGJLbJHBIkyOHxjuocpIEfbLioX+qSJpvbYdT49/YCdMznKxA==", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, - "license": "BSD-2-Clause", "dependencies": { - "boundary": "^2.0.0" + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" } }, - "node_modules/subsume": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/subsume/-/subsume-4.0.0.tgz", - "integrity": "sha512-BWnYJElmHbYZ/zKevy+TG+SsyoFCmRPDHJbR1MzLxkPOv1Jp/4hGhVUtP98s+wZBsBsHwCXvPTP0x287/WMjGg==", + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, - "license": "MIT", "dependencies": { - "escape-string-regexp": "^5.0.0", - "unique-string": "^3.0.0" + "ansi-regex": "^5.0.1" }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=8" } }, - "node_modules/subsume/node_modules/escape-string-regexp": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", - "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", "dev": true, - "license": "MIT", "engines": { - "node": ">=12" + "node": ">=8" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -7094,36 +3423,6 @@ "url": "https://github.com/chalk/supports-color?sponsor=1" } }, - "node_modules/supports-hyperlinks": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-3.2.0.tgz", - "integrity": "sha512-zFObLMyZeEwzAoKCyu1B91U79K2t7ApXuQfo8OuxwXLDgcKxuwM+YvcbIhm6QWqz7mHUH1TVytR1PwVVjEuMig==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0", - "supports-color": "^7.0.0" - }, - "engines": { - "node": ">=14.18" - }, - "funding": { - "url": "https://github.com/chalk/supports-hyperlinks?sponsor=1" - } - }, - "node_modules/supports-hyperlinks/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/supports-preserve-symlinks-flag": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", @@ -7136,36 +3435,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/system-architecture": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/system-architecture/-/system-architecture-0.1.0.tgz", - "integrity": "sha512-ulAk51I9UVUyJgxlv9M6lFot2WP3e7t8Kz9+IS6D4rVba1tR9kON+Ey69f+1R4Q8cd45Lod6a4IcJIxnzGc/zA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/table": { - "version": "6.9.0", - "resolved": "https://registry.npmjs.org/table/-/table-6.9.0.tgz", - "integrity": "sha512-9kY+CygyYM6j02t5YFHbNz2FN5QmYGv9zAjVp4lCDjlCw7amdckXlEt/bjMhUIfj4ThGRE4gCUH5+yGnNuPo5A==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "ajv": "^8.0.1", - "lodash.truncate": "^4.4.2", - "slice-ansi": "^4.0.0", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=10.0.0" - } - }, "node_modules/tapable": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.0.tgz", @@ -7179,113 +3448,6 @@ "url": "https://opencollective.com/webpack" } }, - "node_modules/tar-fs": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.4.tgz", - "integrity": "sha512-mDAjwmZdh7LTT6pNleZ05Yt65HC3E+NiQzl672vQG38jIrehtJk/J3mNwIg+vShQPcLF/LV7CMnDW6vjj6sfYQ==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "chownr": "^1.1.1", - "mkdirp-classic": "^0.5.2", - "pump": "^3.0.0", - "tar-stream": "^2.1.4" - } - }, - "node_modules/tar-stream": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", - "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "bl": "^4.0.3", - "end-of-stream": "^1.4.1", - "fs-constants": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^3.1.1" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/tar-stream/node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/targz": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/targz/-/targz-1.0.1.tgz", - "integrity": "sha512-6q4tP9U55mZnRuMTBqnqc3nwYQY3kv+QthCFZuMk+Tn1qYUnMPmL/JZ/mzgXINzFpSqfU+242IFmFU9VPvqaQw==", - "dev": true, - "dependencies": { - "tar-fs": "^1.8.1" - } - }, - "node_modules/targz/node_modules/bl": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.3.tgz", - "integrity": "sha512-pvcNpa0UU69UT341rO6AYy4FVAIkUHuZXRIWbq+zHnsVcRzDDjIAhGuuYoi0d//cwIwtt4pkpKycWEfjdV+vww==", - "dev": true, - "dependencies": { - "readable-stream": "^2.3.5", - "safe-buffer": "^5.1.1" - } - }, - "node_modules/targz/node_modules/pump": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/pump/-/pump-1.0.3.tgz", - "integrity": "sha512-8k0JupWme55+9tCVE+FS5ULT3K6AbgqrGa58lTT49RpyfwwcGedHqaC5LlQNdEAumn/wFsu6aPwkuPMioy8kqw==", - "dev": true, - "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "node_modules/targz/node_modules/tar-fs": { - "version": "1.16.6", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-1.16.6.tgz", - "integrity": "sha512-JkOgFt3FxM/2v2CNpAVHqMW2QASjc/Hxo7IGfNd3MHaDYSW/sBFiS7YVmmhmr8x6vwN1VFQDQGdT2MWpmIuVKA==", - "dev": true, - "dependencies": { - "chownr": "^1.0.1", - "mkdirp": "^0.5.1", - "pump": "^1.0.0", - "tar-stream": "^1.1.2" - } - }, - "node_modules/targz/node_modules/tar-stream": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.6.2.tgz", - "integrity": "sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A==", - "dev": true, - "dependencies": { - "bl": "^1.0.0", - "buffer-alloc": "^1.2.0", - "end-of-stream": "^1.0.0", - "fs-constants": "^1.0.0", - "readable-stream": "^2.3.0", - "to-buffer": "^1.1.1", - "xtend": "^4.0.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, "node_modules/tas-client": { "version": "0.1.73", "resolved": "https://registry.npmjs.org/tas-client/-/tas-client-0.1.73.tgz", @@ -7294,23 +3456,6 @@ "axios": "^1.6.1" } }, - "node_modules/terminal-link": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-4.0.0.tgz", - "integrity": "sha512-lk+vH+MccxNqgVqSnkMVKx4VLJfnLjDBGzH16JVZjKE2DoxP57s6/vt6JmXV5I3jBcfGrxNrYtC+mPtU7WJztA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-escapes": "^7.0.0", - "supports-hyperlinks": "^3.2.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/terser": { "version": "5.46.0", "resolved": "https://registry.npmjs.org/terser/-/terser-5.46.0.tgz", @@ -7363,143 +3508,6 @@ } } }, - "node_modules/test-exclude": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-8.0.0.tgz", - "integrity": "sha512-ZOffsNrXYggvU1mDGHk54I96r26P8SyMjO5slMKSc7+IWmtB/MQKnEC2fP51imB3/pT6YK5cT5E8f+Dd9KdyOQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "@istanbuljs/schema": "^0.1.2", - "glob": "^13.0.6", - "minimatch": "^10.2.2" - }, - "engines": { - "node": "20 || >=22" - } - }, - "node_modules/test-exclude/node_modules/balanced-match": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", - "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", - "dev": true, - "license": "MIT", - "engines": { - "node": "18 || 20 || >=22" - } - }, - "node_modules/test-exclude/node_modules/brace-expansion": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.5.tgz", - "integrity": "sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ==", - "dev": true, - "dependencies": { - "balanced-match": "^4.0.2" - }, - "engines": { - "node": "18 || 20 || >=22" - } - }, - "node_modules/test-exclude/node_modules/glob": { - "version": "13.0.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-13.0.6.tgz", - "integrity": "sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw==", - "dev": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "minimatch": "^10.2.2", - "minipass": "^7.1.3", - "path-scurry": "^2.0.2" - }, - "engines": { - "node": "18 || 20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/test-exclude/node_modules/lru-cache": { - "version": "11.2.7", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.7.tgz", - "integrity": "sha512-aY/R+aEsRelme17KGQa/1ZSIpLpNYYrhcrepKTZgE+W3WM16YMCaPwOHLHsmopZHELU0Ojin1lPVxKR0MihncA==", - "dev": true, - "license": "BlueOak-1.0.0", - "engines": { - "node": "20 || >=22" - } - }, - "node_modules/test-exclude/node_modules/minimatch": { - "version": "10.2.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.4.tgz", - "integrity": "sha512-oRjTw/97aTBN0RHbYCdtF1MQfvusSIBQM0IZEgzl6426+8jSC0nF1a/GmnVLpfB9yyr6g6FTqWqiZVbxrtaCIg==", - "dev": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "brace-expansion": "^5.0.2" - }, - "engines": { - "node": "18 || 20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/test-exclude/node_modules/path-scurry": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.2.tgz", - "integrity": "sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg==", - "dev": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "lru-cache": "^11.0.0", - "minipass": "^7.1.2" - }, - "engines": { - "node": "18 || 20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", - "dev": true, - "license": "MIT" - }, - "node_modules/textextensions": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/textextensions/-/textextensions-6.11.0.tgz", - "integrity": "sha512-tXJwSr9355kFJI3lbCkPpUH5cP8/M0GGy2xLO34aZCjMXBaK3SoPnZwr/oWmo1FdCnELcs4npdCIOFtq9W3ruQ==", - "dev": true, - "license": "Artistic-2.0", - "dependencies": { - "editions": "^6.21.0" - }, - "engines": { - "node": ">=4" - }, - "funding": { - "url": "https://bevry.me/fund" - } - }, - "node_modules/tmp": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.5.tgz", - "integrity": "sha512-voyz6MApa1rQGUxT3E+BK7/ROe8itEx7vD8/HEvt4xwXucvQ5G5oeEiHkmHZJuBO21RpOf+YYm9MOivj709jow==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14.14" - } - }, - "node_modules/to-buffer": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/to-buffer/-/to-buffer-1.1.1.tgz", - "integrity": "sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg==", - "dev": true - }, "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -7511,15 +3519,6 @@ "node": ">=8.0" } }, - "node_modules/truncate-utf8-bytes": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/truncate-utf8-bytes/-/truncate-utf8-bytes-1.0.2.tgz", - "integrity": "sha512-95Pu1QXQvruGEhv62XCMO3Mm90GscOCClvrIUwCM0PYOXK3kaF3l3sIHxx71ThJfcbM2O5Au6SO3AWCSEfW4mQ==", - "dev": true, - "dependencies": { - "utf8-byte-length": "^1.0.1" - } - }, "node_modules/ts-loader": { "version": "9.5.1", "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.5.1.tgz", @@ -7730,90 +3729,17 @@ "typescript": ">=2.1.0 || >=2.1.0-dev || >=2.2.0-dev || >=2.3.0-dev || >=2.4.0-dev || >=2.5.0-dev || >=2.6.0-dev || >=2.7.0-dev || >=2.8.0-dev || >=2.9.0-dev || >= 3.0.0-dev || >= 3.1.0-dev" } }, - "node_modules/tunnel": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/tunnel/-/tunnel-0.0.6.tgz", - "integrity": "sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.6.11 <=0.7.0 || >=0.7.3" - } - }, - "node_modules/tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", - "dev": true, - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "safe-buffer": "^5.0.1" - }, - "engines": { - "node": "*" - } - }, - "node_modules/type-fest": { - "version": "4.41.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.41.0.tgz", - "integrity": "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==", - "dev": true, - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/typed-rest-client": { - "version": "1.8.11", - "resolved": "https://registry.npmjs.org/typed-rest-client/-/typed-rest-client-1.8.11.tgz", - "integrity": "sha512-5UvfMpd1oelmUPRbbaVnq+rHP7ng2cE4qoQkQeAqxRL6PklkxsM0g32/HL0yfvruK6ojQ5x8EE+HF4YV6DtuCA==", - "dev": true, - "license": "MIT", - "dependencies": { - "qs": "^6.9.1", - "tunnel": "0.0.6", - "underscore": "^1.12.1" - } - }, "node_modules/typescript": { "version": "4.9.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", - "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", - "dev": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=4.2.0" - } - }, - "node_modules/uc.micro": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-2.1.0.tgz", - "integrity": "sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==", - "dev": true, - "license": "MIT" - }, - "node_modules/underscore": { - "version": "1.13.8", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.8.tgz", - "integrity": "sha512-DXtD3ZtEQzc7M8m4cXotyHR+FAS18C64asBYY5vqZexfYryNNnDc02W4hKg3rdQuqOYas1jkseX0+nZXjTXnvQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/undici": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/undici/-/undici-7.24.4.tgz", - "integrity": "sha512-BM/JzwwaRXxrLdElV2Uo6cTLEjhSb3WXboncJamZ15NgUURmvlXvxa6xkwIOILIjPNo9i8ku136ZvWV0Uly8+w==", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", + "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", "dev": true, - "license": "MIT", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, "engines": { - "node": ">=20.18.1" + "node": ">=4.2.0" } }, "node_modules/undici-types": { @@ -7822,35 +3748,6 @@ "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==", "dev": true }, - "node_modules/unicorn-magic": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.3.0.tgz", - "integrity": "sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/unique-string": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-3.0.0.tgz", - "integrity": "sha512-VGXBUVwxKMBUznyffQweQABPRRW1vHZAbadFZud4pLFAqRGvv/96vafgjWFqzourzr8YonlQiPgH0YCJfawoGQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "crypto-random-string": "^4.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/universal-user-agent": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-7.0.3.tgz", @@ -7864,35 +3761,6 @@ "node": ">= 10.0.0" } }, - "node_modules/unzipper": { - "version": "0.12.3", - "resolved": "https://registry.npmjs.org/unzipper/-/unzipper-0.12.3.tgz", - "integrity": "sha512-PZ8hTS+AqcGxsaQntl3IRBw65QrBI6lxzqDEL7IAo/XCEqRTKGfOX56Vea5TH9SZczRVxuzk1re04z/YjuYCJA==", - "dev": true, - "license": "MIT", - "dependencies": { - "bluebird": "~3.7.2", - "duplexer2": "~0.1.4", - "fs-extra": "^11.2.0", - "graceful-fs": "^4.2.2", - "node-int64": "^0.4.0" - } - }, - "node_modules/unzipper/node_modules/fs-extra": { - "version": "11.3.4", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.4.tgz", - "integrity": "sha512-CTXd6rk/M3/ULNQj8FBqBWHYBVYybQ3VPBw0xGKFe3tuH7ytT6ACnvzpIQ3UZtB8yvUKC2cXn1a+x+5EVQLovA==", - "dev": true, - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=14.14" - } - }, "node_modules/update-browserslist-db": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", @@ -7923,299 +3791,50 @@ "browserslist": ">= 4.21.0" } }, - "node_modules/url-join": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/url-join/-/url-join-4.0.1.tgz", - "integrity": "sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA==", - "dev": true, - "license": "MIT" - }, - "node_modules/utf8-byte-length": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/utf8-byte-length/-/utf8-byte-length-1.0.4.tgz", - "integrity": "sha512-4+wkEYLBbWxqTahEsWrhxepcoVOJ+1z5PGIjPZxRkytcdSUaNjIjBM7Xn8E+pdSuV7SzvWovBFA54FO0JSoqhA==", - "dev": true - }, "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", "dev": true }, - "node_modules/uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/v8-to-istanbul": { - "version": "9.3.0", - "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.3.0.tgz", - "integrity": "sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==", - "dev": true, - "license": "ISC", - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.12", - "@types/istanbul-lib-coverage": "^2.0.1", - "convert-source-map": "^2.0.0" - }, - "engines": { - "node": ">=10.12.0" - } - }, - "node_modules/validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "node_modules/version-range": { - "version": "4.15.0", - "resolved": "https://registry.npmjs.org/version-range/-/version-range-4.15.0.tgz", - "integrity": "sha512-Ck0EJbAGxHwprkzFO966t4/5QkRuzh+/I1RxhLgUKKwEn+Cd8NwM60mE3AqBZg5gYODoXW0EFsQvbZjRlvdqbg==", - "dev": true, - "license": "Artistic-2.0", - "engines": { - "node": ">=4" - }, - "funding": { - "url": "https://bevry.me/fund" - } - }, "node_modules/vscode-extension-telemetry-wrapper": { - "version": "0.15.0", - "resolved": "https://registry.npmjs.org/vscode-extension-telemetry-wrapper/-/vscode-extension-telemetry-wrapper-0.15.0.tgz", - "integrity": "sha512-Uioj6zqmaHBOyRsryazdvgc8mZdRRUJSCL+Z68jG9QoZ5cwHlcaodou0BwqfTjfpwA+hUSseXRrSHrzGkXpGcQ==", - "license": "MIT", - "dependencies": { - "@vscode/extension-telemetry": "^1.2.0", - "uuid": "^8.3.2" - } - }, - "node_modules/vscode-extension-tester": { - "version": "8.23.0", - "resolved": "https://registry.npmjs.org/vscode-extension-tester/-/vscode-extension-tester-8.23.0.tgz", - "integrity": "sha512-YElhRDkOjvmGFv44aCMnEnUM5RmFqWByQ8TBr7/6N9K/b5o1gu2fo9EgTef6VmrB4kyFnSrkPVAbiZBfKQA1mQ==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@redhat-developer/locators": "^1.20.0", - "@redhat-developer/page-objects": "^1.20.0", - "@types/selenium-webdriver": "^4.35.5", - "@vscode/vsce": "^3.7.1", - "c8": "^11.0.0", - "commander": "^14.0.3", - "compare-versions": "^6.1.1", - "find-up": "8.0.0", - "fs-extra": "^11.3.4", - "glob": "^13.0.6", - "got": "^14.6.6", - "hpagent": "^1.2.0", - "js-yaml": "^4.1.1", - "sanitize-filename": "^1.6.3", - "selenium-webdriver": "^4.41.0", - "targz": "^1.0.1", - "unzipper": "^0.12.3" - }, - "bin": { - "extest": "out/cli.js" - }, - "peerDependencies": { - "mocha": ">=5.2.0", - "typescript": ">=4.6.2" - } - }, - "node_modules/vscode-extension-tester/node_modules/balanced-match": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", - "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", - "dev": true, - "license": "MIT", - "engines": { - "node": "18 || 20 || >=22" - } - }, - "node_modules/vscode-extension-tester/node_modules/brace-expansion": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.5.tgz", - "integrity": "sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ==", - "dev": true, - "dependencies": { - "balanced-match": "^4.0.2" - }, - "engines": { - "node": "18 || 20 || >=22" - } - }, - "node_modules/vscode-extension-tester/node_modules/commander": { - "version": "14.0.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-14.0.3.tgz", - "integrity": "sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=20" - } - }, - "node_modules/vscode-extension-tester/node_modules/find-up": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-8.0.0.tgz", - "integrity": "sha512-JGG8pvDi2C+JxidYdIwQDyS/CgcrIdh18cvgxcBge3wSHRQOrooMD3GlFBcmMJAN9M42SAZjDp5zv1dglJjwww==", - "dev": true, - "license": "MIT", - "dependencies": { - "locate-path": "^8.0.0", - "unicorn-magic": "^0.3.0" - }, - "engines": { - "node": ">=20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/vscode-extension-tester/node_modules/fs-extra": { - "version": "11.3.4", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.4.tgz", - "integrity": "sha512-CTXd6rk/M3/ULNQj8FBqBWHYBVYybQ3VPBw0xGKFe3tuH7ytT6ACnvzpIQ3UZtB8yvUKC2cXn1a+x+5EVQLovA==", - "dev": true, - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=14.14" - } - }, - "node_modules/vscode-extension-tester/node_modules/glob": { - "version": "13.0.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-13.0.6.tgz", - "integrity": "sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw==", - "dev": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "minimatch": "^10.2.2", - "minipass": "^7.1.3", - "path-scurry": "^2.0.2" - }, - "engines": { - "node": "18 || 20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/vscode-extension-tester/node_modules/locate-path": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-8.0.0.tgz", - "integrity": "sha512-XT9ewWAC43tiAV7xDAPflMkG0qOPn2QjHqlgX8FOqmWa/rxnyYDulF9T0F7tRy1u+TVTmK/M//6VIOye+2zDXg==", - "dev": true, + "version": "0.15.2", + "resolved": "https://registry.npmjs.org/vscode-extension-telemetry-wrapper/-/vscode-extension-telemetry-wrapper-0.15.2.tgz", + "integrity": "sha512-efKkHF8c4kTKyBhBH2k0bZU4drqIic2jBYw/j1ixKOEEsa/WIiuUsdrBPD5uaRIoZ/91GzNCLiiV4ckIrf581g==", "license": "MIT", "dependencies": { - "p-locate": "^6.0.0" - }, - "engines": { - "node": ">=20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/vscode-extension-tester/node_modules/lru-cache": { - "version": "11.2.7", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.7.tgz", - "integrity": "sha512-aY/R+aEsRelme17KGQa/1ZSIpLpNYYrhcrepKTZgE+W3WM16YMCaPwOHLHsmopZHELU0Ojin1lPVxKR0MihncA==", - "dev": true, - "license": "BlueOak-1.0.0", - "engines": { - "node": "20 || >=22" - } - }, - "node_modules/vscode-extension-tester/node_modules/minimatch": { - "version": "10.2.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.4.tgz", - "integrity": "sha512-oRjTw/97aTBN0RHbYCdtF1MQfvusSIBQM0IZEgzl6426+8jSC0nF1a/GmnVLpfB9yyr6g6FTqWqiZVbxrtaCIg==", - "dev": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "brace-expansion": "^5.0.2" - }, - "engines": { - "node": "18 || 20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "@microsoft/applicationinsights-common": "^3.4.1", + "@vscode/extension-telemetry": "^1.2.0" } }, - "node_modules/vscode-extension-tester/node_modules/p-limit": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", - "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", - "dev": true, + "node_modules/vscode-extension-telemetry-wrapper/node_modules/@microsoft/applicationinsights-common": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/@microsoft/applicationinsights-common/-/applicationinsights-common-3.4.1.tgz", + "integrity": "sha512-CTbD0g/68tiv2yCItsodDQBYxyHdfQkG7VhvVU8OHenukpl/7W4wEuxZuOntqhv5m9Nx/DFncbz+T83nvYTG3g==", "license": "MIT", "dependencies": { - "yocto-queue": "^1.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "@microsoft/applicationinsights-core-js": "3.4.1", + "@microsoft/applicationinsights-shims": "3.0.1", + "@microsoft/dynamicproto-js": "^2.0.3", + "@nevware21/ts-utils": ">= 0.12.6 < 2.x" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "peerDependencies": { + "tslib": ">= 1.0.0" } }, - "node_modules/vscode-extension-tester/node_modules/p-locate": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz", - "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==", - "dev": true, + "node_modules/vscode-extension-telemetry-wrapper/node_modules/@microsoft/applicationinsights-core-js": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/@microsoft/applicationinsights-core-js/-/applicationinsights-core-js-3.4.1.tgz", + "integrity": "sha512-eXIHZ1+nvBiJgVpufBiTP801Vtr5FEwjWZioUsb44NC/z/UcsZh2MDJ1mBpjaDO73LVYUw/ZZmDCCo6Pg/61kA==", "license": "MIT", "dependencies": { - "p-limit": "^4.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/vscode-extension-tester/node_modules/path-scurry": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.2.tgz", - "integrity": "sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg==", - "dev": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "lru-cache": "^11.0.0", - "minipass": "^7.1.2" - }, - "engines": { - "node": "18 || 20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/vscode-extension-tester/node_modules/yocto-queue": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.2.2.tgz", - "integrity": "sha512-4LCcse/U2MHZ63HAJVE+v71o7yOdIe4cZ70Wpf8D/IyjDKYQLV5GD46B+hSTjJsvV5PztjvHoU580EftxjDZFQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12.20" + "@microsoft/applicationinsights-shims": "3.0.1", + "@microsoft/dynamicproto-js": "^2.0.3", + "@nevware21/ts-async": ">= 0.5.5 < 2.x", + "@nevware21/ts-utils": ">= 0.12.6 < 2.x" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "peerDependencies": { + "tslib": ">= 1.0.0" } }, "node_modules/vscode-jsonrpc": { @@ -8393,30 +4012,6 @@ "node": ">=10.13.0" } }, - "node_modules/whatwg-encoding": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-3.1.1.tgz", - "integrity": "sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==", - "deprecated": "Use @exodus/bytes instead for a more spec-conformant and faster implementation", - "dev": true, - "license": "MIT", - "dependencies": { - "iconv-lite": "0.6.3" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/whatwg-mimetype": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-4.0.0.tgz", - "integrity": "sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - } - }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", @@ -8461,100 +4056,29 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/wrap-ansi-cjs": { - "name": "wrap-ansi", - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true - }, - "node_modules/ws": { - "version": "8.19.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.19.0.tgz", - "integrity": "sha512-blAT2mjOEIi0ZzruJfIhb3nps74PRWTCz1IjglWEEpQl5XS/UNama6u2/rjFkDDouqr4L67ry+1aGIALViWjDg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/wsl-utils": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/wsl-utils/-/wsl-utils-0.1.0.tgz", - "integrity": "sha512-h3Fbisa2nKGPxCpm89Hk33lBLsnaGBvctQopaBSOW/uIs6FTe1ATyAnKFJrzVs9vpGdsTe73WF3V4lIsk4Gacw==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-wsl": "^3.1.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/xml2js": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.5.0.tgz", - "integrity": "sha512-drPFnkQJik/O+uPKpqSgr22mpuFHqKdbS835iAQrUC73L2F5WkboIRd63ai/2Yg6I1jzifPFKH2NTK+cfglkIA==", + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "dev": true, - "license": "MIT", "dependencies": { - "sax": ">=0.6.0", - "xmlbuilder": "~11.0.0" + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" }, "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/xmlbuilder": { - "version": "11.0.1", - "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", - "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", - "dev": true, - "engines": { - "node": ">=0.4" - } + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true }, "node_modules/y18n": { "version": "5.0.8", @@ -8565,13 +4089,6 @@ "node": ">=10" } }, - "node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true, - "license": "ISC" - }, "node_modules/yargs": { "version": "17.7.2", "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", @@ -8614,27 +4131,6 @@ "node": ">=10" } }, - "node_modules/yauzl": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", - "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", - "dev": true, - "license": "MIT", - "dependencies": { - "buffer-crc32": "~0.2.3", - "fd-slicer": "~1.1.0" - } - }, - "node_modules/yazl": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/yazl/-/yazl-2.5.1.tgz", - "integrity": "sha512-phENi2PLiHnHb6QBVot+dJnaAZ0xosj7p3fWl+znIjBDlnMI2PsZCJZ306BPTFOaHf5qdDEI8x5qFrSOBN5vrw==", - "dev": true, - "license": "MIT", - "dependencies": { - "buffer-crc32": "~0.2.3" - } - }, "node_modules/yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", @@ -8646,226 +4142,9 @@ "funding": { "url": "https://github.com/sponsors/sindresorhus" } - }, - "node_modules/yoctocolors": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yoctocolors/-/yoctocolors-2.1.2.tgz", - "integrity": "sha512-CzhO+pFNo8ajLM2d2IW/R93ipy99LWjtwblvC1RsoSUMZgyLbYFr221TnSNT7GjGdYui6P459mw9JH/g/zW2ug==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } } }, "dependencies": { - "@azu/format-text": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@azu/format-text/-/format-text-1.0.2.tgz", - "integrity": "sha512-Swi4N7Edy1Eqq82GxgEECXSSLyn6GOb5htRFPzBDdUkECGXtlf12ynO5oJSpWKPwCaUssOu7NfhDcCWpIC6Ywg==", - "dev": true - }, - "@azu/style-format": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@azu/style-format/-/style-format-1.0.1.tgz", - "integrity": "sha512-AHcTojlNBdD/3/KxIKlg8sxIWHfOtQszLvOpagLTO+bjC3u7SAszu1lf//u7JJC50aUSH+BVWDD/KvaA6Gfn5g==", - "dev": true, - "requires": { - "@azu/format-text": "^1.0.1" - } - }, - "@azure/abort-controller": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@azure/abort-controller/-/abort-controller-2.1.2.tgz", - "integrity": "sha512-nBrLsEWm4J2u5LpAPjxADTlq3trDgVZZXHNKabeXZtpq3d3AbN/KGO82R87rdDz5/lYB024rtEf10/q0urNgsA==", - "dev": true, - "requires": { - "tslib": "^2.6.2" - }, - "dependencies": { - "tslib": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "dev": true - } - } - }, - "@azure/core-auth": { - "version": "1.10.1", - "resolved": "https://registry.npmjs.org/@azure/core-auth/-/core-auth-1.10.1.tgz", - "integrity": "sha512-ykRMW8PjVAn+RS6ww5cmK9U2CyH9p4Q88YJwvUslfuMmN98w/2rdGRLPqJYObapBCdzBVeDgYWdJnFPFb7qzpg==", - "dev": true, - "requires": { - "@azure/abort-controller": "^2.1.2", - "@azure/core-util": "^1.13.0", - "tslib": "^2.6.2" - }, - "dependencies": { - "tslib": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "dev": true - } - } - }, - "@azure/core-client": { - "version": "1.10.1", - "resolved": "https://registry.npmjs.org/@azure/core-client/-/core-client-1.10.1.tgz", - "integrity": "sha512-Nh5PhEOeY6PrnxNPsEHRr9eimxLwgLlpmguQaHKBinFYA/RU9+kOYVOQqOrTsCL+KSxrLLl1gD8Dk5BFW/7l/w==", - "dev": true, - "requires": { - "@azure/abort-controller": "^2.1.2", - "@azure/core-auth": "^1.10.0", - "@azure/core-rest-pipeline": "^1.22.0", - "@azure/core-tracing": "^1.3.0", - "@azure/core-util": "^1.13.0", - "@azure/logger": "^1.3.0", - "tslib": "^2.6.2" - }, - "dependencies": { - "tslib": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "dev": true - } - } - }, - "@azure/core-rest-pipeline": { - "version": "1.23.0", - "resolved": "https://registry.npmjs.org/@azure/core-rest-pipeline/-/core-rest-pipeline-1.23.0.tgz", - "integrity": "sha512-Evs1INHo+jUjwHi1T6SG6Ua/LHOQBCLuKEEE6efIpt4ZOoNonaT1kP32GoOcdNDbfqsD2445CPri3MubBy5DEQ==", - "dev": true, - "requires": { - "@azure/abort-controller": "^2.1.2", - "@azure/core-auth": "^1.10.0", - "@azure/core-tracing": "^1.3.0", - "@azure/core-util": "^1.13.0", - "@azure/logger": "^1.3.0", - "@typespec/ts-http-runtime": "^0.3.4", - "tslib": "^2.6.2" - }, - "dependencies": { - "tslib": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "dev": true - } - } - }, - "@azure/core-tracing": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/@azure/core-tracing/-/core-tracing-1.3.1.tgz", - "integrity": "sha512-9MWKevR7Hz8kNzzPLfX4EAtGM2b8mr50HPDBvio96bURP/9C+HjdH3sBlLSNNrvRAr5/k/svoH457gB5IKpmwQ==", - "dev": true, - "requires": { - "tslib": "^2.6.2" - }, - "dependencies": { - "tslib": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "dev": true - } - } - }, - "@azure/core-util": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/@azure/core-util/-/core-util-1.13.1.tgz", - "integrity": "sha512-XPArKLzsvl0Hf0CaGyKHUyVgF7oDnhKoP85Xv6M4StF/1AhfORhZudHtOyf2s+FcbuQ9dPRAjB8J2KvRRMUK2A==", - "dev": true, - "requires": { - "@azure/abort-controller": "^2.1.2", - "@typespec/ts-http-runtime": "^0.3.0", - "tslib": "^2.6.2" - }, - "dependencies": { - "tslib": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "dev": true - } - } - }, - "@azure/identity": { - "version": "4.13.0", - "resolved": "https://registry.npmjs.org/@azure/identity/-/identity-4.13.0.tgz", - "integrity": "sha512-uWC0fssc+hs1TGGVkkghiaFkkS7NkTxfnCH+Hdg+yTehTpMcehpok4PgUKKdyCH+9ldu6FhiHRv84Ntqj1vVcw==", - "dev": true, - "requires": { - "@azure/abort-controller": "^2.0.0", - "@azure/core-auth": "^1.9.0", - "@azure/core-client": "^1.9.2", - "@azure/core-rest-pipeline": "^1.17.0", - "@azure/core-tracing": "^1.0.0", - "@azure/core-util": "^1.11.0", - "@azure/logger": "^1.0.0", - "@azure/msal-browser": "^4.2.0", - "@azure/msal-node": "^3.5.0", - "open": "^10.1.0", - "tslib": "^2.2.0" - }, - "dependencies": { - "tslib": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "dev": true - } - } - }, - "@azure/logger": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@azure/logger/-/logger-1.3.0.tgz", - "integrity": "sha512-fCqPIfOcLE+CGqGPd66c8bZpwAji98tZ4JI9i/mlTNTlsIWslCfpg48s/ypyLxZTump5sypjrKn2/kY7q8oAbA==", - "dev": true, - "requires": { - "@typespec/ts-http-runtime": "^0.3.0", - "tslib": "^2.6.2" - }, - "dependencies": { - "tslib": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "dev": true - } - } - }, - "@azure/msal-browser": { - "version": "4.29.1", - "resolved": "https://registry.npmjs.org/@azure/msal-browser/-/msal-browser-4.29.1.tgz", - "integrity": "sha512-1Vrt27du1cl4QHkzLc6L4aeXqliPIDIs5l/1I4hWWMXkXccY/EznJT1+pBdoVze0azTAI8sCyq5B4cBVYG1t9w==", - "dev": true, - "requires": { - "@azure/msal-common": "15.16.1" - } - }, - "@azure/msal-common": { - "version": "15.16.1", - "resolved": "https://registry.npmjs.org/@azure/msal-common/-/msal-common-15.16.1.tgz", - "integrity": "sha512-qxUG9TCl+TVSSX58onVDHDWrvT5CE0+NeeUAbkQqaESpSm79u5IePLnPWMMjCUnUR2zJd4+Bt9vioVRzLmJb2g==", - "dev": true - }, - "@azure/msal-node": { - "version": "3.8.9", - "resolved": "https://registry.npmjs.org/@azure/msal-node/-/msal-node-3.8.9.tgz", - "integrity": "sha512-jZ0pw/BbdEUWGhomCaAiVDfXRI/9K56m5hTNqB/CzcbZEYhXm5qpK1cDngN1iXfwSfmUMorOUQ2FC0dyuQ9uRg==", - "dev": true, - "requires": { - "@azure/msal-common": "15.16.1", - "jsonwebtoken": "^9.0.0", - "uuid": "^8.3.0" - } - }, "@babel/code-frame": { "version": "7.29.0", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.0.tgz", @@ -8883,18 +4162,6 @@ "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", "dev": true }, - "@bazel/runfiles": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@bazel/runfiles/-/runfiles-6.5.0.tgz", - "integrity": "sha512-RzahvqTkfpY2jsDxo8YItPX+/iZ6hbiikw1YhE0bA9EKBR5Og8Pa6FHn9PO9M0zaXRVsr0GFQLKbB/0rzy9SzA==", - "dev": true - }, - "@bcoe/v8-coverage": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-1.0.2.tgz", - "integrity": "sha512-6zABk/ECA/QYSCQ1NGiVwwbQerUCZ+TQbp64Q3AgmfNvurHH0j8TtXa1qbShXA6qqkpAj4V5W8pP6mLe1mcMqA==", - "dev": true - }, "@discoveryjs/json-ext": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", @@ -9009,12 +4276,6 @@ } } }, - "@istanbuljs/schema": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", - "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", - "dev": true - }, "@jridgewell/gen-mapping": { "version": "0.3.13", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", @@ -9057,12 +4318,6 @@ "@jridgewell/sourcemap-codec": "^1.4.14" } }, - "@keyv/serialize": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@keyv/serialize/-/serialize-1.1.1.tgz", - "integrity": "sha512-dXn3FZhPv0US+7dtJsIi2R+c7qWYiReoEh5zUntWCf4oSpMNib8FDhSoed6m3QyZdx5hK7iLFkYk3rNxwt8vTA==", - "dev": true - }, "@microsoft/1ds-core-js": { "version": "4.3.10", "resolved": "https://registry.npmjs.org/@microsoft/1ds-core-js/-/1ds-core-js-4.3.10.tgz", @@ -9153,17 +4408,17 @@ } }, "@nevware21/ts-async": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/@nevware21/ts-async/-/ts-async-0.5.4.tgz", - "integrity": "sha512-IBTyj29GwGlxfzXw2NPnzty+w0Adx61Eze1/lknH/XIVdxtF9UnOpk76tnrHXWa6j84a1RR9hsOcHQPFv9qJjA==", + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/@nevware21/ts-async/-/ts-async-0.5.5.tgz", + "integrity": "sha512-vwqaL05iJPjLeh5igPi8MeeAu10i+Aq7xko1fbo9F5Si6MnVN5505qaV7AhSdk5MCBJVT/UYMk3kgInNjDb4Ig==", "requires": { - "@nevware21/ts-utils": ">= 0.11.6 < 2.x" + "@nevware21/ts-utils": ">= 0.12.2 < 2.x" } }, "@nevware21/ts-utils": { - "version": "0.12.5", - "resolved": "https://registry.npmjs.org/@nevware21/ts-utils/-/ts-utils-0.12.5.tgz", - "integrity": "sha512-JPQZWPKQJjj7kAftdEZL0XDFfbMgXCGiUAZe0d7EhLC3QlXTlZdSckGqqRIQ2QNl0VTEZyZUvRBw6Ednw089Fw==" + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/@nevware21/ts-utils/-/ts-utils-0.13.0.tgz", + "integrity": "sha512-F3mD+DsUn9OiZmZc5tg0oKqrJCtiCstwx+wE+DNzFYh2cCRUuzTYdK9zGGP/au2BWvbOQ6Tqlbjr2+dT1P3AlQ==" }, "@nodelib/fs.scandir": { "version": "2.1.5", @@ -9266,330 +4521,68 @@ "integrity": "sha512-9Pas60Iv9ejO3WlAX3maE1+38c5nqbJXV5GrncEfkndIpZrJ/WPMRd2xYDcPPEt5yzpxcjw9fWNoPhsSGzqKqw==", "requires": { "@octokit/types": "^13.10.0" - }, - "dependencies": { - "@octokit/openapi-types": { - "version": "24.2.0", - "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-24.2.0.tgz", - "integrity": "sha512-9sIH3nSUttelJSXUrmGzl7QUBFul0/mB8HRYl3fOlgHbIWG+WnYDXU3v/2zMtAvuzZ/ed00Ei6on975FhBfzrg==" - }, - "@octokit/types": { - "version": "13.10.0", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-13.10.0.tgz", - "integrity": "sha512-ifLaO34EbbPj0Xgro4G5lP5asESjwHracYJvVaPIyXMuiuXLlhic3S47cBdTb+jfODkTE5YtGCLt3Ay3+J97sA==", - "requires": { - "@octokit/openapi-types": "^24.2.0" - } - } - } - }, - "@octokit/request": { - "version": "9.2.4", - "resolved": "https://registry.npmjs.org/@octokit/request/-/request-9.2.4.tgz", - "integrity": "sha512-q8ybdytBmxa6KogWlNa818r0k1wlqzNC+yNkcQDECHvQo8Vmstrg18JwqJHdJdUiHD2sjlwBgSm9kHkOKe2iyA==", - "requires": { - "@octokit/endpoint": "^10.1.4", - "@octokit/request-error": "^6.1.8", - "@octokit/types": "^14.0.0", - "fast-content-type-parse": "^2.0.0", - "universal-user-agent": "^7.0.2" - } - }, - "@octokit/request-error": { - "version": "6.1.8", - "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-6.1.8.tgz", - "integrity": "sha512-WEi/R0Jmq+IJKydWlKDmryPcmdYSVjL3ekaiEL1L9eo1sUnqMJ+grqmC9cjk7CA7+b2/T397tO5d8YLOH3qYpQ==", - "requires": { - "@octokit/types": "^14.0.0" - } - }, - "@octokit/rest": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-21.1.1.tgz", - "integrity": "sha512-sTQV7va0IUVZcntzy1q3QqPm/r8rWtDCqpRAmb8eXXnKkjoQEtFe3Nt5GTVsHft+R6jJoHeSiVLcgcvhtue/rg==", - "requires": { - "@octokit/core": "^6.1.4", - "@octokit/plugin-paginate-rest": "^11.4.2", - "@octokit/plugin-request-log": "^5.3.1", - "@octokit/plugin-rest-endpoint-methods": "^13.3.0" - } - }, - "@octokit/types": { - "version": "14.1.0", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-14.1.0.tgz", - "integrity": "sha512-1y6DgTy8Jomcpu33N+p5w58l6xyt55Ar2I91RPiIA0xCJBXyUAhXCcmZaDWSANiha7R9a6qJJ2CRomGPZ6f46g==", - "requires": { - "@octokit/openapi-types": "^25.1.0" - } - }, - "@pkgjs/parseargs": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", - "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", - "dev": true, - "optional": true - }, - "@playwright/test": { - "version": "1.59.1", - "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.59.1.tgz", - "integrity": "sha512-PG6q63nQg5c9rIi4/Z5lR5IVF7yU5MqmKaPOe0HSc0O2cX1fPi96sUQu5j7eo4gKCkB2AnNGoWt7y4/Xx3Kcqg==", - "dev": true, - "requires": { - "playwright": "1.59.1" - } - }, - "@redhat-developer/locators": { - "version": "1.20.0", - "resolved": "https://registry.npmjs.org/@redhat-developer/locators/-/locators-1.20.0.tgz", - "integrity": "sha512-SvS9lABIHDpTU0w7jTN3qsMxDSceAbbc3j0xba9Cd8xrDEMWpysnvt3WY4vtYalikMhXtkcSAf3L3adYTS7iqg==", - "dev": true, - "requires": {} - }, - "@redhat-developer/page-objects": { - "version": "1.20.0", - "resolved": "https://registry.npmjs.org/@redhat-developer/page-objects/-/page-objects-1.20.0.tgz", - "integrity": "sha512-akY6gXRbUmlf2Cayp1A/TwoT0/eyK+/LReSBo7Nmfotk7QfR262k7ZilAmL3Vf/jmX3Gg0D8UrDZRFk8RTxS2Q==", - "dev": true, - "requires": { - "clipboardy": "^5.3.1", - "clone-deep": "^4.0.1", - "compare-versions": "^6.1.1", - "fs-extra": "^11.3.4", - "type-fest": "^4.41.0" - }, - "dependencies": { - "fs-extra": { - "version": "11.3.4", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.4.tgz", - "integrity": "sha512-CTXd6rk/M3/ULNQj8FBqBWHYBVYybQ3VPBw0xGKFe3tuH7ytT6ACnvzpIQ3UZtB8yvUKC2cXn1a+x+5EVQLovA==", - "dev": true, - "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - } - } - } - }, - "@sec-ant/readable-stream": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/@sec-ant/readable-stream/-/readable-stream-0.4.1.tgz", - "integrity": "sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg==", - "dev": true - }, - "@secretlint/config-creator": { - "version": "10.2.2", - "resolved": "https://registry.npmjs.org/@secretlint/config-creator/-/config-creator-10.2.2.tgz", - "integrity": "sha512-BynOBe7Hn3LJjb3CqCHZjeNB09s/vgf0baBaHVw67w7gHF0d25c3ZsZ5+vv8TgwSchRdUCRrbbcq5i2B1fJ2QQ==", - "dev": true, - "requires": { - "@secretlint/types": "^10.2.2" - } - }, - "@secretlint/config-loader": { - "version": "10.2.2", - "resolved": "https://registry.npmjs.org/@secretlint/config-loader/-/config-loader-10.2.2.tgz", - "integrity": "sha512-ndjjQNgLg4DIcMJp4iaRD6xb9ijWQZVbd9694Ol2IszBIbGPPkwZHzJYKICbTBmh6AH/pLr0CiCaWdGJU7RbpQ==", - "dev": true, - "requires": { - "@secretlint/profiler": "^10.2.2", - "@secretlint/resolver": "^10.2.2", - "@secretlint/types": "^10.2.2", - "ajv": "^8.17.1", - "debug": "^4.4.1", - "rc-config-loader": "^4.1.3" - } - }, - "@secretlint/core": { - "version": "10.2.2", - "resolved": "https://registry.npmjs.org/@secretlint/core/-/core-10.2.2.tgz", - "integrity": "sha512-6rdwBwLP9+TO3rRjMVW1tX+lQeo5gBbxl1I5F8nh8bgGtKwdlCMhMKsBWzWg1ostxx/tIG7OjZI0/BxsP8bUgw==", - "dev": true, - "requires": { - "@secretlint/profiler": "^10.2.2", - "@secretlint/types": "^10.2.2", - "debug": "^4.4.1", - "structured-source": "^4.0.0" - } - }, - "@secretlint/formatter": { - "version": "10.2.2", - "resolved": "https://registry.npmjs.org/@secretlint/formatter/-/formatter-10.2.2.tgz", - "integrity": "sha512-10f/eKV+8YdGKNQmoDUD1QnYL7TzhI2kzyx95vsJKbEa8akzLAR5ZrWIZ3LbcMmBLzxlSQMMccRmi05yDQ5YDA==", - "dev": true, - "requires": { - "@secretlint/resolver": "^10.2.2", - "@secretlint/types": "^10.2.2", - "@textlint/linter-formatter": "^15.2.0", - "@textlint/module-interop": "^15.2.0", - "@textlint/types": "^15.2.0", - "chalk": "^5.4.1", - "debug": "^4.4.1", - "pluralize": "^8.0.0", - "strip-ansi": "^7.1.0", - "table": "^6.9.0", - "terminal-link": "^4.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", - "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", - "dev": true - }, - "chalk": { - "version": "5.6.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", - "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", - "dev": true + }, + "dependencies": { + "@octokit/openapi-types": { + "version": "24.2.0", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-24.2.0.tgz", + "integrity": "sha512-9sIH3nSUttelJSXUrmGzl7QUBFul0/mB8HRYl3fOlgHbIWG+WnYDXU3v/2zMtAvuzZ/ed00Ei6on975FhBfzrg==" }, - "strip-ansi": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", - "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", - "dev": true, + "@octokit/types": { + "version": "13.10.0", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-13.10.0.tgz", + "integrity": "sha512-ifLaO34EbbPj0Xgro4G5lP5asESjwHracYJvVaPIyXMuiuXLlhic3S47cBdTb+jfODkTE5YtGCLt3Ay3+J97sA==", "requires": { - "ansi-regex": "^6.2.2" + "@octokit/openapi-types": "^24.2.0" } } } }, - "@secretlint/node": { - "version": "10.2.2", - "resolved": "https://registry.npmjs.org/@secretlint/node/-/node-10.2.2.tgz", - "integrity": "sha512-eZGJQgcg/3WRBwX1bRnss7RmHHK/YlP/l7zOQsrjexYt6l+JJa5YhUmHbuGXS94yW0++3YkEJp0kQGYhiw1DMQ==", - "dev": true, - "requires": { - "@secretlint/config-loader": "^10.2.2", - "@secretlint/core": "^10.2.2", - "@secretlint/formatter": "^10.2.2", - "@secretlint/profiler": "^10.2.2", - "@secretlint/source-creator": "^10.2.2", - "@secretlint/types": "^10.2.2", - "debug": "^4.4.1", - "p-map": "^7.0.3" - } - }, - "@secretlint/profiler": { - "version": "10.2.2", - "resolved": "https://registry.npmjs.org/@secretlint/profiler/-/profiler-10.2.2.tgz", - "integrity": "sha512-qm9rWfkh/o8OvzMIfY8a5bCmgIniSpltbVlUVl983zDG1bUuQNd1/5lUEeWx5o/WJ99bXxS7yNI4/KIXfHexig==", - "dev": true - }, - "@secretlint/resolver": { - "version": "10.2.2", - "resolved": "https://registry.npmjs.org/@secretlint/resolver/-/resolver-10.2.2.tgz", - "integrity": "sha512-3md0cp12e+Ae5V+crPQYGd6aaO7ahw95s28OlULGyclyyUtf861UoRGS2prnUrKh7MZb23kdDOyGCYb9br5e4w==", - "dev": true - }, - "@secretlint/secretlint-formatter-sarif": { - "version": "10.2.2", - "resolved": "https://registry.npmjs.org/@secretlint/secretlint-formatter-sarif/-/secretlint-formatter-sarif-10.2.2.tgz", - "integrity": "sha512-ojiF9TGRKJJw308DnYBucHxkpNovDNu1XvPh7IfUp0A12gzTtxuWDqdpuVezL7/IP8Ua7mp5/VkDMN9OLp1doQ==", - "dev": true, + "@octokit/request": { + "version": "9.2.4", + "resolved": "https://registry.npmjs.org/@octokit/request/-/request-9.2.4.tgz", + "integrity": "sha512-q8ybdytBmxa6KogWlNa818r0k1wlqzNC+yNkcQDECHvQo8Vmstrg18JwqJHdJdUiHD2sjlwBgSm9kHkOKe2iyA==", "requires": { - "node-sarif-builder": "^3.2.0" + "@octokit/endpoint": "^10.1.4", + "@octokit/request-error": "^6.1.8", + "@octokit/types": "^14.0.0", + "fast-content-type-parse": "^2.0.0", + "universal-user-agent": "^7.0.2" } }, - "@secretlint/secretlint-rule-no-dotenv": { - "version": "10.2.2", - "resolved": "https://registry.npmjs.org/@secretlint/secretlint-rule-no-dotenv/-/secretlint-rule-no-dotenv-10.2.2.tgz", - "integrity": "sha512-KJRbIShA9DVc5Va3yArtJ6QDzGjg3PRa1uYp9As4RsyKtKSSZjI64jVca57FZ8gbuk4em0/0Jq+uy6485wxIdg==", - "dev": true, + "@octokit/request-error": { + "version": "6.1.8", + "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-6.1.8.tgz", + "integrity": "sha512-WEi/R0Jmq+IJKydWlKDmryPcmdYSVjL3ekaiEL1L9eo1sUnqMJ+grqmC9cjk7CA7+b2/T397tO5d8YLOH3qYpQ==", "requires": { - "@secretlint/types": "^10.2.2" + "@octokit/types": "^14.0.0" } }, - "@secretlint/secretlint-rule-preset-recommend": { - "version": "10.2.2", - "resolved": "https://registry.npmjs.org/@secretlint/secretlint-rule-preset-recommend/-/secretlint-rule-preset-recommend-10.2.2.tgz", - "integrity": "sha512-K3jPqjva8bQndDKJqctnGfwuAxU2n9XNCPtbXVI5JvC7FnQiNg/yWlQPbMUlBXtBoBGFYp08A94m6fvtc9v+zA==", - "dev": true - }, - "@secretlint/source-creator": { - "version": "10.2.2", - "resolved": "https://registry.npmjs.org/@secretlint/source-creator/-/source-creator-10.2.2.tgz", - "integrity": "sha512-h6I87xJfwfUTgQ7irWq7UTdq/Bm1RuQ/fYhA3dtTIAop5BwSFmZyrchph4WcoEvbN460BWKmk4RYSvPElIIvxw==", - "dev": true, + "@octokit/rest": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-21.1.1.tgz", + "integrity": "sha512-sTQV7va0IUVZcntzy1q3QqPm/r8rWtDCqpRAmb8eXXnKkjoQEtFe3Nt5GTVsHft+R6jJoHeSiVLcgcvhtue/rg==", "requires": { - "@secretlint/types": "^10.2.2", - "istextorbinary": "^9.5.0" + "@octokit/core": "^6.1.4", + "@octokit/plugin-paginate-rest": "^11.4.2", + "@octokit/plugin-request-log": "^5.3.1", + "@octokit/plugin-rest-endpoint-methods": "^13.3.0" } }, - "@secretlint/types": { - "version": "10.2.2", - "resolved": "https://registry.npmjs.org/@secretlint/types/-/types-10.2.2.tgz", - "integrity": "sha512-Nqc90v4lWCXyakD6xNyNACBJNJ0tNCwj2WNk/7ivyacYHxiITVgmLUFXTBOeCdy79iz6HtN9Y31uw/jbLrdOAg==", - "dev": true - }, - "@sindresorhus/is": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-7.2.0.tgz", - "integrity": "sha512-P1Cz1dWaFfR4IR+U13mqqiGsLFf1KbayybWwdd2vfctdV6hDpUkgCY0nKOLLTMSoRd/jJNjtbqzf13K8DCCXQw==", - "dev": true - }, - "@sindresorhus/merge-streams": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/merge-streams/-/merge-streams-4.0.0.tgz", - "integrity": "sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ==", - "dev": true - }, - "@textlint/ast-node-types": { - "version": "15.5.2", - "resolved": "https://registry.npmjs.org/@textlint/ast-node-types/-/ast-node-types-15.5.2.tgz", - "integrity": "sha512-fCaOxoup5LIyBEo7R1oYWE7V4bSX0KQeHh66twon9e9usaLE3ijgF8QjYsR6joCssdeCHVd0wHm7ppsEyTr6vg==", - "dev": true - }, - "@textlint/linter-formatter": { - "version": "15.5.2", - "resolved": "https://registry.npmjs.org/@textlint/linter-formatter/-/linter-formatter-15.5.2.tgz", - "integrity": "sha512-jAw7jWM8+wU9cG6Uu31jGyD1B+PAVePCvnPKC/oov+2iBPKk3ao30zc/Itmi7FvXo4oPaL9PmzPPQhyniPVgVg==", - "dev": true, + "@octokit/types": { + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-14.1.0.tgz", + "integrity": "sha512-1y6DgTy8Jomcpu33N+p5w58l6xyt55Ar2I91RPiIA0xCJBXyUAhXCcmZaDWSANiha7R9a6qJJ2CRomGPZ6f46g==", "requires": { - "@azu/format-text": "^1.0.2", - "@azu/style-format": "^1.0.1", - "@textlint/module-interop": "15.5.2", - "@textlint/resolver": "15.5.2", - "@textlint/types": "15.5.2", - "chalk": "^4.1.2", - "debug": "^4.4.3", - "js-yaml": "^4.1.1", - "lodash": "^4.17.23", - "pluralize": "^2.0.0", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1", - "table": "^6.9.0", - "text-table": "^0.2.0" - }, - "dependencies": { - "pluralize": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-2.0.0.tgz", - "integrity": "sha512-TqNZzQCD4S42De9IfnnBvILN7HAW7riLqsCyp8lgjXeysyPlX5HhqKAcJHHHb9XskE4/a+7VGC9zzx8Ls0jOAw==", - "dev": true - } + "@octokit/openapi-types": "^25.1.0" } }, - "@textlint/module-interop": { - "version": "15.5.2", - "resolved": "https://registry.npmjs.org/@textlint/module-interop/-/module-interop-15.5.2.tgz", - "integrity": "sha512-mg6rMQ3+YjwiXCYoQXbyVfDucpTa1q5mhspd/9qHBxUq4uY6W8GU42rmT3GW0V1yOfQ9z/iRrgPtkp71s8JzXg==", - "dev": true - }, - "@textlint/resolver": { - "version": "15.5.2", - "resolved": "https://registry.npmjs.org/@textlint/resolver/-/resolver-15.5.2.tgz", - "integrity": "sha512-YEITdjRiJaQrGLUWxWXl4TEg+d2C7+TNNjbGPHPH7V7CCnXm+S9GTjGAL7Q2WSGJyFEKt88Jvx6XdJffRv4HEA==", - "dev": true - }, - "@textlint/types": { - "version": "15.5.2", - "resolved": "https://registry.npmjs.org/@textlint/types/-/types-15.5.2.tgz", - "integrity": "sha512-sJOrlVLLXp4/EZtiWKWq9y2fWyZlI8GP+24rnU5avtPWBIMm/1w97yzKrAqYF8czx2MqR391z5akhnfhj2f/AQ==", + "@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", "dev": true, - "requires": { - "@textlint/ast-node-types": "15.5.2" - } + "optional": true }, "@types/eslint": { "version": "9.6.1", @@ -9636,18 +4629,6 @@ "@types/node": "*" } }, - "@types/http-cache-semantics": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz", - "integrity": "sha512-L3LgimLHXtGkWikKnsPg0/VFx9OGZaC+eN1u4r+OB1XRqH3meBIAVC2zr1WdMH+RHmnRkqliQAOHNJ/E0j/e0Q==", - "dev": true - }, - "@types/istanbul-lib-coverage": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", - "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", - "dev": true - }, "@types/json-schema": { "version": "7.0.15", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", @@ -9681,28 +4662,6 @@ "undici-types": "~6.19.2" } }, - "@types/normalize-package-data": { - "version": "2.4.4", - "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz", - "integrity": "sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==", - "dev": true - }, - "@types/sarif": { - "version": "2.1.7", - "resolved": "https://registry.npmjs.org/@types/sarif/-/sarif-2.1.7.tgz", - "integrity": "sha512-kRz0VEkJqWLf1LLVN4pT1cg1Z9wAuvI6L97V3m2f5B76Tg8d413ddvLBPTEHAZJlnn4XSvu0FkZtViCQGVyrXQ==", - "dev": true - }, - "@types/selenium-webdriver": { - "version": "4.35.5", - "resolved": "https://registry.npmjs.org/@types/selenium-webdriver/-/selenium-webdriver-4.35.5.tgz", - "integrity": "sha512-wCQCjWmahRkUAO7S703UAvBFkxz4o/rjX4T2AOSWKXSi0sTQPsrXxR0GjtFUT0ompedLkYH4R5HO5Urz0hyeog==", - "dev": true, - "requires": { - "@types/node": "*", - "@types/ws": "*" - } - }, "@types/semver": { "version": "7.5.0", "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.0.tgz", @@ -9715,34 +4674,6 @@ "integrity": "sha512-0LBD8TEiNbet3NvWsmn59zLzOFu/txSlGxnv5yAFHCrhG9WvAnR3IvfHzMOs2aeWqgvNjq9pO99IUw8d3n+unw==", "dev": true }, - "@types/ws": { - "version": "8.18.1", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.18.1.tgz", - "integrity": "sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@typespec/ts-http-runtime": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/@typespec/ts-http-runtime/-/ts-http-runtime-0.3.4.tgz", - "integrity": "sha512-CI0NhTrz4EBaa0U+HaaUZrJhPoso8sG7ZFya8uQoBA57fjzrjRSv87ekCjLZOFExN+gXE/z0xuN2QfH4H2HrLQ==", - "dev": true, - "requires": { - "http-proxy-agent": "^7.0.0", - "https-proxy-agent": "^7.0.0", - "tslib": "^2.6.2" - }, - "dependencies": { - "tslib": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "dev": true - } - } - }, "@vscode/extension-telemetry": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/@vscode/extension-telemetry/-/extension-telemetry-1.2.0.tgz", @@ -9766,207 +4697,6 @@ "semver": "^7.6.2" } }, - "@vscode/vsce": { - "version": "3.7.1", - "resolved": "https://registry.npmjs.org/@vscode/vsce/-/vsce-3.7.1.tgz", - "integrity": "sha512-OTm2XdMt2YkpSn2Nx7z2EJtSuhRHsTPYsSK59hr3v8jRArK+2UEoju4Jumn1CmpgoBLGI6ReHLJ/czYltNUW3g==", - "dev": true, - "requires": { - "@azure/identity": "^4.1.0", - "@secretlint/node": "^10.1.2", - "@secretlint/secretlint-formatter-sarif": "^10.1.2", - "@secretlint/secretlint-rule-no-dotenv": "^10.1.2", - "@secretlint/secretlint-rule-preset-recommend": "^10.1.2", - "@vscode/vsce-sign": "^2.0.0", - "azure-devops-node-api": "^12.5.0", - "chalk": "^4.1.2", - "cheerio": "^1.0.0-rc.9", - "cockatiel": "^3.1.2", - "commander": "^12.1.0", - "form-data": "^4.0.0", - "glob": "^11.0.0", - "hosted-git-info": "^4.0.2", - "jsonc-parser": "^3.2.0", - "keytar": "^7.7.0", - "leven": "^3.1.0", - "markdown-it": "^14.1.0", - "mime": "^1.3.4", - "minimatch": "^3.0.3", - "parse-semver": "^1.1.1", - "read": "^1.0.7", - "secretlint": "^10.1.2", - "semver": "^7.5.2", - "tmp": "^0.2.3", - "typed-rest-client": "^1.8.4", - "url-join": "^4.0.1", - "xml2js": "^0.5.0", - "yauzl": "^2.3.1", - "yazl": "^2.2.2" - }, - "dependencies": { - "brace-expansion": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.13.tgz", - "integrity": "sha512-9ZLprWS6EENmhEOpjCYW2c8VkmOvckIJZfkr7rBW6dObmfgJ/L1GpSYW5Hpo9lDz4D1+n0Ckz8rU7FwHDQiG/w==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "commander": { - "version": "12.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz", - "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", - "dev": true - }, - "glob": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-11.1.0.tgz", - "integrity": "sha512-vuNwKSaKiqm7g0THUBu2x7ckSs3XJLXE+2ssL7/MfTGPLLcrJQ/4Uq1CjPTtO5cCIiRxqvN6Twy1qOwhL0Xjcw==", - "dev": true, - "requires": { - "foreground-child": "^3.3.1", - "jackspeak": "^4.1.1", - "minimatch": "^10.1.1", - "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", - "path-scurry": "^2.0.0" - }, - "dependencies": { - "balanced-match": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", - "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", - "dev": true - }, - "brace-expansion": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.5.tgz", - "integrity": "sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ==", - "dev": true, - "requires": { - "balanced-match": "^4.0.2" - } - }, - "minimatch": { - "version": "10.2.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.4.tgz", - "integrity": "sha512-oRjTw/97aTBN0RHbYCdtF1MQfvusSIBQM0IZEgzl6426+8jSC0nF1a/GmnVLpfB9yyr6g6FTqWqiZVbxrtaCIg==", - "dev": true, - "requires": { - "brace-expansion": "^5.0.2" - } - } - } - }, - "lru-cache": { - "version": "11.2.7", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.7.tgz", - "integrity": "sha512-aY/R+aEsRelme17KGQa/1ZSIpLpNYYrhcrepKTZgE+W3WM16YMCaPwOHLHsmopZHELU0Ojin1lPVxKR0MihncA==", - "dev": true - }, - "minimatch": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", - "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "path-scurry": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.2.tgz", - "integrity": "sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg==", - "dev": true, - "requires": { - "lru-cache": "^11.0.0", - "minipass": "^7.1.2" - } - } - } - }, - "@vscode/vsce-sign": { - "version": "2.0.9", - "resolved": "https://registry.npmjs.org/@vscode/vsce-sign/-/vsce-sign-2.0.9.tgz", - "integrity": "sha512-8IvaRvtFyzUnGGl3f5+1Cnor3LqaUWvhaUjAYO8Y39OUYlOf3cRd+dowuQYLpZcP3uwSG+mURwjEBOSq4SOJ0g==", - "dev": true, - "requires": { - "@vscode/vsce-sign-alpine-arm64": "2.0.6", - "@vscode/vsce-sign-alpine-x64": "2.0.6", - "@vscode/vsce-sign-darwin-arm64": "2.0.6", - "@vscode/vsce-sign-darwin-x64": "2.0.6", - "@vscode/vsce-sign-linux-arm": "2.0.6", - "@vscode/vsce-sign-linux-arm64": "2.0.6", - "@vscode/vsce-sign-linux-x64": "2.0.6", - "@vscode/vsce-sign-win32-arm64": "2.0.6", - "@vscode/vsce-sign-win32-x64": "2.0.6" - } - }, - "@vscode/vsce-sign-alpine-arm64": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@vscode/vsce-sign-alpine-arm64/-/vsce-sign-alpine-arm64-2.0.6.tgz", - "integrity": "sha512-wKkJBsvKF+f0GfsUuGT0tSW0kZL87QggEiqNqK6/8hvqsXvpx8OsTEc3mnE1kejkh5r+qUyQ7PtF8jZYN0mo8Q==", - "dev": true, - "optional": true - }, - "@vscode/vsce-sign-alpine-x64": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@vscode/vsce-sign-alpine-x64/-/vsce-sign-alpine-x64-2.0.6.tgz", - "integrity": "sha512-YoAGlmdK39vKi9jA18i4ufBbd95OqGJxRvF3n6ZbCyziwy3O+JgOpIUPxv5tjeO6gQfx29qBivQ8ZZTUF2Ba0w==", - "dev": true, - "optional": true - }, - "@vscode/vsce-sign-darwin-arm64": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@vscode/vsce-sign-darwin-arm64/-/vsce-sign-darwin-arm64-2.0.6.tgz", - "integrity": "sha512-5HMHaJRIQuozm/XQIiJiA0W9uhdblwwl2ZNDSSAeXGO9YhB9MH5C4KIHOmvyjUnKy4UCuiP43VKpIxW1VWP4tQ==", - "dev": true, - "optional": true - }, - "@vscode/vsce-sign-darwin-x64": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@vscode/vsce-sign-darwin-x64/-/vsce-sign-darwin-x64-2.0.6.tgz", - "integrity": "sha512-25GsUbTAiNfHSuRItoQafXOIpxlYj+IXb4/qarrXu7kmbH94jlm5sdWSCKrrREs8+GsXF1b+l3OB7VJy5jsykw==", - "dev": true, - "optional": true - }, - "@vscode/vsce-sign-linux-arm": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@vscode/vsce-sign-linux-arm/-/vsce-sign-linux-arm-2.0.6.tgz", - "integrity": "sha512-UndEc2Xlq4HsuMPnwu7420uqceXjs4yb5W8E2/UkaHBB9OWCwMd3/bRe/1eLe3D8kPpxzcaeTyXiK3RdzS/1CA==", - "dev": true, - "optional": true - }, - "@vscode/vsce-sign-linux-arm64": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@vscode/vsce-sign-linux-arm64/-/vsce-sign-linux-arm64-2.0.6.tgz", - "integrity": "sha512-cfb1qK7lygtMa4NUl2582nP7aliLYuDEVpAbXJMkDq1qE+olIw/es+C8j1LJwvcRq1I2yWGtSn3EkDp9Dq5FdA==", - "dev": true, - "optional": true - }, - "@vscode/vsce-sign-linux-x64": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@vscode/vsce-sign-linux-x64/-/vsce-sign-linux-x64-2.0.6.tgz", - "integrity": "sha512-/olerl1A4sOqdP+hjvJ1sbQjKN07Y3DVnxO4gnbn/ahtQvFrdhUi0G1VsZXDNjfqmXw57DmPi5ASnj/8PGZhAA==", - "dev": true, - "optional": true - }, - "@vscode/vsce-sign-win32-arm64": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@vscode/vsce-sign-win32-arm64/-/vsce-sign-win32-arm64-2.0.6.tgz", - "integrity": "sha512-ivM/MiGIY0PJNZBoGtlRBM/xDpwbdlCWomUWuLmIxbi1Cxe/1nooYrEQoaHD8ojVRgzdQEUzMsRbyF5cJJgYOg==", - "dev": true, - "optional": true - }, - "@vscode/vsce-sign-win32-x64": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@vscode/vsce-sign-win32-x64/-/vsce-sign-win32-x64-2.0.6.tgz", - "integrity": "sha512-mgth9Kvze+u8CruYMmhHw6Zgy3GRX2S+Ed5oSokDEK5vPEwGGKnmuXua9tmFhomeAnhgJnL4DCna3TiNuGrBTQ==", - "dev": true, - "optional": true - }, "@webassemblyjs/ast": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.14.1.tgz", @@ -10200,15 +4930,6 @@ "fast-deep-equal": "^3.1.3" } }, - "ansi-escapes": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-7.3.0.tgz", - "integrity": "sha512-BvU8nYgGQBxcmMuEeUEmNTvrMVjJNSH7RgW24vXexN4Ven6qCvy4TntnvlnwnMLTVlcRQQdbRY8NKnaIoeWDNg==", - "dev": true, - "requires": { - "environment": "^1.0.0" - } - }, "ansi-regex": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", @@ -10230,12 +4951,6 @@ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", "dev": true }, - "astral-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", - "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", - "dev": true - }, "asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", @@ -10256,28 +4971,11 @@ "proxy-from-env": "^2.1.0" } }, - "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", - "integrity": "sha512-R5eFskGvOm3U/GzeAuxRkUsAl0hrAwGgWn6zAd2KrZmrEhWZVqLew4OOupbQlXUuojUzpGtq62SmdhJ06N88og==", - "dev": true, - "requires": { - "tunnel": "0.0.6", - "typed-rest-client": "^1.8.4" - } - }, "balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" }, - "base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "dev": true, - "optional": true - }, "baseline-browser-mapping": { "version": "2.9.19", "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.9.19.tgz", @@ -10289,59 +4987,6 @@ "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-3.0.2.tgz", "integrity": "sha512-Nik3Sc0ncrMK4UUdXQmAnRtzmNQTAAXmXIopizwZ1W1t8QmfJj+zL4OA2I7XPTPW5z5TDqv4hRo/JzouDJnX3A==" }, - "binaryextensions": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/binaryextensions/-/binaryextensions-6.11.0.tgz", - "integrity": "sha512-sXnYK/Ij80TO3lcqZVV2YgfKN5QjUWIRk/XSm2J/4bd/lPko3lvk0O4ZppH6m+6hB2/GTu+ptNwVFe1xh+QLQw==", - "dev": true, - "requires": { - "editions": "^6.21.0" - } - }, - "bl": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", - "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", - "dev": true, - "optional": true, - "requires": { - "buffer": "^5.5.0", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" - }, - "dependencies": { - "readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "dev": true, - "optional": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - } - } - }, - "bluebird": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", - "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", - "dev": true - }, - "boolbase": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", - "dev": true - }, - "boundary": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/boundary/-/boundary-2.0.0.tgz", - "integrity": "sha512-rJKn5ooC9u8q13IMCrW0RSp31pxBCHE3y9V/tp3TdWSLf8Em3p6Di4NBpfzbJge9YjjFEsD0RtFEjtvHL5VyEA==", - "dev": true - }, "brace-expansion": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.3.tgz", @@ -10366,61 +5011,16 @@ }, "browserslist": { "version": "4.28.1", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.1.tgz", - "integrity": "sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==", - "dev": true, - "requires": { - "baseline-browser-mapping": "^2.9.0", - "caniuse-lite": "^1.0.30001759", - "electron-to-chromium": "^1.5.263", - "node-releases": "^2.0.27", - "update-browserslist-db": "^1.2.0" - } - }, - "buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "dev": true, - "optional": true, - "requires": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - }, - "buffer-alloc": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz", - "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==", - "dev": true, - "requires": { - "buffer-alloc-unsafe": "^1.1.0", - "buffer-fill": "^1.0.0" - } - }, - "buffer-alloc-unsafe": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz", - "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==", - "dev": true - }, - "buffer-crc32": { - "version": "0.2.13", - "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", - "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", - "dev": true - }, - "buffer-equal-constant-time": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", - "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==", - "dev": true - }, - "buffer-fill": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz", - "integrity": "sha512-T7zexNBwiiaCOGDg9xNX9PBmjrubblRkENuptryuI64URkXDFum9il/JGL8Lm8wYfAXpredVXXZz7eMHilimiQ==", - "dev": true + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.1.tgz", + "integrity": "sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==", + "dev": true, + "requires": { + "baseline-browser-mapping": "^2.9.0", + "caniuse-lite": "^1.0.30001759", + "electron-to-chromium": "^1.5.263", + "node-releases": "^2.0.27", + "update-browserslist-db": "^1.2.0" + } }, "buffer-from": { "version": "1.1.2", @@ -10434,61 +5034,6 @@ "integrity": "sha512-wxXCdllwGhI2kCC0MnvTGYTMvnVZTvqgypkiTI8Pa5tcz2i6VqsqwYGgqwXji+4RgCzms6EajE4IxiUH6HH8nQ==", "dev": true }, - "bundle-name": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-4.1.0.tgz", - "integrity": "sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==", - "dev": true, - "requires": { - "run-applescript": "^7.0.0" - } - }, - "byte-counter": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/byte-counter/-/byte-counter-0.1.0.tgz", - "integrity": "sha512-jheRLVMeUKrDBjVw2O5+k4EvR4t9wtxHL+bo/LxfkxsVeuGMy3a5SEGgXdAFA4FSzTrU8rQXQIrsZ3oBq5a0pQ==", - "dev": true - }, - "c8": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/c8/-/c8-11.0.0.tgz", - "integrity": "sha512-e/uRViGHSVIJv7zsaDKM7VRn2390TgHXqUSvYwPHBQaU6L7E9L0n9JbdkwdYPvshDT0KymBmmlwSpms3yBaMNg==", - "dev": true, - "requires": { - "@bcoe/v8-coverage": "^1.0.1", - "@istanbuljs/schema": "^0.1.3", - "find-up": "^5.0.0", - "foreground-child": "^3.1.1", - "istanbul-lib-coverage": "^3.2.0", - "istanbul-lib-report": "^3.0.1", - "istanbul-reports": "^3.1.6", - "test-exclude": "^8.0.0", - "v8-to-istanbul": "^9.0.0", - "yargs": "^17.7.2", - "yargs-parser": "^21.1.1" - } - }, - "cacheable-lookup": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-7.0.0.tgz", - "integrity": "sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w==", - "dev": true - }, - "cacheable-request": { - "version": "13.0.18", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-13.0.18.tgz", - "integrity": "sha512-rFWadDRKJs3s2eYdXlGggnBZKG7MTblkFBB0YllFds+UYnfogDp2wcR6JN97FhRkHTvq59n2vhNoHNZn29dh/Q==", - "dev": true, - "requires": { - "@types/http-cache-semantics": "^4.0.4", - "get-stream": "^9.0.1", - "http-cache-semantics": "^4.2.0", - "keyv": "^5.5.5", - "mimic-response": "^4.0.0", - "normalize-url": "^8.1.1", - "responselike": "^4.0.2" - } - }, "call-bind-apply-helpers": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", @@ -10498,16 +5043,6 @@ "function-bind": "^1.1.2" } }, - "call-bound": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", - "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", - "dev": true, - "requires": { - "call-bind-apply-helpers": "^1.0.2", - "get-intrinsic": "^1.3.0" - } - }, "camelcase": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", @@ -10541,39 +5076,6 @@ } } }, - "cheerio": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.2.0.tgz", - "integrity": "sha512-WDrybc/gKFpTYQutKIK6UvfcuxijIZfMfXaYm8NMsPQxSYvf+13fXUJ4rztGGbJcBQ/GF55gvrZ0Bc0bj/mqvg==", - "dev": true, - "requires": { - "cheerio-select": "^2.1.0", - "dom-serializer": "^2.0.0", - "domhandler": "^5.0.3", - "domutils": "^3.2.2", - "encoding-sniffer": "^0.2.1", - "htmlparser2": "^10.1.0", - "parse5": "^7.3.0", - "parse5-htmlparser2-tree-adapter": "^7.1.0", - "parse5-parser-stream": "^7.1.2", - "undici": "^7.19.0", - "whatwg-mimetype": "^4.0.0" - } - }, - "cheerio-select": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-2.1.0.tgz", - "integrity": "sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==", - "dev": true, - "requires": { - "boolbase": "^1.0.0", - "css-select": "^5.1.0", - "css-what": "^6.1.0", - "domelementtype": "^2.3.0", - "domhandler": "^5.0.3", - "domutils": "^3.0.1" - } - }, "chokidar": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", @@ -10583,12 +5085,6 @@ "readdirp": "^4.0.1" } }, - "chownr": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", - "dev": true - }, "chrome-trace-event": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", @@ -10610,29 +5106,6 @@ "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", "dev": true }, - "clipboard-image": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/clipboard-image/-/clipboard-image-0.1.0.tgz", - "integrity": "sha512-SWk7FgaXLNFld19peQ/rTe0n97lwR1WbkqxV6JKCAOh7U52AKV/PeMFCyt/8IhBdqyDA8rdyewQMKZqvWT5Akg==", - "dev": true, - "requires": { - "run-jxa": "^3.0.0" - } - }, - "clipboardy": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/clipboardy/-/clipboardy-5.3.1.tgz", - "integrity": "sha512-fPWgBqpp9ctiOQCkE5yjYGzv11ZU55g6ahEgr3COiio6dXdt1mbchCPXQrSR2Y9sZqfi8L7QD3+UosgXVIuPdg==", - "dev": true, - "requires": { - "clipboard-image": "^0.1.0", - "execa": "^9.6.1", - "is-wayland": "^0.1.0", - "is-wsl": "^3.1.0", - "is64bit": "^2.0.0", - "powershell-utils": "^0.2.0" - } - }, "cliui": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", @@ -10655,12 +5128,6 @@ "shallow-clone": "^3.0.0" } }, - "cockatiel": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/cockatiel/-/cockatiel-3.2.1.tgz", - "integrity": "sha512-gfrHV6ZPkquExvMh9IOkKsBzNDk6sDuZ6DdBGUBkvFnTCqCxzpuq48RySgP0AnaqQkw2zynOFj9yly6T1Q2G5Q==", - "dev": true - }, "color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -10696,24 +5163,12 @@ "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", "dev": true }, - "compare-versions": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-6.1.1.tgz", - "integrity": "sha512-4hm4VPpIecmlg59CHXnRDnqGplJFrbLG4aFEl5vl6cK1u76ws3LLvX7ikFnTDl5vo39sjWD6AaDPYodJp/NNHg==", - "dev": true - }, "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", "dev": true }, - "convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "dev": true - }, "copy-webpack-plugin": { "version": "11.0.0", "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-11.0.0.tgz", @@ -10745,42 +5200,6 @@ "which": "^2.0.1" } }, - "crypto-random-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-4.0.0.tgz", - "integrity": "sha512-x8dy3RnvYdlUcPOjkEHqozhiwzKNSq7GcPuXFbnyMOCHxX8V3OgIg/pYuabl2sbUPfIJaeAQB7PMOK8DFIdoRA==", - "dev": true, - "requires": { - "type-fest": "^1.0.1" - }, - "dependencies": { - "type-fest": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", - "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", - "dev": true - } - } - }, - "css-select": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.2.2.tgz", - "integrity": "sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw==", - "dev": true, - "requires": { - "boolbase": "^1.0.0", - "css-what": "^6.1.0", - "domhandler": "^5.0.2", - "domutils": "^3.0.1", - "nth-check": "^2.0.1" - } - }, - "css-what": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.2.2.tgz", - "integrity": "sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==", - "dev": true - }, "debug": { "version": "4.4.3", "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", @@ -10796,56 +5215,11 @@ "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", "dev": true }, - "decompress-response": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-10.0.0.tgz", - "integrity": "sha512-oj7KWToJuuxlPr7VV0vabvxEIiqNMo+q0NueIiL3XhtwC6FVOX7Hr1c0C4eD0bmf7Zr+S/dSf2xvkH3Ad6sU3Q==", - "dev": true, - "requires": { - "mimic-response": "^4.0.0" - } - }, - "deep-extend": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", - "dev": true, - "optional": true - }, - "default-browser": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-5.5.0.tgz", - "integrity": "sha512-H9LMLr5zwIbSxrmvikGuI/5KGhZ8E2zH3stkMgM5LpOWDutGM2JZaj460Udnf1a+946zc7YBgrqEWwbk7zHvGw==", - "dev": true, - "requires": { - "bundle-name": "^4.1.0", - "default-browser-id": "^5.0.0" - } - }, - "default-browser-id": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-5.0.1.tgz", - "integrity": "sha512-x1VCxdX4t+8wVfd1so/9w+vQ4vx7lKd2Qp5tDRutErwmR85OgmfX7RlLRMWafRMY7hbEiXIbudNrjOAPa/hL8Q==", - "dev": true - }, - "define-lazy-prop": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz", - "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==", - "dev": true - }, "delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==" }, - "detect-libc": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", - "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", - "dev": true, - "optional": true - }, "diff": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/diff/-/diff-7.0.0.tgz", @@ -10860,43 +5234,6 @@ "path-type": "^4.0.0" } }, - "dom-serializer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", - "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", - "dev": true, - "requires": { - "domelementtype": "^2.3.0", - "domhandler": "^5.0.2", - "entities": "^4.2.0" - } - }, - "domelementtype": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", - "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", - "dev": true - }, - "domhandler": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", - "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", - "dev": true, - "requires": { - "domelementtype": "^2.3.0" - } - }, - "domutils": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz", - "integrity": "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==", - "dev": true, - "requires": { - "dom-serializer": "^2.0.0", - "domelementtype": "^2.3.0", - "domhandler": "^5.0.3" - } - }, "dunder-proto": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", @@ -10907,39 +5244,12 @@ "gopd": "^1.2.0" } }, - "duplexer2": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", - "integrity": "sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==", - "dev": true, - "requires": { - "readable-stream": "^2.0.2" - } - }, "eastasianwidth": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", "dev": true }, - "ecdsa-sig-formatter": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", - "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", - "dev": true, - "requires": { - "safe-buffer": "^5.0.1" - } - }, - "editions": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/editions/-/editions-6.22.0.tgz", - "integrity": "sha512-UgGlf8IW75je7HZjNDpJdCv4cGJWIi6yumFdZ0R7A8/CIhQiWUjyGLCxdHpd8bmyD1gnkfUNK0oeOXqUS2cpfQ==", - "dev": true, - "requires": { - "version-range": "^4.15.0" - } - }, "electron-to-chromium": { "version": "1.5.286", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.286.tgz", @@ -10952,25 +5262,6 @@ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "dev": true }, - "encoding-sniffer": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/encoding-sniffer/-/encoding-sniffer-0.2.1.tgz", - "integrity": "sha512-5gvq20T6vfpekVtqrYQsSCFZ1wEg5+wW0/QaZMWkFr6BqD3NfKs0rLCx4rrVlSWJeZb5NBJgVLswK/w2MWU+Gw==", - "dev": true, - "requires": { - "iconv-lite": "^0.6.3", - "whatwg-encoding": "^3.1.1" - } - }, - "end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "dev": true, - "requires": { - "once": "^1.4.0" - } - }, "enhanced-resolve": { "version": "5.19.0", "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.19.0.tgz", @@ -10981,24 +5272,12 @@ "tapable": "^2.3.0" } }, - "entities": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", - "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", - "dev": true - }, "envinfo": { "version": "7.10.0", "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.10.0.tgz", "integrity": "sha512-ZtUjZO6l5mwTHvc1L9+1q5p/R3wTopcfqMW8r5t8SJSKqeVI/LtajORwRFEKpEFuekjD0VBjwu1HMxL4UalIRw==", "dev": true }, - "environment": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/environment/-/environment-1.1.0.tgz", - "integrity": "sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==", - "dev": true - }, "es-define-property": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", @@ -11091,41 +5370,6 @@ "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", "dev": true }, - "execa": { - "version": "9.6.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-9.6.1.tgz", - "integrity": "sha512-9Be3ZoN4LmYR90tUoVu2te2BsbzHfhJyfEiAVfz7N5/zv+jduIfLrV2xdQXOHbaD6KgpGdO9PRPM1Y4Q9QkPkA==", - "dev": true, - "requires": { - "@sindresorhus/merge-streams": "^4.0.0", - "cross-spawn": "^7.0.6", - "figures": "^6.1.0", - "get-stream": "^9.0.0", - "human-signals": "^8.0.1", - "is-plain-obj": "^4.1.0", - "is-stream": "^4.0.1", - "npm-run-path": "^6.0.0", - "pretty-ms": "^9.2.0", - "signal-exit": "^4.1.0", - "strip-final-newline": "^4.0.0", - "yoctocolors": "^2.1.1" - }, - "dependencies": { - "is-plain-obj": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", - "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", - "dev": true - } - } - }, - "expand-template": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", - "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==", - "dev": true, - "optional": true - }, "fast-content-type-parse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/fast-content-type-parse/-/fast-content-type-parse-2.0.1.tgz", @@ -11179,32 +5423,6 @@ "reusify": "^1.0.4" } }, - "fd-slicer": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", - "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", - "dev": true, - "requires": { - "pend": "~1.2.0" - } - }, - "figures": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-6.1.0.tgz", - "integrity": "sha512-d+l3qxjSesT4V7v2fh+QnmFnUWv9lSpjarhShNTgBOfA0ttejbQUAlHLitbjkoRiDulW0OPoQPYIGhIC8ohejg==", - "dev": true, - "requires": { - "is-unicode-supported": "^2.0.0" - }, - "dependencies": { - "is-unicode-supported": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-2.1.0.tgz", - "integrity": "sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==", - "dev": true - } - } - }, "fill-range": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", @@ -11264,18 +5482,6 @@ "mime-types": "^2.1.12" } }, - "form-data-encoder": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-4.1.0.tgz", - "integrity": "sha512-G6NsmEW15s0Uw9XnCg+33H3ViYRyiM0hMrMhhqQOR8NFc5GhYrI+6I3u7OTw7b91J2g8rtvMBZJDbcGb2YUniw==", - "dev": true - }, - "fs-constants": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", - "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", - "dev": true - }, "fs-extra": { "version": "10.1.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", @@ -11292,13 +5498,6 @@ "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", "dev": true }, - "fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, - "optional": true - }, "function-bind": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", @@ -11342,23 +5541,6 @@ "es-object-atoms": "^1.0.0" } }, - "get-stream": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-9.0.1.tgz", - "integrity": "sha512-kVCxPF3vQM/N0B1PmoqVUqgHP+EeVjmZSQn+1oCRPxd2P21P2F19lIgbR3HBosbB1PUhOAoctJnfEn2GbN2eZA==", - "dev": true, - "requires": { - "@sec-ant/readable-stream": "^0.4.1", - "is-stream": "^4.0.1" - } - }, - "github-from-package": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", - "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==", - "dev": true, - "optional": true - }, "glob": { "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", @@ -11426,26 +5608,6 @@ "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==" }, - "got": { - "version": "14.6.6", - "resolved": "https://registry.npmjs.org/got/-/got-14.6.6.tgz", - "integrity": "sha512-QLV1qeYSo5l13mQzWgP/y0LbMr5Plr5fJilgAIwgnwseproEbtNym8xpLsDzeZ6MWXgNE6kdWGBjdh3zT/Qerg==", - "dev": true, - "requires": { - "@sindresorhus/is": "^7.0.1", - "byte-counter": "^0.1.0", - "cacheable-lookup": "^7.0.0", - "cacheable-request": "^13.0.12", - "decompress-response": "^10.0.0", - "form-data-encoder": "^4.0.2", - "http2-wrapper": "^2.2.1", - "keyv": "^5.5.3", - "lowercase-keys": "^3.0.0", - "p-cancelable": "^4.0.1", - "responselike": "^4.0.2", - "type-fest": "^4.26.1" - } - }, "graceful-fs": { "version": "4.2.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", @@ -11493,53 +5655,6 @@ "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", "dev": true }, - "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, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "hpagent": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/hpagent/-/hpagent-1.2.0.tgz", - "integrity": "sha512-A91dYTeIB6NoXG+PxTQpCCDDnfHsW9kc06Lvpu1TEe9gnd6ZFeiBoRO9JvzEv6xK7EX97/dUE8g/vBMTqTS3CA==", - "dev": true - }, - "html-escaper": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", - "dev": true - }, - "htmlparser2": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-10.1.0.tgz", - "integrity": "sha512-VTZkM9GWRAtEpveh7MSF6SjjrpNVNNVJfFup7xTY3UpFtm67foy9HDVXneLtFVt4pMz5kZtgNcvCniNFb1hlEQ==", - "dev": true, - "requires": { - "domelementtype": "^2.3.0", - "domhandler": "^5.0.3", - "domutils": "^3.2.2", - "entities": "^7.0.1" - }, - "dependencies": { - "entities": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/entities/-/entities-7.0.1.tgz", - "integrity": "sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==", - "dev": true - } - } - }, - "http-cache-semantics": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz", - "integrity": "sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==", - "dev": true - }, "http-proxy-agent": { "version": "7.0.2", "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", @@ -11550,16 +5665,6 @@ "debug": "^4.3.4" } }, - "http2-wrapper": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-2.2.1.tgz", - "integrity": "sha512-V5nVw1PAOgfI3Lmeaj2Exmeg7fenjhRUgz1lPSezy1CuhPYbgQtbQj4jZfEAEMlaL+vupsvhjqCyjzob0yxsmQ==", - "dev": true, - "requires": { - "quick-lru": "^5.1.1", - "resolve-alpn": "^1.2.0" - } - }, "https-proxy-agent": { "version": "7.0.5", "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.5.tgz", @@ -11570,28 +5675,6 @@ "debug": "4" } }, - "human-signals": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-8.0.1.tgz", - "integrity": "sha512-eKCa6bwnJhvxj14kZk5NCPc6Hb6BdsU9DZcOnmQKSnO1VKrfV0zCvtttPZUsBvjmNDn8rpcJfpwSYnHBjc95MQ==", - "dev": true - }, - "iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "dev": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - } - }, - "ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "dev": true, - "optional": true - }, "ignore": { "version": "5.2.4", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", @@ -11613,12 +5696,6 @@ "resolve-cwd": "^3.0.0" } }, - "index-to-position": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/index-to-position/-/index-to-position-1.2.0.tgz", - "integrity": "sha512-Yg7+ztRkqslMAS2iFaU+Oa4KTSidr63OsFGlOrJoW981kIYO3CGCS3wA95P1mUi/IVSJkn0D479KTJpVpvFNuw==", - "dev": true - }, "inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", @@ -11635,13 +5712,6 @@ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "dev": true }, - "ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "dev": true, - "optional": true - }, "interpret": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/interpret/-/interpret-2.2.0.tgz", @@ -11657,12 +5727,6 @@ "has": "^1.0.3" } }, - "is-docker": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", - "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", - "dev": true - }, "is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", @@ -11682,15 +5746,6 @@ "is-extglob": "^2.1.1" } }, - "is-inside-container": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz", - "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==", - "dev": true, - "requires": { - "is-docker": "^3.0.0" - } - }, "is-interactive": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-2.0.0.tgz", @@ -11721,13 +5776,7 @@ "dev": true, "requires": { "isobject": "^3.0.1" - } - }, - "is-stream": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-4.0.1.tgz", - "integrity": "sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A==", - "dev": true + } }, "is-unicode-supported": { "version": "0.1.0", @@ -11735,30 +5784,6 @@ "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", "dev": true }, - "is-wayland": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-wayland/-/is-wayland-0.1.0.tgz", - "integrity": "sha512-QkbMsWkIfkrzOPxenwye0h56iAXirZYHG9eHVPb22fO9y+wPbaX/CHacOWBa/I++4ohTcByimhM1/nyCsH8KNA==", - "dev": true - }, - "is-wsl": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.1.tgz", - "integrity": "sha512-e6rvdUCiQCAuumZslxRJWR/Doq4VpPR82kqclvcS0efgt430SlGIk05vdCN58+VrzgtIcfNODjozVielycD4Sw==", - "dev": true, - "requires": { - "is-inside-container": "^1.0.0" - } - }, - "is64bit": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is64bit/-/is64bit-2.0.0.tgz", - "integrity": "sha512-jv+8jaWCl0g2lSBkNSVXdzfBA0npK1HGC2KtWM9FumFRoGS94g3NbCCLVnCYHLjp4GrW2KZeeSTMo5ddtznmGw==", - "dev": true, - "requires": { - "system-architecture": "^0.1.0" - } - }, "isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", @@ -11777,72 +5802,6 @@ "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", "dev": true }, - "istanbul-lib-coverage": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", - "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", - "dev": true - }, - "istanbul-lib-report": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", - "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", - "dev": true, - "requires": { - "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^4.0.0", - "supports-color": "^7.1.0" - }, - "dependencies": { - "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, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "istanbul-reports": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.2.0.tgz", - "integrity": "sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==", - "dev": true, - "requires": { - "html-escaper": "^2.0.0", - "istanbul-lib-report": "^3.0.0" - } - }, - "istextorbinary": { - "version": "9.5.0", - "resolved": "https://registry.npmjs.org/istextorbinary/-/istextorbinary-9.5.0.tgz", - "integrity": "sha512-5mbUj3SiZXCuRf9fT3ibzbSSEWiy63gFfksmGfdOzujPjW3k+z8WvIBxcJHBoQNlaZaiyB25deviif2+osLmLw==", - "dev": true, - "requires": { - "binaryextensions": "^6.11.0", - "editions": "^6.21.0", - "textextensions": "^6.11.0" - } - }, - "jackspeak": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-4.2.3.tgz", - "integrity": "sha512-ykkVRwrYvFm1nb2AJfKKYPr0emF6IiXDYUaFx4Zn9ZuIH7MrzEZ3sD5RlqGXNRpHtvUHJyOnCEFxOlNDtGo7wg==", - "dev": true, - "requires": { - "@isaacs/cliui": "^9.0.0" - }, - "dependencies": { - "@isaacs/cliui": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-9.0.0.tgz", - "integrity": "sha512-AokJm4tuBHillT+FpMtxQ60n8ObyXBatq7jD2/JA9dxbDDokKQm8KMht5ibGzLVU9IJDIKK4TPKgMHEYMn3lMg==", - "dev": true - } - } - }, "jest-worker": { "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", @@ -11881,18 +5840,6 @@ "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", "dev": true }, - "json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "dev": true - }, - "jsonc-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.3.1.tgz", - "integrity": "sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==", - "dev": true - }, "jsonfile": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", @@ -11902,24 +5849,6 @@ "universalify": "^2.0.0" } }, - "jsonwebtoken": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.3.tgz", - "integrity": "sha512-MT/xP0CrubFRNLNKvxJ2BYfy53Zkm++5bX9dtuPbqAeQpTVe0MQTFhao8+Cp//EmJp244xt6Drw/GVEGCUj40g==", - "dev": true, - "requires": { - "jws": "^4.0.1", - "lodash.includes": "^4.3.0", - "lodash.isboolean": "^3.0.3", - "lodash.isinteger": "^4.0.4", - "lodash.isnumber": "^3.0.3", - "lodash.isplainobject": "^4.0.6", - "lodash.isstring": "^4.0.1", - "lodash.once": "^4.0.0", - "ms": "^2.1.1", - "semver": "^7.5.4" - } - }, "jszip": { "version": "3.10.1", "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.10.1.tgz", @@ -11932,59 +5861,12 @@ "setimmediate": "^1.0.5" } }, - "jwa": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.1.tgz", - "integrity": "sha512-hRF04fqJIP8Abbkq5NKGN0Bbr3JxlQ+qhZufXVr0DvujKy93ZCbXZMHDL4EOtodSbCWxOqR8MS1tXA5hwqCXDg==", - "dev": true, - "requires": { - "buffer-equal-constant-time": "^1.0.1", - "ecdsa-sig-formatter": "1.0.11", - "safe-buffer": "^5.0.1" - } - }, - "jws": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/jws/-/jws-4.0.1.tgz", - "integrity": "sha512-EKI/M/yqPncGUUh44xz0PxSidXFr/+r0pA70+gIYhjv+et7yxM+s29Y+VGDkovRofQem0fs7Uvf4+YmAdyRduA==", - "dev": true, - "requires": { - "jwa": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "keytar": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/keytar/-/keytar-7.9.0.tgz", - "integrity": "sha512-VPD8mtVtm5JNtA2AErl6Chp06JBfy7diFQ7TQQhdpWOl6MrCRB+eRbvAZUsbGQS9kiMq0coJsy0W0vHpDCkWsQ==", - "dev": true, - "optional": true, - "requires": { - "node-addon-api": "^4.3.0", - "prebuild-install": "^7.0.1" - } - }, - "keyv": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-5.6.0.tgz", - "integrity": "sha512-CYDD3SOtsHtyXeEORYRx2qBtpDJFjRTGXUtmNEMGyzYOKj1TE3tycdlho7kA1Ufx9OYWZzg52QFBGALTirzDSw==", - "dev": true, - "requires": { - "@keyv/serialize": "^1.1.1" - } - }, "kind-of": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", "dev": true }, - "leven": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", - "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", - "dev": true - }, "lie": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", @@ -11994,15 +5876,6 @@ "immediate": "~3.0.5" } }, - "linkify-it": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-5.0.0.tgz", - "integrity": "sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==", - "dev": true, - "requires": { - "uc.micro": "^2.0.0" - } - }, "loader-runner": { "version": "4.3.1", "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.1.tgz", @@ -12023,54 +5896,6 @@ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.18.1.tgz", "integrity": "sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==" }, - "lodash.includes": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", - "integrity": "sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==", - "dev": true - }, - "lodash.isboolean": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", - "integrity": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==", - "dev": true - }, - "lodash.isinteger": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", - "integrity": "sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==", - "dev": true - }, - "lodash.isnumber": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", - "integrity": "sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==", - "dev": true - }, - "lodash.isplainobject": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", - "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==", - "dev": true - }, - "lodash.isstring": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", - "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==", - "dev": true - }, - "lodash.once": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", - "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==", - "dev": true - }, - "lodash.truncate": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", - "integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==", - "dev": true - }, "log-symbols": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", @@ -12081,64 +5906,11 @@ "is-unicode-supported": "^0.1.0" } }, - "lowercase-keys": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-3.0.0.tgz", - "integrity": "sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==", - "dev": true - }, - "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==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "macos-version": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/macos-version/-/macos-version-6.0.0.tgz", - "integrity": "sha512-O2S8voA+pMfCHhBn/TIYDXzJ1qNHpPDU32oFxglKnVdJABiYYITt45oLkV9yhwA3E2FDwn3tQqUFrTsr1p3sBQ==", - "dev": true, - "requires": { - "semver": "^7.3.5" - } - }, - "make-dir": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", - "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", - "dev": true, - "requires": { - "semver": "^7.5.3" - } - }, - "markdown-it": { - "version": "14.1.1", - "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-14.1.1.tgz", - "integrity": "sha512-BuU2qnTti9YKgK5N+IeMubp14ZUKUUw7yeJbkjtosvHiP0AZ5c8IAgEMk79D0eC8F23r4Ac/q8cAIFdm2FtyoA==", - "dev": true, - "requires": { - "argparse": "^2.0.1", - "entities": "^4.4.0", - "linkify-it": "^5.0.0", - "mdurl": "^2.0.0", - "punycode.js": "^2.3.1", - "uc.micro": "^2.1.0" - } - }, "math-intrinsics": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==" }, - "mdurl": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-2.0.0.tgz", - "integrity": "sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==", - "dev": true - }, "merge-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", @@ -12159,12 +5931,6 @@ "picomatch": "^2.3.1" } }, - "mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "dev": true - }, "mime-db": { "version": "1.52.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", @@ -12178,24 +5944,12 @@ "mime-db": "1.52.0" } }, - "mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true - }, "mimic-function": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/mimic-function/-/mimic-function-5.0.1.tgz", "integrity": "sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==", "dev": true }, - "mimic-response": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-4.0.0.tgz", - "integrity": "sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg==", - "dev": true - }, "minimatch": { "version": "5.1.9", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.9.tgz", @@ -12225,13 +5979,6 @@ "minimist": "^1.2.6" } }, - "mkdirp-classic": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", - "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", - "dev": true, - "optional": true - }, "mocha": { "version": "11.7.5", "resolved": "https://registry.npmjs.org/mocha/-/mocha-11.7.5.tgz", @@ -12302,150 +6049,24 @@ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "dev": true }, - "mute-stream": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", - "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", - "dev": true - }, - "napi-build-utils": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-2.0.0.tgz", - "integrity": "sha512-GEbrYkbfF7MoNaoh2iGG84Mnf/WZfB0GdGEsM8wz7Expx/LlWf5U8t9nvJKXSp3qr5IsEbK04cBGhol/KwOsWA==", - "dev": true, - "optional": true - }, "neo-async": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", "dev": true }, - "node-abi": { - "version": "3.89.0", - "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.89.0.tgz", - "integrity": "sha512-6u9UwL0HlAl21+agMN3YAMXcKByMqwGx+pq+P76vii5f7hTPtKDp08/H9py6DY+cfDw7kQNTGEj/rly3IgbNQA==", - "dev": true, - "optional": true, - "requires": { - "semver": "^7.3.5" - } - }, - "node-addon-api": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-4.3.0.tgz", - "integrity": "sha512-73sE9+3UaLYYFmDsFZnqCInzPyh3MqIwZO9cw58yIqAZhONrrabrYyYe3TuIqtIiOuTXVhsGau8hcrhhwSsDIQ==", - "dev": true, - "optional": true - }, - "node-int64": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", - "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", - "dev": true - }, "node-releases": { "version": "2.0.27", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.27.tgz", "integrity": "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==", "dev": true }, - "node-sarif-builder": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/node-sarif-builder/-/node-sarif-builder-3.4.0.tgz", - "integrity": "sha512-tGnJW6OKRii9u/b2WiUViTJS+h7Apxx17qsMUjsUeNDiMMX5ZFf8F8Fcz7PAQ6omvOxHZtvDTmOYKJQwmfpjeg==", - "dev": true, - "requires": { - "@types/sarif": "^2.1.7", - "fs-extra": "^11.1.1" - }, - "dependencies": { - "fs-extra": { - "version": "11.3.4", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.4.tgz", - "integrity": "sha512-CTXd6rk/M3/ULNQj8FBqBWHYBVYybQ3VPBw0xGKFe3tuH7ytT6ACnvzpIQ3UZtB8yvUKC2cXn1a+x+5EVQLovA==", - "dev": true, - "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - } - } - } - }, - "normalize-package-data": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-6.0.2.tgz", - "integrity": "sha512-V6gygoYb/5EmNI+MEGrWkC+e6+Rr7mTmfHrxDbLzxQogBkgzo76rkok0Am6thgSF7Mv2nLOajAJj5vDJZEFn7g==", - "dev": true, - "requires": { - "hosted-git-info": "^7.0.0", - "semver": "^7.3.5", - "validate-npm-package-license": "^3.0.4" - }, - "dependencies": { - "hosted-git-info": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-7.0.2.tgz", - "integrity": "sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w==", - "dev": true, - "requires": { - "lru-cache": "^10.0.1" - } - }, - "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 - } - } - }, "normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", "dev": true }, - "normalize-url": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-8.1.1.tgz", - "integrity": "sha512-JYc0DPlpGWB40kH5g07gGTrYuMqV653k3uBKY6uITPWds3M0ov3GaWGp9lbE3Bzngx8+XkfzgvASb9vk9JDFXQ==", - "dev": true - }, - "npm-run-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-6.0.0.tgz", - "integrity": "sha512-9qny7Z9DsQU8Ou39ERsPU4OZQlSTP47ShQzuKZ6PRXpYLtIFgl/DEBYEXKlvcEa+9tHVcK8CF81Y2V72qaZhWA==", - "dev": true, - "requires": { - "path-key": "^4.0.0", - "unicorn-magic": "^0.3.0" - }, - "dependencies": { - "path-key": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", - "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", - "dev": true - } - } - }, - "nth-check": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", - "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", - "dev": true, - "requires": { - "boolbase": "^1.0.0" - } - }, - "object-inspect": { - "version": "1.13.4", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", - "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", - "dev": true - }, "once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", @@ -12464,18 +6085,6 @@ "mimic-function": "^5.0.0" } }, - "open": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/open/-/open-10.2.0.tgz", - "integrity": "sha512-YgBpdJHPyQ2UE5x+hlSXcnejzAvD0b22U2OuAP+8OnlJT+PjWPxtgmGqKKc+RgTM63U9gN0YzrYc71R2WT/hTA==", - "dev": true, - "requires": { - "default-browser": "^5.2.1", - "define-lazy-prop": "^3.0.0", - "is-inside-container": "^1.0.0", - "wsl-utils": "^0.1.0" - } - }, "ora": { "version": "8.2.0", "resolved": "https://registry.npmjs.org/ora/-/ora-8.2.0.tgz", @@ -12557,12 +6166,6 @@ } } }, - "p-cancelable": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-4.0.1.tgz", - "integrity": "sha512-wBowNApzd45EIKdO1LaU+LrMBwAcjfPaYtVzV3lmfM3gf8Z4CHZsiIqlM8TZZ8okYvh5A1cP6gTfCRQtwUpaUg==", - "dev": true - }, "p-limit": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", @@ -12581,12 +6184,6 @@ "p-limit": "^3.0.2" } }, - "p-map": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-7.0.4.tgz", - "integrity": "sha512-tkAQEw8ysMzmkhgw8k+1U/iPhWNhykKnSk4Rd5zLoPJCuJaGRPo6YposrZgaxHKzDHdDWWZvE/Sk7hsL2X/CpQ==", - "dev": true - }, "p-try": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", @@ -12603,77 +6200,7 @@ "version": "1.0.11", "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", - "dev": true - }, - "parse-json": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-8.3.0.tgz", - "integrity": "sha512-ybiGyvspI+fAoRQbIPRddCcSTV9/LsJbf0e/S85VLowVGzRmokfneg2kwVW/KU5rOXrPSbF1qAKPMgNTqqROQQ==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.26.2", - "index-to-position": "^1.1.0", - "type-fest": "^4.39.1" - } - }, - "parse-ms": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-ms/-/parse-ms-4.0.0.tgz", - "integrity": "sha512-TXfryirbmq34y8QBwgqCVLi+8oA3oWx2eAnSn62ITyEhEYaWRlVZ2DvMM9eZbMs/RfxPu/PK/aBLyGj4IrqMHw==", - "dev": true - }, - "parse-semver": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/parse-semver/-/parse-semver-1.1.1.tgz", - "integrity": "sha512-Eg1OuNntBMH0ojvEKSrvDSnwLmvVuUOSdylH/pSCPNMIspLlweJyIWXCE+k/5hm3cj/EBUYwmWkjhBALNP4LXQ==", - "dev": true, - "requires": { - "semver": "^5.1.0" - }, - "dependencies": { - "semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", - "dev": true - } - } - }, - "parse5": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.3.0.tgz", - "integrity": "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==", - "dev": true, - "requires": { - "entities": "^6.0.0" - }, - "dependencies": { - "entities": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", - "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", - "dev": true - } - } - }, - "parse5-htmlparser2-tree-adapter": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.1.0.tgz", - "integrity": "sha512-ruw5xyKs6lrpo9x9rCZqZZnIUntICjQAd0Wsmp396Ul9lN/h+ifgVV1x1gZHi8euej6wTfpqX8j+BFQxF0NS/g==", - "dev": true, - "requires": { - "domhandler": "^5.0.3", - "parse5": "^7.0.0" - } - }, - "parse5-parser-stream": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/parse5-parser-stream/-/parse5-parser-stream-7.1.2.tgz", - "integrity": "sha512-JyeQc9iwFLn5TbvvqACIF/VXG6abODeB3Fwmv/TGdLk2LfbWkaySGY72at4+Ty7EkPZj854u4CrICqNk2qIbow==", - "dev": true, - "requires": { - "parse5": "^7.0.0" - } + "dev": true }, "path-exists": { "version": "4.0.0", @@ -12722,12 +6249,6 @@ "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==" }, - "pend": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", - "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", - "dev": true - }, "picocolors": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", @@ -12787,64 +6308,6 @@ } } }, - "playwright": { - "version": "1.59.1", - "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.59.1.tgz", - "integrity": "sha512-C8oWjPR3F81yljW9o5OxcWzfh6avkVwDD2VYdwIGqTkl+OGFISgypqzfu7dOe4QNLL2aqcWBmI3PMtLIK233lw==", - "dev": true, - "requires": { - "fsevents": "2.3.2", - "playwright-core": "1.59.1" - } - }, - "playwright-core": { - "version": "1.59.1", - "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.59.1.tgz", - "integrity": "sha512-HBV/RJg81z5BiiZ9yPzIiClYV/QMsDCKUyogwH9p3MCP6IYjUFu/MActgYAvK0oWyV9NlwM3GLBjADyWgydVyg==", - "dev": true - }, - "pluralize": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz", - "integrity": "sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==", - "dev": true - }, - "powershell-utils": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/powershell-utils/-/powershell-utils-0.2.0.tgz", - "integrity": "sha512-ZlsFlG7MtSFCoc5xreOvBAozCJ6Pf06opgJjh9ONEv418xpZSAzNjstD36C6+JwOnfSqOW/9uDkqKjezTdxZhw==", - "dev": true - }, - "prebuild-install": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.3.tgz", - "integrity": "sha512-8Mf2cbV7x1cXPUILADGI3wuhfqWvtiLA1iclTDbFRZkgRQS0NqsPZphna9V+HyTEadheuPmjaJMsbzKQFOzLug==", - "dev": true, - "optional": true, - "requires": { - "detect-libc": "^2.0.0", - "expand-template": "^2.0.3", - "github-from-package": "0.0.0", - "minimist": "^1.2.3", - "mkdirp-classic": "^0.5.3", - "napi-build-utils": "^2.0.0", - "node-abi": "^3.3.0", - "pump": "^3.0.0", - "rc": "^1.2.7", - "simple-get": "^4.0.0", - "tar-fs": "^2.0.0", - "tunnel-agent": "^0.6.0" - } - }, - "pretty-ms": { - "version": "9.3.0", - "resolved": "https://registry.npmjs.org/pretty-ms/-/pretty-ms-9.3.0.tgz", - "integrity": "sha512-gjVS5hOP+M3wMm5nmNOucbIrqudzs9v/57bWRHQWLYklXqoXKrVfYW2W9+glfGsqtPgpiz5WwyEEB+ksXIx3gQ==", - "dev": true, - "requires": { - "parse-ms": "^4.0.0" - } - }, "process-nextick-args": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", @@ -12856,107 +6319,11 @@ "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-2.1.0.tgz", "integrity": "sha512-cJ+oHTW1VAEa8cJslgmUZrc+sjRKgAKl3Zyse6+PV38hZe/V6Z14TbCuXcan9F9ghlz4QrFr2c92TNF82UkYHA==" }, - "pump": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.4.tgz", - "integrity": "sha512-VS7sjc6KR7e1ukRFhQSY5LM2uBWAUPiOPa/A3mkKmiMwSmRFUITt0xuj+/lesgnCv+dPIEYlkzrcyXgquIHMcA==", - "dev": true, - "optional": true, - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "punycode.js": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode.js/-/punycode.js-2.3.1.tgz", - "integrity": "sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==", - "dev": true - }, - "qs": { - "version": "6.15.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.15.0.tgz", - "integrity": "sha512-mAZTtNCeetKMH+pSjrb76NAM8V9a05I9aBZOHztWy/UqcJdQYNsf59vrRKWnojAT9Y+GbIvoTBC++CPHqpDBhQ==", - "dev": true, - "requires": { - "side-channel": "^1.1.0" - } - }, "queue-microtask": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==" }, - "quick-lru": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", - "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", - "dev": true - }, - "rc": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "dev": true, - "optional": true, - "requires": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - }, - "dependencies": { - "strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", - "dev": true, - "optional": true - } - } - }, - "rc-config-loader": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/rc-config-loader/-/rc-config-loader-4.1.4.tgz", - "integrity": "sha512-3GiwEzklkbXTDp52UR5nT8iXgYAx1V9ZG/kDZT7p60u2GCv2XTwQq4NzinMoMpNtXhmt3WkhYXcj6HH8HdwCEQ==", - "dev": true, - "requires": { - "debug": "^4.4.3", - "js-yaml": "^4.1.1", - "json5": "^2.2.3", - "require-from-string": "^2.0.2" - } - }, - "read": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/read/-/read-1.0.7.tgz", - "integrity": "sha512-rSOKNYUmaxy0om1BNjMN4ezNT6VKK+2xF4GBhc81mkH7L60i6dp8qPYrkndNLT3QPphoII3maL9PVC9XmhHwVQ==", - "dev": true, - "requires": { - "mute-stream": "~0.0.4" - } - }, - "read-pkg": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-9.0.1.tgz", - "integrity": "sha512-9viLL4/n1BJUCT1NXVTdS1jtm80yDEgR5T4yCelII49Mbj0v1rZdKqj7zCiYdbB0CuCgdrvHcNogAKTFPBocFA==", - "dev": true, - "requires": { - "@types/normalize-package-data": "^2.4.3", - "normalize-package-data": "^6.0.0", - "parse-json": "^8.0.0", - "type-fest": "^4.6.0", - "unicorn-magic": "^0.1.0" - }, - "dependencies": { - "unicorn-magic": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.1.0.tgz", - "integrity": "sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==", - "dev": true - } - } - }, "readable-stream": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", @@ -13010,12 +6377,6 @@ "supports-preserve-symlinks-flag": "^1.0.0" } }, - "resolve-alpn": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", - "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==", - "dev": true - }, "resolve-cwd": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", @@ -13031,15 +6392,6 @@ "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", "dev": true }, - "responselike": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-4.0.2.tgz", - "integrity": "sha512-cGk8IbWEAnaCpdAt1BHzJ3Ahz5ewDJa0KseTsE3qIRMJ3C698W8psM7byCeWVpd/Ha7FUYzuRVzXoKoM6nRUbA==", - "dev": true, - "requires": { - "lowercase-keys": "^3.0.0" - } - }, "restore-cursor": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-5.1.0.tgz", @@ -13055,97 +6407,6 @@ "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==" }, - "run-applescript": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-7.1.0.tgz", - "integrity": "sha512-DPe5pVFaAsinSaV6QjQ6gdiedWDcRCbUuiQfQa2wmWV7+xC9bGulGI8+TdRmoFkAPaBXk8CrAbnlY2ISniJ47Q==", - "dev": true - }, - "run-jxa": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/run-jxa/-/run-jxa-3.0.0.tgz", - "integrity": "sha512-4f2CrY7H+sXkKXJn/cE6qRA3z+NMVO7zvlZ/nUV0e62yWftpiLAfw5eV9ZdomzWd2TXWwEIiGjAT57+lWIzzvA==", - "dev": true, - "requires": { - "execa": "^5.1.1", - "macos-version": "^6.0.0", - "subsume": "^4.0.0", - "type-fest": "^2.0.0" - }, - "dependencies": { - "execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "dev": true, - "requires": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" - } - }, - "get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "dev": true - }, - "human-signals": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", - "dev": true - }, - "is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "dev": true - }, - "npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "dev": true, - "requires": { - "path-key": "^3.0.0" - } - }, - "onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dev": true, - "requires": { - "mimic-fn": "^2.1.0" - } - }, - "signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true - }, - "strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", - "dev": true - }, - "type-fest": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", - "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", - "dev": true - } - } - }, "run-parallel": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", @@ -13160,27 +6421,6 @@ "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", "dev": true }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true - }, - "sanitize-filename": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/sanitize-filename/-/sanitize-filename-1.6.3.tgz", - "integrity": "sha512-y/52Mcy7aw3gRm7IrcGDFx/bCk4AhRh2eI9luHOQM86nZsqwiRkkq2GekHXBBD+SmPidc8i2PqtYZl+pWJ8Oeg==", - "dev": true, - "requires": { - "truncate-utf8-bytes": "^1.0.0" - } - }, - "sax": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.6.0.tgz", - "integrity": "sha512-6R3J5M4AcbtLUdZmRv2SygeVaM7IhrLXu9BmnOGmmACak8fiUtOsYNWUS4uK7upbmHIBbLBeFeI//477BKLBzA==", - "dev": true - }, "schema-utils": { "version": "4.3.3", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.3.tgz", @@ -13193,73 +6433,6 @@ "ajv-keywords": "^5.1.0" } }, - "secretlint": { - "version": "10.2.2", - "resolved": "https://registry.npmjs.org/secretlint/-/secretlint-10.2.2.tgz", - "integrity": "sha512-xVpkeHV/aoWe4vP4TansF622nBEImzCY73y/0042DuJ29iKIaqgoJ8fGxre3rVSHHbxar4FdJobmTnLp9AU0eg==", - "dev": true, - "requires": { - "@secretlint/config-creator": "^10.2.2", - "@secretlint/formatter": "^10.2.2", - "@secretlint/node": "^10.2.2", - "@secretlint/profiler": "^10.2.2", - "debug": "^4.4.1", - "globby": "^14.1.0", - "read-pkg": "^9.0.1" - }, - "dependencies": { - "@sindresorhus/merge-streams": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/merge-streams/-/merge-streams-2.3.0.tgz", - "integrity": "sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg==", - "dev": true - }, - "globby": { - "version": "14.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-14.1.0.tgz", - "integrity": "sha512-0Ia46fDOaT7k4og1PDW4YbodWWr3scS2vAr2lTbsplOt2WkKp0vQbkI9wKis/T5LV/dqPjO3bpS/z6GTJB82LA==", - "dev": true, - "requires": { - "@sindresorhus/merge-streams": "^2.1.0", - "fast-glob": "^3.3.3", - "ignore": "^7.0.3", - "path-type": "^6.0.0", - "slash": "^5.1.0", - "unicorn-magic": "^0.3.0" - } - }, - "ignore": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", - "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", - "dev": true - }, - "path-type": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-6.0.0.tgz", - "integrity": "sha512-Vj7sf++t5pBD637NSfkxpHSMfWaeig5+DKWLhcqIYx6mWQz5hdJTGDVMQiJcw1ZYkhs7AazKDGpRVji1LJCZUQ==", - "dev": true - }, - "slash": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-5.1.0.tgz", - "integrity": "sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==", - "dev": true - } - } - }, - "selenium-webdriver": { - "version": "4.41.0", - "resolved": "https://registry.npmjs.org/selenium-webdriver/-/selenium-webdriver-4.41.0.tgz", - "integrity": "sha512-1XxuKVhr9az24xwixPBEDGSZP+P0z3ZOnCmr9Oiep0MlJN2Mk+flIjD3iBS9BgyjS4g14dikMqnrYUPIjhQBhA==", - "dev": true, - "requires": { - "@bazel/runfiles": "^6.5.0", - "jszip": "^3.10.1", - "tmp": "^0.2.5", - "ws": "^8.19.0" - } - }, "semver": { "version": "7.6.3", "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", @@ -13301,114 +6474,17 @@ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true }, - "side-channel": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", - "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", - "dev": true, - "requires": { - "es-errors": "^1.3.0", - "object-inspect": "^1.13.3", - "side-channel-list": "^1.0.0", - "side-channel-map": "^1.0.1", - "side-channel-weakmap": "^1.0.2" - } - }, - "side-channel-list": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", - "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", - "dev": true, - "requires": { - "es-errors": "^1.3.0", - "object-inspect": "^1.13.3" - } - }, - "side-channel-map": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", - "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", - "dev": true, - "requires": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.5", - "object-inspect": "^1.13.3" - } - }, - "side-channel-weakmap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", - "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", - "dev": true, - "requires": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.5", - "object-inspect": "^1.13.3", - "side-channel-map": "^1.0.1" - } - }, "signal-exit": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", "dev": true }, - "simple-concat": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", - "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", - "dev": true, - "optional": true - }, - "simple-get": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz", - "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==", - "dev": true, - "optional": true, - "requires": { - "decompress-response": "^6.0.0", - "once": "^1.3.1", - "simple-concat": "^1.0.0" - }, - "dependencies": { - "decompress-response": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", - "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", - "dev": true, - "optional": true, - "requires": { - "mimic-response": "^3.1.0" - } - }, - "mimic-response": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", - "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", - "dev": true, - "optional": true - } - } - }, "slash": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==" }, - "slice-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", - "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" - } - }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -13425,38 +6501,6 @@ "source-map": "^0.6.0" } }, - "spdx-correct": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", - "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", - "dev": true, - "requires": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-exceptions": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", - "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==", - "dev": true - }, - "spdx-expression-parse": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", - "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", - "dev": true, - "requires": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-license-ids": { - "version": "3.0.23", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.23.tgz", - "integrity": "sha512-CWLcCCH7VLu13TgOH+r8p1O/Znwhqv/dbb6lqWy67G+pT1kHmeD/+V36AVb/vq8QMIQwVShJ6Ssl5FPh0fuSdw==", - "dev": true - }, "sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", @@ -13518,73 +6562,19 @@ "ansi-regex": "^5.0.1" } }, - "strip-final-newline": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-4.0.0.tgz", - "integrity": "sha512-aulFJcD6YK8V1G7iRB5tigAP4TsHBZZrOV8pjV++zdUwmeV8uzbY7yn6h9MswN62adStNZFuCIx4haBnRuMDaw==", - "dev": true - }, "strip-json-comments": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true - }, - "structured-source": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/structured-source/-/structured-source-4.0.0.tgz", - "integrity": "sha512-qGzRFNJDjFieQkl/sVOI2dUjHKRyL9dAJi2gCPGJLbJHBIkyOHxjuocpIEfbLioX+qSJpvbYdT49/YCdMznKxA==", - "dev": true, - "requires": { - "boundary": "^2.0.0" - } - }, - "subsume": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/subsume/-/subsume-4.0.0.tgz", - "integrity": "sha512-BWnYJElmHbYZ/zKevy+TG+SsyoFCmRPDHJbR1MzLxkPOv1Jp/4hGhVUtP98s+wZBsBsHwCXvPTP0x287/WMjGg==", - "dev": true, - "requires": { - "escape-string-regexp": "^5.0.0", - "unique-string": "^3.0.0" - }, - "dependencies": { - "escape-string-regexp": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", - "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", - "dev": true - } - } - }, - "supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - }, - "supports-hyperlinks": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-3.2.0.tgz", - "integrity": "sha512-zFObLMyZeEwzAoKCyu1B91U79K2t7ApXuQfo8OuxwXLDgcKxuwM+YvcbIhm6QWqz7mHUH1TVytR1PwVVjEuMig==", - "dev": true, - "requires": { - "has-flag": "^4.0.0", - "supports-color": "^7.0.0" - }, - "dependencies": { - "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, - "requires": { - "has-flag": "^4.0.0" - } - } + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true + }, + "supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" } }, "supports-preserve-symlinks-flag": { @@ -13593,130 +6583,12 @@ "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", "dev": true }, - "system-architecture": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/system-architecture/-/system-architecture-0.1.0.tgz", - "integrity": "sha512-ulAk51I9UVUyJgxlv9M6lFot2WP3e7t8Kz9+IS6D4rVba1tR9kON+Ey69f+1R4Q8cd45Lod6a4IcJIxnzGc/zA==", - "dev": true - }, - "table": { - "version": "6.9.0", - "resolved": "https://registry.npmjs.org/table/-/table-6.9.0.tgz", - "integrity": "sha512-9kY+CygyYM6j02t5YFHbNz2FN5QmYGv9zAjVp4lCDjlCw7amdckXlEt/bjMhUIfj4ThGRE4gCUH5+yGnNuPo5A==", - "dev": true, - "requires": { - "ajv": "^8.0.1", - "lodash.truncate": "^4.4.2", - "slice-ansi": "^4.0.0", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1" - } - }, "tapable": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.0.tgz", "integrity": "sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==", "dev": true }, - "tar-fs": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.4.tgz", - "integrity": "sha512-mDAjwmZdh7LTT6pNleZ05Yt65HC3E+NiQzl672vQG38jIrehtJk/J3mNwIg+vShQPcLF/LV7CMnDW6vjj6sfYQ==", - "dev": true, - "optional": true, - "requires": { - "chownr": "^1.1.1", - "mkdirp-classic": "^0.5.2", - "pump": "^3.0.0", - "tar-stream": "^2.1.4" - } - }, - "tar-stream": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", - "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", - "dev": true, - "optional": true, - "requires": { - "bl": "^4.0.3", - "end-of-stream": "^1.4.1", - "fs-constants": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^3.1.1" - }, - "dependencies": { - "readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "dev": true, - "optional": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - } - } - }, - "targz": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/targz/-/targz-1.0.1.tgz", - "integrity": "sha512-6q4tP9U55mZnRuMTBqnqc3nwYQY3kv+QthCFZuMk+Tn1qYUnMPmL/JZ/mzgXINzFpSqfU+242IFmFU9VPvqaQw==", - "dev": true, - "requires": { - "tar-fs": "^1.8.1" - }, - "dependencies": { - "bl": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.3.tgz", - "integrity": "sha512-pvcNpa0UU69UT341rO6AYy4FVAIkUHuZXRIWbq+zHnsVcRzDDjIAhGuuYoi0d//cwIwtt4pkpKycWEfjdV+vww==", - "dev": true, - "requires": { - "readable-stream": "^2.3.5", - "safe-buffer": "^5.1.1" - } - }, - "pump": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/pump/-/pump-1.0.3.tgz", - "integrity": "sha512-8k0JupWme55+9tCVE+FS5ULT3K6AbgqrGa58lTT49RpyfwwcGedHqaC5LlQNdEAumn/wFsu6aPwkuPMioy8kqw==", - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "tar-fs": { - "version": "1.16.6", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-1.16.6.tgz", - "integrity": "sha512-JkOgFt3FxM/2v2CNpAVHqMW2QASjc/Hxo7IGfNd3MHaDYSW/sBFiS7YVmmhmr8x6vwN1VFQDQGdT2MWpmIuVKA==", - "dev": true, - "requires": { - "chownr": "^1.0.1", - "mkdirp": "^0.5.1", - "pump": "^1.0.0", - "tar-stream": "^1.1.2" - } - }, - "tar-stream": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.6.2.tgz", - "integrity": "sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A==", - "dev": true, - "requires": { - "bl": "^1.0.0", - "buffer-alloc": "^1.2.0", - "end-of-stream": "^1.0.0", - "fs-constants": "^1.0.0", - "readable-stream": "^2.3.0", - "to-buffer": "^1.1.1", - "xtend": "^4.0.0" - } - } - } - }, "tas-client": { "version": "0.1.73", "resolved": "https://registry.npmjs.org/tas-client/-/tas-client-0.1.73.tgz", @@ -13725,16 +6597,6 @@ "axios": "^1.6.1" } }, - "terminal-link": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-4.0.0.tgz", - "integrity": "sha512-lk+vH+MccxNqgVqSnkMVKx4VLJfnLjDBGzH16JVZjKE2DoxP57s6/vt6JmXV5I3jBcfGrxNrYtC+mPtU7WJztA==", - "dev": true, - "requires": { - "ansi-escapes": "^7.0.0", - "supports-hyperlinks": "^3.2.0" - } - }, "terser": { "version": "5.46.0", "resolved": "https://registry.npmjs.org/terser/-/terser-5.46.0.tgz", @@ -13760,97 +6622,6 @@ "terser": "^5.31.1" } }, - "test-exclude": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-8.0.0.tgz", - "integrity": "sha512-ZOffsNrXYggvU1mDGHk54I96r26P8SyMjO5slMKSc7+IWmtB/MQKnEC2fP51imB3/pT6YK5cT5E8f+Dd9KdyOQ==", - "dev": true, - "requires": { - "@istanbuljs/schema": "^0.1.2", - "glob": "^13.0.6", - "minimatch": "^10.2.2" - }, - "dependencies": { - "balanced-match": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", - "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", - "dev": true - }, - "brace-expansion": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.5.tgz", - "integrity": "sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ==", - "dev": true, - "requires": { - "balanced-match": "^4.0.2" - } - }, - "glob": { - "version": "13.0.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-13.0.6.tgz", - "integrity": "sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw==", - "dev": true, - "requires": { - "minimatch": "^10.2.2", - "minipass": "^7.1.3", - "path-scurry": "^2.0.2" - } - }, - "lru-cache": { - "version": "11.2.7", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.7.tgz", - "integrity": "sha512-aY/R+aEsRelme17KGQa/1ZSIpLpNYYrhcrepKTZgE+W3WM16YMCaPwOHLHsmopZHELU0Ojin1lPVxKR0MihncA==", - "dev": true - }, - "minimatch": { - "version": "10.2.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.4.tgz", - "integrity": "sha512-oRjTw/97aTBN0RHbYCdtF1MQfvusSIBQM0IZEgzl6426+8jSC0nF1a/GmnVLpfB9yyr6g6FTqWqiZVbxrtaCIg==", - "dev": true, - "requires": { - "brace-expansion": "^5.0.2" - } - }, - "path-scurry": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.2.tgz", - "integrity": "sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg==", - "dev": true, - "requires": { - "lru-cache": "^11.0.0", - "minipass": "^7.1.2" - } - } - } - }, - "text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", - "dev": true - }, - "textextensions": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/textextensions/-/textextensions-6.11.0.tgz", - "integrity": "sha512-tXJwSr9355kFJI3lbCkPpUH5cP8/M0GGy2xLO34aZCjMXBaK3SoPnZwr/oWmo1FdCnELcs4npdCIOFtq9W3ruQ==", - "dev": true, - "requires": { - "editions": "^6.21.0" - } - }, - "tmp": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.5.tgz", - "integrity": "sha512-voyz6MApa1rQGUxT3E+BK7/ROe8itEx7vD8/HEvt4xwXucvQ5G5oeEiHkmHZJuBO21RpOf+YYm9MOivj709jow==", - "dev": true - }, - "to-buffer": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/to-buffer/-/to-buffer-1.1.1.tgz", - "integrity": "sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg==", - "dev": true - }, "to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -13859,15 +6630,6 @@ "is-number": "^7.0.0" } }, - "truncate-utf8-bytes": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/truncate-utf8-bytes/-/truncate-utf8-bytes-1.0.2.tgz", - "integrity": "sha512-95Pu1QXQvruGEhv62XCMO3Mm90GscOCClvrIUwCM0PYOXK3kaF3l3sIHxx71ThJfcbM2O5Au6SO3AWCSEfW4mQ==", - "dev": true, - "requires": { - "utf8-byte-length": "^1.0.1" - } - }, "ts-loader": { "version": "9.5.1", "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.5.1.tgz", @@ -14032,84 +6794,18 @@ "tslib": "^1.8.1" } }, - "tunnel": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/tunnel/-/tunnel-0.0.6.tgz", - "integrity": "sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==", - "dev": true - }, - "tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", - "dev": true, - "optional": true, - "requires": { - "safe-buffer": "^5.0.1" - } - }, - "type-fest": { - "version": "4.41.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.41.0.tgz", - "integrity": "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==", - "dev": true - }, - "typed-rest-client": { - "version": "1.8.11", - "resolved": "https://registry.npmjs.org/typed-rest-client/-/typed-rest-client-1.8.11.tgz", - "integrity": "sha512-5UvfMpd1oelmUPRbbaVnq+rHP7ng2cE4qoQkQeAqxRL6PklkxsM0g32/HL0yfvruK6ojQ5x8EE+HF4YV6DtuCA==", - "dev": true, - "requires": { - "qs": "^6.9.1", - "tunnel": "0.0.6", - "underscore": "^1.12.1" - } - }, "typescript": { "version": "4.9.5", "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", "dev": true }, - "uc.micro": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-2.1.0.tgz", - "integrity": "sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==", - "dev": true - }, - "underscore": { - "version": "1.13.8", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.8.tgz", - "integrity": "sha512-DXtD3ZtEQzc7M8m4cXotyHR+FAS18C64asBYY5vqZexfYryNNnDc02W4hKg3rdQuqOYas1jkseX0+nZXjTXnvQ==", - "dev": true - }, - "undici": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/undici/-/undici-7.24.4.tgz", - "integrity": "sha512-BM/JzwwaRXxrLdElV2Uo6cTLEjhSb3WXboncJamZ15NgUURmvlXvxa6xkwIOILIjPNo9i8ku136ZvWV0Uly8+w==", - "dev": true - }, "undici-types": { "version": "6.19.8", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==", "dev": true }, - "unicorn-magic": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.3.0.tgz", - "integrity": "sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==", - "dev": true - }, - "unique-string": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-3.0.0.tgz", - "integrity": "sha512-VGXBUVwxKMBUznyffQweQABPRRW1vHZAbadFZud4pLFAqRGvv/96vafgjWFqzourzr8YonlQiPgH0YCJfawoGQ==", - "dev": true, - "requires": { - "crypto-random-string": "^4.0.0" - } - }, "universal-user-agent": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-7.0.3.tgz", @@ -14120,32 +6816,6 @@ "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==" }, - "unzipper": { - "version": "0.12.3", - "resolved": "https://registry.npmjs.org/unzipper/-/unzipper-0.12.3.tgz", - "integrity": "sha512-PZ8hTS+AqcGxsaQntl3IRBw65QrBI6lxzqDEL7IAo/XCEqRTKGfOX56Vea5TH9SZczRVxuzk1re04z/YjuYCJA==", - "dev": true, - "requires": { - "bluebird": "~3.7.2", - "duplexer2": "~0.1.4", - "fs-extra": "^11.2.0", - "graceful-fs": "^4.2.2", - "node-int64": "^0.4.0" - }, - "dependencies": { - "fs-extra": { - "version": "11.3.4", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.4.tgz", - "integrity": "sha512-CTXd6rk/M3/ULNQj8FBqBWHYBVYybQ3VPBw0xGKFe3tuH7ytT6ACnvzpIQ3UZtB8yvUKC2cXn1a+x+5EVQLovA==", - "dev": true, - "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - } - } - } - }, "update-browserslist-db": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", @@ -14156,200 +6826,42 @@ "picocolors": "^1.1.1" } }, - "url-join": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/url-join/-/url-join-4.0.1.tgz", - "integrity": "sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA==", - "dev": true - }, - "utf8-byte-length": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/utf8-byte-length/-/utf8-byte-length-1.0.4.tgz", - "integrity": "sha512-4+wkEYLBbWxqTahEsWrhxepcoVOJ+1z5PGIjPZxRkytcdSUaNjIjBM7Xn8E+pdSuV7SzvWovBFA54FO0JSoqhA==", - "dev": true - }, "util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", "dev": true }, - "uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==" - }, - "v8-to-istanbul": { - "version": "9.3.0", - "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.3.0.tgz", - "integrity": "sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==", - "dev": true, - "requires": { - "@jridgewell/trace-mapping": "^0.3.12", - "@types/istanbul-lib-coverage": "^2.0.1", - "convert-source-map": "^2.0.0" - } - }, - "validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", - "dev": true, - "requires": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "version-range": { - "version": "4.15.0", - "resolved": "https://registry.npmjs.org/version-range/-/version-range-4.15.0.tgz", - "integrity": "sha512-Ck0EJbAGxHwprkzFO966t4/5QkRuzh+/I1RxhLgUKKwEn+Cd8NwM60mE3AqBZg5gYODoXW0EFsQvbZjRlvdqbg==", - "dev": true - }, "vscode-extension-telemetry-wrapper": { - "version": "0.15.0", - "resolved": "https://registry.npmjs.org/vscode-extension-telemetry-wrapper/-/vscode-extension-telemetry-wrapper-0.15.0.tgz", - "integrity": "sha512-Uioj6zqmaHBOyRsryazdvgc8mZdRRUJSCL+Z68jG9QoZ5cwHlcaodou0BwqfTjfpwA+hUSseXRrSHrzGkXpGcQ==", - "requires": { - "@vscode/extension-telemetry": "^1.2.0", - "uuid": "^8.3.2" - } - }, - "vscode-extension-tester": { - "version": "8.23.0", - "resolved": "https://registry.npmjs.org/vscode-extension-tester/-/vscode-extension-tester-8.23.0.tgz", - "integrity": "sha512-YElhRDkOjvmGFv44aCMnEnUM5RmFqWByQ8TBr7/6N9K/b5o1gu2fo9EgTef6VmrB4kyFnSrkPVAbiZBfKQA1mQ==", - "dev": true, - "requires": { - "@redhat-developer/locators": "^1.20.0", - "@redhat-developer/page-objects": "^1.20.0", - "@types/selenium-webdriver": "^4.35.5", - "@vscode/vsce": "^3.7.1", - "c8": "^11.0.0", - "commander": "^14.0.3", - "compare-versions": "^6.1.1", - "find-up": "8.0.0", - "fs-extra": "^11.3.4", - "glob": "^13.0.6", - "got": "^14.6.6", - "hpagent": "^1.2.0", - "js-yaml": "^4.1.1", - "sanitize-filename": "^1.6.3", - "selenium-webdriver": "^4.41.0", - "targz": "^1.0.1", - "unzipper": "^0.12.3" - }, - "dependencies": { - "balanced-match": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", - "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", - "dev": true - }, - "brace-expansion": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.5.tgz", - "integrity": "sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ==", - "dev": true, - "requires": { - "balanced-match": "^4.0.2" - } - }, - "commander": { - "version": "14.0.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-14.0.3.tgz", - "integrity": "sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw==", - "dev": true - }, - "find-up": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-8.0.0.tgz", - "integrity": "sha512-JGG8pvDi2C+JxidYdIwQDyS/CgcrIdh18cvgxcBge3wSHRQOrooMD3GlFBcmMJAN9M42SAZjDp5zv1dglJjwww==", - "dev": true, - "requires": { - "locate-path": "^8.0.0", - "unicorn-magic": "^0.3.0" - } - }, - "fs-extra": { - "version": "11.3.4", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.4.tgz", - "integrity": "sha512-CTXd6rk/M3/ULNQj8FBqBWHYBVYybQ3VPBw0xGKFe3tuH7ytT6ACnvzpIQ3UZtB8yvUKC2cXn1a+x+5EVQLovA==", - "dev": true, - "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - } - }, - "glob": { - "version": "13.0.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-13.0.6.tgz", - "integrity": "sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw==", - "dev": true, - "requires": { - "minimatch": "^10.2.2", - "minipass": "^7.1.3", - "path-scurry": "^2.0.2" - } - }, - "locate-path": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-8.0.0.tgz", - "integrity": "sha512-XT9ewWAC43tiAV7xDAPflMkG0qOPn2QjHqlgX8FOqmWa/rxnyYDulF9T0F7tRy1u+TVTmK/M//6VIOye+2zDXg==", - "dev": true, - "requires": { - "p-locate": "^6.0.0" - } - }, - "lru-cache": { - "version": "11.2.7", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.7.tgz", - "integrity": "sha512-aY/R+aEsRelme17KGQa/1ZSIpLpNYYrhcrepKTZgE+W3WM16YMCaPwOHLHsmopZHELU0Ojin1lPVxKR0MihncA==", - "dev": true - }, - "minimatch": { - "version": "10.2.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.4.tgz", - "integrity": "sha512-oRjTw/97aTBN0RHbYCdtF1MQfvusSIBQM0IZEgzl6426+8jSC0nF1a/GmnVLpfB9yyr6g6FTqWqiZVbxrtaCIg==", - "dev": true, - "requires": { - "brace-expansion": "^5.0.2" - } - }, - "p-limit": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", - "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", - "dev": true, - "requires": { - "yocto-queue": "^1.0.0" - } - }, - "p-locate": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz", - "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==", - "dev": true, + "version": "0.15.2", + "resolved": "https://registry.npmjs.org/vscode-extension-telemetry-wrapper/-/vscode-extension-telemetry-wrapper-0.15.2.tgz", + "integrity": "sha512-efKkHF8c4kTKyBhBH2k0bZU4drqIic2jBYw/j1ixKOEEsa/WIiuUsdrBPD5uaRIoZ/91GzNCLiiV4ckIrf581g==", + "requires": { + "@microsoft/applicationinsights-common": "^3.4.1", + "@vscode/extension-telemetry": "^1.2.0" + }, + "dependencies": { + "@microsoft/applicationinsights-common": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/@microsoft/applicationinsights-common/-/applicationinsights-common-3.4.1.tgz", + "integrity": "sha512-CTbD0g/68tiv2yCItsodDQBYxyHdfQkG7VhvVU8OHenukpl/7W4wEuxZuOntqhv5m9Nx/DFncbz+T83nvYTG3g==", "requires": { - "p-limit": "^4.0.0" + "@microsoft/applicationinsights-core-js": "3.4.1", + "@microsoft/applicationinsights-shims": "3.0.1", + "@microsoft/dynamicproto-js": "^2.0.3", + "@nevware21/ts-utils": ">= 0.12.6 < 2.x" } }, - "path-scurry": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.2.tgz", - "integrity": "sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg==", - "dev": true, + "@microsoft/applicationinsights-core-js": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/@microsoft/applicationinsights-core-js/-/applicationinsights-core-js-3.4.1.tgz", + "integrity": "sha512-eXIHZ1+nvBiJgVpufBiTP801Vtr5FEwjWZioUsb44NC/z/UcsZh2MDJ1mBpjaDO73LVYUw/ZZmDCCo6Pg/61kA==", "requires": { - "lru-cache": "^11.0.0", - "minipass": "^7.1.2" + "@microsoft/applicationinsights-shims": "3.0.1", + "@microsoft/dynamicproto-js": "^2.0.3", + "@nevware21/ts-async": ">= 0.5.5 < 2.x", + "@nevware21/ts-utils": ">= 0.12.6 < 2.x" } - }, - "yocto-queue": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.2.2.tgz", - "integrity": "sha512-4LCcse/U2MHZ63HAJVE+v71o7yOdIe4cZ70Wpf8D/IyjDKYQLV5GD46B+hSTjJsvV5PztjvHoU580EftxjDZFQ==", - "dev": true } } }, @@ -14467,21 +6979,6 @@ "integrity": "sha512-yd1RBzSGanHkitROoPFd6qsrxt+oFhg/129YzheDGqeustzX0vTZJZsSsQjVQC4yzBQ56K55XU8gaNCtIzOnTg==", "dev": true }, - "whatwg-encoding": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-3.1.1.tgz", - "integrity": "sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==", - "dev": true, - "requires": { - "iconv-lite": "0.6.3" - } - }, - "whatwg-mimetype": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-4.0.0.tgz", - "integrity": "sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==", - "dev": true - }, "which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", @@ -14531,56 +7028,12 @@ "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", "dev": true }, - "ws": { - "version": "8.19.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.19.0.tgz", - "integrity": "sha512-blAT2mjOEIi0ZzruJfIhb3nps74PRWTCz1IjglWEEpQl5XS/UNama6u2/rjFkDDouqr4L67ry+1aGIALViWjDg==", - "dev": true, - "requires": {} - }, - "wsl-utils": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/wsl-utils/-/wsl-utils-0.1.0.tgz", - "integrity": "sha512-h3Fbisa2nKGPxCpm89Hk33lBLsnaGBvctQopaBSOW/uIs6FTe1ATyAnKFJrzVs9vpGdsTe73WF3V4lIsk4Gacw==", - "dev": true, - "requires": { - "is-wsl": "^3.1.0" - } - }, - "xml2js": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.5.0.tgz", - "integrity": "sha512-drPFnkQJik/O+uPKpqSgr22mpuFHqKdbS835iAQrUC73L2F5WkboIRd63ai/2Yg6I1jzifPFKH2NTK+cfglkIA==", - "dev": true, - "requires": { - "sax": ">=0.6.0", - "xmlbuilder": "~11.0.0" - } - }, - "xmlbuilder": { - "version": "11.0.1", - "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", - "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", - "dev": true - }, - "xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", - "dev": true - }, "y18n": { "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", "dev": true }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, "yargs": { "version": "17.7.2", "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", @@ -14614,36 +7067,11 @@ "is-plain-obj": "^2.1.0" } }, - "yauzl": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", - "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", - "dev": true, - "requires": { - "buffer-crc32": "~0.2.3", - "fd-slicer": "~1.1.0" - } - }, - "yazl": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/yazl/-/yazl-2.5.1.tgz", - "integrity": "sha512-phENi2PLiHnHb6QBVot+dJnaAZ0xosj7p3fWl+znIjBDlnMI2PsZCJZ306BPTFOaHf5qdDEI8x5qFrSOBN5vrw==", - "dev": true, - "requires": { - "buffer-crc32": "~0.2.3" - } - }, "yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", "dev": true - }, - "yoctocolors": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yoctocolors/-/yoctocolors-2.1.2.tgz", - "integrity": "sha512-CzhO+pFNo8ajLM2d2IW/R93ipy99LWjtwblvC1RsoSUMZgyLbYFr221TnSNT7GjGdYui6P459mw9JH/g/zW2ug==", - "dev": true } } } diff --git a/package.json b/package.json index e62892da..31225282 100644 --- a/package.json +++ b/package.json @@ -65,7 +65,9 @@ "description": "Java file path (workspace-relative or full URI)" } }, - "required": ["uri"] + "required": [ + "uri" + ] } }, { @@ -88,7 +90,9 @@ "description": "Maximum results (default: 20, max: 50)" } }, - "required": ["query"] + "required": [ + "query" + ] } } ], @@ -410,7 +414,9 @@ "scope": "application", "description": "%configuration.vscode-java-dependency.enableLspTools.description%", "default": false, - "tags": ["experimental"], + "tags": [ + "experimental" + ], "experiment": { "mode": "startup" } @@ -1184,10 +1190,10 @@ "lodash": "^4.18.0", "minimatch": "^5.1.9", "semver": "^7.3.8", - "vscode-extension-telemetry-wrapper": "^0.15.0", + "vscode-extension-telemetry-wrapper": "^0.15.2", "vscode-tas-client": "^0.1.75" }, "overrides": { "serialize-javascript": ">=7.0.5" } -} \ No newline at end of file +} From 6dd06d6ca3a47f9585e20cdb11c2cc949f14ad81 Mon Sep 17 00:00:00 2001 From: wenyt <75360946+wenytang-ms@users.noreply.github.com> Date: Tue, 28 Apr 2026 15:45:08 +0800 Subject: [PATCH 298/352] perf: use incremental build by default (#998) * perf: use incremental build by default * chore: update * perf: add rebuild * fix:comments --- package.json | 22 +++++++++++++++++++--- package.nls.json | 4 +++- package.nls.zh-cn.json | 6 ++++-- package.nls.zh-tw.json | 8 +++++--- src/commands.ts | 4 ++++ src/tasks/build/buildTaskProvider.ts | 5 ++++- src/views/dependencyDataProvider.ts | 16 +++++++++++++--- test/suite/buildTask.test.ts | 13 +++++++++++++ 8 files changed, 65 insertions(+), 13 deletions(-) diff --git a/package.json b/package.json index 31225282..aa3c84ce 100644 --- a/package.json +++ b/package.json @@ -162,6 +162,16 @@ "title": "%contributes.commands.java.project.build.workspace%", "icon": "$(tools)" }, + { + "command": "java.project.rebuild.workspace", + "title": "%contributes.commands.java.project.rebuild.workspace%", + "icon": "$(refresh)" + }, + { + "command": "java.project.build.project", + "title": "%contributes.commands.java.project.build.project%", + "category": "Java" + }, { "command": "java.project.clean.workspace", "title": "%contributes.commands.java.project.clean.workspace%" @@ -178,7 +188,8 @@ }, { "command": "java.project.rebuild", - "title": "%contributes.commands.java.project.rebuild%" + "title": "%contributes.commands.java.project.rebuild%", + "category": "Java" }, { "command": "java.view.package.revealInProjectExplorer", @@ -732,6 +743,11 @@ "when": "view == javaProjectExplorer && java:serverMode == Standard && config.java.project.explorer.showNonJavaResources", "group": "overflow_10@30" }, + { + "command": "java.project.rebuild.workspace", + "when": "view == javaProjectExplorer && java:serverMode == Standard && !java:noJavaProjects && !java:importFailed", + "group": "overflow_20@5" + }, { "command": "java.project.clean.workspace", "when": "view == javaProjectExplorer && java:serverMode == Standard && !java:noJavaProjects", @@ -790,7 +806,7 @@ "group": "7_modification@20" }, { - "command": "java.project.build.workspace", + "command": "java.project.build.project", "when": "view == javaProjectExplorer && viewItem =~ /java:project(?=.*?\\b\\+java\\b)(?=.*?\\b\\+uri\\b)/", "group": "8_execution@5" }, @@ -1075,7 +1091,7 @@ }, "isFullBuild": { "type": "boolean", - "default": "true", + "default": false, "description": "%taskDefinitions.java.project.build.isFullBuild%" } } diff --git a/package.nls.json b/package.nls.json index a163a415..ba8bf485 100644 --- a/package.nls.json +++ b/package.nls.json @@ -6,7 +6,9 @@ "contributes.commands.java.project.addLibraryFolders": "Add Library Folders to Project Classpath...", "contributes.commands.java.project.removeLibrary": "Remove from Project Classpath", "contributes.commands.java.view.package.refresh": "Refresh", - "contributes.commands.java.project.build.workspace": "Rebuild All", + "contributes.commands.java.project.build.workspace": "Build All", + "contributes.commands.java.project.rebuild.workspace": "Rebuild All", + "contributes.commands.java.project.build.project": "Build Project", "contributes.commands.java.project.clean.workspace": "Clean Workspace", "contributes.commands.java.project.rebuild": "Rebuild Project", "contributes.commands.java.project.update": "Reload Project", diff --git a/package.nls.zh-cn.json b/package.nls.zh-cn.json index c962108c..c7b0b8ab 100644 --- a/package.nls.zh-cn.json +++ b/package.nls.zh-cn.json @@ -6,7 +6,9 @@ "contributes.commands.java.project.addLibraryFolders": "添加文件夹至项目 Classpath...", "contributes.commands.java.project.removeLibrary": "从项目 Classpath 中移除", "contributes.commands.java.view.package.refresh": "刷新", - "contributes.commands.java.project.build.workspace": "重新构建所有项目", + "contributes.commands.java.project.build.workspace": "构建所有项目", + "contributes.commands.java.project.rebuild.workspace": "重新构建所有项目", + "contributes.commands.java.project.build.project": "构建项目", "contributes.commands.java.project.clean.workspace": "清理工作空间", "contributes.commands.java.project.rebuild": "重新构建项目", "contributes.commands.java.project.update": "重新加载项目", @@ -56,7 +58,7 @@ "taskDefinitions.java.project.build.path": "被构建项目的根目录路径。绝对路径或者相对于工作空间目录的相对路径都可以使用。", "taskDefinitions.java.project.build.path.workspace": "工作空间中的所有项目。", "taskDefinitions.java.project.build.path.exclude": "'!' 后的路径将会从待构建项目路径中移除。", - "taskDefinitions.java.project.build.isFullBuild": "是否要重新构建项目。", + "taskDefinitions.java.project.build.isFullBuild": "是否要执行清理构建。", "viewsWelcome.workbench.createNewJavaProject": "您也可以[打开一个 Java 项目目录](command:_java.project.open),或点击下方按钮创建一个新的 Java 项目。\n[创建 Java 项目](command:_java.project.create.from.fileexplorer.welcome)", "viewsWelcome.workbench.noJavaProject": "当前工作空间未发现 Java 项目,您可以[打开一个 Java 项目目录](command:_java.project.open),或点击下方按钮创建一个新的 Java 项目。\n[创建 Java 项目](command:_java.project.create.from.javaprojectexplorer.welcome)", "viewsWelcome.workbench.importFailed": "加载 Java 项目时出现错误,请通过以下方式查看错误相关信息:\n[打开问题视图](command:workbench.panel.markers.view.focus)", diff --git a/package.nls.zh-tw.json b/package.nls.zh-tw.json index e5de9002..cfa7462d 100644 --- a/package.nls.zh-tw.json +++ b/package.nls.zh-tw.json @@ -6,7 +6,9 @@ "contributes.commands.java.project.addLibraryFolders": "新增資料夾至專案 Classpath...", "contributes.commands.java.project.removeLibrary": "從專案 Classpath 中移除", "contributes.commands.java.view.package.refresh": "重新整理", - "contributes.commands.java.project.build.workspace": "重新建置所有專案", + "contributes.commands.java.project.build.workspace": "建置所有專案", + "contributes.commands.java.project.rebuild.workspace": "重新建置所有專案", + "contributes.commands.java.project.build.project": "建置專案", "contributes.commands.java.project.clean.workspace": "清理工作區", "contributes.commands.java.project.rebuild": "重新建置專案", "contributes.commands.java.project.update": "重新載入專案", @@ -48,10 +50,10 @@ "taskDefinitions.java.project.build.path": "被建置專案的根目錄路徑。絕對路徑或者相對於工作區目錄的相對路徑都可以使用。", "taskDefinitions.java.project.build.path.workspace": "工作區中的所有專案。", "taskDefinitions.java.project.build.path.exclude": "'!' 後的路徑將會從待建置專案路徑中移除。", - "taskDefinitions.java.project.build.isFullBuild": "是否要重新建置專案。", + "taskDefinitions.java.project.build.isFullBuild": "是否要執行清理建置。", "viewsWelcome.workbench.createNewJavaProject": "您也可以[開啟一個 Java 專案目錄](command:_java.project.open),或點擊下方按鈕建立一個新的 Java 專案。\n[建立 Java 專案](command:_java.project.create.from.fileexplorer.welcome)", "viewsWelcome.workbench.noJavaProject": "當前工作區未發現 Java 專案,您可以[開啟一個 Java 專案目錄](command:_java.project.open),或點擊下方按鈕建立一個新的 Java 專案。\n[建立 Java 專案](command:_java.project.create.from.javaprojectexplorer.welcome)", "viewsWelcome.workbench.importFailed": "加載 Java 專案時出現錯誤,請通過以下方式查看錯誤相關信息:\n[打開問題視圖](command:workbench.panel.markers.view.focus)", "viewsWelcome.workbench.inLightWeightMode": "若要檢視各專案,你可以將專案匯入到工作區中。\n[匯入專案](command:java.server.mode.switch?%5B%22Standard%22,true%5D)", "viewsWelcome.workbench.installLanguageSupport": "Java 專案視圖需要安裝並啟用 [Extension Pack for Java](command:extension.open?%5B%22vscjava.vscode-java-pack%22%5D) 以提供完整的功能。\n[安裝](command:java.project.installExtension?%5B%22vscjava.vscode-java-pack%22%5D)" -} \ No newline at end of file +} diff --git a/src/commands.ts b/src/commands.ts index 572a81c7..50ecc6a9 100644 --- a/src/commands.ts +++ b/src/commands.ts @@ -98,6 +98,10 @@ export namespace Commands { export const JAVA_PROJECT_BUILD_WORKSPACE = "java.project.build.workspace"; + export const JAVA_PROJECT_REBUILD_WORKSPACE = "java.project.rebuild.workspace"; + + export const JAVA_PROJECT_BUILD_PROJECT = "java.project.build.project"; + export const JAVA_PROJECT_CLEAN_WORKSPACE = "java.project.clean.workspace"; export const JAVA_PROJECT_UPDATE = "java.project.update"; diff --git a/src/tasks/build/buildTaskProvider.ts b/src/tasks/build/buildTaskProvider.ts index 6844d68b..ef908fe0 100644 --- a/src/tasks/build/buildTaskProvider.ts +++ b/src/tasks/build/buildTaskProvider.ts @@ -28,7 +28,7 @@ export class BuildTaskProvider implements TaskProvider { const defaultTaskDefinition = { type: BuildTaskProvider.type, paths: [ BuildTaskProvider.workspace ], - isFullBuild: true, + isFullBuild: false, }; const defaultTask = new Task( defaultTaskDefinition, @@ -58,6 +58,9 @@ export class BuildTaskProvider implements TaskProvider { .filter(Boolean); task.definition = taskDefinition; } + if (taskDefinition.isFullBuild === undefined) { + taskDefinition.isFullBuild = false; + } task.execution = new CustomExecution(async (resolvedDefinition: IBuildTaskDefinition): Promise => { return new BuildTaskTerminal(resolvedDefinition, task.scope ?? TaskScope.Workspace); }); diff --git a/src/views/dependencyDataProvider.ts b/src/views/dependencyDataProvider.ts index 0a1ec956..626af103 100644 --- a/src/views/dependencyDataProvider.ts +++ b/src/views/dependencyDataProvider.ts @@ -60,6 +60,8 @@ export class DependencyDataProvider implements TreeDataProvider { context.subscriptions.push(instrumentOperationAsVsCodeCommand(Commands.VIEW_PACKAGE_OUTLINE, (uri, range) => window.showTextDocument(Uri.parse(uri), { selection: range }))); context.subscriptions.push(instrumentOperationAsVsCodeCommand(Commands.JAVA_PROJECT_BUILD_WORKSPACE, () => + commands.executeCommand(Commands.JAVA_BUILD_WORKSPACE, false /*fullCompile*/))); + context.subscriptions.push(instrumentOperationAsVsCodeCommand(Commands.JAVA_PROJECT_REBUILD_WORKSPACE, () => commands.executeCommand(Commands.JAVA_BUILD_WORKSPACE, true /*fullCompile*/))); context.subscriptions.push(instrumentOperationAsVsCodeCommand(Commands.JAVA_PROJECT_CLEAN_WORKSPACE, () => commands.executeCommand(Commands.JAVA_CLEAN_WORKSPACE))); @@ -75,13 +77,21 @@ export class DependencyDataProvider implements TreeDataProvider { commands.executeCommand(Commands.JAVA_PROJECT_CONFIGURATION_UPDATE, uris[0]); } })); - context.subscriptions.push(instrumentOperationAsVsCodeCommand(Commands.JAVA_PROJECT_REBUILD, async (node: INodeData) => { + context.subscriptions.push(instrumentOperationAsVsCodeCommand(Commands.JAVA_PROJECT_BUILD_PROJECT, async (node: INodeData) => { if (!node.uri) { sendError(new Error("Uri not available when building project")); - window.showErrorMessage("The URI of the project is not available, you can try to trigger the command 'Java: Rebuild Projects' from Command Palette."); + window.showErrorMessage("The URI of the project is not available, you can try to trigger the command 'Java: Build Project' from Command Palette."); + return; + } + return commands.executeCommand(Commands.BUILD_PROJECT, Uri.parse(node.uri), false /*isFullBuild*/); + })); + context.subscriptions.push(instrumentOperationAsVsCodeCommand(Commands.JAVA_PROJECT_REBUILD, async (node: INodeData) => { + if (!node.uri) { + sendError(new Error("Uri not available when rebuilding project")); + window.showErrorMessage("The URI of the project is not available, you can try to trigger the command 'Java: Rebuild Project' from Command Palette."); return; } - commands.executeCommand(Commands.BUILD_PROJECT, Uri.parse(node.uri), true); + return commands.executeCommand(Commands.BUILD_PROJECT, Uri.parse(node.uri), true /*isFullBuild*/); })); this.setRefreshDebounceFunc(); diff --git a/test/suite/buildTask.test.ts b/test/suite/buildTask.test.ts index a861f73a..d8596356 100644 --- a/test/suite/buildTask.test.ts +++ b/test/suite/buildTask.test.ts @@ -22,6 +22,19 @@ suite("Build Task Tests", () => { && t.source === BuildTaskProvider.type; }); assert.ok(exportJarTask !== undefined); + assert.strictEqual(exportJarTask.definition.isFullBuild, false); + }); + + test("test resolving build task defaults to incremental build", async function() { + const task: Task = new Task({ + type: BuildTaskProvider.type, + paths: [ BuildTaskProvider.workspace ], + }, TaskScope.Workspace, BuildTaskProvider.defaultTaskName, BuildTaskProvider.type); + + const resolvedTask: Task | undefined = await new BuildTaskProvider().resolveTask(task); + + assert.ok(resolvedTask !== undefined); + assert.strictEqual(resolvedTask.definition.isFullBuild, false); }); test("test categorizePaths()", async function() { From a587e620bf16229bb86b5fb999ddb312e5469a27 Mon Sep 17 00:00:00 2001 From: wenyt <75360946+wenytang-ms@users.noreply.github.com> Date: Thu, 30 Apr 2026 12:54:56 +0800 Subject: [PATCH 299/352] perf: add telemetry (#999) --- src/copilot/tools/javaContextTools.ts | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/src/copilot/tools/javaContextTools.ts b/src/copilot/tools/javaContextTools.ts index 47573089..d5c584c8 100644 --- a/src/copilot/tools/javaContextTools.ts +++ b/src/copilot/tools/javaContextTools.ts @@ -96,6 +96,7 @@ const fileStructureTool: vscode.LanguageModelTool = { const startTime = Date.now(); let resultCount = 0; let status = "success"; + let errorMessage = ""; try { const uri = resolveFileUri(options.input.uri); const symbols = await vscode.commands.executeCommand( @@ -112,13 +113,15 @@ const fileStructureTool: vscode.LanguageModelTool = { return toResult({ symbols: result, ...(truncated && { truncated: true }) }); } catch (e) { status = "error"; + errorMessage = e instanceof Error ? e.message : String(e); throw e; } finally { sendInfo("", { operationName: "lmTool.getFileStructure", status, - resultCount: String(resultCount), - durationMs: String(Date.now() - startTime), + ...(errorMessage && { errorMessage }), + resultCount, + durationMs: Date.now() - startTime, }); } }, @@ -169,6 +172,7 @@ const findSymbolTool: vscode.LanguageModelTool = { const startTime = Date.now(); let resultCount = 0; let status = "success"; + let errorMessage = ""; try { const symbols = await vscode.commands.executeCommand( "vscode.executeWorkspaceSymbolProvider", options.input.query, @@ -187,13 +191,15 @@ const findSymbolTool: vscode.LanguageModelTool = { return toResult({ results, total: symbols.length }); } catch (e) { status = "error"; + errorMessage = e instanceof Error ? e.message : String(e); throw e; } finally { sendInfo("", { operationName: "lmTool.findSymbol", status, - resultCount: String(resultCount), - durationMs: String(Date.now() - startTime), + ...(errorMessage && { errorMessage }), + resultCount, + durationMs: Date.now() - startTime, }); } }, From 952342e73953f27bcfd63e888e549bdc5b5bef96 Mon Sep 17 00:00:00 2001 From: wenyt <75360946+wenytang-ms@users.noreply.github.com> Date: Wed, 6 May 2026 12:51:54 +0800 Subject: [PATCH 300/352] fix: adjust parametry to require the right name to file uri (#1000) --- package.json | 4 ++-- .../instruments/javaLspContext.instructions.md | 2 +- resources/skills/java-lsp-tools/SKILL.md | 2 +- src/copilot/tools/javaContextTools.ts | 16 ++++++++++++---- 4 files changed, 16 insertions(+), 8 deletions(-) diff --git a/package.json b/package.json index aa3c84ce..765970b7 100644 --- a/package.json +++ b/package.json @@ -52,7 +52,7 @@ { "name": "lsp_java_getFileStructure", "toolReferenceName": "javaFileStructure", - "modelDescription": "Get the structure (classes, methods, fields, inner classes) of a Java file. Returns a hierarchical outline with symbol kinds and line ranges in ~100 tokens.\n\nWhen to use:\n- Before reading a Java file, to understand its layout and find specific line ranges\n- Instead of read_file on the entire file — use this first, then read_file on specific lines\n- When you need to know what methods/fields a class has\n\nWhen NOT to use:\n- For non-Java files (use read_file instead)\n- To search across multiple files (use lsp_java_findSymbol instead)", + "modelDescription": "Get the outline (classes, methods, fields) of a Java file with symbol kinds and line ranges.\n\nUse before read_file to find specific line ranges. For searching across files, use lsp_java_findSymbol instead.\n\nOnly use file paths confirmed from prior tool results or user input. If unsure, call lsp_java_findSymbol first.", "displayName": "Java: Get File Structure", "canBeReferencedInPrompt": true, "icon": "$(symbol-class)", @@ -62,7 +62,7 @@ "properties": { "uri": { "type": "string", - "description": "Java file path (workspace-relative or full URI)" + "description": "Workspace-relative path to a Java file. Must be a known path from prior tool results or user input — do not guess." } }, "required": [ diff --git a/resources/instruments/javaLspContext.instructions.md b/resources/instruments/javaLspContext.instructions.md index be0d015c..2c975a19 100644 --- a/resources/instruments/javaLspContext.instructions.md +++ b/resources/instruments/javaLspContext.instructions.md @@ -10,5 +10,5 @@ For Java files, two compiler-accurate `lsp_java_*` tools are available and retur These are deferred tools. Load them with `tool_search_tool_regex` using pattern `lsp_java_` before first use. -Prefer these over `grep_search`, `search_subagent`, `semantic_search`, `file_search`, or full-file `read_file` when navigating Java symbols. Fall back to `grep_search` if a tool returns empty or errors. +Prefer these over `grep_search`, `search_subagent`, `semantic_search`, `file_search`, or full-file `read_file` when navigating Java symbols. Always use `findSymbol` to discover file paths before passing them to `getFileStructure` — do not guess paths. Fall back to `grep_search` if a tool returns empty or errors. diff --git a/resources/skills/java-lsp-tools/SKILL.md b/resources/skills/java-lsp-tools/SKILL.md index 04936e92..56a74cac 100644 --- a/resources/skills/java-lsp-tools/SKILL.md +++ b/resources/skills/java-lsp-tools/SKILL.md @@ -17,7 +17,7 @@ Search for Java symbol definitions (classes, methods, fields) by name across the ### `lsp_java_getFileStructure` Get hierarchical outline of a Java file (classes, methods, fields) with line ranges. -- Input: `{ uri }` — workspace-relative path or full URI +- Input: `{ uri }` — workspace-relative path. Must be a known path from prior tool results or user input — do not guess - Output: symbol tree with `L start-end` ranges (~100 tokens) - **Use instead of** `read_file` full scan when you need to understand a file's layout diff --git a/src/copilot/tools/javaContextTools.ts b/src/copilot/tools/javaContextTools.ts index d5c584c8..7d8ba034 100644 --- a/src/copilot/tools/javaContextTools.ts +++ b/src/copilot/tools/javaContextTools.ts @@ -20,6 +20,7 @@ * - No classpath resolution, no dependency download */ +import * as path from "path"; import * as vscode from "vscode"; import { Commands } from "../../commands"; import { sendInfo } from "vscode-extension-telemetry-wrapper"; @@ -56,14 +57,14 @@ function resolveFileUri(input: string): vscode.Uri { let uri: vscode.Uri; - // Full URI — only allow the file: scheme - if (/^[a-zA-Z][a-zA-Z0-9+.-]*:\/\//.test(input) || /^[a-zA-Z][a-zA-Z0-9+.-]*:/.test(input)) { + if (input.includes("://")) { + // URI string (e.g. "file:///home/user/project/src/Main.java") uri = vscode.Uri.parse(input); if (uri.scheme !== "file") { throw new Error(`Unsupported URI scheme "${uri.scheme}". Only file: URIs are allowed.`); } - } else if (input.startsWith("/") || /^[a-zA-Z]:[/\\]/.test(input)) { - // Absolute path (Unix or Windows) + } else if (path.isAbsolute(input)) { + // Absolute filesystem path (Unix or Windows) uri = vscode.Uri.file(input); } else { // Relative path — resolve against first workspace folder @@ -99,6 +100,13 @@ const fileStructureTool: vscode.LanguageModelTool = { let errorMessage = ""; try { const uri = resolveFileUri(options.input.uri); + try { + await vscode.workspace.fs.stat(uri); + } catch { + status = "error"; + errorMessage = `File not found: ${vscode.workspace.asRelativePath(uri)}`; + return toResult({ error: errorMessage }); + } const symbols = await vscode.commands.executeCommand( "vscode.executeDocumentSymbolProvider", uri, ); From 578059f199c5bafd8ff5ae2a77d3a95f290e60a7 Mon Sep 17 00:00:00 2001 From: wenyt <75360946+wenytang-ms@users.noreply.github.com> Date: Wed, 6 May 2026 15:45:37 +0800 Subject: [PATCH 301/352] fix(e2e): stabilize Linux UI tests on small Xvfb display (#1003) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * fix(e2e): stabilize Linux UI tests on small Xvfb display The Linux-UI workflow was failing 6 steps across the two e2e plans on the 1024x768 Xvfb display used in CI. Three independent root causes: 1. Sticky pane-header click interception. The JAVA PROJECTS view is rendered inside the Explorer sidebar. With OUTLINE/TIMELINE/MAVEN sections also visible, the Java Projects pane has very little vertical space, and its sticky pane-header sits right on top of the first tree row. Playwright finds the my-app treeitem but the click is consumed by the section header (the Playwright call log shows the pane-header subtree intercepts pointer events). Fix: bump Xvfb to 1920x1080 and explicitly close the auxiliary (Chat) bar plus collapse OUTLINE, TIMELINE and the workspace root before interacting with the Java Projects tree. 2. Unsupported action syntax in java-dep-project-explorer.yaml. The strings "expand my-app tree item", "expand src/main/java tree item" and "expand com.mycompany.app tree item" do not match any pattern in autotest's ActionResolver (only "expandTreeItem " is recognized). They silently fell back to the command palette and no-op'd, so the tree never actually expanded and the subsequent verifyTreeItem checks for "com.mycompany.app" and "App" timed out. Fix: use the "expandTreeItem " form. 3. Hidden command-palette commands. java.view.package.linkWith FolderExplorer, unlinkWithFolderExplorer and revealInProjectExplorer all have "when": false on their commandPalette menu contribution and cannot be invoked via the command palette. They were no-ops in the previous plan (the reveal-in-project-explorer step was even opening the wrong "Create Java Project" picker). Fix: invoke them by command id with "executeVSCodeCommand". Also close the editor opened by the create-class step before the create-package step, so link-with-editor doesn't auto-expand the tree and push my-app under the sticky header again. * test(plans): replace executeVSCodeCommand with real UI for link/unlink/reveal Once autotest >=0.6.6 ships clickViewTitleAction and contextMenuOnEditorTab, exercise the actual VS Code UI affordances instead of dispatching the extension commands by id: - unlinkWithFolderExplorer / linkWithFolderExplorer → clickViewTitleAction on the JAVA PROJECTS pane title bar (overflow menu when sync is on/off). - revealInProjectExplorer → right-click the editor tab and pick 'Reveal in Java Project Explorer' from editor/title/context. These were palette-hidden ('when: false') and therefore previously fell back to executeVSCodeCommand. Verified locally end-to-end: 21/21 steps pass on the project-explorer plan and 39/39 on file-operations with the locally-built autotest. closeAuxiliaryBar still uses executeVSCodeCommand intentionally — it is a built-in VS Code helper (not extension UI under test) and now dispatches through a real keybinding rather than the broken driver.executeCommand path. --- .github/workflows/linuxUI.yml | 5 ++- test/e2e-plans/java-dep-file-operations.yaml | 37 ++++++++++++++++++- test/e2e-plans/java-dep-project-explorer.yaml | 36 ++++++++++++++---- 3 files changed, 69 insertions(+), 9 deletions(-) diff --git a/.github/workflows/linuxUI.yml b/.github/workflows/linuxUI.yml index ac24e494..1ee20df0 100644 --- a/.github/workflows/linuxUI.yml +++ b/.github/workflows/linuxUI.yml @@ -18,7 +18,10 @@ jobs: run: | sudo apt-get update sudo apt-get install -y libxkbfile-dev pkg-config libsecret-1-dev libxss1 dbus xvfb libgtk-3-0 libgbm1 - sudo /usr/bin/Xvfb :99 -screen 0 1024x768x24 > /dev/null 2>&1 & + # Use 1920x1080 so the Java Projects view (rendered inside the Explorer + # sidebar) gets enough vertical space. With 1024x768 the sticky + # pane-header overlapped tree rows and intercepted click events. + sudo /usr/bin/Xvfb :99 -screen 0 1920x1080x24 > /dev/null 2>&1 & sleep 3 - name: Set up JDK 21 diff --git a/test/e2e-plans/java-dep-file-operations.yaml b/test/e2e-plans/java-dep-file-operations.yaml index b06d3532..bf8f1156 100644 --- a/test/e2e-plans/java-dep-file-operations.yaml +++ b/test/e2e-plans/java-dep-file-operations.yaml @@ -25,14 +25,32 @@ setup: timeout: 180 settings: java.configuration.checkProjectSettingsExclusions: false + workbench.startupEditor: "none" steps: - # ── Setup: wait for LS, focus Java Projects ── + # ── Setup: wait for LS, free Explorer space, focus Java Projects ── - id: "ls-ready" action: "waitForLanguageServer" verify: "Java Language Server is ready" timeout: 180 + # Free horizontal space (Chat panel can take ~210px on right side) + - id: "close-aux-bar" + action: "executeVSCodeCommand workbench.action.closeAuxiliaryBar" + verify: "Auxiliary bar (Chat) closed" + + # Free vertical space inside Explorer so JAVA PROJECTS gets room. + # Without this the Java Projects pane-header overlaps tree rows on + # 1024x768 CI displays and click events get intercepted by the sticky header. + - id: "collapse-outline" + action: "collapseSidebarSection OUTLINE" + + - id: "collapse-timeline" + action: "collapseSidebarSection TIMELINE" + + - id: "collapse-workspace-root" + action: "collapseWorkspaceRoot" + - id: "focus-java-projects" action: "run command Java Projects: Focus on Java Projects View" verify: "Java Projects view is focused" @@ -68,11 +86,22 @@ steps: timeout: 15 # ── Test 2: create new package ── + # Close the editor opened by the previous step. With link-with-editor on, + # an open editor causes the JAVA PROJECTS tree to auto-expand, pushing + # my-app right under the sticky pane-header where clicks get intercepted. + - id: "close-editors-before-pkg" + action: "run command View: Close All Editors" + + - id: "collapse-workspace-root-2" + action: "collapseWorkspaceRoot" + - id: "focus-java-projects-2" action: "run command Java Projects: Focus on Java Projects View" + waitBefore: 1 - id: "click-project-node-2" action: "click my-app tree item" + waitBefore: 1 - id: "trigger-new-resource-2" action: "clickTreeItemAction my-app New..." @@ -99,6 +128,9 @@ steps: action: "open file AppToRename.java" waitBefore: 3 + - id: "collapse-workspace-root-3" + action: "collapseWorkspaceRoot" + - id: "focus-java-projects-3" action: "run command Java Projects: Focus on Java Projects View" waitBefore: 3 @@ -146,6 +178,9 @@ steps: action: "open file AppToDelete.java" waitBefore: 5 + - id: "collapse-workspace-root-4" + action: "collapseWorkspaceRoot" + - id: "focus-java-projects-4" action: "run command Java Projects: Focus on Java Projects View" waitBefore: 2 diff --git a/test/e2e-plans/java-dep-project-explorer.yaml b/test/e2e-plans/java-dep-project-explorer.yaml index 1bdb3656..cc0a0eea 100644 --- a/test/e2e-plans/java-dep-project-explorer.yaml +++ b/test/e2e-plans/java-dep-project-explorer.yaml @@ -21,6 +21,7 @@ setup: timeout: 180 settings: java.configuration.checkProjectSettingsExclusions: false + workbench.startupEditor: "none" steps: # ── Wait for LS ready ── @@ -29,6 +30,20 @@ steps: verify: "Java Language Server is ready" timeout: 180 + # Free horizontal & vertical space so JAVA PROJECTS gets enough room. + - id: "close-aux-bar" + action: "executeVSCodeCommand workbench.action.closeAuxiliaryBar" + verify: "Auxiliary bar (Chat) closed" + + - id: "collapse-outline" + action: "collapseSidebarSection OUTLINE" + + - id: "collapse-timeline" + action: "collapseSidebarSection TIMELINE" + + - id: "collapse-workspace-root" + action: "collapseWorkspaceRoot" + # ── Test 1: javaProjectExplorer.focus ── - id: "focus-java-projects" action: "run command Java Projects: Focus on Java Projects View" @@ -45,11 +60,13 @@ steps: timeout: 15 # ── Test 2: linkWithFolderExplorer ── + # NOTE: action resolver only matches "expandTreeItem " — strings like + # "expand my-app tree item" silently fall back to command palette and no-op. - id: "expand-project" - action: "expand my-app tree item" + action: "expandTreeItem my-app" - id: "expand-src" - action: "expand src/main/java tree item" + action: "expandTreeItem src/main/java" waitBefore: 2 - id: "verify-package" @@ -60,7 +77,7 @@ steps: timeout: 15 - id: "expand-package" - action: "expand com.mycompany.app tree item" + action: "expandTreeItem com.mycompany.app" waitBefore: 2 - id: "verify-app-class" @@ -72,8 +89,12 @@ steps: timeout: 15 # ── Test 3: unlinkWithFolderExplorer ── + # Click the title-bar action ("Unlink with Editor") in the JAVA PROJECTS pane. + # When `config.java.dependency.syncWithFolderExplorer == true` (the default), + # the package contributes the Unlink button to overflow_10@20 — clickViewTitleAction + # locates it directly or via the "Views and More Actions..." overflow menu. - id: "unlink-editor" - action: "run command Java: Unlink with Editor" + action: 'clickViewTitleAction "Java Projects" "Unlink with Editor"' verify: "Editor unlinked from tree" - id: "open-rename-file" @@ -84,11 +105,12 @@ steps: verify: "Tree should not auto-expand to AppToRename" - id: "relink-editor" - action: "run command Java: Link with Editor" + action: 'clickViewTitleAction "Java Projects" "Link with Editor"' verify: "Editor re-linked with tree" # ── Test 4: revealInProjectExplorer ── - # Collapse all tree nodes, then reveal App.java from editor + # Collapse all tree nodes, then reveal App.java by right-clicking the editor tab + # → "Reveal in Java Project Explorer" (contributed to editor/title/context). - id: "collapse-all" action: "run command View: Collapse All" verify: "Collapse tree to reset state" @@ -98,7 +120,7 @@ steps: waitBefore: 2 - id: "reveal-in-project-explorer" - action: "run command Java: Reveal in Java Project Explorer" + action: 'contextMenuOnEditorTab "App.java" "Reveal in Java Project Explorer"' waitBefore: 2 - id: "verify-revealed" From acb0ded8fbf8a9cbf4e363e995b1cd57be035f45 Mon Sep 17 00:00:00 2001 From: wenyt <75360946+wenytang-ms@users.noreply.github.com> Date: Thu, 7 May 2026 10:19:21 +0800 Subject: [PATCH 302/352] fix(e2e): collapse JAVA PROJECTS tree before second click-project-node (#1009) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The Test 1 `enter-class-name App2` step opens App2.java in the editor. With link-with-editor on (default), this auto-expands the JAVA PROJECTS tree to my-app → src/main/java → com.mycompany.app → App2.java to reveal the newly created file. When Test 2 then closes editors and tries to click the my-app root node again, the tree is still expanded so my-app is no longer at row 0. Even after `focus-java-projects`, the row gets scrolled, and the sticky JAVA PROJECTS pane-header (.pane-header .title) intercepts the click. CI logs show the click hit the codicon-collapse-all button on the view title bar instead of the my-app row, causing `click-project-node-2` to fail. `collapseWorkspaceRoot` only collapses the Explorer view's workspace root, not the JAVA PROJECTS view. Use the view's own `Collapse All` title-bar action via clickViewTitleAction (autotest 0.6.6+) to reset the tree state, putting my-app back at row 0 below the pane-header. Verified locally: 40/40 steps pass with the new collapse step. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- test/e2e-plans/java-dep-file-operations.yaml | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/test/e2e-plans/java-dep-file-operations.yaml b/test/e2e-plans/java-dep-file-operations.yaml index bf8f1156..59032d51 100644 --- a/test/e2e-plans/java-dep-file-operations.yaml +++ b/test/e2e-plans/java-dep-file-operations.yaml @@ -99,6 +99,13 @@ steps: action: "run command Java Projects: Focus on Java Projects View" waitBefore: 1 + # Test 1 expanded my-app → src/main/java → com.mycompany.app to reveal the + # newly-created App2.java. Reset the JAVA PROJECTS tree so my-app is back + # at row 0 and not occluded by the sticky pane-header on the next click. + - id: "collapse-java-projects-tree-2" + action: 'clickViewTitleAction "Java Projects" "Collapse All"' + waitBefore: 1 + - id: "click-project-node-2" action: "click my-app tree item" waitBefore: 1 From 53a6801535626e14a87e671f767b90d2a8c089f4 Mon Sep 17 00:00:00 2001 From: wenyt <75360946+wenytang-ms@users.noreply.github.com> Date: Thu, 7 May 2026 13:42:31 +0800 Subject: [PATCH 303/352] perf: narrow to java project to show the explorer (#1010) * perf: narrow to java project to show the explorer * test: add test cases * test(e2e): use expectConfirmDialog for delete confirm The original windowsUI failure on this PR (run 25473266463) showed delete-context-menu silently passing while the Delete command never fired, only surfacing 30s later via verify-deleted. Root cause: the lenient confirmDialog swallowed the missing dialog and the substring-only contextMenu matcher did not validate the click landed. vscjava/vscode-autotest 0.6.7 fixes both: contextMenuOnTreeItem now pre-selects, smart-matches the menu item, and verifies the menu dismisses; expectConfirmDialog throws when the dialog is absent. This change opts the delete confirm step into the strict variant so a missing dialog fails fast at the action site instead of being masked. The lenient confirmDialog is kept for the rename flow (handle-rename-dialog) where the dialog is optional depending on user settings. The CI Setup autotest step continues to install @latest from npm; this PR is expected to land after autotest 0.6.7 is published so the new verb is available. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --------- Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- src/extension.ts | 60 +++++++++++++- test/e2e-plans/java-dep-file-operations.yaml | 7 +- test/index.ts | 11 +++ test/non-java-gradle-suite/index.ts | 41 ++++++++++ .../projectExplorerActivation.test.ts | 80 +++++++++++++++++++ test/non-java-gradle/build.gradle | 10 +++ .../src/main/groovy/Hello.groovy | 5 ++ test/suite/extension.test.ts | 12 +++ 8 files changed, 222 insertions(+), 4 deletions(-) create mode 100644 test/non-java-gradle-suite/index.ts create mode 100644 test/non-java-gradle-suite/projectExplorerActivation.test.ts create mode 100644 test/non-java-gradle/build.gradle create mode 100644 test/non-java-gradle/src/main/groovy/Hello.groovy diff --git a/src/extension.ts b/src/extension.ts index 4c5c9637..86d6e44a 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -3,7 +3,7 @@ import * as path from "path"; import { - commands, Diagnostic, Extension, ExtensionContext, extensions, languages, + commands, Diagnostic, Disposable, Extension, ExtensionContext, extensions, languages, Range, tasks, TextDocument, TextEditor, Uri, window, workspace } from "vscode"; import { dispose as disposeTelemetryWrapper, initializeFromJsonFile, instrumentOperation, instrumentOperationAsVsCodeCommand, sendInfo } from "vscode-extension-telemetry-wrapper"; @@ -40,7 +40,63 @@ export async function activate(context: ExtensionContext): Promise { contextManager.setContextValue(Context.WORKSPACE_CONTAINS_BUILD_FILES, true); } }); - contextManager.setContextValue(Context.EXTENSION_ACTIVATED, true); + await activateJavaProjectExplorerWhenJavaContentExists(context); +} + +/** + * The extension is activated by `workspaceContains:*.gradle*` as well, which fires for any + * Gradle workspace regardless of language (Groovy/Grails/Kotlin/etc.). Showing the + * "Java Projects" view in such workspaces is annoying for non-Java users. To avoid that, + * we only flip the `java:projectManagerActivated` context (which controls the view's + * visibility) when we are confident the workspace actually contains Java content: + * 1. The active editor is a Java file (typical when activated via `onLanguage:java`). + * 2. The workspace contains Maven/Eclipse Java metadata (`pom.xml` / `.classpath`). + * 3. The workspace contains at least one `*.java` source file. + * For Gradle-only workspaces without Java sources we install a watcher so the view will + * appear automatically once a Java file is added later. + */ +async function activateJavaProjectExplorerWhenJavaContentExists(context: ExtensionContext): Promise { + let activated = false; + const setActivated = () => { + if (activated) { + return; + } + activated = true; + contextManager.setContextValue(Context.EXTENSION_ACTIVATED, true); + }; + + // Any already-loaded Java document (active or not) is a strong signal. This also covers + // the case where the extension is activated by `onLanguage:java` but `activeTextEditor` + // has not yet been populated. + if (workspace.textDocuments.some((doc) => doc.languageId === "java") + || window.activeTextEditor?.document.languageId === "java") { + setActivated(); + return; + } + + const [javaProjectMetadata, javaSources] = await Promise.all([ + workspace.findFiles("{**/pom.xml,**/.classpath}", undefined, 1), + workspace.findFiles("**/*.java", undefined, 1), + ]); + if (javaProjectMetadata.length > 0 || javaSources.length > 0) { + setActivated(); + return; + } + + // No Java content detected yet. Listen for it to appear via any of these channels: + // - A `*.java` source file being created in the workspace (FileSystemWatcher). + // - A Java document being opened later (e.g. a single file from outside the workspace). + const javaFileWatcher = workspace.createFileSystemWatcher("**/*.java"); + const disposables: Disposable[] = [ + javaFileWatcher, + javaFileWatcher.onDidCreate(setActivated), + workspace.onDidOpenTextDocument((doc) => { + if (doc.languageId === "java") { + setActivated(); + } + }), + ]; + context.subscriptions.push(...disposables); } async function activateExtension(_operationId: string, context: ExtensionContext): Promise { diff --git a/test/e2e-plans/java-dep-file-operations.yaml b/test/e2e-plans/java-dep-file-operations.yaml index 59032d51..7b89d837 100644 --- a/test/e2e-plans/java-dep-file-operations.yaml +++ b/test/e2e-plans/java-dep-file-operations.yaml @@ -196,9 +196,12 @@ steps: action: "contextMenu AppToDelete Delete" verify: "Delete confirmation triggered" - # VSCode shows a platform-specific confirmation dialog for delete + # VSCode shows a platform-specific confirmation dialog for delete. + # Use the strict variant: throw if the dialog is not present, so a + # silently-failed delete-context-menu surfaces here rather than 30s later + # at verify-deleted. Requires @vscjava/vscode-autotest >= 0.6.7. - id: "confirm-delete" - action: "confirmDialog" + action: "expectConfirmDialog" - id: "wait-delete" action: "wait 3 seconds" diff --git a/test/index.ts b/test/index.ts index c89db539..f9db1d22 100644 --- a/test/index.ts +++ b/test/index.ts @@ -98,6 +98,17 @@ async function main(): Promise { ], }); + // Run test for non-Java Gradle project (regression test for #921) + await runTests({ + vscodeExecutablePath, + extensionDevelopmentPath, + extensionTestsPath: path.resolve(__dirname, "./non-java-gradle-suite"), + launchArgs: [ + path.join(__dirname, "..", "..", "test", "non-java-gradle"), + `--user-data-dir=${userDir}`, + ], + }); + process.exit(0); } catch (err) { diff --git a/test/non-java-gradle-suite/index.ts b/test/non-java-gradle-suite/index.ts new file mode 100644 index 00000000..3e503ad8 --- /dev/null +++ b/test/non-java-gradle-suite/index.ts @@ -0,0 +1,41 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT license. + +import * as glob from "glob"; +import * as Mocha from "mocha"; +import * as path from "path"; + +export function run(): Promise { + // Create the mocha test + const mocha = new Mocha({ + ui: "tdd", + color: true, + timeout: 1 * 60 * 1000, + }); + + const testsRoot = __dirname; + + return new Promise((c, e) => { + glob("**/**.test.js", { cwd: testsRoot }, (err, files) => { + if (err) { + return e(err); + } + + // Add files to the test suite + files.forEach((f) => mocha.addFile(path.resolve(testsRoot, f))); + + try { + // Run the mocha test + mocha.run((failures) => { + if (failures > 0) { + e(new Error(`${failures} tests failed.`)); + } else { + c(); + } + }); + } catch (err) { + e(err); + } + }); + }); +} diff --git a/test/non-java-gradle-suite/projectExplorerActivation.test.ts b/test/non-java-gradle-suite/projectExplorerActivation.test.ts new file mode 100644 index 00000000..6161fc0e --- /dev/null +++ b/test/non-java-gradle-suite/projectExplorerActivation.test.ts @@ -0,0 +1,80 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT license. + +import * as assert from "assert"; +import * as fse from "fs-extra"; +import * as path from "path"; +import { extensions, Uri, workspace } from "vscode"; +import { contextManager } from "../../extension.bundle"; +import { sleep } from "../util"; + +const PROJECT_MANAGER_ACTIVATED = "java:projectManagerActivated"; + +// tslint:disable: only-arrow-functions +/** + * Regression tests for https://github.com/microsoft/vscode-java-dependency/issues/921 + * + * The "Java Projects" explorer view's visibility is gated by the `java:projectManagerActivated` + * context. For non-Java Gradle workspaces (e.g. Groovy/Grails) the view used to appear + * unconditionally, which annoyed users that never write Java. The activation logic now + * defers setting that context until actual Java content is detected, and reacts when a + * Java file is added later. + */ +suite("Non-Java Gradle Workspace Activation Tests", () => { + + const workspaceRoot = workspace.workspaceFolders![0].uri.fsPath; + const generatedJavaFile = path.join(workspaceRoot, "Generated.java"); + + suiteSetup(async () => { + // Make sure no leftover from a previous failed run pollutes the workspace. + await fse.remove(generatedJavaFile); + // Activation is auto-triggered by `workspaceContains:build.gradle`, but await it + // explicitly so the test does not race with the activation function. + await extensions.getExtension("vscjava.vscode-java-dependency")!.activate(); + }); + + suiteTeardown(async () => { + await fse.remove(generatedJavaFile); + }); + + test("Should not flip projectManagerActivated when the workspace has no Java content", function() { + const activated = contextManager.getContextValue(PROJECT_MANAGER_ACTIVATED); + assert.notStrictEqual( + activated, + true, + "Java Projects view should stay hidden in a non-Java Gradle workspace (issue #921)", + ); + }); + + test("Should flip projectManagerActivated when a Java source file appears later", async function() { + this.timeout(20 * 1000); + + // Sanity check: still inactive before the file is created. + assert.notStrictEqual( + contextManager.getContextValue(PROJECT_MANAGER_ACTIVATED), + true, + ); + + await fse.outputFile( + generatedJavaFile, + "public class Generated { public static void main(String[] args) {} }\n", + ); + + // Wait for the FileSystemWatcher's onDidCreate event to propagate. + const deadline = Date.now() + 10 * 1000; + while (contextManager.getContextValue(PROJECT_MANAGER_ACTIVATED) !== true + && Date.now() < deadline) { + await sleep(200); + } + + assert.strictEqual( + contextManager.getContextValue(PROJECT_MANAGER_ACTIVATED), + true, + "Java Projects view should become visible after a *.java file is created", + ); + + // Sanity: file actually lives where we expect, in case the watcher is reacting to + // some other event source. + assert.ok(await fse.pathExists(Uri.file(generatedJavaFile).fsPath)); + }); +}); diff --git a/test/non-java-gradle/build.gradle b/test/non-java-gradle/build.gradle new file mode 100644 index 00000000..4311cf43 --- /dev/null +++ b/test/non-java-gradle/build.gradle @@ -0,0 +1,10 @@ +// A Gradle build file used to simulate a non-Java workspace (e.g. Groovy/Grails) +// that should NOT trigger the "Java Projects" explorer view. +// See: https://github.com/microsoft/vscode-java-dependency/issues/921 +plugins { + id 'groovy' +} + +repositories { + mavenCentral() +} diff --git a/test/non-java-gradle/src/main/groovy/Hello.groovy b/test/non-java-gradle/src/main/groovy/Hello.groovy new file mode 100644 index 00000000..4b6bebec --- /dev/null +++ b/test/non-java-gradle/src/main/groovy/Hello.groovy @@ -0,0 +1,5 @@ +class Hello { + static void main(String[] args) { + println 'Hello from Groovy!' + } +} diff --git a/test/suite/extension.test.ts b/test/suite/extension.test.ts index 8b6e2864..625b9957 100644 --- a/test/suite/extension.test.ts +++ b/test/suite/extension.test.ts @@ -3,6 +3,7 @@ import * as assert from "assert"; import * as vscode from "vscode"; +import { contextManager } from "../../extension.bundle"; // tslint:disable: only-arrow-functions // Defines a Mocha test suite to group tests of similar kind together @@ -16,4 +17,15 @@ suite("Extension Tests", () => { await vscode.extensions.getExtension("vscjava.vscode-java-dependency")!.activate(); assert.ok(true); }); + + test("Should flip projectManagerActivated when the workspace contains Java content", async function() { + await vscode.extensions.getExtension("vscjava.vscode-java-dependency")!.activate(); + // The general suite runs against `test/java9`, which contains *.java sources, so the + // explorer-visibility context must be set. Guards against regressions of issue #921 in + // the opposite direction (i.e. the view erroneously hidden for real Java workspaces). + assert.strictEqual( + contextManager.getContextValue("java:projectManagerActivated"), + true, + ); + }); }); From 20dd990e615d6f8f7349eec275bd2a8621058070 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 9 May 2026 16:08:44 +0800 Subject: [PATCH 304/352] chore(deps-dev): Bump fast-uri from 3.1.0 to 3.1.2 (#1011) Bumps [fast-uri](https://github.com/fastify/fast-uri) from 3.1.0 to 3.1.2. - [Release notes](https://github.com/fastify/fast-uri/releases) - [Commits](https://github.com/fastify/fast-uri/compare/v3.1.0...v3.1.2) --- updated-dependencies: - dependency-name: fast-uri dependency-version: 3.1.2 dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index 96412282..f627f457 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1718,9 +1718,9 @@ } }, "node_modules/fast-uri": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.0.tgz", - "integrity": "sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.2.tgz", + "integrity": "sha512-rVjf7ArG3LTk+FS6Yw81V1DLuZl1bRbNrev6Tmd/9RaroeeRRJhAt7jg/6YFxbvAQXUCavSoZhPPj6oOx+5KjQ==", "dev": true, "funding": [ { @@ -1731,8 +1731,7 @@ "type": "opencollective", "url": "https://opencollective.com/fastify" } - ], - "license": "BSD-3-Clause" + ] }, "node_modules/fastest-levenshtein": { "version": "1.0.16", @@ -5404,9 +5403,9 @@ } }, "fast-uri": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.0.tgz", - "integrity": "sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.2.tgz", + "integrity": "sha512-rVjf7ArG3LTk+FS6Yw81V1DLuZl1bRbNrev6Tmd/9RaroeeRRJhAt7jg/6YFxbvAQXUCavSoZhPPj6oOx+5KjQ==", "dev": true }, "fastest-levenshtein": { From a67c9d5b22635d61e6347fd0868c2babb650b573 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 11 May 2026 09:34:37 +0800 Subject: [PATCH 305/352] chore(deps): Bump axios from 1.15.0 to 1.16.0 (#1001) Bumps [axios](https://github.com/axios/axios) from 1.15.0 to 1.16.0. - [Release notes](https://github.com/axios/axios/releases) - [Changelog](https://github.com/axios/axios/blob/v1.x/CHANGELOG.md) - [Commits](https://github.com/axios/axios/compare/v1.15.0...v1.16.0) --- updated-dependencies: - dependency-name: axios dependency-version: 1.16.0 dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index f627f457..cc3e733f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1076,11 +1076,11 @@ "integrity": "sha512-aDczADvlvTGajTDjcjpJMqRkOF6Qdz3YbPZm/PyW6tKPkx2hlYBzxMhEywM/tU72HrVZjgl5VCdRuMlA7pZ8Gw==" }, "node_modules/axios": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.15.0.tgz", - "integrity": "sha512-wWyJDlAatxk30ZJer+GeCWS209sA42X+N5jU2jy6oHTp7ufw8uzUTVFBX9+wTfAlhiJXGS0Bq7X6efruWjuK9Q==", + "version": "1.16.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.16.0.tgz", + "integrity": "sha512-6hp5CwvTPlN2A31g5dxnwAX0orzM7pmCRDLnZSX772mv8WDqICwFjowHuPs04Mc8deIld1+ejhtaMn5vp6b+1w==", "dependencies": { - "follow-redirects": "^1.15.11", + "follow-redirects": "^1.16.0", "form-data": "^4.0.5", "proxy-from-env": "^2.1.0" } @@ -4961,11 +4961,11 @@ "integrity": "sha512-aDczADvlvTGajTDjcjpJMqRkOF6Qdz3YbPZm/PyW6tKPkx2hlYBzxMhEywM/tU72HrVZjgl5VCdRuMlA7pZ8Gw==" }, "axios": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.15.0.tgz", - "integrity": "sha512-wWyJDlAatxk30ZJer+GeCWS209sA42X+N5jU2jy6oHTp7ufw8uzUTVFBX9+wTfAlhiJXGS0Bq7X6efruWjuK9Q==", + "version": "1.16.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.16.0.tgz", + "integrity": "sha512-6hp5CwvTPlN2A31g5dxnwAX0orzM7pmCRDLnZSX772mv8WDqICwFjowHuPs04Mc8deIld1+ejhtaMn5vp6b+1w==", "requires": { - "follow-redirects": "^1.15.11", + "follow-redirects": "^1.16.0", "form-data": "^4.0.5", "proxy-from-env": "^2.1.0" } From adb622374a3822e7108afd0bfee452edb09b5f1a Mon Sep 17 00:00:00 2001 From: wenyt <75360946+wenytang-ms@users.noreply.github.com> Date: Thu, 14 May 2026 10:25:45 +0800 Subject: [PATCH 306/352] chore: bump version to 0.27.3 (#1013) * chore: bump version to 0.27.3 Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * chore: stop stripping LLM contributions from stable builds Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * chore: drop redundant prepare-stable-build script package.json already has preview=false so the stable build step is a no-op. Removed both the script and the corresponding Azure DevOps pipeline step. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --------- Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .azure-pipelines/rc.yml | 7 ------- CHANGELOG.md | 9 +++++++++ package-lock.json | 4 ++-- package.json | 2 +- scripts/prepare-stable-build.js | 17 ----------------- 5 files changed, 12 insertions(+), 27 deletions(-) delete mode 100644 scripts/prepare-stable-build.js diff --git a/.azure-pipelines/rc.yml b/.azure-pipelines/rc.yml index 07ab4763..1f7bd599 100644 --- a/.azure-pipelines/rc.yml +++ b/.azure-pipelines/rc.yml @@ -88,13 +88,6 @@ extends: displayName: Replace AI Key inputs: script: npx json@9.0.6 -I -f package.json -e "this.aiKey=\"%AI_KEY%\"" - - task: PowerShell@2 - displayName: Update package.json for stable - inputs: - targetType: inline - script: |- - node ./scripts/prepare-stable-build.js - Move-Item -Path "./package.stable.json" -Destination "./package.json" -Force - task: CmdLine@2 displayName: vsce package inputs: diff --git a/CHANGELOG.md b/CHANGELOG.md index 38567da0..583e559e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,15 @@ All notable changes to the "vscode-java-dependency" extension will be documented The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/) and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html). +## 0.27.3 + +- feat - Enable Copilot LLM tools / chat skills / chat instructions in stable builds +- perf - Narrow to Java project to show the explorer in https://github.com/microsoft/vscode-java-dependency/pull/1010 +- perf - Use incremental build by default in https://github.com/microsoft/vscode-java-dependency/pull/998 +- feat - Add `revealInProjectExplorer` command in https://github.com/microsoft/vscode-java-dependency/pull/996 +- fix - Support Unicode identifiers in Java class name validation in https://github.com/microsoft/vscode-java-dependency/pull/993 +- fix - Adjust parameter to require the right name for file uri in https://github.com/microsoft/vscode-java-dependency/pull/1000 + ## 0.27.2 - perf - Progressive project tree view during import in https://github.com/microsoft/vscode-java-dependency/pull/982 diff --git a/package-lock.json b/package-lock.json index cc3e733f..f9865e74 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "vscode-java-dependency", - "version": "0.27.2", + "version": "0.27.3", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "vscode-java-dependency", - "version": "0.27.2", + "version": "0.27.3", "license": "MIT", "dependencies": { "@github/copilot-language-server": "^1.388.0", diff --git a/package.json b/package.json index 765970b7..6eed3522 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "vscode-java-dependency", "displayName": "Project Manager for Java", "description": "%description%", - "version": "0.27.2", + "version": "0.27.3", "publisher": "vscjava", "preview": false, "aiKey": "5c642b22-e845-4400-badb-3f8509a70777", diff --git a/scripts/prepare-stable-build.js b/scripts/prepare-stable-build.js deleted file mode 100644 index 2596a598..00000000 --- a/scripts/prepare-stable-build.js +++ /dev/null @@ -1,17 +0,0 @@ -const fs = require("fs"); - -const packageJsonPath = "./package.json"; -const packageJson = JSON.parse(fs.readFileSync(packageJsonPath).toString()); -packageJson.preview = false; - -if (packageJson.contributes) { - delete packageJson.contributes.languageModelTools; - delete packageJson.contributes.chatSkills; - delete packageJson.contributes.chatInstructions; - - if (packageJson.contributes.configuration && packageJson.contributes.configuration.properties) { - delete packageJson.contributes.configuration.properties["vscode-java-dependency.enableLspTools"]; - } -} - -fs.writeFileSync("./package.stable.json", `${JSON.stringify(packageJson, null, 2)}\n`); From 1c71f6e5cc856c9c9c50041be1c27c84a4393cd2 Mon Sep 17 00:00:00 2001 From: wenyt <75360946+wenytang-ms@users.noreply.github.com> Date: Thu, 14 May 2026 10:51:40 +0800 Subject: [PATCH 307/352] test: polish test case to support strict mode (#1012) * test: add test case to support strict mode * test: stabilize e2e plans against LLM-judged screenshot flakes The CI Windows-UI and Linux-UI jobs on PR #1012 were failing because the per-step LLM verification (autotest 0.7.1) downgraded several passing steps to failures based on screenshot mis-interpretation, even though deterministic verification (verifyTreeItem / verifyEditorTab / waitForLanguageServer) succeeded. Root cause: `step.verify` triggers LLM comparison of BEFORE/AFTER screenshots. When the action is a state-check, a transient input close, or an async refactor whose UI hasn't settled by capture time, the screenshots are unfit for a clean transition judgment and the LLM returns false negatives non-deterministically (different verdicts on identical UI between runs). Fix: drop `verify:` from steps where the LLM is structurally unreliable, keep it on steps with a clear visible transition: - `ls-ready`: `waitForLanguageServer` is itself the deterministic readiness check; the AFTER screenshot often shows the very next state ("Java: Building - 0%") which the LLM mis-reads as "not ready". - `enter-class-name`, `enter-package-name`, `enter-new-name`: `fillQuickInput`/`fillAnyInput` close the input on submit, so the AFTER screenshot has no visible evidence of the entered text. - `wait-package-creation`: package is created under a collapsed tree; no visible change. - `handle-rename-dialog`, `handle-refactor-preview`: best-effort optional steps; the UI element is often absent, making BEFORE==AFTER. - `verify-deleted`: deterministic `verifyTreeItem visible:false` is authoritative; tree refresh may lag the AFTER screenshot. - `verify-new-class-tab`, `verify-renamed-tab`: state-check steps with `verifyEditorTab`; BEFORE==AFTER at steady state, which a strict LLM mis-reads as "no transition". - `verify-project-node`, `verify-package`, `verify-app-class`, `verify-revealed`: state-check steps with `verifyTreeItem`. - `unlink-editor`, `relink-editor`: toggle a setting; no user-visible UI change in the screenshot. Also extended `wait-delete` to 6 seconds (was 3) so the AFTER screenshot has more time to reflect the tree refresh, and added a comment on `wait-after-open` explaining why it must remain LLM-only (the tree's expanded children include AppToRename, so `verifyTreeItem visible:false` is not applicable; the actual assertion is "tree state unchanged after opening the file with link-with-editor off"). Validated locally with the same Azure OpenAI o4-mini deployment used by CI: 7 consecutive `autotest run-all` invocations, last two clean (62/62, zero LLM downgrades, zero parse errors). Also adds .env / .env.* / test-results/** to .vscodeignore so local autotest artifacts aren't bundled into the published VSIX. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --------- Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .vscodeignore | 5 ++ test/e2e-plans/java-dep-file-operations.yaml | 75 ++++++++++++++----- test/e2e-plans/java-dep-project-explorer.yaml | 48 ++++++++---- 3 files changed, 97 insertions(+), 31 deletions(-) diff --git a/.vscodeignore b/.vscodeignore index f496bbbe..f3a42313 100644 --- a/.vscodeignore +++ b/.vscodeignore @@ -24,3 +24,8 @@ test-resources # Ignore output of code sign server/*.md **/*.log + +# Local env / autotest artifacts +.env +.env.* +test-results/** diff --git a/test/e2e-plans/java-dep-file-operations.yaml b/test/e2e-plans/java-dep-file-operations.yaml index 7b89d837..45deefe4 100644 --- a/test/e2e-plans/java-dep-file-operations.yaml +++ b/test/e2e-plans/java-dep-file-operations.yaml @@ -31,7 +31,12 @@ steps: # ── Setup: wait for LS, free Explorer space, focus Java Projects ── - id: "ls-ready" action: "waitForLanguageServer" - verify: "Java Language Server is ready" + # No `verify:` — `waitForLanguageServer` is itself the deterministic + # readiness check (it returns only when the Java Language Server status + # changes to "Ready"). The post-action screenshot frequently captures + # the very next state — "Java: Building - 0%" once Maven import begins — + # which a strict LLM mis-reads as "not ready", even though Ready was + # observed milliseconds earlier. timeout: 180 # Free horizontal space (Chat panel can take ~210px on right side) @@ -52,7 +57,7 @@ steps: action: "collapseWorkspaceRoot" - id: "focus-java-projects" - action: "run command Java Projects: Focus on Java Projects View" + action: "executeVSCodeCommand javaProjectExplorer.focus" verify: "Java Projects view is focused" - id: "wait-tree-load" @@ -76,11 +81,18 @@ steps: - id: "enter-class-name" action: "fillQuickInput App2" - verify: "Class name entered" + # NOTE: no `verify:` — `fillQuickInput` submits and closes the quick input. + # The before/after screenshots only show the input disappearing, which the + # screenshot-comparing LLM frequently mis-reads as "wrong UI element + # targeted". The deterministic `verifyEditorTab` on the next step is the + # ground truth for whether App2.java was created. - id: "verify-new-class-tab" action: "wait 2 seconds" - verify: "Editor tab App2.java should appear" + # No `verify:` — state-check step. The deterministic `verifyEditorTab` + # below is authoritative. BEFORE and AFTER screenshots are nearly + # identical at steady state (App2.java tab present in both), which a + # strict LLM can mis-read as "no change". verifyEditorTab: title: "App2.java" timeout: 15 @@ -89,6 +101,14 @@ steps: # Close the editor opened by the previous step. With link-with-editor on, # an open editor causes the JAVA PROJECTS tree to auto-expand, pushing # my-app right under the sticky pane-header where clicks get intercepted. + # + # App2.java is opened in a dirty editor by the New Class flow (the extension + # writes initial class boilerplate via the buffer), so we must save first + # — otherwise `Close All Editors` raises a "Save changes?" modal dialog + # that blocks every subsequent click for the rest of the run. + - id: "save-all-before-close" + action: "executeVSCodeCommand workbench.action.files.saveAll" + - id: "close-editors-before-pkg" action: "run command View: Close All Editors" @@ -96,14 +116,14 @@ steps: action: "collapseWorkspaceRoot" - id: "focus-java-projects-2" - action: "run command Java Projects: Focus on Java Projects View" + action: "executeVSCodeCommand javaProjectExplorer.focus" waitBefore: 1 # Test 1 expanded my-app → src/main/java → com.mycompany.app to reveal the # newly-created App2.java. Reset the JAVA PROJECTS tree so my-app is back # at row 0 and not occluded by the sticky pane-header on the next click. - id: "collapse-java-projects-tree-2" - action: 'clickViewTitleAction "Java Projects" "Collapse All"' + action: "executeVSCodeCommand workbench.actions.treeView.javaProjectExplorer.collapseAll" waitBefore: 1 - id: "click-project-node-2" @@ -122,11 +142,14 @@ steps: - id: "enter-package-name" action: "fillQuickInput com.mycompany.newpkg" - verify: "Package name entered" + # No `verify:` — quick input closes after submit and the new package is + # under a still-collapsed tree, so LLM can't see the change and downgrades + # the step. Package creation is a side-effect of the wizard finishing. - id: "wait-package-creation" action: "wait 3 seconds" - verify: "Package directory created" + # No `verify:` — tree is collapsed at this point so the new package isn't + # rendered; LLM screenshot comparison would erroneously downgrade. # ── Test 3: rename Java file ── # Open the target file, let link-with-editor reveal it in the tree, @@ -139,7 +162,7 @@ steps: action: "collapseWorkspaceRoot" - id: "focus-java-projects-3" - action: "run command Java Projects: Focus on Java Projects View" + action: "executeVSCodeCommand javaProjectExplorer.focus" waitBefore: 3 # Click the tree item first to select it @@ -154,26 +177,35 @@ steps: - id: "enter-new-name" action: "fillAnyInput AppRenamed" - verify: "New name entered and confirmed" + # No `verify:` — rename is async (status bar shows "Computing rename + # updates..." for several seconds) so the AFTER screenshot still shows + # the old name and LLM downgrades. `verify-renamed-tab` below uses + # deterministic `verifyEditorTab` against the new name as ground truth. waitBefore: 2 # Handle optional rename confirmation dialog — may not appear on all platforms - # (Electron native dialog is auto-dismissed by monkey-patch) + # (Electron native dialog is auto-dismissed by monkey-patch). + # No `verify:` — confirmDialog is best-effort (dialog may not appear). - id: "handle-rename-dialog" action: "confirmDialog" - verify: "Rename confirmation handled (if present)" - # Handle optional Refactor Preview panel + # Handle optional Refactor Preview panel. + # No `verify:` — tryClickButton is best-effort; if the Apply button does not + # appear because the refactor finished without preview, the before/after + # screenshots are identical and LLM downgrades. The deterministic + # `verify-renamed-tab` covers the real outcome. - id: "handle-refactor-preview" action: "tryClickButton Apply" - verify: "Refactor preview applied (if present)" - id: "wait-rename" action: "wait 3 seconds" - id: "verify-renamed-tab" action: "wait 1 seconds" - verify: "Editor tab AppRenamed should appear" + # No `verify:` — state-check step. `verifyEditorTab` is authoritative. + # By the time this runs, the rename has typically already completed + # (after wait-rename's 3s), so both BEFORE and AFTER show AppRenamed. + # A strict LLM mis-reads identical screenshots as "no transition". verifyEditorTab: title: "AppRenamed" timeout: 15 @@ -189,7 +221,7 @@ steps: action: "collapseWorkspaceRoot" - id: "focus-java-projects-4" - action: "run command Java Projects: Focus on Java Projects View" + action: "executeVSCodeCommand javaProjectExplorer.focus" waitBefore: 2 - id: "delete-context-menu" @@ -203,12 +235,19 @@ steps: - id: "confirm-delete" action: "expectConfirmDialog" + # Combined wait + verify in a single step: the deterministic verifyTreeItem + # with visible:false polls up to 15s for the tree to refresh, so a short + # explicit `wait 3` is enough to give the tree time to render before the + # AFTER screenshot is captured. - id: "wait-delete" - action: "wait 3 seconds" + action: "wait 6 seconds" - id: "verify-deleted" action: "wait 1 seconds" - verify: "AppToDelete tree item should disappear" + # No `verify:` — AFTER screenshot is captured immediately after the wait, + # but the tree's removal of AppToDelete may not yet be visually reflected + # on slower CI runners. The deterministic verifyTreeItem (visible:false) + # below polls for up to 15s and is authoritative. verifyTreeItem: name: "AppToDelete" visible: false diff --git a/test/e2e-plans/java-dep-project-explorer.yaml b/test/e2e-plans/java-dep-project-explorer.yaml index cc0a0eea..7e198f6b 100644 --- a/test/e2e-plans/java-dep-project-explorer.yaml +++ b/test/e2e-plans/java-dep-project-explorer.yaml @@ -27,7 +27,10 @@ steps: # ── Wait for LS ready ── - id: "ls-ready" action: "waitForLanguageServer" - verify: "Java Language Server is ready" + # No `verify:` — `waitForLanguageServer` is itself the deterministic + # readiness check. The AFTER screenshot may transiently show + # "Java: Building - 0%" (Maven import starts immediately after Ready), + # which a strict LLM mis-reads as a failure. timeout: 180 # Free horizontal & vertical space so JAVA PROJECTS gets enough room. @@ -45,8 +48,11 @@ steps: action: "collapseWorkspaceRoot" # ── Test 1: javaProjectExplorer.focus ── + # The view is contributed to the Explorer container, so the palette title is + # "Explorer: Focus on Java Projects View". Invoking the command id directly + # via executeVSCodeCommand is locale-independent and slightly faster. - id: "focus-java-projects" - action: "run command Java Projects: Focus on Java Projects View" + action: "executeVSCodeCommand javaProjectExplorer.focus" verify: "Java Projects view is focused" - id: "wait-tree-load" @@ -54,7 +60,7 @@ steps: - id: "verify-project-node" action: "wait 1 seconds" - verify: "my-app project node is visible in the tree" + # No `verify:` — state-check step; `verifyTreeItem` is authoritative. verifyTreeItem: name: "my-app" timeout: 15 @@ -71,7 +77,7 @@ steps: - id: "verify-package" action: "wait 1 seconds" - verify: "Package com.mycompany.app is visible" + # No `verify:` — state-check step; `verifyTreeItem` is authoritative. verifyTreeItem: name: "com.mycompany.app" timeout: 15 @@ -82,7 +88,7 @@ steps: - id: "verify-app-class" action: "wait 1 seconds" - verify: "App class node is visible (exact match, not App.java or AppToDelete)" + # No `verify:` — state-check step; `verifyTreeItem` is authoritative. verifyTreeItem: name: "App" exact: true @@ -95,24 +101,40 @@ steps: # locates it directly or via the "Views and More Actions..." overflow menu. - id: "unlink-editor" action: 'clickViewTitleAction "Java Projects" "Unlink with Editor"' - verify: "Editor unlinked from tree" + # No `verify:` — toggling the link-with-editor setting produces no visible + # change in the screenshot (tree selection persists from the prior reveal). + # The behavior is verified deterministically by `wait-after-open` below: + # after opening AppToRename.java, the tree must NOT auto-reveal it. - id: "open-rename-file" action: "open file AppToRename.java" - id: "wait-after-open" action: "wait 3 seconds" - verify: "Tree should not auto-expand to AppToRename" + # Stability check: with link-with-editor disabled, opening + # AppToRename.java must NOT change the Java Projects tree state. The + # BEFORE and AFTER screenshots are expected to look identical (tree + # state preserved), which is exactly what a comparison-only LLM + # verification can confirm reliably. We cannot use verifyTreeItem + # visible:false here because AppToRename is already visible (its + # parent package was expanded by earlier setup steps); the check is + # about tree-state stability, not item visibility. + verify: "Java Projects tree state is unchanged; opening AppToRename.java did not auto-reveal or auto-select anything new." - id: "relink-editor" action: 'clickViewTitleAction "Java Projects" "Link with Editor"' - verify: "Editor re-linked with tree" + # No `verify:` — same reason as `unlink-editor`. The behavior is verified + # deterministically downstream when revealInProjectExplorer locates App. # ── Test 4: revealInProjectExplorer ── - # Collapse all tree nodes, then reveal App.java by right-clicking the editor tab - # → "Reveal in Java Project Explorer" (contributed to editor/title/context). + # Collapse all tree nodes, then reveal App.java by invoking the contributed + # `java.view.package.revealInProjectExplorer` command. autotest 0.7.x has no + # contextMenuOnEditorTab action, so we drive the command directly via + # executeVSCodeCommand with a Uri-shaped POJO arg (the command reads + # `uri.fsPath` and reconstructs a proper Uri before use, so a plain object + # with `fsPath` is sufficient). - id: "collapse-all" - action: "run command View: Collapse All" + action: "executeVSCodeCommand workbench.actions.treeView.javaProjectExplorer.collapseAll" verify: "Collapse tree to reset state" - id: "open-app-file" @@ -120,12 +142,12 @@ steps: waitBefore: 2 - id: "reveal-in-project-explorer" - action: 'contextMenuOnEditorTab "App.java" "Reveal in Java Project Explorer"' + action: 'executeVSCodeCommand java.view.package.revealInProjectExplorer {"fsPath":"${workspaceFolder}/src/main/java/com/mycompany/app/App.java","scheme":"file"}' waitBefore: 2 - id: "verify-revealed" action: "wait 2 seconds" - verify: "App class should be revealed in Java Projects tree" + # No `verify:` — state-check step; `verifyTreeItem` is authoritative. verifyTreeItem: name: "App" exact: true From 36c094a79848c21494f53e7591c9f147e3599138 Mon Sep 17 00:00:00 2001 From: wenyt <75360946+wenytang-ms@users.noreply.github.com> Date: Mon, 18 May 2026 13:39:10 +0800 Subject: [PATCH 308/352] fix: implement lsp tools for stable (#1014) * fix: stable support lsp tools * perf: adjust the telemetry data --- src/copilot/tools/javaContextTools.ts | 70 +++++++++++++++++++++------ src/extension.ts | 11 +++-- 2 files changed, 62 insertions(+), 19 deletions(-) diff --git a/src/copilot/tools/javaContextTools.ts b/src/copilot/tools/javaContextTools.ts index 7d8ba034..78969811 100644 --- a/src/copilot/tools/javaContextTools.ts +++ b/src/copilot/tools/javaContextTools.ts @@ -39,6 +39,24 @@ function toResult(data: unknown): vscode.LanguageModelToolResult { ]); } +function getResponseCharCount(data: unknown): number { + return typeof data === "string" ? data.length : JSON.stringify(data, null, 2).length; +} + +function getToolErrorCode(error: unknown): string { + const message = error instanceof Error ? error.message : String(error); + if (message.includes("No workspace folder")) { + return "noWorkspaceFolder"; + } + if (message.includes("Unsupported URI scheme")) { + return "unsupportedUriScheme"; + } + if (message.includes("outside the current workspace")) { + return "outsideWorkspace"; + } + return "unexpectedError"; +} + /** * Resolve a file path to a vscode.Uri. * Accepts: @@ -97,38 +115,49 @@ const fileStructureTool: vscode.LanguageModelTool = { const startTime = Date.now(); let resultCount = 0; let status = "success"; - let errorMessage = ""; + let errorCode = ""; + let emptyReason = ""; + let responseCharCount = 0; try { const uri = resolveFileUri(options.input.uri); try { await vscode.workspace.fs.stat(uri); } catch { status = "error"; - errorMessage = `File not found: ${vscode.workspace.asRelativePath(uri)}`; - return toResult({ error: errorMessage }); + errorCode = "fileNotFound"; + const fileNotFoundPayload = { error: "File not found." }; + responseCharCount = getResponseCharCount(fileNotFoundPayload); + return toResult(fileNotFoundPayload); } const symbols = await vscode.commands.executeCommand( "vscode.executeDocumentSymbolProvider", uri, ); if (!symbols || symbols.length === 0) { status = "empty"; - return toResult({ error: "No symbols found. The file may not be recognized by the Java language server." }); + emptyReason = "documentSymbolProviderEmpty"; + const noSymbolsPayload = { error: "No symbols found. The file may not be recognized by the Java language server." }; + responseCharCount = getResponseCharCount(noSymbolsPayload); + return toResult(noSymbolsPayload); } const counter = { count: 0 }; const result = symbolsToJson(symbols, 0, counter); - const truncated = counter.count >= MAX_SYMBOL_NODES; resultCount = counter.count; - return toResult({ symbols: result, ...(truncated && { truncated: true }) }); + const truncated = counter.count >= MAX_SYMBOL_NODES; + const fileStructurePayload = { symbols: result, ...(truncated && { truncated: true }) }; + responseCharCount = getResponseCharCount(fileStructurePayload); + return toResult(fileStructurePayload); } catch (e) { status = "error"; - errorMessage = e instanceof Error ? e.message : String(e); + errorCode = errorCode || getToolErrorCode(e); throw e; } finally { sendInfo("", { operationName: "lmTool.getFileStructure", status, - ...(errorMessage && { errorMessage }), + ...(errorCode && { errorCode }), + ...(emptyReason && { emptyReason }), resultCount, + responseCharCount, durationMs: Date.now() - startTime, }); } @@ -179,34 +208,47 @@ const findSymbolTool: vscode.LanguageModelTool = { async invoke(options, _token) { const startTime = Date.now(); let resultCount = 0; + let totalResults = 0; + const limit = Math.min(Math.max(options.input.limit || 20, 1), 50); let status = "success"; - let errorMessage = ""; + let errorCode = ""; + let emptyReason = ""; + let responseCharCount = 0; try { const symbols = await vscode.commands.executeCommand( "vscode.executeWorkspaceSymbolProvider", options.input.query, ); if (!symbols || symbols.length === 0) { status = "empty"; - return toResult({ results: [], message: `No symbols matching '${options.input.query}' found.` }); + emptyReason = "workspaceSymbolNoMatch"; + const noMatchesPayload = { results: [], message: "No symbols found." }; + responseCharCount = getResponseCharCount(noMatchesPayload); + return toResult(noMatchesPayload); } - const limit = Math.min(Math.max(options.input.limit || 20, 1), 50); + totalResults = symbols.length; const results = symbols.slice(0, limit).map(s => ({ name: s.name, kind: vscode.SymbolKind[s.kind], location: `${vscode.workspace.asRelativePath(s.location.uri)}:${s.location.range.start.line + 1}`, })); resultCount = results.length; - return toResult({ results, total: symbols.length }); + const findSymbolPayload = { results, total: symbols.length }; + responseCharCount = getResponseCharCount(findSymbolPayload); + return toResult(findSymbolPayload); } catch (e) { status = "error"; - errorMessage = e instanceof Error ? e.message : String(e); + errorCode = getToolErrorCode(e); throw e; } finally { sendInfo("", { operationName: "lmTool.findSymbol", status, - ...(errorMessage && { errorMessage }), + ...(errorCode && { errorCode }), + ...(emptyReason && { emptyReason }), + limit, resultCount, + totalResults, + responseCharCount, durationMs: Date.now() - startTime, }); } diff --git a/src/extension.ts b/src/extension.ts index 86d6e44a..4142bfc8 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -144,14 +144,15 @@ async function activateExtension(_operationId: string, context: ExtensionContext )); setContextForDeprecatedTasks(); - // Register Copilot context providers after Java Language Server is ready - const isPrereleaseBuild = context.extension.packageJSON.preview === true; - if (!isPrereleaseBuild) { - return; - } + // Register Copilot context providers after Java Language Server is ready. languageServerApiManager.ready().then((isReady) => { const config = workspace.getConfiguration("vscode-java-dependency"); const isSettingEnabled = config.get("enableLspTools", false); + sendInfo("", { + operationName: "lmTool.registrationCheck", + javaLSReady: isReady ? "true" : "false", + lspToolsEnabled: isSettingEnabled ? "true" : "false", + }); if (isReady && isSettingEnabled) { registerJavaContextTools(context); } From 831cdacb76bbbc27102d765568c232792716e2bb Mon Sep 17 00:00:00 2001 From: wenyt <75360946+wenytang-ms@users.noreply.github.com> Date: Mon, 18 May 2026 13:54:24 +0800 Subject: [PATCH 309/352] build: bump up 0.27.4 (#1015) --- CHANGELOG.md | 4 ++++ package-lock.json | 4 ++-- package.json | 2 +- 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 583e559e..3ecb8ed1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,10 @@ All notable changes to the "vscode-java-dependency" extension will be documented The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/) and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html). +## 0.27.4 + +- fix - Implement LSP tools for stable builds in https://github.com/microsoft/vscode-java-dependency/pull/1014 + ## 0.27.3 - feat - Enable Copilot LLM tools / chat skills / chat instructions in stable builds diff --git a/package-lock.json b/package-lock.json index f9865e74..76eb46f1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "vscode-java-dependency", - "version": "0.27.3", + "version": "0.27.4", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "vscode-java-dependency", - "version": "0.27.3", + "version": "0.27.4", "license": "MIT", "dependencies": { "@github/copilot-language-server": "^1.388.0", diff --git a/package.json b/package.json index 6eed3522..e479af16 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "vscode-java-dependency", "displayName": "Project Manager for Java", "description": "%description%", - "version": "0.27.3", + "version": "0.27.4", "publisher": "vscjava", "preview": false, "aiKey": "5c642b22-e845-4400-badb-3f8509a70777", From e9ae84025b6a606690afaee65f5868103286cf4d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 22 May 2026 09:36:10 +0800 Subject: [PATCH 310/352] chore(deps): Bump @nevware21/ts-utils from 0.13.0 to 0.14.0 Bumps [@nevware21/ts-utils](https://github.com/nevware21/ts-utils) from 0.13.0 to 0.14.0. - [Release notes](https://github.com/nevware21/ts-utils/releases) - [Changelog](https://github.com/nevware21/ts-utils/blob/main/CHANGELOG.md) - [Commits](https://github.com/nevware21/ts-utils/compare/0.13.0...0.14.0) --- updated-dependencies: - dependency-name: "@nevware21/ts-utils" dependency-version: 0.14.0 dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 23 ++++++++++++++++------- 1 file changed, 16 insertions(+), 7 deletions(-) diff --git a/package-lock.json b/package-lock.json index 76eb46f1..a2be5ddb 100644 --- a/package-lock.json +++ b/package-lock.json @@ -422,10 +422,19 @@ } }, "node_modules/@nevware21/ts-utils": { - "version": "0.13.0", - "resolved": "https://registry.npmjs.org/@nevware21/ts-utils/-/ts-utils-0.13.0.tgz", - "integrity": "sha512-F3mD+DsUn9OiZmZc5tg0oKqrJCtiCstwx+wE+DNzFYh2cCRUuzTYdK9zGGP/au2BWvbOQ6Tqlbjr2+dT1P3AlQ==", - "license": "MIT" + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/@nevware21/ts-utils/-/ts-utils-0.14.0.tgz", + "integrity": "sha512-WoeqTIXQ8WPhl+lD2NbMHoAQ4sJl0n7EoRoDmVJui//Usg512enl9q1fdbVobuZt3omnxnmVsDrNIvPBvFgddQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/nevware21" + }, + { + "type": "other", + "url": "https://buymeacoffee.com/nevware21" + } + ] }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", @@ -4415,9 +4424,9 @@ } }, "@nevware21/ts-utils": { - "version": "0.13.0", - "resolved": "https://registry.npmjs.org/@nevware21/ts-utils/-/ts-utils-0.13.0.tgz", - "integrity": "sha512-F3mD+DsUn9OiZmZc5tg0oKqrJCtiCstwx+wE+DNzFYh2cCRUuzTYdK9zGGP/au2BWvbOQ6Tqlbjr2+dT1P3AlQ==" + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/@nevware21/ts-utils/-/ts-utils-0.14.0.tgz", + "integrity": "sha512-WoeqTIXQ8WPhl+lD2NbMHoAQ4sJl0n7EoRoDmVJui//Usg512enl9q1fdbVobuZt3omnxnmVsDrNIvPBvFgddQ==" }, "@nodelib/fs.scandir": { "version": "2.1.5", From 8b89050547c4e3b9ffef6040addace0e183f24c3 Mon Sep 17 00:00:00 2001 From: wenyt <75360946+wenytang-ms@users.noreply.github.com> Date: Thu, 28 May 2026 10:14:29 +0800 Subject: [PATCH 311/352] test: add E2E plans for view modes, new types, and build lifecycle (#1019) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * test: add E2E plans for view modes, new types, and build lifecycle Adds three new YAML test plans driven by @vscjava/vscode-autotest to cover Java Project Manager commands that were not previously exercised by the existing e2e plans. - java-dep-view-modes.yaml (33 steps) Hierarchical / Flat package view, Refresh, Hide / Show non-Java resources. Scopes verifyTreeItem to the Java Projects pane to avoid cross-view contamination from the File Explorer. - java-dep-new-types.yaml (66 steps) New Interface / Enum / Annotation / Abstract Class / File / Folder via the Java: New... quick-pick. Verifies file creation, opened editor tab, and tree-item presence under the source folder. - java-dep-build-lifecycle.yaml (20 steps) Build All / Rebuild All (workspace) and Build Project / Rebuild Project (per project context menu) and Reload Project From Active File (pom.xml editor title). Each build is followed by waitForLanguageServer to confirm the LS returns to Ready. java.project.clean.workspace is intentionally skipped because it triggers a VS Code window reload. All three plans pass locally against the packaged extension VSIX. * test: drive build / rebuild commands through real view-title UI Updates the three Java Project Manager E2E plans based on feedback that the setup steps were redundant and that build commands should exercise the actual UI affordances rather than short-circuiting via the keybinding bridge. Setup simplification (applied to all three plans): - Drop the no-op collapseSidebarSection OUTLINE / TIMELINE steps. Both panes are collapsed by default in a fresh VS Code session, so the steps did nothing and only produced confusing identical before/after screenshots. - Replace collapseWorkspaceRoot (which only collapsed the file tree inside the MAVEN pane) with collapseSidebarSection maven (which collapses the entire MAVEN pane). This gives JAVA PROJECTS the full vertical space. Build lifecycle plan — switch to real UI paths: - "Build All" now goes through clickViewTitleAction "Java Projects" "Build All" — clicks the $(tools) icon in the Java Projects view title bar, exercising the full button-rendering + when-clause + command-dispatch chain instead of bypassing it. - "Rebuild All" now goes through clickViewTitleAction "Java Projects" "Rebuild All" — the helper automatically falls through to the "Views and More Actions..." overflow menu when the action is not in the toolbar's navigation group. - "Build Project" / "Rebuild Project" already used the project context menu — unchanged. - "Reload Java Project" stays on executeVSCodeCommand: its editor title-bar button is conditional on java:reloadProjectActive, which is set by JDT.LS in a racy way that doesn't reliably flip for synthetic edits. The comment in the plan now documents the trade-off. Local results: view-modes 30/30 new-types 64/64 build-lifecycle 18/18 * test(view-modes): drive view-mode toggles through real UI The four toggle steps (switch-to-hierarchical, switch-to-flat, hide-non-java, show-non-java) previously fired their commands via executeVSCodeCommand (keybinding bridge), which sidestepped the actual user-facing entry point in the Java Projects view title-bar overflow menu. The `before`/`after` screenshots were nearly identical since no mouse interaction was modeled and the tree refresh is async, which gave no visual evidence the user-facing toggle actually works. Switch to clickViewTitleAction so each toggle goes through the real overflow menu. Combined with the driver-side pre-click sub-screenshots (autotest c24658f), each step now produces two click-evidence frames: the `...` overflow button hovered (with tooltip) and the menu item highlighted (e.g. "Hierarchical View" focused). Menu labels match package.nls.json: - "Hierarchical View" / "Flat View" - "Hide Non-Java Resources" / "Show Non-Java Resources" The Hide/Show labels mirror each other based on the config.java.project.explorer.showNonJavaResources context key, so the plan alternates between "Hide" (when currently shown) and "Show" (when currently hidden). Comments document this. Verified: java-dep-view-modes 30/30 passing locally. * test(new-types): collapse tree via real Collapse All toolbar button The five between-cycle collapseAll steps previously fired through executeVSCodeCommand (keybinding bridge), which exercised the command but skipped any UI verification. The Collapse All icon button in the Java Projects view title-bar is a real navigation-group toolbar action that users see and click — drive it through clickViewTitleAction so the click target is verified. With the driver-side pre-click sub-screenshot (autotest c24658f), each cycle now produces one frame showing the Collapse All button hovered with its tooltip rendered, proving the mouse landed on the right element. Other executeVSCodeCommand uses are kept as-is: - saveAll (Ctrl+S) — legitimate user keyboard path - closeAuxiliaryBar / javaProjectExplorer.focus — non-test-target setup Verified: java-dep-new-types 64/64 passing locally. --- test/e2e-plans/java-dep-build-lifecycle.yaml | 167 +++++++++++ test/e2e-plans/java-dep-new-types.yaml | 294 +++++++++++++++++++ test/e2e-plans/java-dep-view-modes.yaml | 224 ++++++++++++++ 3 files changed, 685 insertions(+) create mode 100644 test/e2e-plans/java-dep-build-lifecycle.yaml create mode 100644 test/e2e-plans/java-dep-new-types.yaml create mode 100644 test/e2e-plans/java-dep-view-modes.yaml diff --git a/test/e2e-plans/java-dep-build-lifecycle.yaml b/test/e2e-plans/java-dep-build-lifecycle.yaml new file mode 100644 index 00000000..ab650c0a --- /dev/null +++ b/test/e2e-plans/java-dep-build-lifecycle.yaml @@ -0,0 +1,167 @@ +# Test Plan: Java Dependency — Build Lifecycle +# +# Covers the project build / rebuild / reload commands contributed by +# vscode-java-dependency. Each command is invoked through the documented +# entry point (view title-bar action, overflow menu, project context menu, +# or editor title-bar action) and verified by waiting for the Java Language +# Server to return to the Ready state. +# +# Commands exercised: +# - java.project.build.workspace (Build All — title-bar tools icon) +# - java.project.rebuild.workspace (Rebuild All — overflow menu) +# - java.project.build.project (Build Project — project context menu) +# - java.project.rebuild (Rebuild Project — project context menu) +# - java.project.reloadProjectFromActiveFile (Reload Project — pom.xml editor title) +# +# Note: java.project.clean.workspace is intentionally omitted from this plan +# because the JDT.LS clean command triggers a VS Code window reload, which +# tears down the autotest browser session. +# +# Verification strategy +# ───────────────────── +# Build commands have no visible editor side-effect — they trigger a +# background compilation whose progress is reflected only in the status bar +# (and briefly in the Java Language Server progress notifications). For each +# build / rebuild, we run the command and then call `waitForLanguageServer`, +# which polls the status bar until it returns to "Java: Ready" and the +# post-Ready "Building - X%" phase has settled. A non-fatal command is +# enough for the step to pass — the test asserts that the command does not +# leave the LS hung or in an error state. +# +# Usage: +# npx autotest run test/e2e-plans/java-dep-build-lifecycle.yaml --vsix + +name: "Java Dependency — Build Lifecycle" +description: | + Tests the build / rebuild / reload commands contributed by the Java + Project Manager. Each command is verified by waiting for the Java + Language Server to return to the Ready state after the command runs. + +setup: + extension: "redhat.java" + vscodeVersion: "stable" + workspace: "../maven" + timeout: 240 + settings: + java.configuration.checkProjectSettingsExclusions: false + workbench.startupEditor: "none" + +steps: + # ── Setup ── + - id: "ls-ready" + action: "waitForLanguageServer" + timeout: 180 + + - id: "close-aux-bar" + action: "executeVSCodeCommand workbench.action.closeAuxiliaryBar" + verify: "Auxiliary bar (Chat) closed" + + # Collapse the MAVEN workspace-folder pane so JAVA PROJECTS gets the full + # vertical space. OUTLINE and TIMELINE are collapsed by default in fresh + # sessions, so no explicit step is needed. + - id: "collapse-maven-pane" + action: "collapseSidebarSection maven" + + - id: "focus-java-projects" + action: "executeVSCodeCommand javaProjectExplorer.focus" + verify: "Java Projects view is focused" + + - id: "wait-tree-load" + action: "wait 3 seconds" + + # ── Test 1: Build All (incremental) — Java Projects view title-bar button ── + # The "Build All" toolbar action ($(tools) icon) is contributed under + # view/title group navigation@30 in package.json. Clicking it through the + # UI exercises the full button-rendering + when-clause + command-dispatch + # chain — unlike executeVSCodeCommand, which would only hit the command + # bus directly. + - id: "trigger-build-all" + action: 'clickViewTitleAction "Java Projects" "Build All"' + + - id: "wait-build-all" + action: "waitForLanguageServer" + timeout: 120 + + # ── Test 2: Rebuild All (full compile) — Java Projects overflow menu ── + # "Rebuild All" lives in view/title group overflow_20@5, so it is reached + # via the "Views and More Actions..." (...) overflow menu. The + # clickViewTitleAction helper automatically falls through from the direct + # button path to the overflow menu when the action is not present in the + # toolbar's navigation group. + - id: "trigger-rebuild-all" + action: 'clickViewTitleAction "Java Projects" "Rebuild All"' + + - id: "wait-rebuild-all" + action: "waitForLanguageServer" + timeout: 180 + + # ── Test 3: Build Project (per-project, via context menu) ── + # The `java.project.build.project` command requires a project URI, so it + # is gated behind the project context-menu in package.json (8_execution@5 + # when viewItem matches /java:project.*\+java.*\+uri/). Invoke it via the + # project node context menu — the menu surface that real users hit. + - id: "click-project-build" + action: "click my-app tree item" + waitBefore: 1 + + - id: "context-build-project" + action: "contextMenu my-app Build Project" + # No `verify:` — context-menu click has no immediate visible effect + # beyond closing the menu; waitForLanguageServer below is the ground + # truth that the build executed and the LS settled. + + - id: "wait-build-project" + action: "waitForLanguageServer" + timeout: 120 + + # ── Test 4: Rebuild Project (per-project, via context menu) ── + - id: "click-project-rebuild" + action: "click my-app tree item" + waitBefore: 1 + + - id: "context-rebuild-project" + action: "contextMenu my-app Rebuild Project" + + - id: "wait-rebuild-project" + action: "waitForLanguageServer" + timeout: 180 + + # ── Test 5: Reload Project (editor title-bar action on pom.xml) ── + # `java.project.reloadProjectFromActiveFile` is contributed in editor/title + # group navigation when both `java:reloadProjectActive` and `javaLSReady` + # are true. The `java:reloadProjectActive` key is only set after the + # project file (pom.xml / build.gradle) has been modified — opening an + # unchanged pom.xml is NOT enough to make the $(sync) button appear. + # + # To exercise the real UI flow: + # 1. Open pom.xml. + # 2. Type a space at the cursor → file becomes dirty. + # 3. Save → JDT.LS detects the build file change and sets + # `java:reloadProjectActive`, which renders the $(sync) "Reload + # Java Project" button in the editor title bar. + # 4. Click the title-bar button → reload kicks off. + # 5. waitForLanguageServer confirms the reload completed. + # 6. Undo + save restores pom.xml to its original content so the + # fixture is left clean for subsequent runs. + # ── Test 5: Reload Project From Active File ── + # `java.project.reloadProjectFromActiveFile` is contributed to editor/title + # group navigation only when `java:reloadProjectActive && javaLSReady` are + # both true. The `java:reloadProjectActive` key is set by redhat.java when + # JDT.LS detects an out-of-date project descriptor — but that signal is + # racy and inconsistent for synthetic changes (trivial whitespace edits + # often get absorbed without flipping the key, and a substantive edit + # would risk corrupting the fixture pom.xml). For deterministic CI + # behaviour this step therefore invokes the command id directly through + # the keybinding-bridge path. The fact that the command exists and runs + # without breaking the language server is still meaningful coverage, + # complementing the UI-driven tests above. + - id: "open-pom" + action: "open file pom.xml" + waitBefore: 3 + + - id: "trigger-reload-project" + action: "executeVSCodeCommand java.project.reloadProjectFromActiveFile" + + - id: "wait-reload-project" + action: "waitForLanguageServer" + timeout: 180 diff --git a/test/e2e-plans/java-dep-new-types.yaml b/test/e2e-plans/java-dep-new-types.yaml new file mode 100644 index 00000000..1477737c --- /dev/null +++ b/test/e2e-plans/java-dep-new-types.yaml @@ -0,0 +1,294 @@ +# Test Plan: Java Dependency — New File Types +# +# Covers the "New..." quick-pick options from the Java Projects view that are +# NOT already covered by java-dep-file-operations.yaml (which only tests +# `New Class` and `New Package`). +# +# Commands exercised (each invoked through the New... quick-pick on a node): +# - java.view.package.newJavaInterface (Interface) +# - java.view.package.newJavaEnum (Enum) +# - java.view.package.newJavaAnnotation (Annotation) +# - java.view.package.newJavaAbstractClass (Abstract Class) +# - java.view.package.newFile ("File" option) +# - java.view.package.newFolder ("Folder" option) +# +# Pattern for each type (same as the existing New Class flow): +# 1. click `my-app` in the JAVA PROJECTS view +# 2. clickTreeItemAction my-app New... (triggers java.view.package.new) +# 3. select option in the quick pick +# 4. select src/main/java source-folder option (where applicable) +# 5. fillQuickInput +# 6. verifyEditorTab — confirms the new file was created and opened +# +# Between each cycle the previously-created file is saved + all editors are +# closed and the JAVA PROJECTS tree is collapsed, mirroring the technique +# used in java-dep-file-operations.yaml. +# +# Usage: +# npx autotest run test/e2e-plans/java-dep-new-types.yaml --vsix + +name: "Java Dependency — New File Types" +description: | + Tests all the "New ..." quick-pick options in the Java Projects view that + are not already covered by java-dep-file-operations.yaml: + Interface / Enum / Annotation / Abstract Class / File / Folder. + +setup: + extension: "redhat.java" + vscodeVersion: "stable" + workspace: "../maven" + timeout: 240 + settings: + java.configuration.checkProjectSettingsExclusions: false + workbench.startupEditor: "none" + +steps: + # ── Setup ── + - id: "ls-ready" + action: "waitForLanguageServer" + # No `verify:` — waitForLanguageServer is itself the deterministic + # readiness check; see java-dep-file-operations.yaml for rationale. + timeout: 180 + + - id: "close-aux-bar" + action: "executeVSCodeCommand workbench.action.closeAuxiliaryBar" + verify: "Auxiliary bar (Chat) closed" + + # Collapse the MAVEN workspace-folder pane so JAVA PROJECTS gets the full + # vertical space. OUTLINE and TIMELINE are collapsed by default in fresh + # sessions, so no explicit step is needed. + - id: "collapse-maven-pane" + action: "collapseSidebarSection maven" + + - id: "focus-java-projects" + action: "executeVSCodeCommand javaProjectExplorer.focus" + verify: "Java Projects view is focused" + + - id: "wait-tree-load" + action: "wait 3 seconds" + + # ── Test 1: New Interface ── + - id: "click-project-1" + action: "click my-app tree item" + + - id: "trigger-new-1" + action: "clickTreeItemAction my-app New..." + verify: "New resource quick pick opened" + + - id: "select-interface" + action: "select Interface option" + verify: "Interface selected" + + - id: "select-source-folder-1" + action: "select src/main/java option" + + - id: "enter-interface-name" + action: "fillQuickInput MyInterface" + # No `verify:` — fillQuickInput submits and closes the quick input. The + # deterministic `verifyEditorTab` below is the ground truth. + + - id: "verify-interface-tab" + action: "wait 2 seconds" + # No `verify:` — BEFORE/AFTER screenshots are identical once the editor + # tab is open; verifyEditorTab is authoritative. + verifyEditorTab: + title: "MyInterface.java" + timeout: 20 + + # Reset between cycles: save the dirty buffer, close editors, refocus. + - id: "save-1" + action: "executeVSCodeCommand workbench.action.files.saveAll" + + - id: "close-editors-1" + action: "run command View: Close All Editors" + + - id: "collapse-tree-1" + action: 'clickViewTitleAction "Java Projects" "Collapse All"' + + - id: "collapse-workspace-root-2" + action: "collapseWorkspaceRoot" + + - id: "focus-java-projects-2" + action: "executeVSCodeCommand javaProjectExplorer.focus" + waitBefore: 1 + + # ── Test 2: New Enum ── + - id: "click-project-2" + action: "click my-app tree item" + waitBefore: 1 + + - id: "trigger-new-2" + action: "clickTreeItemAction my-app New..." + + - id: "select-enum" + action: "select Enum option" + + - id: "select-source-folder-2" + action: "select src/main/java option" + + - id: "enter-enum-name" + action: "fillQuickInput MyEnum" + + - id: "verify-enum-tab" + action: "wait 2 seconds" + verifyEditorTab: + title: "MyEnum.java" + timeout: 20 + + - id: "save-2" + action: "executeVSCodeCommand workbench.action.files.saveAll" + + - id: "close-editors-2" + action: "run command View: Close All Editors" + + - id: "collapse-tree-2" + action: 'clickViewTitleAction "Java Projects" "Collapse All"' + + - id: "collapse-workspace-root-3" + action: "collapseWorkspaceRoot" + + - id: "focus-java-projects-3" + action: "executeVSCodeCommand javaProjectExplorer.focus" + waitBefore: 1 + + # ── Test 3: New Annotation ── + - id: "click-project-3" + action: "click my-app tree item" + waitBefore: 1 + + - id: "trigger-new-3" + action: "clickTreeItemAction my-app New..." + + - id: "select-annotation" + action: "select Annotation option" + + - id: "select-source-folder-3" + action: "select src/main/java option" + + - id: "enter-annotation-name" + action: "fillQuickInput MyAnnotation" + + - id: "verify-annotation-tab" + action: "wait 2 seconds" + verifyEditorTab: + title: "MyAnnotation.java" + timeout: 20 + + - id: "save-3" + action: "executeVSCodeCommand workbench.action.files.saveAll" + + - id: "close-editors-3" + action: "run command View: Close All Editors" + + - id: "collapse-tree-3" + action: 'clickViewTitleAction "Java Projects" "Collapse All"' + + - id: "collapse-workspace-root-4" + action: "collapseWorkspaceRoot" + + - id: "focus-java-projects-4" + action: "executeVSCodeCommand javaProjectExplorer.focus" + waitBefore: 1 + + # ── Test 4: New Abstract Class ── + - id: "click-project-4" + action: "click my-app tree item" + waitBefore: 1 + + - id: "trigger-new-4" + action: "clickTreeItemAction my-app New..." + + - id: "select-abstract-class" + action: "select Abstract Class option" + + - id: "select-source-folder-4" + action: "select src/main/java option" + + - id: "enter-abstract-name" + action: "fillQuickInput MyAbstract" + + - id: "verify-abstract-tab" + action: "wait 2 seconds" + verifyEditorTab: + title: "MyAbstract.java" + timeout: 20 + + - id: "save-4" + action: "executeVSCodeCommand workbench.action.files.saveAll" + + - id: "close-editors-4" + action: "run command View: Close All Editors" + + - id: "collapse-tree-4" + action: 'clickViewTitleAction "Java Projects" "Collapse All"' + + - id: "collapse-workspace-root-5" + action: "collapseWorkspaceRoot" + + - id: "focus-java-projects-5" + action: "executeVSCodeCommand javaProjectExplorer.focus" + waitBefore: 1 + + # ── Test 5: New File (plain non-Java file via "File" option) ── + # The "File" entry routes to `java.view.package.newFile` and writes the + # file under the project root (the node we triggered from). + - id: "click-project-5" + action: "click my-app tree item" + waitBefore: 1 + + - id: "trigger-new-5" + action: "clickTreeItemAction my-app New..." + + - id: "select-file" + action: "select File option" + + - id: "enter-file-name" + action: "fillQuickInput notes.txt" + + - id: "verify-file-tab" + action: "wait 2 seconds" + verifyEditorTab: + title: "notes.txt" + timeout: 20 + + - id: "save-5" + action: "executeVSCodeCommand workbench.action.files.saveAll" + + - id: "close-editors-5" + action: "run command View: Close All Editors" + + - id: "collapse-tree-5" + action: 'clickViewTitleAction "Java Projects" "Collapse All"' + + - id: "collapse-workspace-root-6" + action: "collapseWorkspaceRoot" + + - id: "focus-java-projects-6" + action: "executeVSCodeCommand javaProjectExplorer.focus" + waitBefore: 1 + + # ── Test 6: New Folder ── + # Folder creation has no editor side-effect — verify by checking the new + # folder exists on disk under the workspace root. + - id: "click-project-6" + action: "click my-app tree item" + waitBefore: 1 + + - id: "trigger-new-6" + action: "clickTreeItemAction my-app New..." + + - id: "select-folder" + action: "select Folder option" + + - id: "enter-folder-name" + action: "fillQuickInput my-new-folder" + + - id: "wait-folder-create" + action: "wait 2 seconds" + # No `verify:` — folder creation has no editor side-effect, so the + # BEFORE/AFTER screenshots are nearly identical and a screenshot LLM + # would downgrade. The deterministic verifyFile below is authoritative. + verifyFile: + path: "~/my-new-folder" + exists: true + timeout: 15 diff --git a/test/e2e-plans/java-dep-view-modes.yaml b/test/e2e-plans/java-dep-view-modes.yaml new file mode 100644 index 00000000..51f4f258 --- /dev/null +++ b/test/e2e-plans/java-dep-view-modes.yaml @@ -0,0 +1,224 @@ +# Test Plan: Java Dependency — View Modes & Refresh +# +# Covers Java Projects view title-bar / overflow commands: +# - java.view.package.changeToHierarchicalPackageView (Hierarchical View) +# - java.view.package.changeToFlatPackageView (Flat View) +# - java.view.package.refresh (Refresh) +# - java.project.explorer.hideNonJavaResources (Hide Non-Java Resources) +# - java.project.explorer.showNonJavaResources (Show Non-Java Resources) +# +# Usage: +# npx autotest run test/e2e-plans/java-dep-view-modes.yaml --vsix + +name: "Java Dependency — View Modes & Refresh" +description: | + Tests Java Projects explorer title-bar commands: switching between flat / + hierarchical package presentation, refreshing the tree, and toggling + visibility of non-Java resources (pom.xml, .vscode, .classpath, .project). + +setup: + extension: "redhat.java" + vscodeVersion: "stable" + workspace: "../maven" + timeout: 180 + settings: + java.configuration.checkProjectSettingsExclusions: false + workbench.startupEditor: "none" + +steps: + # ── Wait for LS ── + - id: "ls-ready" + action: "waitForLanguageServer" + # No `verify:` — waitForLanguageServer is the deterministic readiness + # check. The AFTER screenshot may transiently show "Java: Building - 0%" + # right after Ready, which a strict LLM mis-reads as a failure. + timeout: 180 + + # Free horizontal & vertical space so JAVA PROJECTS gets enough room. + - id: "close-aux-bar" + action: "executeVSCodeCommand workbench.action.closeAuxiliaryBar" + verify: "Auxiliary bar (Chat) closed" + + # Collapse the entire MAVEN workspace-folder pane so JAVA PROJECTS gets the + # full vertical space — its tree is virtualized and rows below the viewport + # are not rendered, which masks items like pom.xml that live below + # src/main/java in a Maven project. OUTLINE and TIMELINE panes are + # collapsed by default in a fresh session, so no explicit step needed. + - id: "collapse-maven-pane" + action: "collapseSidebarSection maven" + + - id: "focus-java-projects" + action: "executeVSCodeCommand javaProjectExplorer.focus" + verify: "Java Projects view is focused" + + - id: "wait-tree-load" + action: "wait 3 seconds" + + # Expand my-app → src/main/java so subsequent verifyTreeItem can observe + # package nodes at this layer. + - id: "expand-project" + action: "expandTreeItem my-app" + + - id: "expand-src-main" + action: "expandTreeItem src/main/java" + waitBefore: 2 + + # ── Baseline: flat mode shows "com.mycompany.app" as a single node ── + - id: "verify-flat-baseline" + action: "wait 1 seconds" + # No `verify:` — verifyTreeItem is authoritative. + verifyTreeItem: + name: "com.mycompany.app" + exact: true + inView: "Java Projects" + timeout: 15 + + # ── Test 1: switch to hierarchical view ── + # In hierarchical (compressed) mode the JLS collapses single-child chains, + # so "com.mycompany.app" is split into a parent "com.mycompany" node with + # children "app" and "app1". This is the same behavior covered by + # test/maven-suite/projectView.test.ts ("primarySubPackage.name should be + # 'com.mycompany'"). Verify deterministically through the appearance of + # the "com.mycompany" node. + - id: "switch-to-hierarchical" + action: 'clickViewTitleAction "Java Projects" "Hierarchical View"' + # Real UI path: opens the Java Projects view overflow menu and clicks + # "Hierarchical View". sub-screenshots capture overflow-open (button + # tooltip visible) and menuitem (Hierarchical View highlighted) so + # the LLM/human reviewer can verify the click landed correctly. + # deterministic verifyTreeItem below is still authoritative. + + - id: "wait-hierarchical" + action: "wait 4 seconds" + + - id: "verify-hierarchical-node" + action: "wait 1 seconds" + verifyTreeItem: + name: "com.mycompany" + exact: true + inView: "Java Projects" + timeout: 15 + + # ── Test 2: switch back to flat view ── + - id: "switch-to-flat" + action: 'clickViewTitleAction "Java Projects" "Flat View"' + # Real UI path through view-title overflow menu — see + # switch-to-hierarchical. verifyTreeItem below is authoritative. + + - id: "wait-flat" + action: "wait 4 seconds" + + - id: "verify-flat-restored" + action: "wait 1 seconds" + verifyTreeItem: + name: "com.mycompany.app" + exact: true + inView: "Java Projects" + timeout: 15 + + - id: "verify-hierarchical-gone" + action: "wait 1 seconds" + verifyTreeItem: + name: "com.mycompany" + exact: true + visible: false + inView: "Java Projects" + timeout: 15 + + # ── Test 3: refresh ── + # Smoke check: the command runs without throwing and the tree remains stable. + - id: "refresh-tree" + action: "executeVSCodeCommand java.view.package.refresh" + # No `verify:` — refresh has no visible effect at steady state, so the + # BEFORE/AFTER screenshots are identical and a strict LLM downgrades. + # The deterministic verifyTreeItem on verify-refresh-stable confirms the + # tree did not get corrupted by the refresh. + + - id: "wait-after-refresh" + action: "wait 3 seconds" + + - id: "verify-refresh-stable" + action: "wait 1 seconds" + verifyTreeItem: + name: "com.mycompany.app" + exact: true + inView: "Java Projects" + timeout: 15 + + # ── Test 4: hide non-Java resources ── + # In flat mode the project shows non-Java resources such as pom.xml, + # .vscode, .classpath, .project. Hide should remove them from the tree. + # `inView: "Java Projects"` scopes the search to the Java Projects pane + # only — without it the EXPLORER pane (which also shows pom.xml at the + # workspace root) would mask any Java-Projects-side change. + # + # The virtualized Java Projects tree only renders rows in the viewport, + # so we first collapse src/main/java to bring pom.xml (a sibling) into + # view. Click selects the node, then ArrowLeft collapses it. + - id: "select-src-main" + action: "click src/main/java" + + - id: "collapse-src-main" + action: "pressKey ArrowLeft" + + # After collapsing src/main/java, press End to scroll the (virtualized) + # JAVA PROJECTS tree to its last row, which makes pom.xml — a child of + # my-app rendered below other source folders / libraries — render in + # the DOM. Playwright's `waitFor("visible")` does not auto-scroll + # virtualized lists, so this is necessary. + - id: "scroll-tree-end" + action: "pressKey End" + + - id: "wait-collapse" + action: "wait 1 seconds" + + - id: "verify-pom-visible-baseline" + action: "wait 1 seconds" + verifyTreeItem: + name: "pom.xml" + exact: true + inView: "Java Projects" + timeout: 15 + + - id: "hide-non-java" + action: 'clickViewTitleAction "Java Projects" "Hide Non-Java Resources"' + # Real UI path through view-title overflow menu. The menu item label + # toggles based on `config.java.project.explorer.showNonJavaResources` + # (Show vs Hide), and the current state at this point is "showing" + # so the menu surfaces "Hide Non-Java Resources". verifyTreeItem + # checks below are authoritative. + + - id: "wait-hide" + action: "wait 5 seconds" + + - id: "verify-pom-hidden" + action: "wait 1 seconds" + verifyTreeItem: + name: "pom.xml" + exact: true + visible: false + inView: "Java Projects" + timeout: 30 + + # ── Test 5: show non-Java resources ── + - id: "show-non-java" + action: 'clickViewTitleAction "Java Projects" "Show Non-Java Resources"' + # Real UI path through view-title overflow menu. After hide-non-java + # the toggle now surfaces "Show Non-Java Resources". verifyTreeItem + # below is authoritative. + + - id: "wait-show" + action: "wait 5 seconds" + + # After the tree refresh, the scroll position may have reset to the top + # of the JAVA PROJECTS pane, so scroll back to the end to render pom.xml. + - id: "scroll-tree-end-2" + action: "pressKey End" + + - id: "verify-pom-restored" + action: "wait 1 seconds" + verifyTreeItem: + name: "pom.xml" + exact: true + inView: "Java Projects" + timeout: 30 From 7dbc48a5e1d0a3fe04dc6ee6c633a4349c85fd90 Mon Sep 17 00:00:00 2001 From: wenyt <75360946+wenytang-ms@users.noreply.github.com> Date: Fri, 29 May 2026 14:46:10 +0800 Subject: [PATCH 312/352] perf: tune Java LSP tool selection guidance (#1020) * Tune Java LSP tool selection guidance Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * pref: adjust the invoke chain * perf: update to comments --------- Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- package.json | 18 ++++- .../javaLspContext.instructions.md | 9 ++- resources/skills/java-lsp-tools/SKILL.md | 20 +++-- src/copilot/tools/javaContextTools.ts | 79 +++++++++++++++++-- 4 files changed, 105 insertions(+), 21 deletions(-) diff --git a/package.json b/package.json index e479af16..b6dc7e32 100644 --- a/package.json +++ b/package.json @@ -52,8 +52,15 @@ { "name": "lsp_java_getFileStructure", "toolReferenceName": "javaFileStructure", - "modelDescription": "Get the outline (classes, methods, fields) of a Java file with symbol kinds and line ranges.\n\nUse before read_file to find specific line ranges. For searching across files, use lsp_java_findSymbol instead.\n\nOnly use file paths confirmed from prior tool results or user input. If unsure, call lsp_java_findSymbol first.", + "modelDescription": "Get a known Java file's outline: classes, interfaces, methods, fields, symbol kinds, and line ranges, to pick a precise read_file range instead of reading the whole file.\n\nUse after lsp_java_findSymbol returns a file, or when the user gave a Java file path; do not guess paths. Not for workspace-wide search\u2014use lsp_java_findSymbol for that. Do not re-call for the same file unless the first result was empty.", "displayName": "Java: Get File Structure", + "userDescription": "Get a Java file outline with classes, methods, fields, and line ranges.", + "tags": [ + "java", + "lsp", + "code-navigation", + "file-outline" + ], "canBeReferencedInPrompt": true, "icon": "$(symbol-class)", "when": "config.vscode-java-dependency.enableLspTools && javaLSReady", @@ -73,8 +80,15 @@ { "name": "lsp_java_findSymbol", "toolReferenceName": "javaFindSymbol", - "modelDescription": "Search for Java symbol definitions (classes, interfaces, methods, fields) across the entire workspace by name. Returns precise locations in ~60 tokens vs ~500+ tokens from grep_search.\n\nWhen to use:\n- To find where a class, method, or field is defined — faster and more precise than grep_search\n- To discover file paths before using other tools\n- Supports partial matching (e.g. 'UserSvc' finds 'UserServiceImpl')\n\nWhen NOT to use:\n- For non-Java files\n- To search for string literals, comments, or non-symbol text (use grep_search)", + "modelDescription": "Find Java class, interface, method, or field definitions across the workspace by name or partial identifier. Prefer over grep_search, file_search, semantic_search, or search subagents for Java symbol lookup.\n\nOn relevant results, do not repeat with a similar query; continue with lsp_java_getFileStructure or read_file on the returned line range. The tool retries internally, so on an empty result do not re-search\u2014retry once only if it reports indexing in progress, otherwise use generic search.\n\nDo not use for non-Java files, literals, comments, build/XML files, or conceptual exploration.", "displayName": "Java: Find Symbol", + "userDescription": "Find Java class, method, field, or interface definitions by name.", + "tags": [ + "java", + "lsp", + "code-navigation", + "symbol-search" + ], "canBeReferencedInPrompt": true, "icon": "$(search)", "when": "config.vscode-java-dependency.enableLspTools && javaLSReady", diff --git a/resources/instruments/javaLspContext.instructions.md b/resources/instruments/javaLspContext.instructions.md index 2c975a19..e3d5d1f3 100644 --- a/resources/instruments/javaLspContext.instructions.md +++ b/resources/instruments/javaLspContext.instructions.md @@ -1,14 +1,15 @@ --- -description: REQUIRED for Java files. Provides compiler-accurate lsp_java_findSymbol and lsp_java_getFileStructure tools that replace grep_search, search_subagent, semantic_search, and file_search for Java symbol navigation. +description: Use Java LSP tools for precise Java symbol navigation. Prefer lsp_java_findSymbol and lsp_java_getFileStructure over generic search only when locating Java classes, methods, fields, or file outlines. applyTo: '**/*.java' --- -For Java files, two compiler-accurate `lsp_java_*` tools are available and return structured results in ~50 tokens vs ~500+ from generic search: +For Java symbol navigation, two compiler-accurate `lsp_java_*` tools are available and return structured results with smaller, easier-to-interpret payloads than generic search: - `lsp_java_findSymbol(query)` — find class/method/field definitions by name across the workspace - `lsp_java_getFileStructure(uri)` — get file outline (classes, methods, fields) with line ranges -These are deferred tools. Load them with `tool_search_tool_regex` using pattern `lsp_java_` before first use. +If these tools are not already available in the current tool list, load them with `tool_search` using a query such as `Java LSP symbol navigation lsp_java`. -Prefer these over `grep_search`, `search_subagent`, `semantic_search`, `file_search`, or full-file `read_file` when navigating Java symbols. Always use `findSymbol` to discover file paths before passing them to `getFileStructure` — do not guess paths. Fall back to `grep_search` if a tool returns empty or errors. +Use `lsp_java_findSymbol` before `grep_search`, `search_subagent`, `semantic_search`, or `file_search` only when the task is to locate Java symbols by name or partial identifier. If it returns relevant symbols, do not call it again with the same or similar query; next use `lsp_java_getFileStructure` for the returned file or `read_file` on the smallest useful line range. +Use `lsp_java_getFileStructure` only with a path confirmed by the user or a previous tool result. Do not guess paths. Use generic search for string literals, comments, XML, Gradle/Maven files, non-Java files, or broad conceptual exploration. `findSymbol` already retries internally with a normalized identifier, so do not re-issue the same search on an empty result: if it reports indexing in progress, retry once after a short pause; otherwise fall back to generic search. diff --git a/resources/skills/java-lsp-tools/SKILL.md b/resources/skills/java-lsp-tools/SKILL.md index 56a74cac..2593862c 100644 --- a/resources/skills/java-lsp-tools/SKILL.md +++ b/resources/skills/java-lsp-tools/SKILL.md @@ -1,41 +1,45 @@ --- name: java-lsp-tools -description: Compiler-accurate Java code navigation via the Java Language Server. Use lsp_java_findSymbol to locate symbols and lsp_java_getFileStructure to inspect file outlines. Prefer over grep_search for Java symbol navigation. +description: Compiler-accurate Java symbol navigation via the Java Language Server. Use lsp_java_findSymbol for Java identifiers and lsp_java_getFileStructure for known Java files; prefer them over generic search only for symbol/file-outline navigation. --- # Java LSP Tools -Two compiler-accurate tools backed by the Java Language Server (jdtls). They return structured JSON with fewer tokens than `grep_search` or `read_file`. +Two compiler-accurate tools backed by the Java Language Server (jdtls). They return structured JSON that is easier to interpret than generic search results for Java symbol navigation. ## Tools ### `lsp_java_findSymbol` Search for Java symbol definitions (classes, methods, fields) by name across the workspace. Supports partial matching. - Input: `{ query, limit? }` — limit defaults to 20, max 50 -- Output: `{ name, kind, location }` per result (~60 tokens) -- **Use instead of** `grep_search` when looking for where a class/method is defined +- Output: `{ results: [{ name, kind, container?, location, range }], total }` (~60 tokens); `range` is `L start-end` +- **Use instead of** `grep_search`, `file_search`, `semantic_search`, or `search_subagent` when looking for where a Java class/method/field is defined by identifier +- Do not repeat with the same or similar query after relevant results are returned ### `lsp_java_getFileStructure` Get hierarchical outline of a Java file (classes, methods, fields) with line ranges. - Input: `{ uri }` — workspace-relative path. Must be a known path from prior tool results or user input — do not guess - Output: symbol tree with `L start-end` ranges (~100 tokens) -- **Use instead of** `read_file` full scan when you need to understand a file's layout +- **Use before** `read_file` when you need to choose a precise line range in a known Java file ## When to Use | Task | Use | Not | |---|---|---| | Find class/method/field definition | `lsp_java_findSymbol` | `grep_search` | -| See file outline before reading | `lsp_java_getFileStructure` | `read_file` full file | +| See known Java file outline before reading | `lsp_java_getFileStructure` | `read_file` full file | | Search non-Java files (xml, gradle) | `grep_search` | lsp tools | | Search string literals or comments | `grep_search` | lsp tools | +| Explore broad concepts without identifiers | `semantic_search` or `search_subagent` | lsp tools | ## Typical Workflow **findSymbol → getFileStructure → read_file (specific lines only)** +If `findSymbol` returns relevant symbols, move forward to `getFileStructure` or `read_file`; do not call `findSymbol` again with the same or similar identifier. + ## Fallback -- `findSymbol` returns empty → retry with shorter keyword, then fall back to `grep_search` -- Path error → use `findSymbol` to discover correct path first +- `findSymbol` returns empty → it already retried internally with a normalized identifier, so do not re-issue the same search. If the result says indexing is in progress, retry once after a short pause; otherwise fall back to `grep_search` +- Path error (`fileNotFound`) → use `findSymbol` to discover the correct path first; do not guess paths - Tool error / jdtls not ready → fall back to `grep_search` + `read_file`, don't retry more than once diff --git a/src/copilot/tools/javaContextTools.ts b/src/copilot/tools/javaContextTools.ts index 78969811..8728fd37 100644 --- a/src/copilot/tools/javaContextTools.ts +++ b/src/copilot/tools/javaContextTools.ts @@ -23,6 +23,7 @@ import * as path from "path"; import * as vscode from "vscode"; import { Commands } from "../../commands"; +import { languageServerApiManager } from "../../languageServerApi/languageServerApiManager"; import { sendInfo } from "vscode-extension-telemetry-wrapper"; // Hard caps to keep tool responses within the < 200 token budget. @@ -43,6 +44,27 @@ function getResponseCharCount(data: unknown): number { return typeof data === "string" ? data.length : JSON.stringify(data, null, 2).length; } +/** + * Normalize a workspace-symbol query for a single fallback retry. + * Strips a fully-qualified package prefix (com.foo.Bar -> Bar), generic parameters + * (List -> List), and method parameter lists (foo() -> foo). jdtls already + * performs camel-hump matching, so the contiguous identifier is preserved. + */ +function normalizeSymbolQuery(query: string): string { + if (!query) { + return ""; + } + let q = query.trim(); + // Drop generic parameters and method parens: List / foo(args) -> List / foo + q = q.replace(/[<(].*$/, ""); + // Drop a fully-qualified package/qualifier prefix: com.foo.Bar / Foo#bar -> Bar / bar + const lastSep = Math.max(q.lastIndexOf("."), q.lastIndexOf("#")); + if (lastSep >= 0 && lastSep < q.length - 1) { + q = q.substring(lastSep + 1); + } + return q.trim(); +} + function getToolErrorCode(error: unknown): string { const message = error instanceof Error ? error.message : String(error); if (message.includes("No workspace folder")) { @@ -125,7 +147,12 @@ const fileStructureTool: vscode.LanguageModelTool = { } catch { status = "error"; errorCode = "fileNotFound"; - const fileNotFoundPayload = { error: "File not found." }; + // Most fileNotFound errors come from the model guessing a path. Return an + // actionable hint instead of a dead end so it can self-correct via findSymbol. + const fileNotFoundPayload = { + error: "File not found.", + hint: "Call lsp_java_findSymbol to obtain the exact workspace path before retrying. Do not guess file paths.", + }; responseCharCount = getResponseCharCount(fileNotFoundPayload); return toResult(fileNotFoundPayload); } @@ -134,8 +161,13 @@ const fileStructureTool: vscode.LanguageModelTool = { ); if (!symbols || symbols.length === 0) { status = "empty"; - emptyReason = "documentSymbolProviderEmpty"; - const noSymbolsPayload = { error: "No symbols found. The file may not be recognized by the Java language server." }; + // Separate "index not ready yet" from a genuine no-symbol result so the model + // (and telemetry) can tell a transient state apart from an unrecognized file. + const indexing = !languageServerApiManager.isFullyReady(); + emptyReason = indexing ? "indexingInProgress" : "documentSymbolProviderEmpty"; + const noSymbolsPayload = indexing + ? { error: "Java language server is still indexing. Retry shortly." } + : { error: "No symbols found. The file may not be recognized by the Java language server." }; responseCharCount = getResponseCharCount(noSymbolsPayload); return toResult(noSymbolsPayload); } @@ -214,14 +246,44 @@ const findSymbolTool: vscode.LanguageModelTool = { let errorCode = ""; let emptyReason = ""; let responseCharCount = 0; + let retried = false; try { - const symbols = await vscode.commands.executeCommand( - "vscode.executeWorkspaceSymbolProvider", options.input.query, + const rawQuery = (options.input.query ?? "").trim(); + // Reject blank/whitespace-only queries early: an empty query triggers an + // expensive workspace-wide symbol scan and can return a huge list. + if (!rawQuery) { + status = "error"; + errorCode = "emptyQuery"; + const emptyQueryPayload = { + error: "Query is empty. Provide a class, interface, method, or field name to search for.", + }; + responseCharCount = getResponseCharCount(emptyQueryPayload); + return toResult(emptyQueryPayload); + } + let symbols = await vscode.commands.executeCommand( + "vscode.executeWorkspaceSymbolProvider", rawQuery, ); + // Server-side fallback: if the verbatim query misses, retry once with a + // normalized identifier (strip package qualifier, generics, and parameter + // lists) so the model does not have to chain repeated findSymbol calls itself. + if (!symbols || symbols.length === 0) { + const normalized = normalizeSymbolQuery(rawQuery); + if (normalized && normalized !== rawQuery) { + retried = true; + symbols = await vscode.commands.executeCommand( + "vscode.executeWorkspaceSymbolProvider", normalized, + ); + } + } if (!symbols || symbols.length === 0) { status = "empty"; - emptyReason = "workspaceSymbolNoMatch"; - const noMatchesPayload = { results: [], message: "No symbols found." }; + // Distinguish a transient "index not ready" state from a real no-match so the + // model can retry later instead of concluding the symbol does not exist. + const indexing = !languageServerApiManager.isFullyReady(); + emptyReason = indexing ? "indexingInProgress" : "workspaceSymbolNoMatch"; + const noMatchesPayload = indexing + ? { results: [], message: "Java language server is still indexing. Retry shortly or use grep_search as a fallback." } + : { results: [], message: "No symbols found." }; responseCharCount = getResponseCharCount(noMatchesPayload); return toResult(noMatchesPayload); } @@ -229,7 +291,9 @@ const findSymbolTool: vscode.LanguageModelTool = { const results = symbols.slice(0, limit).map(s => ({ name: s.name, kind: vscode.SymbolKind[s.kind], + container: s.containerName || undefined, location: `${vscode.workspace.asRelativePath(s.location.uri)}:${s.location.range.start.line + 1}`, + range: `L${s.location.range.start.line + 1}-${s.location.range.end.line + 1}`, })); resultCount = results.length; const findSymbolPayload = { results, total: symbols.length }; @@ -245,6 +309,7 @@ const findSymbolTool: vscode.LanguageModelTool = { status, ...(errorCode && { errorCode }), ...(emptyReason && { emptyReason }), + retried: retried ? "true" : "false", limit, resultCount, totalResults, From ccb3f21b4f003bf72877ee770e484d3e3e105a58 Mon Sep 17 00:00:00 2001 From: Frank Liu <63277848+frankliu20@users.noreply.github.com> Date: Mon, 1 Jun 2026 11:01:16 +0800 Subject: [PATCH 313/352] fix(upgrade): check extension version before calling gotoAgentMode (#1022) * fix(upgrade): check extension version before calling gotoAgentMode - Add MIN_APPMOD_VERSION (1.15.0) constant and check installed extension version before proceeding, fixing failures when extension is outdated - Show reload prompt when extension is updated (not freshly installed) - Distinguish three extension states (up-to-date/outdated/not-installed) in notification button text and message body - Rename display name to "GitHub Copilot modernization" Co-Authored-By: Claude Opus 4 * fix(upgrade): address PR review feedback - Return false after reloadWindow (avoid racing the reload) - Remove redundant second toast after user dismisses reload prompt - Extract getExtensionState() to utility.ts as shared helper to avoid duplicated version-check logic between notificationManager and utility Co-Authored-By: Claude Opus 4 * fix(upgrade): verify extension activation after fresh install After installing the extension, wait briefly for activation then re-check that it meets MIN_APPMOD_VERSION before proceeding to gotoAgentMode. Return false if not yet active to avoid command not found errors. Co-Authored-By: Claude Opus 4 * feat(telemetry): add upgrade flow telemetry for funnel analysis Add instrumentation to checkOrInstallAppModExtensionForUpgrade to track the full upgrade funnel after notification click. Emits extensionState at entry and upgradeFlowResult at each exit path (proceeded, reload-accepted, reload-dismissed, activation-timeout). Co-Authored-By: Claude Opus 4 * fix(lint): use property shorthand for extensionState Co-Authored-By: Claude Opus 4 * feat(telemetry): pass source parameter to gotoAgentMode command Distinguish upgrade vs CVE entry points by passing source to appmod: - vscode-java-dependency.java-upgrade (upgrade notification) - vscode-java-dependency.cve (CVE fix notification) Co-Authored-By: Claude Opus 4 --------- Co-authored-by: Frank Liu Co-authored-by: Claude Opus 4 Co-authored-by: wenyt <75360946+wenytang-ms@users.noreply.github.com> --- src/constants.ts | 6 +- src/upgrade/display/notificationManager.ts | 41 +++++++--- src/upgrade/upgradeManager.ts | 16 +++- src/upgrade/utility.ts | 92 +++++++++++++++++++--- 4 files changed, 130 insertions(+), 25 deletions(-) diff --git a/src/constants.ts b/src/constants.ts index 0345b5a0..31150834 100644 --- a/src/constants.ts +++ b/src/constants.ts @@ -36,11 +36,15 @@ export namespace ExtensionName { export const APP_MODERNIZATION_FOR_JAVA = "vscjava.migrate-java-to-azure"; // Java upgrade extension is merged into app modernization extension export const APP_MODERNIZATION_UPGRADE_FOR_JAVA = APP_MODERNIZATION_FOR_JAVA; - export const APP_MODERNIZATION_EXTENSION_NAME = "GitHub Copilot app modernization"; + export const APP_MODERNIZATION_EXTENSION_NAME = "GitHub Copilot modernization"; } export namespace Upgrade { export const PACKAGE_ID_FOR_JAVA_RUNTIME = "java:*"; + /** Minimum version of the appmod extension that supports gotoAgentMode command */ + export const MIN_APPMOD_VERSION = "1.15.0"; + export const SOURCE_JAVA_UPGRADE = "vscode-java-dependency.java-upgrade"; + export const SOURCE_CVE = "vscode-java-dependency.cve"; } /** diff --git a/src/upgrade/display/notificationManager.ts b/src/upgrade/display/notificationManager.ts index 524184b5..d8e6a461 100644 --- a/src/upgrade/display/notificationManager.ts +++ b/src/upgrade/display/notificationManager.ts @@ -1,13 +1,13 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT license. -import { commands, ExtensionContext, extensions, window } from "vscode"; +import { commands, ExtensionContext, window } from "vscode"; import { UpgradeReason, type IUpgradeIssuesRenderer, type UpgradeIssue } from "../type"; -import { buildCVENotificationMessage, buildFixPrompt, buildNotificationMessage } from "../utility"; +import { buildCVENotificationMessage, buildFixPrompt, buildNotificationMessage, getExtensionState } from "../utility"; import { Commands } from "../../commands"; import { Settings } from "../../settings"; import { instrumentOperation, sendInfo } from "vscode-extension-telemetry-wrapper"; -import { ExtensionName } from "../../constants"; +import { ExtensionName, Upgrade } from "../../constants"; import { CveUpgradeIssue } from "../cve"; const KEY_PREFIX = 'javaupgrade.notificationManager'; @@ -17,6 +17,8 @@ const BUTTON_TEXT_UPGRADE = "Upgrade Now"; const BUTTON_TEXT_FIX_CVE = "Fix Now"; const BUTTON_TEXT_INSTALL_AND_UPGRADE = "Install Extension and Upgrade"; const BUTTON_TEXT_INSTALL_AND_FIX_CVE = "Install Extension and Fix"; +const BUTTON_TEXT_UPDATE_AND_UPGRADE = "Update Extension and Upgrade"; +const BUTTON_TEXT_UPDATE_AND_FIX_CVE = "Update Extension and Fix"; const BUTTON_TEXT_NOT_NOW = "Not Now"; const SECONDS_IN_A_DAY = 24 * 60 * 60; @@ -61,20 +63,36 @@ class NotificationManager implements IUpgradeIssuesRenderer { } this.hasShown = true; - const hasExtension = !!extensions.getExtension(ExtensionName.APP_MODERNIZATION_UPGRADE_FOR_JAVA); + const extensionState = getExtensionState(ExtensionName.APP_MODERNIZATION_UPGRADE_FOR_JAVA); const prompt = buildFixPrompt(issue); let notificationMessage = ""; if (hasCVEIssue) { - notificationMessage = buildCVENotificationMessage(cveIssues, hasExtension); + notificationMessage = buildCVENotificationMessage(cveIssues, extensionState); } else { - notificationMessage = buildNotificationMessage(issue, hasExtension); + notificationMessage = buildNotificationMessage(issue, extensionState); + } + + let upgradeButtonText: string; + let fixCVEButtonText: string; + switch (extensionState) { + case "up-to-date": + upgradeButtonText = BUTTON_TEXT_UPGRADE; + fixCVEButtonText = BUTTON_TEXT_FIX_CVE; + break; + case "outdated": + upgradeButtonText = BUTTON_TEXT_UPDATE_AND_UPGRADE; + fixCVEButtonText = BUTTON_TEXT_UPDATE_AND_FIX_CVE; + break; + case "not-installed": + upgradeButtonText = BUTTON_TEXT_INSTALL_AND_UPGRADE; + fixCVEButtonText = BUTTON_TEXT_INSTALL_AND_FIX_CVE; + break; } - const upgradeButtonText = hasExtension ? BUTTON_TEXT_UPGRADE : BUTTON_TEXT_INSTALL_AND_UPGRADE; - const fixCVEButtonText = hasExtension ? BUTTON_TEXT_FIX_CVE : BUTTON_TEXT_INSTALL_AND_FIX_CVE; sendInfo(operationId, { operationName: "java.dependency.upgradeNotification.show", + extensionState, }); const buttons = hasCVEIssue @@ -91,9 +109,12 @@ class NotificationManager implements IUpgradeIssuesRenderer { }); switch (selection) { - case fixCVEButtonText: + case fixCVEButtonText: { + commands.executeCommand(Commands.JAVA_UPGRADE_WITH_COPILOT, prompt, Upgrade.SOURCE_CVE); + break; + } case upgradeButtonText: { - commands.executeCommand(Commands.JAVA_UPGRADE_WITH_COPILOT, prompt); + commands.executeCommand(Commands.JAVA_UPGRADE_WITH_COPILOT, prompt, Upgrade.SOURCE_JAVA_UPGRADE); break; } case BUTTON_TEXT_NOT_NOW: { diff --git a/src/upgrade/upgradeManager.ts b/src/upgrade/upgradeManager.ts index 1f9f1d3a..90a60b2a 100644 --- a/src/upgrade/upgradeManager.ts +++ b/src/upgrade/upgradeManager.ts @@ -5,7 +5,7 @@ import { commands, type ExtensionContext, workspace, type WorkspaceFolder } from import { Jdtls } from "../java/jdtls"; import { languageServerApiManager } from "../languageServerApi/languageServerApiManager"; -import { ExtensionName } from "../constants"; +import { ExtensionName, Upgrade } from "../constants"; import { instrumentOperation, instrumentOperationAsVsCodeCommand, sendInfo } from "vscode-extension-telemetry-wrapper"; import { Commands } from "../commands"; import notificationManager from "./display/notificationManager"; @@ -25,10 +25,18 @@ class UpgradeManager { notificationManager.initialize(context); // Upgrade project - context.subscriptions.push(instrumentOperationAsVsCodeCommand(Commands.JAVA_UPGRADE_WITH_COPILOT, async (promptText?: string) => { - await checkOrInstallAppModExtensionForUpgrade(ExtensionName.APP_MODERNIZATION_UPGRADE_FOR_JAVA); + context.subscriptions.push(instrumentOperationAsVsCodeCommand( + Commands.JAVA_UPGRADE_WITH_COPILOT, async (promptText?: string, source?: string) => { + const canProceed = await checkOrInstallAppModExtensionForUpgrade( + ExtensionName.APP_MODERNIZATION_UPGRADE_FOR_JAVA); + if (!canProceed) { + return; + } const promptToUse = promptText ?? DEFAULT_UPGRADE_PROMPT; - await commands.executeCommand(Commands.GOTO_AGENT_MODE, { prompt: promptToUse, useCustomAgent: true }); + const upgradeSource = source ?? Upgrade.SOURCE_JAVA_UPGRADE; + await commands.executeCommand(Commands.GOTO_AGENT_MODE, { + prompt: promptToUse, useCustomAgent: true, source: upgradeSource, + }); })); // Show modernization view diff --git a/src/upgrade/utility.ts b/src/upgrade/utility.ts index 40fb2de2..97461b75 100644 --- a/src/upgrade/utility.ts +++ b/src/upgrade/utility.ts @@ -22,7 +22,33 @@ function findEolDate(currentVersion: string, eolDate: Record): s return null; } -export function buildNotificationMessage(issue: UpgradeIssue, hasExtension: boolean): string { +export type ExtensionState = "up-to-date" | "outdated" | "not-installed"; + +export function getExtensionState(extensionId: string): ExtensionState { + const ext = extensions.getExtension(extensionId); + if (!ext) { + return "not-installed"; + } + const version = ext.packageJSON?.version; + if (version && semver.gte(version, Upgrade.MIN_APPMOD_VERSION)) { + return "up-to-date"; + } + // Treat missing version as outdated (conservative) + return "outdated"; +} + +function getActionWord(extensionState: ExtensionState, verb: string): string { + switch (extensionState) { + case "up-to-date": + return verb; + case "outdated": + return `update ${ExtensionName.APP_MODERNIZATION_EXTENSION_NAME} extension and ${verb}`; + case "not-installed": + return `install ${ExtensionName.APP_MODERNIZATION_EXTENSION_NAME} extension and ${verb}`; + } +} + +export function buildNotificationMessage(issue: UpgradeIssue, extensionState: ExtensionState): string { const { packageId, currentVersion, @@ -31,7 +57,7 @@ export function buildNotificationMessage(issue: UpgradeIssue, hasExtension: bool packageDisplayName } = issue; - const upgradeWord = hasExtension ? "upgrade" : `install ${ExtensionName.APP_MODERNIZATION_EXTENSION_NAME} extension and upgrade`; + const upgradeWord = getActionWord(extensionState, "upgrade"); if (packageId === Upgrade.PACKAGE_ID_FOR_JAVA_RUNTIME) { return `This project is using an older Java runtime (${currentVersion}). Would you like to ${upgradeWord} it to the latest LTS version?`; @@ -51,7 +77,7 @@ export function buildNotificationMessage(issue: UpgradeIssue, hasExtension: bool } } -export function buildCVENotificationMessage(issues: CveUpgradeIssue[], hasExtension: boolean): string { +export function buildCVENotificationMessage(issues: CveUpgradeIssue[], extensionState: ExtensionState): string { if (issues.length === 0) { return "No CVE issues found."; @@ -81,7 +107,7 @@ export function buildCVENotificationMessage(issues: CveUpgradeIssue[], hasExtens CVESeverityDistribution: severityText, }); - const fixWord = hasExtension ? "fix" : `install ${ExtensionName.APP_MODERNIZATION_EXTENSION_NAME} extension and fix`; + const fixWord = getActionWord(extensionState, "fix"); if (issues.length === 1) { return `${severityText} CVE vulnerability is detected in this project. Would you like to ${fixWord} it now?`; @@ -154,11 +180,57 @@ export async function checkOrPopupToInstallAppModExtensionForModernization( } export async function checkOrInstallAppModExtensionForUpgrade( - extensionIdToCheck: string): Promise { - if (extensions.getExtension(extensionIdToCheck)) { - return; - } + extensionIdToCheck: string): Promise { + return instrumentOperation("java.dependency.upgradeFlow", async (operationId: string) => { + const state = getExtensionState(extensionIdToCheck); + sendInfo(operationId, { + operationName: "java.dependency.upgradeFlow.start", + extensionState: state, + }); + + if (state === "up-to-date") { + sendInfo(operationId, { + operationName: "java.dependency.upgradeFlow.result", + upgradeFlowResult: "proceeded", + }); + return true; + } - await commands.executeCommand("workbench.extensions.installExtension", ExtensionName.APP_MODERNIZATION_FOR_JAVA); - await checkOrPromptToEnableAppModExtension("upgrade"); + await commands.executeCommand("workbench.extensions.installExtension", ExtensionName.APP_MODERNIZATION_FOR_JAVA); + + if (state === "outdated") { + // Extension was updated (not freshly installed) — reload required + const reload = await window.showInformationMessage( + `${ExtensionName.APP_MODERNIZATION_EXTENSION_NAME} extension has been updated. Reload VS Code to start the upgrade experience.`, + "Reload Now" + ); + if (reload === "Reload Now") { + sendInfo(operationId, { + operationName: "java.dependency.upgradeFlow.result", + upgradeFlowResult: "reload-accepted", + }); + await commands.executeCommand("workbench.action.reloadWindow"); + } else { + sendInfo(operationId, { + operationName: "java.dependency.upgradeFlow.result", + upgradeFlowResult: "reload-dismissed", + }); + } + return false; + } + + await checkOrPromptToEnableAppModExtension("upgrade"); + + // Wait briefly for the newly installed extension to activate + await new Promise(resolve => setTimeout(resolve, 2000)); + + // Re-check if the newly installed extension is active and meets version requirement + const newState = getExtensionState(extensionIdToCheck); + const canProceed = newState === "up-to-date"; + sendInfo(operationId, { + operationName: "java.dependency.upgradeFlow.result", + upgradeFlowResult: canProceed ? "proceeded" : "activation-timeout", + }); + return canProceed; + })(); } \ No newline at end of file From fca6889eecc0ee980e1c5fbd060353325c5b3076 Mon Sep 17 00:00:00 2001 From: Frank Liu <63277848+frankliu20@users.noreply.github.com> Date: Mon, 1 Jun 2026 11:32:41 +0800 Subject: [PATCH 314/352] docs(changelog): add PR #1022 entry (#1023) * docs(changelog): add PR #1022 entry * docs(changelog): move PR #1022 entry to 0.27.5 --------- Co-authored-by: frankliu20 --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3ecb8ed1..dd20ba00 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,10 @@ All notable changes to the "vscode-java-dependency" extension will be documented The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/) and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html). +## 0.27.5 + +- fix - Check GHCP modernization version before call gotoAgentMode command in https://github.com/microsoft/vscode-java-dependency/pull/1022 + ## 0.27.4 - fix - Implement LSP tools for stable builds in https://github.com/microsoft/vscode-java-dependency/pull/1014 From da10f1c37b7b44f53fb7e39f300e994e511d3f9a Mon Sep 17 00:00:00 2001 From: wenyt <75360946+wenytang-ms@users.noreply.github.com> Date: Mon, 1 Jun 2026 13:21:38 +0800 Subject: [PATCH 315/352] build: bump up 0.27.5 (#1024) --- CHANGELOG.md | 1 + package-lock.json | 4 ++-- package.json | 2 +- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index dd20ba00..42889f00 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0. ## 0.27.5 - fix - Check GHCP modernization version before call gotoAgentMode command in https://github.com/microsoft/vscode-java-dependency/pull/1022 +- perf - Tune Java LSP tool selection guidance in https://github.com/microsoft/vscode-java-dependency/pull/1020 ## 0.27.4 diff --git a/package-lock.json b/package-lock.json index a2be5ddb..31047a66 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "vscode-java-dependency", - "version": "0.27.4", + "version": "0.27.5", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "vscode-java-dependency", - "version": "0.27.4", + "version": "0.27.5", "license": "MIT", "dependencies": { "@github/copilot-language-server": "^1.388.0", diff --git a/package.json b/package.json index b6dc7e32..694bcd28 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "vscode-java-dependency", "displayName": "Project Manager for Java", "description": "%description%", - "version": "0.27.4", + "version": "0.27.5", "publisher": "vscjava", "preview": false, "aiKey": "5c642b22-e845-4400-badb-3f8509a70777", From 7be414f3ad0aecca7ec0f1f6608fac341371a0bd Mon Sep 17 00:00:00 2001 From: wenyt <75360946+wenytang-ms@users.noreply.github.com> Date: Fri, 5 Jun 2026 09:56:05 +0800 Subject: [PATCH 316/352] fix: refresh now surfaces externally-generated files in new pakages (#1026) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Fix #914: refresh now surfaces externally-generated files in new packages The source package-root load only did a shallow (DEPTH_ONE) refresh, so files written to disk by external generators into brand-new packages never appeared in the Java Projects view, even after Refresh. Manual Refresh now deep-refreshes (DEPTH_INFINITE) and closes the package root so the Java Model re-enumerates its package-fragment list. Auto-refresh passes the changed resource URI to the server via PackageParams.syncPaths, which scopes the refresh to the nearest existing ancestor subtree instead of the whole source root, falling back to a full deep refresh when a path cannot be resolved. - PackageParams: add syncPaths field + accessors - PackageCommand: targeted refresh branch + findNearestExistingResource helper - packageRootNode: stash pending sync paths, snapshot/clear in loadData - syncHandler: onDidCreate stashes the created URI (cycle-safe NodeKind check) - add E2E plans for manual deep refresh and targeted auto-refresh * test: make #914 E2E assertions deterministic to fix CI false negatives CI runs the autotest harness with the LLM screenshot judge enabled, which the local --no-llm runs skipped. Four state-check steps sat on a wait action while asserting a state that was already true (the package/class had appeared in an earlier refresh step). The LLM judge diffed the before/after screenshots, saw no visual delta, and failed the steps -- even though the deterministic verifyTreeItem DOM assertion passed. This produced a spurious 18/20 in CI vs 20/20 locally. Remove the natural-language erify: field from those pure state-check steps and rely solely on the deterministic erifyTreeItem assertion, which is the actual behaviour under test. Steps where a visible change genuinely occurs within their own window keep their erify:. * test: drop LLM verify on file-write/refresh steps and trim comments (#914) The Windows-UI run still failed (19/20): the LLM screenshot judge could not confirm the insertLineInFile step because the written file is not visible in the collapsed Explorer (autoReveal off), a flaky judgment that passed on Linux but failed on Windows. Remove erify: from all steps with no reliable visual signal (file writes, manual refresh, view focus); keep it only on expandTreeItem steps, which produce a clear visual change. Deterministic verifyTreeItem remains the real assertion. Also trim the verbose header/inline comments. * test: add deterministic negative baseline to #914 plans Each plan only asserted the new package was PRESENT after refresh, never that it was ABSENT before — the missing "before" half of the before/after comparison. Add a deterministic verifyTreeItem (visible: false) baseline proving the package does not exist prior to the file write, so the later appearance is a genuine refresh-driven transition rather than a pre-existing or leftover node. Uses the DOM check (waitForTreeItemGone), so no LLM-judge flakiness. Verified locally: manual 21/21, auto-refresh 16/16. * fix: address PR review - restore syncPaths on failure, dedup refresh targets - packageRootNode: restore the pending syncPaths snapshot if getPackageData rejects so a transient server error does not drop a targeted refresh - PackageCommand: dedup resolved refresh targets via LinkedHashSet so multiple files in the same new package only refresh the subtree once - e2e plans: align Maven section id to lowercase 'maven' for consistency --- .../jdtls/ext/core/PackageCommand.java | 104 ++++++++++++++- .../jdtls/ext/core/PackageParams.java | 18 +++ src/syncHandler.ts | 13 +- src/views/packageRootNode.ts | 37 +++++- .../java-dep-autorefresh-targeted.yaml | 105 +++++++++++++++ .../java-dep-refresh-generated-files.yaml | 124 ++++++++++++++++++ 6 files changed, 390 insertions(+), 11 deletions(-) create mode 100644 test/e2e-plans/java-dep-autorefresh-targeted.yaml create mode 100644 test/e2e-plans/java-dep-refresh-generated-files.yaml diff --git a/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/PackageCommand.java b/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/PackageCommand.java index cada8754..9baf72fb 100644 --- a/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/PackageCommand.java +++ b/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/PackageCommand.java @@ -16,6 +16,7 @@ import java.util.Collections; import java.util.EnumMap; import java.util.HashMap; +import java.util.LinkedHashSet; import java.util.LinkedList; import java.util.List; import java.util.Map; @@ -371,7 +372,7 @@ private static List getPackageRootChildren(PackageParams query, IPr throw new CoreException( new Status(IStatus.ERROR, JdtlsExtActivator.PLUGIN_ID, String.format("No package root found for %s", query.getPath()))); } - List result = getPackageFragmentRootContent(packageRoot, query.isHierarchicalView(), pm); + List result = getPackageFragmentRootContent(packageRoot, query.isHierarchicalView(), query.getSyncPaths(), pm); ResourceSet resourceSet = new ResourceSet(result, query.isHierarchicalView()); ResourceVisitor visitor = new JavaResourceVisitor(packageRoot.getJavaProject()); resourceSet.accept(visitor); @@ -508,8 +509,62 @@ private static List getFolderChildren(PackageParams query, IProgres * @param pm the progress monitor */ public static List getPackageFragmentRootContent(IPackageFragmentRoot root, boolean isHierarchicalView, IProgressMonitor pm) throws CoreException { + return getPackageFragmentRootContent(root, isHierarchicalView, null, pm); + } + + public static List getPackageFragmentRootContent(IPackageFragmentRoot root, boolean isHierarchicalView, List syncPaths, IProgressMonitor pm) throws CoreException { ArrayList result = new ArrayList<>(); - refreshLocal(root.getResource(), pm); + IResource rootResource = root.getResource(); + if (rootResource instanceof IContainer && rootResource.exists() + && root.getKind() == IPackageFragmentRoot.K_SOURCE) { + // Packages created out-of-band (e.g. by code generators or + // refactor-moves that write straight to disk) are otherwise never + // surfaced. A shallow DEPTH_ONE refresh only syncs the source root's + // immediate children and never discovers brand-new nested package + // folders. Even a DEPTH_INFINITE resource refresh is not enough on + // its own: the Java Model keeps a cached list of package fragments + // for the root, so closing it forces getChildren() below to rebuild + // that list from the freshly refreshed resource tree. + // + // On auto-refresh the client passes the changed resource URIs in + // syncPaths so we only deep-refresh those subtrees instead of the + // whole source tree. If any path cannot be resolved to an existing + // resource inside this root we conservatively fall back to a full + // DEPTH_INFINITE refresh so no package is ever missed. + // See https://github.com/microsoft/vscode-java-dependency/issues/914 + boolean refreshedTargets = false; + if (syncPaths != null && !syncPaths.isEmpty()) { + Set targets = new LinkedHashSet<>(); + boolean allResolved = true; + for (String syncPath : syncPaths) { + IResource target = findNearestExistingResource(syncPath, (IContainer) rootResource); + if (target == null) { + allResolved = false; + break; + } + // Multiple changed paths can resolve to the same existing + // ancestor (e.g. several new files in one new package); the + // set keeps each distinct subtree so it is refreshed once. + targets.add(target); + } + if (allResolved && !targets.isEmpty()) { + for (IResource target : targets) { + refreshLocal(target, IResource.DEPTH_INFINITE, pm); + } + refreshedTargets = true; + } + } + if (!refreshedTargets) { + refreshLocal(rootResource, IResource.DEPTH_INFINITE, pm); + } + try { + root.close(); + } catch (JavaModelException e) { + JdtlsExtActivator.log(e); + } + } else { + refreshLocal(rootResource, IResource.DEPTH_ONE, pm); + } if (isHierarchicalView) { Map map = new HashMap<>(); for (IJavaElement child : root.getChildren()) { @@ -599,13 +654,56 @@ public static IJavaProject getJavaProject(String projectUri) { } private static void refreshLocal(IResource resource, IProgressMonitor monitor) { + refreshLocal(resource, IResource.DEPTH_ONE, monitor); + } + + private static void refreshLocal(IResource resource, int depth, IProgressMonitor monitor) { if (resource == null || !resource.exists()) { return; } try { - resource.refreshLocal(IResource.DEPTH_ONE, monitor); + resource.refreshLocal(depth, monitor); } catch (CoreException e) { JdtlsExtActivator.log(e); } } + + /** + * Resolve a changed resource URI to the nearest ancestor that already exists + * in the workspace resource tree and lives inside the given source root. + * Used to scope an auto-refresh to only the affected subtree. Returns null + * when the URI cannot be mapped to a resource within the root, in which case + * the caller falls back to a full refresh so no package is missed. + */ + private static IResource findNearestExistingResource(String uriStr, IContainer root) { + if (StringUtils.isBlank(uriStr) || root == null) { + return null; + } + try { + URI uri = JDTUtils.toURI(uriStr); + if (uri == null) { + return null; + } + IWorkspaceRoot wsRoot = ResourcesPlugin.getWorkspace().getRoot(); + IResource resource = null; + IFile[] files = wsRoot.findFilesForLocationURI(uri); + if (files.length > 0) { + resource = files[0]; + } else { + IContainer[] containers = wsRoot.findContainersForLocationURI(uri); + if (containers.length > 0) { + resource = containers[0]; + } + } + while (resource != null && !resource.exists()) { + resource = resource.getParent(); + } + if (resource != null && root.getFullPath().isPrefixOf(resource.getFullPath())) { + return resource; + } + } catch (Exception e) { + JdtlsExtActivator.logException("Failed to resolve sync path " + uriStr, e); + } + return null; + } } diff --git a/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/PackageParams.java b/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/PackageParams.java index 4b6468ed..576563c5 100644 --- a/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/PackageParams.java +++ b/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/PackageParams.java @@ -11,6 +11,8 @@ package com.microsoft.jdtls.ext.core; +import java.util.List; + import com.microsoft.jdtls.ext.core.model.NodeKind; /** @@ -31,6 +33,14 @@ public class PackageParams { private boolean isHierarchicalView; + /** + * Optional list of resource URIs (sent by the client on auto-refresh) that + * have just changed on disk. When present, the server only refreshes the + * affected subtrees instead of deeply refreshing the whole source root. + * See https://github.com/microsoft/vscode-java-dependency/issues/914 + */ + private List syncPaths; + public PackageParams() { } @@ -97,4 +107,12 @@ public void setRootPath(String rootPath) { this.rootPath = rootPath; } + public List getSyncPaths() { + return syncPaths; + } + + public void setSyncPaths(List syncPaths) { + this.syncPaths = syncPaths; + } + } diff --git a/src/syncHandler.ts b/src/syncHandler.ts index cbdd05eb..57dd97f9 100644 --- a/src/syncHandler.ts +++ b/src/syncHandler.ts @@ -90,7 +90,18 @@ class SyncHandler implements Disposable { })); this.disposables.push(watcher.onDidCreate((uri: Uri) => { - this.refresh(this.getParentNodeInExplorer(uri)); + const node: ExplorerNode | undefined = this.getParentNodeInExplorer(uri); + // When the created resource lands in a package that is not currently + // rendered, getParentNodeInExplorer resolves to the source root. Tell + // that root which path changed so the server can refresh only that + // subtree instead of deeply refreshing the whole source tree. Gate on + // the node kind (not instanceof) to avoid importing PackageRootNode + // here, which would create a module cycle and break activation. + // See https://github.com/microsoft/vscode-java-dependency/issues/914 + if (node instanceof DataNode && node.nodeData?.kind === NodeKind.PackageRoot) { + (node as unknown as { pendingSyncPaths: Set }).pendingSyncPaths.add(uri.toString()); + } + this.refresh(node); })); this.disposables.push(watcher.onDidDelete((uri: Uri) => { diff --git a/src/views/packageRootNode.ts b/src/views/packageRootNode.ts index 63de2c65..01327579 100644 --- a/src/views/packageRootNode.ts +++ b/src/views/packageRootNode.ts @@ -16,6 +16,14 @@ import { NodeFactory } from "./nodeFactory"; export class PackageRootNode extends DataNode { + /** + * Resource URIs reported by the file watcher as newly created under this + * source root since the last load. Consumed on the next loadData() so the + * server can scope its filesystem refresh to only the changed subtrees. + * See https://github.com/microsoft/vscode-java-dependency/issues/914 + */ + public pendingSyncPaths: Set = new Set(); + constructor(nodeData: INodeData, parent: DataNode, protected _project: ProjectNode) { super(nodeData, parent); } @@ -25,13 +33,28 @@ export class PackageRootNode extends DataNode { } protected async loadData(): Promise { - return Jdtls.getPackageData({ - kind: NodeKind.PackageRoot, - projectUri: this._project.nodeData.uri, - rootPath: this.nodeData.path, - handlerIdentifier: this.nodeData.handlerIdentifier, - isHierarchicalView: Settings.isHierarchicalView(), - }); + let syncPaths: string[] | undefined; + if (this.pendingSyncPaths.size) { + // Snapshot and clear synchronously before the async server call so + // watcher events arriving during the await are not lost. + syncPaths = Array.from(this.pendingSyncPaths); + this.pendingSyncPaths.clear(); + } + try { + return await Jdtls.getPackageData({ + kind: NodeKind.PackageRoot, + projectUri: this._project.nodeData.uri, + rootPath: this.nodeData.path, + handlerIdentifier: this.nodeData.handlerIdentifier, + isHierarchicalView: Settings.isHierarchicalView(), + syncPaths, + }); + } catch (error) { + // Restore the snapshot so a transient server error does not drop the + // pending paths; the next refresh will retry the targeted sync. + syncPaths?.forEach((path) => this.pendingSyncPaths.add(path)); + throw error; + } } protected createChildNodeList(): ExplorerNode[] { diff --git a/test/e2e-plans/java-dep-autorefresh-targeted.yaml b/test/e2e-plans/java-dep-autorefresh-targeted.yaml new file mode 100644 index 00000000..124c8d77 --- /dev/null +++ b/test/e2e-plans/java-dep-autorefresh-targeted.yaml @@ -0,0 +1,105 @@ +# Validates the targeted (scoped) auto-refresh optimization for issue #914. +# Companion to java-dep-refresh-generated-files.yaml (which tests manual Refresh). +# +# On auto-refresh the extension passes the changed URI to the server +# (PackageParams.syncPaths); the server refreshes only the affected subtree (the +# nearest existing ancestor) instead of the whole source root, then closes the +# package root to rebuild its package-fragment list. This plan does NOT call +# java.view.package.refresh — it relies solely on the FileSystemWatcher, so it +# exercises the syncPaths path. Auto-refresh is on by default. +# +# Tree layout and verify policy are the same as the manual-Refresh plan: compact +# virtualized tree, deterministic verifyTreeItem assertions, no `verify:` on the +# file-write step (no reliable visual signal for the LLM judge). +# +# Usage: +# npx autotest run test/e2e-plans/java-dep-autorefresh-targeted.yaml \ +# --override extensionPath= + +name: "Java Dependency — Auto-refresh surfaces a new package (targeted, #914)" +description: | + Validates the targeted (scoped) auto-refresh optimization for issue #914: a + .java file written by an external generator into a brand-new sub-package must + appear in the Java Projects view via the file-watcher auto-refresh alone (no + manual Refresh), which routes the changed URI through PackageParams.syncPaths. + +setup: + extension: "redhat.java" + vscodeVersion: "stable" + workspace: "../maven" + timeout: 180 + settings: + java.configuration.checkProjectSettingsExclusions: false + workbench.startupEditor: "none" + explorer.autoReveal: false + +steps: + - id: "ls-ready" + action: "waitForLanguageServer" + timeout: 180 + + # Free vertical space so the Java Projects tree is not virtualized. + - id: "close-aux-bar" + action: "executeVSCodeCommand workbench.action.closeAuxiliaryBar" + + - id: "collapse-outline" + action: "collapseSidebarSection OUTLINE" + + - id: "collapse-timeline" + action: "collapseSidebarSection TIMELINE" + + - id: "collapse-explorer-folders" + action: "collapseSidebarSection maven" + + - id: "focus-java-projects" + action: "executeVSCodeCommand javaProjectExplorer.focus" + + - id: "wait-tree-load" + action: "wait 3 seconds" + + # The source root must be expanded so a PackageRootNode exists to target. + - id: "expand-project" + action: "expandTreeItem my-app" + verify: "my-app project expanded" + + - id: "expand-source-root" + action: "expandTreeItem src/main/java" + verify: "source root src/main/java expanded" + + - id: "baseline-existing-pkg" + action: "wait 1 seconds" + verifyTreeItem: + name: "com.mycompany.app" + visible: true + + # Negative baseline: the brand-new package must be ABSENT before the file is + # written, so check-new-pkg-autorefresh later observes a genuine appearance + # driven by the watcher, not a pre-existing node. + - id: "baseline-new-pkg-absent" + action: "wait 1 seconds" + verifyTreeItem: + name: "com.mycompany.app.autogen" + visible: false + timeout: 5 + + # Write a file straight to disk into a brand-new sub-package. + - id: "gen-file-new-pkg" + action: "insertLineInFile src/main/java/com/mycompany/app/autogen/Gen914AutoNewPkg.java 1 package com.mycompany.app.autogen;\n\npublic class Gen914AutoNewPkg {\n}\n" + + - id: "dismiss-overlay" + action: "pressKey Escape" + + # Let the file watcher + debounced auto-refresh fire. No manual Refresh. + - id: "wait-for-auto-refresh" + action: "wait 6 seconds" + + - id: "reexpand-source-root" + action: "expandTreeItem src/main/java" + + # The brand-new package appears via auto-refresh alone. + - id: "check-new-pkg-autorefresh" + action: "wait 1 seconds" + verifyTreeItem: + name: "com.mycompany.app.autogen" + visible: true + timeout: 20 diff --git a/test/e2e-plans/java-dep-refresh-generated-files.yaml b/test/e2e-plans/java-dep-refresh-generated-files.yaml new file mode 100644 index 00000000..cf3420d0 --- /dev/null +++ b/test/e2e-plans/java-dep-refresh-generated-files.yaml @@ -0,0 +1,124 @@ +# Regression test for issue #914: manual Refresh must surface externally written +# .java files (a brand-new sub-package and a class in an existing package). +# Pre-fix the shallow DEPTH_ONE refresh never discovered the new package folder. +# +# Tree layout: the Java Projects tree is virtualized, so off-screen rows are not +# in the DOM. The Explorer file tree is collapsed and explorer.autoReveal is off +# so assertions run while the tree is compact and every package node collapsed. +# +# insertLineInFile uses fs.writeFileSync, bypassing VS Code's file service — i.e. +# exactly an external generator. Assertions use the deterministic verifyTreeItem +# DOM check; file-write and refresh steps carry no `verify:` because the LLM +# screenshot judge has no reliable visual signal for them. +# +# Usage: +# npx autotest run test/e2e-plans/java-dep-refresh-generated-files.yaml \ +# --override extensionPath= + +name: "Java Dependency — Refresh surfaces externally generated files (#914)" +description: | + Regression for issue #914. Externally written .java files — one in a brand-new + sub-package, one in an existing package — must both appear in the Java Projects + view after an explicit Refresh. + +setup: + extension: "redhat.java" + vscodeVersion: "stable" + workspace: "../maven" + timeout: 180 + settings: + java.configuration.checkProjectSettingsExclusions: false + workbench.startupEditor: "none" + explorer.autoReveal: false + +steps: + - id: "ls-ready" + action: "waitForLanguageServer" + timeout: 180 + + # Free vertical space so the Java Projects tree is not virtualized. + - id: "close-aux-bar" + action: "executeVSCodeCommand workbench.action.closeAuxiliaryBar" + + - id: "collapse-outline" + action: "collapseSidebarSection OUTLINE" + + - id: "collapse-timeline" + action: "collapseSidebarSection TIMELINE" + + - id: "collapse-explorer-folders" + action: "collapseSidebarSection maven" + + - id: "focus-java-projects" + action: "executeVSCodeCommand javaProjectExplorer.focus" + + - id: "wait-tree-load" + action: "wait 3 seconds" + + - id: "expand-project" + action: "expandTreeItem my-app" + verify: "my-app project expanded" + + - id: "expand-source-root" + action: "expandTreeItem src/main/java" + verify: "source root src/main/java expanded" + + - id: "baseline-existing-pkg" + action: "wait 1 seconds" + verifyTreeItem: + name: "com.mycompany.app" + visible: true + + # Negative baseline: the brand-new package must be ABSENT before any file is + # written. This is the "before" half of the regression's before/after check — + # it proves check-new-pkg later observes a genuine appearance, not a leftover. + - id: "baseline-new-pkg-absent" + action: "wait 1 seconds" + verifyTreeItem: + name: "com.mycompany.app.gen" + visible: false + timeout: 5 + + # Write files straight to disk: one in a brand-new sub-package, one in an + # existing package. + - id: "gen-file-new-pkg" + action: "insertLineInFile src/main/java/com/mycompany/app/gen/Gen914InNewPkg.java 1 package com.mycompany.app.gen;\n\npublic class Gen914InNewPkg {\n}\n" + + - id: "gen-file-existing-pkg" + action: "insertLineInFile src/main/java/com/mycompany/app/Gen914InExisting.java 1 package com.mycompany.app;\n\npublic class Gen914InExisting {\n}\n" + + - id: "dismiss-overlay" + action: "pressKey Escape" + + - id: "settle" + action: "wait 3 seconds" + + # The behaviour under test: an explicit manual Refresh. + - id: "manual-refresh" + action: "executeVSCodeCommand java.view.package.refresh" + + - id: "wait-after-refresh" + action: "wait 4 seconds" + + - id: "reexpand-source-root" + action: "expandTreeItem src/main/java" + + # Core regression: the brand-new package appears after Refresh. + - id: "check-new-pkg" + action: "wait 1 seconds" + verifyTreeItem: + name: "com.mycompany.app.gen" + visible: true + timeout: 15 + + # Sanity: a new class in an existing package also appears. + - id: "expand-existing-pkg" + action: "expandTreeItem com.mycompany.app" + verify: "existing package com.mycompany.app expanded" + + - id: "check-existing-pkg-class" + action: "wait 1 seconds" + verifyTreeItem: + name: "Gen914InExisting" + visible: true + timeout: 15 From 11a0645daaf3692ae0bb02b4eceba5f8764e9990 Mon Sep 17 00:00:00 2001 From: wenyt <75360946+wenytang-ms@users.noreply.github.com> Date: Fri, 5 Jun 2026 14:15:56 +0800 Subject: [PATCH 317/352] ci(e2e): unify Linux + Windows UI tests into one parallel workflow (#1027) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * test: phase A coverage — newJavaRecord, clean.workspace, project.update Adds three more vscode-java-dependency commands to the E2E plans, each exercised through its documented user-visible UI surface: * java-dep-new-types.yaml - Adds a 7th cycle for newJavaRecord between Annotation and Abstract Class. The Record option is filtered out for projects below Java 16 (see JavaType.getDisplayNames in src/explorerCommands/new.ts); the fixture pom.xml is Java 17 so the option renders. Plan goes from 64 → 75 steps. * java-dep-build-lifecycle.yaml - Adds Test 6: java.project.update via the Maven submenu on the project context menu (the command's only UI mount — no palette, no toolbar). Uses the new 'contextMenuSubmenu' autotest action that hovers a submenu trigger then clicks a leaf inside the nested menu. - Adds Test 7: java.project.clean.workspace via the view-title overflow menu. The command may or may not raise a confirmation dialog depending on JDT.LS state; we use the tolerant tryClickDialogButton variant so the step passes either way (cancelling the dialog if shown, avoiding the destructive VS Code reload). Plan goes from 18 → 26 steps. Requires @vscjava/vscode-autotest >= 0.7.11 (adds contextMenuSubmenu). Locally verified: java-dep-new-types.yaml 75/75 passing java-dep-build-lifecycle.yaml 26/26 passing * ci(e2e): parallelize UI tests across plans with matrix strategy Refactor linuxUI.yml and windowsUI.yml from a single sequential job running autotest run-all into a 5-job parallel pipeline modelled after vscode-java-pack/.github/workflows/e2e-autotest.yml: 1. build-: produce VSIX once, upload as artifact 2. discover-plans: scan test/e2e-plans/*.yaml -> matrix output 3. e2e- (matrix per plan): download VSIX, run a single plan 4. analyze-: aggregate results.json across plans into summary.md 5. linux-ui / windows-ui: gate job preserving the original required status-check name so existing branch protection keeps working Per-job timeout drops to 25 min and individual plan failures surface independently. Sub-screenshots from each plan are preserved per-plan in their own artifact for easier triage. * ci(e2e): consolidate Linux + Windows UI workflows into one e2eUI.yml Merges the per-OS workflows (linuxUI.yml, windowsUI.yml) into a single e2eUI.yml with a unified entry point and a single shared summary. Structure: - discover-plans (matrix output) - build-linux / build-windows (VSIX artifacts) - e2e-linux / e2e-windows (matrix) (one job per (OS, plan)) - analyze (one combined summary across both OSes, plan dirs prefixed by OS for clarity) - Linux-UI / Windows-UI (gate jobs) (preserve required status-check names) * ci(e2e): fold OS into the matrix; extract Lint/Checkstyle to its own job Reworks the e2e workflow so {os, plan} is a single cartesian matrix instead of two parallel jobs (e2e-linux, e2e-windows): - lint tslint + checkstyle (ubuntu, OS-agnostic) - discover-plans - build (matrix on os) - e2e (matrix on {os, plan}) cartesian 2 x N parallel jobs - analyze one combined summary across both OSes - Linux-UI / Windows-UI gates preserve required-check names Inspired by vscode-java-pack/e2e-autotest.yml extended with an OS dimension. OS-specific steps (Xvfb, shell flavor) are guarded by runner.os conditionals. * ci(e2e): drop redundant Linux-UI / Windows-UI gate jobs Each matrix cell already surfaces as its own PR check, so a separate gate is unnecessary. Branch protection should be updated to require the individual matrix checks (or the 'E2E Summary' job) directly. * ci(e2e): split e2e back into per-OS pipelines for true parallelism Folding OS into the e2e matrix forced every cell to wait for the entire build matrix to finish (Linux + Windows), so a slow Windows build delayed Linux e2e jobs by ~2.5 min unnecessarily (Copilot review feedback). Split back into independent per-OS pipelines: build-linux -> e2e-linux (matrix on plan) build-windows -> e2e-windows (matrix on plan) Both pipelines feed into the shared discover-plans + analyze jobs, so the unified entry point and combined summary are preserved. --- .github/workflows/e2eUI.yml | 331 +++++++++++++++++++ .github/workflows/linuxUI.yml | 76 ----- .github/workflows/windowsUI.yml | 72 ---- test/e2e-plans/java-dep-build-lifecycle.yaml | 54 ++- test/e2e-plans/java-dep-new-types.yaml | 80 +++-- 5 files changed, 442 insertions(+), 171 deletions(-) create mode 100644 .github/workflows/e2eUI.yml delete mode 100644 .github/workflows/linuxUI.yml delete mode 100644 .github/workflows/windowsUI.yml diff --git a/.github/workflows/e2eUI.yml b/.github/workflows/e2eUI.yml new file mode 100644 index 00000000..96855ee7 --- /dev/null +++ b/.github/workflows/e2eUI.yml @@ -0,0 +1,331 @@ +name: E2E UI Tests + +on: + push: + branches: [ main ] + pull_request: + branches: [ main ] + +# Split-pipeline E2E UI workflow. +# +# lint → tslint + checkstyle (ubuntu, OS-agnostic) +# discover-plans → emits a matrix of test-plan basenames +# +# build-linux ─┐ +# e2e-linux (×plan) ┤ +# ├──→ analyze → unified summary covering both OSes +# build-windows ─┤ +# e2e-windows (×plan)┘ +# +# Per-OS pipelines run completely independently: Linux e2e jobs do NOT +# wait for the Windows VSIX build (and vice versa), so a slow Windows +# build cannot delay the start of Linux e2e plans. Each matrix cell +# surfaces as its own PR check, so failures are visible without an +# extra gate job. +# +# Inspired by vscode-java-pack/.github/workflows/e2e-autotest.yml. + +jobs: + # ── Lint + Checkstyle (OS-agnostic) ───────────────────── + lint: + name: Lint & Checkstyle + runs-on: ubuntu-latest + timeout-minutes: 10 + steps: + - uses: actions/checkout@v4 + + - name: Set up JDK 21 + uses: actions/setup-java@v4 + with: + java-version: '21' + distribution: 'temurin' + + - name: Setup Node.js environment + uses: actions/setup-node@v4 + with: + node-version: 20 + + - name: Install Node.js modules + run: npm install + + - name: Lint + run: npm run tslint + + - name: Checkstyle + working-directory: ./jdtls.ext + run: ./mvnw checkstyle:check + + # ── Discover test plans ───────────────────────────────── + discover-plans: + name: Discover E2E Plans + runs-on: ubuntu-latest + outputs: + matrix: ${{ steps.scan.outputs.matrix }} + steps: + - uses: actions/checkout@v4 + + - name: Scan test plans + id: scan + shell: bash + run: | + plans=$(ls test/e2e-plans/*.yaml | xargs -n1 basename | sed 's/\.yaml$//' | jq -R . | jq -sc .) + echo "matrix=$plans" >> "$GITHUB_OUTPUT" + echo "Found plans: $plans" + + # ── Build VSIX (Linux) ────────────────────────────────── + build-linux: + name: Build VSIX (Linux) + runs-on: ubuntu-latest + timeout-minutes: 20 + steps: + - uses: actions/checkout@v4 + + - name: Set up JDK 21 + uses: actions/setup-java@v4 + with: + java-version: '21' + distribution: 'temurin' + + - name: Setup Node.js environment + uses: actions/setup-node@v4 + with: + node-version: 20 + + - name: Install Node.js modules + run: npm install + + - name: Install VSCE + run: npm install -g @vscode/vsce + + - name: Build OSGi bundle + run: npm run build-server + + - name: Build VSIX file + run: vsce package -o vscode-java-dependency.vsix + + - name: Upload VSIX artifact + uses: actions/upload-artifact@v4 + with: + name: vsix-linux + path: vscode-java-dependency.vsix + retention-days: 1 + + # ── Build VSIX (Windows) ──────────────────────────────── + build-windows: + name: Build VSIX (Windows) + runs-on: windows-latest + timeout-minutes: 20 + steps: + - uses: actions/checkout@v4 + + - name: Set up JDK 21 + uses: actions/setup-java@v4 + with: + java-version: '21' + distribution: 'temurin' + + - name: Setup Node.js environment + uses: actions/setup-node@v4 + with: + node-version: 20 + + - name: Install Node.js modules + run: npm install + + - name: Install VSCE + run: npm install -g @vscode/vsce + + - name: Build OSGi bundle + run: npm run build-server + + - name: Build VSIX file + run: vsce package -o vscode-java-dependency.vsix + + - name: Upload VSIX artifact + uses: actions/upload-artifact@v4 + with: + name: vsix-windows + path: vscode-java-dependency.vsix + retention-days: 1 + + # ── E2E plans (Linux) — depends only on Linux build ───── + e2e-linux: + name: E2E Linux (${{ matrix.plan }}) + needs: [ build-linux, discover-plans ] + runs-on: ubuntu-latest + timeout-minutes: 25 + strategy: + fail-fast: false + matrix: + plan: ${{ fromJson(needs.discover-plans.outputs.matrix) }} + + steps: + - uses: actions/checkout@v4 + + - name: Setup Build Environment (Xvfb) + run: | + sudo apt-get update + sudo apt-get install -y libxkbfile-dev pkg-config libsecret-1-dev libxss1 dbus xvfb libgtk-3-0 libgbm1 + # Use 1920x1080 so the Java Projects view (rendered inside the Explorer + # sidebar) gets enough vertical space. With 1024x768 the sticky + # pane-header overlapped tree rows and intercepted click events. + sudo /usr/bin/Xvfb :99 -screen 0 1920x1080x24 > /dev/null 2>&1 & + sleep 3 + + - name: Set up JDK 21 + uses: actions/setup-java@v4 + with: + java-version: '21' + distribution: 'temurin' + + - name: Setup Node.js environment + uses: actions/setup-node@v4 + with: + node-version: 20 + + - name: Setup autotest + run: npm install -g @vscjava/vscode-autotest + + - name: Download VSIX artifact + uses: actions/download-artifact@v4 + with: + name: vsix-linux + path: . + + - name: E2E Test — ${{ matrix.plan }} + shell: bash + env: + AZURE_OPENAI_ENDPOINT: ${{ secrets.AZURE_OPENAI_ENDPOINT }} + AZURE_OPENAI_API_KEY: ${{ secrets.AZURE_OPENAI_API_KEY }} + AZURE_OPENAI_DEPLOYMENT: ${{ secrets.AZURE_OPENAI_DEPLOYMENT }} + run: | + DISPLAY=:99 autotest run "test/e2e-plans/${{ matrix.plan }}.yaml" \ + --vsix "$(pwd)/vscode-java-dependency.vsix" \ + --output "test-results/${{ matrix.plan }}" + + - name: Upload test results + if: ${{ always() }} + uses: actions/upload-artifact@v4 + with: + name: e2e-results-linux-${{ matrix.plan }} + path: test-results/ + retention-days: 7 + + # ── E2E plans (Windows) — depends only on Windows build ─ + e2e-windows: + name: E2E Windows (${{ matrix.plan }}) + needs: [ build-windows, discover-plans ] + runs-on: windows-latest + timeout-minutes: 25 + strategy: + fail-fast: false + matrix: + plan: ${{ fromJson(needs.discover-plans.outputs.matrix) }} + + steps: + - uses: actions/checkout@v4 + + - name: Set up JDK 21 + uses: actions/setup-java@v4 + with: + java-version: '21' + distribution: 'temurin' + + - name: Setup Node.js environment + uses: actions/setup-node@v4 + with: + node-version: 20 + + - name: Setup autotest + run: npm install -g @vscjava/vscode-autotest + + - name: Download VSIX artifact + uses: actions/download-artifact@v4 + with: + name: vsix-windows + path: . + + - name: E2E Test — ${{ matrix.plan }} + shell: pwsh + env: + AZURE_OPENAI_ENDPOINT: ${{ secrets.AZURE_OPENAI_ENDPOINT }} + AZURE_OPENAI_API_KEY: ${{ secrets.AZURE_OPENAI_API_KEY }} + AZURE_OPENAI_DEPLOYMENT: ${{ secrets.AZURE_OPENAI_DEPLOYMENT }} + run: | + autotest run "test/e2e-plans/${{ matrix.plan }}.yaml" --vsix "$((Get-Location).Path)\vscode-java-dependency.vsix" --output "test-results\${{ matrix.plan }}" + + - name: Upload test results + if: ${{ always() }} + uses: actions/upload-artifact@v4 + with: + name: e2e-results-windows-${{ matrix.plan }} + path: test-results/ + retention-days: 7 + + # ── Unified analysis across both OSes ─────────────────── + analyze: + name: E2E Summary + needs: [ e2e-linux, e2e-windows ] + if: ${{ always() }} + runs-on: ubuntu-latest + steps: + - name: Setup Node.js environment + uses: actions/setup-node@v4 + with: + node-version: 20 + + - name: Setup autotest + run: npm install -g @vscjava/vscode-autotest + + - name: Download all plan results + uses: actions/download-artifact@v4 + with: + pattern: e2e-results-* + path: all-results + merge-multiple: false + + - name: Organize results (prefix each plan by OS) + shell: bash + run: | + mkdir -p test-results + for dir in all-results/e2e-results-linux-*/; do + [ -d "$dir" ] || continue + find "$dir" -name "results.json" -exec dirname {} \; | while read d; do + name=$(basename "$d") + mkdir -p "test-results/linux-$name" + cp -r "$d"/. "test-results/linux-$name"/ + done + done + for dir in all-results/e2e-results-windows-*/; do + [ -d "$dir" ] || continue + find "$dir" -name "results.json" -exec dirname {} \; | while read d; do + name=$(basename "$d") + mkdir -p "test-results/windows-$name" + cp -r "$d"/. "test-results/windows-$name"/ + done + done + echo "Organized plan result directories:" + ls test-results/ || true + + - name: Analyze results + env: + AZURE_OPENAI_ENDPOINT: ${{ secrets.AZURE_OPENAI_ENDPOINT }} + AZURE_OPENAI_API_KEY: ${{ secrets.AZURE_OPENAI_API_KEY }} + AZURE_OPENAI_DEPLOYMENT: ${{ secrets.AZURE_OPENAI_DEPLOYMENT }} + run: autotest analyze test-results --output test-results + + - name: Write Job Summary + if: always() + shell: bash + run: | + if [ -f test-results/summary.md ]; then + cat test-results/summary.md >> "$GITHUB_STEP_SUMMARY" + fi + + - name: Upload aggregate summary + if: always() + uses: actions/upload-artifact@v4 + with: + name: e2e-aggregate-summary + path: test-results/summary.md + retention-days: 30 diff --git a/.github/workflows/linuxUI.yml b/.github/workflows/linuxUI.yml deleted file mode 100644 index 1ee20df0..00000000 --- a/.github/workflows/linuxUI.yml +++ /dev/null @@ -1,76 +0,0 @@ -name: CI - -on: - push: - branches: [ main ] - pull_request: - branches: [ main ] - -jobs: - linuxUI: - name: Linux-UI - runs-on: ubuntu-latest - timeout-minutes: 30 - steps: - - uses: actions/checkout@v4 - - - name: Setup Build Environment - run: | - sudo apt-get update - sudo apt-get install -y libxkbfile-dev pkg-config libsecret-1-dev libxss1 dbus xvfb libgtk-3-0 libgbm1 - # Use 1920x1080 so the Java Projects view (rendered inside the Explorer - # sidebar) gets enough vertical space. With 1024x768 the sticky - # pane-header overlapped tree rows and intercepted click events. - sudo /usr/bin/Xvfb :99 -screen 0 1920x1080x24 > /dev/null 2>&1 & - sleep 3 - - - name: Set up JDK 21 - uses: actions/setup-java@v4 - with: - java-version: '21' - distribution: 'temurin' - - - name: Setup Node.js environment - uses: actions/setup-node@v4 - with: - node-version: 20 - - - name: Install Node.js modules - run: npm install - - - name: Install VSCE - run: npm install -g @vscode/vsce - - - name: Build OSGi bundle - run: npm run build-server - - - name: Build VSIX file - run: vsce package -o vscode-java-dependency.vsix - - - name: Setup autotest - run: npm install -g @vscjava/vscode-autotest - - - name: E2E Test (autotest) - env: - AZURE_OPENAI_ENDPOINT: ${{ secrets.AZURE_OPENAI_ENDPOINT }} - AZURE_OPENAI_API_KEY: ${{ secrets.AZURE_OPENAI_API_KEY }} - AZURE_OPENAI_DEPLOYMENT: ${{ secrets.AZURE_OPENAI_DEPLOYMENT }} - run: | - DISPLAY=:99 autotest run-all test/e2e-plans \ - --vsix $(pwd)/vscode-java-dependency.vsix \ - --output test-results - - - name: Upload test results - if: ${{ always() }} - uses: actions/upload-artifact@v4 - with: - name: e2e-results-linux - path: test-results/ - retention-days: 7 - - - name: Write Job Summary - if: always() - run: | - if [ -f test-results/summary.md ]; then - cat test-results/summary.md >> "$GITHUB_STEP_SUMMARY" - fi diff --git a/.github/workflows/windowsUI.yml b/.github/workflows/windowsUI.yml deleted file mode 100644 index c92c6640..00000000 --- a/.github/workflows/windowsUI.yml +++ /dev/null @@ -1,72 +0,0 @@ -name: CI - -on: - push: - branches: [ main ] - pull_request: - branches: [ main ] - -jobs: - windowsUI: - name: Windows-UI - runs-on: windows-latest - timeout-minutes: 30 - steps: - - uses: actions/checkout@v4 - - - name: Set up JDK 21 - uses: actions/setup-java@v4 - with: - java-version: '21' - distribution: 'temurin' - - - name: Setup Node.js environment - uses: actions/setup-node@v4 - with: - node-version: 20 - - - name: Install Node.js modules - run: npm install - - - name: Install VSCE - run: npm install -g @vscode/vsce - - - name: Lint - run: npm run tslint - - - name: Checkstyle - working-directory: .\jdtls.ext - run: .\mvnw.cmd checkstyle:check - - - name: Build OSGi bundle - run: npm run build-server - - - name: Build VSIX file - run: vsce package -o vscode-java-dependency.vsix - - - name: Setup autotest - run: npm install -g @vscjava/vscode-autotest - - - name: E2E Test (autotest) - env: - AZURE_OPENAI_ENDPOINT: ${{ secrets.AZURE_OPENAI_ENDPOINT }} - AZURE_OPENAI_API_KEY: ${{ secrets.AZURE_OPENAI_API_KEY }} - AZURE_OPENAI_DEPLOYMENT: ${{ secrets.AZURE_OPENAI_DEPLOYMENT }} - run: | - autotest run-all test/e2e-plans --vsix "$((Get-Location).Path)\vscode-java-dependency.vsix" --output test-results - - - name: Upload test results - if: ${{ always() }} - uses: actions/upload-artifact@v4 - with: - name: e2e-results-windows - path: test-results/ - retention-days: 7 - - - name: Write Job Summary - if: always() - shell: bash - run: | - if [ -f test-results/summary.md ]; then - cat test-results/summary.md >> "$GITHUB_STEP_SUMMARY" - fi diff --git a/test/e2e-plans/java-dep-build-lifecycle.yaml b/test/e2e-plans/java-dep-build-lifecycle.yaml index ab650c0a..b0f6df66 100644 --- a/test/e2e-plans/java-dep-build-lifecycle.yaml +++ b/test/e2e-plans/java-dep-build-lifecycle.yaml @@ -12,10 +12,8 @@ # - java.project.build.project (Build Project — project context menu) # - java.project.rebuild (Rebuild Project — project context menu) # - java.project.reloadProjectFromActiveFile (Reload Project — pom.xml editor title) -# -# Note: java.project.clean.workspace is intentionally omitted from this plan -# because the JDT.LS clean command triggers a VS Code window reload, which -# tears down the autotest browser session. +# - java.project.update (Reload Project — Maven submenu on project context menu) +# - java.project.clean.workspace (Clean Workspace — view-title overflow; dialog cancelled to avoid VS Code reload) # # Verification strategy # ───────────────────── @@ -165,3 +163,51 @@ steps: - id: "wait-reload-project" action: "waitForLanguageServer" timeout: 180 + + # ── Test 6: Reload Project (Maven submenu on project context menu) ── + # `java.project.update` lives in the `javaProject.maven` submenu under the + # project context menu's `9_configuration@10` group. Real users right-click + # the Maven project node → hover the "Maven" submenu → click "Reload + # Project". This is the only UI surface for this command (no command + # palette entry, no toolbar button). + - id: "close-pom-editors" + action: "run command View: Close All Editors" + + - id: "focus-java-projects-reload" + action: "executeVSCodeCommand javaProjectExplorer.focus" + waitBefore: 1 + + - id: "click-project-update" + action: "click my-app tree item" + waitBefore: 1 + + - id: "context-update-maven" + action: 'contextMenuSubmenu my-app Maven "Reload Project"' + + - id: "wait-update-project" + action: "waitForLanguageServer" + timeout: 180 + + # ── Test 7: Clean Workspace (overflow menu, dialog cancelled if shown) ── + # `java.project.clean.workspace` is contributed to the Java Projects view + # title-bar `overflow_20@10` group. When clicked it forwards to JDT.LS's + # `java.clean.workspace`. Depending on the redhat.java / JDT.LS version + # this may or may not raise a modal warning dialog ("…delete workspace + # cache and restart?") before doing the work. We use a *tolerant* dialog + # cancel (`tryClickDialogButton`) so the step passes whether or not the + # dialog appears — when it does appear we cancel to avoid the destructive + # VS Code reload; when it does not we proceed straight to the LS settle + # check. The primary coverage signal is the overflow-menu mount + click, + # which `trigger-clean-workspace` already exercises with a deterministic + # `clickViewTitleAction`. + - id: "trigger-clean-workspace" + action: 'clickViewTitleAction "Java Projects" "Clean Workspace"' + + - id: "cancel-clean-dialog" + action: "tryClickDialogButton Cancel" + # No `verify:` — tolerant action: clicks Cancel if dialog appears, else + # silently no-ops. `trigger-clean-workspace` is the deterministic signal. + + - id: "wait-clean-settle" + action: "waitForLanguageServer" + timeout: 60 diff --git a/test/e2e-plans/java-dep-new-types.yaml b/test/e2e-plans/java-dep-new-types.yaml index 1477737c..4e717895 100644 --- a/test/e2e-plans/java-dep-new-types.yaml +++ b/test/e2e-plans/java-dep-new-types.yaml @@ -7,6 +7,7 @@ # Commands exercised (each invoked through the New... quick-pick on a node): # - java.view.package.newJavaInterface (Interface) # - java.view.package.newJavaEnum (Enum) +# - java.view.package.newJavaRecord (Record — requires Java 16+) # - java.view.package.newJavaAnnotation (Annotation) # - java.view.package.newJavaAbstractClass (Abstract Class) # - java.view.package.newFile ("File" option) @@ -31,7 +32,7 @@ name: "Java Dependency — New File Types" description: | Tests all the "New ..." quick-pick options in the Java Projects view that are not already covered by java-dep-file-operations.yaml: - Interface / Enum / Annotation / Abstract Class / File / Folder. + Interface / Enum / Record / Annotation / Abstract Class / File / Folder. setup: extension: "redhat.java" @@ -190,7 +191,9 @@ steps: action: "executeVSCodeCommand javaProjectExplorer.focus" waitBefore: 1 - # ── Test 4: New Abstract Class ── + # ── Test 4: New Record (Java 16+; fixture pom uses Java 17) ── + # The Record option is only shown when the project source level is >= 16, + # see JavaType.getDisplayNames(..., includeRecord) in src/explorerCommands/new.ts. - id: "click-project-4" action: "click my-app tree item" waitBefore: 1 @@ -198,19 +201,19 @@ steps: - id: "trigger-new-4" action: "clickTreeItemAction my-app New..." - - id: "select-abstract-class" - action: "select Abstract Class option" + - id: "select-record" + action: "select Record option" - id: "select-source-folder-4" action: "select src/main/java option" - - id: "enter-abstract-name" - action: "fillQuickInput MyAbstract" + - id: "enter-record-name" + action: "fillQuickInput MyRecord" - - id: "verify-abstract-tab" + - id: "verify-record-tab" action: "wait 2 seconds" verifyEditorTab: - title: "MyAbstract.java" + title: "MyRecord.java" timeout: 20 - id: "save-4" @@ -229,9 +232,7 @@ steps: action: "executeVSCodeCommand javaProjectExplorer.focus" waitBefore: 1 - # ── Test 5: New File (plain non-Java file via "File" option) ── - # The "File" entry routes to `java.view.package.newFile` and writes the - # file under the project root (the node we triggered from). + # ── Test 5: New Abstract Class ── - id: "click-project-5" action: "click my-app tree item" waitBefore: 1 @@ -239,6 +240,47 @@ steps: - id: "trigger-new-5" action: "clickTreeItemAction my-app New..." + - id: "select-abstract-class" + action: "select Abstract Class option" + + - id: "select-source-folder-5" + action: "select src/main/java option" + + - id: "enter-abstract-name" + action: "fillQuickInput MyAbstract" + + - id: "verify-abstract-tab" + action: "wait 2 seconds" + verifyEditorTab: + title: "MyAbstract.java" + timeout: 20 + + - id: "save-5" + action: "executeVSCodeCommand workbench.action.files.saveAll" + + - id: "close-editors-5" + action: "run command View: Close All Editors" + + - id: "collapse-tree-5" + action: 'clickViewTitleAction "Java Projects" "Collapse All"' + + - id: "collapse-workspace-root-6" + action: "collapseWorkspaceRoot" + + - id: "focus-java-projects-6" + action: "executeVSCodeCommand javaProjectExplorer.focus" + waitBefore: 1 + + # ── Test 6: New File (plain non-Java file via "File" option) ── + # The "File" entry routes to `java.view.package.newFile` and writes the + # file under the project root (the node we triggered from). + - id: "click-project-6" + action: "click my-app tree item" + waitBefore: 1 + + - id: "trigger-new-6" + action: "clickTreeItemAction my-app New..." + - id: "select-file" action: "select File option" @@ -251,30 +293,30 @@ steps: title: "notes.txt" timeout: 20 - - id: "save-5" + - id: "save-6" action: "executeVSCodeCommand workbench.action.files.saveAll" - - id: "close-editors-5" + - id: "close-editors-6" action: "run command View: Close All Editors" - - id: "collapse-tree-5" + - id: "collapse-tree-6" action: 'clickViewTitleAction "Java Projects" "Collapse All"' - - id: "collapse-workspace-root-6" + - id: "collapse-workspace-root-7" action: "collapseWorkspaceRoot" - - id: "focus-java-projects-6" + - id: "focus-java-projects-7" action: "executeVSCodeCommand javaProjectExplorer.focus" waitBefore: 1 - # ── Test 6: New Folder ── + # ── Test 7: New Folder ── # Folder creation has no editor side-effect — verify by checking the new # folder exists on disk under the workspace root. - - id: "click-project-6" + - id: "click-project-7" action: "click my-app tree item" waitBefore: 1 - - id: "trigger-new-6" + - id: "trigger-new-7" action: "clickTreeItemAction my-app New..." - id: "select-folder" From 4db30ababed1903d257746b0d64018a1f0f88c35 Mon Sep 17 00:00:00 2001 From: wenyt <75360946+wenytang-ms@users.noreply.github.com> Date: Mon, 8 Jun 2026 15:05:21 +0800 Subject: [PATCH 318/352] test(e2e): cover classpath / referenced-libraries commands (#1028) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * test(fixture): add extra-a.jar/extra-b.jar for classpath e2e plan * test(e2e): add classpath / referenced-libraries plan Cover the four java.project.* classpath commands on an invisible (unmanaged-folder) project: - java.project.refreshLibraries -> Refresh inline icon, idempotent - java.project.addLibraries -> + inline icon + simpleFileDialog - java.project.removeLibrary -> include-removal branch - java.project.addLibraryFolders -> command id + Select Library Folders - java.project.removeLibrary (#2) -> exclude-addition branch Reuse the existing est/invisible fixture and the two new xtraJars/extra-{a,b}.jar files committed earlier so all 33 steps run deterministically against the worktree workspace. Auto-discovered by the existing matrix in .github/workflows/e2eUI.yml, no CI wiring needed. * fix(e2e): use cross-platform workspaceFolderUri for removeLibrary URI The previous template file:///${workspaceFolder}/extraJars/extra-a.jar happened to round-trip through vscode.Uri.parse(...).fsPath on Windows (where ${workspaceFolder} is a C:\... path) but on Linux it produced file:////home/runner/... (FOUR slashes). Uri.parse mapped that to a //home/... path, so workspace.asRelativePath did not match the include entry and removeLibrary silently did nothing -- both verify-extra-a-gone and verify-extra-a-excluded then timed out on the Linux CI matrix. Switch to the new ${workspaceFolderUri} placeholder (autotest 0.7.13), which is backed by Node's url.pathToFileURL and produces a correctly formed file:// URI on both Windows and POSIX. --- test/e2e-plans/java-dep-classpath.yaml | 290 +++++++++++++++++++++++++ test/invisible/extraJars/extra-a.jar | Bin 0 -> 901 bytes test/invisible/extraJars/extra-b.jar | Bin 0 -> 901 bytes 3 files changed, 290 insertions(+) create mode 100644 test/e2e-plans/java-dep-classpath.yaml create mode 100644 test/invisible/extraJars/extra-a.jar create mode 100644 test/invisible/extraJars/extra-b.jar diff --git a/test/e2e-plans/java-dep-classpath.yaml b/test/e2e-plans/java-dep-classpath.yaml new file mode 100644 index 00000000..cd3e7d4a --- /dev/null +++ b/test/e2e-plans/java-dep-classpath.yaml @@ -0,0 +1,290 @@ +# Test Plan: Java Dependency — Classpath / Referenced Libraries +# +# Covers the referenced-library management commands contributed by +# vscode-java-dependency. These commands are only active for invisible +# (unmanaged-folder) projects — Maven / Gradle projects manage their +# classpath through pom.xml / build.gradle and do NOT expose the +# Referenced Libraries container's inline actions. +# +# Commands exercised: +# - java.project.refreshLibraries (Refresh — inline title icon on Referenced Libraries) +# - java.project.addLibraries (Add Jar Libraries… — inline `+` icon) +# - java.project.removeLibrary (Remove from Project Classpath — invoked +# by command id in both `include`-removal +# and `exclude`-addition modes) +# - java.project.addLibraryFolders (Add Library Folders… — Alt-variant of `+` icon; +# no plain-click UI affordance, invoked via command path) +# +# Verification strategy +# ───────────────────── +# `referencedLibraries` is a workspace setting (`java.project.referencedLibraries`) +# whose include/exclude globs are reflected live in the JAVA PROJECTS tree under +# the "Referenced Libraries" container. Each command we exercise either inserts +# a new include glob (addLibraries / addLibraryFolders), removes/excludes one +# (removeLibrary), or re-reads the setting from disk (refreshLibraries). We +# therefore assert state by name-matching jar leaves in the tree with the +# deterministic `verifyTreeItem` block — both presence (`visible: true`, the +# default) and absence (`visible: false`). +# +# Substring matching for jar leaves +# ───────────────────────────────── +# Each jar leaf is rendered as ".jar ", +# so the accessible name carries the full resolved path. We deliberately omit +# `exact: true` on jar `verifyTreeItem` blocks — the driver falls back to +# substring matching, which is exactly what we need to locate a leaf by its +# basename. The project root (`invisible`) keeps `exact: true` because no +# description is appended to project-level rows. +# +# Fixture layout (test/invisible) +# ─────────────────────────────── +# .vscode/settings.json java.project.referencedLibraries = ["lib/**/*.jar"] +# lib/simple.jar already attached at startup via the include glob +# libSource/simple.jar existing companion file (unrelated to this plan) +# extraJars/extra-a.jar added/removed via the UI in cycles 2 + 3 +# extraJars/extra-b.jar surfaced by cycle 4's folder-add (extra-a stays excluded) +# +# Native file/folder pickers are intercepted by `setup.mockOpenDialog` — the +# first entry is consumed by `addLibraries`, the second by `addLibraryFolders`. +# +# Usage: +# npx autotest run test/e2e-plans/java-dep-classpath.yaml --vsix + +name: "Java Dependency — Classpath / Referenced Libraries" +description: | + Tests the four referenced-library commands on an invisible (unmanaged) + Java project: refreshLibraries, addLibraries, removeLibrary, and + addLibraryFolders. + +setup: + extension: "redhat.java" + vscodeVersion: "stable" + workspace: "../invisible" + timeout: 240 + settings: + java.configuration.checkProjectSettingsExclusions: false + workbench.startupEditor: "none" + # Native file/folder pickers are mocked at the Electron `dialog.showOpenDialog` + # layer, but VS Code's smoke-test driver suppresses the native dialog and + # falls back to its internal quick-pick `simpleFileDialog`. The mock therefore + # never fires — instead we drive the simple dialog with `fillQuickInput`, + # typing the resolved jar / folder path and pressing Enter. The mockOpenDialog + # block below is kept as a behavioural reference (and harmless no-op). + mockOpenDialog: + - ["~/extraJars/extra-a.jar"] + - ["~/extraJars"] + +steps: + # ── Setup: activate the Java extension, wait for LS, clear sidebar ── + # Invisible projects do not auto-activate redhat.java the way Maven / + # Gradle workspaces do (those activate via the pom.xml / build.gradle + # workspaceContains contributions). Open `src/App.java` first so the + # Language Server actually starts — otherwise `waitForLanguageServer` + # times out and the Java Projects view never registers. + - id: "open-bootstrap-file" + action: "open file src/App.java" + + - id: "ls-ready" + action: "waitForLanguageServer" + # No `verify:` — `waitForLanguageServer` is itself the deterministic + # readiness check. The AFTER screenshot may transiently show + # "Java: Building - 0%" which a strict LLM mis-reads as a failure. + timeout: 180 + + - id: "close-aux-bar" + action: "executeVSCodeCommand workbench.action.closeAuxiliaryBar" + verify: "Auxiliary bar (Chat) closed" + + - id: "collapse-outline" + action: "collapseSidebarSection OUTLINE" + + - id: "collapse-timeline" + action: "collapseSidebarSection TIMELINE" + + # Single-folder workspaces don't have a collapsible aria-level=1 workspace + # root inside `.explorer-folders-view`, so `collapseWorkspaceRoot` is a + # no-op here. Instead collapse the whole `invisible` pane in the EXPLORER + # view container — otherwise its top-level entries (.vscode/extraJars/ + # lib/libSource/src) push the JAVA PROJECTS pane down so far that the + # virtualised list does not render the jar leaves and `verifyTreeItem` + # times out hunting an off-screen node. + - id: "collapse-explorer-pane" + action: "collapseSidebarSection invisible" + + - id: "focus-java-projects" + action: "executeVSCodeCommand javaProjectExplorer.focus" + verify: "Java Projects view is focused" + + - id: "wait-tree-load" + action: "wait 5 seconds" + + # Invisible-project root takes the worktree folder name (`invisible`). + - id: "verify-project-node" + action: "wait 1 seconds" + # No `verify:` — state-check step; `verifyTreeItem` is authoritative. + verifyTreeItem: + name: "invisible" + exact: true + timeout: 15 + + - id: "expand-project" + action: "expandTreeItem invisible" + waitBefore: 2 + + - id: "expand-referenced-libraries" + action: "expandTreeItem Referenced Libraries" + waitBefore: 2 + + # Baseline: lib/simple.jar matches the default include glob `lib/**/*.jar`. + # No `exact:` — the jar row's accessible name includes a description with the + # resolved jar path; substring match on the basename is sufficient and stable. + - id: "verify-baseline-simple-jar" + action: "wait 1 seconds" + verifyTreeItem: + name: "simple.jar" + timeout: 15 + + # ── Cycle 1: java.project.refreshLibraries ── + # Click the inline `$(refresh)` icon on the Referenced Libraries container. + # The aria-label is the localised command title — here "Refresh". The action + # is idempotent: nothing on disk changed, so simple.jar must remain attached. + - id: "click-refresh-libraries" + action: 'clickTreeItemAction "Referenced Libraries" "Refresh"' + + - id: "wait-after-refresh" + action: "wait 3 seconds" + + - id: "verify-refresh-stable" + action: "wait 1 seconds" + verifyTreeItem: + name: "simple.jar" + timeout: 15 + + # ── Cycle 2: java.project.addLibraries ── + # Click the inline `$(add)` icon on the Referenced Libraries container. + # aria-label = "Add Jar Libraries to Project Classpath...". Partial match + # on "Add Jar Libraries" is enough — the driver does `aria-label.includes()`. + # In smoke-test mode VS Code substitutes its quick-pick `simpleFileDialog` + # for the native picker, so we type the resolved jar path into the input + # bar and press Enter via `fillQuickInput`. The command then appends the + # new path to `java.project.referencedLibraries.include`. + - id: "click-add-libraries" + action: 'clickTreeItemAction "Referenced Libraries" "Add Jar Libraries"' + + - id: "type-add-libraries-path" + action: "fillQuickInput ${workspaceFolder}/extraJars/extra-a.jar" + + - id: "wait-after-add" + action: "wait 5 seconds" + + - id: "verify-extra-a-added" + action: "wait 1 seconds" + verifyTreeItem: + name: "extra-a.jar" + timeout: 20 + + # ── Cycle 3: java.project.removeLibrary ── + # Invoke the command directly. The inline `$(remove)` icon on the jar leaf + # is rendered only on row hover and its `` hit-target + # is narrower than the wrapping `
    1. `, so the centre-of- + # actionItem click that `clickTreeItemAction` performs lands consistently on + # extension-contributed view-title icons (`+`, `$(refresh)`) but not on the + # jar-leaf `–`. Driving the command by id sidesteps the hit-target gap and + # exercises the same handler — `removeLibrary(Uri.parse(node.uri).fsPath)`. + # + # We pass a `{uri}` payload as JSON. JSON.parse runs before + # resolveWorkspacePlaceholders, so `${workspaceFolderUri}` here is a literal + # substring inside a valid JSON string. autotest substitutes it with a + # correctly-formed `file:///...` URI for the current OS (drive-letter form + # on Windows, plain absolute path on POSIX), so the same template round-trips + # through `Uri.parse(...).fsPath` and `workspace.asRelativePath(...)` to + # match the include entry that `java.project.addLibraries` wrote in cycle 2. + - id: "invoke-remove-extra-a" + action: 'executeVSCodeCommand java.project.removeLibrary {"uri":"${workspaceFolderUri}/extraJars/extra-a.jar"}' + + - id: "wait-after-remove" + action: "wait 5 seconds" + + - id: "verify-extra-a-gone" + action: "wait 1 seconds" + verifyTreeItem: + name: "extra-a.jar" + visible: false + timeout: 20 + + - id: "verify-simple-still-present" + action: "wait 1 seconds" + verifyTreeItem: + name: "simple.jar" + timeout: 15 + + # ── Cycle 4: java.project.addLibraryFolders ── + # The `addLibraryFolders` command has no plain-click affordance — it is + # only bound as the `alt:` variant of the `+` icon (Alt-click). autotest + # 0.7.x has no Alt-modifier tree-item action, so we invoke the command + # directly. The same simpleFileDialog appears in folder-pick mode; we + # type the resolved folder path and press Enter. The command appends + # `extraJars/**/*.jar` (the folder glob) to the include list. + # + # Because extra-a.jar is now in the exclude list, only extra-b.jar + # surfaces from the folder-add — making this a sharp differentiation + # test against cycle 3's removeLibrary outcome. + - id: "invoke-add-library-folders" + action: "executeVSCodeCommand java.project.addLibraryFolders" + + # In folder-pick mode the simpleFileDialog treats Enter on a folder as + # "navigate into", so `fillQuickInput` types the path AND opens the folder. + # The "Select Library Folders" button is the explicit confirmation + # affordance; clicking it is what actually returns the URI to the command. + - id: "type-add-folder-path" + action: "fillQuickInput ${workspaceFolder}/extraJars" + + - id: "confirm-folder-select" + action: "tryClickButton Select Library Folders" + + - id: "wait-after-add-folder" + action: "wait 5 seconds" + + - id: "verify-extra-b-via-folder" + action: "wait 1 seconds" + verifyTreeItem: + name: "extra-b.jar" + timeout: 20 + + # Sanity-check that extra-a.jar is back too — `removeLibrary` in cycle 3 + # only stripped the explicit `extraJars/extra-a.jar` include entry; it did + # NOT add an exclude. The folder glob `extraJars/**/*.jar` therefore + # re-attaches both jars. This is the exact behavioural contract documented + # in libraryController.ts (the `if (removedPaths.length === 0)` branch + # only fires for glob-matched jars). + - id: "verify-extra-a-reattached-via-glob" + action: "wait 1 seconds" + verifyTreeItem: + name: "extra-a.jar" + timeout: 15 + + # ── Cycle 5: java.project.removeLibrary (exclude code path) ── + # extra-a.jar is now attached via the folder glob, NOT an explicit include. + # Removing it now exercises the second branch of removeLibrary: the include + # list has no exact match for the relative path, so the handler appends + # `extraJars/extra-a.jar` to `referencedLibraries.exclude`. The folder + # glob still attaches extra-b.jar, so it must stay visible while extra-a + # disappears — proving the exclude path works independently of the include + # removal already covered in cycle 3. + - id: "invoke-remove-extra-a-glob" + action: 'executeVSCodeCommand java.project.removeLibrary {"uri":"${workspaceFolderUri}/extraJars/extra-a.jar"}' + + - id: "wait-after-glob-remove" + action: "wait 5 seconds" + + - id: "verify-extra-a-excluded" + action: "wait 1 seconds" + verifyTreeItem: + name: "extra-a.jar" + visible: false + timeout: 20 + + - id: "verify-extra-b-still-via-glob" + action: "wait 1 seconds" + verifyTreeItem: + name: "extra-b.jar" + timeout: 15 diff --git a/test/invisible/extraJars/extra-a.jar b/test/invisible/extraJars/extra-a.jar new file mode 100644 index 0000000000000000000000000000000000000000..d8cc4e6f4c1e70f26f29749bda44b67b6c644ce6 GIT binary patch literal 901 zcmWIWW@Zs#;Nak3n4R}0hye+RFt9NAx`sIFdiuHP`#So0y1532==r++JH^28+4sz8 zA8%c~i@e^tTIbH3-yCFc#rVO~Prhf)TrNH5siU_o=!3`ElPCGl>!0#``1H|JCWZiS zc8(*LzepJatuO@Q0Jz07(JU4K%6g>c$Cd^0s&DOS!vU z7Ur-s$h~}9@Wb;@rHoHEUN%ztpu9%0VS&SztXs!E$1P9XvHnY2D#wvke!<&c?aDs& z{m6=n_GcR#!sdppxp3>EZ?wY1>fpIy>nhh}ZrA=O3ss-}W$-sO0>e%rne8Yr^fnf?WD8(@{i7+4%J926SC3aMRE9oPf0!q2aHh@wt0#pK- X=;=7Xo0Scuf(Zy)fb?si+ZY%C!fI$z literal 0 HcmV?d00001 diff --git a/test/invisible/extraJars/extra-b.jar b/test/invisible/extraJars/extra-b.jar new file mode 100644 index 0000000000000000000000000000000000000000..d8cc4e6f4c1e70f26f29749bda44b67b6c644ce6 GIT binary patch literal 901 zcmWIWW@Zs#;Nak3n4R}0hye+RFt9NAx`sIFdiuHP`#So0y1532==r++JH^28+4sz8 zA8%c~i@e^tTIbH3-yCFc#rVO~Prhf)TrNH5siU_o=!3`ElPCGl>!0#``1H|JCWZiS zc8(*LzepJatuO@Q0Jz07(JU4K%6g>c$Cd^0s&DOS!vU z7Ur-s$h~}9@Wb;@rHoHEUN%ztpu9%0VS&SztXs!E$1P9XvHnY2D#wvke!<&c?aDs& z{m6=n_GcR#!sdppxp3>EZ?wY1>fpIy>nhh}ZrA=O3ss-}W$-sO0>e%rne8Yr^fnf?WD8(@{i7+4%J926SC3aMRE9oPf0!q2aHh@wt0#pK- X=;=7Xo0Scuf(Zy)fb?si+ZY%C!fI$z literal 0 HcmV?d00001 From 3858fddfa756bf136cecb2dc77cbc924e6047b0e Mon Sep 17 00:00:00 2001 From: wenyt <75360946+wenytang-ms@users.noreply.github.com> Date: Tue, 9 Jun 2026 13:13:25 +0800 Subject: [PATCH 319/352] =?UTF-8?q?test(e2e):=20add=20Phase=20C=20plans=20?= =?UTF-8?q?=E2=80=94=20project=20create,=20export=20jar,=20delete=20perman?= =?UTF-8?q?ently=20(#1029)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * test(e2e): add Phase C plans — project create, export jar, delete permanently Adds three new E2E test plans that cover the remaining high-value Java Manager commands not yet exercised by Phase A or Phase B: - test/e2e-plans/java-dep-project-creation.yaml Covers java.project.create — the flagship "Java: Create Java Project..." wizard, exercised on the "No build tools" branch (the only project type whose scaffolding lives in this repo; every other type delegates to a third-party extension). Asserts on-disk presence of the scaffolded template files. - test/e2e-plans/java-dep-export-jar.yaml Covers java.view.package.exportJar — the multi-step Export Jar wizard. Pins java.project.exportJar.targetPath via user settings so the showSaveDialog branch is skipped, then asserts the jar file exists at the configured target path after the Jdtls generation step finishes. - test/e2e-plans/java-dep-delete-permanent.yaml Covers java.view.package.deleteFilePermanently — the non-trash branch of file removal. Has no plain-click UI affordance for regular local files (the context menu and delete keybinding are both gated on !explorerResourceMoveableToTrash), so the command is invoked directly by id with tree-selection fallback, same pattern as removeLibrary in the classpath plan. All three plans pass locally (45/45 new steps). Full suite remains green across 11 plans / 308 steps. * test(e2e): drop flaky LLM verify on expandTreeItem steps The LLM screenshot check on expand-existing-pkg / expand-source-root / expand-project is inherently flaky on already-expanded trees — the recent CI run downgraded a mechanically-successful expand from pass to fail, then immediately contradicted itself in the post-mortem analysis ('was already expanded before the action and remains expanded after'). The deterministic verifyTreeItem steps that follow each expand provide authoritative ground truth: if the expand didn't happen, the child item won't be visible. So the LLM verify lines are pure redundancy with no upside and a non-trivial false-negative rate. * test(e2e): drop flaky LLM verify on select-interface Same flake pattern as e633cd0: the LLM screenshot check is unreliable when a quick-pick advances immediately after a selection. On Windows CI the LLM saw the second wizard page (source-folder prompt) and concluded 'Interface not selected', when in fact the wizard had advanced exactly because Interface was selected. The downstream fillQuickInput steps and final file-creation assertion provide deterministic verification of the whole flow — if Interface hadn't been picked, the file would have been created with the wrong extension or template. * test(e2e): address Copilot review on header comments Two header comments were internally inconsistent with the plan body: 1. java-dep-export-jar.yaml line 21-22 said 'we set it via workspaceSettings' but the setup block actually uses user-level \settings:\. The detailed rationale further down already explains the user-level choice; the upstream summary now matches. 2. java-dep-project-creation.yaml line 35-36 said the template ships 'plus an empty lib/ ensure-dir'. The template directory in the repo contains only README.md, .vscode/settings.json and src/App.java — the empty lib/ is created at runtime by scaffoldSimpleProject via \ se.ensureDir(path.join(projectRoot, 'lib'))\ (projectController.ts:185), not by the template copy. Reworded to make the distinction explicit. Doc-only changes; YAML behaviour and assertions unchanged. --- test/e2e-plans/java-dep-delete-permanent.yaml | 144 +++++++++++++++ test/e2e-plans/java-dep-export-jar.yaml | 164 +++++++++++++++++ test/e2e-plans/java-dep-new-types.yaml | 5 +- test/e2e-plans/java-dep-project-creation.yaml | 169 ++++++++++++++++++ .../java-dep-refresh-generated-files.yaml | 11 +- 5 files changed, 488 insertions(+), 5 deletions(-) create mode 100644 test/e2e-plans/java-dep-delete-permanent.yaml create mode 100644 test/e2e-plans/java-dep-export-jar.yaml create mode 100644 test/e2e-plans/java-dep-project-creation.yaml diff --git a/test/e2e-plans/java-dep-delete-permanent.yaml b/test/e2e-plans/java-dep-delete-permanent.yaml new file mode 100644 index 00000000..8089ede7 --- /dev/null +++ b/test/e2e-plans/java-dep-delete-permanent.yaml @@ -0,0 +1,144 @@ +# Test Plan: Java Dependency — Permanent Delete +# +# Covers java.view.package.deleteFilePermanently (the "shift+delete" / +# non-trash branch of file removal). The companion command +# java.view.package.moveFileToTrash is already covered by +# java-dep-file-operations.yaml. +# +# Why this is a separate plan +# ─────────────────────────── +# The permanent-delete command has no plain-click UI affordance on regular +# local files: the JAVA PROJECTS context-menu entry (package.json:812-820) +# and the `delete` keybinding (package.json:485-490) are both gated on +# `!explorerResourceMoveableToTrash`, so files in `test/maven` only ever +# see "Delete" (move-to-trash). We therefore invoke the command directly +# via id and rely on tree selection to supply the target node — the same +# pattern the classpath plan uses for `removeLibrary`. +# +# The confirmation dialog also differs from moveFileToTrash: the prompt +# says "permanently delete" instead of "delete", and the action button is +# labelled "Delete" instead of "Move to Recycle Bin" (see +# src/explorerCommands/delete.ts line 17 + getInformationMessage). +# +# Usage: +# npx autotest run test/e2e-plans/java-dep-delete-permanent.yaml --vsix + +name: "Java Dependency — Permanent Delete" +description: | + Tests the java.view.package.deleteFilePermanently command on a regular + Maven-project file. Invokes the command by id (no UI affordance on local + files), confirms the "permanently delete" dialog, and verifies the file + is gone from disk and from the Java Projects tree. + +setup: + extension: "redhat.java" + vscodeVersion: "stable" + workspace: "../maven" + timeout: 180 + settings: + java.configuration.checkProjectSettingsExclusions: false + workbench.startupEditor: "none" + +steps: + # ── Setup: wait for LS, free sidebar space, focus Java Projects ── + - id: "ls-ready" + action: "waitForLanguageServer" + # No `verify:` — `waitForLanguageServer` is itself the deterministic + # readiness check. The AFTER screenshot may transiently show + # "Java: Building - 0%" which a strict LLM mis-reads as a failure. + timeout: 180 + + - id: "close-aux-bar" + action: "executeVSCodeCommand workbench.action.closeAuxiliaryBar" + verify: "Auxiliary bar (Chat) closed" + + - id: "collapse-outline" + action: "collapseSidebarSection OUTLINE" + + - id: "collapse-timeline" + action: "collapseSidebarSection TIMELINE" + + - id: "collapse-workspace-root" + action: "collapseWorkspaceRoot" + + - id: "focus-java-projects" + action: "executeVSCodeCommand javaProjectExplorer.focus" + verify: "Java Projects view is focused" + + - id: "wait-tree-load" + action: "wait 3 seconds" + + # ── Reveal App1.java via link-with-editor, then select it ── + # Opening the file makes link-with-editor expand the tree path and + # reveal+select App1 deterministically — much more reliable than + # manual expandTreeItem chains on the virtualised tree. + - id: "open-target-file" + action: "open file App1.java" + waitBefore: 2 + + - id: "collapse-workspace-root-2" + action: "collapseWorkspaceRoot" + + - id: "focus-java-projects-2" + action: "executeVSCodeCommand javaProjectExplorer.focus" + waitBefore: 2 + + # Click the tree item to guarantee it's the active selection — getCmdNode + # (explorerCommands/utility.ts:38) falls back to `selectedNodes[0]` when + # the command is invoked without a node argument. Linking-with-editor + # already auto-selected App1 when the file was opened, but clicking + # re-asserts the selection deterministically after the focus-java-projects + # round trip. + # + # We intentionally do NOT verify the App1 tree row here. On 1024x768 CI + # displays the row gets virtualised out of view in the brief window + # between `open file` and the click, and an inView:"Java Projects" + # verifyTreeItem then times out — even though the underlying selection + # is set correctly (proven by the subsequent delete succeeding). The + # post-delete `verify-file-gone` + `verify-tree-item-gone` block is the + # authoritative ground truth for whether the right node was targeted. + - id: "select-app1" + action: "click App1 tree item" + waitBefore: 1 + + # ── Invoke java.view.package.deleteFilePermanently ── + # The handler at views/dependencyExplorer.ts:177 takes `node?: DataNode`. + # With no node arg, getCmdNode uses the current selection (set by the + # `click App1 tree item` step above). DataNode is a class instance with + # methods (.getChildren()) so passing a POJO would crash — selection + # fallback is the only viable path from a smoke-test. + - id: "invoke-delete-permanently" + action: "executeVSCodeCommand java.view.package.deleteFilePermanently" + + # `expectConfirmDialog` waits for the dialog and clicks the first + # recognized confirm button (autotest knows "Delete" is one of them, see + # dialogOperations.ts:16). It's the strict variant — throws if no dialog + # appears, surfacing a silently-failed command invocation immediately + # instead of 15s later when verifyFile times out. + - id: "confirm-delete" + action: "expectConfirmDialog" + + - id: "wait-after-delete" + action: "wait 5 seconds" + + # ── Verify deletion on disk AND in the tree ── + # The disk check is the strongest signal: useTrash=false routes through + # workspace.fs.delete with the OS-level unlink, so a passing verifyFile + # exists:false proves the permanent-delete path actually fired (rather + # than silently downgrading to a no-op or moving to trash). + - id: "verify-file-gone" + action: "wait 1 seconds" + verifyFile: + path: "${workspaceFolder}/src/main/java/com/mycompany/app1/App1.java" + exists: false + timeout: 15 + + - id: "verify-tree-item-gone" + action: "wait 1 seconds" + # No `verify:` — verifyTreeItem is authoritative. + verifyTreeItem: + name: "App1" + exact: true + visible: false + inView: "Java Projects" + timeout: 15 diff --git a/test/e2e-plans/java-dep-export-jar.yaml b/test/e2e-plans/java-dep-export-jar.yaml new file mode 100644 index 00000000..713eb926 --- /dev/null +++ b/test/e2e-plans/java-dep-export-jar.yaml @@ -0,0 +1,164 @@ +# Test Plan: Java Dependency — Export Jar +# +# Covers java.view.package.exportJar — the multi-step wizard that builds a +# runnable jar from a Java project. The command is contributed both as the +# title-bar `$(export)` icon on the JAVA PROJECTS workspace-root node +# (package.json:858-861, group=inline) and as a context-menu entry, but we +# invoke it directly by id: the inline icon is rendered against the +# `java:workspace` viewItem (not the Maven project node `my-app`), which +# is fragile to locate by name, and ResolveJavaProject auto-resolves when +# there's exactly one project in the workspace — so direct invocation +# bypasses one wizard step that's not the command's responsibility. +# +# Wizard step machine (BuildArtifactTaskProvider.ts:284 `createJarFile`): +# 1. ResolveJavaProject → auto when single-project; quick-pick otherwise +# 2. ResolveMainClass → quick-pick of main classes + "" +# 3. GenerateJar +# a. generateClasspaths → multi-select quick-pick if >1 dependency item +# b. showSaveDialog → only if outputPath === "" (skipped when +# java.project.exportJar.targetPath is set +# to a non-empty value; we set it via a +# user-level `settings:` block to keep the +# output filename deterministic — see the +# setup section below for why user-level +# and not workspaceSettings) +# c. Jdtls.exportJar → writes the jar file +# +# Verification strategy +# ───────────────────── +# The jar is written to a known absolute path inside the workspace +# (`output.jar`). We assert with `verifyFile exists: true` — the strongest +# possible signal that the full wizard completed end-to-end, not just that +# the command was dispatched. The Jdtls export runs in a hidden Pseudoterminal +# (BuildArtifactTaskProvider line 91: `presentationOptions.reveal = Never`), +# so there is no terminal text to inspect; the file on disk is the only +# unambiguous post-condition. +# +# Usage: +# npx autotest run test/e2e-plans/java-dep-export-jar.yaml --vsix + +name: "Java Dependency — Export Jar" +description: | + Exercises the multi-step Export Jar wizard end-to-end on the maven + fixture: triggers the command, picks the main class, accepts the default + classpath element selection, and verifies that the resulting jar file + exists at the configured target path. + +setup: + extension: "redhat.java" + vscodeVersion: "stable" + workspace: "../maven" + # Bumped above the standard 180s — the wizard runs a full workspace build + # (await buildWorkspace() in executeExportJarTask) before the first + # quick-pick appears, which on a cold JDT-LS warmup commonly takes 60-90s. + timeout: 360 + settings: + java.configuration.checkProjectSettingsExclusions: false + workbench.startupEditor: "none" + # Pinning java.project.exportJar.targetPath to an absolute deterministic + # path bypasses the showSaveDialog branch in GenerateJarExecutor + # (BuildArtifactTaskProvider lines 240-244 short-circuit only when + # outputPath === ""), and lets the verifyFile assertion target a stable + # location regardless of how the fixture's worktree is named. + # + # We use user-level `settings:` (not `workspaceSettings:`) because + # autotest's workspaceSettings merge uses JSON.parse on the existing + # `.vscode/settings.json`, and the maven fixture's settings.json + # contains JSONC `//` comments which fail JSON.parse. User settings + # are written fresh each run (user-data-dir is wiped on launch) so + # there is no JSONC merge hazard. The Settings.getExportJarTargetPath + # config read is unscoped, so user-level setting takes effect identically. + java.project.exportJar.targetPath: "${workspaceFolder}/output.jar" + +steps: + # ── Setup: wait for LS, free sidebar space, focus Java Projects ── + - id: "ls-ready" + action: "waitForLanguageServer" + # No `verify:` — `waitForLanguageServer` is itself the deterministic + # readiness check. The AFTER screenshot may transiently show + # "Java: Building - 0%" which a strict LLM mis-reads as a failure. + timeout: 180 + + - id: "close-aux-bar" + action: "executeVSCodeCommand workbench.action.closeAuxiliaryBar" + verify: "Auxiliary bar (Chat) closed" + + - id: "collapse-outline" + action: "collapseSidebarSection OUTLINE" + + - id: "collapse-timeline" + action: "collapseSidebarSection TIMELINE" + + - id: "collapse-workspace-root" + action: "collapseWorkspaceRoot" + + - id: "focus-java-projects" + action: "executeVSCodeCommand javaProjectExplorer.focus" + verify: "Java Projects view is focused" + + - id: "wait-tree-load" + action: "wait 3 seconds" + + # ── Trigger the Export Jar wizard ── + # Direct command invocation avoids the brittle inline-icon-on-workspace- + # node click path (the `$(export)` icon is contributed against viewItem + # `java:workspace`, not against the Maven project node `my-app`, and + # locating workspace-level inline icons in autotest is fragile). + # ResolveJavaProject auto-resolves for single-project workspaces. + - id: "invoke-export-jar" + action: "executeVSCodeCommand java.view.package.exportJar" + + # The wizard first triggers a full workspace build (await buildWorkspace() + # in executeExportJarTask) before any UI appears. On a cold JDT-LS this + # typically takes 30-60s; the Jdtls.getMainClasses fetch then needs + # another 2-5s before the first quick-pick is shown. Wait generously. + - id: "wait-build-complete" + action: "wait 60 seconds" + + # ── Step 2: pick the main class ── + # The maven fixture has a single class with a `public static void main` + # entry point: com.mycompany.app.App. App1 has no main, so the only + # quick-pick options are "App" and "". We pick "App" + # explicitly so the resulting jar is runnable. + - id: "pick-main-class" + action: "select App option" + # No `verify:` — selectPaletteOption is the action and verification in + # one. The quick-pick closes on selection; the AFTER screenshot may + # already show the next quick-pick (classpath elements), which a + # strict LLM could mis-read as "App selection was lost". + + - id: "wait-after-main-class" + action: "wait 5 seconds" + + # ── Step 3a: accept the pre-selected classpath elements ── + # GenerateJarExecutor.generateClasspaths builds a list of runtime / test + # output folders + dependency artifacts, pre-selects everything tagged + # `runtime`, and shows a multi-select QuickPick. For the maven fixture + # this includes target/classes plus any resolved JUnit jars under test + # scope. The pre-selection is the sane default — accepting it gives a + # runnable jar without needing to compute which items to check. + # + # `confirmQuickInput` presses Enter on the open quick-pick widget without + # typing anything, which leaves selections untouched and submits. + - id: "accept-classpath-elements" + action: "confirmQuickInput" + + # ── Step 3c: wait for Jdtls to generate the jar ── + # Jdtls.exportJar writes the jar via a JDT LSP request. The custom + # pseudoterminal stays hidden (presentationOptions.reveal=Never), so + # there is no terminal-text signal — we just wait long enough for the + # filesystem write to settle. + - id: "wait-jar-generated" + action: "wait 30 seconds" + + # ── Verification: jar file exists at the configured target path ── + # This is the strongest possible end-to-end check: the file appearing + # on disk proves ResolveJavaProject + ResolveMainClass + generateClasspaths + # + Jdtls.exportJar all completed in order. A failure here pinpoints + # the wizard breaking; a pass means the full happy path worked. + - id: "verify-jar-created" + action: "wait 1 seconds" + verifyFile: + path: "${workspaceFolder}/output.jar" + exists: true + timeout: 60 diff --git a/test/e2e-plans/java-dep-new-types.yaml b/test/e2e-plans/java-dep-new-types.yaml index 4e717895..eb35283d 100644 --- a/test/e2e-plans/java-dep-new-types.yaml +++ b/test/e2e-plans/java-dep-new-types.yaml @@ -78,7 +78,10 @@ steps: - id: "select-interface" action: "select Interface option" - verify: "Interface selected" + # No `verify:` — LLM screenshot check is flaky when the quick-pick + # advances immediately after selection (LLM sees the next page and + # mistakes the advance for "selection not visible"). The downstream + # fillQuickInput / file creation provides authoritative verification. - id: "select-source-folder-1" action: "select src/main/java option" diff --git a/test/e2e-plans/java-dep-project-creation.yaml b/test/e2e-plans/java-dep-project-creation.yaml new file mode 100644 index 00000000..946188c0 --- /dev/null +++ b/test/e2e-plans/java-dep-project-creation.yaml @@ -0,0 +1,169 @@ +# Test Plan: Java Dependency — Create Project +# +# Covers java.project.create — the flagship "Java: Create Java Project..." +# wizard. We exercise the "No build tools" branch (a.k.a. invisible / +# unmanaged-folder project) because it is the only project type whose +# scaffolding lives entirely inside this extension (`templates/invisible- +# project/`) — every other type (Maven, Gradle, Spring Boot, Quarkus, ...) +# delegates to a third-party extension's create-command, which is out of +# scope for this repo's E2E coverage. +# +# Wizard flow (controllers/projectController.ts — `createJavaProject` → +# `scaffoldSimpleProject`): +# 1. `window.showQuickPick` → user picks a project type +# 2. `window.showOpenDialog` (folder mode, `openLabel: "Select the project location"`) +# → user picks parent directory +# 3. `window.showInputBox` → user types the project name +# 4. `fse.copy(templates/invisible-project, /)` → scaffold +# 5. `commands.executeCommand("vscode.openFolder", Uri.file(...), openInNewWindow)` +# where openInNewWindow = workspace && !_.isEmpty(workspace.workspaceFolders) +# +# Why a new window does NOT break this test +# ───────────────────────────────────────── +# Because the test runs with a workspace open (`workspace: "../maven"`), +# step 5 opens the new project in a SEPARATE Electron window. The Playwright +# driver is attached via CDP to the original window's renderer process; the +# new window is a separate process the driver never sees. After step 4 +# (the fse.copy) the scaffolded files are already on disk regardless of +# whether step 5 succeeds in opening the new window — so the deterministic +# verifyFile assertions still pass. We deliberately put no UI steps after +# the project creation completes, to avoid any race with the second-window +# spawn momentarily stealing OS focus. +# +# Verification strategy +# ───────────────────── +# `templates/invisible-project/` ships exactly three files: +# - README.md +# - .vscode/settings.json +# - src/App.java +# In addition, `scaffoldSimpleProject` (projectController.ts:185) creates +# an empty `lib/` directory at runtime via `fse.ensureDir`, so a freshly +# scaffolded project on disk has the three template files plus `lib/`. +# We assert two of the template files (the .vscode settings file and +# App.java) on disk. Notably absent: `.classpath` / `.project` — invisible +# projects rely on `java.import.generatesMetadataFilesAtProjectRoot` (off +# by default in the template), so testing for .classpath would yield a +# false negative. +# +# Usage: +# npx autotest run test/e2e-plans/java-dep-project-creation.yaml --vsix + +name: "Java Dependency — Create Project" +description: | + Exercises the java.project.create wizard end-to-end on the "No build + tools" path: triggers the command, picks the project type, drives the + folder picker, names the project, and verifies the scaffolded template + files appear on disk. + +setup: + extension: "redhat.java" + vscodeVersion: "stable" + workspace: "../maven" + timeout: 240 + settings: + java.configuration.checkProjectSettingsExclusions: false + workbench.startupEditor: "none" + +steps: + # ── Setup: wait for LS, free sidebar space, focus Java Projects ── + # We open the maven workspace to satisfy step 5's openInNewWindow=true + # branch (see header comment). LS readiness isn't strictly required for + # project creation, but the wait gives the workbench time to settle + # before we drive multiple chained quick-picks / input-boxes. + - id: "ls-ready" + action: "waitForLanguageServer" + # No `verify:` — `waitForLanguageServer` is itself the deterministic + # readiness check. The AFTER screenshot may transiently show + # "Java: Building - 0%" which a strict LLM mis-reads as a failure. + timeout: 180 + + - id: "close-aux-bar" + action: "executeVSCodeCommand workbench.action.closeAuxiliaryBar" + verify: "Auxiliary bar (Chat) closed" + + - id: "collapse-outline" + action: "collapseSidebarSection OUTLINE" + + - id: "collapse-timeline" + action: "collapseSidebarSection TIMELINE" + + - id: "collapse-workspace-root" + action: "collapseWorkspaceRoot" + + - id: "focus-java-projects" + action: "executeVSCodeCommand javaProjectExplorer.focus" + verify: "Java Projects view is focused" + + - id: "wait-tree-load" + action: "wait 3 seconds" + + # ── Step 1: trigger the wizard and pick the project type ── + # Direct command invocation is more reliable than navigating the title- + # bar `$(add)` icon on the Java Projects view, which routes through the + # `_java.project.create.from.javaprojectexplorer` proxy command — same + # underlying handler but extra menu-binding indirection. + - id: "invoke-create-project" + action: "executeVSCodeCommand java.project.create" + + # The project-type quick-pick lists 9 items (controllers/projectController.ts + # `projectTypes`). "No build tools" is index 0. We pick by exact label + # rather than index to keep the plan resilient if the list is re-ordered. + - id: "pick-no-build-tools" + action: "select No build tools option" + + # ── Step 2: drive the folder picker ── + # `window.showOpenDialog` (canSelectFolders: true) is intercepted by + # VS Code's smoke-test driver and re-surfaced as the internal + # simpleFileDialog quick-pick — the same mechanism the classpath plan + # uses for addLibraryFolders. In folder-pick mode, typing a path and + # pressing Enter NAVIGATES INTO the folder; the explicit confirmation + # button (labelled with the dialog's `openLabel`, here "Select the + # project location") is what actually returns the URI to the caller. + # + # We type the workspace root path so the scaffolded project lands + # directly inside the auto-copied worktree — that keeps the verifyFile + # paths simple and the worktree gets cleaned up by autotest at teardown. + - id: "type-project-location" + action: "fillQuickInput ${workspaceFolder}" + + - id: "confirm-project-location" + action: "tryClickButton Select the project location" + + # ── Step 3: name the project ── + # `window.showInputBox` surfaces as the quick-input widget too; + # `fillAnyInput` covers both quick-input and inline-rename widgets so + # it's slightly more robust if VS Code ever changes which surface the + # InputBox API targets. + - id: "type-project-name" + action: "fillAnyInput AutotestNewProject" + + # ── Step 4 + 5: wait for scaffold + new-window spawn ── + # `fse.copy(templates/invisible-project, ...)` is a few-KB synchronous- + # style copy that completes in <500ms, but `vscode.openFolder` triggers + # a second Electron window launch which can briefly steal focus and + # delay file flushing on slower disks. 8s is a comfortable margin. + - id: "wait-scaffold-and-open" + action: "wait 8 seconds" + + # ── Verification: scaffolded template files exist on disk ── + # These two assertions together prove: + # - the wizard reached step 4 (file copy) + # - the basePath (workspace root) and projectName (AutotestNewProject) + # were correctly threaded through showOpenDialog / showInputBox + # + # Verifying directly on disk is the strongest signal we can get: it + # decouples the test from whatever happens with the new-window spawn, + # which Playwright can't observe anyway (different Electron process). + - id: "verify-app-java" + action: "wait 1 seconds" + verifyFile: + path: "${workspaceFolder}/AutotestNewProject/src/App.java" + exists: true + timeout: 15 + + - id: "verify-vscode-settings" + action: "wait 1 seconds" + verifyFile: + path: "${workspaceFolder}/AutotestNewProject/.vscode/settings.json" + exists: true + timeout: 15 diff --git a/test/e2e-plans/java-dep-refresh-generated-files.yaml b/test/e2e-plans/java-dep-refresh-generated-files.yaml index cf3420d0..3f55cb2b 100644 --- a/test/e2e-plans/java-dep-refresh-generated-files.yaml +++ b/test/e2e-plans/java-dep-refresh-generated-files.yaml @@ -55,13 +55,15 @@ steps: - id: "wait-tree-load" action: "wait 3 seconds" + # NOTE: no `verify:` on expand steps — the LLM screenshot check is flaky + # ("LLM downgraded pass -> fail" on already-expanded trees). The next + # verifyTreeItem (or the chained expand below) provides authoritative + # ground truth: if the expand didn't happen the child won't be visible. - id: "expand-project" action: "expandTreeItem my-app" - verify: "my-app project expanded" - id: "expand-source-root" action: "expandTreeItem src/main/java" - verify: "source root src/main/java expanded" - id: "baseline-existing-pkg" action: "wait 1 seconds" @@ -111,10 +113,11 @@ steps: visible: true timeout: 15 - # Sanity: a new class in an existing package also appears. + # Sanity: a new class in an existing package also appears. No `verify:` here + # for the same reason as the expand steps above — check-existing-pkg-class + # below is the deterministic assertion. - id: "expand-existing-pkg" action: "expandTreeItem com.mycompany.app" - verify: "existing package com.mycompany.app expanded" - id: "check-existing-pkg-class" action: "wait 1 seconds" From 0dc24678ee1ce4128bb70068aaa67dbc15bf0e1c Mon Sep 17 00:00:00 2001 From: wenyt <75360946+wenytang-ms@users.noreply.github.com> Date: Wed, 10 Jun 2026 14:26:25 +0800 Subject: [PATCH 320/352] =?UTF-8?q?test(e2e):=20add=20Tier=201=20plan=20?= =?UTF-8?q?=E2=80=94=20copy=20file=20/=20relative=20path=20(#1032)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Adds an E2E plan covering the two clipboard commands contributed against the Java Projects view: - java.view.package.copyFilePath (Copy Path) - java.view.package.copyRelativeFilePath (Copy Relative Path) Both handlers (dependencyExplorer.ts:159 and :165) are thin wrappers that forward the selected DataNode's URI to VS Code's built-in copyFilePath / copyRelativeFilePath. They have no on-screen side effect whatsoever — the only observable consequence is what lands on the OS clipboard. Verifying them therefore requires the new clipboard primitives (writeClipboard / verifyClipboard) added in autotest 0.7.16. Plan shape - Setup: wait for LS, free sidebar space, collapse workspace root, focus Java Projects. - Reveal App.java via Quick Open (link-with-editor auto-expands the tree path), then click the tree row with the new `exact` modifier to disambiguate the leaf label "App" from the project node "my-app" (which would otherwise be matched first by case-insensitive substring and silently selected, producing the workspace folder URI instead of the file URI). - For each command: seed the clipboard with a sentinel, invoke the command by id, assert the clipboard contains "App.java", matches the expected path-suffix shape (cross-OS regex tolerating both `\` and `/` separators), and no longer equals the sentinel. Cross-OS note - VS Code's built-in `copyRelativeFilePath` computes `path.relative(workspaceFolderUri, fileUri)` and falls back to the absolute path when membership fails. On Windows the URI we pass (`Uri.parse(cmdNode.uri)` from JDT.LS) can differ in drive-letter case or percent-encoding from VS Code's registered workspace folder URI, so the membership test fails and the absolute path comes back. On POSIX the URIs match and the relative form is produced. The assertions tolerate both — they prove the command fired and overwrote the sentinel with a well-formed path ending in the expected layout, but do not require the leading-`src` shape that only POSIX produces. Coverage moves from ~33 → 35 of the ~39 user-facing Java Manager commands. Tier 2 (file-menu / file-explorer wrappers) and Tier 3 (gradle lifecycle, multi-module navigation) remain deferred. --- test/e2e-plans/java-dep-copy-paths.yaml | 195 ++++++++++++++++++++++++ 1 file changed, 195 insertions(+) create mode 100644 test/e2e-plans/java-dep-copy-paths.yaml diff --git a/test/e2e-plans/java-dep-copy-paths.yaml b/test/e2e-plans/java-dep-copy-paths.yaml new file mode 100644 index 00000000..7fd7c3cd --- /dev/null +++ b/test/e2e-plans/java-dep-copy-paths.yaml @@ -0,0 +1,195 @@ +# Test Plan: Java Dependency — Copy File / Relative Paths +# +# Covers two clipboard commands contributed against the Java Projects view: +# - java.view.package.copyFilePath (Copy Path) +# - java.view.package.copyRelativeFilePath (Copy Relative Path) +# +# Why a dedicated plan +# ──────────────────── +# These two commands have **no on-screen side effect at all** — they don't +# open a dialog, write a file, change the tree, or post a notification. +# The only observable consequence is what ends up on the OS clipboard. +# Verifying them therefore requires an autotest clipboard primitive +# (writeClipboard / readClipboard / verifyClipboard) added in 0.7.15. +# +# Both handlers (dependencyExplorer.ts:159 and :165) are thin wrappers +# around VS Code's built-in `copyFilePath` / `copyRelativeFilePath`: +# +# instrumentOperationAsVsCodeCommand(Commands.VIEW_PACKAGE_COPY_FILE_PATH, +# (node?: DataNode) => { +# const cmdNode = getCmdNode(this._dependencyViewer.selection, node); +# if (cmdNode?.uri) { +# commands.executeCommand("copyFilePath", Uri.parse(cmdNode.uri)); +# } +# }) +# +# So the values landing on the clipboard are whatever VS Code's built-ins +# write — i.e. the URI's fsPath (absolute, OS-native separators) and the +# workspace-relative path (no leading slash). +# +# Invocation pattern (same as delete-permanent.yaml) +# ────────────────────────────────────────────────── +# Both commands accept a `node?: DataNode` parameter and fall back to +# the current tree selection via getCmdNode (explorerCommands/utility.ts:38). +# DataNode is a class instance, not a POJO, so passing a synthetic node +# from YAML would crash. Selection fallback is the only viable smoke-test +# path: open a file via link-with-editor (auto-selects in the tree) → +# click the tree row to re-assert selection after focus changes → +# invoke the command by id. +# +# Cross-OS path separator handling +# ──────────────────────────────── +# Windows fsPaths use `\` and POSIX uses `/`. The assertions therefore +# combine three orthogonal checks per command: +# - `contains: "App.java"` — leaf filename, identical on every OS +# - `matches: regex` — accepts both separators between segments +# - `notContains: ` — proves the clipboard was overwritten +# (we seed a sentinel before each command) +# +# A pure `exact:` match would force a per-OS conditional plan; the regex +# approach keeps a single plan that's portable Linux ↔ Windows ↔ macOS. +# +# Usage: +# npx autotest run test/e2e-plans/java-dep-copy-paths.yaml --vsix + +name: "Java Dependency — Copy File / Relative Paths" +description: | + Exercises java.view.package.copyFilePath and java.view.package.copyRelativeFilePath + on a Maven-project source file. Seeds a clipboard sentinel before each command, + invokes the command by id (using the current tree selection), and verifies the + resulting clipboard text via path-shape regex + filename containment + + sentinel-overwritten check. + +setup: + extension: "redhat.java" + vscodeVersion: "stable" + workspace: "../maven" + timeout: 180 + settings: + java.configuration.checkProjectSettingsExclusions: false + workbench.startupEditor: "none" + +steps: + # ── Setup: wait for LS, free sidebar space, focus Java Projects ── + - id: "ls-ready" + action: "waitForLanguageServer" + # No `verify:` — `waitForLanguageServer` is itself the deterministic + # readiness check. The AFTER screenshot may transiently show + # "Java: Building - 0%" which a strict LLM mis-reads as a failure. + timeout: 180 + + - id: "close-aux-bar" + action: "executeVSCodeCommand workbench.action.closeAuxiliaryBar" + + - id: "collapse-outline" + action: "collapseSidebarSection OUTLINE" + + - id: "collapse-timeline" + action: "collapseSidebarSection TIMELINE" + + - id: "collapse-workspace-root" + action: "collapseWorkspaceRoot" + + - id: "focus-java-projects" + action: "executeVSCodeCommand javaProjectExplorer.focus" + + - id: "wait-tree-load" + action: "wait 3 seconds" + + # ── Reveal & select App.java via link-with-editor ── + # Same pattern as java-dep-delete-permanent.yaml: opening the file + # makes link-with-editor reveal+select the tree node deterministically, + # which is more reliable than chained expandTreeItem on the virtualised + # tree on 1024x768 CI displays. + - id: "open-target-file" + action: "open file App.java" + waitBefore: 2 + + - id: "collapse-workspace-root-2" + action: "collapseWorkspaceRoot" + + - id: "focus-java-projects-2" + action: "executeVSCodeCommand javaProjectExplorer.focus" + waitBefore: 2 + + # Click the App tree row to assert it as the active selection. The Java + # Projects view labels source files by class name (no `.java` suffix — + # the leaf row reads "App"), and a default substring `click App tree + # item` would also match the project node "my-app" first (case-insensitive + # substring), silently selecting the project — whose URI is the workspace + # root, not the file. We use the `exact` modifier (autotest ≥ 0.7.16) so + # only the leaf row labeled exactly "App" matches. + - id: "select-app" + action: "click App tree item exact" + waitBefore: 1 + + # ── Cycle 1: java.view.package.copyFilePath (absolute path) ── + # Sentinel proves the clipboard was actually written — without it, a + # silently-no-op command would pass if the OS clipboard happened to + # already contain "App.java" from any earlier action on the host. + - id: "seed-clipboard-absolute" + action: "writeClipboard __SENTINEL_BEFORE_COPY_FILE_PATH__" + + - id: "invoke-copy-file-path" + action: "executeVSCodeCommand java.view.package.copyFilePath" + waitBefore: 1 + + # Verify the clipboard contents post-action. + # + # • `contains: "App.java"` — the leaf filename is identical on every OS + # • `matches: ...` — accepts either `\` (Windows) or `/` (POSIX) between + # path segments, and asserts the URL-decoded fsPath structure + # `maven/src/main/java/com/mycompany/app/App.java`. The `[\\\\/]` + # escapes to a literal `[\/]` character class in the compiled regex. + # • `notContains: ` — proves the seed was overwritten and the + # command isn't silently no-op'ing into a stale clipboard. + - id: "verify-absolute-path" + action: "wait 1 seconds" + verifyClipboard: + contains: "App.java" + matches: "maven[\\\\/]src[\\\\/]main[\\\\/]java[\\\\/]com[\\\\/]mycompany[\\\\/]app[\\\\/]App\\.java$" + notContains: "__SENTINEL_BEFORE_COPY_FILE_PATH__" + timeout: 10 + + # ── Cycle 2: java.view.package.copyRelativeFilePath ── + # The selection persists across the previous command, so no re-click. + # A fresh sentinel is still needed — the cycle-1 clipboard now contains + # the absolute path, which would trivially satisfy any leaf-only check. + # + # Cross-platform note: VS Code's built-in `copyRelativeFilePath` computes + # `path.relative(workspaceFolderUri, fileUri)` and falls back to the + # absolute fsPath when the file URI isn't a member of any workspace + # folder. On Windows the URI we pass — `Uri.parse(cmdNode.uri)` from + # JDT.LS — can differ from VS Code's registered workspace folder URI + # in drive-letter case or percent-encoding, so the membership test + # fails and we get the absolute path back. On POSIX the URIs match and + # the relative form is produced. The assertions below tolerate both: + # they prove the command fired and overwrote the sentinel with a + # well-formed path ending in the expected package + class layout, but + # do not require the leading-`src` shape that only POSIX produces. + - id: "seed-clipboard-relative" + action: "writeClipboard __SENTINEL_BEFORE_COPY_RELATIVE_FILE_PATH__" + + - id: "invoke-copy-relative-file-path" + action: "executeVSCodeCommand java.view.package.copyRelativeFilePath" + waitBefore: 1 + + # Verify the clipboard after copyRelativeFilePath. + # + # • `contains: "App.java"` — leaf filename appears (OS-independent) + # • `matches: ...` — same path-suffix shape as the absolute assertion + # above. Anchored to `$` so it matches whether the path is the + # POSIX relative form `src/main/java/.../App.java` (single match + # of the suffix) or the Windows absolute fallback + # `C:\...\maven\src\main\java\.../App.java` (suffix at end). + # • `notContains: ` — proves the seed was overwritten, + # which is the strongest signal that the wrapper command actually + # forwarded to the built-in (rather than silently no-op'ing on a + # missing selection). + - id: "verify-relative-path" + action: "wait 1 seconds" + verifyClipboard: + contains: "App.java" + matches: "src[\\\\/]main[\\\\/]java[\\\\/]com[\\\\/]mycompany[\\\\/]app[\\\\/]App\\.java$" + notContains: "__SENTINEL_BEFORE_COPY_RELATIVE_FILE_PATH__" + timeout: 10 From 19960835ed274f4188f3c6f832b40c2f437942ae Mon Sep 17 00:00:00 2001 From: Frank Liu <63277848+frankliu20@users.noreply.github.com> Date: Thu, 11 Jun 2026 10:33:53 +0800 Subject: [PATCH 321/352] chore: improve java upgrade telemetry tracking and extension installation flow (#1030) * Add source/install telemetry and drop unreliable activation check Follow-up to v0.27.5 telemetry analysis (devdiv-azure-service-dmitryr/azure-java-migration-copilot-vscode-extension#5979): - Add a source field (SOURCE_CVE / SOURCE_JAVA_UPGRADE) to the upgradeNotification.show event so NOTIFY-level data can be split by CVE vs upgrade and aligned with downstream funnel stages. - Emit an installSucceeded event (with the initial extensionState, so fresh installs and updates can be told apart) right after installExtension resolves. - Drop the post-install getExtensionState re-check that produced false activation-timeout results; the not-installed path now reports proceeded and returns true after install completes. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Drop dedicated installSucceeded telemetry event Address review: avoid adding a new business operationName for the install step. Install success is already implied by the subsequent upgradeFlow.result event under the same operation ID. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Track install-success as a dimension on the result event Address review: instead of a dedicated installSucceeded operationName, reuse the stable java.dependency.upgradeFlow.result event and mark the install step with an upgradeFlowStep dimension (plus extensionState so fresh installs and updates can be told apart). Easier to query and evolve. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Label install step by action instead of pre-install state Address review: extensionState was the pre-install value, so tagging a 'succeeded' event with 'not-installed'/'outdated' was contradictory. Replace it with installType ('installed' vs 'updated') derived from the pre-install state, which is unambiguous and avoids an unreliable post-install state recompute (the original activation-race bug). Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Don't prompt to enable extension in upgrade flow extensions.getExtension() returns undefined both when the extension is disabled and when it is freshly installed but not yet activated, so the 'seems disabled, enable it manually' prompt is misleading right after a successful install. Skip it on the upgrade path; the function and the modernization caller are left unchanged. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Wait for extension registration via onDidChange instead of fixed sleep Replace the fixed 2s wait after a fresh install with an event-driven wait: resolve immediately if the extension is already registered, otherwise listen on extensions.onDidChange and proceed as soon as it appears, with a 5s timeout fallback. Returns as early as possible while still bounding the wait. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --------- Co-authored-by: Frank Liu Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Co-authored-by: wenyt <75360946+wenytang-ms@users.noreply.github.com> --- src/upgrade/display/notificationManager.ts | 1 + src/upgrade/utility.ts | 42 ++++++++++++++++------ 2 files changed, 33 insertions(+), 10 deletions(-) diff --git a/src/upgrade/display/notificationManager.ts b/src/upgrade/display/notificationManager.ts index d8e6a461..55c3422c 100644 --- a/src/upgrade/display/notificationManager.ts +++ b/src/upgrade/display/notificationManager.ts @@ -93,6 +93,7 @@ class NotificationManager implements IUpgradeIssuesRenderer { sendInfo(operationId, { operationName: "java.dependency.upgradeNotification.show", extensionState, + source: hasCVEIssue ? Upgrade.SOURCE_CVE : Upgrade.SOURCE_JAVA_UPGRADE, }); const buttons = hasCVEIssue diff --git a/src/upgrade/utility.ts b/src/upgrade/utility.ts index 97461b75..0f364a20 100644 --- a/src/upgrade/utility.ts +++ b/src/upgrade/utility.ts @@ -197,6 +197,11 @@ export async function checkOrInstallAppModExtensionForUpgrade( } await commands.executeCommand("workbench.extensions.installExtension", ExtensionName.APP_MODERNIZATION_FOR_JAVA); + sendInfo(operationId, { + operationName: "java.dependency.upgradeFlow.result", + upgradeFlowStep: "installSucceeded", + installType: state === "outdated" ? "updated" : "installed", + }); if (state === "outdated") { // Extension was updated (not freshly installed) — reload required @@ -219,18 +224,35 @@ export async function checkOrInstallAppModExtensionForUpgrade( return false; } - await checkOrPromptToEnableAppModExtension("upgrade"); + // Wait until the freshly installed extension is registered, returning as + // soon as it is ready, or after a 5s timeout fallback at the latest. + await waitForExtensionReady(extensionIdToCheck, 5000); - // Wait briefly for the newly installed extension to activate - await new Promise(resolve => setTimeout(resolve, 2000)); - - // Re-check if the newly installed extension is active and meets version requirement - const newState = getExtensionState(extensionIdToCheck); - const canProceed = newState === "up-to-date"; sendInfo(operationId, { operationName: "java.dependency.upgradeFlow.result", - upgradeFlowResult: canProceed ? "proceeded" : "activation-timeout", + upgradeFlowResult: "proceeded", }); - return canProceed; + return true; })(); -} \ No newline at end of file +} + +function waitForExtensionReady(extensionId: string, timeoutMs: number): Promise { + return new Promise(resolve => { + if (extensions.getExtension(extensionId)) { + resolve(); + return; + } + let timer: NodeJS.Timeout; + const disposable = extensions.onDidChange(() => { + if (extensions.getExtension(extensionId)) { + clearTimeout(timer); + disposable.dispose(); + resolve(); + } + }); + timer = setTimeout(() => { + disposable.dispose(); + resolve(); + }, timeoutMs); + }); +} From 395d5ccdf9e5622d5c95d197a9b806ac94eab186 Mon Sep 17 00:00:00 2001 From: wenyt <75360946+wenytang-ms@users.noreply.github.com> Date: Thu, 11 Jun 2026 13:58:08 +0800 Subject: [PATCH 322/352] perf: improve Java LSP tool result handoff (#1031) * Improve Java LSP tool result handoff Return structured file and line fields from findSymbol so the model can consume precise ranges without repeating symbol search. Accept line-suffixed Java locations in file structure resolution and document outlineInput handoff. * Address Java LSP handoff review comments Use normalized relative paths consistently when resolving file structure inputs and classify truncated findSymbol responses before small exact-result guidance. * Remove speculative Java location suffix handling Keep the PR focused on the evidence-backed findSymbol handoff contract. Do not claim getFileStructure accepts path:line inputs without telemetry proving that case. * Remove prescriptive findSymbol next step Keep findSymbol results as structured location data and leave next-tool choice to the model. The payload still exposes file, line, range, and outlineInput for downstream consumption without embedding result-level routing guidance. * Use file field for Java LSP handoff Remove the redundant outlineInput field and keep findSymbol output focused on factual location data: file, startLine, endLine, and range. getFileStructure can consume the returned file when broader file outline context is needed. * Return read_file input from Java symbol lookup * Add read ranges to Java file structure * Tighten Java file structure limit * Remove ambiguous Java symbol location field * perf: trim Java LSP tool descriptions to reduce token cost modelDescription is sent to the model on every request, so condense both tool descriptions and the uri param description while keeping the read_file (offset/limit) handoff and no-re-search guidance intact. * fix: address review nits on getFileStructure limit and instruction tool name - Use nullish coalescing + Math.floor for getFileStructure limit so an explicit 0 and fractional values are handled correctly. - Use the full lsp_java_findSymbol tool name in the Java LSP instructions. --- package.json | 10 +- .../javaLspContext.instructions.md | 4 +- resources/skills/java-lsp-tools/SKILL.md | 12 +- src/copilot/tools/javaContextTools.ts | 114 ++++++++++++++---- 4 files changed, 106 insertions(+), 34 deletions(-) diff --git a/package.json b/package.json index 694bcd28..511ba465 100644 --- a/package.json +++ b/package.json @@ -52,7 +52,7 @@ { "name": "lsp_java_getFileStructure", "toolReferenceName": "javaFileStructure", - "modelDescription": "Get a known Java file's outline: classes, interfaces, methods, fields, symbol kinds, and line ranges, to pick a precise read_file range instead of reading the whole file.\n\nUse after lsp_java_findSymbol returns a file, or when the user gave a Java file path; do not guess paths. Not for workspace-wide search\u2014use lsp_java_findSymbol for that. Do not re-call for the same file unless the first result was empty.", + "modelDescription": "Outline a known Java file (classes, methods, fields with line ranges) to pick a precise read_file range instead of reading the whole file. Needs a path from lsp_java_findSymbol or the user — do not guess. Returns file plus per-symbol readFileRange ({ offset, limit }) for read_file. Use limit to cap outline items (default 20, max 60). Not for workspace search (use lsp_java_findSymbol).", "displayName": "Java: Get File Structure", "userDescription": "Get a Java file outline with classes, methods, fields, and line ranges.", "tags": [ @@ -69,7 +69,11 @@ "properties": { "uri": { "type": "string", - "description": "Workspace-relative path to a Java file. Must be a known path from prior tool results or user input — do not guess." + "description": "Workspace-relative path to a Java file, from lsp_java_findSymbol or user input — do not guess." + }, + "limit": { + "type": "number", + "description": "Maximum outline items to return (default: 20, max: 60). Use a smaller value when only top-level context is needed." } }, "required": [ @@ -80,7 +84,7 @@ { "name": "lsp_java_findSymbol", "toolReferenceName": "javaFindSymbol", - "modelDescription": "Find Java class, interface, method, or field definitions across the workspace by name or partial identifier. Prefer over grep_search, file_search, semantic_search, or search subagents for Java symbol lookup.\n\nOn relevant results, do not repeat with a similar query; continue with lsp_java_getFileStructure or read_file on the returned line range. The tool retries internally, so on an empty result do not re-search\u2014retry once only if it reports indexing in progress, otherwise use generic search.\n\nDo not use for non-Java files, literals, comments, build/XML files, or conceptual exploration.", + "modelDescription": "Find Java class/interface/method/field definitions across the workspace by name or partial identifier. Prefer over grep_search, file_search, or semantic_search for Java symbol lookup. Each result has file and readFileInput ({ filePath, offset, limit }) for read_file; use it when source is needed, or lsp_java_getFileStructure with file for broader context. On empty results don't re-search (it retries internally); retry once only if it reports indexing in progress, else use generic search. Not for non-Java files, literals, comments, or build/XML files.", "displayName": "Java: Find Symbol", "userDescription": "Find Java class, method, field, or interface definitions by name.", "tags": [ diff --git a/resources/instruments/javaLspContext.instructions.md b/resources/instruments/javaLspContext.instructions.md index e3d5d1f3..6c5d10a4 100644 --- a/resources/instruments/javaLspContext.instructions.md +++ b/resources/instruments/javaLspContext.instructions.md @@ -10,6 +10,6 @@ For Java symbol navigation, two compiler-accurate `lsp_java_*` tools are availab If these tools are not already available in the current tool list, load them with `tool_search` using a query such as `Java LSP symbol navigation lsp_java`. -Use `lsp_java_findSymbol` before `grep_search`, `search_subagent`, `semantic_search`, or `file_search` only when the task is to locate Java symbols by name or partial identifier. If it returns relevant symbols, do not call it again with the same or similar query; next use `lsp_java_getFileStructure` for the returned file or `read_file` on the smallest useful line range. +Use `lsp_java_findSymbol` before `grep_search`, `search_subagent`, `semantic_search`, or `file_search` only when the task is to locate Java symbols by name or partial identifier. If it returns relevant symbols and source is needed, call `read_file` with the returned `readFileInput`, or call `lsp_java_getFileStructure` with the returned `file` when broader file context is needed. -Use `lsp_java_getFileStructure` only with a path confirmed by the user or a previous tool result. Do not guess paths. Use generic search for string literals, comments, XML, Gradle/Maven files, non-Java files, or broad conceptual exploration. `findSymbol` already retries internally with a normalized identifier, so do not re-issue the same search on an empty result: if it reports indexing in progress, retry once after a short pause; otherwise fall back to generic search. +Use `lsp_java_getFileStructure` only with a path confirmed by the user or a previous tool result. Prefer `file` from `lsp_java_findSymbol`; do not guess paths. Its output includes a top-level `file` and per-symbol `readFileRange`; to read a selected symbol, call `read_file` with `filePath=file` and that `readFileRange`. Use `limit` to keep large outlines small. Use generic search for string literals, comments, XML, Gradle/Maven files, non-Java files, or broad conceptual exploration. `lsp_java_findSymbol` already retries internally with a normalized identifier, so do not re-issue the same search on an empty result: if it reports indexing in progress, retry once after a short pause; otherwise fall back to generic search. diff --git a/resources/skills/java-lsp-tools/SKILL.md b/resources/skills/java-lsp-tools/SKILL.md index 2593862c..4535b75d 100644 --- a/resources/skills/java-lsp-tools/SKILL.md +++ b/resources/skills/java-lsp-tools/SKILL.md @@ -12,14 +12,14 @@ Two compiler-accurate tools backed by the Java Language Server (jdtls). They ret ### `lsp_java_findSymbol` Search for Java symbol definitions (classes, methods, fields) by name across the workspace. Supports partial matching. - Input: `{ query, limit? }` — limit defaults to 20, max 50 -- Output: `{ results: [{ name, kind, container?, location, range }], total }` (~60 tokens); `range` is `L start-end` +- Output: `{ results: [{ name, kind, container?, file, startLine, endLine, readFileInput, range }], total }`; `readFileInput` is `{ filePath, offset, limit }` for `read_file`, and `file` can be passed to `lsp_java_getFileStructure` - **Use instead of** `grep_search`, `file_search`, `semantic_search`, or `search_subagent` when looking for where a Java class/method/field is defined by identifier -- Do not repeat with the same or similar query after relevant results are returned +- When source is needed for a returned symbol, use its `readFileInput` directly ### `lsp_java_getFileStructure` Get hierarchical outline of a Java file (classes, methods, fields) with line ranges. -- Input: `{ uri }` — workspace-relative path. Must be a known path from prior tool results or user input — do not guess -- Output: symbol tree with `L start-end` ranges (~100 tokens) +- Input: `{ uri, limit? }` — workspace-relative path plus max outline items. Prefer `file` from `lsp_java_findSymbol`; limit defaults to 20, max 60. Must be a known path from prior tool results or user input — do not guess +- Output: `{ file, symbols: [{ name, kind, startLine, endLine, readFileRange, range, detail?, children? }], truncated? }`; call `read_file` with `filePath=file` and the selected symbol's `readFileRange` - **Use before** `read_file` when you need to choose a precise line range in a known Java file ## When to Use @@ -34,9 +34,9 @@ Get hierarchical outline of a Java file (classes, methods, fields) with line ran ## Typical Workflow -**findSymbol → getFileStructure → read_file (specific lines only)** +**lsp_java_findSymbol → lsp_java_getFileStructure → read_file (specific lines only)** -If `findSymbol` returns relevant symbols, move forward to `getFileStructure` or `read_file`; do not call `findSymbol` again with the same or similar identifier. +If `lsp_java_findSymbol` returns relevant symbols and source is needed, call `read_file` with the returned `readFileInput`, or call `lsp_java_getFileStructure` with the returned `file` when broader file context is needed. ## Fallback diff --git a/src/copilot/tools/javaContextTools.ts b/src/copilot/tools/javaContextTools.ts index 8728fd37..22179a3b 100644 --- a/src/copilot/tools/javaContextTools.ts +++ b/src/copilot/tools/javaContextTools.ts @@ -28,7 +28,8 @@ import { sendInfo } from "vscode-extension-telemetry-wrapper"; // Hard caps to keep tool responses within the < 200 token budget. const MAX_SYMBOL_DEPTH = 3; -const MAX_SYMBOL_NODES = 80; +const MAX_FILE_STRUCTURE_SYMBOL_NODES = 60; +const DEFAULT_FILE_STRUCTURE_SYMBOL_NODES = 20; const MAX_CALL_RESULTS = 50; const MAX_TYPE_RESULTS = 50; const MAX_IMPORTS = 50; @@ -44,6 +45,39 @@ function getResponseCharCount(data: unknown): number { return typeof data === "string" ? data.length : JSON.stringify(data, null, 2).length; } +interface ReadFileInput { + filePath: string; + offset: number; + limit: number; +} + +interface ReadFileRange { + offset: number; + limit: number; +} + +function toInclusiveLineRange(range: vscode.Range): { startLine: number; endLine: number } { + const startLine = range.start.line + 1; + const endLine = Math.max(startLine, range.end.character === 0 && range.end.line > range.start.line + ? range.end.line + : range.end.line + 1); + return { startLine, endLine }; +} + +function toReadFileRange(startLine: number, endLine: number): ReadFileRange { + return { + offset: startLine, + limit: endLine - startLine + 1, + }; +} + +function toReadFileInput(filePath: string, startLine: number, endLine: number): ReadFileInput { + return { + filePath, + ...toReadFileRange(startLine, endLine), + }; +} + /** * Normalize a workspace-symbol query for a single fallback retry. * Strips a fully-qualified package prefix (com.foo.Bar -> Bar), generic parameters @@ -86,7 +120,8 @@ function getToolErrorCode(error: unknown): string { * - Relative path: "src/main/java/Main.java" * - Absolute path: "/home/user/project/src/Main.java" or "C:\\Users\\...\\Main.java" * - * Relative paths are resolved against the first workspace folder. + * Relative paths are resolved against the first workspace folder unless they + * start with a workspace folder name in a multi-root workspace. * The resolved URI must use the file: scheme and fall under a workspace folder. */ function resolveFileUri(input: string): vscode.Uri { @@ -96,19 +131,31 @@ function resolveFileUri(input: string): vscode.Uri { } let uri: vscode.Uri; + const normalizedInput = input.trim(); - if (input.includes("://")) { + if (normalizedInput.includes("://")) { // URI string (e.g. "file:///home/user/project/src/Main.java") - uri = vscode.Uri.parse(input); + uri = vscode.Uri.parse(normalizedInput); if (uri.scheme !== "file") { throw new Error(`Unsupported URI scheme "${uri.scheme}". Only file: URIs are allowed.`); } - } else if (path.isAbsolute(input)) { + } else if (path.isAbsolute(normalizedInput)) { // Absolute filesystem path (Unix or Windows) - uri = vscode.Uri.file(input); + uri = vscode.Uri.file(normalizedInput); } else { - // Relative path — resolve against first workspace folder - uri = vscode.Uri.joinPath(folders[0].uri, input); + // Relative path — resolve against a matching workspace folder when + // asRelativePath included the folder name, otherwise use the first root. + const normalizedRelativePath = normalizedInput.replace(/\\/g, "/"); + const matchingFolder = folders.find(folder => + normalizedRelativePath === folder.name || normalizedRelativePath.startsWith(`${folder.name}/`)); + if (matchingFolder) { + const pathInFolder = normalizedRelativePath === matchingFolder.name + ? "" + : normalizedRelativePath.substring(matchingFolder.name.length + 1); + uri = vscode.Uri.joinPath(matchingFolder.uri, pathInFolder); + } else { + uri = vscode.Uri.joinPath(folders[0].uri, normalizedRelativePath); + } } // Ensure the resolved path is under a workspace folder @@ -130,16 +177,19 @@ function resolveFileUri(input: string): vscode.Uri { interface FileStructureInput { uri: string; + limit?: number; } const fileStructureTool: vscode.LanguageModelTool = { async invoke(options, _token) { const startTime = Date.now(); + const limit = Math.min(Math.max(Math.floor(options.input.limit ?? DEFAULT_FILE_STRUCTURE_SYMBOL_NODES), 1), MAX_FILE_STRUCTURE_SYMBOL_NODES); let resultCount = 0; let status = "success"; let errorCode = ""; let emptyReason = ""; let responseCharCount = 0; + let truncated = false; try { const uri = resolveFileUri(options.input.uri); try { @@ -171,11 +221,12 @@ const fileStructureTool: vscode.LanguageModelTool = { responseCharCount = getResponseCharCount(noSymbolsPayload); return toResult(noSymbolsPayload); } - const counter = { count: 0 }; - const result = symbolsToJson(symbols, 0, counter); + const counter = { count: 0, truncated: false }; + const result = symbolsToJson(symbols, 0, counter, limit); resultCount = counter.count; - const truncated = counter.count >= MAX_SYMBOL_NODES; - const fileStructurePayload = { symbols: result, ...(truncated && { truncated: true }) }; + truncated = counter.truncated; + const file = vscode.workspace.asRelativePath(uri); + const fileStructurePayload = { file, symbols: result, ...(truncated && { truncated: true }) }; responseCharCount = getResponseCharCount(fileStructurePayload); return toResult(fileStructurePayload); } catch (e) { @@ -188,6 +239,8 @@ const fileStructureTool: vscode.LanguageModelTool = { status, ...(errorCode && { errorCode }), ...(emptyReason && { emptyReason }), + truncated: truncated ? "true" : "false", + limit, resultCount, responseCharCount, durationMs: Date.now() - startTime, @@ -199,28 +252,36 @@ const fileStructureTool: vscode.LanguageModelTool = { interface SymbolNode { name: string; kind: string; + startLine: number; + endLine: number; + readFileRange: ReadFileRange; range: string; detail?: string; children?: SymbolNode[]; } -function symbolsToJson(symbols: vscode.DocumentSymbol[], depth: number, counter: { count: number }): SymbolNode[] { +function symbolsToJson(symbols: vscode.DocumentSymbol[], depth: number, counter: { count: number; truncated: boolean }, limit: number): SymbolNode[] { const result: SymbolNode[] = []; for (const s of symbols) { - if (counter.count >= MAX_SYMBOL_NODES) { + if (counter.count >= limit) { + counter.truncated = true; break; } counter.count++; + const { startLine, endLine } = toInclusiveLineRange(s.range); const node: SymbolNode = { name: s.name, kind: vscode.SymbolKind[s.kind], - range: `L${s.range.start.line + 1}-${s.range.end.line + 1}`, + startLine, + endLine, + readFileRange: toReadFileRange(startLine, endLine), + range: `L${startLine}-${endLine}`, }; if (s.detail) { node.detail = s.detail; } if (s.children?.length && depth < MAX_SYMBOL_DEPTH) { - node.children = symbolsToJson(s.children, depth + 1, counter); + node.children = symbolsToJson(s.children, depth + 1, counter, limit); } result.push(node); } @@ -288,13 +349,20 @@ const findSymbolTool: vscode.LanguageModelTool = { return toResult(noMatchesPayload); } totalResults = symbols.length; - const results = symbols.slice(0, limit).map(s => ({ - name: s.name, - kind: vscode.SymbolKind[s.kind], - container: s.containerName || undefined, - location: `${vscode.workspace.asRelativePath(s.location.uri)}:${s.location.range.start.line + 1}`, - range: `L${s.location.range.start.line + 1}-${s.location.range.end.line + 1}`, - })); + const results = symbols.slice(0, limit).map(s => { + const file = vscode.workspace.asRelativePath(s.location.uri); + const { startLine, endLine } = toInclusiveLineRange(s.location.range); + return { + name: s.name, + kind: vscode.SymbolKind[s.kind], + container: s.containerName || undefined, + file, + startLine, + endLine, + readFileInput: toReadFileInput(file, startLine, endLine), + range: `L${startLine}-${endLine}`, + }; + }); resultCount = results.length; const findSymbolPayload = { results, total: symbols.length }; responseCharCount = getResponseCharCount(findSymbolPayload); From 7c83b45281f0993a393d41c404615fa90d7cc85a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 22 Jun 2026 11:31:05 +0800 Subject: [PATCH 323/352] chore(deps): Bump form-data from 4.0.5 to 4.0.6 (#1034) Bumps [form-data](https://github.com/form-data/form-data) from 4.0.5 to 4.0.6. - [Changelog](https://github.com/form-data/form-data/blob/master/CHANGELOG.md) - [Commits](https://github.com/form-data/form-data/compare/v4.0.5...v4.0.6) --- updated-dependencies: - dependency-name: form-data dependency-version: 4.0.6 dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/package-lock.json b/package-lock.json index 31047a66..b6d943f5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1840,15 +1840,15 @@ } }, "node_modules/form-data": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz", - "integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==", + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.6.tgz", + "integrity": "sha512-vKatAh4SlVfgbv+YtmhiRjhEMJsYpsG1Y2rMQtR+SVSbytsSD1YGzDIcrAJmdFec88u/+VoGmxnl+80gL1tRCQ==", "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", "es-set-tostringtag": "^2.1.0", - "hasown": "^2.0.2", - "mime-types": "^2.1.12" + "hasown": "^2.0.4", + "mime-types": "^2.1.35" }, "engines": { "node": ">= 6" @@ -2079,9 +2079,9 @@ } }, "node_modules/hasown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.4.tgz", + "integrity": "sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==", "dependencies": { "function-bind": "^1.1.2" }, @@ -5479,15 +5479,15 @@ } }, "form-data": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz", - "integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==", + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.6.tgz", + "integrity": "sha512-vKatAh4SlVfgbv+YtmhiRjhEMJsYpsG1Y2rMQtR+SVSbytsSD1YGzDIcrAJmdFec88u/+VoGmxnl+80gL1tRCQ==", "requires": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", "es-set-tostringtag": "^2.1.0", - "hasown": "^2.0.2", - "mime-types": "^2.1.12" + "hasown": "^2.0.4", + "mime-types": "^2.1.35" } }, "fs-extra": { @@ -5650,9 +5650,9 @@ } }, "hasown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.4.tgz", + "integrity": "sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==", "requires": { "function-bind": "^1.1.2" } From efeb509619dc5599e9e3d0413f25a86498304766 Mon Sep 17 00:00:00 2001 From: Changyong Gong Date: Tue, 23 Jun 2026 11:00:30 +0800 Subject: [PATCH 324/352] fix(deps): bump js-yaml to 4.2.0 to address CVE-2026-53550 (GHSA-h67p-54hq-rp68) (#1035) --- package-lock.json | 23 +++++++++++++++++------ 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index b6d943f5..afb93b4c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2328,10 +2328,21 @@ "license": "MIT" }, "node_modules/js-yaml": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", - "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.2.0.tgz", + "integrity": "sha512-ePWsvanv0DWuDRsW8dnt+R4jQ31SCRCQ7hhNcPXZPsoBZiemuZNYGf7adZdqX2D86j6rvKp3RpCxVTSb8WQlOw==", "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/puzrin" + }, + { + "type": "github", + "url": "https://github.com/sponsors/nodeca" + } + ], + "license": "MIT", "dependencies": { "argparse": "^2.0.1" }, @@ -5828,9 +5839,9 @@ "dev": true }, "js-yaml": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", - "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.2.0.tgz", + "integrity": "sha512-ePWsvanv0DWuDRsW8dnt+R4jQ31SCRCQ7hhNcPXZPsoBZiemuZNYGf7adZdqX2D86j6rvKp3RpCxVTSb8WQlOw==", "dev": true, "requires": { "argparse": "^2.0.1" From 3789b1126aacd41f9c886a6917db11d83c273290 Mon Sep 17 00:00:00 2001 From: Frank Liu <63277848+frankliu20@users.noreply.github.com> Date: Wed, 24 Jun 2026 12:13:19 +0800 Subject: [PATCH 325/352] Prefer Java upgrade over CVE in dependency recommendations (#1033) When both Java upgrade and CVE issues are detected, surface the Java upgrade recommendation first instead of the CVE fix. The notification selection logic derives its state from a single isCVE flag and uses ExtensionState-keyed lookup tables for button labels. Add a product-style README section describing the upgrade and security (CVE) recommendations powered by the app modernization extension. Co-authored-by: Frank Liu Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Co-authored-by: Changyong Gong --- README.md | 11 +++ src/upgrade/display/notificationManager.ts | 101 ++++++++------------- 2 files changed, 48 insertions(+), 64 deletions(-) diff --git a/README.md b/README.md index ac4954d9..6fc1881c 100644 --- a/README.md +++ b/README.md @@ -55,6 +55,17 @@ You can tell that the glob pattern is supported. And here's more - you can incl } ``` +### Stay Secure and Up to Date + +Project Manager for Java keeps an eye on your project's Java runtime and dependencies, so you don't have to track them yourself. When it spots something worth your attention, it offers a one-click recommendation to fix it: + +- **Upgrade recommendations** – Get notified when your Java runtime or libraries are out of date, deprecated, or have reached end of life, along with a suggested target version. +- **Security recommendations** – Get alerted when known vulnerabilities (CVEs) are detected in your dependencies, so you can address them before they become a problem. + +When you accept a recommendation, the upgrade or fix is carried out for you by the [GitHub Copilot app modernization](https://marketplace.visualstudio.com/items?itemName=vscjava.migrate-java-to-azure) extension. If the extension isn't installed yet, it will be set up automatically as part of the flow. + +You can turn these reminders on or off at any time with the `java.dependency.enableDependencyCheckup` setting. + ## Requirements - VS Code (version 1.95.0+) diff --git a/src/upgrade/display/notificationManager.ts b/src/upgrade/display/notificationManager.ts index 55c3422c..29f0f5ca 100644 --- a/src/upgrade/display/notificationManager.ts +++ b/src/upgrade/display/notificationManager.ts @@ -3,7 +3,7 @@ import { commands, ExtensionContext, window } from "vscode"; import { UpgradeReason, type IUpgradeIssuesRenderer, type UpgradeIssue } from "../type"; -import { buildCVENotificationMessage, buildFixPrompt, buildNotificationMessage, getExtensionState } from "../utility"; +import { buildCVENotificationMessage, buildFixPrompt, buildNotificationMessage, getExtensionState, type ExtensionState } from "../utility"; import { Commands } from "../../commands"; import { Settings } from "../../settings"; import { instrumentOperation, sendInfo } from "vscode-extension-telemetry-wrapper"; @@ -13,14 +13,20 @@ import { CveUpgradeIssue } from "../cve"; const KEY_PREFIX = 'javaupgrade.notificationManager'; const NEXT_SHOW_TS_KEY = `${KEY_PREFIX}.nextShowTs`; -const BUTTON_TEXT_UPGRADE = "Upgrade Now"; -const BUTTON_TEXT_FIX_CVE = "Fix Now"; -const BUTTON_TEXT_INSTALL_AND_UPGRADE = "Install Extension and Upgrade"; -const BUTTON_TEXT_INSTALL_AND_FIX_CVE = "Install Extension and Fix"; -const BUTTON_TEXT_UPDATE_AND_UPGRADE = "Update Extension and Upgrade"; -const BUTTON_TEXT_UPDATE_AND_FIX_CVE = "Update Extension and Fix"; const BUTTON_TEXT_NOT_NOW = "Not Now"; +// Action button label keyed by the install state of the app modernization extension. +const UPGRADE_BUTTON_TEXT: Record = { + "up-to-date": "Upgrade Now", + "outdated": "Update Extension and Upgrade", + "not-installed": "Install Extension and Upgrade", +}; +const FIX_CVE_BUTTON_TEXT: Record = { + "up-to-date": "Fix Now", + "outdated": "Update Extension and Fix", + "not-installed": "Install Extension and Fix", +}; + const SECONDS_IN_A_DAY = 24 * 60 * 60; const SECONDS_COUNT_BEFORE_NOTIFICATION_RESHOW = 10 * SECONDS_IN_A_DAY; @@ -44,84 +50,51 @@ class NotificationManager implements IUpgradeIssuesRenderer { return; } - // Filter to only CVE issues and cast to CveUpgradeIssue[] + if (!this.shouldShow() || this.hasShown) { + return; + } + this.hasShown = true; + + // Prefer Java upgrade recommendations over CVE fixes: only fall back + // to a CVE notification when there is no upgrade issue to recommend. const cveIssues = issues.filter( (i): i is CveUpgradeIssue => i.reason === UpgradeReason.CVE ); - const nonCVEIssues = issues.filter( + const upgradeIssues = issues.filter( (i) => i.reason !== UpgradeReason.CVE ); - const hasCVEIssue = cveIssues.length > 0; - const issue = hasCVEIssue ? cveIssues[0] : nonCVEIssues[0]; - - if (!this.shouldShow()) { - return; - } - - if (this.hasShown) { - return; - } - this.hasShown = true; + const isCVE = upgradeIssues.length === 0; + const issue = isCVE ? cveIssues[0] : upgradeIssues[0]; const extensionState = getExtensionState(ExtensionName.APP_MODERNIZATION_UPGRADE_FOR_JAVA); - const prompt = buildFixPrompt(issue); - - let notificationMessage = ""; + const source = isCVE ? Upgrade.SOURCE_CVE : Upgrade.SOURCE_JAVA_UPGRADE; + const notificationMessage = isCVE + ? buildCVENotificationMessage(cveIssues, extensionState) + : buildNotificationMessage(issue, extensionState); + const actionButtonText = isCVE + ? FIX_CVE_BUTTON_TEXT[extensionState] + : UPGRADE_BUTTON_TEXT[extensionState]; - if (hasCVEIssue) { - notificationMessage = buildCVENotificationMessage(cveIssues, extensionState); - } else { - notificationMessage = buildNotificationMessage(issue, extensionState); - } - - let upgradeButtonText: string; - let fixCVEButtonText: string; - switch (extensionState) { - case "up-to-date": - upgradeButtonText = BUTTON_TEXT_UPGRADE; - fixCVEButtonText = BUTTON_TEXT_FIX_CVE; - break; - case "outdated": - upgradeButtonText = BUTTON_TEXT_UPDATE_AND_UPGRADE; - fixCVEButtonText = BUTTON_TEXT_UPDATE_AND_FIX_CVE; - break; - case "not-installed": - upgradeButtonText = BUTTON_TEXT_INSTALL_AND_UPGRADE; - fixCVEButtonText = BUTTON_TEXT_INSTALL_AND_FIX_CVE; - break; - } sendInfo(operationId, { operationName: "java.dependency.upgradeNotification.show", extensionState, - source: hasCVEIssue ? Upgrade.SOURCE_CVE : Upgrade.SOURCE_JAVA_UPGRADE, + source, }); - const buttons = hasCVEIssue - ? [fixCVEButtonText, BUTTON_TEXT_NOT_NOW] - : [upgradeButtonText, BUTTON_TEXT_NOT_NOW]; - const selection = await window.showInformationMessage( notificationMessage, - ...buttons + actionButtonText, + BUTTON_TEXT_NOT_NOW ); sendInfo(operationId, { operationName: "java.dependency.upgradeNotification.runUpgrade", choice: selection ?? "", }); - switch (selection) { - case fixCVEButtonText: { - commands.executeCommand(Commands.JAVA_UPGRADE_WITH_COPILOT, prompt, Upgrade.SOURCE_CVE); - break; - } - case upgradeButtonText: { - commands.executeCommand(Commands.JAVA_UPGRADE_WITH_COPILOT, prompt, Upgrade.SOURCE_JAVA_UPGRADE); - break; - } - case BUTTON_TEXT_NOT_NOW: { - this.setNextShowTs(getNowTs() + SECONDS_COUNT_BEFORE_NOTIFICATION_RESHOW); - break; - } + if (selection === actionButtonText) { + commands.executeCommand(Commands.JAVA_UPGRADE_WITH_COPILOT, buildFixPrompt(issue), source); + } else if (selection === BUTTON_TEXT_NOT_NOW) { + this.setNextShowTs(getNowTs() + SECONDS_COUNT_BEFORE_NOTIFICATION_RESHOW); } } ))(); From 768df1335c0421807d712a46ea04879c7f9bdea8 Mon Sep 17 00:00:00 2001 From: Frank Liu <63277848+frankliu20@users.noreply.github.com> Date: Thu, 25 Jun 2026 10:48:06 +0800 Subject: [PATCH 326/352] docs(changelog): add 0.27.6 entries (#1036) Co-authored-by: Frank Liu Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- CHANGELOG.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 42889f00..3adc9a1f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,11 @@ All notable changes to the "vscode-java-dependency" extension will be documented The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/) and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html). +## 0.27.6 + +- enhancement - Prefer Java upgrade over CVE in dependency recommendations in https://github.com/microsoft/vscode-java-dependency/pull/1033 +- enhancement - Improve Java upgrade telemetry tracking and extension installation flow in https://github.com/microsoft/vscode-java-dependency/pull/1030 + ## 0.27.5 - fix - Check GHCP modernization version before call gotoAgentMode command in https://github.com/microsoft/vscode-java-dependency/pull/1022 From 79ea88490d76e1b32578564af6b034be73a414d9 Mon Sep 17 00:00:00 2001 From: wenyt <75360946+wenytang-ms@users.noreply.github.com> Date: Thu, 25 Jun 2026 13:23:40 +0800 Subject: [PATCH 327/352] build: release 0.27.6 (#1037) Bump package version to 0.27.6 and complete the changelog with non-CI/test changes since 0.27.5. --- CHANGELOG.md | 2 ++ package-lock.json | 4 ++-- package.json | 2 +- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3adc9a1f..e0f5287a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,8 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0. - enhancement - Prefer Java upgrade over CVE in dependency recommendations in https://github.com/microsoft/vscode-java-dependency/pull/1033 - enhancement - Improve Java upgrade telemetry tracking and extension installation flow in https://github.com/microsoft/vscode-java-dependency/pull/1030 +- perf - Improve Java LSP tool result handoff in https://github.com/microsoft/vscode-java-dependency/pull/1031 +- fix - Refresh now surfaces externally-generated files in new packages in https://github.com/microsoft/vscode-java-dependency/pull/1026 ## 0.27.5 diff --git a/package-lock.json b/package-lock.json index afb93b4c..7189d679 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "vscode-java-dependency", - "version": "0.27.5", + "version": "0.27.6", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "vscode-java-dependency", - "version": "0.27.5", + "version": "0.27.6", "license": "MIT", "dependencies": { "@github/copilot-language-server": "^1.388.0", diff --git a/package.json b/package.json index 511ba465..312eb543 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "vscode-java-dependency", "displayName": "Project Manager for Java", "description": "%description%", - "version": "0.27.5", + "version": "0.27.6", "publisher": "vscjava", "preview": false, "aiKey": "5c642b22-e845-4400-badb-3f8509a70777", From d0633fd9d837a2cfd389b1cf56f79ff7a4039d34 Mon Sep 17 00:00:00 2001 From: wenyt <75360946+wenytang-ms@users.noreply.github.com> Date: Thu, 2 Jul 2026 13:16:59 +0800 Subject: [PATCH 328/352] chore: add Copilot UI test skill (#1039) Adapt vscode-java-pack#1682 to Project Manager for Java: - Add repository-level Copilot instructions routing UI/E2E requests to AutoTest YAML plans under test/e2e-plans/ - Add scoped test/e2e-plans/**/*.yaml authoring rules for AutoTest plans - Add a uitest skill that guides writing, validating, building, packaging, running, and debugging AutoTest UI tests --- .github/copilot-instructions.md | 8 ++ .../instructions/uitest-plan.instructions.md | 49 ++++++++++++ .github/skills/uitest/SKILL.md | 79 +++++++++++++++++++ 3 files changed, 136 insertions(+) create mode 100644 .github/copilot-instructions.md create mode 100644 .github/instructions/uitest-plan.instructions.md create mode 100644 .github/skills/uitest/SKILL.md diff --git a/.github/copilot-instructions.md b/.github/copilot-instructions.md new file mode 100644 index 00000000..451981cf --- /dev/null +++ b/.github/copilot-instructions.md @@ -0,0 +1,8 @@ +# Copilot instructions for vscode-java-dependency + +## UI and E2E tests + +- When asked to add, update, run, or debug UI/E2E coverage, prefer the AutoTest YAML workflow under `test/e2e-plans/`. +- Use the `uitest` skill for UI test work. It should create or update `test/e2e-plans/*.yaml`, validate the plan, build the OSGi bundle and package the extension when needed, run AutoTest, and inspect `test-results/`. +- Do not create legacy VS Code extension tests (`test/maven-suite`, `test/gui`) for UI coverage unless the user explicitly asks for that format. +- Prefer deterministic AutoTest verifiers (`verifyTreeItem`, `verifyFile`, `verifyEditorTab`, `verifyClipboard`) over screenshot-only checks. diff --git a/.github/instructions/uitest-plan.instructions.md b/.github/instructions/uitest-plan.instructions.md new file mode 100644 index 00000000..34cc6708 --- /dev/null +++ b/.github/instructions/uitest-plan.instructions.md @@ -0,0 +1,49 @@ +--- +applyTo: "test/e2e-plans/**/*.yaml" +description: "Authoring rules for vscode-java-dependency (Project Manager for Java) AutoTest UI/E2E YAML test plans" +--- + +# AutoTest UI/E2E test plan instructions + +Test plans under `test/e2e-plans/` are executable YAML files consumed by `@vscjava/vscode-autotest`. They should describe stable user scenarios for the Java Projects explorer, not raw implementation details. + +## Setup rules + +- Use `setup.extension: "vscjava.vscode-java-pack"` plus `setup.vscodeVersion: "stable"` for most scenarios. Installing the Extension Pack for Java pulls in every Java extension the Java Projects view relies on, so there is no need to install `redhat.java` separately. +- Install the extension under test from a local VSIX at runtime with `--vsix vscode-java-dependency.vsix` — do not rely on a marketplace copy of `vscjava.vscode-java-dependency`. +- Use existing in-repo fixtures as the workspace: `../maven` (a `maven-archetype-quickstart` project: `my-app` / `com.mycompany.app` / `App.java`) or `../invisible` (an unmanaged-folder project for referenced-library scenarios). Paths are relative to the test plan file. Do not add large binary fixtures. +- Referenced-library / classpath commands (`java.project.addLibraries`, `java.project.removeLibrary`, `java.project.addLibraryFolders`, `java.project.refreshLibraries`) only apply to invisible projects — use `../invisible`, not `../maven`, for those. +- Disable noisy startup surfaces with settings when relevant, for example `workbench.startupEditor: "none"` and `java.configuration.checkProjectSettingsExclusions: false`. + +## Action rules + +- Prefer stable command IDs via `executeVSCodeCommand` (for example `javaProjectExplorer.focus`, `java.view.package.revealInProjectExplorer`, `workbench.actions.treeView.javaProjectExplorer.collapseAll`) before UI locators. Command IDs are locale-independent. +- Drive the tree with `expandTreeItem ` and title-bar buttons with `clickViewTitleAction "Java Projects" ""`. The action resolver only matches the exact `expandTreeItem ` form; free-form phrasing silently falls back to the command palette and no-ops. +- Free up sidebar space before asserting tree rows: `executeVSCodeCommand workbench.action.closeAuxiliaryBar`, `collapseSidebarSection OUTLINE`, `collapseSidebarSection TIMELINE`, and `collapseWorkspaceRoot`. +- Use `insertLineInFile` for Java edits that the language server must analyze. Use `typeInEditor` only for text that does not require language-server analysis. +- Use `waitForLanguageServer` before interacting with the tree; prefer verifier polling over long static waits. Short static waits are acceptable only for UI rendering settle time. +- Native file/folder pickers are suppressed in the smoke-test driver; drive VS Code's internal quick-pick with `fillQuickInput` instead of relying on `mockOpenDialog`. +- Quote action arguments that contain spaces: + +```yaml +action: 'clickViewTitleAction "Java Projects" "Unlink with Editor"' +``` + +## Verification rules + +- Add deterministic verification to every meaningful step. The natural-language `verify` field is context for humans and failure analysis; it is not pass/fail authority by itself, and it is auto-passed when a plan runs with `--no-llm`. +- Use `verifyTreeItem` (with `name:`, optional `exact: true`, and `visible: false` for absence) as the authoritative check for Java Projects tree state. +- Use `verifyFile` after operations that create, modify, or delete files on disk (new type, export jar, permanent delete). VS Code can open duplicate editor tabs with stale buffers, so prefer file-content checks over editor checks after such operations. +- Use `verifyEditorTab` to assert which file an action opened, and `verifyClipboard` for copy-path commands. +- On state-check steps whose only assertion is a deterministic verifier, omit the `verify:` field to avoid false LLM failures. +- Use screenshots only as diagnostics produced by AutoTest; do not make screenshots the only evidence of pass/fail. + +## Local validation commands + +```powershell +npx -y @vscjava/vscode-autotest validate test\e2e-plans\.yaml +npm install # first time only; on later iterations run just the commands below +npm run build-server +npx @vscode/vsce package -o vscode-java-dependency.vsix +npx -y @vscjava/vscode-autotest run test\e2e-plans\.yaml --vsix vscode-java-dependency.vsix --no-llm +``` diff --git a/.github/skills/uitest/SKILL.md b/.github/skills/uitest/SKILL.md new file mode 100644 index 00000000..801bc8ba --- /dev/null +++ b/.github/skills/uitest/SKILL.md @@ -0,0 +1,79 @@ +--- +name: uitest +description: Write, update, run, or debug vscode-java-dependency (Project Manager for Java) UI/E2E tests using AutoTest YAML plans. Use when the user asks for a UI test, E2E test, VS Code UI validation, Java Projects tree/view test, referenced-library test, or autotest plan. +--- + +# UI/E2E tests with AutoTest + +Use this skill to add or update UI/E2E coverage for `vscode-java-dependency` (Project Manager for Java). + +The repository uses `@vscjava/vscode-autotest`: YAML plans in `test/e2e-plans/*.yaml` launch VS Code, install the Extension Pack for Java (`vscjava.vscode-java-pack`) plus a local VSIX of this extension, execute user-facing actions against the Java Projects view, capture screenshots, and write `test-results//results.json`. + +## Prerequisites (local) + +- Node.js >= 18 and JDK 21+ installed and on `PATH` (JDK 21 is required to build the `jdtls.ext` OSGi bundle). +- Close any running VS Code instance before running a plan locally; a running instance can block AutoTest from launching its own VS Code. +- Workspace fixtures are in-repo — no external clones are needed. Plans reference `../maven` (`test/maven`, a `maven-archetype-quickstart` project) or `../invisible` (`test/invisible`, an unmanaged-folder project). + +## Workflow + +1. Identify the scenario and search `test/e2e-plans/*.yaml` for an existing plan that already covers the area (project explorer, view modes, classpath, export jar, new types, file operations, delete, copy paths, refresh, build lifecycle, autorefresh). +2. Update the existing plan when possible. Create a new `test/e2e-plans/java-dep-.yaml` only when no existing plan fits. +3. Use stable AutoTest actions and deterministic verifiers. Do not add raw Playwright tests or screenshot-only checks. +4. Validate the plan: + +```powershell +npx -y @vscjava/vscode-autotest validate test\e2e-plans\.yaml +``` + +5. If validating the current branch, build the OSGi bundle and package the extension: + +```powershell +npm install # first time only; on later iterations run just the two commands below +npm run build-server +npx @vscode/vsce package -o vscode-java-dependency.vsix +``` + +6. Run the plan against the packaged VSIX: + +```powershell +npx -y @vscjava/vscode-autotest run test\e2e-plans\.yaml --vsix vscode-java-dependency.vsix --output test-results\ +``` + + Add `--no-llm` to skip natural-language `verify:` fields and rely only on deterministic verifiers for a fast local loop. Run the whole suite with `npm run test-e2e` (`autotest run-all test/e2e-plans --no-llm`). + +7. Inspect `test-results//results.json` and `test-results//screenshots/`. +8. Iterate based on the failure cause: + - **Incorrect plan**: fix the YAML and rerun step 6. No rebuild is needed. + - **Product code fix**: after editing extension source (`src/**`) or the OSGi bundle (`jdtls.ext/**`), re-run step 5 (rebuild + repackage the VSIX) before rerunning step 6. Never rerun against a stale VSIX. + - **Product bug (report only)**: report the observed behavior and cite the failing step, screenshot, and result reason. + +## Authoring rules + +- For most plans, use: + +```yaml +setup: + extension: "vscjava.vscode-java-pack" + vscodeVersion: "stable" + workspace: "../maven" + settings: + java.configuration.checkProjectSettingsExclusions: false + workbench.startupEditor: "none" +``` + +- Use `--vsix vscode-java-dependency.vsix` to test current-branch changes; do not rely on a marketplace copy of `vscjava.vscode-java-dependency`. +- Use `../invisible` (not `../maven`) for referenced-library / classpath commands, which only apply to unmanaged-folder projects. +- Prefer `executeVSCodeCommand ` for command-driven UI (e.g. `javaProjectExplorer.focus`, `java.view.package.revealInProjectExplorer`, `workbench.actions.treeView.javaProjectExplorer.collapseAll`). +- Drive the tree with `expandTreeItem ` and title-bar buttons with `clickViewTitleAction "Java Projects" ""`. +- Prefer `verifyTreeItem` for tree state, `verifyFile` for generated/modified/deleted files, `verifyEditorTab` for opened tabs, and `verifyClipboard` for copy-path commands. +- Use `waitForLanguageServer` before tree interactions, and `insertLineInFile` for Java source edits that JDT LS must observe. +- Free sidebar space (`closeAuxiliaryBar`, `collapseSidebarSection OUTLINE`/`TIMELINE`, `collapseWorkspaceRoot`) before asserting tree rows. +- Keep step IDs unique, descriptive, and kebab-case. Omit `verify:` on steps whose only assertion is a deterministic verifier. +- Avoid hard-coded coordinates and brittle DOM structure assumptions. + +## CI + +The repository workflow `.github/workflows/e2eUI.yml` runs on push and pull requests to `main`. It lints, discovers `test/e2e-plans/*.yaml` into a matrix, builds a branch VSIX per OS, runs every plan on Windows and Linux as independent matrix cells, and uploads `test-results/` artifacts plus an aggregate summary. + +Each plan surfaces as its own PR check, so a new `test/e2e-plans/*.yaml` is picked up automatically without editing the workflow. From 1fd9ec9ddcbadb752ac659e81bf5466c8f15b83e Mon Sep 17 00:00:00 2001 From: Changyong Gong Date: Fri, 10 Jul 2026 15:41:51 +0800 Subject: [PATCH 329/352] Update responseRequiredLabel in workflow file (#1038) --- .github/workflows/no-response.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/no-response.yml b/.github/workflows/no-response.yml index a29ebc24..e4151ec1 100644 --- a/.github/workflows/no-response.yml +++ b/.github/workflows/no-response.yml @@ -20,6 +20,6 @@ jobs: with: token: ${{ github.token }} daysUntilClose: 14 - responseRequiredLabel: "need more info" + responseRequiredLabel: "needs more info" closeComment: > - This issue has been closed automatically because it needs more information and has not had recent activity. Please reach out if you have or find the answers we need so that we can investigate further. \ No newline at end of file + This issue has been closed automatically because it needs more information and has not had recent activity. Please reach out if you have or find the answers we need so that we can investigate further. From ef7a0298318a6abc045b8a7df63c2dd5a6a6cf6c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 21 Jul 2026 07:04:24 +0800 Subject: [PATCH 330/352] chore(deps): Bump axios from 1.16.0 to 1.18.1 (#1042) Bumps [axios](https://github.com/axios/axios) from 1.16.0 to 1.18.1. - [Release notes](https://github.com/axios/axios/releases) - [Changelog](https://github.com/axios/axios/blob/v1.x/CHANGELOG.md) - [Commits](https://github.com/axios/axios/compare/v1.16.0...v1.18.1) --- updated-dependencies: - dependency-name: axios dependency-version: 1.18.1 dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 62 ++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 51 insertions(+), 11 deletions(-) diff --git a/package-lock.json b/package-lock.json index 7189d679..147498fc 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1085,15 +1085,39 @@ "integrity": "sha512-aDczADvlvTGajTDjcjpJMqRkOF6Qdz3YbPZm/PyW6tKPkx2hlYBzxMhEywM/tU72HrVZjgl5VCdRuMlA7pZ8Gw==" }, "node_modules/axios": { - "version": "1.16.0", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.16.0.tgz", - "integrity": "sha512-6hp5CwvTPlN2A31g5dxnwAX0orzM7pmCRDLnZSX772mv8WDqICwFjowHuPs04Mc8deIld1+ejhtaMn5vp6b+1w==", + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.18.1.tgz", + "integrity": "sha512-3nTvFlvpn9Zu/RkHUqtc7/+al4UpRW5az71ap5zccp6e8RAYEzhMTecX8Dz1wWDYrPpUoB1HAQEGEAEvUr7S9g==", "dependencies": { "follow-redirects": "^1.16.0", "form-data": "^4.0.5", + "https-proxy-agent": "^5.0.1", "proxy-from-env": "^2.1.0" } }, + "node_modules/axios/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==", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/axios/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==", + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", @@ -1435,7 +1459,6 @@ "version": "4.4.3", "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", - "dev": true, "license": "MIT", "dependencies": { "ms": "^2.1.3" @@ -2651,7 +2674,6 @@ "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true, "license": "MIT" }, "node_modules/neo-async": { @@ -4981,13 +5003,33 @@ "integrity": "sha512-aDczADvlvTGajTDjcjpJMqRkOF6Qdz3YbPZm/PyW6tKPkx2hlYBzxMhEywM/tU72HrVZjgl5VCdRuMlA7pZ8Gw==" }, "axios": { - "version": "1.16.0", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.16.0.tgz", - "integrity": "sha512-6hp5CwvTPlN2A31g5dxnwAX0orzM7pmCRDLnZSX772mv8WDqICwFjowHuPs04Mc8deIld1+ejhtaMn5vp6b+1w==", + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.18.1.tgz", + "integrity": "sha512-3nTvFlvpn9Zu/RkHUqtc7/+al4UpRW5az71ap5zccp6e8RAYEzhMTecX8Dz1wWDYrPpUoB1HAQEGEAEvUr7S9g==", "requires": { "follow-redirects": "^1.16.0", "form-data": "^4.0.5", + "https-proxy-agent": "^5.0.1", "proxy-from-env": "^2.1.0" + }, + "dependencies": { + "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==", + "requires": { + "debug": "4" + } + }, + "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==", + "requires": { + "agent-base": "6", + "debug": "4" + } + } } }, "balanced-match": { @@ -5223,7 +5265,6 @@ "version": "4.4.3", "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", - "dev": true, "requires": { "ms": "^2.1.3" } @@ -6065,8 +6106,7 @@ "ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" }, "neo-async": { "version": "2.6.2", From 8c6626a8378bfa78b0c6743b3d2b3f02ef197c12 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 26 Jul 2026 06:49:47 +0800 Subject: [PATCH 331/352] chore(deps-dev): Bump fast-uri from 3.1.2 to 3.1.4 (#1043) Bumps [fast-uri](https://github.com/fastify/fast-uri) from 3.1.2 to 3.1.4. - [Release notes](https://github.com/fastify/fast-uri/releases) - [Commits](https://github.com/fastify/fast-uri/compare/v3.1.2...v3.1.4) --- updated-dependencies: - dependency-name: fast-uri dependency-version: 3.1.4 dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index 147498fc..fdf7d222 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1750,9 +1750,9 @@ } }, "node_modules/fast-uri": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.2.tgz", - "integrity": "sha512-rVjf7ArG3LTk+FS6Yw81V1DLuZl1bRbNrev6Tmd/9RaroeeRRJhAt7jg/6YFxbvAQXUCavSoZhPPj6oOx+5KjQ==", + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.4.tgz", + "integrity": "sha512-8JnbkQ4juDyvYs4mgFGQqg4yCYtFDtUtmp2QIQq11ZZe5CFQ5wcqm1rqDgAh/QdMySuBnPzMUiJUNZG5N/AiQw==", "dev": true, "funding": [ { @@ -5464,9 +5464,9 @@ } }, "fast-uri": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.2.tgz", - "integrity": "sha512-rVjf7ArG3LTk+FS6Yw81V1DLuZl1bRbNrev6Tmd/9RaroeeRRJhAt7jg/6YFxbvAQXUCavSoZhPPj6oOx+5KjQ==", + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.4.tgz", + "integrity": "sha512-8JnbkQ4juDyvYs4mgFGQqg4yCYtFDtUtmp2QIQq11ZZe5CFQ5wcqm1rqDgAh/QdMySuBnPzMUiJUNZG5N/AiQw==", "dev": true }, "fastest-levenshtein": { From 8d6e46ff4940cb11bb8a017556f5c13805c57cce Mon Sep 17 00:00:00 2001 From: wenyt <75360946+wenytang-ms@users.noreply.github.com> Date: Tue, 28 Jul 2026 14:09:04 +0800 Subject: [PATCH 332/352] Route npm package restore through the Central Feed Service (#1045) SFI Network Isolation requires build pipelines to stop restoring packages directly from public feeds. These pipelines resolve everything from registry.npmjs.org today, so they cannot run on a network isolated pool and are flagged by the MountainPass SR21 campaign. Point npm at the CFS feed mseng/VSJava/vscjava instead. The redirect is carried by npm_config_registry, declared as a pipeline variable. npm resolves configuration in the order cli > environment > project .npmrc > user .npmrc, so writing the registry only into a generated user config would leave it outranked by anything the agent image already configures -- Microsoft hosted images do ship a user level .npmrc pointing at an internal proxy. An environment variable sits above every .npmrc file, so it is the one lever that reaches all of these pipelines. npm matches npm_config_* case insensitively, which matters because restore is not driven by a single task here: the Npm tasks, npx json, npx @vscode/vsce and the vsce invocation inside AzureCLI@2 all inherit the agent environment rather than reading a task input. A .npmrc is still generated into the agent temp directory, because NpmAuthenticate discovers the registries to authenticate by reading it. npm now takes the URL from the environment and the matching credential from that file. Nothing is committed, so open source contributors and the GitHub Actions workflows keep restoring from the public registry, and the credential never lands inside the workspace. Assert the result rather than assuming it. A silent fallback to the public registry is the failure this change exists to prevent and it leaves no trace in the build log -- npm never reports which registry it used, and the package counts look identical either way. The pipelines now fail if npm is not pointed at the CFS feed by the time restore begins. The steps template is referenced as an absolute path anchored to @self. A relative path is resolved against the file doing the including, which for these pipelines is the 1ES extends template in another repository, so the unqualified form is looked up in 1ESPipelineTemplates and fails YAML compilation. --- .azure-pipelines/ci.yml | 2 + .azure-pipelines/nightly.yml | 2 + .azure-pipelines/npm-cfs-variables.yml | 28 +++++++++++++ .azure-pipelines/npm-cfs.yml | 58 ++++++++++++++++++++++++++ .azure-pipelines/rc.yml | 2 + .azure-pipelines/release-nightly.yml | 2 + .azure-pipelines/release.yml | 2 + 7 files changed, 96 insertions(+) create mode 100644 .azure-pipelines/npm-cfs-variables.yml create mode 100644 .azure-pipelines/npm-cfs.yml diff --git a/.azure-pipelines/ci.yml b/.azure-pipelines/ci.yml index 6442cafb..ba0d707d 100644 --- a/.azure-pipelines/ci.yml +++ b/.azure-pipelines/ci.yml @@ -2,6 +2,7 @@ name: $(Date:yyyyMMdd).$(Rev:r) variables: - name: Codeql.Enabled value: true + - template: /.azure-pipelines/npm-cfs-variables.yml@self resources: repositories: - repository: self @@ -53,6 +54,7 @@ extends: displayName: Use Node 20.x inputs: versionSpec: 20.x + - template: /.azure-pipelines/npm-cfs.yml@self - task: Npm@1 displayName: npm install inputs: diff --git a/.azure-pipelines/nightly.yml b/.azure-pipelines/nightly.yml index f4747f62..6b8ce9f2 100644 --- a/.azure-pipelines/nightly.yml +++ b/.azure-pipelines/nightly.yml @@ -2,6 +2,7 @@ name: $(Date:yyyyMMdd).$(Rev:r) variables: - name: Codeql.Enabled value: true + - template: /.azure-pipelines/npm-cfs-variables.yml@self schedules: - cron: 0 0 * * * branches: @@ -67,6 +68,7 @@ extends: jdkDestinationDirectory: $(Agent.ToolsDirectory)/ms-jdk21 - script: java --version displayName: 'Check Java installation' + - template: /.azure-pipelines/npm-cfs.yml@self - task: Npm@1 displayName: npm install inputs: diff --git a/.azure-pipelines/npm-cfs-variables.yml b/.azure-pipelines/npm-cfs-variables.yml new file mode 100644 index 00000000..261e5d08 --- /dev/null +++ b/.azure-pipelines/npm-cfs-variables.yml @@ -0,0 +1,28 @@ +# Variables required to route npm package restore through the Central Feed Service +# (CFS). Consumed by every pipeline in this directory alongside the npm-cfs.yml steps +# template, which is where these values are actually applied. +# +# Both are declared here rather than in each pipeline so the feed URL exists in +# exactly one place. +# +# npm_config_registry is not redundant with the registry written into the generated +# .npmrc. npm resolves configuration in the order cli > environment > project .npmrc +# > user .npmrc, so a registry supplied only through the user config is outranked by +# anything the agent image already configures -- Microsoft hosted images ship a user +# level .npmrc pointing at an internal proxy, and a pool that exports +# npm_config_registry would win outright. Restore would then quietly resolve from +# somewhere other than CFS while the build still reported success. Declaring the +# variable here puts the redirect at environment precedence, where only an explicit +# command line flag can override it. +# +# npm matches npm_config_* environment variables case insensitively, so the +# uppercased form that Azure Pipelines exports applies to every step on every OS. +# That matters because package restore here is not driven by a single task: the Npm +# tasks, `npx json`, `npx @vscode/vsce` and the vsce invocation inside AzureCLI@2 +# all inherit the agent environment rather than reading a task input. + +variables: + - name: npm_config_registry + value: https://pkgs.dev.azure.com/mseng/VSJava/_packaging/vscjava/npm/registry/ + - name: npm_config_userconfig + value: $(Agent.TempDirectory)/.npmrc diff --git a/.azure-pipelines/npm-cfs.yml b/.azure-pipelines/npm-cfs.yml new file mode 100644 index 00000000..c7445e78 --- /dev/null +++ b/.azure-pipelines/npm-cfs.yml @@ -0,0 +1,58 @@ +# Routes npm package restore through the Central Feed Service (CFS), as required by +# SFI Network Isolation. Consumed by every build pipeline in this directory. +# +# Pipelines must also include the companion variables template: +# variables: +# - template: /.azure-pipelines/npm-cfs-variables.yml@self +# which declares the feed URL and the generated .npmrc path. The redirect itself is +# carried by the npm_config_registry environment variable that template exports; see +# its header for why the generated .npmrc alone is not enough. +# +# The .npmrc is generated at build time into the agent temp directory rather than +# being committed to the repository, so that: +# * open source contributors and the GitHub Actions workflows keep restoring from +# the public npm registry -- npm rewrites the host of every `resolved` URL in +# package-lock.json to the configured registry, so a single lockfile serves both; +# * the credential that NpmAuthenticate injects never lands inside the workspace; +# * the configuration does not depend on the repository being checked out, so +# release jobs consuming a prebuilt artifact work the same way as build jobs. +# +# The registry is still written into that file because NpmAuthenticate discovers the +# registries to authenticate by reading it. npm then takes the URL from the +# environment and the matching credential from this file. +# +# The file is written with `npm config set` rather than a shell redirect because +# these pipelines span both Linux and Windows pools. `script:` maps to CmdLine@2, +# which runs on both, and the npm invocation itself is shell agnostic. PowerShell@2 +# is avoided because it resolves `pwsh` before `powershell` and hard fails when +# neither is on PATH, which is not guaranteed on a custom Linux image. +# +# This template must run after the Node install task, and before any step that +# restores packages -- including `npx`, which resolves downloads through the +# configured registry. +# +# Consumers must reference this file as `/.azure-pipelines/npm-cfs.yml@self`. A +# relative path is resolved against the file doing the including, which for these +# pipelines is the 1ES extends template in another repository, so the unqualified +# form is looked up in 1ESPipelineTemplates and fails YAML compilation. + +steps: + - script: npm config set registry $(npm_config_registry) --location=user --userconfig="$(npm_config_userconfig)" + displayName: Configure CFS npm registry + + # Appends `//pkgs.dev.azure.com/.../registry/:_authToken=` for every + # registry it finds in the file above. `always-auth` is deliberately not written: + # it is not read by this task and is rejected outright by the npm 10 shipped with + # Node 20. + - task: NpmAuthenticate@0 + displayName: Authenticate to CFS feed + inputs: + workingFile: $(npm_config_userconfig) + + # Restore silently falling back to the public registry is the failure mode this + # whole template exists to prevent, and it leaves no trace in the build log, so it + # is asserted rather than assumed. Written in node, which the agent already + # provides, to avoid shell differences between the Linux and Windows pools. + - script: >- + node -e "const cp=require('child_process');const r=cp.execSync('npm config get registry').toString().trim();console.log('npm registry -> '+r);if(!r.startsWith('https://pkgs.dev.azure.com/')){console.error('##vso[task.logissue type=error]npm is not configured against the CFS feed');process.exit(1);}" + displayName: Verify CFS npm registry diff --git a/.azure-pipelines/rc.yml b/.azure-pipelines/rc.yml index 1f7bd599..eefd22d1 100644 --- a/.azure-pipelines/rc.yml +++ b/.azure-pipelines/rc.yml @@ -2,6 +2,7 @@ name: $(Date:yyyyMMdd).$(Rev:r) variables: - name: Codeql.Enabled value: true + - template: /.azure-pipelines/npm-cfs-variables.yml@self resources: repositories: - repository: self @@ -62,6 +63,7 @@ extends: jdkDestinationDirectory: $(Agent.ToolsDirectory)/ms-jdk21 - script: java --version displayName: 'Check Java installation' + - template: /.azure-pipelines/npm-cfs.yml@self - task: Npm@1 displayName: npm install inputs: diff --git a/.azure-pipelines/release-nightly.yml b/.azure-pipelines/release-nightly.yml index f7576f0a..a9aa67d9 100644 --- a/.azure-pipelines/release-nightly.yml +++ b/.azure-pipelines/release-nightly.yml @@ -8,6 +8,7 @@ name: $(Date:yyyyMMdd).$(Rev:r) # Use the current date and a revision number for variables: - name: Codeql.Enabled value: true + - template: /.azure-pipelines/npm-cfs-variables.yml@self resources: repositories: - repository: self @@ -46,6 +47,7 @@ extends: displayName: Use Node 20.x inputs: versionSpec: 20.x + - template: /.azure-pipelines/npm-cfs.yml@self - task: AzureCLI@2 displayName: 'Publish Extension' inputs: diff --git a/.azure-pipelines/release.yml b/.azure-pipelines/release.yml index f7576f0a..a9aa67d9 100644 --- a/.azure-pipelines/release.yml +++ b/.azure-pipelines/release.yml @@ -8,6 +8,7 @@ name: $(Date:yyyyMMdd).$(Rev:r) # Use the current date and a revision number for variables: - name: Codeql.Enabled value: true + - template: /.azure-pipelines/npm-cfs-variables.yml@self resources: repositories: - repository: self @@ -46,6 +47,7 @@ extends: displayName: Use Node 20.x inputs: versionSpec: 20.x + - template: /.azure-pipelines/npm-cfs.yml@self - task: AzureCLI@2 displayName: 'Publish Extension' inputs: From bf28ffe414acec43f4aeba177b8500536724a006 Mon Sep 17 00:00:00 2001 From: wenyt <75360946+wenytang-ms@users.noreply.github.com> Date: Wed, 29 Jul 2026 09:55:06 +0800 Subject: [PATCH 333/352] ci: run npm through script steps instead of the Npm@1 task (#1046) The Npm@1 task generates its own .npmrc and points npm at it through npm_config_userconfig, which discards the CFS credential that NpmAuthenticate@0 writes into $(Agent.TempDirectory)/.npmrc. The CFS registry still applies, because it is supplied through the npm_config_registry environment variable and an environment variable outranks every npm config file. The task therefore requests packages from the CFS feed with no token: registry = https://pkgs.dev.azure.com/mseng/VSJava/_packaging/vscjava/npm/registry/ userconfig = /mnt/vss/_work/1/npm/.npmrc npm error code E401 npm error Unable to authenticate, your authentication token seems to be invalid. A plain script step inherits both values from the job environment, so the credential survives. Steps that do not restore packages are converted as well, so that a single mechanism applies throughout and no step is left pointing at the CFS feed unauthenticated. Display names, working directories, and the enabled and verbose flags are preserved. --- .azure-pipelines/ci.yml | 10 ++-------- .azure-pipelines/nightly.yml | 4 +--- .azure-pipelines/rc.yml | 4 +--- 3 files changed, 4 insertions(+), 14 deletions(-) diff --git a/.azure-pipelines/ci.yml b/.azure-pipelines/ci.yml index ba0d707d..15fbc937 100644 --- a/.azure-pipelines/ci.yml +++ b/.azure-pipelines/ci.yml @@ -55,16 +55,10 @@ extends: inputs: versionSpec: 20.x - template: /.azure-pipelines/npm-cfs.yml@self - - task: Npm@1 + - script: npm install --verbose displayName: npm install - inputs: - verbose: true - - task: Npm@1 + - script: npm run build-server displayName: npm run build-server - inputs: - command: custom - verbose: false - customCommand: run build-server - task: Bash@3 displayName: vsce package inputs: diff --git a/.azure-pipelines/nightly.yml b/.azure-pipelines/nightly.yml index 6b8ce9f2..d7e8461f 100644 --- a/.azure-pipelines/nightly.yml +++ b/.azure-pipelines/nightly.yml @@ -69,10 +69,8 @@ extends: - script: java --version displayName: 'Check Java installation' - template: /.azure-pipelines/npm-cfs.yml@self - - task: Npm@1 + - script: npm install displayName: npm install - inputs: - verbose: false - task: CmdLine@2 displayName: npx gulp build_server inputs: diff --git a/.azure-pipelines/rc.yml b/.azure-pipelines/rc.yml index eefd22d1..00e1bb62 100644 --- a/.azure-pipelines/rc.yml +++ b/.azure-pipelines/rc.yml @@ -64,10 +64,8 @@ extends: - script: java --version displayName: 'Check Java installation' - template: /.azure-pipelines/npm-cfs.yml@self - - task: Npm@1 + - script: npm install displayName: npm install - inputs: - verbose: false - task: CmdLine@2 displayName: npx gulp build_server inputs: From 95a08726c548f6c4410856a26f89d44acb0d5b21 Mon Sep 17 00:00:00 2001 From: wenyt <75360946+wenytang-ms@users.noreply.github.com> Date: Wed, 29 Jul 2026 15:08:34 +0800 Subject: [PATCH 334/352] build: drop the unreachable snapshot repository and pin p2 to its origin (#1047) The oss.sonatype.org entry declares a snapshots repository, but every artifact resolved against it carries a release version, so a request to it can only ever 404. The last nightly build (31823304) issued 42 such requests and completed none of them: Downloading from oss.sonatype.org: 42 Downloaded from oss.sonatype.org: 0 Maven fell back to Central for all of them, so removing the entry does not change which artifacts are resolved. It does remove an external host from the build and saves 42 failed round trips. download.eclipse.org answers p2 requests with a redirect to a mirror chosen per request from a pool of third party hosts. Because the target definition references /eclipse/updates/4.35/ and /releases/2024-12/, which are mirrored, that same build read most of its bundles from five hosts none of the repository declares: eclipse.mirror.rafal.ca, ca.mirrors.cicku.me, mirror.aarnet.edu.au, ftp2.osuosl.org, mirror.cs.odu.edu The selection is made per request, so the host set differs between runs and cannot be enumerated ahead of time. eclipse.p2.mirrors=false makes p2 read from the URL in the target definition instead, so the set of addresses the build contacts is the set it declares. Both changes narrow the addresses the pipeline reaches without changing the artifacts it produces. This is groundwork for routing the remaining Maven Central traffic through the Central Feed Service: an allow list or an exception request can only be written against a host set that is known in advance. --- jdtls.ext/pom.xml | 9 --------- scripts/buildJdtlsExt.js | 5 ++++- 2 files changed, 4 insertions(+), 10 deletions(-) diff --git a/jdtls.ext/pom.xml b/jdtls.ext/pom.xml index d76a1b74..6c9688b6 100644 --- a/jdtls.ext/pom.xml +++ b/jdtls.ext/pom.xml @@ -131,13 +131,4 @@ - - - oss.sonatype.org - https://oss.sonatype.org/content/repositories/snapshots/ - - true - - - diff --git a/scripts/buildJdtlsExt.js b/scripts/buildJdtlsExt.js index 0785d8c4..f3356211 100644 --- a/scripts/buildJdtlsExt.js +++ b/scripts/buildJdtlsExt.js @@ -18,7 +18,10 @@ const jvmOptions = [ const env = { ...process.env }; env.MAVEN_OPTS = env.MAVEN_OPTS ? env.MAVEN_OPTS + ' ' + jvmOptions : jvmOptions; -const mvnCommand = `${mvnw()} clean package`; +// `eclipse.p2.mirrors=false` stops p2 from following download.eclipse.org's mirror +// redirect, which hands out a different third party host per request and makes the +// set of addresses the build contacts impossible to express as an allow list. +const mvnCommand = `${mvnw()} clean package -Declipse.p2.mirrors=false`; cp.execSync(mvnCommand, {cwd:server_dir, stdio:[0,1,2], env: env} ); copy(path.join(server_dir, 'com.microsoft.jdtls.ext.core/target'), path.resolve('server'), (file) => { return /^com.microsoft.jdtls.ext.core.*.jar$/.test(file); From ac25d65d1d8aba378a1399745b70f1a680be983c Mon Sep 17 00:00:00 2001 From: wenyt <75360946+wenytang-ms@users.noreply.github.com> Date: Mon, 3 Aug 2026 11:19:59 +0800 Subject: [PATCH 335/352] fix(ci): upgrade @vscode/test-electron to fix macOS test failures (#1049) The macOS job fails on every run while Linux and Windows pass, dying immediately after the VS Code download with: Test error: Error: spawn .../Visual Studio Code.app/Contents/MacOS/Electron ENOENT Error: Test run failed with code -2 VS Code 1.110 renamed the macOS main binary inside the app bundle from `Electron` to the product name (`Code`), keeping a compatibility symlink under the old name. That symlink was removed in microsoft/vscode#326502, so every 1.110+ archive now fails to launch. The test runner does not pin a VS Code version, so it resolves the latest release (1.131.0) and hits this. Only macOS goes through that code path, which is why the other platforms pass. `@vscode/test-electron` ^2.5.2 hardcodes the old path, so the breakage surfaced as soon as the symlink went away. 3.1.0 resolves the executable via `CFBundleExecutable` from `Info.plist`, with a fallback to the sole regular file in `Contents/MacOS/` and finally the legacy `Electron` name, so both the new and pre-1.110 layouts work. 3.x declares `engines.node >= 22` while CI runs Node 20, but this is a non-blocking `npm warn EBADENGINE`: the install succeeds, the package loads, and it uses no Node 22 only APIs. A Node bump is therefore left out to keep this change minimal. Copilot-Session: 0b39911b-23b6-4180-ae96-2b6c06d2265b --- package-lock.json | 16 ++++++++-------- package.json | 2 +- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/package-lock.json b/package-lock.json index fdf7d222..a087b369 100644 --- a/package-lock.json +++ b/package-lock.json @@ -30,7 +30,7 @@ "@types/node": "20.x", "@types/semver": "^7.3.13", "@types/vscode": "1.95.0", - "@vscode/test-electron": "^2.5.2", + "@vscode/test-electron": "^3.1.0", "copy-webpack-plugin": "^11.0.0", "glob": "^7.2.3", "mocha": "^11.7.5", @@ -752,9 +752,9 @@ } }, "node_modules/@vscode/test-electron": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/@vscode/test-electron/-/test-electron-2.5.2.tgz", - "integrity": "sha512-8ukpxv4wYe0iWMRQU18jhzJOHkeGKbnw7xWRX3Zw1WJA4cEKbHcmmLPdPrPtL6rhDcrlCZN+xKRpv09n4gRHYg==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@vscode/test-electron/-/test-electron-3.1.0.tgz", + "integrity": "sha512-CRqv5u+YYoseuNVJ6Tyo4k0sF0mx4qnKMihRB0PjsUF8Dc0WKtCXo6CNL6nWWm5esfFQsQA/pejMj4ZbpJVLTw==", "dev": true, "license": "MIT", "dependencies": { @@ -765,7 +765,7 @@ "semver": "^7.6.2" }, "engines": { - "node": ">=16" + "node": ">=22" } }, "node_modules/@webassemblyjs/ast": { @@ -4726,9 +4726,9 @@ } }, "@vscode/test-electron": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/@vscode/test-electron/-/test-electron-2.5.2.tgz", - "integrity": "sha512-8ukpxv4wYe0iWMRQU18jhzJOHkeGKbnw7xWRX3Zw1WJA4cEKbHcmmLPdPrPtL6rhDcrlCZN+xKRpv09n4gRHYg==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@vscode/test-electron/-/test-electron-3.1.0.tgz", + "integrity": "sha512-CRqv5u+YYoseuNVJ6Tyo4k0sF0mx4qnKMihRB0PjsUF8Dc0WKtCXo6CNL6nWWm5esfFQsQA/pejMj4ZbpJVLTw==", "dev": true, "requires": { "http-proxy-agent": "^7.0.2", diff --git a/package.json b/package.json index 312eb543..4cc58328 100644 --- a/package.json +++ b/package.json @@ -1204,7 +1204,7 @@ "@types/node": "20.x", "@types/semver": "^7.3.13", "@types/vscode": "1.95.0", - "@vscode/test-electron": "^2.5.2", + "@vscode/test-electron": "^3.1.0", "copy-webpack-plugin": "^11.0.0", "glob": "^7.2.3", "mocha": "^11.7.5", From 23e647e24c9464a1e622985fa6b1b9988e7d7802 Mon Sep 17 00:00:00 2001 From: wenyt <75360946+wenytang-ms@users.noreply.github.com> Date: Mon, 3 Aug 2026 13:20:22 +0800 Subject: [PATCH 336/352] build: route CI Maven restore through the CFS feed (SR21 network isolation) (#1048) * build: resolve maven artifacts through the CFS feed SFI Network Isolation requires builds to stop reaching public package hosts, and Maven is the last source of egress from these pipelines now that npm has moved. Two independent paths reach repo.maven.apache.org: artifact resolution, and the wrapper's download of the Maven distribution -- which happens before Maven exists, so no settings file can influence it. Both are closed with configuration Maven and its wrapper already understand, declared as pipeline variables so they reach every step in the job. That last part matters: these builds never name Maven on a command line, they start it from an npm script, so there is nowhere to add a flag. MAVEN_ARGS points Maven at a committed settings.xml carrying the mirror and its credential. The mirror is scoped to `central` rather than `external:*` because Tycho resolves p2 repositories through the same configuration and the feed cannot serve p2. MVNW_REPOURL substitutes the host in distributionUrl, which is why the wrapper properties still name the public host and need no edit at all. MVNW_REPOURL requires the Apache wrapper -- the Takari one bundled here reads the URL only from the properties file and honours no override -- so it is replaced by the script-only distribution of Apache maven-wrapper 3.3.3, which also removes maven-wrapper.jar from the tree. 3.3.3 and not 3.3.2 because the latter selects the mvnd path pattern for non-mvnd builds on Windows and produces a malformed URL. This replaces an earlier attempt that had a pipeline step rewrite the user settings.xml and the tracked wrapper properties. It needed to locate the JVM's user.home, edit XML that another task had just written, and leave the checkout dirty. None of that is necessary. Nothing here changes a local build: MAVEN_ARGS and MVNW_* are set only on the agents, so ./mvnw keeps using the developer's own settings and the public central. If either variable were missing, the build fails against an unusable repository rather than quietly falling back to the public host. Copilot-Session: ac225268-483d-4498-a08f-fe79a87d4d2e * build: supply the CFS credential to the CI Maven step ci.yml pulls in maven-cfs-variables.yml but never maps System.AccessToken onto `npm run build-server`, which is the step that runs ./mvnw through scripts/buildJdtlsExt.js. nightly.yml and rc.yml already do this. Without it the two halves of the redirect come apart. MVNW_REPOURL is not secret, so it is exported and the wrapper rewrites distributionUrl to the feed; MVNW_PASSWORD is absent, so the wrapper clears the credential pair and fetches anonymously, and CFS answers 401. Maven never starts. Had it started, ${env.SYSTEM_ACCESSTOKEN} in cfs-settings.xml would be unresolvable and every artifact would 401 in turn. The failure is closed rather than silent -- nothing falls back to the public central -- but it takes CI down on every commit to main. Copilot-Session: 43342f3b-f3d1-495c-88c4-397a6a56c01b * build: pin the Maven wrapper to 3.9.12 vscode-maven and vscode-spring-boot-dashboard already pin 3.9.12. Moving the last two repos onto it makes the version uniform across the four, so the CFS wiring behaves identically everywhere and there is one fewer variable to hold in mind the next time it is touched. 3.9.12 is served by the vscjava feed, and the wrapper reaches it through MVNW_REPOURL exactly as 3.9.3 did. Verified locally against the feed: both repos build clean with 0 requests to any public Maven host. Copilot-Session: ac225268-483d-4498-a08f-fe79a87d4d2e --------- Copilot-Session: ac225268-483d-4498-a08f-fe79a87d4d2e Copilot-Session: 43342f3b-f3d1-495c-88c4-397a6a56c01b --- .azure-pipelines/cfs-settings.xml | 40 ++ .azure-pipelines/ci.yml | 8 + .azure-pipelines/maven-cfs-variables.yml | 47 +++ .azure-pipelines/nightly.yml | 8 + .azure-pipelines/rc.yml | 8 + jdtls.ext/.mvn/wrapper/maven-wrapper.jar | Bin 47774 -> 0 bytes .../.mvn/wrapper/maven-wrapper.properties | 2 +- jdtls.ext/mvnw | 394 ++++++++++-------- jdtls.ext/mvnw.cmd | 284 +++++++------ 9 files changed, 508 insertions(+), 283 deletions(-) create mode 100644 .azure-pipelines/cfs-settings.xml create mode 100644 .azure-pipelines/maven-cfs-variables.yml delete mode 100644 jdtls.ext/.mvn/wrapper/maven-wrapper.jar diff --git a/.azure-pipelines/cfs-settings.xml b/.azure-pipelines/cfs-settings.xml new file mode 100644 index 00000000..e5dc4e42 --- /dev/null +++ b/.azure-pipelines/cfs-settings.xml @@ -0,0 +1,40 @@ + + + + + + vscjava + Central Feed Service + ${env.CFS_MAVEN_URL} + central + + + + + vscjava + AzureDevOps + ${env.SYSTEM_ACCESSTOKEN} + + + diff --git a/.azure-pipelines/ci.yml b/.azure-pipelines/ci.yml index 15fbc937..cc0b039c 100644 --- a/.azure-pipelines/ci.yml +++ b/.azure-pipelines/ci.yml @@ -3,6 +3,7 @@ variables: - name: Codeql.Enabled value: true - template: /.azure-pipelines/npm-cfs-variables.yml@self + - template: /.azure-pipelines/maven-cfs-variables.yml@self resources: repositories: - repository: self @@ -59,6 +60,13 @@ extends: displayName: npm install - script: npm run build-server displayName: npm run build-server + # System.AccessToken is a secret, and Azure Pipelines does not export secret + # variables to the environment -- not even through a variable that merely + # references one. It is mapped here, on the step that actually runs Maven, + # rather than in maven-cfs-variables.yml alongside the rest of the wiring. + env: + SYSTEM_ACCESSTOKEN: $(System.AccessToken) + MVNW_PASSWORD: $(System.AccessToken) - task: Bash@3 displayName: vsce package inputs: diff --git a/.azure-pipelines/maven-cfs-variables.yml b/.azure-pipelines/maven-cfs-variables.yml new file mode 100644 index 00000000..11ab65de --- /dev/null +++ b/.azure-pipelines/maven-cfs-variables.yml @@ -0,0 +1,47 @@ +# Variables that route Maven through the Central Feed Service (CFS), as required by +# SFI Network Isolation. Consumed by every pipeline in this directory that builds the +# Java side of the extension: +# +# variables: +# - template: /.azure-pipelines/maven-cfs-variables.yml@self +# +# There is deliberately no companion steps template. Everything the redirect needs is +# already understood by Maven and its wrapper as environment variables, so no task has +# to rewrite a settings file and nothing in the checked-out tree is modified. Pipeline +# variables are exported to every step in the job, which is what makes this work for +# the Maven runs these builds start indirectly -- from an npm script or a gulp task -- +# and never name on a command line of their own. +# +# The one thing that cannot live here is the credential. System.AccessToken is a +# secret, and secret variables are not exported to the environment, not even through +# a variable that merely references one. It is therefore mapped with `env:` on the +# steps that run Maven; grep for MVNW_PASSWORD to find them. That also keeps the token +# out of the environment of every unrelated task in the job. +# +# Two independent egress paths have to be closed, and only the first is obvious. +variables: + # The feed's maven/v1 endpoint, read by cfs-settings.xml and by the wrapper below. + # Committing it matches npm-cfs-variables.yml: a feed address is not a secret, and + # the token that makes it usable never leaves the agent. + - name: CFS_MAVEN_URL + value: https://pkgs.dev.azure.com/mseng/VSJava/_packaging/vscjava/maven/v1 + + # Path one: artifact resolution. The `mvn` launcher prepends MAVEN_ARGS to every + # invocation, so build scripts keep calling `mvnw` with no extra flags of their own. + # Supported by Maven 3.9 and newer, which is what the wrapper here pins. + - name: MAVEN_ARGS + value: -s $(Build.SourcesDirectory)/.azure-pipelines/cfs-settings.xml + + # Path two: the Maven distribution itself. The wrapper downloads it from + # distributionUrl before Maven exists, so settings.xml cannot influence that request. + # MVNW_REPOURL substitutes everything ahead of /org/apache/maven/ in that URL, which + # is why .mvn/wrapper/maven-wrapper.properties still names the public host and needs + # no edit: contributors keep a wrapper that works, agents resolve it from the feed. + # + # The wrapper ignores both of these unless MVNW_PASSWORD is also set, which happens + # on the Maven steps; with no credential it would fall back to an unauthenticated + # fetch and fail on 401 rather than reach a public host. + - name: MVNW_REPOURL + value: $(CFS_MAVEN_URL) + - name: MVNW_USERNAME + value: AzureDevOps diff --git a/.azure-pipelines/nightly.yml b/.azure-pipelines/nightly.yml index d7e8461f..a1ee16a2 100644 --- a/.azure-pipelines/nightly.yml +++ b/.azure-pipelines/nightly.yml @@ -3,6 +3,7 @@ variables: - name: Codeql.Enabled value: true - template: /.azure-pipelines/npm-cfs-variables.yml@self + - template: /.azure-pipelines/maven-cfs-variables.yml@self schedules: - cron: 0 0 * * * branches: @@ -73,6 +74,13 @@ extends: displayName: npm install - task: CmdLine@2 displayName: npx gulp build_server + # System.AccessToken is a secret, and Azure Pipelines does not export secret + # variables to the environment -- not even through a variable that merely + # references one. It is mapped here, on the step that actually runs Maven, + # rather than in maven-cfs-variables.yml alongside the rest of the wiring. + env: + SYSTEM_ACCESSTOKEN: $(System.AccessToken) + MVNW_PASSWORD: $(System.AccessToken) inputs: targetType: inline script: |- diff --git a/.azure-pipelines/rc.yml b/.azure-pipelines/rc.yml index 00e1bb62..59286c81 100644 --- a/.azure-pipelines/rc.yml +++ b/.azure-pipelines/rc.yml @@ -3,6 +3,7 @@ variables: - name: Codeql.Enabled value: true - template: /.azure-pipelines/npm-cfs-variables.yml@self + - template: /.azure-pipelines/maven-cfs-variables.yml@self resources: repositories: - repository: self @@ -68,6 +69,13 @@ extends: displayName: npm install - task: CmdLine@2 displayName: npx gulp build_server + # System.AccessToken is a secret, and Azure Pipelines does not export secret + # variables to the environment -- not even through a variable that merely + # references one. It is mapped here, on the step that actually runs Maven, + # rather than in maven-cfs-variables.yml alongside the rest of the wiring. + env: + SYSTEM_ACCESSTOKEN: $(System.AccessToken) + MVNW_PASSWORD: $(System.AccessToken) inputs: targetType: inline script: |- diff --git a/jdtls.ext/.mvn/wrapper/maven-wrapper.jar b/jdtls.ext/.mvn/wrapper/maven-wrapper.jar deleted file mode 100644 index 41c70a7e0b7da7ecbbcf53b62aacdf8bc81e10b0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 47774 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 Be7*nx diff --git a/jdtls.ext/.mvn/wrapper/maven-wrapper.properties b/jdtls.ext/.mvn/wrapper/maven-wrapper.properties index 9e0264d0..2b8cd3d6 100644 --- a/jdtls.ext/.mvn/wrapper/maven-wrapper.properties +++ b/jdtls.ext/.mvn/wrapper/maven-wrapper.properties @@ -1 +1 @@ -distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.9.3/apache-maven-3.9.3-bin.zip \ No newline at end of file +distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.9.12/apache-maven-3.9.12-bin.zip diff --git a/jdtls.ext/mvnw b/jdtls.ext/mvnw index e96ccd5f..e9cf8d33 100755 --- a/jdtls.ext/mvnw +++ b/jdtls.ext/mvnw @@ -19,209 +19,277 @@ # ---------------------------------------------------------------------------- # ---------------------------------------------------------------------------- -# Maven2 Start Up Batch script -# -# Required ENV vars: -# ------------------ -# JAVA_HOME - location of a JDK home dir +# Apache Maven Wrapper startup batch script, version 3.3.3 # # Optional ENV vars # ----------------- -# M2_HOME - location of maven2's installed home dir -# MAVEN_OPTS - parameters passed to the Java VM when running Maven -# e.g. to debug Maven itself, use -# set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 -# MAVEN_SKIP_RC - flag to disable loading of mavenrc files +# JAVA_HOME - location of a JDK home dir, required when download maven via java source +# MVNW_REPOURL - repo url base for downloading maven distribution +# MVNW_USERNAME/MVNW_PASSWORD - user and password for downloading maven +# MVNW_VERBOSE - true: enable verbose log; debug: trace the mvnw script; others: silence the output # ---------------------------------------------------------------------------- -if [ -z "$MAVEN_SKIP_RC" ] ; then - - if [ -f /etc/mavenrc ] ; then - . /etc/mavenrc - fi +set -euf +[ "${MVNW_VERBOSE-}" != debug ] || set -x - if [ -f "$HOME/.mavenrc" ] ; then - . "$HOME/.mavenrc" - fi +# OS specific support. +native_path() { printf %s\\n "$1"; } +case "$(uname)" in +CYGWIN* | MINGW*) + [ -z "${JAVA_HOME-}" ] || JAVA_HOME="$(cygpath --unix "$JAVA_HOME")" + native_path() { cygpath --path --windows "$1"; } + ;; +esac -fi +# set JAVACMD and JAVACCMD +set_java_home() { + # For Cygwin and MinGW, ensure paths are in Unix format before anything is touched + if [ -n "${JAVA_HOME-}" ]; then + if [ -x "$JAVA_HOME/jre/sh/java" ]; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + JAVACCMD="$JAVA_HOME/jre/sh/javac" + else + JAVACMD="$JAVA_HOME/bin/java" + JAVACCMD="$JAVA_HOME/bin/javac" -# OS specific support. $var _must_ be set to either true or false. -cygwin=false; -darwin=false; -mingw=false -case "`uname`" in - CYGWIN*) cygwin=true ;; - MINGW*) mingw=true;; - Darwin*) darwin=true - # Use /usr/libexec/java_home if available, otherwise fall back to /Library/Java/Home - # See https://developer.apple.com/library/mac/qa/qa1170/_index.html - if [ -z "$JAVA_HOME" ]; then - if [ -x "/usr/libexec/java_home" ]; then - export JAVA_HOME="`/usr/libexec/java_home`" - else - export JAVA_HOME="/Library/Java/Home" + if [ ! -x "$JAVACMD" ] || [ ! -x "$JAVACCMD" ]; then + echo "The JAVA_HOME environment variable is not defined correctly, so mvnw cannot run." >&2 + echo "JAVA_HOME is set to \"$JAVA_HOME\", but \"\$JAVA_HOME/bin/java\" or \"\$JAVA_HOME/bin/javac\" does not exist." >&2 + return 1 fi fi - ;; -esac + else + JAVACMD="$( + 'set' +e + 'unset' -f command 2>/dev/null + 'command' -v java + )" || : + JAVACCMD="$( + 'set' +e + 'unset' -f command 2>/dev/null + 'command' -v javac + )" || : -if [ -z "$JAVA_HOME" ] ; then - if [ -r /etc/gentoo-release ] ; then - JAVA_HOME=`java-config --jre-home` + if [ ! -x "${JAVACMD-}" ] || [ ! -x "${JAVACCMD-}" ]; then + echo "The java/javac command does not exist in PATH nor is JAVA_HOME set, so mvnw cannot run." >&2 + return 1 + fi fi -fi - -if [ -z "$M2_HOME" ] ; then - ## resolve links - $0 may be a link to maven's home - PRG="$0" +} - # need this for relative symlinks - while [ -h "$PRG" ] ; do - ls=`ls -ld "$PRG"` - link=`expr "$ls" : '.*-> \(.*\)$'` - if expr "$link" : '/.*' > /dev/null; then - PRG="$link" - else - PRG="`dirname "$PRG"`/$link" - fi +# hash string like Java String::hashCode +hash_string() { + str="${1:-}" h=0 + while [ -n "$str" ]; do + char="${str%"${str#?}"}" + h=$(((h * 31 + $(LC_CTYPE=C printf %d "'$char")) % 4294967296)) + str="${str#?}" done + printf %x\\n $h +} + +verbose() { :; } +[ "${MVNW_VERBOSE-}" != true ] || verbose() { printf %s\\n "${1-}"; } - saveddir=`pwd` +die() { + printf %s\\n "$1" >&2 + exit 1 +} + +trim() { + # MWRAPPER-139: + # Trims trailing and leading whitespace, carriage returns, tabs, and linefeeds. + # Needed for removing poorly interpreted newline sequences when running in more + # exotic environments such as mingw bash on Windows. + printf "%s" "${1}" | tr -d '[:space:]' +} + +scriptDir="$(dirname "$0")" +scriptName="$(basename "$0")" + +# parse distributionUrl and optional distributionSha256Sum, requires .mvn/wrapper/maven-wrapper.properties +while IFS="=" read -r key value; do + case "${key-}" in + distributionUrl) distributionUrl=$(trim "${value-}") ;; + distributionSha256Sum) distributionSha256Sum=$(trim "${value-}") ;; + esac +done <"$scriptDir/.mvn/wrapper/maven-wrapper.properties" +[ -n "${distributionUrl-}" ] || die "cannot read distributionUrl property in $scriptDir/.mvn/wrapper/maven-wrapper.properties" + +case "${distributionUrl##*/}" in +maven-mvnd-*bin.*) + MVN_CMD=mvnd.sh _MVNW_REPO_PATTERN=/maven/mvnd/ + case "${PROCESSOR_ARCHITECTURE-}${PROCESSOR_ARCHITEW6432-}:$(uname -a)" in + *AMD64:CYGWIN* | *AMD64:MINGW*) distributionPlatform=windows-amd64 ;; + :Darwin*x86_64) distributionPlatform=darwin-amd64 ;; + :Darwin*arm64) distributionPlatform=darwin-aarch64 ;; + :Linux*x86_64*) distributionPlatform=linux-amd64 ;; + *) + echo "Cannot detect native platform for mvnd on $(uname)-$(uname -m), use pure java version" >&2 + distributionPlatform=linux-amd64 + ;; + esac + distributionUrl="${distributionUrl%-bin.*}-$distributionPlatform.zip" + ;; +maven-mvnd-*) MVN_CMD=mvnd.sh _MVNW_REPO_PATTERN=/maven/mvnd/ ;; +*) MVN_CMD="mvn${scriptName#mvnw}" _MVNW_REPO_PATTERN=/org/apache/maven/ ;; +esac - M2_HOME=`dirname "$PRG"`/.. +# apply MVNW_REPOURL and calculate MAVEN_HOME +# maven home pattern: ~/.m2/wrapper/dists/{apache-maven-,maven-mvnd--}/ +[ -z "${MVNW_REPOURL-}" ] || distributionUrl="$MVNW_REPOURL$_MVNW_REPO_PATTERN${distributionUrl#*"$_MVNW_REPO_PATTERN"}" +distributionUrlName="${distributionUrl##*/}" +distributionUrlNameMain="${distributionUrlName%.*}" +distributionUrlNameMain="${distributionUrlNameMain%-bin}" +MAVEN_USER_HOME="${MAVEN_USER_HOME:-${HOME}/.m2}" +MAVEN_HOME="${MAVEN_USER_HOME}/wrapper/dists/${distributionUrlNameMain-}/$(hash_string "$distributionUrl")" - # make it fully qualified - M2_HOME=`cd "$M2_HOME" && pwd` +exec_maven() { + unset MVNW_VERBOSE MVNW_USERNAME MVNW_PASSWORD MVNW_REPOURL || : + exec "$MAVEN_HOME/bin/$MVN_CMD" "$@" || die "cannot exec $MAVEN_HOME/bin/$MVN_CMD" +} - cd "$saveddir" - # echo Using m2 at $M2_HOME +if [ -d "$MAVEN_HOME" ]; then + verbose "found existing MAVEN_HOME at $MAVEN_HOME" + exec_maven "$@" fi -# For Cygwin, ensure paths are in UNIX format before anything is touched -if $cygwin ; then - [ -n "$M2_HOME" ] && - M2_HOME=`cygpath --unix "$M2_HOME"` - [ -n "$JAVA_HOME" ] && - JAVA_HOME=`cygpath --unix "$JAVA_HOME"` - [ -n "$CLASSPATH" ] && - CLASSPATH=`cygpath --path --unix "$CLASSPATH"` +case "${distributionUrl-}" in +*?-bin.zip | *?maven-mvnd-?*-?*.zip) ;; +*) die "distributionUrl is not valid, must match *-bin.zip or maven-mvnd-*.zip, but found '${distributionUrl-}'" ;; +esac + +# prepare tmp dir +if TMP_DOWNLOAD_DIR="$(mktemp -d)" && [ -d "$TMP_DOWNLOAD_DIR" ]; then + clean() { rm -rf -- "$TMP_DOWNLOAD_DIR"; } + trap clean HUP INT TERM EXIT +else + die "cannot create temp dir" fi -# For Mingw, ensure paths are in UNIX format before anything is touched -if $mingw ; then - [ -n "$M2_HOME" ] && - M2_HOME="`(cd "$M2_HOME"; pwd)`" - [ -n "$JAVA_HOME" ] && - JAVA_HOME="`(cd "$JAVA_HOME"; pwd)`" - # TODO classpath? +mkdir -p -- "${MAVEN_HOME%/*}" + +# Download and Install Apache Maven +verbose "Couldn't find MAVEN_HOME, downloading and installing it ..." +verbose "Downloading from: $distributionUrl" +verbose "Downloading to: $TMP_DOWNLOAD_DIR/$distributionUrlName" + +# select .zip or .tar.gz +if ! command -v unzip >/dev/null; then + distributionUrl="${distributionUrl%.zip}.tar.gz" + distributionUrlName="${distributionUrl##*/}" fi -if [ -z "$JAVA_HOME" ]; then - javaExecutable="`which javac`" - if [ -n "$javaExecutable" ] && ! [ "`expr \"$javaExecutable\" : '\([^ ]*\)'`" = "no" ]; then - # readlink(1) is not available as standard on Solaris 10. - readLink=`which readlink` - if [ ! `expr "$readLink" : '\([^ ]*\)'` = "no" ]; then - if $darwin ; then - javaHome="`dirname \"$javaExecutable\"`" - javaExecutable="`cd \"$javaHome\" && pwd -P`/javac" - else - javaExecutable="`readlink -f \"$javaExecutable\"`" - fi - javaHome="`dirname \"$javaExecutable\"`" - javaHome=`expr "$javaHome" : '\(.*\)/bin'` - JAVA_HOME="$javaHome" - export JAVA_HOME - fi - fi +# verbose opt +__MVNW_QUIET_WGET=--quiet __MVNW_QUIET_CURL=--silent __MVNW_QUIET_UNZIP=-q __MVNW_QUIET_TAR='' +[ "${MVNW_VERBOSE-}" != true ] || __MVNW_QUIET_WGET='' __MVNW_QUIET_CURL='' __MVNW_QUIET_UNZIP='' __MVNW_QUIET_TAR=v + +# normalize http auth +case "${MVNW_PASSWORD:+has-password}" in +'') MVNW_USERNAME='' MVNW_PASSWORD='' ;; +has-password) [ -n "${MVNW_USERNAME-}" ] || MVNW_USERNAME='' MVNW_PASSWORD='' ;; +esac + +if [ -z "${MVNW_USERNAME-}" ] && command -v wget >/dev/null; then + verbose "Found wget ... using wget" + wget ${__MVNW_QUIET_WGET:+"$__MVNW_QUIET_WGET"} "$distributionUrl" -O "$TMP_DOWNLOAD_DIR/$distributionUrlName" || die "wget: Failed to fetch $distributionUrl" +elif [ -z "${MVNW_USERNAME-}" ] && command -v curl >/dev/null; then + verbose "Found curl ... using curl" + curl ${__MVNW_QUIET_CURL:+"$__MVNW_QUIET_CURL"} -f -L -o "$TMP_DOWNLOAD_DIR/$distributionUrlName" "$distributionUrl" || die "curl: Failed to fetch $distributionUrl" +elif set_java_home; then + verbose "Falling back to use Java to download" + javaSource="$TMP_DOWNLOAD_DIR/Downloader.java" + targetZip="$TMP_DOWNLOAD_DIR/$distributionUrlName" + cat >"$javaSource" <<-END + public class Downloader extends java.net.Authenticator + { + protected java.net.PasswordAuthentication getPasswordAuthentication() + { + return new java.net.PasswordAuthentication( System.getenv( "MVNW_USERNAME" ), System.getenv( "MVNW_PASSWORD" ).toCharArray() ); + } + public static void main( String[] args ) throws Exception + { + setDefault( new Downloader() ); + java.nio.file.Files.copy( java.net.URI.create( args[0] ).toURL().openStream(), java.nio.file.Paths.get( args[1] ).toAbsolutePath().normalize() ); + } + } + END + # For Cygwin/MinGW, switch paths to Windows format before running javac and java + verbose " - Compiling Downloader.java ..." + "$(native_path "$JAVACCMD")" "$(native_path "$javaSource")" || die "Failed to compile Downloader.java" + verbose " - Running Downloader.java ..." + "$(native_path "$JAVACMD")" -cp "$(native_path "$TMP_DOWNLOAD_DIR")" Downloader "$distributionUrl" "$(native_path "$targetZip")" fi -if [ -z "$JAVACMD" ] ; then - if [ -n "$JAVA_HOME" ] ; then - if [ -x "$JAVA_HOME/jre/sh/java" ] ; then - # IBM's JDK on AIX uses strange locations for the executables - JAVACMD="$JAVA_HOME/jre/sh/java" - else - JAVACMD="$JAVA_HOME/bin/java" +# If specified, validate the SHA-256 sum of the Maven distribution zip file +if [ -n "${distributionSha256Sum-}" ]; then + distributionSha256Result=false + if [ "$MVN_CMD" = mvnd.sh ]; then + echo "Checksum validation is not supported for maven-mvnd." >&2 + echo "Please disable validation by removing 'distributionSha256Sum' from your maven-wrapper.properties." >&2 + exit 1 + elif command -v sha256sum >/dev/null; then + if echo "$distributionSha256Sum $TMP_DOWNLOAD_DIR/$distributionUrlName" | sha256sum -c - >/dev/null 2>&1; then + distributionSha256Result=true + fi + elif command -v shasum >/dev/null; then + if echo "$distributionSha256Sum $TMP_DOWNLOAD_DIR/$distributionUrlName" | shasum -a 256 -c >/dev/null 2>&1; then + distributionSha256Result=true fi else - JAVACMD="`which java`" + echo "Checksum validation was requested but neither 'sha256sum' or 'shasum' are available." >&2 + echo "Please install either command, or disable validation by removing 'distributionSha256Sum' from your maven-wrapper.properties." >&2 + exit 1 + fi + if [ $distributionSha256Result = false ]; then + echo "Error: Failed to validate Maven distribution SHA-256, your Maven distribution might be compromised." >&2 + echo "If you updated your Maven version, you need to update the specified distributionSha256Sum property." >&2 + exit 1 fi fi -if [ ! -x "$JAVACMD" ] ; then - echo "Error: JAVA_HOME is not defined correctly." >&2 - echo " We cannot execute $JAVACMD" >&2 - exit 1 -fi - -if [ -z "$JAVA_HOME" ] ; then - echo "Warning: JAVA_HOME environment variable is not set." +# unzip and move +if command -v unzip >/dev/null; then + unzip ${__MVNW_QUIET_UNZIP:+"$__MVNW_QUIET_UNZIP"} "$TMP_DOWNLOAD_DIR/$distributionUrlName" -d "$TMP_DOWNLOAD_DIR" || die "failed to unzip" +else + tar xzf${__MVNW_QUIET_TAR:+"$__MVNW_QUIET_TAR"} "$TMP_DOWNLOAD_DIR/$distributionUrlName" -C "$TMP_DOWNLOAD_DIR" || die "failed to untar" fi -CLASSWORLDS_LAUNCHER=org.codehaus.plexus.classworlds.launcher.Launcher - -# traverses directory structure from process work directory to filesystem root -# first directory with .mvn subdirectory is considered project base directory -find_maven_basedir() { +# Find the actual extracted directory name (handles snapshots where filename != directory name) +actualDistributionDir="" - if [ -z "$1" ] - then - echo "Path not specified to find_maven_basedir" - return 1 +# First try the expected directory name (for regular distributions) +if [ -d "$TMP_DOWNLOAD_DIR/$distributionUrlNameMain" ]; then + if [ -f "$TMP_DOWNLOAD_DIR/$distributionUrlNameMain/bin/$MVN_CMD" ]; then + actualDistributionDir="$distributionUrlNameMain" fi +fi - basedir="$1" - wdir="$1" - while [ "$wdir" != '/' ] ; do - if [ -d "$wdir"/.mvn ] ; then - basedir=$wdir - break - fi - # workaround for JBEAP-8937 (on Solaris 10/Sparc) - if [ -d "${wdir}" ]; then - wdir=`cd "$wdir/.."; pwd` +# If not found, search for any directory with the Maven executable (for snapshots) +if [ -z "$actualDistributionDir" ]; then + # enable globbing to iterate over items + set +f + for dir in "$TMP_DOWNLOAD_DIR"/*; do + if [ -d "$dir" ]; then + if [ -f "$dir/bin/$MVN_CMD" ]; then + actualDistributionDir="$(basename "$dir")" + break + fi fi - # end of workaround done - echo "${basedir}" -} - -# concatenates all lines of a file -concat_lines() { - if [ -f "$1" ]; then - echo "$(tr -s '\n' ' ' < "$1")" - fi -} - -BASE_DIR=`find_maven_basedir "$(pwd)"` -if [ -z "$BASE_DIR" ]; then - exit 1; + set -f fi -export MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-"$BASE_DIR"} -if [ "$MVNW_VERBOSE" = true ]; then - echo $MAVEN_PROJECTBASEDIR -fi -MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS" - -# For Cygwin, switch paths to Windows format before running java -if $cygwin; then - [ -n "$M2_HOME" ] && - M2_HOME=`cygpath --path --windows "$M2_HOME"` - [ -n "$JAVA_HOME" ] && - JAVA_HOME=`cygpath --path --windows "$JAVA_HOME"` - [ -n "$CLASSPATH" ] && - CLASSPATH=`cygpath --path --windows "$CLASSPATH"` - [ -n "$MAVEN_PROJECTBASEDIR" ] && - MAVEN_PROJECTBASEDIR=`cygpath --path --windows "$MAVEN_PROJECTBASEDIR"` +if [ -z "$actualDistributionDir" ]; then + verbose "Contents of $TMP_DOWNLOAD_DIR:" + verbose "$(ls -la "$TMP_DOWNLOAD_DIR")" + die "Could not find Maven distribution directory in extracted archive" fi -WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain +verbose "Found extracted Maven distribution directory: $actualDistributionDir" +printf %s\\n "$distributionUrl" >"$TMP_DOWNLOAD_DIR/$actualDistributionDir/mvnw.url" +mv -- "$TMP_DOWNLOAD_DIR/$actualDistributionDir" "$MAVEN_HOME" || [ -d "$MAVEN_HOME" ] || die "fail to move MAVEN_HOME" -exec "$JAVACMD" \ - $MAVEN_OPTS \ - -classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \ - "-Dmaven.home=${M2_HOME}" "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \ - ${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@" +clean || : +exec_maven "$@" diff --git a/jdtls.ext/mvnw.cmd b/jdtls.ext/mvnw.cmd index 019bd74d..2e2dbe03 100644 --- a/jdtls.ext/mvnw.cmd +++ b/jdtls.ext/mvnw.cmd @@ -1,3 +1,4 @@ +<# : batch portion @REM ---------------------------------------------------------------------------- @REM Licensed to the Apache Software Foundation (ASF) under one @REM or more contributor license agreements. See the NOTICE file @@ -18,126 +19,171 @@ @REM ---------------------------------------------------------------------------- @REM ---------------------------------------------------------------------------- -@REM Maven2 Start Up Batch script -@REM -@REM Required ENV vars: -@REM JAVA_HOME - location of a JDK home dir +@REM Apache Maven Wrapper startup batch script, version 3.3.3 @REM @REM Optional ENV vars -@REM M2_HOME - location of maven2's installed home dir -@REM MAVEN_BATCH_ECHO - set to 'on' to enable the echoing of the batch commands -@REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a key stroke before ending -@REM MAVEN_OPTS - parameters passed to the Java VM when running Maven -@REM e.g. to debug Maven itself, use -@REM set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 -@REM MAVEN_SKIP_RC - flag to disable loading of mavenrc files +@REM MVNW_REPOURL - repo url base for downloading maven distribution +@REM MVNW_USERNAME/MVNW_PASSWORD - user and password for downloading maven +@REM MVNW_VERBOSE - true: enable verbose log; others: silence the output @REM ---------------------------------------------------------------------------- -@REM Begin all REM lines with '@' in case MAVEN_BATCH_ECHO is 'on' -@echo off -@REM enable echoing my setting MAVEN_BATCH_ECHO to 'on' -@if "%MAVEN_BATCH_ECHO%" == "on" echo %MAVEN_BATCH_ECHO% - -@REM set %HOME% to equivalent of $HOME -if "%HOME%" == "" (set "HOME=%HOMEDRIVE%%HOMEPATH%") - -@REM Execute a user defined script before this one -if not "%MAVEN_SKIP_RC%" == "" goto skipRcPre -@REM check for pre script, once with legacy .bat ending and once with .cmd ending -if exist "%HOME%\mavenrc_pre.bat" call "%HOME%\mavenrc_pre.bat" -if exist "%HOME%\mavenrc_pre.cmd" call "%HOME%\mavenrc_pre.cmd" -:skipRcPre - -@setlocal - -set ERROR_CODE=0 - -@REM To isolate internal variables from possible post scripts, we use another setlocal -@setlocal - -@REM ==== START VALIDATION ==== -if not "%JAVA_HOME%" == "" goto OkJHome - -echo. -echo Error: JAVA_HOME not found in your environment. >&2 -echo Please set the JAVA_HOME variable in your environment to match the >&2 -echo location of your Java installation. >&2 -echo. -goto error - -:OkJHome -if exist "%JAVA_HOME%\bin\java.exe" goto init - -echo. -echo Error: JAVA_HOME is set to an invalid directory. >&2 -echo JAVA_HOME = "%JAVA_HOME%" >&2 -echo Please set the JAVA_HOME variable in your environment to match the >&2 -echo location of your Java installation. >&2 -echo. -goto error - -@REM ==== END VALIDATION ==== - -:init - -@REM Find the project base dir, i.e. the directory that contains the folder ".mvn". -@REM Fallback to current working directory if not found. - -set MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR% -IF NOT "%MAVEN_PROJECTBASEDIR%"=="" goto endDetectBaseDir - -set EXEC_DIR=%CD% -set WDIR=%EXEC_DIR% -:findBaseDir -IF EXIST "%WDIR%"\.mvn goto baseDirFound -cd .. -IF "%WDIR%"=="%CD%" goto baseDirNotFound -set WDIR=%CD% -goto findBaseDir - -:baseDirFound -set MAVEN_PROJECTBASEDIR=%WDIR% -cd "%EXEC_DIR%" -goto endDetectBaseDir - -:baseDirNotFound -set MAVEN_PROJECTBASEDIR=%EXEC_DIR% -cd "%EXEC_DIR%" - -:endDetectBaseDir - -IF NOT EXIST "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" goto endReadAdditionalConfig - -@setlocal EnableExtensions EnableDelayedExpansion -for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a -@endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS% - -:endReadAdditionalConfig - -SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe" - -set WRAPPER_JAR="%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.jar" -set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain - -%MAVEN_JAVA_EXE% %JVM_CONFIG_MAVEN_PROPS% %MAVEN_OPTS% %MAVEN_DEBUG_OPTS% -classpath %WRAPPER_JAR% "-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" %WRAPPER_LAUNCHER% %MAVEN_CONFIG% %* -if ERRORLEVEL 1 goto error -goto end - -:error -set ERROR_CODE=1 - -:end -@endlocal & set ERROR_CODE=%ERROR_CODE% - -if not "%MAVEN_SKIP_RC%" == "" goto skipRcPost -@REM check for post script, once with legacy .bat ending and once with .cmd ending -if exist "%HOME%\mavenrc_post.bat" call "%HOME%\mavenrc_post.bat" -if exist "%HOME%\mavenrc_post.cmd" call "%HOME%\mavenrc_post.cmd" -:skipRcPost - -@REM pause the script if MAVEN_BATCH_PAUSE is set to 'on' -if "%MAVEN_BATCH_PAUSE%" == "on" pause - -if "%MAVEN_TERMINATE_CMD%" == "on" exit %ERROR_CODE% - -exit /B %ERROR_CODE% +@IF "%__MVNW_ARG0_NAME__%"=="" (SET __MVNW_ARG0_NAME__=%~nx0) +@SET __MVNW_CMD__= +@SET __MVNW_ERROR__= +@SET __MVNW_PSMODULEP_SAVE=%PSModulePath% +@SET PSModulePath= +@FOR /F "usebackq tokens=1* delims==" %%A IN (`powershell -noprofile "& {$scriptDir='%~dp0'; $script='%__MVNW_ARG0_NAME__%'; icm -ScriptBlock ([Scriptblock]::Create((Get-Content -Raw '%~f0'))) -NoNewScope}"`) DO @( + IF "%%A"=="MVN_CMD" (set __MVNW_CMD__=%%B) ELSE IF "%%B"=="" (echo %%A) ELSE (echo %%A=%%B) +) +@SET PSModulePath=%__MVNW_PSMODULEP_SAVE% +@SET __MVNW_PSMODULEP_SAVE= +@SET __MVNW_ARG0_NAME__= +@SET MVNW_USERNAME= +@SET MVNW_PASSWORD= +@IF NOT "%__MVNW_CMD__%"=="" ("%__MVNW_CMD__%" %*) +@echo Cannot start maven from wrapper >&2 && exit /b 1 +@GOTO :EOF +: end batch / begin powershell #> + +$ErrorActionPreference = "Stop" +if ($env:MVNW_VERBOSE -eq "true") { + $VerbosePreference = "Continue" +} + +# calculate distributionUrl, requires .mvn/wrapper/maven-wrapper.properties +$distributionUrl = (Get-Content -Raw "$scriptDir/.mvn/wrapper/maven-wrapper.properties" | ConvertFrom-StringData).distributionUrl +if (!$distributionUrl) { + Write-Error "cannot read distributionUrl property in $scriptDir/.mvn/wrapper/maven-wrapper.properties" +} + +switch -wildcard -casesensitive ( $($distributionUrl -replace '^.*/','') ) { + "maven-mvnd-*" { + $USE_MVND = $true + $distributionUrl = $distributionUrl -replace '-bin\.[^.]*$',"-windows-amd64.zip" + $MVN_CMD = "mvnd.cmd" + break + } + default { + $USE_MVND = $false + $MVN_CMD = $script -replace '^mvnw','mvn' + break + } +} + +# apply MVNW_REPOURL and calculate MAVEN_HOME +# maven home pattern: ~/.m2/wrapper/dists/{apache-maven-,maven-mvnd--}/ +if ($env:MVNW_REPOURL) { + $MVNW_REPO_PATTERN = if ($USE_MVND -eq $False) { "/org/apache/maven/" } else { "/maven/mvnd/" } + $distributionUrl = "$env:MVNW_REPOURL$MVNW_REPO_PATTERN$($distributionUrl -replace "^.*$MVNW_REPO_PATTERN",'')" +} +$distributionUrlName = $distributionUrl -replace '^.*/','' +$distributionUrlNameMain = $distributionUrlName -replace '\.[^.]*$','' -replace '-bin$','' + +$MAVEN_M2_PATH = "$HOME/.m2" +if ($env:MAVEN_USER_HOME) { + $MAVEN_M2_PATH = "$env:MAVEN_USER_HOME" +} + +if (-not (Test-Path -Path $MAVEN_M2_PATH)) { + New-Item -Path $MAVEN_M2_PATH -ItemType Directory | Out-Null +} + +$MAVEN_WRAPPER_DISTS = $null +if ((Get-Item $MAVEN_M2_PATH).Target[0] -eq $null) { + $MAVEN_WRAPPER_DISTS = "$MAVEN_M2_PATH/wrapper/dists" +} else { + $MAVEN_WRAPPER_DISTS = (Get-Item $MAVEN_M2_PATH).Target[0] + "/wrapper/dists" +} + +$MAVEN_HOME_PARENT = "$MAVEN_WRAPPER_DISTS/$distributionUrlNameMain" +$MAVEN_HOME_NAME = ([System.Security.Cryptography.SHA256]::Create().ComputeHash([byte[]][char[]]$distributionUrl) | ForEach-Object {$_.ToString("x2")}) -join '' +$MAVEN_HOME = "$MAVEN_HOME_PARENT/$MAVEN_HOME_NAME" + +if (Test-Path -Path "$MAVEN_HOME" -PathType Container) { + Write-Verbose "found existing MAVEN_HOME at $MAVEN_HOME" + Write-Output "MVN_CMD=$MAVEN_HOME/bin/$MVN_CMD" + exit $? +} + +if (! $distributionUrlNameMain -or ($distributionUrlName -eq $distributionUrlNameMain)) { + Write-Error "distributionUrl is not valid, must end with *-bin.zip, but found $distributionUrl" +} + +# prepare tmp dir +$TMP_DOWNLOAD_DIR_HOLDER = New-TemporaryFile +$TMP_DOWNLOAD_DIR = New-Item -Itemtype Directory -Path "$TMP_DOWNLOAD_DIR_HOLDER.dir" +$TMP_DOWNLOAD_DIR_HOLDER.Delete() | Out-Null +trap { + if ($TMP_DOWNLOAD_DIR.Exists) { + try { Remove-Item $TMP_DOWNLOAD_DIR -Recurse -Force | Out-Null } + catch { Write-Warning "Cannot remove $TMP_DOWNLOAD_DIR" } + } +} + +New-Item -Itemtype Directory -Path "$MAVEN_HOME_PARENT" -Force | Out-Null + +# Download and Install Apache Maven +Write-Verbose "Couldn't find MAVEN_HOME, downloading and installing it ..." +Write-Verbose "Downloading from: $distributionUrl" +Write-Verbose "Downloading to: $TMP_DOWNLOAD_DIR/$distributionUrlName" + +$webclient = New-Object System.Net.WebClient +if ($env:MVNW_USERNAME -and $env:MVNW_PASSWORD) { + $webclient.Credentials = New-Object System.Net.NetworkCredential($env:MVNW_USERNAME, $env:MVNW_PASSWORD) +} +[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12 +$webclient.DownloadFile($distributionUrl, "$TMP_DOWNLOAD_DIR/$distributionUrlName") | Out-Null + +# If specified, validate the SHA-256 sum of the Maven distribution zip file +$distributionSha256Sum = (Get-Content -Raw "$scriptDir/.mvn/wrapper/maven-wrapper.properties" | ConvertFrom-StringData).distributionSha256Sum +if ($distributionSha256Sum) { + if ($USE_MVND) { + Write-Error "Checksum validation is not supported for maven-mvnd. `nPlease disable validation by removing 'distributionSha256Sum' from your maven-wrapper.properties." + } + Import-Module $PSHOME\Modules\Microsoft.PowerShell.Utility -Function Get-FileHash + if ((Get-FileHash "$TMP_DOWNLOAD_DIR/$distributionUrlName" -Algorithm SHA256).Hash.ToLower() -ne $distributionSha256Sum) { + Write-Error "Error: Failed to validate Maven distribution SHA-256, your Maven distribution might be compromised. If you updated your Maven version, you need to update the specified distributionSha256Sum property." + } +} + +# unzip and move +Expand-Archive "$TMP_DOWNLOAD_DIR/$distributionUrlName" -DestinationPath "$TMP_DOWNLOAD_DIR" | Out-Null + +# Find the actual extracted directory name (handles snapshots where filename != directory name) +$actualDistributionDir = "" + +# First try the expected directory name (for regular distributions) +$expectedPath = Join-Path "$TMP_DOWNLOAD_DIR" "$distributionUrlNameMain" +$expectedMvnPath = Join-Path "$expectedPath" "bin/$MVN_CMD" +if ((Test-Path -Path $expectedPath -PathType Container) -and (Test-Path -Path $expectedMvnPath -PathType Leaf)) { + $actualDistributionDir = $distributionUrlNameMain +} + +# If not found, search for any directory with the Maven executable (for snapshots) +if (!$actualDistributionDir) { + Get-ChildItem -Path "$TMP_DOWNLOAD_DIR" -Directory | ForEach-Object { + $testPath = Join-Path $_.FullName "bin/$MVN_CMD" + if (Test-Path -Path $testPath -PathType Leaf) { + $actualDistributionDir = $_.Name + } + } +} + +if (!$actualDistributionDir) { + Write-Error "Could not find Maven distribution directory in extracted archive" +} + +Write-Verbose "Found extracted Maven distribution directory: $actualDistributionDir" +Rename-Item -Path "$TMP_DOWNLOAD_DIR/$actualDistributionDir" -NewName $MAVEN_HOME_NAME | Out-Null +try { + Move-Item -Path "$TMP_DOWNLOAD_DIR/$MAVEN_HOME_NAME" -Destination $MAVEN_HOME_PARENT | Out-Null +} catch { + if (! (Test-Path -Path "$MAVEN_HOME" -PathType Container)) { + Write-Error "fail to move MAVEN_HOME" + } +} finally { + try { Remove-Item $TMP_DOWNLOAD_DIR -Recurse -Force | Out-Null } + catch { Write-Warning "Cannot remove $TMP_DOWNLOAD_DIR" } +} + +Write-Output "MVN_CMD=$MAVEN_HOME/bin/$MVN_CMD" From c3793fe209ae458bc8bba4e0fffb798fe5728716 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 6 Aug 2026 06:55:12 +0800 Subject: [PATCH 337/352] chore(deps-dev): Bump fast-uri from 3.1.4 to 3.1.5 (#1050) Bumps [fast-uri](https://github.com/fastify/fast-uri) from 3.1.4 to 3.1.5. - [Release notes](https://github.com/fastify/fast-uri/releases) - [Commits](https://github.com/fastify/fast-uri/compare/v3.1.4...v3.1.5) --- updated-dependencies: - dependency-name: fast-uri dependency-version: 3.1.5 dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index a087b369..aa6183e8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1750,9 +1750,9 @@ } }, "node_modules/fast-uri": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.4.tgz", - "integrity": "sha512-8JnbkQ4juDyvYs4mgFGQqg4yCYtFDtUtmp2QIQq11ZZe5CFQ5wcqm1rqDgAh/QdMySuBnPzMUiJUNZG5N/AiQw==", + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.5.tgz", + "integrity": "sha512-gHwA1O9LDIcKunMKhObS/HimwtehO1nPUECKAu5TpKgaO19fcWEl4bliWe1jWxVFvIXztJjjQ4L8XQ1EU9f7Jw==", "dev": true, "funding": [ { @@ -5464,9 +5464,9 @@ } }, "fast-uri": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.4.tgz", - "integrity": "sha512-8JnbkQ4juDyvYs4mgFGQqg4yCYtFDtUtmp2QIQq11ZZe5CFQ5wcqm1rqDgAh/QdMySuBnPzMUiJUNZG5N/AiQw==", + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.5.tgz", + "integrity": "sha512-gHwA1O9LDIcKunMKhObS/HimwtehO1nPUECKAu5TpKgaO19fcWEl4bliWe1jWxVFvIXztJjjQ4L8XQ1EU9f7Jw==", "dev": true }, "fastest-levenshtein": { From ab209562fb79583c775e5c9a45d091bfc366c1b3 Mon Sep 17 00:00:00 2001 From: wenyt <75360946+wenytang-ms@users.noreply.github.com> Date: Thu, 6 Aug 2026 14:38:05 +0800 Subject: [PATCH 338/352] ci: Revert fast-uri 3.1.5 and delay Dependabot updates (#1052) * Revert "chore(deps-dev): Bump fast-uri from 3.1.4 to 3.1.5 (#1050)" This reverts commit c3793fe209ae458bc8bba4e0fffb798fe5728716. * build: delay Dependabot updates for CFS availability --- .github/dependabot.yml | 10 +++++++++- package-lock.json | 12 ++++++------ 2 files changed, 15 insertions(+), 7 deletions(-) diff --git a/.github/dependabot.yml b/.github/dependabot.yml index f55afd44..8cc8a033 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -5,7 +5,15 @@ version: 2 updates: - - package-ecosystem: "" # See documentation for possible values + - package-ecosystem: "npm" # See documentation for possible values directory: "/" # Location of package manifests schedule: interval: "daily" + # CI restores packages from the Central Feed Service, which withholds + # upstream versions until they are roughly a week old (measured at ~6.8 + # days; both the packument entry and the tarball return 404 before then). + # Dependabot's built-in cooldown is only 3 days, so bumps otherwise land in + # a window where the feed 404s and the build fails. 10 days leaves margin + # in case the feed's ingestion lag drifts. + cooldown: + default-days: 10 diff --git a/package-lock.json b/package-lock.json index aa6183e8..a087b369 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1750,9 +1750,9 @@ } }, "node_modules/fast-uri": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.5.tgz", - "integrity": "sha512-gHwA1O9LDIcKunMKhObS/HimwtehO1nPUECKAu5TpKgaO19fcWEl4bliWe1jWxVFvIXztJjjQ4L8XQ1EU9f7Jw==", + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.4.tgz", + "integrity": "sha512-8JnbkQ4juDyvYs4mgFGQqg4yCYtFDtUtmp2QIQq11ZZe5CFQ5wcqm1rqDgAh/QdMySuBnPzMUiJUNZG5N/AiQw==", "dev": true, "funding": [ { @@ -5464,9 +5464,9 @@ } }, "fast-uri": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.5.tgz", - "integrity": "sha512-gHwA1O9LDIcKunMKhObS/HimwtehO1nPUECKAu5TpKgaO19fcWEl4bliWe1jWxVFvIXztJjjQ4L8XQ1EU9f7Jw==", + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.4.tgz", + "integrity": "sha512-8JnbkQ4juDyvYs4mgFGQqg4yCYtFDtUtmp2QIQq11ZZe5CFQ5wcqm1rqDgAh/QdMySuBnPzMUiJUNZG5N/AiQw==", "dev": true }, "fastest-levenshtein": { From e5220ca3c0981d38b22fcdc800e5cc3a468bb0e0 Mon Sep 17 00:00:00 2001 From: wenyt <75360946+wenytang-ms@users.noreply.github.com> Date: Mon, 17 Aug 2026 10:52:43 +0800 Subject: [PATCH 339/352] build: pin MicroBuild signing plugin (#1058) Use the last known-good Windows signing package in nightly and RC pipelines until the 1.1.1374 client certificate regression is resolved. --- .azure-pipelines/nightly.yml | 19 ++++++++++++++----- .azure-pipelines/rc.yml | 19 ++++++++++++++----- 2 files changed, 28 insertions(+), 10 deletions(-) diff --git a/.azure-pipelines/nightly.yml b/.azure-pipelines/nightly.yml index a1ee16a2..1a53afd8 100644 --- a/.azure-pipelines/nightly.yml +++ b/.azure-pipelines/nightly.yml @@ -33,11 +33,7 @@ extends: templateContext: mb: signing: - enabled: true - signType: real - signWithProd: true - zipSources: false - feedSource: 'https://mseng.pkgs.visualstudio.com/DefaultCollection/_packaging/MicroBuildToolset/nuget/v3/index.json' + enabled: false outputs: - output: pipelineArtifact artifactName: extension @@ -47,6 +43,19 @@ extends: - checkout: self clean: true fetchTags: true + # Pin the last known-good Windows plugin while the 1.1.1374 client certificate regression is unresolved. + - task: NuGetAuthenticate@1 + displayName: Authenticate MicroBuild feed + - task: MicroBuildSigningPlugin@4 + displayName: Install Signing Plugin 1.1.1306 + inputs: + signType: real + version: '1.1.1306' + zipSources: false + ConnectedPMEServiceName: '40012d40-9ded-4f75-8476-d60758200346' + feedSource: 'https://mseng.pkgs.visualstudio.com/DefaultCollection/_packaging/MicroBuildToolset/nuget/v3/index.json' + env: + MicroBuildOutputFolderOverride: '$(Agent.TempDirectory)' - task: NodeTool@0 displayName: Use Node 20.x inputs: diff --git a/.azure-pipelines/rc.yml b/.azure-pipelines/rc.yml index 59286c81..07da2067 100644 --- a/.azure-pipelines/rc.yml +++ b/.azure-pipelines/rc.yml @@ -28,11 +28,7 @@ extends: templateContext: mb: signing: - enabled: true - signType: real - signWithProd: true - zipSources: false - feedSource: 'https://mseng.pkgs.visualstudio.com/DefaultCollection/_packaging/MicroBuildToolset/nuget/v3/index.json' + enabled: false outputs: - output: pipelineArtifact artifactName: extension @@ -42,6 +38,19 @@ extends: - checkout: self clean: true fetchTags: true + # Pin the last known-good Windows plugin while the 1.1.1374 client certificate regression is unresolved. + - task: NuGetAuthenticate@1 + displayName: Authenticate MicroBuild feed + - task: MicroBuildSigningPlugin@4 + displayName: Install Signing Plugin 1.1.1306 + inputs: + signType: real + version: '1.1.1306' + zipSources: false + ConnectedPMEServiceName: '40012d40-9ded-4f75-8476-d60758200346' + feedSource: 'https://mseng.pkgs.visualstudio.com/DefaultCollection/_packaging/MicroBuildToolset/nuget/v3/index.json' + env: + MicroBuildOutputFolderOverride: '$(Agent.TempDirectory)' - task: NodeTool@0 displayName: Use Node 20.x inputs: From 2b06bcbd014f14a331c0fc2a4c3c5b1b6fd9b1d5 Mon Sep 17 00:00:00 2001 From: wenyt <75360946+wenytang-ms@users.noreply.github.com> Date: Tue, 18 Aug 2026 14:20:18 +0800 Subject: [PATCH 340/352] revert: pin Windows signing plugin to 1.1.1306 (#1059) This reverts commit e5220ca3c0981d38b22fcdc800e5cc3a468bb0e0. SR21 validation is complete. Follow-up signing changes will target the specific JAR signing flow. --- .azure-pipelines/nightly.yml | 19 +++++-------------- .azure-pipelines/rc.yml | 19 +++++-------------- 2 files changed, 10 insertions(+), 28 deletions(-) diff --git a/.azure-pipelines/nightly.yml b/.azure-pipelines/nightly.yml index 1a53afd8..a1ee16a2 100644 --- a/.azure-pipelines/nightly.yml +++ b/.azure-pipelines/nightly.yml @@ -33,7 +33,11 @@ extends: templateContext: mb: signing: - enabled: false + enabled: true + signType: real + signWithProd: true + zipSources: false + feedSource: 'https://mseng.pkgs.visualstudio.com/DefaultCollection/_packaging/MicroBuildToolset/nuget/v3/index.json' outputs: - output: pipelineArtifact artifactName: extension @@ -43,19 +47,6 @@ extends: - checkout: self clean: true fetchTags: true - # Pin the last known-good Windows plugin while the 1.1.1374 client certificate regression is unresolved. - - task: NuGetAuthenticate@1 - displayName: Authenticate MicroBuild feed - - task: MicroBuildSigningPlugin@4 - displayName: Install Signing Plugin 1.1.1306 - inputs: - signType: real - version: '1.1.1306' - zipSources: false - ConnectedPMEServiceName: '40012d40-9ded-4f75-8476-d60758200346' - feedSource: 'https://mseng.pkgs.visualstudio.com/DefaultCollection/_packaging/MicroBuildToolset/nuget/v3/index.json' - env: - MicroBuildOutputFolderOverride: '$(Agent.TempDirectory)' - task: NodeTool@0 displayName: Use Node 20.x inputs: diff --git a/.azure-pipelines/rc.yml b/.azure-pipelines/rc.yml index 07da2067..59286c81 100644 --- a/.azure-pipelines/rc.yml +++ b/.azure-pipelines/rc.yml @@ -28,7 +28,11 @@ extends: templateContext: mb: signing: - enabled: false + enabled: true + signType: real + signWithProd: true + zipSources: false + feedSource: 'https://mseng.pkgs.visualstudio.com/DefaultCollection/_packaging/MicroBuildToolset/nuget/v3/index.json' outputs: - output: pipelineArtifact artifactName: extension @@ -38,19 +42,6 @@ extends: - checkout: self clean: true fetchTags: true - # Pin the last known-good Windows plugin while the 1.1.1374 client certificate regression is unresolved. - - task: NuGetAuthenticate@1 - displayName: Authenticate MicroBuild feed - - task: MicroBuildSigningPlugin@4 - displayName: Install Signing Plugin 1.1.1306 - inputs: - signType: real - version: '1.1.1306' - zipSources: false - ConnectedPMEServiceName: '40012d40-9ded-4f75-8476-d60758200346' - feedSource: 'https://mseng.pkgs.visualstudio.com/DefaultCollection/_packaging/MicroBuildToolset/nuget/v3/index.json' - env: - MicroBuildOutputFolderOverride: '$(Agent.TempDirectory)' - task: NodeTool@0 displayName: Use Node 20.x inputs: From 04a14475c484b52b7b8dc79f494583a9e3e91814 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 20 Aug 2026 06:37:27 +0800 Subject: [PATCH 341/352] chore(deps-dev): bump webpack from 5.105.0 to 5.109.0 Bumps [webpack](https://github.com/webpack/webpack) from 5.105.0 to 5.109.0. - [Release notes](https://github.com/webpack/webpack/releases) - [Changelog](https://github.com/webpack/webpack/blob/main/CHANGELOG.md) - [Commits](https://github.com/webpack/webpack/compare/v5.105.0...v5.109.0) --- updated-dependencies: - dependency-name: webpack dependency-version: 5.109.0 dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 392 +++++++++++++++++++--------------------------- package.json | 2 +- 2 files changed, 161 insertions(+), 233 deletions(-) diff --git a/package-lock.json b/package-lock.json index a087b369..63fc2f0e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -37,7 +37,7 @@ "ts-loader": "^9.4.2", "tslint": "^6.1.3", "typescript": "^4.9.4", - "webpack": "^5.105.0", + "webpack": "^5.109.0", "webpack-cli": "^4.10.0" }, "engines": { @@ -646,30 +646,10 @@ "node": ">=14" } }, - "node_modules/@types/eslint": { - "version": "9.6.1", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-9.6.1.tgz", - "integrity": "sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==", - "dev": true, - "dependencies": { - "@types/estree": "*", - "@types/json-schema": "*" - } - }, - "node_modules/@types/eslint-scope": { - "version": "3.7.7", - "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz", - "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==", - "dev": true, - "dependencies": { - "@types/eslint": "*", - "@types/estree": "*" - } - }, "node_modules/@types/estree": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", - "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz", + "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==", "dev": true }, "node_modules/@types/fs-extra": { @@ -963,9 +943,9 @@ "dev": true }, "node_modules/acorn": { - "version": "8.15.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", - "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.18.0.tgz", + "integrity": "sha512-lGq+9yr1/GuAWaVYIHRjvvySG5/4VfKIvC8EWxStPdcDh/Ka7FG3twP6v4d5BkravUilhIAsG4Qj83t02LWUPQ==", "dev": true, "bin": { "acorn": "bin/acorn" @@ -974,18 +954,6 @@ "node": ">=0.4.0" } }, - "node_modules/acorn-import-phases": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/acorn-import-phases/-/acorn-import-phases-1.0.4.tgz", - "integrity": "sha512-wKmbr/DDiIXzEOiWrTTUcDm24kQ2vGfZQvM2fwg2vXqR5uW6aapr7ObPtj1th32b9u90/Pf4AItvdTh42fBmVQ==", - "dev": true, - "engines": { - "node": ">=10.13.0" - }, - "peerDependencies": { - "acorn": "^8.14.0" - } - }, "node_modules/agent-base": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz", @@ -1544,13 +1512,13 @@ "dev": true }, "node_modules/enhanced-resolve": { - "version": "5.19.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.19.0.tgz", - "integrity": "sha512-phv3E1Xl4tQOShqSte26C7Fl84EwUdZsyOuSSk9qtAGyyQs2s3jJzComh+Abf4g187lUUAvH+H26omrqia2aGg==", + "version": "5.24.5", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.24.5.tgz", + "integrity": "sha512-L1l8TNvomm6UVW5B253AGxQagSQr+vGwhMlrrfRS2qmhx46AMpMVJKQYLvWYbysTMY8VoicOvzHzoHMbyzB+4A==", "dev": true, "dependencies": { "graceful-fs": "^4.2.4", - "tapable": "^2.3.0" + "tapable": "^2.3.3" }, "engines": { "node": ">=10.13.0" @@ -1585,9 +1553,9 @@ } }, "node_modules/es-module-lexer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-2.0.0.tgz", - "integrity": "sha512-5POEcUuZybH7IdmGsD8wlf0AI55wMecM9rVBTI/qEAy2c1kTOm3DjFYjrBdI2K3BaJjJYfYFeRtM0t9ssnRuxw==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-2.3.1.tgz", + "integrity": "sha512-shc1dbU90Yl/xq1QrC7QRtfcwURZuVRfPhZbDoldJ1cn1gzDvBaBWlv0eFolj5+0znnPJz5TXLxsN77X/12KTA==", "dev": true }, "node_modules/es-object-atoms": { @@ -1993,12 +1961,6 @@ "node": ">=10.13.0" } }, - "node_modules/glob-to-regexp": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", - "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", - "dev": true - }, "node_modules/glob/node_modules/brace-expansion": { "version": "1.1.13", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.13.tgz", @@ -2373,12 +2335,6 @@ "js-yaml": "bin/js-yaml.js" } }, - "node_modules/json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true - }, "node_modules/json-schema-traverse": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", @@ -2426,19 +2382,6 @@ "immediate": "~3.0.5" } }, - "node_modules/loader-runner": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.1.tgz", - "integrity": "sha512-IWqP2SCPhyVFTBtRcgMHdzlf9ul25NwaFx4wCEH/KjAXuuHY4yNjvPXsBokp8jCB936PyWRaPKUNh8NvylLp2Q==", - "dev": true, - "engines": { - "node": ">=6.11.5" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, "node_modules/locate-path": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", @@ -2562,6 +2505,66 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/minimizer-webpack-plugin": { + "version": "5.6.1", + "resolved": "https://registry.npmjs.org/minimizer-webpack-plugin/-/minimizer-webpack-plugin-5.6.1.tgz", + "integrity": "sha512-DoeAZz8Q1C1znwsUzej1fdoi4jCf7/+Em27ouLqfK/+3m8G+D7yDhUwrc3CNhjSzGUN1kn7Iv4sWmjflQHenpw==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.25", + "jest-worker": "^27.4.5", + "schema-utils": "^4.3.0", + "terser": "^5.31.1" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" + }, + "peerDependenciesMeta": { + "@minify-html/node": { + "optional": true + }, + "@swc/core": { + "optional": true + }, + "@swc/css": { + "optional": true + }, + "@swc/html": { + "optional": true + }, + "clean-css": { + "optional": true + }, + "cssnano": { + "optional": true + }, + "csso": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "html-minifier-terser": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "postcss": { + "optional": true + }, + "uglify-js": { + "optional": true + } + } + }, "node_modules/minipass": { "version": "7.1.3", "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz", @@ -3477,9 +3480,9 @@ } }, "node_modules/tapable": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.0.tgz", - "integrity": "sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==", + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.3.tgz", + "integrity": "sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==", "dev": true, "engines": { "node": ">=6" @@ -3498,9 +3501,9 @@ } }, "node_modules/terser": { - "version": "5.46.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.46.0.tgz", - "integrity": "sha512-jTwoImyr/QbOWFFso3YoU3ik0jBBDJ6JTOQiy/J2YxVJdZCc+5u7skhNwiOR3FQIygFqVUPHl7qbbxtjW2K3Qg==", + "version": "5.49.2", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.49.2.tgz", + "integrity": "sha512-rGbJiKeQ4WDe3EXlDAIaQcwftVfv2Q8o1awFNfvXolJYKkb1AuZY1RTOmqx4LJXZENbWZA7eIsYGHuEzHsi1nQ==", "dev": true, "dependencies": { "@jridgewell/source-map": "^0.3.3", @@ -3515,40 +3518,6 @@ "node": ">=10" } }, - "node_modules/terser-webpack-plugin": { - "version": "5.3.16", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.16.tgz", - "integrity": "sha512-h9oBFCWrq78NyWWVcSwZarJkZ01c2AyGrzs1crmHZO3QUg9D61Wu4NPjBy69n7JqylFF5y+CsUZYmYEIZ3mR+Q==", - "dev": true, - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.25", - "jest-worker": "^27.4.5", - "schema-utils": "^4.3.0", - "serialize-javascript": "^6.0.2", - "terser": "^5.31.1" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.1.0" - }, - "peerDependenciesMeta": { - "@swc/core": { - "optional": true - }, - "esbuild": { - "optional": true - }, - "uglify-js": { - "optional": true - } - } - }, "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -3915,12 +3884,11 @@ } }, "node_modules/watchpack": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.5.1.tgz", - "integrity": "sha512-Zn5uXdcFNIA1+1Ei5McRd+iRzfhENPCe7LeABkJtNulSxjma+l7ltNx55BWZkRlwRnpOgHqxnjyaDgJnNXnqzg==", + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.5.2.tgz", + "integrity": "sha512-6i/00NBjP4yGPs+caKSyRfpTF/8Torsu0MOW3mMzIbhgISFder8i7xbqgHlLMwJrdiN8ndBV3UA1/AfzPSr+jg==", "dev": true, "dependencies": { - "glob-to-regexp": "^0.4.1", "graceful-fs": "^4.1.2" }, "engines": { @@ -3928,36 +3896,31 @@ } }, "node_modules/webpack": { - "version": "5.105.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.105.0.tgz", - "integrity": "sha512-gX/dMkRQc7QOMzgTe6KsYFM7DxeIONQSui1s0n/0xht36HvrgbxtM1xBlgx596NbpHuQU8P7QpKwrZYwUX48nw==", + "version": "5.109.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.109.0.tgz", + "integrity": "sha512-vomrngskVVXEZF9sMZfYAd4pXZUnfaWdJGlF+BTNF+gJBCKYCQBnOeVPlrh39Ewl7nlCsirDplMy6o5g9xJHBg==", "dev": true, "dependencies": { - "@types/eslint-scope": "^3.7.7", "@types/estree": "^1.0.8", "@types/json-schema": "^7.0.15", "@webassemblyjs/ast": "^1.14.1", "@webassemblyjs/wasm-edit": "^1.14.1", "@webassemblyjs/wasm-parser": "^1.14.1", - "acorn": "^8.15.0", - "acorn-import-phases": "^1.0.3", + "acorn": "^8.16.0", "browserslist": "^4.28.1", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.19.0", - "es-module-lexer": "^2.0.0", + "enhanced-resolve": "^5.24.2", + "es-module-lexer": "^2.1.0", "eslint-scope": "5.1.1", "events": "^3.2.0", - "glob-to-regexp": "^0.4.1", "graceful-fs": "^4.2.11", - "json-parse-even-better-errors": "^2.3.1", - "loader-runner": "^4.3.1", - "mime-types": "^2.1.27", + "mime-db": "^1.54.0", + "minimizer-webpack-plugin": "^5.6.1", "neo-async": "^2.6.2", "schema-utils": "^4.3.3", "tapable": "^2.3.0", - "terser-webpack-plugin": "^5.3.16", - "watchpack": "^2.5.1", - "webpack-sources": "^3.3.3" + "watchpack": "^2.5.2", + "webpack-sources": "^3.5.1" }, "bin": { "webpack": "bin/webpack.js" @@ -4045,14 +4008,23 @@ } }, "node_modules/webpack-sources": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.3.3.tgz", - "integrity": "sha512-yd1RBzSGanHkitROoPFd6qsrxt+oFhg/129YzheDGqeustzX0vTZJZsSsQjVQC4yzBQ56K55XU8gaNCtIzOnTg==", + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.5.1.tgz", + "integrity": "sha512-jyuiGJdtvY434z5bUZrjz67v76/ePNvFZTp9Mdz29IlH4+GPsgyGjiv0fKI+M7BdkU6ADjulUcKAd3tUK3WlEw==", "dev": true, "engines": { "node": ">=10.13.0" } }, + "node_modules/webpack/node_modules/mime-db": { + "version": "1.54.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", + "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", @@ -4625,30 +4597,10 @@ "dev": true, "optional": true }, - "@types/eslint": { - "version": "9.6.1", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-9.6.1.tgz", - "integrity": "sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==", - "dev": true, - "requires": { - "@types/estree": "*", - "@types/json-schema": "*" - } - }, - "@types/eslint-scope": { - "version": "3.7.7", - "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz", - "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==", - "dev": true, - "requires": { - "@types/eslint": "*", - "@types/estree": "*" - } - }, "@types/estree": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", - "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz", + "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==", "dev": true }, "@types/fs-extra": { @@ -4920,18 +4872,11 @@ "dev": true }, "acorn": { - "version": "8.15.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", - "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.18.0.tgz", + "integrity": "sha512-lGq+9yr1/GuAWaVYIHRjvvySG5/4VfKIvC8EWxStPdcDh/Ka7FG3twP6v4d5BkravUilhIAsG4Qj83t02LWUPQ==", "dev": true }, - "acorn-import-phases": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/acorn-import-phases/-/acorn-import-phases-1.0.4.tgz", - "integrity": "sha512-wKmbr/DDiIXzEOiWrTTUcDm24kQ2vGfZQvM2fwg2vXqR5uW6aapr7ObPtj1th32b9u90/Pf4AItvdTh42fBmVQ==", - "dev": true, - "requires": {} - }, "agent-base": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz", @@ -5323,13 +5268,13 @@ "dev": true }, "enhanced-resolve": { - "version": "5.19.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.19.0.tgz", - "integrity": "sha512-phv3E1Xl4tQOShqSte26C7Fl84EwUdZsyOuSSk9qtAGyyQs2s3jJzComh+Abf4g187lUUAvH+H26omrqia2aGg==", + "version": "5.24.5", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.24.5.tgz", + "integrity": "sha512-L1l8TNvomm6UVW5B253AGxQagSQr+vGwhMlrrfRS2qmhx46AMpMVJKQYLvWYbysTMY8VoicOvzHzoHMbyzB+4A==", "dev": true, "requires": { "graceful-fs": "^4.2.4", - "tapable": "^2.3.0" + "tapable": "^2.3.3" } }, "envinfo": { @@ -5349,9 +5294,9 @@ "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==" }, "es-module-lexer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-2.0.0.tgz", - "integrity": "sha512-5POEcUuZybH7IdmGsD8wlf0AI55wMecM9rVBTI/qEAy2c1kTOm3DjFYjrBdI2K3BaJjJYfYFeRtM0t9ssnRuxw==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-2.3.1.tgz", + "integrity": "sha512-shc1dbU90Yl/xq1QrC7QRtfcwURZuVRfPhZbDoldJ1cn1gzDvBaBWlv0eFolj5+0znnPJz5TXLxsN77X/12KTA==", "dev": true }, "es-object-atoms": { @@ -5645,12 +5590,6 @@ "is-glob": "^4.0.3" } }, - "glob-to-regexp": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", - "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", - "dev": true - }, "globby": { "version": "13.2.2", "resolved": "https://registry.npmjs.org/globby/-/globby-13.2.2.tgz", @@ -5888,12 +5827,6 @@ "argparse": "^2.0.1" } }, - "json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true - }, "json-schema-traverse": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", @@ -5936,12 +5869,6 @@ "immediate": "~3.0.5" } }, - "loader-runner": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.1.tgz", - "integrity": "sha512-IWqP2SCPhyVFTBtRcgMHdzlf9ul25NwaFx4wCEH/KjAXuuHY4yNjvPXsBokp8jCB936PyWRaPKUNh8NvylLp2Q==", - "dev": true - }, "locate-path": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", @@ -6024,6 +5951,18 @@ "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", "dev": true }, + "minimizer-webpack-plugin": { + "version": "5.6.1", + "resolved": "https://registry.npmjs.org/minimizer-webpack-plugin/-/minimizer-webpack-plugin-5.6.1.tgz", + "integrity": "sha512-DoeAZz8Q1C1znwsUzej1fdoi4jCf7/+Em27ouLqfK/+3m8G+D7yDhUwrc3CNhjSzGUN1kn7Iv4sWmjflQHenpw==", + "dev": true, + "requires": { + "@jridgewell/trace-mapping": "^0.3.25", + "jest-worker": "^27.4.5", + "schema-utils": "^4.3.0", + "terser": "^5.31.1" + } + }, "minipass": { "version": "7.1.3", "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz", @@ -6643,9 +6582,9 @@ "dev": true }, "tapable": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.0.tgz", - "integrity": "sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==", + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.3.tgz", + "integrity": "sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==", "dev": true }, "tas-client": { @@ -6657,9 +6596,9 @@ } }, "terser": { - "version": "5.46.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.46.0.tgz", - "integrity": "sha512-jTwoImyr/QbOWFFso3YoU3ik0jBBDJ6JTOQiy/J2YxVJdZCc+5u7skhNwiOR3FQIygFqVUPHl7qbbxtjW2K3Qg==", + "version": "5.49.2", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.49.2.tgz", + "integrity": "sha512-rGbJiKeQ4WDe3EXlDAIaQcwftVfv2Q8o1awFNfvXolJYKkb1AuZY1RTOmqx4LJXZENbWZA7eIsYGHuEzHsi1nQ==", "dev": true, "requires": { "@jridgewell/source-map": "^0.3.3", @@ -6668,19 +6607,6 @@ "source-map-support": "~0.5.20" } }, - "terser-webpack-plugin": { - "version": "5.3.16", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.16.tgz", - "integrity": "sha512-h9oBFCWrq78NyWWVcSwZarJkZ01c2AyGrzs1crmHZO3QUg9D61Wu4NPjBy69n7JqylFF5y+CsUZYmYEIZ3mR+Q==", - "dev": true, - "requires": { - "@jridgewell/trace-mapping": "^0.3.25", - "jest-worker": "^27.4.5", - "schema-utils": "^4.3.0", - "serialize-javascript": ">=7.0.5", - "terser": "^5.31.1" - } - }, "to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -6952,46 +6878,48 @@ } }, "watchpack": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.5.1.tgz", - "integrity": "sha512-Zn5uXdcFNIA1+1Ei5McRd+iRzfhENPCe7LeABkJtNulSxjma+l7ltNx55BWZkRlwRnpOgHqxnjyaDgJnNXnqzg==", + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.5.2.tgz", + "integrity": "sha512-6i/00NBjP4yGPs+caKSyRfpTF/8Torsu0MOW3mMzIbhgISFder8i7xbqgHlLMwJrdiN8ndBV3UA1/AfzPSr+jg==", "dev": true, "requires": { - "glob-to-regexp": "^0.4.1", "graceful-fs": "^4.1.2" } }, "webpack": { - "version": "5.105.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.105.0.tgz", - "integrity": "sha512-gX/dMkRQc7QOMzgTe6KsYFM7DxeIONQSui1s0n/0xht36HvrgbxtM1xBlgx596NbpHuQU8P7QpKwrZYwUX48nw==", + "version": "5.109.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.109.0.tgz", + "integrity": "sha512-vomrngskVVXEZF9sMZfYAd4pXZUnfaWdJGlF+BTNF+gJBCKYCQBnOeVPlrh39Ewl7nlCsirDplMy6o5g9xJHBg==", "dev": true, "requires": { - "@types/eslint-scope": "^3.7.7", "@types/estree": "^1.0.8", "@types/json-schema": "^7.0.15", "@webassemblyjs/ast": "^1.14.1", "@webassemblyjs/wasm-edit": "^1.14.1", "@webassemblyjs/wasm-parser": "^1.14.1", - "acorn": "^8.15.0", - "acorn-import-phases": "^1.0.3", + "acorn": "^8.16.0", "browserslist": "^4.28.1", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.19.0", - "es-module-lexer": "^2.0.0", + "enhanced-resolve": "^5.24.2", + "es-module-lexer": "^2.1.0", "eslint-scope": "5.1.1", "events": "^3.2.0", - "glob-to-regexp": "^0.4.1", "graceful-fs": "^4.2.11", - "json-parse-even-better-errors": "^2.3.1", - "loader-runner": "^4.3.1", - "mime-types": "^2.1.27", + "mime-db": "^1.54.0", + "minimizer-webpack-plugin": "^5.6.1", "neo-async": "^2.6.2", "schema-utils": "^4.3.3", "tapable": "^2.3.0", - "terser-webpack-plugin": "^5.3.16", - "watchpack": "^2.5.1", - "webpack-sources": "^3.3.3" + "watchpack": "^2.5.2", + "webpack-sources": "^3.5.1" + }, + "dependencies": { + "mime-db": { + "version": "1.54.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", + "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", + "dev": true + } } }, "webpack-cli": { @@ -7033,9 +6961,9 @@ } }, "webpack-sources": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.3.3.tgz", - "integrity": "sha512-yd1RBzSGanHkitROoPFd6qsrxt+oFhg/129YzheDGqeustzX0vTZJZsSsQjVQC4yzBQ56K55XU8gaNCtIzOnTg==", + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.5.1.tgz", + "integrity": "sha512-jyuiGJdtvY434z5bUZrjz67v76/ePNvFZTp9Mdz29IlH4+GPsgyGjiv0fKI+M7BdkU6ADjulUcKAd3tUK3WlEw==", "dev": true }, "which": { diff --git a/package.json b/package.json index 4cc58328..1420272e 100644 --- a/package.json +++ b/package.json @@ -1211,7 +1211,7 @@ "ts-loader": "^9.4.2", "tslint": "^6.1.3", "typescript": "^4.9.4", - "webpack": "^5.105.0", + "webpack": "^5.109.0", "webpack-cli": "^4.10.0" }, "dependencies": { From db4557499228fc00269e2f522da89cdba7b11d2b Mon Sep 17 00:00:00 2001 From: wenyt <75360946+wenytang-ms@users.noreply.github.com> Date: Thu, 20 Aug 2026 09:46:29 +0800 Subject: [PATCH 342/352] fix: duplicate project roots in multi-root workspaces (#1061) * fix: avoid duplicate project roots in multi-root workspaces * test: use portable multi-root workspace paths * test: cover mixed multi-root project imports * test: make multi-root E2E deterministic * ci: use released AutoTest tree verifier * ci: consume latest AutoTest release * fix: preserve cached workspace roots during transitions * test: wait for workspace folder changes * style: use preferred array type * ci: use preinstalled xvfb-run for UI tests --- .github/workflows/e2eUI.yml | 20 ++-- .../languageServerApiManager.ts | 16 +-- src/views/dependencyDataProvider.ts | 26 ++++- test/e2e-plans/java-dep-project-explorer.yaml | 76 ++++++++++++++ test/index.ts | 11 +++ test/maven-suite/projectView.test.ts | 18 ++++ test/multiple-suite/index.ts | 38 +++++++ test/multiple-suite/projectView.test.ts | 99 +++++++++++++++++++ test/multiple/multiple-project.code-workspace | 9 +- test/non-java/package.json | 4 + 10 files changed, 291 insertions(+), 26 deletions(-) create mode 100644 test/multiple-suite/index.ts create mode 100644 test/multiple-suite/projectView.test.ts create mode 100644 test/non-java/package.json diff --git a/.github/workflows/e2eUI.yml b/.github/workflows/e2eUI.yml index 96855ee7..89264f24 100644 --- a/.github/workflows/e2eUI.yml +++ b/.github/workflows/e2eUI.yml @@ -162,16 +162,6 @@ jobs: steps: - uses: actions/checkout@v4 - - name: Setup Build Environment (Xvfb) - run: | - sudo apt-get update - sudo apt-get install -y libxkbfile-dev pkg-config libsecret-1-dev libxss1 dbus xvfb libgtk-3-0 libgbm1 - # Use 1920x1080 so the Java Projects view (rendered inside the Explorer - # sidebar) gets enough vertical space. With 1024x768 the sticky - # pane-header overlapped tree rows and intercepted click events. - sudo /usr/bin/Xvfb :99 -screen 0 1920x1080x24 > /dev/null 2>&1 & - sleep 3 - - name: Set up JDK 21 uses: actions/setup-java@v4 with: @@ -181,7 +171,7 @@ jobs: - name: Setup Node.js environment uses: actions/setup-node@v4 with: - node-version: 20 + node-version: 22 - name: Setup autotest run: npm install -g @vscjava/vscode-autotest @@ -199,7 +189,9 @@ jobs: AZURE_OPENAI_API_KEY: ${{ secrets.AZURE_OPENAI_API_KEY }} AZURE_OPENAI_DEPLOYMENT: ${{ secrets.AZURE_OPENAI_DEPLOYMENT }} run: | - DISPLAY=:99 autotest run "test/e2e-plans/${{ matrix.plan }}.yaml" \ + # Use 1920x1080 so the Java Projects view gets enough vertical space. + xvfb-run -a -s "-screen 0 1920x1080x24" \ + autotest run "test/e2e-plans/${{ matrix.plan }}.yaml" \ --vsix "$(pwd)/vscode-java-dependency.vsix" \ --output "test-results/${{ matrix.plan }}" @@ -234,7 +226,7 @@ jobs: - name: Setup Node.js environment uses: actions/setup-node@v4 with: - node-version: 20 + node-version: 22 - name: Setup autotest run: npm install -g @vscjava/vscode-autotest @@ -272,7 +264,7 @@ jobs: - name: Setup Node.js environment uses: actions/setup-node@v4 with: - node-version: 20 + node-version: 22 - name: Setup autotest run: npm install -g @vscjava/vscode-autotest diff --git a/src/languageServerApi/languageServerApiManager.ts b/src/languageServerApi/languageServerApiManager.ts index 7affb88c..a89fe4ef 100644 --- a/src/languageServerApi/languageServerApiManager.ts +++ b/src/languageServerApi/languageServerApiManager.ts @@ -116,12 +116,16 @@ class LanguageServerApiManager { // Server is sending project data, so it's definitely running. // Mark as running so ready() returns immediately on subsequent calls. this.isServerRunning = true; - // During import, the JDTLS server is blocked by Eclipse workspace - // operations and cannot respond to queries. Instead of triggering - // a refresh (which queries the server), directly add projects to - // the tree view from the notification data. - const projectUris = uris.map(u => u.toString()); - commands.executeCommand(Commands.VIEW_PACKAGE_INTERNAL_ADD_PROJECTS, projectUris); + if (this.isServerReady) { + commands.executeCommand(Commands.VIEW_PACKAGE_INTERNAL_REFRESH, /* debounce = */true); + } else { + // During import, the JDTLS server is blocked by Eclipse workspace + // operations and cannot respond to queries. Instead of triggering + // a refresh (which queries the server), directly add projects to + // the tree view from the notification data. + const projectUris = uris.map(u => u.toString()); + commands.executeCommand(Commands.VIEW_PACKAGE_INTERNAL_ADD_PROJECTS, projectUris); + } syncHandler.updateFileWatcher(Settings.autoRefresh()); })); } diff --git a/src/views/dependencyDataProvider.ts b/src/views/dependencyDataProvider.ts index 626af103..a8b192d6 100644 --- a/src/views/dependencyDataProvider.ts +++ b/src/views/dependencyDataProvider.ts @@ -2,6 +2,7 @@ // Licensed under the MIT license. import * as _ from "lodash"; +import * as path from "path"; import { commands, Event, EventEmitter, ExtensionContext, ProviderResult, RelativePattern, TreeDataProvider, TreeItem, Uri, window, workspace, @@ -226,7 +227,10 @@ export class DependencyDataProvider implements TreeDataProvider { */ public addProgressiveProjects(projectUris: string[]): void { const folders = workspace.workspaceFolders; - if (!folders || !folders.length) { + // Multi-root workspaces use WorkspaceNode roots. Those roots can remain + // cached briefly after switching to a single folder, so wait for the + // full refresh rather than creating a mixed root structure. + if (!folders || folders.length !== 1 || this._rootItems?.some(root => root instanceof WorkspaceNode)) { return; } @@ -238,11 +242,14 @@ export class DependencyDataProvider implements TreeDataProvider { this._rootItems .filter((n): n is ProjectNode => n instanceof ProjectNode) .map((n) => n.uri) + .filter((uri): uri is string => Boolean(uri)) + .map(getProjectUriKey) ); let added = false; for (const uriStr of projectUris) { - if (existingUris.has(uriStr)) { + const uriKey = getProjectUriKey(uriStr); + if (existingUris.has(uriKey)) { continue; } // Extract project name from URI (last non-empty path segment) @@ -253,7 +260,7 @@ export class DependencyDataProvider implements TreeDataProvider { kind: NodeKind.Project, }; this._rootItems.push(new ProjectNode(nodeData, undefined)); - existingUris.add(uriStr); + existingUris.add(uriKey); added = true; } @@ -308,3 +315,16 @@ export class DependencyDataProvider implements TreeDataProvider { } } } + +function getProjectUriKey(uriString: string): string { + const uri = Uri.parse(uriString); + if (uri.scheme !== "file") { + return uri.toString(); + } + + let fsPath = path.normalize(uri.fsPath); + if (fsPath !== path.parse(fsPath).root) { + fsPath = fsPath.replace(/[\\\/]+$/, ""); + } + return process.platform === "win32" ? fsPath.toLowerCase() : fsPath; +} diff --git a/test/e2e-plans/java-dep-project-explorer.yaml b/test/e2e-plans/java-dep-project-explorer.yaml index 7e198f6b..73854cf6 100644 --- a/test/e2e-plans/java-dep-project-explorer.yaml +++ b/test/e2e-plans/java-dep-project-explorer.yaml @@ -152,3 +152,79 @@ steps: name: "App" exact: true timeout: 15 + + # ── Test 5: mixed multi-root project attribution (#1060) ── + # First establish a mixed workspace and refresh it into WorkspaceNode roots. + # The smoke-test driver renders folder pickers as an internal quick input: + # entering an absolute folder path opens it, then the Add button confirms it. + - id: "invoke-add-non-java-root" + action: "executeVSCodeCommand workbench.action.addRootFolder" + + - id: "type-non-java-root" + action: "fillQuickInput ${workspaceParent}/non-java" + + - id: "confirm-non-java-root" + action: "tryClickButton Add" + + - id: "wait-non-java-root-ready" + action: "waitForLanguageServer" + timeout: 120 + skipLlmVerify: true + + - id: "refresh-mixed-workspace" + action: "executeVSCodeCommand java.view.package.refresh" + waitBefore: 2 + + - id: "collapse-multi-root-explorer" + action: "collapseSidebarSection UNTITLED (WORKSPACE)" + + - id: "focus-mixed-workspace" + action: "executeVSCodeCommand javaProjectExplorer.focus" + waitBefore: 2 + + - id: "verify-non-java-workspace-root" + action: "wait 1 seconds" + verifyTreeItem: + name: "non-java" + timeout: 15 + + # Add a Java folder after the mixed multi-root structure already exists and + # refresh it into the expected WorkspaceNode -> ProjectNode hierarchy. + - id: "invoke-add-java-root" + action: "executeVSCodeCommand workbench.action.addRootFolder" + + - id: "type-java-root" + action: "fillQuickInput ${workspaceParent}/simple" + + - id: "confirm-java-root" + action: "tryClickButton Add" + + - id: "wait-java-root-ready" + action: "waitForLanguageServer" + timeout: 120 + skipLlmVerify: true + + - id: "refresh-added-java-root" + action: "executeVSCodeCommand java.view.package.refresh" + + - id: "verify-java-workspace-root" + action: "executeVSCodeCommand javaProjectExplorer.focus" + verifyTreeItem: + name: "simple" + exact: true + count: 1 + level: 1 + timeout: 15 + + # Deterministically simulate the onDidProjectsImport path. Before #1060 this + # command appended a second top-level ProjectNode named "simple" beside the + # existing WorkspaceNode. The fixed provider ignores progressive insertion + # in multi-root workspaces, so exactly one level-1 row remains. + - id: "simulate-progressive-project-import" + action: 'executeVSCodeCommand _java.view.package.internal.addProjects ["${workspaceParentUri}/simple"]' + verifyTreeItem: + name: "simple" + exact: true + count: 1 + level: 1 + timeout: 15 diff --git a/test/index.ts b/test/index.ts index f9db1d22..a08d7358 100644 --- a/test/index.ts +++ b/test/index.ts @@ -98,6 +98,17 @@ async function main(): Promise { ], }); + // Run multi-root workspace test + await runTests({ + vscodeExecutablePath, + extensionDevelopmentPath, + extensionTestsPath: path.resolve(__dirname, "./multiple-suite"), + launchArgs: [ + path.join(__dirname, "..", "..", "test", "multiple", "multiple-project.code-workspace"), + `--user-data-dir=${userDir}`, + ], + }); + // Run test for non-Java Gradle project (regression test for #921) await runTests({ vscodeExecutablePath, diff --git a/test/maven-suite/projectView.test.ts b/test/maven-suite/projectView.test.ts index c3999802..f5c545f4 100644 --- a/test/maven-suite/projectView.test.ts +++ b/test/maven-suite/projectView.test.ts @@ -277,6 +277,24 @@ suite("Maven Project View Tests", () => { assert.equal(mavenChildren[1].getDisplayName(), "junit:junit:4.13.1"); }); + test("Does not add duplicate progressive projects for equivalent URIs", async function() { + const explorer = DependencyExplorer.getInstance(contextManager.context); + await vscode.commands.executeCommand(Commands.VIEW_PACKAGE_REFRESH); + + const roots = await explorer.dataProvider.getChildren(); + assert.equal(roots?.length, 1, "Number of root nodes should be 1"); + const projectNode = roots![0] as ProjectNode; + assert.ok(projectNode.uri, "Project node should have a URI"); + + const equivalentUri = projectNode.uri!.endsWith("/") + ? projectNode.uri!.replace(/\/+$/, "") + : `${projectNode.uri}/`; + explorer.dataProvider.addProgressiveProjects([equivalentUri]); + + const updatedRoots = await explorer.dataProvider.getChildren(); + assert.equal(updatedRoots?.length, 1, "Equivalent project URIs should be deduplicated"); + }); + teardown(async () => { // Restore default settings. Some tests might alter them and others depend on a specific setting. // Not resetting to the default settings will also show the file as changed in the source control view. diff --git a/test/multiple-suite/index.ts b/test/multiple-suite/index.ts new file mode 100644 index 00000000..cfc957e9 --- /dev/null +++ b/test/multiple-suite/index.ts @@ -0,0 +1,38 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT license. + +import * as glob from "glob"; +import * as Mocha from "mocha"; +import * as path from "path"; + +export function run(): Promise { + const mocha = new Mocha({ + ui: "tdd", + color: true, + timeout: 1 * 60 * 1000, + }); + + const testsRoot = __dirname; + + return new Promise((c, e) => { + glob("**/**.test.js", { cwd: testsRoot }, (err, files) => { + if (err) { + return e(err); + } + + files.forEach((f) => mocha.addFile(path.resolve(testsRoot, f))); + + try { + mocha.run((failures) => { + if (failures > 0) { + e(new Error(`${failures} tests failed.`)); + } else { + c(); + } + }); + } catch (err) { + e(err); + } + }); + }); +} diff --git a/test/multiple-suite/projectView.test.ts b/test/multiple-suite/projectView.test.ts new file mode 100644 index 00000000..2e10c3db --- /dev/null +++ b/test/multiple-suite/projectView.test.ts @@ -0,0 +1,99 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT license. + +import * as assert from "assert"; +import * as vscode from "vscode"; +import { + Commands, contextManager, DependencyExplorer, ProjectNode, WorkspaceNode, +} from "../../extension.bundle"; +import { setupTestEnv } from "../shared"; + +// tslint:disable: only-arrow-functions +suite("Multiple Project View Tests", () => { + + suiteSetup(async () => { + await setupTestEnv(); + const javaExtension = vscode.extensions.getExtension("redhat.java"); + assert.ok(javaExtension, "Language Support for Java should be installed"); + const javaApi = await javaExtension!.activate(); + await javaApi.serverReady(); + await vscode.commands.executeCommand(Commands.VIEW_PACKAGE_REFRESH); + }); + + test("Does not add project roots progressively in a multi-root workspace", async function() { + const explorer = DependencyExplorer.getInstance(contextManager.context); + const roots = await explorer.dataProvider.getChildren(); + const expectedRootCount = vscode.workspace.workspaceFolders?.length || 0; + + assert.equal(roots?.length, expectedRootCount, "Each workspace folder should have one root node"); + assert.ok(roots?.every(root => root instanceof WorkspaceNode), "All roots should be workspace nodes"); + const nonJavaRoot = roots?.find(root => + root instanceof WorkspaceNode && root.name === "non-java") as WorkspaceNode | undefined; + assert.ok(nonJavaRoot, "The non-Java workspace folder should have a root node"); + assert.equal((await nonJavaRoot!.getChildren()).length, 0, "The non-Java root should not contain Java projects"); + + const projects = await explorer.dataProvider.getRootProjects(); + const project = projects.find((node): node is ProjectNode => + node instanceof ProjectNode && Boolean(node.uri)); + assert.ok(project?.uri, "At least one Java project should be available"); + + explorer.dataProvider.addProgressiveProjects([project!.uri!]); + + const updatedRoots = await explorer.dataProvider.getChildren(); + assert.equal(updatedRoots?.length, expectedRootCount, "Progressive updates should not add project roots"); + assert.ok(updatedRoots?.every(root => root instanceof WorkspaceNode), "All roots should remain workspace nodes"); + }); + + test("Does not add project roots while cached multi-root roots are stale", async function() { + const explorer = DependencyExplorer.getInstance(contextManager.context); + const roots = await explorer.dataProvider.getChildren(); + const folders = vscode.workspace.workspaceFolders; + assert.ok(folders && folders.length > 1, "The test requires a multi-root workspace"); + assert.ok(roots?.every(root => root instanceof WorkspaceNode), "All cached roots should be workspace nodes"); + + const projects = await explorer.dataProvider.getRootProjects(); + const project = projects.find((node): node is ProjectNode => + node instanceof ProjectNode && Boolean(node.uri)); + assert.ok(project?.uri, "At least one Java project should be available"); + + const removedFolders = folders!.slice(1); + const workspaceFoldersChanged = updateWorkspaceFoldersAndWait(1, removedFolders.length, [], + "The workspace should switch to a single folder"); + + try { + assert.equal(vscode.workspace.workspaceFolders?.length, 1, "The workspace should have one folder"); + explorer.dataProvider.addProgressiveProjects([project!.uri!]); + + const updatedRoots = await explorer.dataProvider.getChildren(); + assert.equal(updatedRoots?.length, roots?.length, "Stale cached roots should not be mixed with project roots"); + assert.ok(updatedRoots?.every(root => root instanceof WorkspaceNode), + "Cached workspace roots should remain unchanged until refresh"); + } finally { + await workspaceFoldersChanged; + await updateWorkspaceFoldersAndWait(1, 0, + removedFolders.map(folder => ({ uri: folder.uri })), + "The removed workspace folders should be restored"); + } + }); +}); + +async function updateWorkspaceFoldersAndWait( + start: number, + deleteCount: number, + foldersToAdd: { uri: vscode.Uri; name?: string }[], + failureMessage: string, +): Promise { + let resolveChange: () => void; + const changed = new Promise((resolve) => resolveChange = resolve); + const listener = vscode.workspace.onDidChangeWorkspaceFolders(() => { + listener.dispose(); + resolveChange(); + }); + + if (!vscode.workspace.updateWorkspaceFolders(start, deleteCount, ...foldersToAdd)) { + listener.dispose(); + assert.fail(failureMessage); + } + + await changed; +} diff --git a/test/multiple/multiple-project.code-workspace b/test/multiple/multiple-project.code-workspace index 19610b08..6189dcb6 100644 --- a/test/multiple/multiple-project.code-workspace +++ b/test/multiple/multiple-project.code-workspace @@ -1,13 +1,16 @@ { "folders": [ { - "path": "..\\simple" + "path": "../simple" }, { - "path": "..\\maven" + "path": "../maven" }, { - "path": "..\\gradle" + "path": "../gradle" + }, + { + "path": "../non-java" } ], "settings": {} diff --git a/test/non-java/package.json b/test/non-java/package.json new file mode 100644 index 00000000..030de1b7 --- /dev/null +++ b/test/non-java/package.json @@ -0,0 +1,4 @@ +{ + "name": "non-java", + "private": true +} From ac28ac972058a0e78bcf2fb21199c7ba3a4bc34c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 20 Aug 2026 10:15:50 +0800 Subject: [PATCH 343/352] chore(deps): bump @github/copilot-language-server from 1.389.0 to 1.527.5 Bumps [@github/copilot-language-server](https://github.com/github/copilot-language-server-release) from 1.389.0 to 1.527.5. - [Release notes](https://github.com/github/copilot-language-server-release/releases) - [Commits](https://github.com/github/copilot-language-server-release/compare/1.389.0...1.527.5) --- updated-dependencies: - dependency-name: "@github/copilot-language-server" dependency-version: 1.526.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 260 ++++++++++++++++++++++++++++++++++++---------- package.json | 2 +- 2 files changed, 207 insertions(+), 55 deletions(-) diff --git a/package-lock.json b/package-lock.json index 63fc2f0e..62f63144 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,7 +9,7 @@ "version": "0.27.6", "license": "MIT", "dependencies": { - "@github/copilot-language-server": "^1.388.0", + "@github/copilot-language-server": "^1.527.5", "@octokit/rest": "^21.1.1", "await-lock": "^2.2.2", "fmtr": "^1.1.4", @@ -78,11 +78,40 @@ "node": ">=10.0.0" } }, + "node_modules/@github/copilot-darwin-arm64": { + "version": "1.0.70", + "resolved": "https://registry.npmjs.org/@github/copilot-darwin-arm64/-/copilot-darwin-arm64-1.0.70.tgz", + "integrity": "sha512-NewReqBmTxtAzApZNmUsY4Xqy8N086MiQm7k35i9i+WrGyRiHxdZ/n/lMLCkqWoelr7pZhcZ7gQ7fHbEq1KdoQ==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "darwin" + ], + "bin": { + "copilot-darwin-arm64": "copilot" + } + }, + "node_modules/@github/copilot-darwin-x64": { + "version": "1.0.70", + "resolved": "https://registry.npmjs.org/@github/copilot-darwin-x64/-/copilot-darwin-x64-1.0.70.tgz", + "integrity": "sha512-ydUEYI3udNAjdMsLPFQLH/JG9YFKcxuAUxYIyOK+F/m/Of9nODKdYa2hw2mlLanP4cNyuxGLflu+rtIqIb+cPw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "darwin" + ], + "bin": { + "copilot-darwin-x64": "copilot" + } + }, "node_modules/@github/copilot-language-server": { - "version": "1.389.0", - "resolved": "https://registry.npmjs.org/@github/copilot-language-server/-/copilot-language-server-1.389.0.tgz", - "integrity": "sha512-GLuqlJNesnA13OkijEaV/bATgRDnzFsp83TGYfhM8hbI+4Ilpb3GqrRpk9Z1jpvcLnZOk04fVqJ2+dK3brRgPg==", - "license": "MIT", + "version": "1.527.5", + "resolved": "https://registry.npmjs.org/@github/copilot-language-server/-/copilot-language-server-1.527.5.tgz", + "integrity": "sha512-0p2pCd6bqTORsyLxtGCcu/u5TkkFjjnFCJ386Os/rNsMTYJ45QgiU76Mz2bQJi4NNOjrirCQhboKhZSDsCOsJQ==", "dependencies": { "vscode-languageserver-protocol": "^3.17.5" }, @@ -90,78 +119,152 @@ "copilot-language-server": "dist/language-server.js" }, "optionalDependencies": { - "@github/copilot-language-server-darwin-arm64": "1.389.0", - "@github/copilot-language-server-darwin-x64": "1.389.0", - "@github/copilot-language-server-linux-arm64": "1.389.0", - "@github/copilot-language-server-linux-x64": "1.389.0", - "@github/copilot-language-server-win32-x64": "1.389.0" + "@github/copilot-darwin-arm64": "1.0.70", + "@github/copilot-darwin-x64": "1.0.70", + "@github/copilot-language-server-darwin-arm64": "1.527.5", + "@github/copilot-language-server-darwin-x64": "1.527.5", + "@github/copilot-language-server-linux-arm64": "1.527.5", + "@github/copilot-language-server-linux-x64": "1.527.5", + "@github/copilot-language-server-win32-arm64": "1.527.5", + "@github/copilot-language-server-win32-x64": "1.527.5", + "@github/copilot-linux-arm64": "1.0.70", + "@github/copilot-linux-x64": "1.0.70", + "@github/copilot-win32-arm64": "1.0.70", + "@github/copilot-win32-x64": "1.0.70" } }, "node_modules/@github/copilot-language-server-darwin-arm64": { - "version": "1.389.0", - "resolved": "https://registry.npmjs.org/@github/copilot-language-server-darwin-arm64/-/copilot-language-server-darwin-arm64-1.389.0.tgz", - "integrity": "sha512-Sx+8U4rLixBYS7UgqBBiHM73VyhbrcQhfaHg8ZyezmiEXV+ohNKpCIerFoepUrjmxgqRhx1DZrouk90cILb4aA==", + "version": "1.527.5", + "resolved": "https://registry.npmjs.org/@github/copilot-language-server-darwin-arm64/-/copilot-language-server-darwin-arm64-1.527.5.tgz", + "integrity": "sha512-rw1vq0vUbRGo+m/00yaRvAfK5CPM1fl6TCs+LyrZ272dxzD9Rh/BTrp0x8p4UqepctQsIyK5Js4MxPPvkz9PxA==", "cpu": [ "arm64" ], - "license": "MIT", "optional": true, "os": [ "darwin" ] }, "node_modules/@github/copilot-language-server-darwin-x64": { - "version": "1.389.0", - "resolved": "https://registry.npmjs.org/@github/copilot-language-server-darwin-x64/-/copilot-language-server-darwin-x64-1.389.0.tgz", - "integrity": "sha512-tiuNcZSrtv94arAfn2E1xFt8wVUvvRMAgCtNezq45L+oIe2+SY5SS+3EXhM0lracNPp+cJc1VrKoxn0buH1Cxw==", + "version": "1.527.5", + "resolved": "https://registry.npmjs.org/@github/copilot-language-server-darwin-x64/-/copilot-language-server-darwin-x64-1.527.5.tgz", + "integrity": "sha512-H1Pc+Bb6C379EeFIp7nOMX2ZWiOdu6vkCA4ty1EmKkVG0RFCtSAPvM1LwP/Ysbfv8sidsXKCopNMN3ur5o3mjw==", "cpu": [ "x64" ], - "license": "MIT", "optional": true, "os": [ "darwin" ] }, "node_modules/@github/copilot-language-server-linux-arm64": { - "version": "1.389.0", - "resolved": "https://registry.npmjs.org/@github/copilot-language-server-linux-arm64/-/copilot-language-server-linux-arm64-1.389.0.tgz", - "integrity": "sha512-T/vgrbUOzmqEmlBF8LhwFX8ciBJOszNaiR4yPvEVT5+2wV1Jcnpk8C5QuKJ9xvryjDDlqoWowOF9UuB0PNJWYA==", + "version": "1.527.5", + "resolved": "https://registry.npmjs.org/@github/copilot-language-server-linux-arm64/-/copilot-language-server-linux-arm64-1.527.5.tgz", + "integrity": "sha512-LZlMlA7tUTMpmUoEqHsDsVA1p3P/pPOw02QLexx2aFFnSaOEAIFMA2hDuYtKWFt2cO1E7p95IlkQCdXXr5mMEg==", "cpu": [ "arm64" ], - "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@github/copilot-language-server-linux-x64": { - "version": "1.389.0", - "resolved": "https://registry.npmjs.org/@github/copilot-language-server-linux-x64/-/copilot-language-server-linux-x64-1.389.0.tgz", - "integrity": "sha512-nKHoOzYJx0IzaHFXRzfD2djyg0YYZYX1UPu4hr6uAAa3ilI5jcYGJTb9MUYWZbemLTnU4tbWuBbv5aFVKTe4iw==", + "version": "1.527.5", + "resolved": "https://registry.npmjs.org/@github/copilot-language-server-linux-x64/-/copilot-language-server-linux-x64-1.527.5.tgz", + "integrity": "sha512-YLusnRHbF/uw7R5Y5nDwR1ai9PzGtirAZHxKKO5nFFs5EaZX80CeLk9OqPZ6TegXb2Bqm7hJfSp94gvthHPyxQ==", "cpu": [ "x64" ], - "license": "MIT", "optional": true, "os": [ "linux" ] }, + "node_modules/@github/copilot-language-server-win32-arm64": { + "version": "1.527.5", + "resolved": "https://registry.npmjs.org/@github/copilot-language-server-win32-arm64/-/copilot-language-server-win32-arm64-1.527.5.tgz", + "integrity": "sha512-Zgo3uh46DTRDVTVEf5tp0RJO+MhBykdXpZn7TvCLdu5GHzgqBX6tt7RYYMi9LP8hl5v5nVZMFB3jKEiJYuAoRw==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "win32" + ] + }, "node_modules/@github/copilot-language-server-win32-x64": { - "version": "1.389.0", - "resolved": "https://registry.npmjs.org/@github/copilot-language-server-win32-x64/-/copilot-language-server-win32-x64-1.389.0.tgz", - "integrity": "sha512-BAXL4tBLZc0+igST0Phal6ROQmH2rbjfLqd/ok8T1nmSGBfGddvEGh6oZHLUS6HuT26VilB/UG/wvp/yodyowQ==", + "version": "1.527.5", + "resolved": "https://registry.npmjs.org/@github/copilot-language-server-win32-x64/-/copilot-language-server-win32-x64-1.527.5.tgz", + "integrity": "sha512-xO2y5p6lYZmMXHGeEqgIXQ8N2kQnvARHDypHiF95twDzNCjXiXDso9IltbLZVGDMG7NQyagZxYvnRqbI1Z17dg==", "cpu": [ "x64" ], - "license": "MIT", "optional": true, "os": [ "win32" ] }, + "node_modules/@github/copilot-linux-arm64": { + "version": "1.0.70", + "resolved": "https://registry.npmjs.org/@github/copilot-linux-arm64/-/copilot-linux-arm64-1.0.70.tgz", + "integrity": "sha512-EpR3VEEqMy5M9t3cs+6FtjX/AhyfoefzmcMAjBls+RGv1fILjaAby+rhKHzX5YVSxOu9OyQDlQVHK3kxznTU5Q==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "bin": { + "copilot-linux-arm64": "copilot" + } + }, + "node_modules/@github/copilot-linux-x64": { + "version": "1.0.70", + "resolved": "https://registry.npmjs.org/@github/copilot-linux-x64/-/copilot-linux-x64-1.0.70.tgz", + "integrity": "sha512-4pyNKunm7GEzQZ+09Dwr4BwixJVNcQGBeqiZPKWBGxcSipwj90t8tidLYdNjgmXJoLerANhXZcY52wJW/HubEA==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "bin": { + "copilot-linux-x64": "copilot" + } + }, + "node_modules/@github/copilot-win32-arm64": { + "version": "1.0.70", + "resolved": "https://registry.npmjs.org/@github/copilot-win32-arm64/-/copilot-win32-arm64-1.0.70.tgz", + "integrity": "sha512-oWsWCTlUyIv4S3FdYoBNCscndLrUv+C3qgbfJ9mf+5igPqbIYL8alkc8FBHWPB/cornDNj65yd4s8dZrSkFPpg==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "win32" + ], + "bin": { + "copilot-win32-arm64": "copilot.exe" + } + }, + "node_modules/@github/copilot-win32-x64": { + "version": "1.0.70", + "resolved": "https://registry.npmjs.org/@github/copilot-win32-x64/-/copilot-win32-x64-1.0.70.tgz", + "integrity": "sha512-KFDZ750CwhjKF6uATQ1pv1XrYHI+/qTQta954gYZaa+YJEXRstGd284uJ6NI3YXfshZwhTs64JdjN4xLodYwrA==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "win32" + ], + "bin": { + "copilot-win32-x64": "copilot.exe" + } + }, "node_modules/@isaacs/cliui": { "version": "8.0.2", "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", @@ -4181,47 +4284,96 @@ "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", "dev": true }, + "@github/copilot-darwin-arm64": { + "version": "1.0.70", + "resolved": "https://registry.npmjs.org/@github/copilot-darwin-arm64/-/copilot-darwin-arm64-1.0.70.tgz", + "integrity": "sha512-NewReqBmTxtAzApZNmUsY4Xqy8N086MiQm7k35i9i+WrGyRiHxdZ/n/lMLCkqWoelr7pZhcZ7gQ7fHbEq1KdoQ==", + "optional": true + }, + "@github/copilot-darwin-x64": { + "version": "1.0.70", + "resolved": "https://registry.npmjs.org/@github/copilot-darwin-x64/-/copilot-darwin-x64-1.0.70.tgz", + "integrity": "sha512-ydUEYI3udNAjdMsLPFQLH/JG9YFKcxuAUxYIyOK+F/m/Of9nODKdYa2hw2mlLanP4cNyuxGLflu+rtIqIb+cPw==", + "optional": true + }, "@github/copilot-language-server": { - "version": "1.389.0", - "resolved": "https://registry.npmjs.org/@github/copilot-language-server/-/copilot-language-server-1.389.0.tgz", - "integrity": "sha512-GLuqlJNesnA13OkijEaV/bATgRDnzFsp83TGYfhM8hbI+4Ilpb3GqrRpk9Z1jpvcLnZOk04fVqJ2+dK3brRgPg==", - "requires": { - "@github/copilot-language-server-darwin-arm64": "1.389.0", - "@github/copilot-language-server-darwin-x64": "1.389.0", - "@github/copilot-language-server-linux-arm64": "1.389.0", - "@github/copilot-language-server-linux-x64": "1.389.0", - "@github/copilot-language-server-win32-x64": "1.389.0", + "version": "1.527.5", + "resolved": "https://registry.npmjs.org/@github/copilot-language-server/-/copilot-language-server-1.527.5.tgz", + "integrity": "sha512-0p2pCd6bqTORsyLxtGCcu/u5TkkFjjnFCJ386Os/rNsMTYJ45QgiU76Mz2bQJi4NNOjrirCQhboKhZSDsCOsJQ==", + "requires": { + "@github/copilot-darwin-arm64": "1.0.70", + "@github/copilot-darwin-x64": "1.0.70", + "@github/copilot-language-server-darwin-arm64": "1.527.5", + "@github/copilot-language-server-darwin-x64": "1.527.5", + "@github/copilot-language-server-linux-arm64": "1.527.5", + "@github/copilot-language-server-linux-x64": "1.527.5", + "@github/copilot-language-server-win32-arm64": "1.527.5", + "@github/copilot-language-server-win32-x64": "1.527.5", + "@github/copilot-linux-arm64": "1.0.70", + "@github/copilot-linux-x64": "1.0.70", + "@github/copilot-win32-arm64": "1.0.70", + "@github/copilot-win32-x64": "1.0.70", "vscode-languageserver-protocol": "^3.17.5" } }, "@github/copilot-language-server-darwin-arm64": { - "version": "1.389.0", - "resolved": "https://registry.npmjs.org/@github/copilot-language-server-darwin-arm64/-/copilot-language-server-darwin-arm64-1.389.0.tgz", - "integrity": "sha512-Sx+8U4rLixBYS7UgqBBiHM73VyhbrcQhfaHg8ZyezmiEXV+ohNKpCIerFoepUrjmxgqRhx1DZrouk90cILb4aA==", + "version": "1.527.5", + "resolved": "https://registry.npmjs.org/@github/copilot-language-server-darwin-arm64/-/copilot-language-server-darwin-arm64-1.527.5.tgz", + "integrity": "sha512-rw1vq0vUbRGo+m/00yaRvAfK5CPM1fl6TCs+LyrZ272dxzD9Rh/BTrp0x8p4UqepctQsIyK5Js4MxPPvkz9PxA==", "optional": true }, "@github/copilot-language-server-darwin-x64": { - "version": "1.389.0", - "resolved": "https://registry.npmjs.org/@github/copilot-language-server-darwin-x64/-/copilot-language-server-darwin-x64-1.389.0.tgz", - "integrity": "sha512-tiuNcZSrtv94arAfn2E1xFt8wVUvvRMAgCtNezq45L+oIe2+SY5SS+3EXhM0lracNPp+cJc1VrKoxn0buH1Cxw==", + "version": "1.527.5", + "resolved": "https://registry.npmjs.org/@github/copilot-language-server-darwin-x64/-/copilot-language-server-darwin-x64-1.527.5.tgz", + "integrity": "sha512-H1Pc+Bb6C379EeFIp7nOMX2ZWiOdu6vkCA4ty1EmKkVG0RFCtSAPvM1LwP/Ysbfv8sidsXKCopNMN3ur5o3mjw==", "optional": true }, "@github/copilot-language-server-linux-arm64": { - "version": "1.389.0", - "resolved": "https://registry.npmjs.org/@github/copilot-language-server-linux-arm64/-/copilot-language-server-linux-arm64-1.389.0.tgz", - "integrity": "sha512-T/vgrbUOzmqEmlBF8LhwFX8ciBJOszNaiR4yPvEVT5+2wV1Jcnpk8C5QuKJ9xvryjDDlqoWowOF9UuB0PNJWYA==", + "version": "1.527.5", + "resolved": "https://registry.npmjs.org/@github/copilot-language-server-linux-arm64/-/copilot-language-server-linux-arm64-1.527.5.tgz", + "integrity": "sha512-LZlMlA7tUTMpmUoEqHsDsVA1p3P/pPOw02QLexx2aFFnSaOEAIFMA2hDuYtKWFt2cO1E7p95IlkQCdXXr5mMEg==", "optional": true }, "@github/copilot-language-server-linux-x64": { - "version": "1.389.0", - "resolved": "https://registry.npmjs.org/@github/copilot-language-server-linux-x64/-/copilot-language-server-linux-x64-1.389.0.tgz", - "integrity": "sha512-nKHoOzYJx0IzaHFXRzfD2djyg0YYZYX1UPu4hr6uAAa3ilI5jcYGJTb9MUYWZbemLTnU4tbWuBbv5aFVKTe4iw==", + "version": "1.527.5", + "resolved": "https://registry.npmjs.org/@github/copilot-language-server-linux-x64/-/copilot-language-server-linux-x64-1.527.5.tgz", + "integrity": "sha512-YLusnRHbF/uw7R5Y5nDwR1ai9PzGtirAZHxKKO5nFFs5EaZX80CeLk9OqPZ6TegXb2Bqm7hJfSp94gvthHPyxQ==", + "optional": true + }, + "@github/copilot-language-server-win32-arm64": { + "version": "1.527.5", + "resolved": "https://registry.npmjs.org/@github/copilot-language-server-win32-arm64/-/copilot-language-server-win32-arm64-1.527.5.tgz", + "integrity": "sha512-Zgo3uh46DTRDVTVEf5tp0RJO+MhBykdXpZn7TvCLdu5GHzgqBX6tt7RYYMi9LP8hl5v5nVZMFB3jKEiJYuAoRw==", "optional": true }, "@github/copilot-language-server-win32-x64": { - "version": "1.389.0", - "resolved": "https://registry.npmjs.org/@github/copilot-language-server-win32-x64/-/copilot-language-server-win32-x64-1.389.0.tgz", - "integrity": "sha512-BAXL4tBLZc0+igST0Phal6ROQmH2rbjfLqd/ok8T1nmSGBfGddvEGh6oZHLUS6HuT26VilB/UG/wvp/yodyowQ==", + "version": "1.527.5", + "resolved": "https://registry.npmjs.org/@github/copilot-language-server-win32-x64/-/copilot-language-server-win32-x64-1.527.5.tgz", + "integrity": "sha512-xO2y5p6lYZmMXHGeEqgIXQ8N2kQnvARHDypHiF95twDzNCjXiXDso9IltbLZVGDMG7NQyagZxYvnRqbI1Z17dg==", + "optional": true + }, + "@github/copilot-linux-arm64": { + "version": "1.0.70", + "resolved": "https://registry.npmjs.org/@github/copilot-linux-arm64/-/copilot-linux-arm64-1.0.70.tgz", + "integrity": "sha512-EpR3VEEqMy5M9t3cs+6FtjX/AhyfoefzmcMAjBls+RGv1fILjaAby+rhKHzX5YVSxOu9OyQDlQVHK3kxznTU5Q==", + "optional": true + }, + "@github/copilot-linux-x64": { + "version": "1.0.70", + "resolved": "https://registry.npmjs.org/@github/copilot-linux-x64/-/copilot-linux-x64-1.0.70.tgz", + "integrity": "sha512-4pyNKunm7GEzQZ+09Dwr4BwixJVNcQGBeqiZPKWBGxcSipwj90t8tidLYdNjgmXJoLerANhXZcY52wJW/HubEA==", + "optional": true + }, + "@github/copilot-win32-arm64": { + "version": "1.0.70", + "resolved": "https://registry.npmjs.org/@github/copilot-win32-arm64/-/copilot-win32-arm64-1.0.70.tgz", + "integrity": "sha512-oWsWCTlUyIv4S3FdYoBNCscndLrUv+C3qgbfJ9mf+5igPqbIYL8alkc8FBHWPB/cornDNj65yd4s8dZrSkFPpg==", + "optional": true + }, + "@github/copilot-win32-x64": { + "version": "1.0.70", + "resolved": "https://registry.npmjs.org/@github/copilot-win32-x64/-/copilot-win32-x64-1.0.70.tgz", + "integrity": "sha512-KFDZ750CwhjKF6uATQ1pv1XrYHI+/qTQta954gYZaa+YJEXRstGd284uJ6NI3YXfshZwhTs64JdjN4xLodYwrA==", "optional": true }, "@isaacs/cliui": { diff --git a/package.json b/package.json index 1420272e..64dbce31 100644 --- a/package.json +++ b/package.json @@ -1215,7 +1215,7 @@ "webpack-cli": "^4.10.0" }, "dependencies": { - "@github/copilot-language-server": "^1.388.0", + "@github/copilot-language-server": "^1.527.5", "@octokit/rest": "^21.1.1", "await-lock": "^2.2.2", "fmtr": "^1.1.4", From baca063a3d0aa7de38014b06f54e36d3ca439801 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 20 Aug 2026 10:29:17 +0800 Subject: [PATCH 344/352] chore(deps): bump brace-expansion (#1051) Bump brace-expansion from 2.0.3 to 2.1.4 and 1.1.13 to 1.1.18. --- package-lock.json | 36 ++++++++++++++++++------------------ 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/package-lock.json b/package-lock.json index 62f63144..00d2074c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1209,9 +1209,9 @@ "integrity": "sha512-Nik3Sc0ncrMK4UUdXQmAnRtzmNQTAAXmXIopizwZ1W1t8QmfJj+zL4OA2I7XPTPW5z5TDqv4hRo/JzouDJnX3A==" }, "node_modules/brace-expansion": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.3.tgz", - "integrity": "sha512-MCV/fYJEbqx68aE58kv2cA/kiky1G8vux3OR6/jbS+jIMe/6fJWa0DTzJU7dqijOWYwHi1t29FlfYI9uytqlpA==", + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.4.tgz", + "integrity": "sha512-hGfVzPxthbf3+2yjg/RBs60cB0FhqBS/zvdV/4wn4/BmN0bNMMHPc4V/BbFieqf1TKAGGAHnY4eSjajCl0f2Xg==", "dependencies": { "balanced-match": "^1.0.0" } @@ -2065,9 +2065,9 @@ } }, "node_modules/glob/node_modules/brace-expansion": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.13.tgz", - "integrity": "sha512-9ZLprWS6EENmhEOpjCYW2c8VkmOvckIJZfkr7rBW6dObmfgJ/L1GpSYW5Hpo9lDz4D1+n0Ckz8rU7FwHDQiG/w==", + "version": "1.1.18", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.18.tgz", + "integrity": "sha512-Edep/X9fGqVNmzKBVsDYIOtD+z1tuezV70LBjdCst9Tqu76lsnvRiZ6oTic1n+/BIwX6QDGAO94PN4N2SADvtw==", "dev": true, "dependencies": { "balanced-match": "^1.0.0", @@ -3719,9 +3719,9 @@ } }, "node_modules/tslint/node_modules/brace-expansion": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.13.tgz", - "integrity": "sha512-9ZLprWS6EENmhEOpjCYW2c8VkmOvckIJZfkr7rBW6dObmfgJ/L1GpSYW5Hpo9lDz4D1+n0Ckz8rU7FwHDQiG/w==", + "version": "1.1.18", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.18.tgz", + "integrity": "sha512-Edep/X9fGqVNmzKBVsDYIOtD+z1tuezV70LBjdCst9Tqu76lsnvRiZ6oTic1n+/BIwX6QDGAO94PN4N2SADvtw==", "dev": true, "dependencies": { "balanced-match": "^1.0.0", @@ -5146,9 +5146,9 @@ "integrity": "sha512-Nik3Sc0ncrMK4UUdXQmAnRtzmNQTAAXmXIopizwZ1W1t8QmfJj+zL4OA2I7XPTPW5z5TDqv4hRo/JzouDJnX3A==" }, "brace-expansion": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.3.tgz", - "integrity": "sha512-MCV/fYJEbqx68aE58kv2cA/kiky1G8vux3OR6/jbS+jIMe/6fJWa0DTzJU7dqijOWYwHi1t29FlfYI9uytqlpA==", + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.4.tgz", + "integrity": "sha512-hGfVzPxthbf3+2yjg/RBs60cB0FhqBS/zvdV/4wn4/BmN0bNMMHPc4V/BbFieqf1TKAGGAHnY4eSjajCl0f2Xg==", "requires": { "balanced-match": "^1.0.0" } @@ -5713,9 +5713,9 @@ }, "dependencies": { "brace-expansion": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.13.tgz", - "integrity": "sha512-9ZLprWS6EENmhEOpjCYW2c8VkmOvckIJZfkr7rBW6dObmfgJ/L1GpSYW5Hpo9lDz4D1+n0Ckz8rU7FwHDQiG/w==", + "version": "1.1.18", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.18.tgz", + "integrity": "sha512-Edep/X9fGqVNmzKBVsDYIOtD+z1tuezV70LBjdCst9Tqu76lsnvRiZ6oTic1n+/BIwX6QDGAO94PN4N2SADvtw==", "dev": true, "requires": { "balanced-match": "^1.0.0", @@ -6833,9 +6833,9 @@ } }, "brace-expansion": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.13.tgz", - "integrity": "sha512-9ZLprWS6EENmhEOpjCYW2c8VkmOvckIJZfkr7rBW6dObmfgJ/L1GpSYW5Hpo9lDz4D1+n0Ckz8rU7FwHDQiG/w==", + "version": "1.1.18", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.18.tgz", + "integrity": "sha512-Edep/X9fGqVNmzKBVsDYIOtD+z1tuezV70LBjdCst9Tqu76lsnvRiZ6oTic1n+/BIwX6QDGAO94PN4N2SADvtw==", "dev": true, "requires": { "balanced-match": "^1.0.0", From af0b26ef1d1e093064d26d862bc700a0e1f01b15 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 20 Aug 2026 11:20:49 +0800 Subject: [PATCH 345/352] chore(deps-dev): bump ts-loader from 9.5.1 to 9.6.2 Bumps [ts-loader](https://github.com/TypeStrong/ts-loader) from 9.5.1 to 9.6.2. - [Release notes](https://github.com/TypeStrong/ts-loader/releases) - [Changelog](https://github.com/TypeStrong/ts-loader/blob/main/CHANGELOG.md) - [Commits](https://github.com/TypeStrong/ts-loader/compare/v9.5.1...v9.6.2) --- updated-dependencies: - dependency-name: ts-loader dependency-version: 9.6.2 dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 48 +++++++++++++++++++++++++++++++++-------------- package.json | 2 +- 2 files changed, 35 insertions(+), 15 deletions(-) diff --git a/package-lock.json b/package-lock.json index 00d2074c..2b48f3a4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -34,7 +34,7 @@ "copy-webpack-plugin": "^11.0.0", "glob": "^7.2.3", "mocha": "^11.7.5", - "ts-loader": "^9.4.2", + "ts-loader": "^9.6.2", "tslint": "^6.1.3", "typescript": "^4.9.4", "webpack": "^5.109.0", @@ -3633,23 +3633,39 @@ } }, "node_modules/ts-loader": { - "version": "9.5.1", - "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.5.1.tgz", - "integrity": "sha512-rNH3sK9kGZcH9dYzC7CewQm4NtxJTjSEVRJ2DyBZR7f8/wcta+iV44UPCXc5+nzDzivKtlzV6c9P4e+oFhDLYg==", + "version": "9.6.2", + "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.6.2.tgz", + "integrity": "sha512-R4iuczmtgxvtuI556s+hTZ6/7Ee03VCAk/l/M8LY1OAsUgB7YydsCxkgq9D9pKRaD7GJqUi2u8fp9zZP/ufjKA==", "dev": true, "dependencies": { "chalk": "^4.1.0", - "enhanced-resolve": "^5.0.0", - "micromatch": "^4.0.0", - "semver": "^7.3.4", + "picomatch": "^4.0.0", "source-map": "^0.7.4" }, "engines": { "node": ">=12.0.0" }, "peerDependencies": { + "loader-utils": "*", "typescript": "*", - "webpack": "^5.0.0" + "webpack": "^4.0.0 || ^5.0.0" + }, + "peerDependenciesMeta": { + "loader-utils": { + "optional": true + } + } + }, + "node_modules/ts-loader/node_modules/picomatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.5.tgz", + "integrity": "sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" } }, "node_modules/ts-loader/node_modules/source-map": { @@ -6768,18 +6784,22 @@ } }, "ts-loader": { - "version": "9.5.1", - "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.5.1.tgz", - "integrity": "sha512-rNH3sK9kGZcH9dYzC7CewQm4NtxJTjSEVRJ2DyBZR7f8/wcta+iV44UPCXc5+nzDzivKtlzV6c9P4e+oFhDLYg==", + "version": "9.6.2", + "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.6.2.tgz", + "integrity": "sha512-R4iuczmtgxvtuI556s+hTZ6/7Ee03VCAk/l/M8LY1OAsUgB7YydsCxkgq9D9pKRaD7GJqUi2u8fp9zZP/ufjKA==", "dev": true, "requires": { "chalk": "^4.1.0", - "enhanced-resolve": "^5.0.0", - "micromatch": "^4.0.0", - "semver": "^7.3.4", + "picomatch": "^4.0.0", "source-map": "^0.7.4" }, "dependencies": { + "picomatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.5.tgz", + "integrity": "sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==", + "dev": true + }, "source-map": { "version": "0.7.4", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", diff --git a/package.json b/package.json index 64dbce31..3b6d48df 100644 --- a/package.json +++ b/package.json @@ -1208,7 +1208,7 @@ "copy-webpack-plugin": "^11.0.0", "glob": "^7.2.3", "mocha": "^11.7.5", - "ts-loader": "^9.4.2", + "ts-loader": "^9.6.2", "tslint": "^6.1.3", "typescript": "^4.9.4", "webpack": "^5.109.0", From 6d43dfb659b81ce3464ac7b289628a0d8e3a244b Mon Sep 17 00:00:00 2001 From: wenyt <75360946+wenytang-ms@users.noreply.github.com> Date: Thu, 20 Aug 2026 12:24:03 +0800 Subject: [PATCH 346/352] fix: hide empty non-Java folder ancestors (#1063) * fix: hide empty non-Java folder ancestors * test: cover empty non-Java folder ancestors * fix: limit empty folder filtering to source roots * fix: preserve empty non-Java source siblings --- .../jdtls/ext/core/parser/ResourceSet.java | 50 +++++++++++++++- test/e2e-plans/java-dep-view-modes.yaml | 41 +++++++++++++ test/maven-suite/projectView.test.ts | 57 ++++++++++++++++++- test/maven/src/main/resources/application.yml | 3 + test/simple-suite/projectView.test.ts | 7 ++- 5 files changed, 154 insertions(+), 4 deletions(-) create mode 100644 test/maven/src/main/resources/application.yml diff --git a/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/parser/ResourceSet.java b/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/parser/ResourceSet.java index dde7eec5..55bfeb89 100644 --- a/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/parser/ResourceSet.java +++ b/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/parser/ResourceSet.java @@ -16,6 +16,7 @@ import java.util.Objects; import org.eclipse.core.internal.utils.FileUtil; +import org.eclipse.core.resources.IContainer; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IFolder; import org.eclipse.core.resources.IProject; @@ -109,7 +110,9 @@ public void accept(ResourceVisitor visitor) { visitor.visit((IFile) resource); } } else if (resource instanceof IFolder) { - if (shouldVisit((IFolder) resource)) { + if (shouldVisit((IFolder) resource) + && (!containsSourceClasspathEntry((IFolder) resource) + || hasVisibleNonJavaResources((IFolder) resource))) { visitor.visit((IFolder) resource); } } else if (resource instanceof IJarEntryResource) { @@ -152,4 +155,49 @@ private boolean shouldVisit(IResource resource) { return JavaCore.create(resource) == null; } + + private boolean containsSourceClasspathEntry(IContainer container) { + try { + IJavaProject javaProject = JavaCore.create(container.getProject()); + if (javaProject == null) { + return false; + } + IPath containerPath = container.getFullPath(); + if (containerPath.equals(javaProject.getOutputLocation())) { + return false; + } + for (IClasspathEntry entry : javaProject.getRawClasspath()) { + if (entry.getEntryKind() == IClasspathEntry.CPE_SOURCE + && containerPath.isPrefixOf(entry.getPath())) { + return true; + } + } + } catch (CoreException e) { + JdtlsExtActivator.logException("Failed to inspect Java source entries", e); + } + return false; + } + + private boolean hasVisibleNonJavaResources(IContainer container) { + try { + for (IResource member : container.members()) { + if (JavaCore.create(member) != null) { + continue; + } + if (member instanceof IFile) { + return true; + } + if (member instanceof IContainer) { + IContainer child = (IContainer) member; + if (!containsSourceClasspathEntry(child) || hasVisibleNonJavaResources(child)) { + return true; + } + } + } + } catch (CoreException e) { + JdtlsExtActivator.logException("Failed to inspect non-Java resources", e); + return true; + } + return false; + } } diff --git a/test/e2e-plans/java-dep-view-modes.yaml b/test/e2e-plans/java-dep-view-modes.yaml index 51f4f258..85ff1ee5 100644 --- a/test/e2e-plans/java-dep-view-modes.yaml +++ b/test/e2e-plans/java-dep-view-modes.yaml @@ -222,3 +222,44 @@ steps: exact: true inView: "Java Projects" timeout: 30 + + # ── Test 6: do not show empty physical ancestors of package roots (#1062) ── + # src/main/java and src/main/resources are represented as Java package roots. + # The physical src → main hierarchy must not also appear as an empty normal + # folder tree when non-Java resources are shown. + - id: "reset-tree-for-non-java-ancestor-check" + action: "executeVSCodeCommand workbench.actions.treeView.javaProjectExplorer.collapseAll" + + - id: "expand-project-for-non-java-ancestor-check" + action: "expandTreeItem my-app" + waitBefore: 2 + + - id: "verify-resources-root-visible" + action: "wait 1 seconds" + verifyTreeItem: + name: "src/main/resources" + exact: true + level: 2 + inView: "Java Projects" + timeout: 15 + + - id: "expand-resources-root" + action: "expandTreeItem src/main/resources" + + - id: "verify-resource-file-visible" + action: "wait 1 seconds" + verifyTreeItem: + name: "application.yml" + exact: true + inView: "Java Projects" + timeout: 15 + + - id: "verify-empty-physical-src-hidden" + action: "wait 1 seconds" + verifyTreeItem: + name: "src" + exact: true + level: 2 + visible: false + inView: "Java Projects" + timeout: 15 diff --git a/test/maven-suite/projectView.test.ts b/test/maven-suite/projectView.test.ts index f5c545f4..ff3c5db5 100644 --- a/test/maven-suite/projectView.test.ts +++ b/test/maven-suite/projectView.test.ts @@ -3,7 +3,7 @@ import * as assert from "assert"; import * as vscode from "vscode"; -import { Commands, ContainerNode, contextManager, DataNode, DependencyExplorer, FileNode, +import { Commands, ContainerNode, contextManager, DataNode, DependencyExplorer, FileNode, FolderNode, INodeData, Jdtls, languageServerApiManager, NodeKind, PackageNode, PackageRootNode, PrimaryTypeNode, ProjectNode } from "../../extension.bundle"; import { fsPath, printNodes, setupTestEnv, Uris } from "../shared"; @@ -247,6 +247,61 @@ suite("Maven Project View Tests", () => { assert.ok(!projectChildren.find((node: DataNode) => node.nodeData.name === ".hidden")); }); + test("Does not display empty physical ancestors of Java package roots", async function() { + const explorer = DependencyExplorer.getInstance(contextManager.context); + const projectNode = (await explorer.dataProvider.getChildren())![0] as ProjectNode; + const projectChildren = await projectNode.getChildren(); + + assert.ok(!projectChildren.find((node: DataNode) => node.nodeData.name === "src"), + "The physical src folder should not duplicate Java package roots"); + + const resourcesRoot = projectChildren.find((node: DataNode) => + node.nodeData.name === "src/main/resources") as PackageRootNode; + assert.ok(resourcesRoot, "The Maven resources root should remain visible"); + const resourceChildren = await resourcesRoot.getChildren(); + assert.ok(resourceChildren.find((node: DataNode) => node.nodeData.name === "application.yml"), + "Non-Java files under the resources root should remain visible"); + }); + + test("Displays empty non-Java folders next to Java package roots", async function() { + const explorer = DependencyExplorer.getInstance(contextManager.context); + const projectNode = (await explorer.dataProvider.getChildren())![0] as ProjectNode; + const initialChildren = await projectNode.getChildren(); + const mainSourceRoot = initialChildren.find((node: DataNode) => + node.nodeData.name === "src/main/java") as PackageRootNode; + const srcPath = mainSourceRoot.nodeData.path!.replace(/\/main\/java$/, ""); + const docsUri = vscode.Uri.joinPath(vscode.Uri.file(Uris.MAVEN_PROJECT_NODE), "src", "docs"); + await vscode.workspace.fs.createDirectory(docsUri); + + try { + await vscode.commands.executeCommand(Commands.EXECUTE_WORKSPACE_COMMAND, + Commands.JAVA_GETPACKAGEDATA, { + kind: NodeKind.Folder, + projectUri: projectNode.uri, + path: srcPath, + }); + await vscode.commands.executeCommand(Commands.VIEW_PACKAGE_REFRESH); + const refreshedProjectNode = (await explorer.dataProvider.getChildren())![0] as ProjectNode; + const projectChildren = await refreshedProjectNode.getChildren(); + const srcFolder = projectChildren.find((node: DataNode) => + node.nodeData.name === "src") as FolderNode; + + assert.ok(srcFolder, "The physical src folder should remain visible when it contains an empty non-Java folder"); + const srcChildren = await srcFolder.getChildren(); + assert.ok(srcChildren.find((node: DataNode) => node.nodeData.name === "docs"), + "The empty non-Java folder should remain visible"); + } finally { + await vscode.workspace.fs.delete(docsUri, { recursive: true }); + await vscode.commands.executeCommand(Commands.EXECUTE_WORKSPACE_COMMAND, + Commands.JAVA_GETPACKAGEDATA, { + kind: NodeKind.Folder, + projectUri: projectNode.uri, + path: srcPath, + }); + await vscode.commands.executeCommand(Commands.VIEW_PACKAGE_REFRESH); + } + }); + test("Can apply 'java.project.explorer.showNonJavaResources'", async function() { await vscode.workspace.getConfiguration("java.project.explorer").update( "showNonJavaResources", diff --git a/test/maven/src/main/resources/application.yml b/test/maven/src/main/resources/application.yml new file mode 100644 index 00000000..b6c6235b --- /dev/null +++ b/test/maven/src/main/resources/application.yml @@ -0,0 +1,3 @@ +spring: + application: + name: my-app diff --git a/test/simple-suite/projectView.test.ts b/test/simple-suite/projectView.test.ts index 29e39b97..eef03ce9 100644 --- a/test/simple-suite/projectView.test.ts +++ b/test/simple-suite/projectView.test.ts @@ -2,7 +2,7 @@ // Licensed under the MIT license. import * as assert from "assert"; -import { ContainerNode, contextManager, DependencyExplorer, +import { ContainerNode, contextManager, DataNode, DependencyExplorer, PackageRootNode, PrimaryTypeNode, ProjectNode } from "../../extension.bundle"; import { fsPath, setupTestEnv, Uris } from "../shared"; @@ -22,7 +22,10 @@ suite("Simple Project View Tests", () => { // validate package root/dependency nodes const projectChildren = await projectNode.getChildren(); - assert.equal(projectChildren.length, 6, "Number of children nodes should be 6"); + assert.equal(projectChildren.length, 5, + `Number of children nodes should be 5: ${projectChildren.map((node: DataNode) => node.name).join(", ")}`); + assert.ok(!projectChildren.find((node: DataNode) => node.name === "src"), + "The empty physical source folder should not be visible"); const mainPackage = projectChildren[0] as PackageRootNode; assert.equal(mainPackage.name, "src/main/java", "Package name should be \"src/main/java\""); const systemLibrary = projectChildren[1] as ContainerNode; From 356532b7a696913171c007eb54350038e25da5d7 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 21 Aug 2026 07:14:50 +0800 Subject: [PATCH 347/352] chore(deps-dev): bump @types/lodash from 4.14.195 to 4.17.25 (#1064) Bumps [@types/lodash](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/lodash) from 4.14.195 to 4.17.25. - [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases) - [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/lodash) --- updated-dependencies: - dependency-name: "@types/lodash" dependency-version: 4.17.25 dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 14 +++++++------- package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index 2b48f3a4..0949127a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -24,7 +24,7 @@ "devDependencies": { "@types/fs-extra": "^9.0.13", "@types/glob": "^7.2.0", - "@types/lodash": "^4.14.191", + "@types/lodash": "^4.17.25", "@types/minimatch": "^3.0.3", "@types/mocha": "^9.1.1", "@types/node": "20.x", @@ -781,9 +781,9 @@ "dev": true }, "node_modules/@types/lodash": { - "version": "4.14.195", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.195.tgz", - "integrity": "sha512-Hwx9EUgdwf2GLarOjQp5ZH8ZmblzcbTBC2wtQWNKARBSxM9ezRIAUpeDTgoQRAFB0+8CNWXVA9+MaSOzOF3nPg==", + "version": "4.17.25", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.25.tgz", + "integrity": "sha512-+K1NIO8I+F9/wNulfVvu23QYd0Pe9/OCqRrim4NoYIf1VoEDL90Ve4ClzpyqBLc7NpGGWRvYNCKZ1BE/Jpf8dQ==", "dev": true }, "node_modules/@types/minimatch": { @@ -4797,9 +4797,9 @@ "dev": true }, "@types/lodash": { - "version": "4.14.195", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.195.tgz", - "integrity": "sha512-Hwx9EUgdwf2GLarOjQp5ZH8ZmblzcbTBC2wtQWNKARBSxM9ezRIAUpeDTgoQRAFB0+8CNWXVA9+MaSOzOF3nPg==", + "version": "4.17.25", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.25.tgz", + "integrity": "sha512-+K1NIO8I+F9/wNulfVvu23QYd0Pe9/OCqRrim4NoYIf1VoEDL90Ve4ClzpyqBLc7NpGGWRvYNCKZ1BE/Jpf8dQ==", "dev": true }, "@types/minimatch": { diff --git a/package.json b/package.json index 3b6d48df..f1c17a21 100644 --- a/package.json +++ b/package.json @@ -1198,7 +1198,7 @@ "devDependencies": { "@types/fs-extra": "^9.0.13", "@types/glob": "^7.2.0", - "@types/lodash": "^4.14.191", + "@types/lodash": "^4.17.25", "@types/minimatch": "^3.0.3", "@types/mocha": "^9.1.1", "@types/node": "20.x", From 3082d3735782b588b7bc0334521220045e9de095 Mon Sep 17 00:00:00 2001 From: Dan Fiedler <151573964+danfiedler-msft@users.noreply.github.com> Date: Thu, 20 Aug 2026 21:55:25 -0400 Subject: [PATCH 348/352] Pin GitHub Actions to full-length commit SHAs (#1057) Co-authored-by: Changyong Gong --- .github/dependabot.yml | 9 ++++ .github/workflows/e2eUI.yml | 50 ++++++++++---------- .github/workflows/linux.yml | 6 +-- .github/workflows/macOS.yml | 6 +-- .github/workflows/no-response.yml | 2 +- .github/workflows/triage-agent.yml | 4 +- .github/workflows/triage-all-open-issues.yml | 4 +- .github/workflows/windows.yml | 6 +-- 8 files changed, 48 insertions(+), 39 deletions(-) diff --git a/.github/dependabot.yml b/.github/dependabot.yml index 8cc8a033..a4a0cf03 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -17,3 +17,12 @@ updates: # in case the feed's ingestion lag drifts. cooldown: default-days: 10 + - package-ecosystem: "github-actions" + directory: "/" + groups: + github-actions: + patterns: ["*"] + schedule: + interval: "weekly" + cooldown: + default-days: 7 diff --git a/.github/workflows/e2eUI.yml b/.github/workflows/e2eUI.yml index 89264f24..53933d34 100644 --- a/.github/workflows/e2eUI.yml +++ b/.github/workflows/e2eUI.yml @@ -32,16 +32,16 @@ jobs: runs-on: ubuntu-latest timeout-minutes: 10 steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4.4.0 - name: Set up JDK 21 - uses: actions/setup-java@v4 + uses: actions/setup-java@cf277c60eb25467037889841efdb72551f06f6c3 # v4.9.1 with: java-version: '21' distribution: 'temurin' - name: Setup Node.js environment - uses: actions/setup-node@v4 + uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 with: node-version: 20 @@ -62,7 +62,7 @@ jobs: outputs: matrix: ${{ steps.scan.outputs.matrix }} steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4.4.0 - name: Scan test plans id: scan @@ -78,16 +78,16 @@ jobs: runs-on: ubuntu-latest timeout-minutes: 20 steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4.4.0 - name: Set up JDK 21 - uses: actions/setup-java@v4 + uses: actions/setup-java@cf277c60eb25467037889841efdb72551f06f6c3 # v4.9.1 with: java-version: '21' distribution: 'temurin' - name: Setup Node.js environment - uses: actions/setup-node@v4 + uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 with: node-version: 20 @@ -104,7 +104,7 @@ jobs: run: vsce package -o vscode-java-dependency.vsix - name: Upload VSIX artifact - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2 with: name: vsix-linux path: vscode-java-dependency.vsix @@ -116,16 +116,16 @@ jobs: runs-on: windows-latest timeout-minutes: 20 steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4.4.0 - name: Set up JDK 21 - uses: actions/setup-java@v4 + uses: actions/setup-java@cf277c60eb25467037889841efdb72551f06f6c3 # v4.9.1 with: java-version: '21' distribution: 'temurin' - name: Setup Node.js environment - uses: actions/setup-node@v4 + uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 with: node-version: 20 @@ -142,7 +142,7 @@ jobs: run: vsce package -o vscode-java-dependency.vsix - name: Upload VSIX artifact - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2 with: name: vsix-windows path: vscode-java-dependency.vsix @@ -160,16 +160,16 @@ jobs: plan: ${{ fromJson(needs.discover-plans.outputs.matrix) }} steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4.4.0 - name: Set up JDK 21 - uses: actions/setup-java@v4 + uses: actions/setup-java@cf277c60eb25467037889841efdb72551f06f6c3 # v4.9.1 with: java-version: '21' distribution: 'temurin' - name: Setup Node.js environment - uses: actions/setup-node@v4 + uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 with: node-version: 22 @@ -177,7 +177,7 @@ jobs: run: npm install -g @vscjava/vscode-autotest - name: Download VSIX artifact - uses: actions/download-artifact@v4 + uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4.3.0 with: name: vsix-linux path: . @@ -197,7 +197,7 @@ jobs: - name: Upload test results if: ${{ always() }} - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2 with: name: e2e-results-linux-${{ matrix.plan }} path: test-results/ @@ -215,16 +215,16 @@ jobs: plan: ${{ fromJson(needs.discover-plans.outputs.matrix) }} steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4.4.0 - name: Set up JDK 21 - uses: actions/setup-java@v4 + uses: actions/setup-java@cf277c60eb25467037889841efdb72551f06f6c3 # v4.9.1 with: java-version: '21' distribution: 'temurin' - name: Setup Node.js environment - uses: actions/setup-node@v4 + uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 with: node-version: 22 @@ -232,7 +232,7 @@ jobs: run: npm install -g @vscjava/vscode-autotest - name: Download VSIX artifact - uses: actions/download-artifact@v4 + uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4.3.0 with: name: vsix-windows path: . @@ -248,7 +248,7 @@ jobs: - name: Upload test results if: ${{ always() }} - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2 with: name: e2e-results-windows-${{ matrix.plan }} path: test-results/ @@ -262,7 +262,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Setup Node.js environment - uses: actions/setup-node@v4 + uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 with: node-version: 22 @@ -270,7 +270,7 @@ jobs: run: npm install -g @vscjava/vscode-autotest - name: Download all plan results - uses: actions/download-artifact@v4 + uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4.3.0 with: pattern: e2e-results-* path: all-results @@ -316,7 +316,7 @@ jobs: - name: Upload aggregate summary if: always() - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2 with: name: e2e-aggregate-summary path: test-results/summary.md diff --git a/.github/workflows/linux.yml b/.github/workflows/linux.yml index eddfbdb9..6ecbe167 100644 --- a/.github/workflows/linux.yml +++ b/.github/workflows/linux.yml @@ -12,7 +12,7 @@ jobs: runs-on: ubuntu-latest timeout-minutes: 30 steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4.4.0 - name: Setup Build Environment run: | @@ -22,13 +22,13 @@ jobs: sleep 3 - name: Set up JDK 21 - uses: actions/setup-java@v4 + uses: actions/setup-java@cf277c60eb25467037889841efdb72551f06f6c3 # v4.9.1 with: distribution: 'temurin' java-version: '21' - name: Setup Node.js environment - uses: actions/setup-node@v4 + uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 with: node-version: 20 diff --git a/.github/workflows/macOS.yml b/.github/workflows/macOS.yml index 3e6d373f..bb779d46 100644 --- a/.github/workflows/macOS.yml +++ b/.github/workflows/macOS.yml @@ -12,16 +12,16 @@ jobs: runs-on: macos-latest timeout-minutes: 30 steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4.4.0 - name: Set up JDK 21 - uses: actions/setup-java@v4 + uses: actions/setup-java@cf277c60eb25467037889841efdb72551f06f6c3 # v4.9.1 with: distribution: 'temurin' java-version: '21' - name: Setup Node.js environment - uses: actions/setup-node@v4 + uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 with: node-version: 20 diff --git a/.github/workflows/no-response.yml b/.github/workflows/no-response.yml index e4151ec1..9edc36f6 100644 --- a/.github/workflows/no-response.yml +++ b/.github/workflows/no-response.yml @@ -16,7 +16,7 @@ jobs: permissions: issues: write steps: - - uses: lee-dohm/no-response@9bb0a4b5e6a45046f00353d5de7d90fb8bd773bb + - uses: lee-dohm/no-response@9bb0a4b5e6a45046f00353d5de7d90fb8bd773bb # v0.5.0 with: token: ${{ github.token }} daysUntilClose: 14 diff --git a/.github/workflows/triage-agent.yml b/.github/workflows/triage-agent.yml index 92d805cb..7ecff053 100644 --- a/.github/workflows/triage-agent.yml +++ b/.github/workflows/triage-agent.yml @@ -21,11 +21,11 @@ jobs: steps: - name: Checkout repository - uses: actions/checkout@v2 + uses: actions/checkout@0717577d45739eb3c851188b29f50ed6c0b2194e # v2.8.0 - name: Get issue data id: get_issue - uses: actions/github-script@v6 + uses: actions/github-script@d7906e4ad0b1822421a7e6a35d5ca353c962f410 # v6.4.1 with: script: | const eventName = context.eventName; diff --git a/.github/workflows/triage-all-open-issues.yml b/.github/workflows/triage-all-open-issues.yml index 092f4ef7..05dae014 100644 --- a/.github/workflows/triage-all-open-issues.yml +++ b/.github/workflows/triage-all-open-issues.yml @@ -28,7 +28,7 @@ jobs: steps: - name: Get all open issues id: get_issues - uses: actions/github-script@v6 + uses: actions/github-script@d7906e4ad0b1822421a7e6a35d5ca353c962f410 # v6.4.1 with: script: | // Use Search API to filter issues at API level @@ -85,7 +85,7 @@ jobs: - name: Trigger triage workflow for issue if: inputs.dry_run != true - uses: actions/github-script@v6 + uses: actions/github-script@d7906e4ad0b1822421a7e6a35d5ca353c962f410 # v6.4.1 with: script: | const issueNumber = '${{ matrix.issue_number }}'; diff --git a/.github/workflows/windows.yml b/.github/workflows/windows.yml index 79bd1f35..e297947b 100644 --- a/.github/workflows/windows.yml +++ b/.github/workflows/windows.yml @@ -12,16 +12,16 @@ jobs: runs-on: windows-latest timeout-minutes: 30 steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4.4.0 - name: Set up JDK 21 - uses: actions/setup-java@v4 + uses: actions/setup-java@cf277c60eb25467037889841efdb72551f06f6c3 # v4.9.1 with: distribution: 'temurin' java-version: '21' - name: Setup Node.js environment - uses: actions/setup-node@v4 + uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 with: node-version: 20 From 166570dffca3bcafdc3186c6c47dec8def416179 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 22 Aug 2026 06:36:48 +0800 Subject: [PATCH 349/352] chore(deps): bump vscode-tas-client from 0.1.75 to 0.3.0 (#1068) Bumps vscode-tas-client from 0.1.75 to 0.3.0. --- updated-dependencies: - dependency-name: vscode-tas-client dependency-version: 0.3.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 512 +++------------------------------------------- package.json | 2 +- 2 files changed, 27 insertions(+), 487 deletions(-) diff --git a/package-lock.json b/package-lock.json index 0949127a..752c58cb 100644 --- a/package-lock.json +++ b/package-lock.json @@ -19,7 +19,7 @@ "minimatch": "^5.1.9", "semver": "^7.3.8", "vscode-extension-telemetry-wrapper": "^0.15.2", - "vscode-tas-client": "^0.1.75" + "vscode-tas-client": "^0.3.0" }, "devDependencies": { "@types/fs-extra": "^9.0.13", @@ -1145,50 +1145,11 @@ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", "dev": true }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" - }, "node_modules/await-lock": { "version": "2.2.2", "resolved": "https://registry.npmjs.org/await-lock/-/await-lock-2.2.2.tgz", "integrity": "sha512-aDczADvlvTGajTDjcjpJMqRkOF6Qdz3YbPZm/PyW6tKPkx2hlYBzxMhEywM/tU72HrVZjgl5VCdRuMlA7pZ8Gw==" }, - "node_modules/axios": { - "version": "1.18.1", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.18.1.tgz", - "integrity": "sha512-3nTvFlvpn9Zu/RkHUqtc7/+al4UpRW5az71ap5zccp6e8RAYEzhMTecX8Dz1wWDYrPpUoB1HAQEGEAEvUr7S9g==", - "dependencies": { - "follow-redirects": "^1.16.0", - "form-data": "^4.0.5", - "https-proxy-agent": "^5.0.1", - "proxy-from-env": "^2.1.0" - } - }, - "node_modules/axios/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==", - "dependencies": { - "debug": "4" - }, - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/axios/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==", - "dependencies": { - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", @@ -1281,18 +1242,6 @@ "node": ">=0.10.0" } }, - "node_modules/call-bind-apply-helpers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", - "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", - "dependencies": { - "es-errors": "^1.3.0", - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, "node_modules/camelcase": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", @@ -1458,17 +1407,6 @@ "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", "dev": true }, - "node_modules/combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, "node_modules/commander": { "version": "2.20.3", "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", @@ -1530,6 +1468,7 @@ "version": "4.4.3", "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, "license": "MIT", "dependencies": { "ms": "^2.1.3" @@ -1555,14 +1494,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "engines": { - "node": ">=0.4.0" - } - }, "node_modules/diff": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/diff/-/diff-7.0.0.tgz", @@ -1583,19 +1514,6 @@ "node": ">=8" } }, - "node_modules/dunder-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", - "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", - "dependencies": { - "call-bind-apply-helpers": "^1.0.1", - "es-errors": "^1.3.0", - "gopd": "^1.2.0" - }, - "engines": { - "node": ">= 0.4" - } - }, "node_modules/eastasianwidth": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", @@ -1639,53 +1557,12 @@ "node": ">=4" } }, - "node_modules/es-define-property": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", - "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-errors": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", - "engines": { - "node": ">= 0.4" - } - }, "node_modules/es-module-lexer": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-2.3.1.tgz", "integrity": "sha512-shc1dbU90Yl/xq1QrC7QRtfcwURZuVRfPhZbDoldJ1cn1gzDvBaBWlv0eFolj5+0znnPJz5TXLxsN77X/12KTA==", "dev": true }, - "node_modules/es-object-atoms": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", - "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", - "dependencies": { - "es-errors": "^1.3.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-set-tostringtag": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", - "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", - "dependencies": { - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.6", - "has-tostringtag": "^1.0.2", - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, "node_modules/escalade": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", @@ -1897,25 +1774,6 @@ "lodash": "^4.17.21" } }, - "node_modules/follow-redirects": { - "version": "1.16.0", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.16.0.tgz", - "integrity": "sha512-y5rN/uOsadFT/JfYwhxRS5R7Qce+g3zG97+JrtFZlC9klX/W5hD7iiLzScI4nZqUS7DNUdhPgw4xI8W2LuXlUw==", - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" - } - ], - "engines": { - "node": ">=4.0" - }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } - } - }, "node_modules/foreground-child": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", @@ -1933,21 +1791,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/form-data": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.6.tgz", - "integrity": "sha512-vKatAh4SlVfgbv+YtmhiRjhEMJsYpsG1Y2rMQtR+SVSbytsSD1YGzDIcrAJmdFec88u/+VoGmxnl+80gL1tRCQ==", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "es-set-tostringtag": "^2.1.0", - "hasown": "^2.0.4", - "mime-types": "^2.1.35" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/fs-extra": { "version": "10.1.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", @@ -1971,6 +1814,7 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -1997,41 +1841,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/get-intrinsic": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", - "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", - "dependencies": { - "call-bind-apply-helpers": "^1.0.2", - "es-define-property": "^1.0.1", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.1.1", - "function-bind": "^1.1.2", - "get-proto": "^1.0.1", - "gopd": "^1.2.0", - "has-symbols": "^1.1.0", - "hasown": "^2.0.2", - "math-intrinsics": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", - "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", - "dependencies": { - "dunder-proto": "^1.0.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, "node_modules/glob": { "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", @@ -2104,17 +1913,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/gopd": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", - "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/graceful-fs": { "version": "4.2.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", @@ -2141,42 +1939,6 @@ "node": ">=8" } }, - "node_modules/has-symbols": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", - "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-tostringtag": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", - "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", - "dependencies": { - "has-symbols": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/hasown": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.4.tgz", - "integrity": "sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==", - "dependencies": { - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, "node_modules/he": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", @@ -2522,14 +2284,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/math-intrinsics": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", - "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", - "engines": { - "node": ">= 0.4" - } - }, "node_modules/merge-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", @@ -2556,25 +2310,6 @@ "node": ">=8.6" } }, - "node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, "node_modules/mimic-function": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/mimic-function/-/mimic-function-5.0.1.tgz", @@ -2780,6 +2515,7 @@ "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, "license": "MIT" }, "node_modules/neo-async": { @@ -3163,14 +2899,6 @@ "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", "dev": true }, - "node_modules/proxy-from-env": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-2.1.0.tgz", - "integrity": "sha512-cJ+oHTW1VAEa8cJslgmUZrc+sjRKgAKl3Zyse6+PV38hZe/V6Z14TbCuXcan9F9ghlz4QrFr2c92TNF82UkYHA==", - "engines": { - "node": ">=10" - } - }, "node_modules/queue-microtask": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", @@ -3596,11 +3324,11 @@ } }, "node_modules/tas-client": { - "version": "0.1.73", - "resolved": "https://registry.npmjs.org/tas-client/-/tas-client-0.1.73.tgz", - "integrity": "sha512-UDdUF9kV2hYdlv+7AgqP2kXarVSUhjK7tg1BUflIRGEgND0/QoNpN64rcEuhEcM8AIbW65yrCopJWqRhLZ3m8w==", - "dependencies": { - "axios": "^1.6.1" + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/tas-client/-/tas-client-0.4.3.tgz", + "integrity": "sha512-6bqNgMv7ys5PL6Zqz+EoR8J5KrhAGFjodUPkcpM80DHFakKiWcjqKiID5qxsssC/E70fcgYYWPAUK7CWS29b+Q==", + "engines": { + "node": ">=22" } }, "node_modules/terser": { @@ -3992,14 +3720,14 @@ "license": "MIT" }, "node_modules/vscode-tas-client": { - "version": "0.1.75", - "resolved": "https://registry.npmjs.org/vscode-tas-client/-/vscode-tas-client-0.1.75.tgz", - "integrity": "sha512-/+ALFWPI4U3obeRvLFSt39guT7P9bZQrkmcLoiS+2HtzJ/7iPKNt5Sj+XTiitGlPYVFGFc0plxX8AAp6Uxs0xQ==", + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/vscode-tas-client/-/vscode-tas-client-0.3.0.tgz", + "integrity": "sha512-69e8Ek86+LwfNp9oh6b7xEnM9M15IX8W+ZhHo2/tCbbnB/TOPK3aDle3iOZa8aeBoGKeaStUkSKaloIvIkmNXg==", "dependencies": { - "tas-client": "0.1.73" + "tas-client": "^0.4.2" }, "engines": { - "vscode": "^1.19.1" + "vscode": "^1.85.0" } }, "node_modules/watchpack": { @@ -5105,46 +4833,11 @@ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", "dev": true }, - "asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" - }, "await-lock": { "version": "2.2.2", "resolved": "https://registry.npmjs.org/await-lock/-/await-lock-2.2.2.tgz", "integrity": "sha512-aDczADvlvTGajTDjcjpJMqRkOF6Qdz3YbPZm/PyW6tKPkx2hlYBzxMhEywM/tU72HrVZjgl5VCdRuMlA7pZ8Gw==" }, - "axios": { - "version": "1.18.1", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.18.1.tgz", - "integrity": "sha512-3nTvFlvpn9Zu/RkHUqtc7/+al4UpRW5az71ap5zccp6e8RAYEzhMTecX8Dz1wWDYrPpUoB1HAQEGEAEvUr7S9g==", - "requires": { - "follow-redirects": "^1.16.0", - "form-data": "^4.0.5", - "https-proxy-agent": "^5.0.1", - "proxy-from-env": "^2.1.0" - }, - "dependencies": { - "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==", - "requires": { - "debug": "4" - } - }, - "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==", - "requires": { - "agent-base": "6", - "debug": "4" - } - } - } - }, "balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", @@ -5208,15 +4901,6 @@ "integrity": "sha512-wxXCdllwGhI2kCC0MnvTGYTMvnVZTvqgypkiTI8Pa5tcz2i6VqsqwYGgqwXji+4RgCzms6EajE4IxiUH6HH8nQ==", "dev": true }, - "call-bind-apply-helpers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", - "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", - "requires": { - "es-errors": "^1.3.0", - "function-bind": "^1.1.2" - } - }, "camelcase": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", @@ -5323,14 +5007,6 @@ "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", "dev": true }, - "combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "requires": { - "delayed-stream": "~1.0.0" - } - }, "commander": { "version": "2.20.3", "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", @@ -5378,6 +5054,7 @@ "version": "4.4.3", "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, "requires": { "ms": "^2.1.3" } @@ -5388,11 +5065,6 @@ "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", "dev": true }, - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==" - }, "diff": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/diff/-/diff-7.0.0.tgz", @@ -5407,16 +5079,6 @@ "path-type": "^4.0.0" } }, - "dunder-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", - "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", - "requires": { - "call-bind-apply-helpers": "^1.0.1", - "es-errors": "^1.3.0", - "gopd": "^1.2.0" - } - }, "eastasianwidth": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", @@ -5451,41 +5113,12 @@ "integrity": "sha512-ZtUjZO6l5mwTHvc1L9+1q5p/R3wTopcfqMW8r5t8SJSKqeVI/LtajORwRFEKpEFuekjD0VBjwu1HMxL4UalIRw==", "dev": true }, - "es-define-property": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", - "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==" - }, - "es-errors": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==" - }, "es-module-lexer": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-2.3.1.tgz", "integrity": "sha512-shc1dbU90Yl/xq1QrC7QRtfcwURZuVRfPhZbDoldJ1cn1gzDvBaBWlv0eFolj5+0znnPJz5TXLxsN77X/12KTA==", "dev": true }, - "es-object-atoms": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", - "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", - "requires": { - "es-errors": "^1.3.0" - } - }, - "es-set-tostringtag": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", - "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", - "requires": { - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.6", - "has-tostringtag": "^1.0.2", - "hasown": "^2.0.2" - } - }, "escalade": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", @@ -5628,11 +5261,6 @@ "lodash": "^4.17.21" } }, - "follow-redirects": { - "version": "1.16.0", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.16.0.tgz", - "integrity": "sha512-y5rN/uOsadFT/JfYwhxRS5R7Qce+g3zG97+JrtFZlC9klX/W5hD7iiLzScI4nZqUS7DNUdhPgw4xI8W2LuXlUw==" - }, "foreground-child": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", @@ -5643,18 +5271,6 @@ "signal-exit": "^4.0.1" } }, - "form-data": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.6.tgz", - "integrity": "sha512-vKatAh4SlVfgbv+YtmhiRjhEMJsYpsG1Y2rMQtR+SVSbytsSD1YGzDIcrAJmdFec88u/+VoGmxnl+80gL1tRCQ==", - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "es-set-tostringtag": "^2.1.0", - "hasown": "^2.0.4", - "mime-types": "^2.1.35" - } - }, "fs-extra": { "version": "10.1.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", @@ -5674,7 +5290,8 @@ "function-bind": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==" + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true }, "get-caller-file": { "version": "2.0.5", @@ -5688,32 +5305,6 @@ "integrity": "sha512-CQ+bEO+Tva/qlmw24dCejulK5pMzVnUOFOijVogd3KQs07HnRIgp8TGipvCCRT06xeYEbpbgwaCxglFyiuIcmA==", "dev": true }, - "get-intrinsic": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", - "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", - "requires": { - "call-bind-apply-helpers": "^1.0.2", - "es-define-property": "^1.0.1", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.1.1", - "function-bind": "^1.1.2", - "get-proto": "^1.0.1", - "gopd": "^1.2.0", - "has-symbols": "^1.1.0", - "hasown": "^2.0.2", - "math-intrinsics": "^1.1.0" - } - }, - "get-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", - "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", - "requires": { - "dunder-proto": "^1.0.1", - "es-object-atoms": "^1.0.0" - } - }, "glob": { "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", @@ -5770,11 +5361,6 @@ "slash": "^4.0.0" } }, - "gopd": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", - "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==" - }, "graceful-fs": { "version": "4.2.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", @@ -5795,27 +5381,6 @@ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, - "has-symbols": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", - "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==" - }, - "has-tostringtag": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", - "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", - "requires": { - "has-symbols": "^1.0.3" - } - }, - "hasown": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.4.tgz", - "integrity": "sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==", - "requires": { - "function-bind": "^1.1.2" - } - }, "he": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", @@ -6061,11 +5626,6 @@ "is-unicode-supported": "^0.1.0" } }, - "math-intrinsics": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", - "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==" - }, "merge-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", @@ -6086,19 +5646,6 @@ "picomatch": "^2.3.1" } }, - "mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" - }, - "mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "requires": { - "mime-db": "1.52.0" - } - }, "mimic-function": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/mimic-function/-/mimic-function-5.0.1.tgz", @@ -6213,7 +5760,8 @@ "ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true }, "neo-async": { "version": "2.6.2", @@ -6480,11 +6028,6 @@ "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", "dev": true }, - "proxy-from-env": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-2.1.0.tgz", - "integrity": "sha512-cJ+oHTW1VAEa8cJslgmUZrc+sjRKgAKl3Zyse6+PV38hZe/V6Z14TbCuXcan9F9ghlz4QrFr2c92TNF82UkYHA==" - }, "queue-microtask": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", @@ -6756,12 +6299,9 @@ "dev": true }, "tas-client": { - "version": "0.1.73", - "resolved": "https://registry.npmjs.org/tas-client/-/tas-client-0.1.73.tgz", - "integrity": "sha512-UDdUF9kV2hYdlv+7AgqP2kXarVSUhjK7tg1BUflIRGEgND0/QoNpN64rcEuhEcM8AIbW65yrCopJWqRhLZ3m8w==", - "requires": { - "axios": "^1.6.1" - } + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/tas-client/-/tas-client-0.4.3.tgz", + "integrity": "sha512-6bqNgMv7ys5PL6Zqz+EoR8J5KrhAGFjodUPkcpM80DHFakKiWcjqKiID5qxsssC/E70fcgYYWPAUK7CWS29b+Q==" }, "terser": { "version": "5.49.2", @@ -7042,11 +6582,11 @@ "integrity": "sha512-Ld1VelNuX9pdF39h2Hgaeb5hEZM2Z3jUrrMgWQAu82jMtZp7p3vJT3BzToKtZI7NgQssZje5o0zryOrhQvzQAg==" }, "vscode-tas-client": { - "version": "0.1.75", - "resolved": "https://registry.npmjs.org/vscode-tas-client/-/vscode-tas-client-0.1.75.tgz", - "integrity": "sha512-/+ALFWPI4U3obeRvLFSt39guT7P9bZQrkmcLoiS+2HtzJ/7iPKNt5Sj+XTiitGlPYVFGFc0plxX8AAp6Uxs0xQ==", + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/vscode-tas-client/-/vscode-tas-client-0.3.0.tgz", + "integrity": "sha512-69e8Ek86+LwfNp9oh6b7xEnM9M15IX8W+ZhHo2/tCbbnB/TOPK3aDle3iOZa8aeBoGKeaStUkSKaloIvIkmNXg==", "requires": { - "tas-client": "0.1.73" + "tas-client": "^0.4.2" } }, "watchpack": { diff --git a/package.json b/package.json index f1c17a21..f83470be 100644 --- a/package.json +++ b/package.json @@ -1225,7 +1225,7 @@ "minimatch": "^5.1.9", "semver": "^7.3.8", "vscode-extension-telemetry-wrapper": "^0.15.2", - "vscode-tas-client": "^0.1.75" + "vscode-tas-client": "^0.3.0" }, "overrides": { "serialize-javascript": ">=7.0.5" From e9232737442993741535b98b9e220f4f80bf350b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 22 Aug 2026 06:50:01 +0800 Subject: [PATCH 350/352] chore(deps): bump @github/copilot-language-server (#1067) Bumps [@github/copilot-language-server](https://github.com/github/copilot-language-server-release) from 1.527.5 to 1.530.0. - [Release notes](https://github.com/github/copilot-language-server-release/releases) - [Commits](https://github.com/github/copilot-language-server-release/compare/1.527.5...1.530.0) --- updated-dependencies: - dependency-name: "@github/copilot-language-server" dependency-version: 1.530.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 208 +++++++++++++++++++++++----------------------- package.json | 2 +- 2 files changed, 105 insertions(+), 105 deletions(-) diff --git a/package-lock.json b/package-lock.json index 752c58cb..31a82d81 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,7 +9,7 @@ "version": "0.27.6", "license": "MIT", "dependencies": { - "@github/copilot-language-server": "^1.527.5", + "@github/copilot-language-server": "^1.530.0", "@octokit/rest": "^21.1.1", "await-lock": "^2.2.2", "fmtr": "^1.1.4", @@ -79,9 +79,9 @@ } }, "node_modules/@github/copilot-darwin-arm64": { - "version": "1.0.70", - "resolved": "https://registry.npmjs.org/@github/copilot-darwin-arm64/-/copilot-darwin-arm64-1.0.70.tgz", - "integrity": "sha512-NewReqBmTxtAzApZNmUsY4Xqy8N086MiQm7k35i9i+WrGyRiHxdZ/n/lMLCkqWoelr7pZhcZ7gQ7fHbEq1KdoQ==", + "version": "1.0.78", + "resolved": "https://registry.npmjs.org/@github/copilot-darwin-arm64/-/copilot-darwin-arm64-1.0.78.tgz", + "integrity": "sha512-P11+VyWg8ad0WlywGtO2d7AxqTLJv4hkUicFg6Ycth5lfk00aCu/74YOOZSPO6C2bBBJhAza7oAdmauM6KEojw==", "cpu": [ "arm64" ], @@ -94,9 +94,9 @@ } }, "node_modules/@github/copilot-darwin-x64": { - "version": "1.0.70", - "resolved": "https://registry.npmjs.org/@github/copilot-darwin-x64/-/copilot-darwin-x64-1.0.70.tgz", - "integrity": "sha512-ydUEYI3udNAjdMsLPFQLH/JG9YFKcxuAUxYIyOK+F/m/Of9nODKdYa2hw2mlLanP4cNyuxGLflu+rtIqIb+cPw==", + "version": "1.0.78", + "resolved": "https://registry.npmjs.org/@github/copilot-darwin-x64/-/copilot-darwin-x64-1.0.78.tgz", + "integrity": "sha512-stimP3WDFs2GU8nJzTJbtRpZViV4bsf80yg7QrFq+G4RISQ3Nihg/3/H0U6UQF1+txMJ/Ohmb5RFYxSw1Hj2sw==", "cpu": [ "x64" ], @@ -109,9 +109,9 @@ } }, "node_modules/@github/copilot-language-server": { - "version": "1.527.5", - "resolved": "https://registry.npmjs.org/@github/copilot-language-server/-/copilot-language-server-1.527.5.tgz", - "integrity": "sha512-0p2pCd6bqTORsyLxtGCcu/u5TkkFjjnFCJ386Os/rNsMTYJ45QgiU76Mz2bQJi4NNOjrirCQhboKhZSDsCOsJQ==", + "version": "1.530.0", + "resolved": "https://registry.npmjs.org/@github/copilot-language-server/-/copilot-language-server-1.530.0.tgz", + "integrity": "sha512-7OjTbKqkA9NSf8Yjms19qglBswdK7IkorbzB0EpfPOPeT8UdmxW0fiYCiaTsyB+VizMzchrPh0nbik8gH8boKw==", "dependencies": { "vscode-languageserver-protocol": "^3.17.5" }, @@ -119,24 +119,24 @@ "copilot-language-server": "dist/language-server.js" }, "optionalDependencies": { - "@github/copilot-darwin-arm64": "1.0.70", - "@github/copilot-darwin-x64": "1.0.70", - "@github/copilot-language-server-darwin-arm64": "1.527.5", - "@github/copilot-language-server-darwin-x64": "1.527.5", - "@github/copilot-language-server-linux-arm64": "1.527.5", - "@github/copilot-language-server-linux-x64": "1.527.5", - "@github/copilot-language-server-win32-arm64": "1.527.5", - "@github/copilot-language-server-win32-x64": "1.527.5", - "@github/copilot-linux-arm64": "1.0.70", - "@github/copilot-linux-x64": "1.0.70", - "@github/copilot-win32-arm64": "1.0.70", - "@github/copilot-win32-x64": "1.0.70" + "@github/copilot-darwin-arm64": "1.0.78", + "@github/copilot-darwin-x64": "1.0.78", + "@github/copilot-language-server-darwin-arm64": "1.530.0", + "@github/copilot-language-server-darwin-x64": "1.530.0", + "@github/copilot-language-server-linux-arm64": "1.530.0", + "@github/copilot-language-server-linux-x64": "1.530.0", + "@github/copilot-language-server-win32-arm64": "1.530.0", + "@github/copilot-language-server-win32-x64": "1.530.0", + "@github/copilot-linux-arm64": "1.0.78", + "@github/copilot-linux-x64": "1.0.78", + "@github/copilot-win32-arm64": "1.0.78", + "@github/copilot-win32-x64": "1.0.78" } }, "node_modules/@github/copilot-language-server-darwin-arm64": { - "version": "1.527.5", - "resolved": "https://registry.npmjs.org/@github/copilot-language-server-darwin-arm64/-/copilot-language-server-darwin-arm64-1.527.5.tgz", - "integrity": "sha512-rw1vq0vUbRGo+m/00yaRvAfK5CPM1fl6TCs+LyrZ272dxzD9Rh/BTrp0x8p4UqepctQsIyK5Js4MxPPvkz9PxA==", + "version": "1.530.0", + "resolved": "https://registry.npmjs.org/@github/copilot-language-server-darwin-arm64/-/copilot-language-server-darwin-arm64-1.530.0.tgz", + "integrity": "sha512-WREnhFgvqDUHOYZTOmd0XldA3DtJ7XEn4leAezDEW4iwhoTyROmGSjH02ROj2l22Zdtq5byATidjDHGn5CnO/g==", "cpu": [ "arm64" ], @@ -146,9 +146,9 @@ ] }, "node_modules/@github/copilot-language-server-darwin-x64": { - "version": "1.527.5", - "resolved": "https://registry.npmjs.org/@github/copilot-language-server-darwin-x64/-/copilot-language-server-darwin-x64-1.527.5.tgz", - "integrity": "sha512-H1Pc+Bb6C379EeFIp7nOMX2ZWiOdu6vkCA4ty1EmKkVG0RFCtSAPvM1LwP/Ysbfv8sidsXKCopNMN3ur5o3mjw==", + "version": "1.530.0", + "resolved": "https://registry.npmjs.org/@github/copilot-language-server-darwin-x64/-/copilot-language-server-darwin-x64-1.530.0.tgz", + "integrity": "sha512-rHBRaA6MtbQSCOF7vDgcPEiukWmmggwuoOcqqi7yKvcq6/K7MDW9jtydq6HP/mg0fUe44l0sG/h9/MQlQcljvA==", "cpu": [ "x64" ], @@ -158,9 +158,9 @@ ] }, "node_modules/@github/copilot-language-server-linux-arm64": { - "version": "1.527.5", - "resolved": "https://registry.npmjs.org/@github/copilot-language-server-linux-arm64/-/copilot-language-server-linux-arm64-1.527.5.tgz", - "integrity": "sha512-LZlMlA7tUTMpmUoEqHsDsVA1p3P/pPOw02QLexx2aFFnSaOEAIFMA2hDuYtKWFt2cO1E7p95IlkQCdXXr5mMEg==", + "version": "1.530.0", + "resolved": "https://registry.npmjs.org/@github/copilot-language-server-linux-arm64/-/copilot-language-server-linux-arm64-1.530.0.tgz", + "integrity": "sha512-2Wvdm3IogKHSUsN6zlleK91CdKoiGIf2R0n0P5ZHcLxaGix29fPGMa/hl5A9wkpnnV7szBDUKTHqwZoMxtPOvA==", "cpu": [ "arm64" ], @@ -170,9 +170,9 @@ ] }, "node_modules/@github/copilot-language-server-linux-x64": { - "version": "1.527.5", - "resolved": "https://registry.npmjs.org/@github/copilot-language-server-linux-x64/-/copilot-language-server-linux-x64-1.527.5.tgz", - "integrity": "sha512-YLusnRHbF/uw7R5Y5nDwR1ai9PzGtirAZHxKKO5nFFs5EaZX80CeLk9OqPZ6TegXb2Bqm7hJfSp94gvthHPyxQ==", + "version": "1.530.0", + "resolved": "https://registry.npmjs.org/@github/copilot-language-server-linux-x64/-/copilot-language-server-linux-x64-1.530.0.tgz", + "integrity": "sha512-1MIg6t+TS67sEpjb5jqf2BhjRrYW3sLlSyCxAT+a76ZUwlLjmrVFlpU2R6B/HIQDQhoxuvZwQ6YXmfxCVufDmw==", "cpu": [ "x64" ], @@ -182,9 +182,9 @@ ] }, "node_modules/@github/copilot-language-server-win32-arm64": { - "version": "1.527.5", - "resolved": "https://registry.npmjs.org/@github/copilot-language-server-win32-arm64/-/copilot-language-server-win32-arm64-1.527.5.tgz", - "integrity": "sha512-Zgo3uh46DTRDVTVEf5tp0RJO+MhBykdXpZn7TvCLdu5GHzgqBX6tt7RYYMi9LP8hl5v5nVZMFB3jKEiJYuAoRw==", + "version": "1.530.0", + "resolved": "https://registry.npmjs.org/@github/copilot-language-server-win32-arm64/-/copilot-language-server-win32-arm64-1.530.0.tgz", + "integrity": "sha512-xlTuNNZQUg+WM2RJTvdlbcYKyQCCOWQaXTn5sGGZ38tSB+gPKcCDr39c5AgWZ4KS/1jk+pxn0b74+PMkyWyxow==", "cpu": [ "arm64" ], @@ -194,9 +194,9 @@ ] }, "node_modules/@github/copilot-language-server-win32-x64": { - "version": "1.527.5", - "resolved": "https://registry.npmjs.org/@github/copilot-language-server-win32-x64/-/copilot-language-server-win32-x64-1.527.5.tgz", - "integrity": "sha512-xO2y5p6lYZmMXHGeEqgIXQ8N2kQnvARHDypHiF95twDzNCjXiXDso9IltbLZVGDMG7NQyagZxYvnRqbI1Z17dg==", + "version": "1.530.0", + "resolved": "https://registry.npmjs.org/@github/copilot-language-server-win32-x64/-/copilot-language-server-win32-x64-1.530.0.tgz", + "integrity": "sha512-tI2dPAWplfsbLL94CyuFfm3R8YfCGlT8dmPbbaa2e6E9/GoBkYugcTtDH2a5qkaPk1t2LJeUTDiN/Uhr/HNAPw==", "cpu": [ "x64" ], @@ -206,9 +206,9 @@ ] }, "node_modules/@github/copilot-linux-arm64": { - "version": "1.0.70", - "resolved": "https://registry.npmjs.org/@github/copilot-linux-arm64/-/copilot-linux-arm64-1.0.70.tgz", - "integrity": "sha512-EpR3VEEqMy5M9t3cs+6FtjX/AhyfoefzmcMAjBls+RGv1fILjaAby+rhKHzX5YVSxOu9OyQDlQVHK3kxznTU5Q==", + "version": "1.0.78", + "resolved": "https://registry.npmjs.org/@github/copilot-linux-arm64/-/copilot-linux-arm64-1.0.78.tgz", + "integrity": "sha512-K31PRKGTm252V1Lof7ypjg283R2QSm3BgoCvZfX2taos4wqC3SaTozSQKwW3dgrAx7A3G3SGEoilVCNqfigdZA==", "cpu": [ "arm64" ], @@ -221,9 +221,9 @@ } }, "node_modules/@github/copilot-linux-x64": { - "version": "1.0.70", - "resolved": "https://registry.npmjs.org/@github/copilot-linux-x64/-/copilot-linux-x64-1.0.70.tgz", - "integrity": "sha512-4pyNKunm7GEzQZ+09Dwr4BwixJVNcQGBeqiZPKWBGxcSipwj90t8tidLYdNjgmXJoLerANhXZcY52wJW/HubEA==", + "version": "1.0.78", + "resolved": "https://registry.npmjs.org/@github/copilot-linux-x64/-/copilot-linux-x64-1.0.78.tgz", + "integrity": "sha512-QK3oMtAn9dIv+1u1kx0xNpZNtZxdI+uZVIyLl7myp+Oh2Uj8BLagVv6a7uP0cDphO3TgfIdlvpepCe5MIcx0fw==", "cpu": [ "x64" ], @@ -236,9 +236,9 @@ } }, "node_modules/@github/copilot-win32-arm64": { - "version": "1.0.70", - "resolved": "https://registry.npmjs.org/@github/copilot-win32-arm64/-/copilot-win32-arm64-1.0.70.tgz", - "integrity": "sha512-oWsWCTlUyIv4S3FdYoBNCscndLrUv+C3qgbfJ9mf+5igPqbIYL8alkc8FBHWPB/cornDNj65yd4s8dZrSkFPpg==", + "version": "1.0.78", + "resolved": "https://registry.npmjs.org/@github/copilot-win32-arm64/-/copilot-win32-arm64-1.0.78.tgz", + "integrity": "sha512-ktDkFXaaecEKD3hpM6ydM9lKOdoCfsQsXCmzLzE7DCmSpbbMCdfPfWfZ7MOclmKmpZ5/MNfr4U2l8CUqGerzYA==", "cpu": [ "arm64" ], @@ -251,9 +251,9 @@ } }, "node_modules/@github/copilot-win32-x64": { - "version": "1.0.70", - "resolved": "https://registry.npmjs.org/@github/copilot-win32-x64/-/copilot-win32-x64-1.0.70.tgz", - "integrity": "sha512-KFDZ750CwhjKF6uATQ1pv1XrYHI+/qTQta954gYZaa+YJEXRstGd284uJ6NI3YXfshZwhTs64JdjN4xLodYwrA==", + "version": "1.0.78", + "resolved": "https://registry.npmjs.org/@github/copilot-win32-x64/-/copilot-win32-x64-1.0.78.tgz", + "integrity": "sha512-Gd8l2T4eqYEWlOEPd0SZznQ+YYgYrwOkE0QXodMkhCBbPdgu/uTzb7mnISWwnVAgqs7pONdF1GOpHkTo+ay8CQ==", "cpu": [ "x64" ], @@ -4029,95 +4029,95 @@ "dev": true }, "@github/copilot-darwin-arm64": { - "version": "1.0.70", - "resolved": "https://registry.npmjs.org/@github/copilot-darwin-arm64/-/copilot-darwin-arm64-1.0.70.tgz", - "integrity": "sha512-NewReqBmTxtAzApZNmUsY4Xqy8N086MiQm7k35i9i+WrGyRiHxdZ/n/lMLCkqWoelr7pZhcZ7gQ7fHbEq1KdoQ==", + "version": "1.0.78", + "resolved": "https://registry.npmjs.org/@github/copilot-darwin-arm64/-/copilot-darwin-arm64-1.0.78.tgz", + "integrity": "sha512-P11+VyWg8ad0WlywGtO2d7AxqTLJv4hkUicFg6Ycth5lfk00aCu/74YOOZSPO6C2bBBJhAza7oAdmauM6KEojw==", "optional": true }, "@github/copilot-darwin-x64": { - "version": "1.0.70", - "resolved": "https://registry.npmjs.org/@github/copilot-darwin-x64/-/copilot-darwin-x64-1.0.70.tgz", - "integrity": "sha512-ydUEYI3udNAjdMsLPFQLH/JG9YFKcxuAUxYIyOK+F/m/Of9nODKdYa2hw2mlLanP4cNyuxGLflu+rtIqIb+cPw==", + "version": "1.0.78", + "resolved": "https://registry.npmjs.org/@github/copilot-darwin-x64/-/copilot-darwin-x64-1.0.78.tgz", + "integrity": "sha512-stimP3WDFs2GU8nJzTJbtRpZViV4bsf80yg7QrFq+G4RISQ3Nihg/3/H0U6UQF1+txMJ/Ohmb5RFYxSw1Hj2sw==", "optional": true }, "@github/copilot-language-server": { - "version": "1.527.5", - "resolved": "https://registry.npmjs.org/@github/copilot-language-server/-/copilot-language-server-1.527.5.tgz", - "integrity": "sha512-0p2pCd6bqTORsyLxtGCcu/u5TkkFjjnFCJ386Os/rNsMTYJ45QgiU76Mz2bQJi4NNOjrirCQhboKhZSDsCOsJQ==", - "requires": { - "@github/copilot-darwin-arm64": "1.0.70", - "@github/copilot-darwin-x64": "1.0.70", - "@github/copilot-language-server-darwin-arm64": "1.527.5", - "@github/copilot-language-server-darwin-x64": "1.527.5", - "@github/copilot-language-server-linux-arm64": "1.527.5", - "@github/copilot-language-server-linux-x64": "1.527.5", - "@github/copilot-language-server-win32-arm64": "1.527.5", - "@github/copilot-language-server-win32-x64": "1.527.5", - "@github/copilot-linux-arm64": "1.0.70", - "@github/copilot-linux-x64": "1.0.70", - "@github/copilot-win32-arm64": "1.0.70", - "@github/copilot-win32-x64": "1.0.70", + "version": "1.530.0", + "resolved": "https://registry.npmjs.org/@github/copilot-language-server/-/copilot-language-server-1.530.0.tgz", + "integrity": "sha512-7OjTbKqkA9NSf8Yjms19qglBswdK7IkorbzB0EpfPOPeT8UdmxW0fiYCiaTsyB+VizMzchrPh0nbik8gH8boKw==", + "requires": { + "@github/copilot-darwin-arm64": "1.0.78", + "@github/copilot-darwin-x64": "1.0.78", + "@github/copilot-language-server-darwin-arm64": "1.530.0", + "@github/copilot-language-server-darwin-x64": "1.530.0", + "@github/copilot-language-server-linux-arm64": "1.530.0", + "@github/copilot-language-server-linux-x64": "1.530.0", + "@github/copilot-language-server-win32-arm64": "1.530.0", + "@github/copilot-language-server-win32-x64": "1.530.0", + "@github/copilot-linux-arm64": "1.0.78", + "@github/copilot-linux-x64": "1.0.78", + "@github/copilot-win32-arm64": "1.0.78", + "@github/copilot-win32-x64": "1.0.78", "vscode-languageserver-protocol": "^3.17.5" } }, "@github/copilot-language-server-darwin-arm64": { - "version": "1.527.5", - "resolved": "https://registry.npmjs.org/@github/copilot-language-server-darwin-arm64/-/copilot-language-server-darwin-arm64-1.527.5.tgz", - "integrity": "sha512-rw1vq0vUbRGo+m/00yaRvAfK5CPM1fl6TCs+LyrZ272dxzD9Rh/BTrp0x8p4UqepctQsIyK5Js4MxPPvkz9PxA==", + "version": "1.530.0", + "resolved": "https://registry.npmjs.org/@github/copilot-language-server-darwin-arm64/-/copilot-language-server-darwin-arm64-1.530.0.tgz", + "integrity": "sha512-WREnhFgvqDUHOYZTOmd0XldA3DtJ7XEn4leAezDEW4iwhoTyROmGSjH02ROj2l22Zdtq5byATidjDHGn5CnO/g==", "optional": true }, "@github/copilot-language-server-darwin-x64": { - "version": "1.527.5", - "resolved": "https://registry.npmjs.org/@github/copilot-language-server-darwin-x64/-/copilot-language-server-darwin-x64-1.527.5.tgz", - "integrity": "sha512-H1Pc+Bb6C379EeFIp7nOMX2ZWiOdu6vkCA4ty1EmKkVG0RFCtSAPvM1LwP/Ysbfv8sidsXKCopNMN3ur5o3mjw==", + "version": "1.530.0", + "resolved": "https://registry.npmjs.org/@github/copilot-language-server-darwin-x64/-/copilot-language-server-darwin-x64-1.530.0.tgz", + "integrity": "sha512-rHBRaA6MtbQSCOF7vDgcPEiukWmmggwuoOcqqi7yKvcq6/K7MDW9jtydq6HP/mg0fUe44l0sG/h9/MQlQcljvA==", "optional": true }, "@github/copilot-language-server-linux-arm64": { - "version": "1.527.5", - "resolved": "https://registry.npmjs.org/@github/copilot-language-server-linux-arm64/-/copilot-language-server-linux-arm64-1.527.5.tgz", - "integrity": "sha512-LZlMlA7tUTMpmUoEqHsDsVA1p3P/pPOw02QLexx2aFFnSaOEAIFMA2hDuYtKWFt2cO1E7p95IlkQCdXXr5mMEg==", + "version": "1.530.0", + "resolved": "https://registry.npmjs.org/@github/copilot-language-server-linux-arm64/-/copilot-language-server-linux-arm64-1.530.0.tgz", + "integrity": "sha512-2Wvdm3IogKHSUsN6zlleK91CdKoiGIf2R0n0P5ZHcLxaGix29fPGMa/hl5A9wkpnnV7szBDUKTHqwZoMxtPOvA==", "optional": true }, "@github/copilot-language-server-linux-x64": { - "version": "1.527.5", - "resolved": "https://registry.npmjs.org/@github/copilot-language-server-linux-x64/-/copilot-language-server-linux-x64-1.527.5.tgz", - "integrity": "sha512-YLusnRHbF/uw7R5Y5nDwR1ai9PzGtirAZHxKKO5nFFs5EaZX80CeLk9OqPZ6TegXb2Bqm7hJfSp94gvthHPyxQ==", + "version": "1.530.0", + "resolved": "https://registry.npmjs.org/@github/copilot-language-server-linux-x64/-/copilot-language-server-linux-x64-1.530.0.tgz", + "integrity": "sha512-1MIg6t+TS67sEpjb5jqf2BhjRrYW3sLlSyCxAT+a76ZUwlLjmrVFlpU2R6B/HIQDQhoxuvZwQ6YXmfxCVufDmw==", "optional": true }, "@github/copilot-language-server-win32-arm64": { - "version": "1.527.5", - "resolved": "https://registry.npmjs.org/@github/copilot-language-server-win32-arm64/-/copilot-language-server-win32-arm64-1.527.5.tgz", - "integrity": "sha512-Zgo3uh46DTRDVTVEf5tp0RJO+MhBykdXpZn7TvCLdu5GHzgqBX6tt7RYYMi9LP8hl5v5nVZMFB3jKEiJYuAoRw==", + "version": "1.530.0", + "resolved": "https://registry.npmjs.org/@github/copilot-language-server-win32-arm64/-/copilot-language-server-win32-arm64-1.530.0.tgz", + "integrity": "sha512-xlTuNNZQUg+WM2RJTvdlbcYKyQCCOWQaXTn5sGGZ38tSB+gPKcCDr39c5AgWZ4KS/1jk+pxn0b74+PMkyWyxow==", "optional": true }, "@github/copilot-language-server-win32-x64": { - "version": "1.527.5", - "resolved": "https://registry.npmjs.org/@github/copilot-language-server-win32-x64/-/copilot-language-server-win32-x64-1.527.5.tgz", - "integrity": "sha512-xO2y5p6lYZmMXHGeEqgIXQ8N2kQnvARHDypHiF95twDzNCjXiXDso9IltbLZVGDMG7NQyagZxYvnRqbI1Z17dg==", + "version": "1.530.0", + "resolved": "https://registry.npmjs.org/@github/copilot-language-server-win32-x64/-/copilot-language-server-win32-x64-1.530.0.tgz", + "integrity": "sha512-tI2dPAWplfsbLL94CyuFfm3R8YfCGlT8dmPbbaa2e6E9/GoBkYugcTtDH2a5qkaPk1t2LJeUTDiN/Uhr/HNAPw==", "optional": true }, "@github/copilot-linux-arm64": { - "version": "1.0.70", - "resolved": "https://registry.npmjs.org/@github/copilot-linux-arm64/-/copilot-linux-arm64-1.0.70.tgz", - "integrity": "sha512-EpR3VEEqMy5M9t3cs+6FtjX/AhyfoefzmcMAjBls+RGv1fILjaAby+rhKHzX5YVSxOu9OyQDlQVHK3kxznTU5Q==", + "version": "1.0.78", + "resolved": "https://registry.npmjs.org/@github/copilot-linux-arm64/-/copilot-linux-arm64-1.0.78.tgz", + "integrity": "sha512-K31PRKGTm252V1Lof7ypjg283R2QSm3BgoCvZfX2taos4wqC3SaTozSQKwW3dgrAx7A3G3SGEoilVCNqfigdZA==", "optional": true }, "@github/copilot-linux-x64": { - "version": "1.0.70", - "resolved": "https://registry.npmjs.org/@github/copilot-linux-x64/-/copilot-linux-x64-1.0.70.tgz", - "integrity": "sha512-4pyNKunm7GEzQZ+09Dwr4BwixJVNcQGBeqiZPKWBGxcSipwj90t8tidLYdNjgmXJoLerANhXZcY52wJW/HubEA==", + "version": "1.0.78", + "resolved": "https://registry.npmjs.org/@github/copilot-linux-x64/-/copilot-linux-x64-1.0.78.tgz", + "integrity": "sha512-QK3oMtAn9dIv+1u1kx0xNpZNtZxdI+uZVIyLl7myp+Oh2Uj8BLagVv6a7uP0cDphO3TgfIdlvpepCe5MIcx0fw==", "optional": true }, "@github/copilot-win32-arm64": { - "version": "1.0.70", - "resolved": "https://registry.npmjs.org/@github/copilot-win32-arm64/-/copilot-win32-arm64-1.0.70.tgz", - "integrity": "sha512-oWsWCTlUyIv4S3FdYoBNCscndLrUv+C3qgbfJ9mf+5igPqbIYL8alkc8FBHWPB/cornDNj65yd4s8dZrSkFPpg==", + "version": "1.0.78", + "resolved": "https://registry.npmjs.org/@github/copilot-win32-arm64/-/copilot-win32-arm64-1.0.78.tgz", + "integrity": "sha512-ktDkFXaaecEKD3hpM6ydM9lKOdoCfsQsXCmzLzE7DCmSpbbMCdfPfWfZ7MOclmKmpZ5/MNfr4U2l8CUqGerzYA==", "optional": true }, "@github/copilot-win32-x64": { - "version": "1.0.70", - "resolved": "https://registry.npmjs.org/@github/copilot-win32-x64/-/copilot-win32-x64-1.0.70.tgz", - "integrity": "sha512-KFDZ750CwhjKF6uATQ1pv1XrYHI+/qTQta954gYZaa+YJEXRstGd284uJ6NI3YXfshZwhTs64JdjN4xLodYwrA==", + "version": "1.0.78", + "resolved": "https://registry.npmjs.org/@github/copilot-win32-x64/-/copilot-win32-x64-1.0.78.tgz", + "integrity": "sha512-Gd8l2T4eqYEWlOEPd0SZznQ+YYgYrwOkE0QXodMkhCBbPdgu/uTzb7mnISWwnVAgqs7pONdF1GOpHkTo+ay8CQ==", "optional": true }, "@isaacs/cliui": { diff --git a/package.json b/package.json index f83470be..c7cdf1f7 100644 --- a/package.json +++ b/package.json @@ -1215,7 +1215,7 @@ "webpack-cli": "^4.10.0" }, "dependencies": { - "@github/copilot-language-server": "^1.527.5", + "@github/copilot-language-server": "^1.530.0", "@octokit/rest": "^21.1.1", "await-lock": "^2.2.2", "fmtr": "^1.1.4", From 6b9e821d2fd0ee31d9de94ef00a4fe6b8df93e9f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 28 Aug 2026 13:37:09 +0800 Subject: [PATCH 351/352] chore(deps): bump the github-actions group across 1 directory with 6 updates Bumps the github-actions group with 6 updates in the / directory: | Package | From | To | | --- | --- | --- | | [actions/checkout](https://github.com/actions/checkout) | `2.8.0` | `7.0.1` | | [actions/setup-java](https://github.com/actions/setup-java) | `4.9.1` | `5.7.0` | | [actions/setup-node](https://github.com/actions/setup-node) | `4.4.0` | `7.0.0` | | [actions/upload-artifact](https://github.com/actions/upload-artifact) | `4.6.2` | `7.0.1` | | [actions/download-artifact](https://github.com/actions/download-artifact) | `4.3.0` | `8.0.1` | | [actions/github-script](https://github.com/actions/github-script) | `6.4.1` | `9.0.0` | Updates `actions/checkout` from 2.8.0 to 7.0.1 - [Release notes](https://github.com/actions/checkout/releases) - [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md) - [Commits](https://github.com/actions/checkout/compare/v2.8.0...3d3c42e5aac5ba805825da76410c181273ba90b1) Updates `actions/setup-java` from 4.9.1 to 5.7.0 - [Release notes](https://github.com/actions/setup-java/releases) - [Commits](https://github.com/actions/setup-java/compare/cf277c60eb25467037889841efdb72551f06f6c3...b6effb05e454b25005698d916606bdc6ffcbf961) Updates `actions/setup-node` from 4.4.0 to 7.0.0 - [Release notes](https://github.com/actions/setup-node/releases) - [Commits](https://github.com/actions/setup-node/compare/49933ea5288caeca8642d1e84afbd3f7d6820020...820762786026740c76f36085b0efc47a31fe5020) Updates `actions/upload-artifact` from 4.6.2 to 7.0.1 - [Release notes](https://github.com/actions/upload-artifact/releases) - [Commits](https://github.com/actions/upload-artifact/compare/ea165f8d65b6e75b540449e92b4886f43607fa02...043fb46d1a93c77aae656e7c1c64a875d1fc6a0a) Updates `actions/download-artifact` from 4.3.0 to 8.0.1 - [Release notes](https://github.com/actions/download-artifact/releases) - [Commits](https://github.com/actions/download-artifact/compare/d3f86a106a0bac45b974a628896c90dbdf5c8093...3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c) Updates `actions/github-script` from 6.4.1 to 9.0.0 - [Release notes](https://github.com/actions/github-script/releases) - [Commits](https://github.com/actions/github-script/compare/d7906e4ad0b1822421a7e6a35d5ca353c962f410...3a2844b7e9c422d3c10d287c895573f7108da1b3) --- updated-dependencies: - dependency-name: actions/checkout dependency-version: 7.0.1 dependency-type: direct:production update-type: version-update:semver-major dependency-group: github-actions - dependency-name: actions/download-artifact dependency-version: 8.0.1 dependency-type: direct:production update-type: version-update:semver-major dependency-group: github-actions - dependency-name: actions/github-script dependency-version: 9.0.0 dependency-type: direct:production update-type: version-update:semver-major dependency-group: github-actions - dependency-name: actions/setup-java dependency-version: 5.7.0 dependency-type: direct:production update-type: version-update:semver-major dependency-group: github-actions - dependency-name: actions/setup-node dependency-version: 7.0.0 dependency-type: direct:production update-type: version-update:semver-major dependency-group: github-actions - dependency-name: actions/upload-artifact dependency-version: 7.0.1 dependency-type: direct:production update-type: version-update:semver-major dependency-group: github-actions ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/e2eUI.yml | 50 ++++++++++---------- .github/workflows/linux.yml | 6 +-- .github/workflows/macOS.yml | 6 +-- .github/workflows/triage-agent.yml | 4 +- .github/workflows/triage-all-open-issues.yml | 4 +- .github/workflows/windows.yml | 6 +-- 6 files changed, 38 insertions(+), 38 deletions(-) diff --git a/.github/workflows/e2eUI.yml b/.github/workflows/e2eUI.yml index 53933d34..2c3a7f2f 100644 --- a/.github/workflows/e2eUI.yml +++ b/.github/workflows/e2eUI.yml @@ -32,16 +32,16 @@ jobs: runs-on: ubuntu-latest timeout-minutes: 10 steps: - - uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4.4.0 + - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 - name: Set up JDK 21 - uses: actions/setup-java@cf277c60eb25467037889841efdb72551f06f6c3 # v4.9.1 + uses: actions/setup-java@b6effb05e454b25005698d916606bdc6ffcbf961 # v5.7.0 with: java-version: '21' distribution: 'temurin' - name: Setup Node.js environment - uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 + uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0 with: node-version: 20 @@ -62,7 +62,7 @@ jobs: outputs: matrix: ${{ steps.scan.outputs.matrix }} steps: - - uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4.4.0 + - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 - name: Scan test plans id: scan @@ -78,16 +78,16 @@ jobs: runs-on: ubuntu-latest timeout-minutes: 20 steps: - - uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4.4.0 + - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 - name: Set up JDK 21 - uses: actions/setup-java@cf277c60eb25467037889841efdb72551f06f6c3 # v4.9.1 + uses: actions/setup-java@b6effb05e454b25005698d916606bdc6ffcbf961 # v5.7.0 with: java-version: '21' distribution: 'temurin' - name: Setup Node.js environment - uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 + uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0 with: node-version: 20 @@ -104,7 +104,7 @@ jobs: run: vsce package -o vscode-java-dependency.vsix - name: Upload VSIX artifact - uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2 + uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 with: name: vsix-linux path: vscode-java-dependency.vsix @@ -116,16 +116,16 @@ jobs: runs-on: windows-latest timeout-minutes: 20 steps: - - uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4.4.0 + - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 - name: Set up JDK 21 - uses: actions/setup-java@cf277c60eb25467037889841efdb72551f06f6c3 # v4.9.1 + uses: actions/setup-java@b6effb05e454b25005698d916606bdc6ffcbf961 # v5.7.0 with: java-version: '21' distribution: 'temurin' - name: Setup Node.js environment - uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 + uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0 with: node-version: 20 @@ -142,7 +142,7 @@ jobs: run: vsce package -o vscode-java-dependency.vsix - name: Upload VSIX artifact - uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2 + uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 with: name: vsix-windows path: vscode-java-dependency.vsix @@ -160,16 +160,16 @@ jobs: plan: ${{ fromJson(needs.discover-plans.outputs.matrix) }} steps: - - uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4.4.0 + - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 - name: Set up JDK 21 - uses: actions/setup-java@cf277c60eb25467037889841efdb72551f06f6c3 # v4.9.1 + uses: actions/setup-java@b6effb05e454b25005698d916606bdc6ffcbf961 # v5.7.0 with: java-version: '21' distribution: 'temurin' - name: Setup Node.js environment - uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 + uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0 with: node-version: 22 @@ -177,7 +177,7 @@ jobs: run: npm install -g @vscjava/vscode-autotest - name: Download VSIX artifact - uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4.3.0 + uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1 with: name: vsix-linux path: . @@ -197,7 +197,7 @@ jobs: - name: Upload test results if: ${{ always() }} - uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2 + uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 with: name: e2e-results-linux-${{ matrix.plan }} path: test-results/ @@ -215,16 +215,16 @@ jobs: plan: ${{ fromJson(needs.discover-plans.outputs.matrix) }} steps: - - uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4.4.0 + - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 - name: Set up JDK 21 - uses: actions/setup-java@cf277c60eb25467037889841efdb72551f06f6c3 # v4.9.1 + uses: actions/setup-java@b6effb05e454b25005698d916606bdc6ffcbf961 # v5.7.0 with: java-version: '21' distribution: 'temurin' - name: Setup Node.js environment - uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 + uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0 with: node-version: 22 @@ -232,7 +232,7 @@ jobs: run: npm install -g @vscjava/vscode-autotest - name: Download VSIX artifact - uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4.3.0 + uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1 with: name: vsix-windows path: . @@ -248,7 +248,7 @@ jobs: - name: Upload test results if: ${{ always() }} - uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2 + uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 with: name: e2e-results-windows-${{ matrix.plan }} path: test-results/ @@ -262,7 +262,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Setup Node.js environment - uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 + uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0 with: node-version: 22 @@ -270,7 +270,7 @@ jobs: run: npm install -g @vscjava/vscode-autotest - name: Download all plan results - uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4.3.0 + uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1 with: pattern: e2e-results-* path: all-results @@ -316,7 +316,7 @@ jobs: - name: Upload aggregate summary if: always() - uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2 + uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 with: name: e2e-aggregate-summary path: test-results/summary.md diff --git a/.github/workflows/linux.yml b/.github/workflows/linux.yml index 6ecbe167..f2ec7b3d 100644 --- a/.github/workflows/linux.yml +++ b/.github/workflows/linux.yml @@ -12,7 +12,7 @@ jobs: runs-on: ubuntu-latest timeout-minutes: 30 steps: - - uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4.4.0 + - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 - name: Setup Build Environment run: | @@ -22,13 +22,13 @@ jobs: sleep 3 - name: Set up JDK 21 - uses: actions/setup-java@cf277c60eb25467037889841efdb72551f06f6c3 # v4.9.1 + uses: actions/setup-java@b6effb05e454b25005698d916606bdc6ffcbf961 # v5.7.0 with: distribution: 'temurin' java-version: '21' - name: Setup Node.js environment - uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 + uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0 with: node-version: 20 diff --git a/.github/workflows/macOS.yml b/.github/workflows/macOS.yml index bb779d46..b2a87373 100644 --- a/.github/workflows/macOS.yml +++ b/.github/workflows/macOS.yml @@ -12,16 +12,16 @@ jobs: runs-on: macos-latest timeout-minutes: 30 steps: - - uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4.4.0 + - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 - name: Set up JDK 21 - uses: actions/setup-java@cf277c60eb25467037889841efdb72551f06f6c3 # v4.9.1 + uses: actions/setup-java@b6effb05e454b25005698d916606bdc6ffcbf961 # v5.7.0 with: distribution: 'temurin' java-version: '21' - name: Setup Node.js environment - uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 + uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0 with: node-version: 20 diff --git a/.github/workflows/triage-agent.yml b/.github/workflows/triage-agent.yml index 7ecff053..82d239dd 100644 --- a/.github/workflows/triage-agent.yml +++ b/.github/workflows/triage-agent.yml @@ -21,11 +21,11 @@ jobs: steps: - name: Checkout repository - uses: actions/checkout@0717577d45739eb3c851188b29f50ed6c0b2194e # v2.8.0 + uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 - name: Get issue data id: get_issue - uses: actions/github-script@d7906e4ad0b1822421a7e6a35d5ca353c962f410 # v6.4.1 + uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 with: script: | const eventName = context.eventName; diff --git a/.github/workflows/triage-all-open-issues.yml b/.github/workflows/triage-all-open-issues.yml index 05dae014..9d2fd063 100644 --- a/.github/workflows/triage-all-open-issues.yml +++ b/.github/workflows/triage-all-open-issues.yml @@ -28,7 +28,7 @@ jobs: steps: - name: Get all open issues id: get_issues - uses: actions/github-script@d7906e4ad0b1822421a7e6a35d5ca353c962f410 # v6.4.1 + uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 with: script: | // Use Search API to filter issues at API level @@ -85,7 +85,7 @@ jobs: - name: Trigger triage workflow for issue if: inputs.dry_run != true - uses: actions/github-script@d7906e4ad0b1822421a7e6a35d5ca353c962f410 # v6.4.1 + uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 with: script: | const issueNumber = '${{ matrix.issue_number }}'; diff --git a/.github/workflows/windows.yml b/.github/workflows/windows.yml index e297947b..59cca68f 100644 --- a/.github/workflows/windows.yml +++ b/.github/workflows/windows.yml @@ -12,16 +12,16 @@ jobs: runs-on: windows-latest timeout-minutes: 30 steps: - - uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4.4.0 + - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 - name: Set up JDK 21 - uses: actions/setup-java@cf277c60eb25467037889841efdb72551f06f6c3 # v4.9.1 + uses: actions/setup-java@b6effb05e454b25005698d916606bdc6ffcbf961 # v5.7.0 with: distribution: 'temurin' java-version: '21' - name: Setup Node.js environment - uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 + uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0 with: node-version: 20 From d1c37b00794dd399afd2fbdf17abd68ce7fc3954 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 28 Aug 2026 14:03:51 +0800 Subject: [PATCH 352/352] chore(deps-dev): bump copy-webpack-plugin from 11.0.0 to 14.0.0 (#1053) Bumps [copy-webpack-plugin](https://github.com/webpack/copy-webpack-plugin) from 11.0.0 to 14.0.0. - [Release notes](https://github.com/webpack/copy-webpack-plugin/releases) - [Changelog](https://github.com/webpack/copy-webpack-plugin/blob/main/CHANGELOG.md) - [Commits](https://github.com/webpack/copy-webpack-plugin/compare/v11.0.0...v14.0.0) --- updated-dependencies: - dependency-name: copy-webpack-plugin dependency-version: 14.0.0 dependency-type: direct:development update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Changyong Gong --- package-lock.json | 100 ++++++++++++++++++++++++++++++++++++++-------- package.json | 2 +- 2 files changed, 85 insertions(+), 17 deletions(-) diff --git a/package-lock.json b/package-lock.json index 31a82d81..166877f0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -31,7 +31,7 @@ "@types/semver": "^7.3.13", "@types/vscode": "1.95.0", "@vscode/test-electron": "^3.1.0", - "copy-webpack-plugin": "^11.0.0", + "copy-webpack-plugin": "^14.0.0", "glob": "^7.2.3", "mocha": "^11.7.5", "ts-loader": "^9.6.2", @@ -1420,20 +1420,19 @@ "dev": true }, "node_modules/copy-webpack-plugin": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-11.0.0.tgz", - "integrity": "sha512-fX2MWpamkW0hZxMEg0+mYnA40LTosOSa5TqZ9GYIBzyJa9C3QUaMPSE2xAi/buNr8u89SfD9wHSQVBzrRa/SOQ==", + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-14.0.0.tgz", + "integrity": "sha512-3JLW90aBGeaTLpM7mYQKpnVdgsUZRExY55giiZgLuX/xTQRUs1dOCwbBnWnvY6Q6rfZoXMNwzOQJCSZPppfqXA==", "dev": true, "dependencies": { - "fast-glob": "^3.2.11", "glob-parent": "^6.0.1", - "globby": "^13.1.1", "normalize-path": "^3.0.0", - "schema-utils": "^4.0.0", - "serialize-javascript": "^6.0.0" + "schema-utils": "^4.2.0", + "serialize-javascript": "^7.0.3", + "tinyglobby": "^0.2.12" }, "engines": { - "node": ">= 14.15.0" + "node": ">= 20.9.0" }, "funding": { "type": "opencollective", @@ -3349,6 +3348,51 @@ "node": ">=10" } }, + "node_modules/tinyglobby": { + "version": "0.2.17", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.17.tgz", + "integrity": "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==", + "dev": true, + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.4" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/tinyglobby/node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/tinyglobby/node_modules/picomatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.5.tgz", + "integrity": "sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -5020,17 +5064,16 @@ "dev": true }, "copy-webpack-plugin": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-11.0.0.tgz", - "integrity": "sha512-fX2MWpamkW0hZxMEg0+mYnA40LTosOSa5TqZ9GYIBzyJa9C3QUaMPSE2xAi/buNr8u89SfD9wHSQVBzrRa/SOQ==", + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-14.0.0.tgz", + "integrity": "sha512-3JLW90aBGeaTLpM7mYQKpnVdgsUZRExY55giiZgLuX/xTQRUs1dOCwbBnWnvY6Q6rfZoXMNwzOQJCSZPppfqXA==", "dev": true, "requires": { - "fast-glob": "^3.2.11", "glob-parent": "^6.0.1", - "globby": "^13.1.1", "normalize-path": "^3.0.0", - "schema-utils": "^4.0.0", - "serialize-javascript": ">=7.0.5" + "schema-utils": "^4.2.0", + "serialize-javascript": ">=7.0.5", + "tinyglobby": "^0.2.12" } }, "core-util-is": { @@ -6315,6 +6358,31 @@ "source-map-support": "~0.5.20" } }, + "tinyglobby": { + "version": "0.2.17", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.17.tgz", + "integrity": "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==", + "dev": true, + "requires": { + "fdir": "^6.5.0", + "picomatch": "^4.0.4" + }, + "dependencies": { + "fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "requires": {} + }, + "picomatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.5.tgz", + "integrity": "sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==", + "dev": true + } + } + }, "to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", diff --git a/package.json b/package.json index c7cdf1f7..9206965c 100644 --- a/package.json +++ b/package.json @@ -1205,7 +1205,7 @@ "@types/semver": "^7.3.13", "@types/vscode": "1.95.0", "@vscode/test-electron": "^3.1.0", - "copy-webpack-plugin": "^11.0.0", + "copy-webpack-plugin": "^14.0.0", "glob": "^7.2.3", "mocha": "^11.7.5", "ts-loader": "^9.6.2",

    a_s4n;d%^<>cv1vtIW)VE$ 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%0D=*A9>D?$Di8sJ3s$gMhYT=)f#w-Tn4yBCX||z- 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