diff --git a/.eslintignore b/.eslintignore deleted file mode 100644 index 35ef0867f..000000000 --- a/.eslintignore +++ /dev/null @@ -1,22 +0,0 @@ -# .gitignore -out -server -node_modules -*.vsix -.DS_Store -.vscode-test -undefined -target -dist -jre -lombok -bin/ -.settings -.classpath -.project -test/resources/projects/**/.vscode -test/resources/projects/maven/salut/testGradle -test-temp - -# specific to eslint -vscode*.d.ts \ No newline at end of file diff --git a/.eslintrc.json b/.eslintrc.json deleted file mode 100644 index c3143ae2c..000000000 --- a/.eslintrc.json +++ /dev/null @@ -1,110 +0,0 @@ -{ - "env": { - "es6": true, - "node": true - }, - "parser": "@typescript-eslint/parser", - "parserOptions": { - "ecmaVersion": "latest", - "project": "tsconfig.json" - }, - "plugins": [ - "@typescript-eslint" - ], - "rules": { - "@typescript-eslint/member-delimiter-style": [ - "error", - { - "multiline": { - "delimiter": "semi", - "requireLast": true - }, - "singleline": { - "delimiter": "semi", - "requireLast": false - } - } - ], - "@typescript-eslint/naming-convention": "error", - "@typescript-eslint/no-unnecessary-boolean-literal-compare": "error", - "@typescript-eslint/prefer-for-of": "error", - "@typescript-eslint/semi": [ - "error", - "always" - ], - "@typescript-eslint/type-annotation-spacing": "error", - "curly": [ - "error", - "multi-line" - ], - "eqeqeq": [ - "error", - "always" - ], - "id-denylist": [ - "error", - "any", - "Number", - "number", - "String", - "string", - "Boolean", - "boolean", - "Undefined", - "undefined" - ], - "id-match": "error", - "no-debugger": "error", - "no-multiple-empty-lines": "error", - "no-trailing-spaces": "error", - "no-underscore-dangle": "error", - "no-var": "error", - "prefer-arrow-callback": [ - "error", - { "allowNamedFunctions": true } - ], - "prefer-const": "error", - "prefer-template": "error", - "quote-props": [ - "error", - "as-needed" - ], - "semi": "error", - "spaced-comment": [ - "error", - "always", - { - "markers": [ - "/" - ] - } - ] - }, - "overrides": [ - { - "files": [ - "**/*.js" - ], - "rules": { - "@typescript-eslint/no-var-requires": "off", - "@typescript-eslint/naming-convention": "off", - "@typescript-eslint/semi": "off", - "prefer-arrow/prefer-arrow-functions": "off", - "prefer-arrow-callback": "off", - "no-useless-escape": "off", - "spaced-comment": "off", - "semi": "off", - "prefer-template": "off", - "prefer-const": "off" - } - }, - { - "files": [ - "**/*.test.ts" - ], - "rules": { - "prefer-arrow-callback": "off" - } - } - ] -} \ No newline at end of file diff --git a/.github/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE.md deleted file mode 100644 index 6ace17dc5..000000000 --- a/.github/ISSUE_TEMPLATE.md +++ /dev/null @@ -1,25 +0,0 @@ - - -[provide a description of the issue] - -##### Environment -- Operating System: -- JDK version: -- Visual Studio Code version: -- Java extension version: - -##### Steps To Reproduce -1. [step 1] -2. [step 2] - -[Please attach a sample project reproducing the error] -[Please attach logs](https://github.com/redhat-developer/vscode-java/wiki/Troubleshooting#enable-logging) - -##### Current Result - -##### Expected Result - -##### Additional Informations diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md new file mode 100644 index 000000000..ab4541af8 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -0,0 +1,34 @@ +--- +name: ๐Ÿ› Bug report +about: Report an issue about editing, completion, navigation, build, etc. +title: '' +labels: ['bug'] +assignees: '' + +--- + +**Describe the bug** +A clear and concise description of what the problem is. + +**To Reproduce** +Steps to reproduce the behavior: +1. [step 1] +2. [step 2] +3. ... + +[Please attach a sample project reproducing the error] +[Please attach logs. See https://github.com/redhat-developer/vscode-java/wiki/Troubleshooting#enable-logging] + +**Expected behavior** +A clear and concise description of what you expected to happen. + +**Screenshots** +If applicable, add screenshots to help explain your problem. + +**Environment** +- Operating System: +- JDK version: +- Visual Studio Code version: +- Java extension version: + +**Additional Information** diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml new file mode 100644 index 000000000..4304c8477 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -0,0 +1,8 @@ +blank_issues_enabled: false +contact_links: + - name: ๐Ÿงช Issue about running unit tests + url: https://github.com/microsoft/vscode-java-test/issues/new + about: If your problem is about running or debugging unit tests, open an issue in the Test Runner for Java extension. + - name: ๐Ÿƒโ€โ™‚๏ธ Issue about running or debugging application code + url: https://github.com/microsoft/vscode-java-debug/issues/new + about: If your problem is about running or debugging Java application code, open an issue in the Debugger for Java extension. diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md new file mode 100644 index 000000000..36bddafeb --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature_request.md @@ -0,0 +1,20 @@ +--- +name: ๐Ÿ’ก Feature request +about: Suggest a new feature or improvement for editing, completion, navigation, build, etc. +title: '' +labels: ['enhancement'] +assignees: '' + +--- + +**Is your feature request related to a problem? Please describe.** +A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] + +**Describe the solution you'd like** +A clear and concise description of what you want to happen. + +**Describe alternatives you've considered** +A clear and concise description of any alternative solutions or features you've considered. + +**Additional context** +Add any other context or screenshots about the feature request here. \ No newline at end of file diff --git a/.github/scripts/check_and_update_jdk.py b/.github/scripts/check_and_update_jdk.py new file mode 100644 index 000000000..a297dc1cd --- /dev/null +++ b/.github/scripts/check_and_update_jdk.py @@ -0,0 +1,93 @@ +#!/usr/bin/env python3 + +import re +import requests +import json +import ast + +readme_ver_pattern = r'(?:(?<=Supports code from Java 1\.8 to Java )(\d+)|(?<=JavaSE-)~|(?<=path/to/jdk-)~)' # After resolving current_jdk, we will replace ~ + +# Query the Oracle website for the latest JDK version +response = requests.get('http://javadl-esd-secure.oracle.com/update/baseline.version') +latest_jdk = re.search(r'(?P\d+)\.?', response.text) +if latest_jdk is None: + print('Failed to retrieve latest JDK version') + exit(1) +latest_jdk = latest_jdk.group('major') +print(f'Latest JDK version: {latest_jdk}') + +# Query the vscode-java repo for the current supported JDK version +with open('README.md', 'r') as f: # Open the README.md file in read mode + readme = f.read() # Read the file content as a string +current_jdk = re.search(readme_ver_pattern, readme) # Search for the JDK version in the string +if current_jdk is None: + print('Failed to retrieve current JDK version') + exit(1) +current_jdk = current_jdk.group(1) +print(f'Current supported JDK version: {current_jdk}') + +# If the latest JDK version is not the same as the current supported JDK version, check the test status and update the files +if latest_jdk != current_jdk: + print(f'New JDK version detected: {latest_jdk}') + # Create a formatted string template from the URI structure + uri_base = 'https://ci.eclipse.org/ls/job/jdt-ls-main/lastCompletedBuild/testReport/org.eclipse.jdt.ls.core.internal.{package}/{java_class}/{method}/api/python' + # Define the test URLs to check using the template and list comprehension + tests = [ + uri_base.format(package='managers', java_class=c, method=m) for c, m in [('EclipseProjectImporterTest', 'testPreviewFeaturesDisabledByDefault'), ('InvisibleProjectImporterTest', 'testPreviewFeaturesEnabledByDefault'), ('MavenProjectImporterTest', f'testJava{latest_jdk}Project')] + ] + + # Check the test status for each test URL + all_tests_passed = True + for i in range(len(tests)): + response = requests.get(tests[i]) + if not response.ok: + print(f'Test #{i + 1} not found ({tests[i]})') + all_tests_passed = False + break + data = ast.literal_eval(response.text) # Use ast.literal_eval, because response.json() fails + try: + if data['status'] != 'PASSED': + print(f'Test #{i + 1} failed ({tests[i]})') + all_tests_passed = False + break + except KeyError: + print(f'Test #{i + 1} not found ({tests[i]})') + all_tests_passed = False + break + + # If all tests passed, update the README.md and the package.json files + if all_tests_passed: + print('All tests passed') + + # Replace the ~ with current_jdk + readme_ver_pattern = re.sub('~', current_jdk, readme_ver_pattern) + + # Write this to a file for the create-pull-request workflow + with open('latest_jdk.txt', 'w') as f: + f.write(latest_jdk) + + # Replace the current supported JDK version with the latest JDK version + readme = re.sub(readme_ver_pattern, latest_jdk, readme) + + # Write the updated README.md file + with open('README.md', 'w') as f: + f.write(readme) + + # Read the package.json file + with open('package.json', 'r') as f: + package = json.load(f) + + # Add the latest JDK version to the java.configuration.runtimes array + jdks_config = next(filter(lambda e: e['id'] == "java-jdks", package['contributes']['configuration'])) + jdks_config['properties']['java.configuration.runtimes']['items']['properties']['name']['enum'].append(f'JavaSE-{latest_jdk}') + + # Write the updated package.json file + with open('package.json', 'w') as f: + json.dump(package, f, indent=2) + else: + print('Some tests failed, aborting update') + exit(1) +else: + print('No new JDK version detected, nothing to do') + exit(0) +exit(0) diff --git a/.github/workflows/bump-jdk.yml b/.github/workflows/bump-jdk.yml new file mode 100644 index 000000000..12c77badf --- /dev/null +++ b/.github/workflows/bump-jdk.yml @@ -0,0 +1,58 @@ +name: Update JDK Version +on: + schedule: + - cron: '0 10 * * *' + workflow_dispatch: +jobs: + update-jdk-version: + runs-on: ubuntu-latest + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Set up Python + uses: actions/setup-python@v4 + with: + python-version: '3.x' + + - name: Install dependencies + run: | + python -m pip install --upgrade pip + pip install requests + + - name: Check and update JDK version + run: | + if [ -f latest_jdk.txt ]; then + rm latest_jdk.txt # Remove previous records + fi + python .github/scripts/check_and_update_jdk.py + + - name: Read latest JDK version from file + run: | + if [ -f latest_jdk.txt ]; then + version=$(cat latest_jdk.txt) + echo "Latest JDK version: $version" + echo "latest_jdk=$version" >> $GITHUB_ENV # set the latest_jdk environment variable + else + echo "No new JDK version detected, nothing to do" + exit 0 + fi + + - name: Check for existing PR + id: check_pr + run: | + pr_number=$(gh pr list --search "Found JavaSE version ${{ env.latest_jdk }}" --json number --jq '.[0].number') + echo "pr_number=$pr_number" >> $GITHUB_ENV + + - name: Branch and push changes + if: ${{ success() && env.latest_jdk != '' && steps.check_pr.outputs.pr_number == '' }} + run: | + git config --global user.email "redhattools-bot@users.noreply.github.com" + git config --global user.name "redhattools-bot" + git checkout -b "update-jdk-${{ env.latest_jdk }}" + git commit -am "Bump JDK to ${{ env.latest_jdk }}" + git push origin "update-jdk-${{ env.latest_jdk }}" + gh pr create --title "Found JavaSE version ${{ env.latest_jdk }}" --body "See [Raw logs](https://github.com/${{ github.repository }}/commit/${{ github.sha }}/checks/${{ github.check_run_id }}/logs)" + diff --git a/.github/workflows/conflictDetector.yaml b/.github/workflows/conflictDetector.yaml index 54df14e05..afa7436c8 100644 --- a/.github/workflows/conflictDetector.yaml +++ b/.github/workflows/conflictDetector.yaml @@ -1,12 +1,12 @@ on: push: branches: - - master + - main jobs: triage: runs-on: ubuntu-latest steps: - - uses: mschilde/auto-label-merge-conflicts@8c6faa8a252e35ba5e15703b3d747bf726cdb95c + - uses: mschilde/auto-label-merge-conflicts@cd484bbf0476fbe79474a937681a253e094cac3d with: CONFLICT_LABEL_NAME: "has conflicts" - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} \ No newline at end of file + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/no-response.yml b/.github/workflows/no-response.yml new file mode 100644 index 000000000..2b19f6c74 --- /dev/null +++ b/.github/workflows/no-response.yml @@ -0,0 +1,22 @@ +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: + - cron: '0 10 * * *' + +jobs: + noResponse: + runs-on: ubuntu-latest + steps: + - uses: lee-dohm/no-response@9bb0a4b5e6a45046f00353d5de7d90fb8bd773bb #v0.5.0 + with: + token: ${{ github.token }} + daysUntilClose: 30 # Number of days of inactivity before an Issue is closed for lack of response + responseRequiredLabel: "need info" # Label indicating that a response from the original author is required + 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/pr-verify.yml b/.github/workflows/pr-verify.yml index cef89af69..9240c9a1b 100644 --- a/.github/workflows/pr-verify.yml +++ b/.github/workflows/pr-verify.yml @@ -10,20 +10,21 @@ jobs: os: [macos-latest, ubuntu-latest] steps: - name: Check Out Code - uses: actions/checkout@v2 + uses: actions/checkout@v4 - name: Set Up NodeJS - uses: actions/setup-node@v2 + uses: actions/setup-node@v4 with: - node-version: '14' + node-version: '20' - name: Set Up Java - uses: actions/setup-java@v2 + uses: actions/setup-java@v4 with: - java-version: '17' - distribution: 'adopt' - - run: npm install -g typescript "vsce" + java-version: '21' + distribution: 'temurin' + - run: npm install -g typescript "@vscode/vsce" - run: wget http://download.eclipse.org/jdtls/snapshots/jdt-language-server-latest.tar.gz - run: mkdir server && tar -xvzf jdt-language-server-latest.tar.gz -C ./server && rm jdt-language-server-latest.tar.gz - run: npm install + - run: npm run repo:check - run: npm run compile - run: npm run vscode:prepublish - run: vsce package diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 000000000..eafd7f074 --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,199 @@ +name: release + +on: + schedule: + - cron: '0 8 * * *' + workflow_dispatch: + inputs: + JDT_LS_VERSION: + description: 'The (optional) release version (including qualifier) of JDT-LS to use.' + type: string + publishPreRelease: + description: 'Publish a pre-release ?' + required: true + type: choice + options: + - 'true' + - 'false' + default: 'true' + publishToMarketPlace: + description: 'Publish to VS Code Marketplace ?' + required: true + type: choice + options: + - 'true' + - 'false' + default: 'false' + publishToOVSX: + description: 'Publish to OpenVSX Registry ?' + required: true + type: choice + options: + - 'true' + - 'false' + default: 'false' +jobs: + should-build-change: + runs-on: ubuntu-latest + outputs: + repo-cache-hit: ${{ steps.cache-last-commit.outputs.cache-hit }} + steps: + - uses: actions/checkout@v5 + with: + repository: 'eclipse-jdtls/eclipse.jdt.ls' + fetch-depth: 2 + path: eclipse.jdt.ls + - uses: actions/checkout@v5 + with: + repository: 'redhat-developer/vscode-java' + fetch-depth: 2 + path: vscode-java + - run: | + pushd eclipse.jdt.ls + git rev-parse HEAD >> ../lastCommit + popd + pushd vscode-java + git rev-parse HEAD >> ../lastCommit + - name: Check New Changes + id: cache-last-commit + uses: actions/cache@v5 + with: + path: lastCommit + key: lastCommit-${{ hashFiles('lastCommit') }} + packaging-job: + runs-on: ubuntu-latest + needs: should-build-change + if: ${{ needs.should-build-change.outputs.repo-cache-hit != 'true' || github.event_name != 'schedule' }} + steps: + - name: Checkout JDT-LS + if: "${{ inputs.JDT_LS_VERSION == '' }}" + uses: actions/checkout@v5 + with: + repository: eclipse-jdtls/eclipse.jdt.ls + - name: Cache Maven local repository + uses: actions/cache@v5 + with: + path: | + ~/.m2/repository + ~/.m2/wrapper + !~/.m2/repository/org/eclipse/jdt/ls + key: maven-local-${{ hashFiles('**/pom.xml') }} + - name: Set Up Java + uses: actions/setup-java@v5 + with: + java-version: '21' + distribution: 'temurin' + - name: Build JDT-LS + if: "${{ inputs.JDT_LS_VERSION == '' }}" + run: | + ./mvnw clean verify -B -U -DskipTests -Pserver-distro + mkdir ../staging + cp org.eclipse.jdt.ls.product/distro/jdt-language-server-*.tar.gz ../staging + - name: Check Out VS Code Java + uses: actions/checkout@v5 + - name: Set Up NodeJS + uses: actions/setup-node@v5 + with: + node-version: '20' + - name: Install NodeJS dependencies + run: npm install -g typescript "@vscode/vsce" "ovsx" + - name: Download JDT-LS Release + if: "${{ inputs.JDT_LS_VERSION != '' }}" + run: | + version=`echo ${{ inputs.JDT_LS_VERSION }} | cut -d- -f1` + curl -LO https://download.eclipse.org/jdtls/milestones/${version}/jdt-language-server-${{ inputs.JDT_LS_VERSION }}.tar.gz + - name: Build vscode-java + run: | + npm install + - name: Prepare JDT-LS + run: | + rm -rf ./out + mkdir server/ + if [ -e jdt-language-server-*.tar.gz ]; then + tar -xf jdt-language-server-*.tar.gz -C server/ + else + tar -xf ../staging/jdt-language-server-*.tar.gz -C server/ + fi + echo "EXT_VERSION=$(cat package.json | jq -r .version)" >> $GITHUB_ENV + - name: Test vscode-java + env: + SKIP_COMMANDS_TEST: true + run: | + xvfb-run --auto-servernum npm run test --silent + continue-on-error: true + - name: Clean tests + run: npm run clean-test-folder + - name: Prepare Lombok Support + if: false + run: | + npm run download-lombok + - name: Prepare Pre-Release + if: ${{ github.event_name == 'schedule' || inputs.publishPreRelease == 'true' }} + run: | + npm run prepare-pre-release + echo "publishPreReleaseFlag=--pre-release" >> $GITHUB_ENV + - name: Package vscode-java + run: | + # Compile JavaScript once for the universal VSIX (webpack is platform-independent) + vsce package ${{ env.publishPreReleaseFlag }} -o vscode-java-${{ env.EXT_VERSION }}-${GITHUB_RUN_NUMBER}.vsix + + # Package for each platform (only downloads JDK and creates VSIX, no recompilation) + platforms=("win32-x64" "win32-arm64" "linux-x64" "linux-arm64" "darwin-x64" "darwin-arm64") + for platform in ${platforms[@]}; do + npm run download-jre -- --target ${platform} --javaVersion 21 + SKIP_WEBPACK=true vsce package ${{ env.publishPreReleaseFlag }} --target ${platform} -o java-${platform}-${{ env.EXT_VERSION }}-${GITHUB_RUN_NUMBER}.vsix + done + + ls -lash *.vsix + - name: Upload VSIX Artifacts + uses: actions/upload-artifact@v5 + with: + name: vscode-java + path: | + java-*-${{ env.EXT_VERSION }}-${{github.run_number}}.vsix + vscode-java-${{ env.EXT_VERSION }}-${{github.run_number}}.vsix + if-no-files-found: error + - name: Publish to GH Release Tab + if: ${{ inputs.publishToMarketPlace == 'true' && inputs.publishToOVSX == 'true' }} + uses: "marvinpinto/action-automatic-releases@919008cf3f741b179569b7a6fb4d8860689ab7f0" + with: + repo_token: "${{ secrets.GITHUB_TOKEN }}" + automatic_release_tag: "v${{ env.EXT_VERSION }}" + title: "${{ env.EXT_VERSION }}" + draft: true + files: | + java-*-${{ env.EXT_VERSION }}-${{github.run_number}}.vsix + vscode-java-${{ env.EXT_VERSION }}-${{ github.run_number }}.vsix + release-job: + environment: ${{ (inputs.publishToMarketPlace == 'true' || inputs.publishToOVSX == 'true') && 'release' || 'pre-release' }} + runs-on: ubuntu-latest + needs: packaging-job + steps: + - name: Set Up NodeJS + uses: actions/setup-node@v5 + with: + node-version: '20' + - name: Install dependencies + run: | + npm install -g typescript "@vscode/vsce" "ovsx" + - name: Download VSIX & JDT-LS + uses: actions/download-artifact@v5 + - name: Publish to VS Code Marketplace + if: ${{ github.event_name == 'schedule' || inputs.publishToMarketPlace == 'true' || inputs.publishPreRelease == 'true' }} + run: | + for platformVsix in java-*-*-${GITHUB_RUN_NUMBER}.vsix; do + vsce publish --skip-duplicate -p ${{ secrets.VSCODE_MARKETPLACE_TOKEN }} --packagePath ${platformVsix} + done + vsce publish --skip-duplicate -p ${{ secrets.VSCODE_MARKETPLACE_TOKEN }} --packagePath vscode-java-*-${GITHUB_RUN_NUMBER}.vsix + - name: Publish to OpenVSX Registry + if: ${{ github.event_name == 'schedule' || inputs.publishToOVSX == 'true' || inputs.publishPreRelease == 'true' }} + run: | + for platformVsix in java-*-*-${GITHUB_RUN_NUMBER}.vsix; do + ovsx publish --skip-duplicate -p ${{ secrets.OVSX_MARKETPLACE_TOKEN }} --packagePath ${platformVsix} + done + ovsx publish --skip-duplicate -p ${{ secrets.OVSX_MARKETPLACE_TOKEN }} --packagePath vscode-java-*-${GITHUB_RUN_NUMBER}.vsix + - name: Delete saved artifact + if: always() + uses: geekyeggo/delete-artifact@e46cfb9575865f907c2beb2e4170b5f4c7d77c52 + with: + name: vscode-java diff --git a/.sdkmanrc b/.sdkmanrc index 0f7aaf5a5..d2635abfa 100644 --- a/.sdkmanrc +++ b/.sdkmanrc @@ -1,3 +1,3 @@ # Enable auto-env through the sdkman_auto_env config # Add key=value pairs of SDKs to use below -java=17.0.3-tem +java=21.0.5-tem diff --git a/.vscode/launch.json b/.vscode/launch.json index dda897afd..7fe80719b 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -7,14 +7,19 @@ "type": "extensionHost", "request": "launch", "runtimeExecutable": "${execPath}", + "debugWebviews": true, "args": ["--extensionDevelopmentPath=${workspaceRoot}" ], "env": { - "DEBUG_VSCODE_JAVA":"true" + "DEBUG_VSCODE_JAVA":"true", + "VSCODE_REDHAT_TELEMETRY_DEBUG":"true" }, - "stopOnEntry": false, "sourceMaps": true, "outFiles": [ "${workspaceRoot}/dist/**/*.js" ], - "preLaunchTask": "npm: watch" + "preLaunchTask": "npm: watch", + "rendererDebugOptions": { + "urlFilter": "*redhat.java*", + "sourceMaps": true, + } }, { "name": "Launch Extension - Remote Server", @@ -22,12 +27,12 @@ "request": "launch", "runtimeExecutable": "${execPath}", "args": ["--extensionDevelopmentPath=${workspaceRoot}" ], - "stopOnEntry": false, "sourceMaps": true, "outFiles": [ "${workspaceRoot}/dist/**/*.js" ], "env": { - "SERVER_PORT": "3333", - "DEBUG_VSCODE_JAVA":"true" + "JDTLS_SERVER_PORT": "3333", + "DEBUG_VSCODE_JAVA":"true", + "VSCODE_REDHAT_TELEMETRY_DEBUG":"true" }, "preLaunchTask": "npm: watch" }, @@ -36,15 +41,20 @@ "type": "extensionHost", "request": "launch", "runtimeExecutable": "${execPath}", + "debugWebviews": true, "args": ["--extensionDevelopmentPath=${workspaceRoot}" ], - "stopOnEntry": false, "sourceMaps": true, "outFiles": [ "${workspaceRoot}/dist/**/*.js" ], "env": { "JDTLS_CLIENT_PORT": "5036", - "DEBUG_VSCODE_JAVA":"true" + "DEBUG_VSCODE_JAVA":"true", + "VSCODE_REDHAT_TELEMETRY_DEBUG":"true" }, - "preLaunchTask": "npm: watch" + "preLaunchTask": "npm: watch", + "rendererDebugOptions": { + "urlFilter": "*redhat.java*", + "sourceMaps": true, + } }, { "name": "Launch Extension - SyntaxLS Client", @@ -52,12 +62,12 @@ "request": "launch", "runtimeExecutable": "${execPath}", "args": ["--extensionDevelopmentPath=${workspaceRoot}" ], - "stopOnEntry": false, "sourceMaps": true, "outFiles": [ "${workspaceRoot}/dist/**/*.js" ], "env": { "SYNTAXLS_CLIENT_PORT": "5037", - "DEBUG_VSCODE_JAVA":"true" + "DEBUG_VSCODE_JAVA":"true", + "VSCODE_REDHAT_TELEMETRY_DEBUG":"true" }, "preLaunchTask": "npm: watch" }, @@ -67,13 +77,13 @@ "request": "launch", "runtimeExecutable": "${execPath}", "args": ["--extensionDevelopmentPath=${workspaceRoot}" ], - "stopOnEntry": false, "sourceMaps": true, "outFiles": [ "${workspaceRoot}/dist/**/*.js" ], "env": { "JDTLS_CLIENT_PORT": "5036", "SYNTAXLS_CLIENT_PORT": "5037", - "DEBUG_VSCODE_JAVA":"true" + "DEBUG_VSCODE_JAVA":"true", + "VSCODE_REDHAT_TELEMETRY_DEBUG":"true" }, "preLaunchTask": "npm: watch" }, @@ -88,7 +98,6 @@ "--extensionDevelopmentPath=${workspaceRoot}", "--extensionTestsPath=${workspaceRoot}/out/test/standard-mode-suite" ], - "stopOnEntry": false, "sourceMaps": true, "outFiles": ["${workspaceRoot}/out/**/*.js"], "preLaunchTask": "prepareStandardTest", @@ -105,7 +114,6 @@ "--extensionDevelopmentPath=${workspaceRoot}", "--extensionTestsPath=${workspaceRoot}/out/test/lightweight-mode-suite" ], - "stopOnEntry": false, "sourceMaps": true, "outFiles": ["${workspaceRoot}/out/**/*.js"], "preLaunchTask": "prepareLightweightTest", @@ -113,10 +121,10 @@ }, { "args": [ - "${input:gulpTask}" + "${input:scriptTask}" ], - "name": "Launch Gulp Task", - "program": "${workspaceFolder}/node_modules/gulp/bin/gulp.js", + "name": "Launch Build Script", + "program": "${workspaceFolder}/scripts/index.js", "request": "launch", "skipFiles": [ "/**" @@ -126,10 +134,10 @@ ], "inputs": [ { - "id": "gulpTask", + "id": "scriptTask", "type": "promptString", - "description": "Name of the Gulp task to execute", - "default": "download_jre" + "description": "Name of the build script to execute (e.g., download-jre, build-server, etc.)", + "default": "download-jre" } ] } diff --git a/.vscode/settings.json b/.vscode/settings.json index 4012de914..528142020 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -6,7 +6,7 @@ "search.exclude": { "out": true // set this to false to include "out" folder in search results }, - "typescript.tsdk": "./node_modules/typescript/lib", + "js/ts.tsdk.path": "./node_modules/typescript/lib", "git.alwaysSignOff": true, "vsicons.presets.angular": false // we want to use the TS server from our node_modules folder to control its version } \ No newline at end of file diff --git a/.vscode/tasks.json b/.vscode/tasks.json index e63b9f7a2..da12f3f4a 100644 --- a/.vscode/tasks.json +++ b/.vscode/tasks.json @@ -18,19 +18,19 @@ } }, { - "type": "gulp", - "label": "cleanTestFolder", - "task": "clean_test_folder" + "type": "npm", + "script": "clean-test-folder", + "label": "cleanTestFolder" }, { - "type": "gulp", - "label": "generateStandardTestFolder", - "task": "generate_standard_test_folder" + "type": "npm", + "script": "generate-standard-test-folder", + "label": "generateStandardTestFolder" }, { - "type": "gulp", - "label": "generateLightweightTestFolder", - "task": "generate_lightweight_test_folder" + "type": "npm", + "script": "generate-lightweight-test-folder", + "label": "generateLightweightTestFolder" }, { "label": "prepareStandardTest", diff --git a/.vscodeignore b/.vscodeignore index 385b51af7..d6d7fae14 100644 --- a/.vscodeignore +++ b/.vscodeignore @@ -8,6 +8,8 @@ images/** .gitignore .github/** tsconfig.json +tsconfig.webview.json +tsconfig.base.json vsc-extension-quickstart.md undefined/** CONTRIBUTING.md @@ -23,4 +25,8 @@ Jenkinsfile .eslintrc.json .eslintignore webpack.config.js -.DS_Store \ No newline at end of file +.DS_Store +.github/** +.gitignore +.tool-versions +.sdkmanrc \ No newline at end of file diff --git a/CHANGELOG.md b/CHANGELOG.md index 86c777358..d08992ad8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,641 @@ # Change Log +## 1.55.0 (June 24, 2026) + * enhancement - Use standard `decorator` instead of `annotation` token type for highlighting Java annotation. See [#4421](https://github.com/redhat-developer/vscode-java/pull/4421). + * enhancement - Add right click menu item to copy the fully qualified name of the identifier under the cursor. See [#374](https://github.com/redhat-developer/vscode-java/issues/374). + * enhancement - Add regenerate hashCode()/equals() method quick-fix. See [JLS#3764](https://github.com/eclipse-jdtls/eclipse.jdt.ls/pull/3764). + * enhancement - Add type annotation quick-fixes. See [JLS#3759](https://github.com/eclipse-jdtls/eclipse.jdt.ls/pull/3759). + * enhancement - Add Java 26 to Gradle/Java Compatibility Matrix. See [JLS#3757](https://github.com/eclipse-jdtls/eclipse.jdt.ls/issues/3757). + * enhancement - Add new quick-fixes (type argument and modifier related). See [JLS#3756](https://github.com/eclipse-jdtls/eclipse.jdt.ls/pull/3756). + * enhancement - Add varargs-related quick-fixes. See [JLS#3754](https://github.com/eclipse-jdtls/eclipse.jdt.ls/pull/3754). + * enhancement - Add new null annotation quick-fixes from upstream JDT. See [JLS#3752](https://github.com/eclipse-jdtls/eclipse.jdt.ls/pull/3752). + * enhancement - Add support for vscode path variables for settings url settings. See [JLS#2529](https://github.com/eclipse-jdtls/eclipse.jdt.ls/issues/2529). + * bug fix - Sanitize existing command links from hover Javadocs. See [#4429](https://github.com/redhat-developer/vscode-java/pull/4429). + * bug fix - Maven projects 5 folders deep were not loaded as Java projects. See [#4364](https://github.com/redhat-developer/vscode-java/issues/4364). + * bug fix - Prevent Javadoc entries with tables from being truncated in the hover documentation. See [#4219](https://github.com/redhat-developer/vscode-java/issues/4219). + * bug fix - Keep LSP initialize() resilient when m2e is not yet available. See [#3469](https://github.com/redhat-developer/vscode-java/issues/3469). + * bug fix - If the specified type comment template is empty, use the default. See [JLS#3816](https://github.com/eclipse-jdtls/eclipse.jdt.ls/pull/3816). + * bug fix - Prevent setter generation for record components. See [#JLS3812](https://github.com/eclipse-jdtls/eclipse.jdt.ls/pull/3812). + * bug fix - JDTLS batch file fails when located in a folder path with spaces. See [JLS#3783](https://github.com/eclipse-jdtls/eclipse.jdt.ls/issues/3783). + * bug fix - Completion of annotation properties proposes invalid choices. See [JLS#3604](https://github.com/eclipse-jdtls/eclipse.jdt.ls/issues/3604). + * bug fix - Do not offer override/implement actions for annotation types. See [JLS#3814](https://github.com/eclipse-jdtls/eclipse.jdt.ls/pull/3814). + +## 1.54.0 (April 15th, 2026) + * enhancement - Add `serverRunning()` API (v0.14) for progressive loading. See [#4372](https://github.com/redhat-developer/vscode-java/pull/4372). + * enhancement - Add JDK 26. See [#4367](https://github.com/redhat-developer/vscode-java/pull/4367). + * enhancement - Add inlay hints for format parameters. See [#4350](https://github.com/redhat-developer/vscode-java/issues/4350). + * enhancement - Support Scala in Gradle projects. See [#4358](https://github.com/redhat-developer/vscode-java/issues/4358). + * enhancement - Progressive project import notifications for tree view. See [JLS#3744](https://github.com/eclipse-jdtls/eclipse.jdt.ls/pull/3744). + * enhancement - Add Null Annotation quick-fixes from JDT to jdt.ls. See [JLS#3727](https://github.com/eclipse-jdtls/eclipse.jdt.ls/issues/3727). + * enhancement - Remove the first blank line from generated classes created in the default package. See [JLS#3725](https://github.com/eclipse-jdtls/eclipse.jdt.ls/pull/3725). + * enhancement - Add quick-assist to convert a class to a record. See [JLS#3723](https://github.com/eclipse-jdtls/eclipse.jdt.ls/pull/3723). + * enhancement - Enable change compiler compliance quick-fixes. See [JLS#3743](https://github.com/eclipse-jdtls/eclipse.jdt.ls/pull/3743). + * bug fix - Regression in 1.53.0: Gradle import stuck at 70% with Groovy support enabled in custom multi-project settings plugin layout. See [#4360](https://github.com/redhat-developer/vscode-java/issues/4360). + * bug fix - Navigating to a Kotlin class now opens the sources instead of the decompiled code. See [#4345](https://github.com/redhat-developer/vscode-java/issues/4345). + * bug fix - Quick fix "Add throws declaration" removes backslashes and qute fragments. See [#4314](https://github.com/redhat-developer/vscode-java/issues/4314). + * bug fix - Constructor code completion is broken in certain situations. See [#2336](https://github.com/redhat-developer/vscode-java/issues/2336). + * dependencies - bump brace-expansion from 1.1.12 to 1.1.13. See [#4373](https://github.com/redhat-developer/vscode-java/pull/4373). + * dependencies - bump picomatch. See [#4370](https://github.com/redhat-developer/vscode-java/pull/4370). + * dependencies - bump @tootallnate/once and @vscode/test-electron. See [#4355](https://github.com/redhat-developer/vscode-java/pull/4355). + +## 1.53.0 (February 26th, 2026) + * enhancement - Kotlin imports into Java file are unresolved. See [#531](https://github.com/redhat-developer/vscode-java/issues/531). + * enhancement - After opening the Kotlin class of a downloaded Maven dependency source, show `.kt` file instead of `.class`. See [#4297](https://github.com/redhat-developer/vscode-java/issues/4297). + * enhancement - Disable automatic imports on paste. See [#4325](https://github.com/redhat-developer/vscode-java/issues/4325). + * enhancement - Option to turn off automatic creation of class body when creating a new Java file. See [#2652](https://github.com/redhat-developer/vscode-java/issues/2652). + * enhancement - Update Eclipse formatter template to version 23. See [#4344](https://github.com/redhat-developer/vscode-java/pull/4344). + * enhancement - Set `o.e.j.core.compiler.problem.forbiddenReference=ignore` by default. See [JLS#3720](https://github.com/eclipse-jdtls/eclipse.jdt.ls/issues/3720). + * enhancement - Add setting to show generated code in document symbols. See [4084](https://github.com/redhat-developer/vscode-java/issues/4084). + * enhancement - Provide a Windows ARM64 build. See [#4324](https://github.com/redhat-developer/vscode-java/issues/4324). + * enhancement - Log server version+commit on startup. See [JLS#3689](https://github.com/eclipse-jdtls/eclipse.jdt.ls/pull/3689). + * bug fix - Suggestion issue for Variable Arity Parameters. See [#4267](https://github.com/redhat-developer/vscode-java/issues/4267). + * bug fix - Annotations + generics + explicit receiver fail to compile. See [#3744](https://github.com/redhat-developer/vscode-java/issues/3744). + * bug fix - Autocompletion not working in `@interface` class. See [#3533](https://github.com/redhat-developer/vscode-java/issues/3533). + * bug fix - Deprecate `java.saveActions.organizeImports` setting. See [#2207](https://github.com/redhat-developer/vscode-java/issues/2207) and [#659](https://github.com/redhat-developer/vscode-java/issues/659). + * bug fix - Fix code completion in JEP 512: Compact Source Files with static variables. See [JLS#3680](https://github.com/eclipse-jdtls/eclipse.jdt.ls/issues/3680). + * bug fix - JEP 511: module completion now shows documentation. See [JLS#3710](https://github.com/eclipse-jdtls/eclipse.jdt.ls/issues/3710). + * dependencies - Update Fernflower to 253.29346.240, fetched via the target platform. See [JLS#3667](https://github.com/eclipse-jdtls/eclipse.jdt.ls/pull/3667). + * dependencies - Bump tar from 7.5.4 to 7.5.7. See [#4322](https://github.com/redhat-developer/vscode-java/pull/4322). + * dependencies - Bump webpack from 5.94.0 to 5.105.0. See [#4332](https://github.com/redhat-developer/vscode-java/pull/4332). + * dependencies - Bump @isaacs/brace-expansion from 5.0.0 to 5.0.1. See [#4331](https://github.com/redhat-developer/vscode-java/pull/4331). + * dependencies - Bump tar from 7.5.7 to 7.5.8. See [#4343](https://github.com/redhat-developer/vscode-java/pull/4343). + * build - Avoid calling webpack for each platform build. See [#4330](https://github.com/redhat-developer/vscode-java/pull/4330). + * build - New issue templates. See [#4339](https://github.com/redhat-developer/vscode-java/pull/4339). + +## 1.52.0 (January 29th, 2026) + * enhancement - Add library info on hover. See [#3872](https://github.com/redhat-developer/vscode-java/issues/3872). + * enhancement - Support AspectJ in Gradle projects. See [#4304](https://github.com/redhat-developer/vscode-java/pull/4304). + * enhancement - Enable more quick-fixes from upstream JDT. See [JLS#3660](https://github.com/eclipse-jdtls/eclipse.jdt.ls/pull/3660). + * bug fix - Fix wrong type mismatch errors. See [JLS#3691](https://github.com/eclipse-jdtls/eclipse.jdt.ls/issues/3691). + * bug fix - Fix incorrect Markdown hover rendering for inline `{@link}`/`{@linkplain}` member references. See [JLS#3655](https://github.com/eclipse-jdtls/eclipse.jdt.ls/issues/3655). + * bug fix - Watch `java.settings.url` file modifications. See [JLS#3679](https://github.com/eclipse-jdtls/eclipse.jdt.ls/pull/3679). + * bug fix - Don't create unnecessary new lines when pasting text including literal `\n`. See [#4305](https://github.com/redhat-developer/vscode-java/issues/4305), [#4306](https://github.com/redhat-developer/vscode-java/pull/4306). + * bug fix - Automatic source discovery fails for jars not built with Maven. See [#4301](https://github.com/redhat-developer/vscode-java/issues/4301). + * bug fix - Fix Javadoc braces rendering in hover. See [#1291](https://github.com/redhat-developer/vscode-java/issues/1291). + * dependencies - Bump tar from 7.5.2 to 7.5.4. See [#4311](https://github.com/redhat-developer/vscode-java/pull/4311), [#4315](https://github.com/redhat-developer/vscode-java/pull/4315). + * dependencies - Bump lodash from 4.17.21 to 4.17.23. See [#4316](https://github.com/redhat-developer/vscode-java/pull/4316). + * build - Upgrade GitHub Actions to version 5. See [#4296](https://github.com/redhat-developer/vscode-java/pull/4296). + +## 1.51.0 (January 6th, 2026) + * enhancement - Add a quickfix to replace a deprecated field with one referenced in the docs. See [JLS#3626](https://github.com/eclipse-jdtls/eclipse.jdt.ls/issues/3626). + * enhancement - Add a quickfix for "type safety warning" to infer type arguments. See [JLS#626](https://github.com/eclipse-jdtls/eclipse.jdt.ls/issues/626). + * bug fix - "Generate constructor" feature can now be used when the type has no fields. See [#4154](https://github.com/redhat-developer/vscode-java/issues/4154). + * bug fix - When viewing Javadoc through hover, any Javadoc with `{@literal}` tags now has proper newlines. See [#3758](https://github.com/redhat-developer/vscode-java/issues/3758). + * bug fix - Handle tags placed in `{@literal}` properly in Javadoc hover. See [#1838](https://github.com/redhat-developer/vscode-java/issues/1838). + * bug fix - Fix how tables are displayed in Javadoc hover. See [#2465](https://github.com/redhat-developer/vscode-java/issues/2465). + * bug fix - Fix a bug in the quickfix that replaces a deprecated method with one referenced in the docs. See [JLS#3638](https://github.com/eclipse-jdtls/eclipse.jdt.ls/pull/3638). + * bug fix - Fix Move method refactoring causing syntax errors due to calling private fields. See [#3604](https://github.com/redhat-developer/vscode-java/issues/3604) + * bug fix - Fix Move method refactoring causing syntax errors due to dependency on internal classes. See [#3607](https://github.com/redhat-developer/vscode-java/issues/3607) + * bug fix - Fix formatting breaking fenced blocks in Markdown javadoc [4209](https://github.com/redhat-developer/vscode-java/issues/4209). + * bug fix - Ensure importers with the same order number are not dropped. See [JLS#3658](https://github.com/eclipse-jdtls/eclipse.jdt.ls/issues/3658). + * dependencies - Address vulnerability in version of jsoup being used. See [#3859](https://github.com/redhat-developer/vscode-java/issues/3859). + +## 1.50.0 (November 26th, 2025) + * enhancement - Add preference to disable returning Javadoc on hover. See [#1420](https://github.com/redhat-developer/vscode-java/issues/1420). + * enhancement - Adopt quick fixes for the following problems. See [JLS#3609](https://github.com/eclipse-jdtls/eclipse.jdt.ls/pull/3609). + - `UnusedMethodDeclaredThrownException`, + - `InvalidOperator`, + - `RedundantSpecificationOfTypeArguments` + * enhancement - Refresh codelens when updating preferences. See [JLS#3047](https://github.com/eclipse-jdtls/eclipse.jdt.ls/issues/3047). + * bug fix - Do not define title in package.json schema as it is shown in tooltip for all package.json files. See [#4268](https://github.com/redhat-developer/vscode-java/issues/4268). + * bug fix - Temporary rollback of junit bundles to fix JUnit 6 support. See [#4260](https://github.com/redhat-developer/vscode-java/issues/4260). + * bug fix - Fixed NPE thrown when computing Code Actions on invalid code. See [JLS#3602](https://github.com/eclipse-jdtls/eclipse.jdt.ls/issues/3602). + +## 1.49.0 (November 19th, 2025) + * performance - Avoid unnecessary Maven project rebuild when the window is reloaded. See [#4250](https://github.com/redhat-developer/vscode-java/issues/4250). + * performance - Prevent unnecessary Maven project rebuild when configuring test classpath flag. See [JLS#3590](https://github.com/eclipse-jdtls/eclipse.jdt.ls/issues/3590). + * enhancement - Add JSpecify annotations for null analysis. See [#4249](https://github.com/redhat-developer/vscode-java/pull/4249). + * enhancement - Improve code completion type for annotation attributes (now using `Field` kind). See [#3242](https://github.com/redhat-developer/vscode-java/issues/3242). + * enhancement - Use discovered, compatible JDK, if embedded JDK does not meet requirements. See [#4226](https://github.com/redhat-developer/vscode-java/issues/4226). + * enhancement - Command to add a JVM install. See [#4161](https://github.com/redhat-developer/vscode-java/issues/4161). + * bug fix - 1.48.0 only contains the universal version. See [4256](https://github.com/redhat-developer/vscode-java/issues/4256). + * bug fix - Fix indentation rules when a line is moved. See [#692](https://github.com/redhat-developer/vscode-java/issues/692). + * bug fix - Inner classes are now correctly shown/decompiled via Fernflower. See [JLS#2815](https://github.com/eclipse-jdtls/eclipse.jdt.ls/issues/2815). + * bug fix - Ensure accurate 'build finished' status by waiting for all background processes. See [#4230](https://github.com/redhat-developer/vscode-java/issues/4230). + * bug fix - Fix discrepency in annotation processing, between full and incremental builds. See [#2117](https://github.com/redhat-developer/vscode-java/issues/2117). + * bug fix - Suppress incorrect error logging related to content providers and decompiler checks. See [#3178](https://github.com/redhat-developer/vscode-java/issues/3178). + * bug fix - Ensure we correctly parse the Lombok version. See [#2765](https://github.com/redhat-developer/vscode-java/issues/2765). + * bug fix - Safeguard workspace hash computation in telemetry service. See [#4246](https://github.com/redhat-developer/vscode-java/pull/4246). + * dependencies - Bump glob to 11.1.0. See [#4255](https://github.com/redhat-developer/vscode-java/pull/4255). + * dependencies - Bump js-yaml from 4.1.0 to 4.1.1. See [#4252](https://github.com/redhat-developer/vscode-java/pull/4252). + * dependencies - Bump tar from 7.5.1 to 7.5.2. See [#4224](https://github.com/redhat-developer/vscode-java/pull/4224). + * dependencies - Bump org.apache.commons:commons-lang3 from 3.5 to 3.18.0 in /test/resources/projects/maven/salut-java11. See [#4243](https://github.com/redhat-developer/vscode-java/pull/4243). + * build - Fix `npm run build` on Windows. See [#4244](https://github.com/redhat-developer/vscode-java/issues/4244). + +## 1.47.0 (October 30th, 2025) + * enhancement - Add inlay hints for lambda parameter types and option to suppress for same-name numbered parameters. See [#4203](https://github.com/redhat-developer/vscode-java/pull/4203), [#4208](https://github.com/redhat-developer/vscode-java/pull/4208). + * enhancement - Improve detection and setup of `sourcePath` for Android support. See [JLS#3490](https://github.com/eclipse-jdtls/eclipse.jdt.ls/pull/3490). + * enhancement - Disable unused lambda parameter warning by default. See [#4216](https://github.com/redhat-developer/vscode-java/issues/4216). + * bug fix - Resolve poor formatting issues in Jupyter notebooks. See [#4207](https://github.com/redhat-developer/vscode-java/issues/4207). + * bug fix - Fix failure in "Create method" quick assist with parameterized arguments. See [#4138](https://github.com/redhat-developer/vscode-java/issues/4138). + * bug fix - Prevent incorrect postfix completions on import statements. See [#3364](https://github.com/redhat-developer/vscode-java/issues/3364). + * bug fix - Fix multiple `NullPointerException` reported by telemetry. See [JLS#3570](https://github.com/eclipse-jdtls/eclipse.jdt.ls/pull/3570). + * bug fix - Fix "Resource leak" false positives. See [#1349](https://github.com/redhat-developer/vscode-java/issues/1349). + * bug fix - Update flags for `javac` compiler support. See [#4198](https://github.com/redhat-developer/vscode-java/pull/4198). + * bug fix - Revert change that ignored null unchecked conversion warnings by default. See [JLS#3472](https://github.com/eclipse-jdtls/eclipse.jdt.ls/pull/3472). + * bug fix - Only call `prepareExecutable` for syntax server when needed. See [#4202](https://github.com/redhat-developer/vscode-java/issues/4202). + * bug fix - Allow partial configuration updates for `workspace/didChangeConfiguration`. See [JLS#3108](https://github.com/eclipse-jdtls/eclipse.jdt.ls/issues/3108). + * bug fix - Add CSP for "Change Signature" & "Java Dashboard" webviews. See [#4193](https://github.com/redhat-developer/vscode-java/issues/4193). + * buf fix - Report all errors for pre-releases or when running in Insiders. See [#4210](https://github.com/redhat-developer/vscode-java/pull/4210). + * bug fix - Provide more comprehensive error telemetry, and include workspace identifier. See [JLS#3566](https://github.com/eclipse-jdtls/eclipse.jdt.ls/pull/3566), [#4175](https://github.com/redhat-developer/vscode-java/issues/4175). + * dependency - Bump `vscode-redhat-telemetry` to 0.9.2. See [#4195](https://github.com/redhat-developer/vscode-java/pull/4195). + * dependency - Update target platform to Eclipse 2025-09 (4.37) release. See [JLS#3530](https://github.com/eclipse-jdtls/eclipse.jdt.ls/pull/3530). + * build - Remove `gulp` and other vulnerable dependencies. See [#4199](https://github.com/redhat-developer/vscode-java/pull/4199). + +## 1.46.0 (October 2nd, 2025) + * performance - Cleaning workspace should also delete configuration folder. See [#4157](https://github.com/redhat-developer/vscode-java/issues/4157). + * performance - Improve Null Analysis by reducing & deferring expensive calls. See [JLS#3531](https://github.com/eclipse-jdtls/eclipse.jdt.ls/issues/3531). + * enhancement - Support Java 25. See [#4170](https://github.com/redhat-developer/vscode-java/pull/4170), [#4185](https://github.com/redhat-developer/vscode-java/pull/4185), [#4172](https://github.com/redhat-developer/vscode-java/pull/4172). + * enhancement - Add a "Java Dashboard" view that presents information for troubleshooting. See [#4128](https://github.com/redhat-developer/vscode-java/issues/4128). + * enhancement - Support fuzzy camel case search for workspace symbols. See [JLS#3513](https://github.com/eclipse-jdtls/eclipse.jdt.ls/pull/3513). + * enhancement - Enable formatting Java in Jupyter Notebook. See [#4163](https://github.com/redhat-developer/vscode-java/issues/4163). + * enhancement - Add inlay hints for implicit variable types. See [#4031](https://github.com/redhat-developer/vscode-java/issues/4031). + * bug fix - Fix Android Support with recent AGP versions. See [#3682](https://github.com/redhat-developer/vscode-java/issues/3682). + * bug fix - Ensure Gradle 9.1.0 requires JDK >= 25. See [JLS#3540](https://github.com/eclipse-jdtls/eclipse.jdt.ls/pull/3540). + * bug fix - Eable `workspace/executeCommand` in the Syntax language client. See [#4187](https://github.com/redhat-developer/vscode-java/pull/4187). + * bug fix - Add missing KO NLS keys and refine translations. See [#4183](https://github.com/redhat-developer/vscode-java/pull/4183). + * bug fix - Show decompiled source when opening `.class` file on remote workspace. See [#4114](https://github.com/redhat-developer/vscode-java/issues/4114). + * dependencies - Bump brace-expansion from 1.1.11 to 1.1.12. See [#4150](https://github.com/redhat-developer/vscode-java/pull/4150). + * dependencies - Use the Eclipse 4.37 platform release repository. See [JLS#3526](https://github.com/eclipse-jdtls/eclipse.jdt.ls/pull/3526). + * dependencies - Update M2E 2.9.0 to 2.9.1. See [JLS#3520](https://github.com/eclipse-jdtls/eclipse.jdt.ls/pull/3520). + * build - Do not reference path when invoking `gulp`. See [#4158](https://github.com/redhat-developer/vscode-java/issues/4158). + +## 1.45.0 (September 4th, 2025) + * performance - Delay registration of resource/element listeners. See [JLS#3510](https://github.com/eclipse-jdtls/eclipse.jdt.ls/issues/3510). + * bug fix - Path expansion is not working for the `sources` field in `referencedLibraries`. See [JLS#3495](https://github.com/eclipse-jdtls/eclipse.jdt.ls/issues/3495). + * bug fix - Send LSP server version with `InitializeResult`. See [JLS#3484](https://github.com/eclipse-jdtls/eclipse.jdt.ls/issues/3484). + * bug fix - Update the decompiler header for FernFlower. See [JLS#3512](https://github.com/eclipse-jdtls/eclipse.jdt.ls/pull/3512). + * bug fix - Remove unused options for completion & incomplete classpath severity. See [JLS#3506](https://github.com/eclipse-jdtls/eclipse.jdt.ls/pull/3506). + +## 1.44.0 (July 31st, 2025) + * performance - Improve startup with (optional) Java Application Class-Data Sharing. See [#4067](https://github.com/redhat-developer/vscode-java/pull/4067). + * enhancement - Add code actions for creating method in base type. See [#4064](https://github.com/redhat-developer/vscode-java/issues/4064). + * bug fix - Fix Gradle/Java Compatibility Matrix for recent Java versions. See [JLS#3485](https://github.com/eclipse-jdtls/eclipse.jdt.ls/issues/3485). + * bug fix - Detect JBang installed JDKs. See [#3799](https://github.com/redhat-developer/vscode-java/issues/3799). + * dependencies - Update M2E 2.8.0 to 2.9.0. See [JLS#3477](https://github.com/eclipse-jdtls/eclipse.jdt.ls/pull/3477). + +## 1.43.1 (July 1st, 2025) +* bug fix - Fix compilation issue when annotation exists on a record class. [#4096](https://github.com/redhat-developer/vscode-java/issues/4096) + +## 1.43.0 (June 26th, 2025) + * performance - "Rebuild Projects" command should be done incrementally. See [#4041](https://github.com/redhat-developer/vscode-java/pull/4041). + * enhancement - Adopt quick fixes for various modifier corrections. See [JLS#1053](https://github.com/eclipse-jdtls/eclipse.jdt.ls/issues/1053). + - `BodyForNativeMethod`, `MethodRequiresBody`, `OuterLocalMustBeEffectivelyFinal`, + - `MissingSynchronizedModifierInInheritedMethod`, `MethodCanBeStatic`, `OverridingDeprecatedMethod` + * enhancement - Add cleanups for various redundant modifiers/expressions/statements. See [#4066](https://github.com/redhat-developer/vscode-java/issues/4066). + * enhancement - Increase default value for maximum heap size (`Xmx`) from `1G` to `2G`. See [#4062](https://github.com/redhat-developer/vscode-java/pull/4062). + * bug fix - Fix issues with Lombok `@Builder` annotation on `record` type declarations. See [#4050](https://github.com/redhat-developer/vscode-java/issues/4050). + * bug fix - Prevent code actions from failing with "Document does not match the AST". See [#4027](https://github.com/redhat-developer/vscode-java/issues/4027). + * bug fix - Handle snippets when opened (empty) Java file triggers activation. See [#3940](https://github.com/redhat-developer/vscode-java/issues/3940). + * bug fix - Remove JAXP entity limits when runtime is Java 24 or higher. See [#4071](https://github.com/redhat-developer/vscode-java/pull/4071). + +## 1.42.0 (May 15th, 2025) + * enhancement - Implement methods in newly created type from an inherited sealed class. See [JLS#1570](https://github.com/eclipse-jdtls/eclipse.jdt.ls/pull/1570). + * enhancement - Code action for "The left-hand side of an assginment must be a variable". See [JLS#3441](https://github.com/eclipse-jdtls/eclipse.jdt.ls/pull/3441). + * bug fix - Avoid `StackOverflowError` when computing Extended Outline. See [JLS#3435](https://github.com/eclipse-jdtls/eclipse.jdt.ls/pull/3435). + * bug fix - Compilation failure with primitive array comparison. See [#4020](https://github.com/redhat-developer/vscode-java/issues/4020). + * bug fix - Avoid notifying of failures for workspace builds. See [#4032](https://github.com/redhat-developer/vscode-java/pull/4032). + * bug fix - Report language server exiting with unsaved changes as `java.ls.error`. See [#4033](https://github.com/redhat-developer/vscode-java/pull/4033). + * documentation - Javac-based (experimental) compilation should require latest released Java SDK (24). See [#4029](https://github.com/redhat-developer/vscode-java/issues/4029). + * documentation - Fix return type typo in `qualifyMembers` example. See [#4026](https://github.com/redhat-developer/vscode-java/pull/4026). + +## 1.41.1 (April 1st, 2025) + * bug fix - Fix issues with preference manager by reverting "merge" behaviour. See [#3995](https://github.com/redhat-developer/vscode-java/issues/3995). + * bug fix - Add missing "Create record" quick fix. See [#3988](https://github.com/redhat-developer/vscode-java/issues/3988). + +## 1.41.0 (March 27th, 2025) + * enhancement - Provide support for Java 24. See [#3983](https://github.com/redhat-developer/vscode-java/pull/3983). + * enhancement - Add `Make static` refactoring. See [JLS#3400](https://github.com/eclipse-jdtls/eclipse.jdt.ls/pull/3400). + * enhancement - Adopt quick fixes for some more problems. See [JLS#3398](https://github.com/eclipse-jdtls/eclipse.jdt.ls/pull/3398). + - `MethodButWithConstructorName`, `UsingDeprecatedMethod`, + - `VarIsNotAllowedHere`, `SwitchExpressionsReturnWithinSwitchExpression` + * enhancement - Code action to ignore configurable compiler problems. See [#1791](https://github.com/redhat-developer/vscode-java/issues/1791). + * bug fix - Fix indentation for snippet strings within code actions. See [#3970](https://github.com/redhat-developer/vscode-java/pull/3970). + * bug fix - Only rename source file to match the single public type declaration. See [#3963](https://github.com/redhat-developer/vscode-java/issues/3963). + * bug fix - Fix inherited document symbols to work for interfaces as well. See [#3972](https://github.com/redhat-developer/vscode-java/pull/3972). + * bug fix - Detect changes to watched files that are outside of the workspace. [JLS#1765](https://github.com/eclipse-jdtls/eclipse.jdt.ls/pull/1765), [JLS#3407](https://github.com/eclipse-jdtls/eclipse.jdt.ls/pull/3407). + * bug fix - Guard against `null` workspace edits (eg. for `Organize Imports`). See [#3978](https://github.com/redhat-developer/vscode-java/issues/3978). + * bug fix - Guard against `null` completion item resolved on cancellation. See [#3973](https://github.com/redhat-developer/vscode-java/pull/3973). + * bug fix - Fix commands test by including new commands. See [#3966](https://github.com/redhat-developer/vscode-java/pull/3966). + * build - Fix `check_and_update_jdk` script by catching missing test URL. See [#3982](https://github.com/redhat-developer/vscode-java/pull/3982). + * dependencies - Update serialize-javascript, mocha, sinon, css-loader. See [#3948](https://github.com/redhat-developer/vscode-java/pull/3948), [#3967](https://github.com/redhat-developer/vscode-java/pull/3967). + +## 1.40.0 (February 27th, 2025) + * enhancement - Support for inherited document symbols. See [#2342](https://github.com/redhat-developer/vscode-java/issues/2342). + * enhancement - Introduce approximately 15 new quick fixes. See [JLS#3368](https://github.com/eclipse-jdtls/eclipse.jdt.ls/pull/3368), [JLS#3372](https://github.com/eclipse-jdtls/eclipse.jdt.ls/pull/3372). + * enhancement - Introduce quick assist & cleanup converting a pattern-instanceof-if-chain to a switch statement. See [#3951](https://github.com/redhat-developer/vscode-java/pull/3951). + * bug fix - Unicode characters not rendering correctly in decompiled file. See [#3949](https://github.com/redhat-developer/vscode-java/issues/3949). + * bug fix - Fix a potential deadlock in search-based functionality. See [#3926](https://github.com/redhat-developer/vscode-java/issues/3926). + * bug fix - Adopt the Lombok 1.18.36 release. See [#3939](https://github.com/redhat-developer/vscode-java/pull/3939). + +## 1.39.0 (January 22nd, 2025) + * performance - Enhance initialization of gradle projects. See [JLS#3357](https://github.com/eclipse-jdtls/eclipse.jdt.ls/pull/3357). + * enhancement - Implementation code lens for non interface/abstract base types/methods. See [JLS#3355](https://github.com/eclipse-jdtls/eclipse.jdt.ls/pull/3355). + * bug fix - Handle snippet position groups with undefined offsets (eg. `Add constructor ..`). See [#3905](https://github.com/redhat-developer/vscode-java/issues/3905). + * bug fix - Ensure Gradle project always reacts to build configuration changes. See [#3893](https://github.com/redhat-developer/vscode-java/issues/3893). + * bug fix - Update the `javac` build profile with new `--add-opens`. See [#3897](https://github.com/redhat-developer/vscode-java/issues/3897). + * debt - Bump minimum required Java Execution Environment from 17 to 21. See [#3911](https://github.com/redhat-developer/vscode-java/pull/3911). + +## 1.38.0 (December 19th, 2024) + * enhancement - Add code lens for interface / abstract method implementations. See [#3813](https://github.com/redhat-developer/vscode-java/issues/3813). + * `java.implementationCodeLens.enabled` replaced by `java.implementationCodeLens` + * Values for new setting are `"none"`, `"types"`, `"methods"`, `"all"` + * enhancement - Add quick fix for sealed class within empty switch expression. See [JLS#3345](https://github.com/eclipse-jdtls/eclipse.jdt.ls/pull/3345). + * enhancement - Support code assist on unresolved types. See [#1123](https://github.com/redhat-developer/vscode-java/issues/1123). + * bug fix - Improve rendering of Markdown Comments (JEP 467). See [JLS#3332](https://github.com/eclipse-jdtls/eclipse.jdt.ls/pull/3332). + * build - Check for updated snapshot repositories when running build. See [#3889](https://github.com/redhat-developer/vscode-java/pull/3889). + * dependencies - Bump cross-spawn from 7.0.3 to 7.0.6. See [#3862](https://github.com/redhat-developer/vscode-java/pull/3862). + * dependencies - Update vscode-redhat-telemetry to 0.9.1. See [#3886](https://github.com/redhat-developer/vscode-java/pull/3886). + +## 1.37.0 (November 28th, 2024) + * performance - Improve performance of code action requests. See [#3845](https://github.com/redhat-developer/vscode-java/pull/3845). + * performance - Improve performance of all language server requests that resolve a document URI. See [JLS#3313](https://github.com/eclipse-jdtls/eclipse.jdt.ls/issues/3313). + * enhancement - Code action for unused pattern variable, lambda parameter, etc. and the corresponding clean up. See [#3856](https://github.com/redhat-developer/vscode-java/pull/3856), [#3864](https://github.com/redhat-developer/vscode-java/pull/3864). + * enhancement - Add setting to control inclusion of declarations in reference search. See [#3850](https://github.com/redhat-developer/vscode-java/issues/3850). + * bug fix - Mapstruct implementation class not generated. See [#3836](https://github.com/redhat-developer/vscode-java/issues/3836). + * bug fix - Open more requested system packages for tests with `javac` support. See [#3847](https://github.com/redhat-developer/vscode-java/pull/3847). + * bug fix - Fix some typos in documentation. See [#3863](https://github.com/redhat-developer/vscode-java/pull/3863) + * build - Add Maven (`-U`) flag for updating artifacts from snapshot repositories. See [#3848](https://github.com/redhat-developer/vscode-java/pull/3848). + +## 1.36.0 (October 31st, 2024) + * enhancement - Experimental support for using `javac` as the compiler. See [#3558](https://github.com/redhat-developer/vscode-java/pull/3558), [JLS#3167](https://github.com/eclipse-jdtls/eclipse.jdt.ls/pull/3167). + * `java.jdt.ls.javac.enabled`: Enables Javac-based compilation. + * Requires running with **Java 23**. Make sure to use `java.jdt.ls.java.home` for this. + * Defaults to `off` + * `java.completion.engine`: Select code completion engine. (`ecj` or `dom`) + * Requires `java.jdt.ls.javac.enabled` to be `on` + * Defaults to `ecj` + * enhancement - Automatically add `///` on new line when editing Markdown comments (JEP 467). See [#3801](https://github.com/redhat-developer/vscode-java/issues/3801). + * bug fix - Re-enable dynamic code actions by fixing the URI comparison. See [#3792](https://github.com/redhat-developer/vscode-java/pull/3792). + * bug fix - Intermittent failures to suggest Java core packages for completion & code actions. See [#3797](https://github.com/redhat-developer/vscode-java/issues/3797). + * bug fix - `java.diagnostic.filter` is broken on Windows. See [JLS#3290](https://github.com/eclipse-jdtls/eclipse.jdt.ls/issues/3290). + * bug fix - Type declaration snippets should respect `java.templates.typeComment`. See [JLS#3295](https://github.com/eclipse-jdtls/eclipse.jdt.ls/issues/3295). + * bug fix - Linux release package files have excessive permissions. See [JLS#3293](https://github.com/eclipse-jdtls/eclipse.jdt.ls/issues/3293). + * bug fix - Remove Dependency Analytics extension from being recommended. See [#3804](https://github.com/redhat-developer/vscode-java/pull/3804). + * bug fix - Update embedded lombok library name to reflect actual version. See [#3833](https://github.com/redhat-developer/vscode-java/pull/3833). + * dependencies - Use Node 20 in release-job only. See [#3809](https://github.com/redhat-developer/vscode-java/pull/3809). + +## 1.35.1 (September 30th, 2024) + * bug fix - Dynamic code actions fail on Windows. See [#3780](https://github.com/redhat-developer/vscode-java/issues/3780). + +## 1.35.0 (September 26th, 2024) + * performance - Consider token to limit the chains that are searched. See [JLS#2835](https://github.com/eclipse-jdtls/eclipse.jdt.ls/pull/2835). + * enhancement - Provide support for Java 23. See [#3774](https://github.com/redhat-developer/vscode-java/pull/3774). + * enhancement - Show decompiled content directly on opened `.class` file. See [#3759](https://github.com/redhat-developer/vscode-java/issues/3759). + * enhancement - Support dynamic code actions through LSP snippet syntax. See [#3686](https://github.com/redhat-developer/vscode-java/issues/3686). + * enhancement - Introduce new type mismatch quickfix for constructor invocations. See [#3040](https://github.com/redhat-developer/vscode-java/issues/3040). + * enhancement - Control scope for search operations (eg. references, call hierarchy, workspace symbols). See [#2649](https://github.com/redhat-developer/vscode-java/issues/2649). + * enhancement - Add "Organize Imports" as a clean up. See [#3764](https://github.com/redhat-developer/vscode-java/pull/3764). + * bug fix - Import Gradle project via. Buildship if Gradle Build Server is not available. See [JLS#3245](https://github.com/eclipse-jdtls/eclipse.jdt.ls/pull/3245). + * bug fix - Copy/paste will not escape content within String literal when code has error. See [#3761](https://github.com/redhat-developer/vscode-java/issues/3761). + * bug fix - Respect `unwantedRecommendations`. See [#3767](https://github.com/redhat-developer/vscode-java/pull/3767). + * dependencies - Bump webpack from 5.76.0 to 5.94.0. See [#3756](https://github.com/redhat-developer/vscode-java/pull/3756). + * dependencies - Update vscode-redhat-telemetry to 0.9.0. See [#3778](https://github.com/redhat-developer/vscode-java/pull/3778). + +## 1.34.0 (August 29th, 2024) + * enhancement - Support custom source file extensions through `files.associations`. See [#3731](https://github.com/redhat-developer/vscode-java/pull/3731). + * enhancement - Add telemetry for detecting language server running out of memory. See [#3743](https://github.com/redhat-developer/vscode-java/pull/3743). + * bug fix - Fix `ClassCastException` for the file paste event. See [JLS#3239](https://github.com/eclipse-jdtls/eclipse.jdt.ls/pull/3239). + * bug fix - Invalid code actions suggested on deletion of a file. See [#3663](https://github.com/redhat-developer/vscode-java/issues/3663). + * bug fix - Better handling when file path contains non-ASCII characters. See [#3735](https://github.com/redhat-developer/vscode-java/issues/3735). + * bug fix - Add Gradle 8.8 to compatibility check. See [JLS#3212](https://github.com/eclipse-jdtls/eclipse.jdt.ls/pull/3212). + * documentation - Fix stale reference in "Quick Start". See [#3741](https://github.com/redhat-developer/vscode-java/pull/3741). + +## 1.33.0 (August 1st, 2024) + * performance - Clean up invalid projects during initialization to prevent build cycles. See [#3639](https://github.com/redhat-developer/vscode-java/issues/3639). + * enhancement - Expose source actions via. the code action (light bulb) menu. See [#3714](https://github.com/redhat-developer/vscode-java/pull/3714). + * enhancement - Use `java.diagnostic.filter` to exclude files from the "Problems" tab. See [#2150](https://github.com/redhat-developer/vscode-java/issues/2150). + * enhancement - Clear out-of-date files under extension's global storage. See [#2597](https://github.com/redhat-developer/vscode-java/issues/2597). + * enhancement - Add support for callees based on implementors for call hierarchy. See [JLS#2780](https://github.com/eclipse-jdtls/eclipse.jdt.ls/issues/2780). + * bug fix - Links to classes do not appear in completion documentation. See [#3697](https://github.com/redhat-developer/vscode-java/issues/3697). + * bug fix - Add tag property to better track kinds of stacktrace errors of interest. See [#3720](https://github.com/redhat-developer/vscode-java/pull/3720). + * dependencies - Target platform update resulting in **loss of support for Java versions older than 1.8**. See [JLS#3227](https://github.com/eclipse-jdtls/eclipse.jdt.ls/pull/3227). + +## 1.32.0 (June 27th, 2024) + * performance - Ensure every null analysis annotation has a value defined when enabled. See [#3387](https://github.com/redhat-developer/vscode-java/issues/3387). + * enhancement - Add `final` to "Extract to local variable" quick assist if requested. See [#3308](https://github.com/redhat-developer/vscode-java/issues/3308). + * bug fix - Fix issues with the Lombok annotation handler. See [#3561](https://github.com/redhat-developer/vscode-java/issues/3561). + * bug fix - Revalidate project files after classpath changes when autobuild is off. See [JLS#3155](https://github.com/eclipse-jdtls/eclipse.jdt.ls/issues/3155). + * bug fix - Code completion fails with classes that are permitted by a sealed class. See [#3636](https://github.com/redhat-developer/vscode-java/issues/3636). + * bug fix - Perform verification on pipe name when transport kind is `default`. See [#3680](https://github.com/redhat-developer/vscode-java/pull/3680). + * bug fix - Some code actions may fail to resolve when machine's processor count too low. See [JLS#3180](https://github.com/eclipse-jdtls/eclipse.jdt.ls/issues/3180). + * bug fix - Support the import of multi-folder Gradle projects with same name. See [JLS#1743](https://github.com/eclipse-jdtls/eclipse.jdt.ls/issues/1743). + * bug fix - Autobuild setting should be respected on initialization. See [JLS#3176](https://github.com/eclipse-jdtls/eclipse.jdt.ls/issues/3176). + * bug fix - Improve chain completion by waiting for either "main" or "context" chains. See [JLS#2730](https://github.com/eclipse-jdtls/eclipse.jdt.ls/pull/2730). + * bug fix - Report only one instance of a logged error through telemetry. See [JLS#3190](https://github.com/eclipse-jdtls/eclipse.jdt.ls/pull/3190). + * build - Fix NPE when using 'Launch Extension - JDTLS Client' to local debug extension. See [#3677](https://github.com/redhat-developer/vscode-java/pull/3677). + +## 1.31.0 (May 30th, 2024) + * performance - Create the default project only when it is necessary. See [#3452](https://github.com/redhat-developer/vscode-java/issues/3452). + * performance - Improve order of operations when importing multi-module Maven projects. See [#3637](https://github.com/redhat-developer/vscode-java/issues/3637). + * enhancement - Support delegate API to retrieve/update active profiles of Maven projects. See [JLS#3158](https://github.com/eclipse-jdtls/eclipse.jdt.ls/pull/3158). + * enhancement - Support delegate API for updating Java project options. See [JLS#3162](https://github.com/eclipse-jdtls/eclipse.jdt.ls/pull/3162). + * bug fix - Fix indentation for new line preceded by comma. See [#3396](https://github.com/redhat-developer/vscode-java/issues/3396). + * bug fix - Support document paste across older versions of VS Code. See [#3631](https://github.com/redhat-developer/vscode-java/issues/3631). + * bug fix - Fall back to `stdio` transport if `pipe` is likely to fail. See [#3649](https://github.com/redhat-developer/vscode-java/issues/3649). + * bug fix - Switch expression on a boolean value does not report error. See [JLS#3141](https://github.com/eclipse-jdtls/eclipse.jdt.ls/issues/3141). + * bug fix - Only clean default project when building workspace if it exists. See [JLS#3153](https://github.com/eclipse-jdtls/eclipse.jdt.ls/issues/3153). + * bug fix - Avoid sending an "empty" (lacking project data) startup event. See [#3655](https://github.com/redhat-developer/vscode-java/pull/3655). + * dependencies - Update vscode-redhat-telemetry to 0.8.0. See [#3659](https://github.com/redhat-developer/vscode-java/pull/3659). + +## 1.30.0 (April 25th, 2024) + * enhancement - Add `final` to new declarations generated from code actions. See [#3586](https://github.com/redhat-developer/vscode-java/pull/3586). + * bug fix - Change default client/server transport from `stdio` to `pipe`. See [#3587](https://github.com/redhat-developer/vscode-java/pull/3587). + * bug fix - Qualifier of workspace symbol search should be wildcard search. See [JLS#3134](https://github.com/eclipse-jdtls/eclipse.jdt.ls/pull/3134). + * bug fix - Fix the document paste handling provider for VS Code 1.88.0. See [#3568](https://github.com/redhat-developer/vscode-java/issues/3568). + * bug fix - Clear active build tool selection after cleaning the language server workspace of mixed Maven/Gradle project. See [#3567](https://github.com/redhat-developer/vscode-java/issues/3567). + * bug fix - Static imports with wildcard should resolve all elements. See [#3564](https://github.com/redhat-developer/vscode-java/issues/3564). + * bug fix - Language Server fails to start with multiple `--add-exports` in `java.jdt.ls.vmargs`. See [#3577](https://github.com/redhat-developer/vscode-java/issues/3577). + * bug fix - Make `java.import.gradle.user.home` scope `machine-overridable`. See [#3569](https://github.com/redhat-developer/vscode-java/issues/3569). + * bug fix - Disable automatic handling of `workspace/willRenameFiles`. See [#3565](https://github.com/redhat-developer/vscode-java/pull/3565). + * build - Fix tests in release workflow. See [#3562](https://github.com/redhat-developer/vscode-java/pull/3562). + +## 1.29.0 (April 3rd, 2024) + * enhancement - Provide support for Java 22. See [#3538](https://github.com/redhat-developer/vscode-java/issues/3538). + * enhancement - Simplify the server status item click action & add contribution point. See [#3537](https://github.com/redhat-developer/vscode-java/pull/3537), [#3548](https://github.com/redhat-developer/vscode-java/pull/3548), [#3546](https://github.com/redhat-developer/vscode-java/pull/3546). + * enhancement - Add setting to group completion items representing overloaded methods together. See [#3492](https://github.com/redhat-developer/vscode-java/pull/3492). + * enhancement - Renaming primary type declaration should update source file name on save. See [#3408](https://github.com/redhat-developer/vscode-java/issues/3408). + * enhancement - Support updating whole classpath of the project in delegate commands. See [JLS#3098](https://github.com/eclipse-jdtls/eclipse.jdt.ls/pull/3098). + * enhancement - Open output channel as well when opening logs. See [#3531](https://github.com/redhat-developer/vscode-java/pull/3531). + * enhancement - Read the server logs in order to discover early startup log messages. See [JLS#3106](https://github.com/eclipse-jdtls/eclipse.jdt.ls/pull/3106). + * enhancement - Report errors of type `dtree.ObjectNotFoundException` as `java.ls.error`. See [#3509](https://github.com/redhat-developer/vscode-java/pull/3509). + * bug fix - Signature help should display all overloaded methods. See [JLS#3052](https://github.com/eclipse-jdtls/eclipse.jdt.ls/issues/3052). + * bug fix - Fix issues with Unnamed classes (Java 21) (reference computation, code actions, compilation). See [JLS#3069](https://github.com/eclipse-jdtls/eclipse.jdt.ls/issues/3069), [JLS#3089](https://github.com/eclipse-jdtls/eclipse.jdt.ls/issues/3089), [JLS#3090](https://github.com/eclipse-jdtls/eclipse.jdt.ls/pull/3090). + * bug fix - Record Patterns may cause `VerifyError`. See [#3479](https://github.com/redhat-developer/vscode-java/issues/3479). + * bug fix - Support list of patterns in case statements (Java 21). See [JLS#3043](https://github.com/eclipse-jdtls/eclipse.jdt.ls/issues/3043). + * bug fix - Allow methods, inherited fields, inherited methods for `Generate toString()` code action. See [#2639](https://github.com/redhat-developer/vscode-java/issues/2639). + * bug fix - Update Buildship to 3.1.10, which fixes "Marker property value is too long". See [JLS#2424](https://github.com/eclipse-jdtls/eclipse.jdt.ls/issues/2424). + * bug fix - Set the `nullUncheckedConversion` setting to be ignored by default. See [#3501](https://github.com/redhat-developer/vscode-java/issues/3501). + * bug fix - Fix NPE when fetching the classpath of the project. See [JLS#3115](https://github.com/eclipse-jdtls/eclipse.jdt.ls/pull/3115). + * dependencies - Bump follow-redirects from 1.15.4 to 1.15.6. See [#3534](https://github.com/redhat-developer/vscode-java/pull/3534). + * build - Adopt the Lombok 1.18.32 release. See [#3543](https://github.com/redhat-developer/vscode-java/pull/3543). + * build - Update various GitHub reusable workflows to v4. See [#3519](https://github.com/redhat-developer/vscode-java/pull/3519). + * build - Update release version regular expression for `bump-jdk` workflow. See [#3552](https://github.com/redhat-developer/vscode-java/pull/3552). + +## 1.28.1 (February 15th, 2024) + * enhancement - Unnamed classes & instance `main` methods (Java 21) preview support. See [JLS#3042](https://github.com/eclipse-jdtls/eclipse.jdt.ls/pull/3042). + * enhancement - Add support for activating cleanup actions through keyboard shortcut. See [#3424](https://github.com/redhat-developer/vscode-java/issues/3424). + * enhancement - Jump to specific position of `.class` when clicking on Javadoc link. See [#3490](https://github.com/redhat-developer/vscode-java/pull/3490). + * bug fix - Fix startup failure on macOS (x64) 10.15 or older. See [#3484](https://github.com/redhat-developer/vscode-java/issues/3484). + * bug fix - Support Gradle 8.5 with Java 21. See [#3470](https://github.com/redhat-developer/vscode-java/issues/3470). + +## 1.27.0 (February 1st, 2024) + * enhancement - Make the server status bar item more user friendly. See [#3473](https://github.com/redhat-developer/vscode-java/issues/3473). + * enhancement - Support syntax highlight for embedded HTML. See [#3465](https://github.com/redhat-developer/vscode-java/pull/3465). + * enhancement - Add Unnamed patterns and variables (Java 21) preview support. See [JLS#2963](https://github.com/eclipse-jdtls/eclipse.jdt.ls/pull/2963). + * enhancement - Add quick fixes for for suppressing warnings using `@SuppressWarnings`. See [JLS#2698](https://github.com/eclipse-jdtls/eclipse.jdt.ls/issues/2698). + * enhancement - Add quick fixes for uninitialized `final` fields. See [JLS#1328](https://github.com/eclipse-jdtls/eclipse.jdt.ls/issues/1328). + * enhancement - Add support for externally provided `lifecycle-mapping-metadata.xml` file. See [#3393](https://github.com/redhat-developer/vscode-java/issues/3393). + * bug fix - Allow generic snippets to be returned when completion token is `null`. See [#3466](https://github.com/redhat-developer/vscode-java/issues/3466). + * bug fix - Allow to import the newly created maven submodule within a multi-module project. See [#3464](https://github.com/redhat-developer/vscode-java/issues/3464). + * bug fix - Use `source.gradle-kotlin-dsl` instead of `source.kotlin` to avoid clashes with other Kotlin grammars. See [#3463](https://github.com/redhat-developer/vscode-java/pull/3463). + * bug fix - Log the error details when initialization fails. See [#3472](https://github.com/redhat-developer/vscode-java/pull/3472). + * bug fix - Avoid string concatenation with `Runtime.getRuntime().exec(..)`. See [JLS#3022](https://github.com/eclipse-jdtls/eclipse.jdt.ls/pull/3022). + * dependencies - Adopt the Lombok 1.18.31 edge release. See [#3461](https://github.com/redhat-developer/vscode-java/pull/3461). + * build - Automatically suggest updates based on JDT-LS Java language support. See [#3402](https://github.com/redhat-developer/vscode-java/pull/3402). + +## 1.26.0 (January 11th, 2024) + * performance - Reduce delegate command calls when classpath changes. See [#3439](https://github.com/redhat-developer/vscode-java/pull/3439). + * performance - Ensure initial import of projects respect resource filter settings. See [#2972](https://github.com/redhat-developer/vscode-java/issues/2972). + * performance - Improve the performance of "Organize Imports" when "favorite static imports" are involved. See [#3383](https://github.com/redhat-developer/vscode-java/issues/3383). + * enhancement - Add String Templates (Java 21) preview support. See [JLS#2994](https://github.com/eclipse-jdtls/eclipse.jdt.ls/pull/2994). + * enhancement - Support syntax highlight for embedded SQL, JSON, XML & YAML languages. See [#831](https://github.com/redhat-developer/vscode-java/issues/831), [#3455](https://github.com/redhat-developer/vscode-java/pull/3455). + * enhancement - Generate correct sources when pasting Java code into the file explorer view. See [#3323](https://github.com/redhat-developer/vscode-java/issues/3323). + * enhancement - Quick assists converting string concatenations to `StringBuilder`, `StringBuffer`, `String.format(..)`, `MessageFormat`. See [JLS#3007](https://github.com/eclipse-jdtls/eclipse.jdt.ls/pull/3007). + * enhancement - Quick assists inverting `equals` comparison & handling of lambda expressions. See [JLS#2996](https://github.com/eclipse-jdtls/eclipse.jdt.ls/pull/2996). + * enhancement - Support "non-null" assertions by default using null analysis. See [#3431](https://github.com/redhat-developer/vscode-java/issues/3431). + * enhancement - Make the language server status a normal status bar item for better visibility. See [#3416](https://github.com/redhat-developer/vscode-java/issues/3416). + * bug fix - Fix multiline semantic highlighting for `implements`, `extends`, and `permits` keywords. See [JLS#2995](https://github.com/eclipse-jdtls/eclipse.jdt.ls/pull/2995). + * bug fix - Use wrapper distribution when `gradle-wrapper.properties` exists. See [JLS#3012](https://github.com/eclipse-jdtls/eclipse.jdt.ls/pull/3012). + * bug fix - Fix false positive parameter mismatch error. See [JLS#2992](https://github.com/eclipse-jdtls/eclipse.jdt.ls/issues/2992). + * bug fix - Document pasting should defer to other contributors when there are no changes. See [#3444](https://github.com/redhat-developer/vscode-java/issues/3444). + * bug fix - Use Lombok 1.18.31 snapshot to avoid errors for annotations with parameters. See [#3454](https://github.com/redhat-developer/vscode-java/issues/3454). + * bug fix - Remember the choice when asking project selection on import. See [#3415](https://github.com/redhat-developer/vscode-java/issues/3415). + * bug fix - Guard against `null` completion context and insertion text. See [#3422](https://github.com/redhat-developer/vscode-java/issues/3422). + * bug fix - The assignment to variable `workingCopy` has no effect. See [JLS#3002](https://github.com/eclipse-jdtls/eclipse.jdt.ls/pull/3002). + * bug fix - Change scope of `java.import.gradle.home` to `machine-overridable`. See [#3430](https://github.com/redhat-developer/vscode-java/pull/3430). + * bug fix - Filter excessive logging of artifact download from m2e in "debug mode". See [JLS#3011](https://github.com/eclipse-jdtls/eclipse.jdt.ls/pull/3011). + * dependencies - Bump follow-redirects from 1.15.2 to 1.15.4. See [#3457](https://github.com/redhat-developer/vscode-java/pull/3457). + * debt - Remove the legacy status bar item implementation. See [#3081](https://github.com/redhat-developer/vscode-java/issues/3081). + +## 1.25.1 (December 7th, 2023) + * performance - Avoid unnecessary (Maven) project updates. See [#3411](https://github.com/redhat-developer/vscode-java/issues/3411). + * bug fix - Out of sync editor content may report false compilation errors. See [JLS#2955](https://github.com/eclipse-jdtls/eclipse.jdt.ls/issues/2955). + * bug fix - Improved support for textmate definition for Kotlin DSL. See [#3403](https://github.com/redhat-developer/vscode-java/issues/3403). + * bug fix - No completion suggestions for package references when `matchCase` is set to `firstLetter`. See [JLS#2925](https://github.com/eclipse-jdtls/eclipse.jdt.ls/issues/2925). + * bug fix - Closing Text Blocks immediately after an escaped character produces incorrect syntax highlight. See [#3384](https://github.com/redhat-developer/vscode-java/issues/3384). + * bug fix - Fix the typo: blob -> glob. See [#3413](https://github.com/redhat-developer/vscode-java/pull/3413). + +## 1.25.0 (November 30th, 2023) + * enhancement - Provide support for Java 21. See [#3292](https://github.com/redhat-developer/vscode-java/issues/3292). + * enhancement - Import projects by configurations. See [#3356](https://github.com/redhat-developer/vscode-java/pull/3356). + * enhancement - Support add/remove of imported projects. See [#3398](https://github.com/redhat-developer/vscode-java/pull/3398). + * enhancement - Host textmate definition for kotlin language. See [#3334](https://github.com/redhat-developer/vscode-java/issues/3334). + * enhancement - Categorize the extension settings. See [#2548](https://github.com/redhat-developer/vscode-java/issues/2548). + * enhancement - Add `maven.multiModuleProjectDirectory` property. See [#3380](https://github.com/redhat-developer/vscode-java/issues/3380). + * enhancement - Add capability to list all VM installs and update project JDK. See [JLS#2977](https://github.com/eclipse-jdtls/eclipse.jdt.ls/pull/2977). + * bug fix - Update to `vscode-languageclient` 8.2.0-next.3 (using Node 18) to fix IPC path length limitations. See [#3371](https://github.com/redhat-developer/vscode-java/issues/3371). + * bug fix - Avoid refreshing language server when contributing extension's dependency closure includes it. See [#3349](https://github.com/redhat-developer/vscode-java/issues/3349). + * bug fix - Wrongly encoded semantic tokens around `class` keyword. See [JLS#2920](https://github.com/eclipse-jdtls/eclipse.jdt.ls/issues/2920). + * bug fix - Cleanups & Organize Imports should only react to internal project preferences with `canUseInternalSettings`. See [#3399](https://github.com/redhat-developer/vscode-java/issues/3399), [#3370](https://github.com/redhat-developer/vscode-java/issues/3370), [JLS#2975](https://github.com/eclipse-jdtls/eclipse.jdt.ls/issues/2975). + * bug fix - Fix missing prompt to select build tool for Gradle/Maven mixed project. See [#3400](https://github.com/redhat-developer/vscode-java/issues/3400). + * bug fix - Respect the VS Code setting to disable extension recommendations. See [#3381](https://github.com/redhat-developer/vscode-java/issues/3381). + * bug fix - `IllegalArgumentException` on `completionItem/resolve` of package declaration. See [JLS#2924](https://github.com/eclipse-jdtls/eclipse.jdt.ls/issues/2924). + * bug fix - Add trace to understand the probability of document out-of-sync. See [JLS#2954](https://github.com/eclipse-jdtls/eclipse.jdt.ls/pull/2954). + * dependencies - Bump axios from 1.5.0 to 1.6.1. See [#3388](https://github.com/redhat-developer/vscode-java/pull/3388). + * dependencies - Update buildship to 3.1.8. See [JLS#2974](https://github.com/eclipse-jdtls/eclipse.jdt.ls/pull/2974). + +## 1.24.0 (October 26th, 2023) + * performance - Exclude certain folders (eg. `node_modules/`) from "trigger" file search on activation. [#3348](https://github.com/redhat-developer/vscode-java/pull/3348). + * enhancement - Move snippet suggestions above matching keywords in completion list. See [#2584](https://github.com/redhat-developer/vscode-java/issues/2584). + * enhancement - Add new alias `public static void main(String[] args)` for public main method. See [#2105](https://github.com/redhat-developer/vscode-java/issues/2105). + * enhancement - Add aliases for `sysout`/`syserr` snippets that will see more usage. See [#3041](https://github.com/redhat-developer/vscode-java/issues/3041). + * enhancement - Add "Surround with try/catch" code action. See [JLS#2727](https://github.com/eclipse-jdtls/eclipse.jdt.ls/pull/2727). + * enhancement - Automatically add the existing static imports in code as favorite static members. See [JLS#2903](https://github.com/eclipse-jdtls/eclipse.jdt.ls/pull/2903). + * enhancement - Provide quick fix to "Configure static import...". See [#3339](https://github.com/redhat-developer/vscode-java/pull/3339). + * enhancement - Support named pipes for client/server communication. See [#3282](https://github.com/redhat-developer/vscode-java/issues/3282). + * enhancement - Track the LSP request data from syntax server. See [#3278](https://github.com/redhat-developer/vscode-java/pull/3278). + * bug fix - Re-implement smart semicolon detection through text document change API. See [#3290](https://github.com/redhat-developer/vscode-java/issues/3290). + * bug fix - Completion returns no results for method declarations when `matchCase` set to `FIRSTLETTER`. See [#3214](https://github.com/redhat-developer/vscode-java/issues/3214), [#3186](https://github.com/redhat-developer/vscode-java/issues/3186). + * bug fix - Allow filtering methods by parameter names, and order by number of parameters. See [JLS#2907](https://github.com/eclipse-jdtls/eclipse.jdt.ls/issues/2907), [#3206](https://github.com/redhat-developer/vscode-java/issues/3206). + * bug fix - Reconcile AST node to provide accurate type definition snippets. See [#2250](https://github.com/redhat-developer/vscode-java/issues/2250). + * bug fix - `BasicFileDetector` should handle inaccessible directories gracefully during project import. See [#1156](https://github.com/redhat-developer/vscode-java/issues/1156), [#3137](https://github.com/redhat-developer/vscode-java/issues/3137). + * bug fix - Ensure line delimiter exists after the file header template. See [JLS#2906](https://github.com/eclipse-jdtls/eclipse.jdt.ls/pull/2906). + * bug fix - `o.e.core.internal.resources.ResourceException`: Invalid project description. See [JLS#2845](https://github.com/eclipse-jdtls/eclipse.jdt.ls/issues/2845). + * bug fix - Error when parsing resource filter. See [#3345](https://github.com/redhat-developer/vscode-java/pull/3345). + * bug fix - NPE in `SemanticTokensHandler`. See [JLS#2876](https://github.com/eclipse-jdtls/eclipse.jdt.ls/issues/2876). + * bug fix - NPE in cleanup action handler. See [JLS#2879](https://github.com/eclipse-jdtls/eclipse.jdt.ls/issues/2879). + * bug fix - `UnsupportedOperationException` at `org.eclipse.lsp4j.services.LanguageServer.setTrace()`. See [JLS#2891](https://github.com/eclipse-jdtls/eclipse.jdt.ls/issues/2891). + * dependencies - Bump postcss from 8.4.21 to 8.4.31. See [#3335](https://github.com/redhat-developer/vscode-java/pull/3335). + +## 1.23.0 (September 28th, 2023) + * enhancement - Improve JDK detection on the local machine, and ensure they are registered. See [#3301](https://github.com/redhat-developer/vscode-java/pull/3301). + * enhancement - Update current method snippet and add `static_method` snippet for interface. See [#1697](https://github.com/redhat-developer/vscode-java/issues/1697). + * enhancement - Improve the constructor snippet for additional classes in a file. See [#725](https://github.com/redhat-developer/vscode-java/issues/725). + * enhancement - Store the completion kinds requested by completion operation. See [JLS#2857](https://github.com/eclipse-jdtls/eclipse.jdt.ls/pull/2857). + * enhancement - Update to Lombok 1.18.30. See [#3321](https://github.com/redhat-developer/vscode-java/pull/3321). + * enhancement - Add API `onWillRequestStart` to track request send event. See [#3316](https://github.com/redhat-developer/vscode-java/pull/3316). + * enhancement - Report whether the project has Kotlin Gradle files. See [JLS#2859](https://github.com/eclipse-jdtls/eclipse.jdt.ls/pull/2859). + * enhancement - Track the completion kinds of completion request. See [#3307](https://github.com/redhat-developer/vscode-java/pull/3307). + * bug fix - Fix `EmptyStackException` in `textDocument/foldingRange`. See [JLS#2865](https://github.com/eclipse-jdtls/eclipse.jdt.ls/issues/2865). + * bug fix - Fix renaming of attribute with `@Singular` annotation. See [#3203](https://github.com/redhat-developer/vscode-java/issues/3203). + * bug fix - `Open Java Language Server Log File` should open the correct server (standard/syntax) log. See [#3309](https://github.com/redhat-developer/vscode-java/issues/3309). + * bug fix - Fix `URI` with query parameter. See [#3305](https://github.com/redhat-developer/vscode-java/issues/3305). + * bug fix - Fix an error thrown during "Initialize workspace". See [JLS#2842](https://github.com/eclipse-jdtls/eclipse.jdt.ls/issues/2842). + +## 1.22.1 (September 14th, 2023) + * bug fix - Removed some improvements to JDK detection as they were causing issues on MacOS. See [#3287](https://github.com/redhat-developer/vscode-java/issues/3287). If you still see JDK class errors after upgrading to 1.22.1, please open **Command Palette** and run "**Java: Clean Java Language Server Workspace**". + * bug fix - Log errors from project importer. See [JLS#2843](https://github.com/eclipse-jdtls/eclipse.jdt.ls/pull/2843). + * bug fix - Disable `;` key binding when smart semicolon detection is disabled. See [#3290](https://github.com/redhat-developer/vscode-java/issues/3290). + +## 1.22.0 (September 12th, 2023) + * performance - Stale code actions should be cancellable and paste actions should have higher priority. See [#3199](https://github.com/redhat-developer/vscode-java/issues/3199). + * enhancement - Add support for smart semicolon insertion. See [#703](https://github.com/redhat-developer/vscode-java/issues/703). + * enhancement - Introduce new snippet templates with appropriate context. See [#2867](https://github.com/redhat-developer/vscode-java/issues/2867). + * enhancement - Improve JDK detection on the local machine, and ensure they are registered. See [#3251](https://github.com/redhat-developer/vscode-java/pull/3251). + * enhancement - Add folding range for multiple single-line comments. See [#860](https://github.com/redhat-developer/vscode-java/issues/860). + * enhancement - Use a more appropriate completion item image for annotation attributes and records. See [JLS#2796](https://github.com/eclipse-jdtls/eclipse.jdt.ls/pull/2796). + * enhancement - Select suitable JDK to launch Gradle. See [JLS#2812](https://github.com/eclipse-jdtls/eclipse.jdt.ls/pull/2812). + * enhancement - end-to-end performance tracking for code completion requests. See [#3165](https://github.com/redhat-developer/vscode-java/pull/3165). + * enhancement - Track the case of language server `OutOfMemory`. See [#3273](https://github.com/redhat-developer/vscode-java/pull/3273). + * enhancement - Record the trigger context of completion request. See [#3272](https://github.com/redhat-developer/vscode-java/pull/3272). + * bug fix - Call hierarchy should always report the end of its progress. See [JLS#2827](https://github.com/eclipse-jdtls/eclipse.jdt.ls/pull/2827). + * bug fix - Fix multiline semantic highlighting for `class`, `interface` & `record` declarations. See [#1444](https://github.com/redhat-developer/vscode-java/issues/1444), [JLS#2807](https://github.com/eclipse-jdtls/eclipse.jdt.ls/pull/2807). + * bug fix - The type declaration snippets should generate file headers. See [JLS#2813](https://github.com/eclipse-jdtls/eclipse.jdt.ls/pull/2813). + * bug fix - Fix folding ranges for nested switch statements. See [#2751](https://github.com/redhat-developer/vscode-java/issues/2751). + * bug fix - Fix "java.lang.VerifyError: Operand stack overflow". See [#3232](https://github.com/redhat-developer/vscode-java/issues/3232). + * bug fix - Commands needing language server should not be activated before the service is ready . See [#3281](https://github.com/redhat-developer/vscode-java/pull/3281). + * bug fix - Record methods are not recognized under certain conditions. See [#3233](https://github.com/redhat-developer/vscode-java/issues/3233). + * bug fix - Fix compiler arguments parsing failure in Gradle build support. See [JLS#2781](https://github.com/eclipse-jdtls/eclipse.jdt.ls/issues/2781). + * bug fix - Filter out excessive logging of classfile parsing from m2e in "debug mode". See [JLS#2785](https://github.com/eclipse-jdtls/eclipse.jdt.ls/pull/2785). + * bug fix - Don't escape unicode characters when pasting string literals. See [#3181](https://github.com/redhat-developer/vscode-java/issues/3181). + * bug fix - Enable by default syntactic null analysis for fields. See [#3255](https://github.com/redhat-developer/vscode-java/issues/3255). + * bug fix - Rename `SERVER_PORT` environment variable to `JDTLS_SERVER_PORT`. See [#3256](https://github.com/redhat-developer/vscode-java/issues/3256), [#2507](https://github.com/redhat-developer/vscode-java/issues/2507). + * dependencies - Update semver to latest version where possible. See [#3264](https://github.com/redhat-developer/vscode-java/pull/3264). + * dependencies - Update vscode-redhat-telemetry to 0.7.0. See [#3262](https://github.com/redhat-developer/vscode-java/pull/3262). + +## 1.21.0 (July 27th, 2023) + * performance - Check completion proposal is compatible or not. See [JLS#2733](https://github.com/eclipse/eclipse.jdt.ls/pull/2733). + * enhancement - Add code actions for Join/Split variable. See [JLS#2732](https://github.com/eclipse/eclipse.jdt.ls/pull/2732). + * enhancement - Support outline view for decompiled source. See [JLS#2742](https://github.com/eclipse/eclipse.jdt.ls/pull/2742). + * enhancement - Reload the cached classfile sources when their source attachment is updated. See [#3207](https://github.com/redhat-developer/vscode-java/pull/3207). + * enhancement - Log error when Gradle and JDK versions are mismatched. See [JLS#2749](https://github.com/eclipse/eclipse.jdt.ls/pull/2749). + * bug fix - Fix parameter and exception changes in method signature refactoring. See [#3098](https://github.com/redhat-developer/vscode-java/issues/3098). + * bug fix - Fix missing completion items for fully qualified name completion. See [#3173](https://github.com/redhat-developer/vscode-java/issues/3173). + * bug fix - Support Java text block highlight. See [#2896](https://github.com/redhat-developer/vscode-java/issues/2896). + * bug fix - Fix incorrect syntax highlight for comment following a `throws` clause. See [#3039](https://github.com/redhat-developer/vscode-java/issues/3039). + * bug fix - Fix incorrect syntax highlight for `new` keyword on inner class creation. See [#1195](https://github.com/redhat-developer/vscode-java/issues/1195). + * bug fix - Fix incorrect semantic highlighting due to out-of-date AST in use. See [JLS#2709](https://github.com/eclipse/eclipse.jdt.ls/pull/2709). + * bug fix - Prevent caching outdated AST in `CoreASTProvider`. See [JLS#2714](https://github.com/eclipse/eclipse.jdt.ls/pull/2714). + * bug fix - Call Hierarchy resolves wrong element under certain conditions. See [JLS#2771](https://github.com/eclipse/eclipse.jdt.ls/issues/2771). + * bug fix - `NullPointerException` during code completion of a `var` reference. See [#2758](https://github.com/redhat-developer/vscode-java/issues/2758). + * bug fix - Do not delete the Java project nature removing a nested `.classpath` resource file. See [JLS#2750](https://github.com/eclipse/eclipse.jdt.ls/pull/2750). + * bug fix - Unable to acquire the state change lock for the module 'buildship'. See [#3184](https://github.com/redhat-developer/vscode-java/issues/3184). + * bug fix - Rename 'Attach Source' menu to 'Attach Sourceโ€ฆ'. See [#3202](https://github.com/redhat-developer/vscode-java/pull/3202). + * dependencies - Bump word-wrap from 1.2.3 to 1.2.4. See [#3211](https://github.com/redhat-developer/vscode-java/pull/3211). + +## 1.20.0 (June 29th, 2023) + * performance - Set the default value of `java.completion.matchCase` to `firstLetter`. See [#3142](https://github.com/redhat-developer/vscode-java/pull/3142). + * enhancement - Support for "Go to Declaration". See [JLS#2684](https://github.com/eclipse/eclipse.jdt.ls/issues/2684). + * enhancement - Improve method argument guessing functionality. See [#2903](https://github.com/redhat-developer/vscode-java/issues/2903). + * enhancement - Add code action to clean up & simplify lambda expressions. See [#3158](https://github.com/redhat-developer/vscode-java/pull/3158). + * enhancement - Use FernFlower as the default decompiler. See [JLS#2704](https://github.com/eclipse/eclipse.jdt.ls/pull/2704). + * enhancement - Attempt automatic JVM detection on startup. See [JLS#2731](https://github.com/eclipse/eclipse.jdt.ls/pull/2731). + * enhancement - Support for chain completions. See [#3008](https://github.com/redhat-developer/vscode-java/pull/3008). + * enhancement - Make reasonable guess for method name when applying "Extract Method" refactoring. See [#2011](https://github.com/redhat-developer/vscode-java/issues/2011). + * enhancement - Add postfix completion for `sysouf`, `sysoutv`, `format`, `par`, `not`,`assert` & `optional` . See [JLS#2691](https://github.com/eclipse/eclipse.jdt.ls/pull/2691), [JLS#2697](https://github.com/eclipse/eclipse.jdt.ls/pull/2697). + * enhancement - Use choice syntax as placeholder for constructor/method/field snippets. See [#3018](https://github.com/redhat-developer/vscode-java/pull/3018), [#3140](https://github.com/redhat-developer/vscode-java/pull/3140). + * enhancement - The `try-catch` snippet should support being applied to a selection. See [#3103](https://github.com/redhat-developer/vscode-java/issues/3103). + * enhancement - Track errors, exceptions, and project import success rate on server side for reliability analysis. See [#3162](https://github.com/redhat-developer/vscode-java/pull/3162), [JLS#2726](https://github.com/eclipse/eclipse.jdt.ls/pull/2726). + * bug fix - Display package name in document symbols outline for class files. See [#3074](https://github.com/redhat-developer/vscode-java/issues/3074). + * bug fix - Signature help should display the selected completion item. See [#3127](https://github.com/redhat-developer/vscode-java/issues/3127). + * bug fix - Gracefully handle language server failures/crashes. See [#2036](https://github.com/redhat-developer/vscode-java/issues/2036), [#3131](https://github.com/redhat-developer/vscode-java/issues/3131). + * bug fix - No completions on field initializer with `@Default` and `@Builder` Lombok annotations. See [JLS#2669](https://github.com/eclipse/eclipse.jdt.ls/issues/2669). + * bug fix - `IllegalArgumentException` within a try-catch block. See [#3138](https://github.com/redhat-developer/vscode-java/issues/3138). + * bug fix - Fix `pId` mismatch in completions. See [JLS#2681](https://github.com/eclipse/eclipse.jdt.ls/pull/2681). + * bug fix - Typo in constant `METADATA_FILES_GENERATION`. See [#3133](https://github.com/redhat-developer/vscode-java/pull/3133). + * build - Add enviornment variable to reference an external build of JDT-LS. See [#3151](https://github.com/redhat-developer/vscode-java/issues/3151). + * build - Check for non-standard NPM registry in `package-lock.json` as a step in CI. See [#2876](https://github.com/redhat-developer/vscode-java/issues/2876). + * build - Bump `semver` from 7.3.5 to 7.5.2. See [#3168](https://github.com/redhat-developer/vscode-java/pull/3168). + +## 1.19.0 (June 1st, 2023) + * performance - No need to run the reconcile operation in a workspace job. See [JLS#2660](https://github.com/eclipse/eclipse.jdt.ls/pull/2660). + * performance - Avoid blocking the pipeline while handling `refreshLocal` during document lifecycle events. See [JLS#2659](https://github.com/eclipse/eclipse.jdt.ls/pull/2659). + * performance - Avoid running document lifecycle in a workspace runnable unless it is necessary. See [JLS#2641](https://github.com/eclipse/eclipse.jdt.ls/pull/2641), [JLS#2637](https://github.com/eclipse/eclipse.jdt.ls/pull/2637). + * performance - Re-validate current document if the focus is switched to a Java file. See [#3053](https://github.com/redhat-developer/vscode-java/pull/3053). + * performance - Only append data on completion item selected. See [JLS#2639](https://github.com/eclipse/eclipse.jdt.ls/pull/2639). + * performance - Remove some unnecessary completion item data fields. See [JLS#2638](https://github.com/eclipse/eclipse.jdt.ls/issues/2638). + * performance - Remove `COMPLETION_EXECUTION_TIME` from the completion item response. See [JLS#2621](https://github.com/eclipse/eclipse.jdt.ls/issues/2621). + * performance - Use separate thread to handle `didChangeWatchedFiles` events. See [JLS#2643](https://github.com/eclipse/eclipse.jdt.ls/pull/2643). + * performance - Add option to lazily resolve the text edits. See [JLS#1864](https://github.com/eclipse/eclipse.jdt.ls/issues/1864). + * enhancement - Add command to restart Java language server. See [#2586](https://github.com/redhat-developer/vscode-java/pull/2586). + * enhancement - Add support for proper array completions. See [JLS#2609](https://github.com/eclipse/eclipse.jdt.ls/issues/2609). + * enhancement - Completion items should support `InsertTextMode`. See [JLS#2577](https://github.com/eclipse/eclipse.jdt.ls/issues/2577). + * enhancement - Use `vscode-extension-proposals` for recommendations. See [#3099](https://github.com/redhat-developer/vscode-java/issues/3099). + * bug fix - Missing javadoc for field during completion. See [JLS#2645](https://github.com/eclipse/eclipse.jdt.ls/issues/2645). + * bug fix - Incorrect completion text edit ranges for snippets. See [JLS#2626](https://github.com/eclipse/eclipse.jdt.ls/issues/2626). + * bug fix - Update completion resolve data for javadoc completions. See [JLS#2636](https://github.com/eclipse/eclipse.jdt.ls/pull/2636). + * bug fix - Prevent sending shutdown job progress report. See [JLS#2622](https://github.com/eclipse/eclipse.jdt.ls/pull/2622). + * bug fix - On Windows, `os.execvp` does not load the executable into current process. See [JLS#2615](https://github.com/eclipse/eclipse.jdt.ls/issues/2615). + * bug fix - Code completion for constructor is broken with `java.completion.matchCase` enabled. See [#3118](https://github.com/redhat-developer/vscode-java/issues/3118). + * build - Gracefully recover from failure to detect the language server project in sibling directory. See [#3107](https://github.com/redhat-developer/vscode-java/issues/3107). + * dependencies - Update to lombok 1.18.28. See [#3117](https://github.com/redhat-developer/vscode-java/pull/3117). + +## 1.18.0 (April 27th, 2023) + * performance - Completion handling should not be done in asynchronous thread pool. See [JLS#2605](https://github.com/eclipse/eclipse.jdt.ls/pull/2605). + * performance - Support lazily resolving postfix completion items. See [#3072](https://github.com/redhat-developer/vscode-java/pull/3072), [JLS#2616](https://github.com/eclipse/eclipse.jdt.ls/issues/2616), [JLS#2584](https://github.com/eclipse/eclipse.jdt.ls/issues/2584). + * performance - Place the URI of a document into the completion response store. See [#2614](https://github.com/eclipse/eclipse.jdt.ls/pull/2614). + * enhancement - Provide Java 20 support. See [#3023](https://github.com/redhat-developer/vscode-java/issues/3023). + * enhancement - Add `syserr` postfix completion. See [JLS#2620](https://github.com/eclipse/eclipse.jdt.ls/pull/2620). + * bug fix - Ensure meaningful information is displayed by the progress reporter. See [#3082](https://github.com/redhat-developer/vscode-java/pull/3082). + * bug fix - Respect settings in the `lombok.config` file. See [#2887](https://github.com/redhat-developer/vscode-java/issues/2887). + * bug fix - `NullPointerException` in `signatureHelp/codeAction/inlayHint` when AST is not generated. See [JLS#2608](https://github.com/eclipse/eclipse.jdt.ls/issues/2608). + * bug fix - `StringIndexOutOfBoundsException` on `textDocument/signatureHelp` when triggered from end of document. See [JLS#2606](https://github.com/eclipse/eclipse.jdt.ls/issues/2606). + * bug fix - Some logged information should only be shown in debug mode. See [JLS#2603](https://github.com/eclipse/eclipse.jdt.ls/issues/2603). + +## 1.17.0 (April 13th, 2023) + * performance - Support resolving dependencies in parallel for Maven projects. See [#3030](https://github.com/redhat-developer/vscode-java/pull/3030). + * performance - Cache and re-use type bindings for a completion invocation. See [JLS#2535](https://github.com/eclipse/eclipse.jdt.ls/pull/2535). + * performance - Avoid retrieving AST root during diagnostic publishing. See [JLS#2574](https://github.com/eclipse/eclipse.jdt.ls/pull/2574). + * performance - Implement `itemDefaults` for completion responses. See [JLS#2475](https://github.com/eclipse/eclipse.jdt.ls/issues/2475). + * enhancement - Add support for decompiling class files. See [#2679](https://github.com/redhat-developer/vscode-java/issues/2679), [#3012](https://github.com/redhat-developer/vscode-java/issues/3012). + * enhancement - Add "Change signature" refactoring. See [#2104](https://github.com/redhat-developer/vscode-java/issues/2104). + * enhancement - Implement `labelDetails` for completion items. See [JLS#2476](https://github.com/eclipse/eclipse.jdt.ls/issues/2476). + * enhancement - `sysout` postfix completion should be applicable to any variable. See [JLS#2559](https://github.com/eclipse/eclipse.jdt.ls/pull/2559). + * enhancement - Add support for telemetry notifications. See [#2289](https://github.com/redhat-developer/vscode-java/issues/2289), [#3042](https://github.com/redhat-developer/vscode-java/pull/3042), [#3058](https://github.com/redhat-developer/vscode-java/pull/3058). + * enhancement - Trace API should give indicator of response success status. See [#3010](https://github.com/redhat-developer/vscode-java/pull/3010). + * bug fix - Single double quote should be matched appropriately. See [#3037](https://github.com/redhat-developer/vscode-java/issues/3037). + * bug fix - Increase relevance of "Create enum". See [#2940](https://github.com/redhat-developer/vscode-java/issues/2940). + * bug fix - Recover when `documentPaste` API is not properly registered. See [#3028](https://github.com/redhat-developer/vscode-java/pull/3028). + * bug fix - Ensure we do not return duplicate search results for workspace symbols. See [JLS#2547](https://github.com/eclipse/eclipse.jdt.ls/pull/2547). + * bug fix - Code action to generate accessor outside of identifier no longer available. See [JLS#2533](https://github.com/eclipse/eclipse.jdt.ls/issues/2533). + * bug fix - Support importing multi-Maven projects with the same `artifactId`. See [JLS#2017](https://github.com/eclipse/eclipse.jdt.ls/issues/2017). + * bug fix - Do not show `Generate Constructors` quick assist for static fields. See [JLS#2142](https://github.com/eclipse/eclipse.jdt.ls/issues/2142). + * bug fix - Delegate commands should respect cancellation events from the client. See [JLS#2415](https://github.com/eclipse/eclipse.jdt.ls/issues/2415). + * bug fix - Ensure `java.project.upgradeGradle` client/server commands do not clash. See [#3001](https://github.com/redhat-developer/vscode-java/issues/3001). + * bug fix - Fix "commands test" when run locally. See [#3027](https://github.com/redhat-developer/vscode-java/pull/3027). + * build - Exclude `.github/` and `.gitignore` from packaging. See [#3057](https://github.com/redhat-developer/vscode-java/pull/3057). + * build - Add separate tsconfig for webview. See [#3009](https://github.com/redhat-developer/vscode-java/pull/3009). + * debt - Support the refactoring document correctly. See [#2974](https://github.com/redhat-developer/vscode-java/issues/2974). + +## 1.16.0 (March 16th, 2023) + * performance - Allow language server to declare availability sooner by postponing autobuild. See [JLS#2527](https://github.com/eclipse/eclipse.jdt.ls/pull/2527). + * performance - Save operations need not run in workspace runnable when project is not unmanaged. See [JLS#2449](https://github.com/eclipse/eclipse.jdt.ls/pull/2449). + * enhancement - Implement method hierarchy through existing type hierarchy logic. See [#2991](https://github.com/redhat-developer/vscode-java/pull/2991). + * enhancement - Declare support for inlay hints through the language server specification. See [#2965](https://github.com/redhat-developer/vscode-java/pull/2965), [JLS#2365](https://github.com/eclipse/eclipse.jdt.ls/issues/2365). + * enhancement - Update types filter according to import declarations. See [#2943](https://github.com/redhat-developer/vscode-java/issues/2943). + * enhancement - Update to vscode-languageclient 8.1.0, LSP4J 0.20.0 (LSP 3.17.0). See [#2474](https://github.com/redhat-developer/vscode-java/issues/2474), [JLS#2348](https://github.com/eclipse/eclipse.jdt.ls/issues/2348). + * bug fix - Fix regression in extension startup for web-based editors. See [#2968](https://github.com/redhat-developer/vscode-java/issues/2968). + * bug fix - No completion on generic anonymous class instance objects. See [JLS#2505](https://github.com/eclipse/eclipse.jdt.ls/issues/2505). + * bug fix - Null Analysis does not work for Eclipse/Invisible projects. See [#2956](https://github.com/redhat-developer/vscode-java/issues/2956). + * bug fix - Unnecessary error marker for record constructor that uses varargs. See [#2640](https://github.com/redhat-developer/vscode-java/issues/2640). + * bug fix - Temporary fix to ensure refactoring document is displayed. See [#2975](https://github.com/redhat-developer/vscode-java/pull/2975). + * bug fix - In progress items should always be at the bottom in the server tasks view. See [#2627](https://github.com/redhat-developer/vscode-java/issues/2627). + * bug fix - Fix NPE in `textDocument/documentHighlight` requests. See [#2952](https://github.com/redhat-developer/vscode-java/issues/2952). + * bug fix - Update VS Code engine to 1.74.0. See [#2950](https://github.com/redhat-developer/vscode-java/issues/2950). + * build - Bump webpack from 5.34.0 to 5.76.0. See [#2999](https://github.com/redhat-developer/vscode-java/pull/2999). + * other - Add API to track LSP performance at the language client. See [#2996](https://github.com/redhat-developer/vscode-java/pull/2996). + ## 1.15.0 (February 20th, 2023) * performance - Skip generated methods when calculating document symbols. See [JLS#2446](https://github.com/eclipse/eclipse.jdt.ls/issues/2446). * performance - Make the debounce adaptive for the publish diagnostic job. See [JLS#2443](https://github.com/eclipse/eclipse.jdt.ls/pull/2443). @@ -20,7 +656,7 @@ * bug fix - Completion results should include filtered (excluded) types if they are also present in the import declarations. See [JLS#2467](https://github.com/eclipse/eclipse.jdt.ls/pull/2467). * bug fix - Fix type hierarchy regression since VS Code 1.75.1. See [#2930](https://github.com/redhat-developer/vscode-java/pull/2930). * bug fix - Re-publish diagnostics for null analysis configuration change when auto-build is disabled. See [JLS#2447](https://github.com/eclipse/eclipse.jdt.ls/pull/2447). - * bug fix - Dependency Analytics extension popup shoud respect user choice. See [#2892](https://github.com/redhat-developer/vscode-java/issues/2892). + * bug fix - Dependency Analytics extension popup should respect user choice. See [#2892](https://github.com/redhat-developer/vscode-java/issues/2892). * bug fix - Only do full build for a configuration change when auto-build is enabled. See [JLS#2437](https://github.com/eclipse/eclipse.jdt.ls/pull/2437). * bug fix - The command to upgrade gradle should check for cancellation prior to updating metadata files. See [JLS#2444](https://github.com/eclipse/eclipse.jdt.ls/pull/2444). * bug fix - Fix incorrect ordering of completion items that use a decorator. See [#2917](https://github.com/redhat-developer/vscode-java/issues/2917). @@ -42,9 +678,9 @@ * bug fix - Fix incorrect type hierarchy on multi module Maven projects. See [#2871](https://github.com/redhat-developer/vscode-java/issues/2871). * bug fix - Permit output folder to be the same as a source folder. See [#2786](https://github.com/redhat-developer/vscode-java/issues/2786). * bug fix - Organize imports removes static imports under some conditions. See [#2861](https://github.com/redhat-developer/vscode-java/issues/2861). - * bug fix - Fix completion issue occuring when invocation spans multiple lines. See [JLS#2387](https://github.com/eclipse/eclipse.jdt.ls/issues/2387). + * bug fix - Fix completion issue occurring when invocation spans multiple lines. See [JLS#2387](https://github.com/eclipse/eclipse.jdt.ls/issues/2387). * bug fix - Fix scope calculation for "Surround with try/catch" refactoring. See [#2711](https://github.com/redhat-developer/vscode-java/issues/2711). - * bug fix - Fix NPE occuring when completion item is selected. See [JLS#2376](https://github.com/eclipse/eclipse.jdt.ls/issues/2376). + * bug fix - Fix NPE occurring when completion item is selected. See [JLS#2376](https://github.com/eclipse/eclipse.jdt.ls/issues/2376). * bug fix - Log user friendly error if client does not support `_java.reloadBundles.command`. See [JLS#2370](https://github.com/eclipse/eclipse.jdt.ls/pull/2370). * bug fix - Postfix completion should not be available when editing Javadoc. See [JLS#2367](https://github.com/eclipse/eclipse.jdt.ls/issues/2367). * bug fix - Update m2e to latest version in order to ensure classpath resources persist. See [#2857](https://github.com/redhat-developer/vscode-java/issues/2857). diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index b54978088..e63a1b05d 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -34,7 +34,7 @@ The following will be a start to finish guide to get the entire language server 1. Install the required software: * latest [Visual Studio Code](https://code.visualstudio.com/) - * [Node.js](https://nodejs.org/) v4.0.0 or higher + * [Node.js](https://nodejs.org/) v18.17.1 (with npm 9.6.7) or higher 2. Fork and clone [this repository](https://github.com/redhat-developer/vscode-java) Keep in mind the final directories will look like: @@ -57,7 +57,7 @@ The following will be a start to finish guide to get the entire language server 5. (**\*Optional**) Build a platform specific JRE: ```bash - $ npx gulp download_jre + $ npm run download-jre ``` You can also use the options `--target` and `--javaVersion` to build the specified JRE version for the specified target architecture. @@ -81,8 +81,11 @@ This assumes that you are starting on the `vscode-java` directory ```bash $ cd ./vscode-java - $ npm run build-server + $ npm run build ``` +If the eclipse.jdt.ls directory is not found as a sibling directory (see the desired hierarchy in the previous step), a snapshot of the language server will be downloaded instead. + +To build the server using only the local eclipse.jdt.ls repository, use `npm run build-server`. **\*Optional:** You can run faster server builds during development by calling `npm run fast-build-server` script instead, this will build server binaries that are required by your host OS only. You can also use `npm run watch-server` which will build and place them on the extension for Java changes. These commands run Maven in offline mode, so you might need to run `build-server` at least once, to fetch all the dependencies. @@ -91,7 +94,7 @@ This will build and place the binaries under the `server` folder. Alternately yo ```bash $ cd ../vscode-java -$ ./node_modules/.bin/gulp download_server +$ npm run download-server ``` ### Setting up the JDT Language Server Below are the details about how to set up the JDT Language Server in different IDEs. **Notice**: You only need set up it once in any of your preferred IDE. @@ -163,16 +166,26 @@ While developing the language server and the extension, you don't need to deploy - In the debug console of VSCode you can see if the connection was successful. - When the server is running breakpoints can be reached and hot code replace can be used to make fixes without restarting the server. - You can modify `launch.json` to use a different port: - - Modify `SERVER_PORT` to specify the port the JDT LS server should connect to. + - Modify `JDTLS_SERVER_PORT` to specify the port the JDT LS server should connect to. ## C-2) The language server opens the connection first, and waits the extension to connect to it. - Start the language server via `jdt.ls.socket-stream` launch configuration in VS Code or Eclipse ![Socket Steam in VS Code](images/changelog/SocketSteamInVSCode.png) -- Start the extenion via _Launch Extension - JDTLS Client_ in VS Code +- Start the extension via _Launch Extension - JDTLS Client_ in VS Code - You can modify `launch.json` to use a different port: - Modify `JDTLS_CLIENT_PORT` to specify the port VS Code should connect to. +## C-3) Set location to a local copy of JDT-LS + +This approach is mainly targeting developers of JDT-LS who want to test their changes in VSCode without having to rebuild vscode-java and to deal with the npm and vsix toolchains. + +- Make sure a recent snapshot of vscode-java is installed in your VSCode instance (as of vscode-java 1.20.0) +- (Optionally) clear the workspace state: `$ rm -r $HOME/.config/Code/User/workspaceStorage/0123456789abcdef01234567890abcdef/redhat.java/jdt_ws` +- Start VSCode with the `JDT_LS_PATH` environment variable set to the local copy of JDT-LS you want to try: `$ JDT_LS_PATH=$HOME/git/eclipse.jdt.ls/org.eclipse.jdt.ls.product/target/repository code` + +Most other options such as `DEBUG_VSCODE_JAVA` are still usable with this approach. + ## Sideloading You can create a binary that you can sideload to your VS Code installation. @@ -185,14 +198,14 @@ You can create a binary that you can sideload to your VS Code installation. $ npm install ``` 4. Optionally, follow the instruction to build the server. -5. See documentation on [extension installation](https://github.com/microsoft/vscode-docs/blob/master/api/working-with-extensions/publishing-extension.md) +5. See documentation on [extension installation](https://github.com/microsoft/vscode-docs/blob/main/api/working-with-extensions/publishing-extension.md) on ways to sideload or share. # Reporting issues If you encounter a problem and know it is caused by eclipse.jdt.ls, then please open a bug report over [there](https://github.com/eclipse/eclipse.jdt.ls/issues). In doubt, you can report issues in the [vscode-java issue tracker](https://github.com/redhat-developer/vscode-java/issues). -Try to collect as much informations as you can to describe the issue and help us reproduce the problem. Head over to the [troubleshooting page](https://github.com/redhat-developer/vscode-java/wiki/Troubleshooting#enable-logging) to see how to collect useful logging informations. +Try to collect as much information as you can to describe the issue and help us reproduce the problem. Head over to the [troubleshooting page](https://github.com/redhat-developer/vscode-java/wiki/Troubleshooting#enable-logging) to see how to collect useful logging information. ### Certificate of Origin diff --git a/Jenkinsfile b/Jenkinsfile deleted file mode 100644 index c4a000769..000000000 --- a/Jenkinsfile +++ /dev/null @@ -1,160 +0,0 @@ -#!/usr/bin/env groovy - -def installBuildRequirements(){ - def nodeHome = tool 'nodejs-14.19.1' - env.PATH="${env.PATH}:${nodeHome}/bin" - sh "npm install -g typescript" - sh 'npm install -g --force "@vscode/vsce"' - sh 'npm install -g "ovsx"' -} - -def buildVscodeExtension(){ - sh "npm install" - sh "npm run vscode:prepublish" -} - -def downloadLombokJar(){ - stage "Download lombok.jar" - sh "npx gulp download_lombok" -} - -def packageSpecificExtensions() { - stage "Package platform specific vscode-java" - def platforms = ["win32-x64", "linux-x64", "linux-arm64", "darwin-x64", "darwin-arm64"] - def embeddedJRE = 17 - for(platform in platforms){ - sh "npx gulp download_jre --target ${platform} --javaVersion ${embeddedJRE}" - sh "vsce package ${env.publishPreReleaseFlag} --target ${platform} -o java-${platform}-${env.EXTENSION_VERSION}-${env.BUILD_NUMBER}.vsix" - } -} - -def packageExtensions() { - env.publishPreReleaseFlag = "" - if (publishPreRelease.equals('true')) { - stage "replace extension version" - sh "npx gulp prepare_pre_release" - - def packageJson = readJSON file: 'package.json' - env.EXTENSION_VERSION = "${packageJson.version}" - env.publishPreReleaseFlag = "--pre-release" - - packageSpecificExtensions() - } else { - stage "package generic version" - def packageJson = readJSON file: 'package.json' - env.EXTENSION_VERSION = "${packageJson.version}" - - sh "vsce package ${env.publishPreReleaseFlag} -o java-${env.EXTENSION_VERSION}-${env.BUILD_NUMBER}.vsix" - - packageSpecificExtensions() - stash name:'platformVsix', includes:'java-win32-*.vsix,java-linux-*.vsix,java-darwin-*.vsix' - - stage 'Upload vscode-java to staging' - def artifactDir = "java-${env.EXTENSION_VERSION}-${env.BUILD_NUMBER}" - sh "mkdir ${artifactDir}" - sh "mv *.vsix ${artifactDir}" - - sh "sftp ${UPLOAD_LOCATION}/jdt.ls/staging <<< \$'mkdir ${artifactDir}\nput -r ${artifactDir}'" - // Clean up build vsix - sh "rm -rf ${artifactDir}" - unstash 'platformVsix' - } -} - -def publishExtensions() { - // Clean up embedded jre folder from previous build - sh 'npx gulp clean_jre' - - if (publishToMarketPlace.equals('true') || publishToOVSX.equals('true')) { - timeout(time:5, unit:'DAYS') { - input message:'Approve deployment?', submitter: 'fbricon,rgrunber' - } - } - - def platformVsixes = findFiles(glob: '**.vsix') - - stage "publish generic version to VS Code Marketplace" - withCredentials([[$class: 'StringBinding', credentialsId: 'vscode_java_marketplace', variable: 'TOKEN']]) { - sh 'vsce publish -p ${TOKEN}' + " ${env.publishPreReleaseFlag}" - } - - stage "publish specific version to VS Code Marketplace" - - withCredentials([[$class: 'StringBinding', credentialsId: 'vscode_java_marketplace', variable: 'TOKEN']]) { - for(platformVsix in platformVsixes){ - sh 'vsce publish -p ${TOKEN}' + " --packagePath ${platformVsix.path}" - } - } - - stage "Publish generic version to Open-VSX Marketplace" - withCredentials([[$class: 'StringBinding', credentialsId: 'open-vsx-access-token', variable: 'OVSX_TOKEN']]) { - sh 'ovsx publish -p ${OVSX_TOKEN}' + " ${env.publishPreReleaseFlag}" - } - - stage "Publish specific version to Open-VSX Marketplace" - withCredentials([[$class: 'StringBinding', credentialsId: 'open-vsx-access-token', variable: 'OVSX_TOKEN']]) { - for(platformVsix in platformVsixes){ - sh 'ovsx publish -p ${OVSX_TOKEN}' + " --packagePath ${platformVsix.path}" - } - } - - if (publishToMarketPlace.equals('true') || publishToOVSX.equals('true')) { - stage "Publish to http://download.jboss.org/jbosstools/static/jdt.ls/stable/" - def artifactDir = "java-${env.EXTENSION_VERSION}" - sh "mkdir ${artifactDir}" - sh "mv *.vsix ${artifactDir}" - - archive includes:"${artifactDir}/**/*.*" - - // copy this stable build to Akamai-mirrored /static/ URL, so staging can be cleaned out more easily - sh "sftp ${UPLOAD_LOCATION}/static/jdt.ls/stable/ <<< \$'mkdir ${artifactDir}\nput -r ${artifactDir}'" - } -} - -node('rhel8'){ - stage 'Build JDT LS' - - env.JAVA_HOME="${tool 'openjdk-17'}" - env.PATH="${env.JAVA_HOME}/bin:${env.PATH}" - sh 'java -version' - - git url: 'https://github.com/eclipse/eclipse.jdt.ls.git' - sh "./mvnw clean verify -B -U -e -Pserver-distro -Dtycho.disableP2Mirrors=true -DskipTests -P!jboss-maven-repos,!redhat-ga-repository,!redhat-ea-repository" - - def files = findFiles(glob: '**/org.eclipse.jdt.ls.product/distro/**.tar.gz') - stash name: 'server_distro', includes :files[0].path -} - -node('rhel8'){ - env.JAVA_HOME="${tool 'openjdk-17'}" - env.PATH="${env.JAVA_HOME}/bin:${env.PATH}" - stage 'Checkout vscode-java code' - deleteDir() - git url: 'https://github.com/redhat-developer/vscode-java.git' - - stage 'install vscode-java build requirements' - installBuildRequirements() - - stage 'Build vscode-java' - buildVscodeExtension() - unstash 'server_distro' - def files = findFiles(glob: '**/org.eclipse.jdt.ls.product/distro/**.tar.gz') - sh "rm -rf ./out" - sh "mkdir ./server" - sh "tar -xvzf ${files[0].path} -C ./server" - - stage 'Test vscode-java for staging' - wrap([$class: 'Xvnc']) { - sh "npm run compile" //compile the test code too - env.SKIP_COMMANDS_TEST="true" - sh "npm test --silent" - } - - downloadLombokJar() - - packageExtensions() - - if (publishPreRelease.equals('true') || publishToMarketPlace.equals('true') || publishToOVSX.equals('true')) { - publishExtensions() - } -} diff --git a/README.md b/README.md index 61614e16c..488ac8885 100644 --- a/README.md +++ b/README.md @@ -4,8 +4,8 @@ Language support for Java ™ for Visual Studio Code [![Visual Studio Marketplace](https://img.shields.io/visual-studio-marketplace/v/redhat.java?style=for-the-badge&label=VS%20Marketplace&logo=visual-studio-code)](https://marketplace.visualstudio.com/items?itemName=redhat.java) [![Installs](https://img.shields.io/visual-studio-marketplace/i/redhat.java?style=for-the-badge)](https://marketplace.visualstudio.com/items?itemName=redhat.java) [![Join the chat at https://gitter.im/redhat-developer/vscode-java](https://img.shields.io/gitter/room/redhat-developer/vscode-java?style=for-the-badge&logo=gitter)](https://gitter.im/redhat-developer/vscode-java) -[![Build Status](https://img.shields.io/github/actions/workflow/status/redhat-developer/vscode-java/pr-verify.yml?branch=master&style=for-the-badge&logo=github)](https://github.com/redhat-developer/vscode-java/actions?query=workflow:pr-verify) -[![License](https://img.shields.io/github/license/redhat-developer/vscode-java?style=for-the-badge&logo=eclipse)](https://github.com/redhat-developer/vscode-java/blob/master/LICENSE) +[![Build Status](https://img.shields.io/github/actions/workflow/status/redhat-developer/vscode-java/pr-verify.yml?branch=main&style=for-the-badge&logo=github)](https://github.com/redhat-developer/vscode-java/actions?query=workflow:pr-verify) +[![License](https://img.shields.io/github/license/redhat-developer/vscode-java?style=for-the-badge&logo=eclipse)](https://github.com/redhat-developer/vscode-java/blob/main/LICENSE) Provides Java ™ language support via [Eclipse ™ JDT Language Server](https://github.com/eclipse/eclipse.jdt.ls), which utilizes @@ -14,17 +14,17 @@ Provides Java ™ language support via Quick Start ============ 1. Install the Extension -2. On the following platforms, the extension should activate without any setup : `win32-x64`, `darwin-x64`, `darwin-arm64`, `linux-x64`, `linux-arm64`.\ -If on another platform, or using the "universal" version, you can [set](#setting-the-jdk) a _Java_ Development Kit. It must be Java 17 or above. -3. Optionally, download and install a Java Development Kit for your project (Java 1.5 or above is supported). See [Project JDKs](#project-jdks) for more details +2. On the following platforms, the extension should activate without any setup : `win32-x64`, `win32-arm64`, `darwin-x64`, `darwin-arm64`, `linux-x64`, `linux-arm64`.\ +If on another platform, or using the "universal" version, you can [set](#setting-the-jdk) a _Java_ Development Kit. It must be Java 21 or above. +3. Optionally, download and install a Java Development Kit for your project (Java 1.8 or above is supported). See [Project JDKs](#project-jdks) for more details 4. Extension is activated when you first access a Java file * Recognizes projects with *Maven* or *Gradle* build files in the directory hierarchy. Features ========= -![ screencast ](https://raw.githubusercontent.com/redhat-developer/vscode-java/master/images/vscode-java.0.0.1.gif) +![ screencast ](https://raw.githubusercontent.com/redhat-developer/vscode-java/main/images/vscode-java.0.0.1.gif) -* Supports code from Java 1.5 to Java 19 +* Supports code from Java 1.8 to Java 26 * Maven pom.xml project support * Gradle project support (with experimental Android project import support) * Standalone Java files support @@ -48,6 +48,7 @@ Features * Diagnostic tags * Call Hierarchy * Type Hierarchy +* Inlay Hints To launch and debug your Java programs, it's recommended you install *[Java Debug Extension for Visual Studio Code](https://marketplace.visualstudio.com/items?itemName=vscjava.vscode-java-debug)*. @@ -56,11 +57,11 @@ See the [changelog](CHANGELOG.md) for the latest release. You might also find us Setting the JDK =============== ## Java Tooling JDK -Now that Java extension will publish platform specific versions, it will embed a JRE for supported platforms such as `win32-x64`, `linux-x64`, `linux-arm64`, `darwin-x64`, `darwin-arm64`. The embedded JRE is used to launch the Language Server for Java. Users are only responsible for configuring [Project JDKs](#project-jdks) to compile your Java projects. +Now that Java extension will publish platform specific versions, it will embed a JRE for supported platforms such as `win32-x64`, `win32-arm64`, `linux-x64`, `linux-arm64`, `darwin-x64`, `darwin-arm64`. The embedded JRE is used to launch the Language Server for Java. Users are only responsible for configuring [Project JDKs](#project-jdks) to compile your Java projects. The following part is only kept for the universal version without embedded JRE. ->The tooling JDK will be used to launch the Language Server for Java. And by default, will also be used to compile your projects. Java 17 is the minimum required version.\ +>The tooling JDK will be used to launch the Language Server for Java. And by default, will also be used to compile your projects. Java 21 is the minimum required version.\ \ The path to the Java Development Kit can be specified by the `java.jdt.ls.java.home` setting in VS Code settings (workspace/user settings). If not specified, it is searched in the following order until a JDK meets current minimum requirement. >- the `JDK_HOME` environment variable @@ -81,8 +82,14 @@ If you need to compile your projects against a different JDK version, it's recom "path": "/path/to/jdk-11", }, { - "name": "JavaSE-19", - "path": "/path/to/jdk-19", + "name": "JavaSE-25", + "path": "/path/to/jdk-25", + "default": true + }, + , + { + "name": "JavaSE-26", + "path": "/path/to/jdk-26", "default": true }, ] @@ -108,6 +115,7 @@ The following commands are available: - `Java: List All Java Source Paths`: lists all the Java source paths recognized by the Java Language Server workspace. - `Java: Show Build Job Status`: shows the Java Language Server job status in Visual Studio Code terminal. - `Java: Go to Super Implementation`: goes to the super implementation for the current selected symbol in editor. +- `Java: Restart Java Language Server`: restarts the Java language server. Supported VS Code settings ========================== @@ -122,7 +130,8 @@ The following settings are supported: * `java.configuration.maven.userSettings` : Path to Maven's user settings.xml. * `java.configuration.checkProjectSettingsExclusions`: **Deprecated, please use 'java.import.generatesMetadataFilesAtProjectRoot' to control whether to generate the project metadata files at the project root. And use 'files.exclude' to control whether to hide the project metadata files from the file explorer.** Controls whether to exclude extension-generated project settings files (`.project`, `.classpath`, `.factorypath`, `.settings/`) from the file explorer. Defaults to `false`. * `java.referencesCodeLens.enabled` : Enable/disable the references code lenses. -* `java.implementationsCodeLens.enabled` : Enable/disable the implementations code lenses. +* `java.referencesCodeLens.includeFields` : Enable/disable the references code lens for fields. +* `java.implementationCodeLens` : Enable/disable the implementations code lens for the provided categories. * `java.signatureHelp.enabled` : Enable/disable signature help support (triggered on `(`). * `java.signatureHelp.description.enabled` : Enable/disable to show the description in signature help. Defaults to `false`. * `java.contentProvider.preferred` : Preferred content provider (see 3rd party decompilers available in [vscode-java-decompiler](https://github.com/dgileadi/vscode-java-decompiler)). @@ -140,11 +149,14 @@ The following settings are supported: * `java.autobuild.enabled` : Enable/disable the 'auto build'. * `java.maxConcurrentBuilds`: Set max simultaneous project builds. * `java.completion.enabled` : Enable/disable code completion support. -* `java.completion.guessMethodArguments` : When set to true, method arguments are guessed when a method is selected from as list of code assist proposals. +* `java.completion.guessMethodArguments` : Specify how the arguments will be filled during completion. Defaults to `auto`. + - `auto`: Use `off` only when using Visual Studio Code - Insiders, other platform will defaults to `insertBestGuessedArguments`. + - `off`: Method arguments will not be inserted during completion. + - `insertParameterNames`: The parameter names will be inserted during completion. + - `insertBestGuessedArguments`: The best guessed arguments will be inserted during completion according to the code context. * `java.completion.filteredTypes`: Defines the type filters. All types whose fully qualified name matches the selected filter strings will be ignored in content assist or quick fix proposals and when organizing imports. For example 'java.awt.*' will hide all types from the awt packages. * `java.completion.favoriteStaticMembers` : Defines a list of static members or types with static members. * `java.completion.importOrder` : Defines the sorting order of import statements. -* `java.progressReports.enabled` : [Experimental] Enable/disable progress reports from background processes on the server. * `java.format.enabled` : Enable/disable the default Java formatter. * `java.format.settings.url` : Specifies the url or file path to the [Eclipse formatter xml settings](https://github.com/redhat-developer/vscode-java/wiki/Formatter-settings). * `java.format.settings.profile` : Optional formatter profile name from the Eclipse formatter settings. @@ -157,6 +169,7 @@ The following settings are supported: * `java.codeGeneration.hashCodeEquals.useJava7Objects`: Use Objects.hash and Objects.equals when generating the hashCode and equals methods. This setting only applies to Java 7 and higher. Defaults to `false`. * `java.codeGeneration.useBlocks`: Use blocks in 'if' statements when generating the methods. Defaults to `false`. * `java.codeGeneration.generateComments`: Generate method comments when generating the methods. Defaults to `false`. +* `java.codeGeneration.generateCommentsInMarkdown`: Generate Javadoc comments in Markdown style when generating methods, constructors, and types. Requires source compliance >= 23. Defaults to false. * `java.codeGeneration.toString.template`: The template for generating the toString method. Defaults to `${object.className} [${member.name()}=${member.value}, ${otherMembers}]`. * `java.codeGeneration.toString.codeStyle`: The code style for generating the toString method. Defaults to `STRING_CONCATENATION`. * `java.codeGeneration.toString.skipNullValues`: Skip null values when generating the toString method. Defaults to `false`. @@ -170,27 +183,33 @@ The following settings are supported: > For backward compatibility, this setting also accepts boolean value, where `true` has the same meaning as `notification` and `false` has the same meaning as `off`. * `java.project.outputPath`: A relative path to the workspace where stores the compiled output. `Only` effective in the `WORKSPACE` scope. The setting will `NOT` affect Maven or Gradle project. * `java.project.referencedLibraries`: Configure glob patterns for referencing local libraries to a Java project. -* `java.completion.maxResults`: Maximum number of completion results (not including snippets). `0` (the default value) disables the limit, all results are returned. In case of performance problems, consider setting a sensible limit.. +* `java.completion.maxResults`: Maximum number of completion results (not including snippets). `0` (the default value) disables the limit, all results are returned. In case of performance problems, consider setting a sensible limit. * `java.configuration.runtimes`: Map Java Execution Environments to local JDKs. * `java.server.launchMode`: - - `Standard`: Provides full features such as intellisense, refactoring, building, Maven/Gradle support etc... + - `Standard`: Provides full features such as intellisense, refactoring, building, Maven/Gradle support etc. - `LightWeight`: Starts a syntax server with lower start-up cost. Only provides syntax features such as outline, navigation, javadoc, syntax errors. The lightweight mode won't load thirdparty extensions, such as java test runner, java debugger, etc. - `Hybrid`: Provides full features with better responsiveness. It starts a standard language server and a secondary syntax server. The syntax server provides syntax features until the standard server is ready. And the syntax server will be shutdown automatically after the standard server is fully ready. Default launch mode is `Hybrid`. Legacy mode is `Standard` * `java.sources.organizeImports.starThreshold`: Specifies the number of imports added before a star-import declaration is used, default is 99. * `java.sources.organizeImports.staticStarThreshold`: Specifies the number of static imports added before a star-import declaration is used, default is 99. +* `java.updateImportsOnPaste.enabled` : Enable/disable auto organize imports when pasting code. Defaults to `true`. * `java.imports.gradle.wrapper.checksums`: Defines allowed/disallowed SHA-256 checksums of Gradle Wrappers. * `java.project.importOnFirstTimeStartup`: Specifies whether to import the Java projects, when opening the folder in Hybrid mode for the first time. Supported values are `disabled` (never imports), `interactive` (asks to import or not), `automatic` (always imports). Default to `automatic`. * `java.project.importHint`: Enable/disable the server-mode switch information, when Java projects import is skipped on startup. Defaults to `true`. * `java.import.gradle.java.home`: Specifies the location to the JVM used to run the Gradle daemon. * `java.project.resourceFilters`: Excludes files and folders from being refreshed by the Java Language Server, which can improve the overall performance. For example, ["node_modules","\.git"] will exclude all files and folders named 'node_modules' or '.git'. Pattern expressions must be compatible with `java.util.regex.Pattern`. Defaults to ["node_modules","\.git"]. * `java.templates.fileHeader`: Specifies the file header comment for new Java file. Supports configuring multi-line comments with an array of strings, and using ${variable} to reference the [predefined variables](https://github.com/redhat-developer/vscode-java/wiki/Predefined-Variables-for-Java-Template-Snippets). +* `java.templates.methodBody`: Specifies the method body snippet for unimplemented methods (e.g. generated by "Add unimplemented methods"). Supports configuring multi-line content with an array of strings, and using ${variable} to reference the [predefined variables](https://github.com/redhat-developer/vscode-java/wiki/Predefined-Variables-for-Java-Template-Snippets). +* `java.templates.preferPackagePrivateVisibility`: Specifies whether newly created top-level types (class/interface/enum/record) should be package-private instead of public. Defaults to `false`. +* `java.templates.methodBodySuper`: Specifies the method body snippet for overridden methods that call `super` (e.g. generated by "Override/Implement Methods"). Supports configuring multi-line content with an array of strings, and using ${variable} to reference the [predefined variables](https://github.com/redhat-developer/vscode-java/wiki/Predefined-Variables-for-Java-Template-Snippets). +* `java.templates.catchBody`: Specifies the catch block body snippet (e.g. generated by "Surround with try/catch"). Supports configuring multi-line content with an array of strings, and using ${variable} to reference the [predefined variables](https://github.com/redhat-developer/vscode-java/wiki/Predefined-Variables-for-Java-Template-Snippets). * `java.templates.typeComment`: Specifies the type comment for new Java type. Supports configuring multi-line comments with an array of strings, and using ${variable} to reference the [predefined variables](https://github.com/redhat-developer/vscode-java/wiki/Predefined-Variables-for-Java-Template-Snippets). +* `java.templates.newFile.enabled` : Enable/disable automatic generation of class body and package declaration when creating a new Java file. Set to `false` to create empty Java files. Defaults to `true`. * `java.references.includeAccessors`: Include getter, setter and builder/constructor when finding references. Default to true. * `java.configuration.maven.globalSettings` : Path to Maven's global settings.xml. +* `java.configuration.maven.lifecycleMappings` : Path to Maven's lifecycle mappings xml. * `java.eclipse.downloadSources` : Enable/disable download of Maven source artifacts for Eclipse projects. -* `java.recommendations.dependency.analytics.show` : Show the recommended Dependency Analytics extension. * `java.references.includeDecompiledSources` : Include the decompiled sources when finding references. Default to true. * `java.project.sourcePaths`: Relative paths to the workspace where stores the source files. `Only` effective in the `WORKSPACE` scope. The setting will `NOT` affect Maven or Gradle project. * `java.typeHierarchy.lazyLoad`: Enable/disable lazy loading the content in type hierarchy. Lazy loading could save a lot of loading time but every type should be expanded manually to load its content. @@ -198,33 +217,71 @@ The following settings are supported: - `afterCursor`: Insert the generated code after the member where the cursor is located. - `beforeCursor`: Insert the generated code before the member where the cursor is located. - `lastMember`: Insert the generated code as the last member of the target type. +* `java.codeGeneration.addFinalForNewDeclaration`: Whether to generate the 'final' modifer for code actions that create new declarations. Defaults to `none`. + - `none`: Do not generate final modifier + - `fields`: Generate 'final' modifier only for new field declarations + - `variables`: Generate 'final' modifier only for new variable declarations + - `all`: Generate 'final' modifier for all new declarations * `java.settings.url` : Specifies the url or file path to the workspace Java settings. See [Setting Global Preferences](https://github.com/redhat-developer/vscode-java/wiki/Settings-Global-Preferences) * `java.symbols.includeSourceMethodDeclarations` : Include method declarations from source files in symbol search. Defaults to `false`. +* `java.symbols.includeGeneratedCode` : Include generated code (e.g. Lombok getters, setters, constructors) in document outline/symbols. Defaults to `false`. * `java.quickfix.showAt` : Show quickfixes at the problem or line level. * `java.configuration.workspaceCacheLimit` : The number of days (if enabled) to keep unused workspace cache data. Beyond this limit, cached workspace data may be removed. * `java.import.generatesMetadataFilesAtProjectRoot` : Specify whether the project metadata files(.project, .classpath, .factorypath, .settings/) will be generated at the project root. Defaults to `false`. * `java.inlayHints.parameterNames.enabled`: Enable/disable inlay hints for parameter names. Supported values are: `none`(disable parameter name hints), `literals`(Enable parameter name hints only for literal arguments) and `all`(Enable parameter name hints for literal and non-literal arguments). Defaults to `literals`. +* `java.inlayHints.parameterTypes.enabled`: Enable/disable inlay hints for (lambda) parameter types. Defaults to `false`. * `java.compile.nullAnalysis.nonnull`: Specify the Nonnull annotation types to be used for null analysis. If more than one annotation is specified, then the topmost annotation will be used first if it exists in your project dependencies. This setting will be ignored if `java.compile.nullAnalysis.mode` is set to `disabled`. * `java.compile.nullAnalysis.nullable`: Specify the Nullable annotation types to be used for null analysis. If more than one annotation is specified, then the topmost annotation will be used first if it exists in your project dependencies. This setting will be ignored if `java.compile.nullAnalysis.mode` is set to `disabled`. +* `java.compile.nullAnalysis.nonnullbydefault`: Specify the NonNullByDefault annotation types to be used for null analysis. If more than one annotation is specified, then the topmost annotation will be used first if it exists in your project dependencies. This setting will be ignored if `java.compile.nullAnalysis.mode` is set to `disabled`. * `java.import.maven.offline.enabled`: Enable/disable the Maven offline mode. Defaults to `false`. * `java.codeAction.sortMembers.avoidVolatileChanges`: Reordering of fields, enum constants, and initializers can result in semantic and runtime changes due to different initialization and persistence order. This setting prevents this from occurring. Defaults to `true`. * `java.jdt.ls.protobufSupport.enabled`: Specify whether to automatically add Protobuf output source directories to the classpath. **Note:** Only works for Gradle `com.google.protobuf` plugin `0.8.4` or higher. Defaults to `true`. +* `java.jdt.ls.aspectjSupport.enabled`: Specify whether to enable `io.freefair.aspectj` plugin in Gradle projects. Defaults to `false`. * `java.jdt.ls.androidSupport.enabled`: [Experimental] Specify whether to enable Android project importing. When set to `auto`, the Android support will be enabled in Visual Studio Code - Insiders. **Note:** Only works for Android Gradle Plugin `3.2.0` or higher. Defaults to `auto`. +* `java.jdt.ls.kotlinSupport.enabled`: [Experimental] Specify whether to enable `org.jetbrains.kotlin.jvm` plugin in Gradle projects. Defaults to `true`. +* `java.jdt.ls.groovySupport.enabled`: [Experimental] Specify whether to enable `groovy` plugin in Gradle projects. Defaults to `true`. +* `java.jdt.ls.scalaSupport.enabled`: [Experimental] Specify whether to enable `scala` plugin in Gradle projects. Defaults to `true`. * `java.completion.postfix.enabled`: Enable/disable postfix completion support. Defaults to `true`. +* `java.completion.chain.enabled`: Enable/disable chain completion support. Defaults to `false`. +* `java.completion.matchCase`: Specify whether to match case for code completion. Defaults to `firstLetter`. * `java.compile.nullAnalysis.mode`: Specify how to enable the annotation-based null analysis. Supported values are `disabled` (disable the null analysis), `interactive` (asks when null annotation types are detected), `automatic` (automatically enable null analysis when null annotation types are detected). Defaults to `interactive`. -* `java.cleanup.actionsOnSave`: The list of clean ups to be run on the current document when it's saved. Clean ups can automatically fix code style or programming mistakes. [Click here](document/_java.learnMoreAboutCleanUps.md#java-clean-ups) to learn more about what each clean up does. +* `java.cleanup.actionsOnSave`: **Deprecated, please use 'java.cleanup.actions' instead.** The list of clean ups to be run on the current document when it's saved. Clean ups can automatically fix code style or programming mistakes. [Click here](document/_java.learnMoreAboutCleanUps.md#java-clean-ups) to learn more about what each clean up does. +* `java.cleanup.actions`: The list of clean ups to be run on the current document when it's saved or when the cleanup command is issued. Clean ups can automatically fix code style or programming mistakes. [Click here](document/_java.learnMoreAboutCleanUps.md#java-clean-ups) to learn more about what each clean up does. +* `java.saveActions.cleanup`: Enable/disable cleanup actions on save. * `java.import.gradle.annotationProcessing.enabled`: Enable/disable the annotation processing on Gradle projects and delegate to JDT APT. Only works for Gradle 5.2 or higher. * `java.sharedIndexes.enabled`: [Experimental] Specify whether to share indexes between different workspaces. Defaults to `auto` and the shared indexes is automatically enabled in Visual Studio Code - Insiders. - auto - on - off -* `java.sharedIndexes.location`: Specifies a common index location for all workspaces. See default values as follows: +* `java.sharedIndexes.location`: Specifies a common index location for all workspaces. See default values as follows: - Windows: First use `"$APPDATA\\.jdt\\index"`, or `"~\\.jdt\\index"` if it does not exist - macOS: `"~/Library/Caches/.jdt/index"` - Linux: First use `"$XDG_CACHE_HOME/.jdt/index"`, or `"~/.cache/.jdt/index"` if it does not exist * `java.refactoring.extract.interface.replace`: Specify whether to replace all the occurrences of the subtype with the new extracted interface. Defaults to `true`. * `java.import.maven.disableTestClasspathFlag` : Enable/disable test classpath segregation. When enabled, this permits the usage of test resources within a Maven project as dependencies within the compile scope of other projects. Defaults to `false`. * `java.configuration.maven.defaultMojoExecutionAction` : Specifies default mojo execution action when no associated metadata can be detected. Defaults to `ignore`. +* `java.completion.lazyResolveTextEdit.enabled`: [Experimental] Enable/disable lazily resolving text edits for code completion. Defaults to `true`. +* `java.edit.validateAllOpenBuffersOnChanges`: Specifies whether to recheck all open Java files for diagnostics when editing a Java file. Defaults to `false`. +* `java.editor.reloadChangedSources`: Specifies whether to reload the sources of the open class files when their source jar files are changed. Defaults to `ask`. + - `ask`: Ask to reload the sources of the open class files + - `auto`: Automatically reload the sources of the open class files + - `manual`: Manually reload the sources of the open class files +* `java.edit.smartSemicolonDetection.enabled`: Defines the `smart semicolon` detection. Defaults to `false`. +* `java.configuration.detectJdksAtStart`: Automatically detect JDKs installed on local machine at startup. If you have specified the same JDK version in `java.configuration.runtimes`, the extension will use that version first. Defaults to `true`. +* `java.completion.collapseCompletionItems`: Enable/disable the collapse of overloaded methods in completion items. Overrides `java.completion.guessMethodArguments`. Defaults to `false`. +* `java.diagnostic.filter`: Specifies a list of file patterns for which matching documents should not have their diagnostics reported (eg. '\*\*/Foo.java'). +* `java.search.scope`: Specifies the scope which must be used for search operation like + - Find Reference + - Call Hierarchy + - Workspace Symbols +* `java.jdt.ls.javac.enabled`: [Experimental] Specify whether to enable Javac-based compilation in the language server. Requires running this extension with Java 24. Defaults to `off`. +* `java.completion.engine`: [Experimental] Select code completion engine. Defaults to `ecj`. +* `java.references.includeDeclarations`: Include declarations when finding references. Defaults to `true` +* `java.jdt.ls.appcds.enabled` : [Experimental] Enable Java AppCDS (Application Class Data Sharing) for improvements to extension activation. When set to `auto`, AppCDS will be enabled in Visual Studio Code - Insiders, and for pre-release versions. +* `java.hover.javadoc.enabled` : Enable/disable displaying Javadoc on hover. Defaults to `true`. + +New in 1.54.0 +* `java.inlayHints.formatParameters.enabled`: Enable/disable inlay hints for format specifiers in format strings (e.g. `String.format()`, `String.formatted()`, `PrintStream.printf()`). Shows which argument corresponds to each format specifier. Defaults to `false`. Semantic Highlighting =============== @@ -236,7 +293,7 @@ Troubleshooting It should show ready (thumbs up) as on the image below. You can click on the status and open the language tool logs for further information in case of a failure. -![ status indicator ](https://raw.githubusercontent.com/redhat-developer/vscode-java/master/images/statusMarker.png) +![ status indicator ](https://raw.githubusercontent.com/redhat-developer/vscode-java/main/images/statusMarker.png) 2. Read the [troubleshooting guide](https://github.com/redhat-developer/vscode-java/wiki/Troubleshooting) for collecting informations about issues you might encounter. @@ -251,7 +308,7 @@ For information on getting started, refer to the [CONTRIBUTING instructions](CON Continuous Integration builds can be installed from [http://download.jboss.org/jbosstools/jdt.ls/staging/](http://download.jboss.org/jbosstools/jdt.ls/staging/?C=M;O=D). Download the most recent `java-.vsix` file and install it by following the instructions [here](https://code.visualstudio.com/docs/editor/extension-gallery#_install-from-a-vsix). Stable releases are archived under http://download.jboss.org/jbosstools/static/jdt.ls/stable/. -Also, you can contribute your own VSCode extension to enhance the existing features by following the instructions [here](https://github.com/redhat-developer/vscode-java/wiki/Contribute-a-Java-Extension). +Also, you can contribute your own VS Code extension to enhance the existing features by following the instructions [here](https://github.com/redhat-developer/vscode-java/wiki/Contribute-a-Java-Extension). Feedback =============== diff --git a/USAGE_DATA.md b/USAGE_DATA.md new file mode 100644 index 000000000..c977296de --- /dev/null +++ b/USAGE_DATA.md @@ -0,0 +1,38 @@ +# Data collection + +vscode-java has opt-in telemetry collection, provided by [vscode-redhat-telemetry](https://github.com/redhat-developer/vscode-redhat-telemetry). + +## What's included in the vscode-java telemetry data + + * vscode-java emits telemetry events when the extension starts and stops, + which contain the common data mentioned on the + [vscode-redhat-telemetry page](https://github.com/redhat-developer/vscode-redhat-telemetry/blob/main/USAGE_DATA.md#common-data). + * The name of the build tool used to import a project (eg. Maven, Gradle, Invisible (project), etc.) + * The total number of Java projects within the workspace + * The lowest and highest Java compiler source level used (eg. 11 & 17) + * Whether the project(s) are being imported for the first time (eg. true) + * The elapsed time (in milliseconds) at which the language server initialized the workspace project(s), declared as ready for requests, and completed building the project(s) + * The number of libraries that were indexed after project initialization + * The total size (in bytes) of libraries that were indexed after project initialization + * The number of error markers on the project(s) + * The number of unresolved imports within the project(s) + * Errors relating to running the language server, such as the message & stacktrace + * Whether there is a mismatch between the project's requested source level, and the JDK used for the project (eg. true) + * Information about the following settings. In the case of settings that store a well defined value (eg. path/url/string), we simply collect whether the setting has been set. + * `java.settings.url`, `java.format.settings.url`, `java.quickfix.showAt`, `java.symbols.includeSourceMethodDeclarations`, `java.completion.collapseCompletionItems`, `java.completion.guessMethodArguments`, `java.completion.postfix.enabled`, `java.cleanup.actionsOnSave`, `java.sharedIndexes.enabled`, `java.inlayHints.parameterNames.enabled`, `java.inlayHints.parameterNames.suppressWhenSameNameNumbered`, `java.inlayHints.variableTypes.enabled`, `java.inlayHints.parameterTypes.enabled`, `java.server.launchMode`, `java.autobuild.enabled`, `java.jdt.ls.javac.enabled` + * The extension name and the choice made when a recommendation to install a 3rd party extension is proposed + * The name of Java commands being manually executed, and any resulting errors + * The number of results (eg. 20), whether an error occurred (eg. false), engine type (eg. 'ecj', 'dom') and duration (in milliseconds) when code assist is activated + * Whether the language server ran out of memory and the maximum allocated memory at which that occurred (eg. 200m) + +## What's included in the general telemetry data + +Please see the +[vscode-redhat-telemetry data collection information](https://github.com/redhat-developer/vscode-redhat-telemetry/blob/HEAD/USAGE_DATA.md#usage-data-being-collected-by-red-hat-extensions) +for information on what data it collects. + +## How to opt in or out + +Use the `redhat.telemetry.enabled` setting in order to enable or disable telemetry collection. + +This extension also abides by Visual Studio Code's telemetry level: if `telemetry.telemetryLevel` is set to `off`, then no telemetry events will be sent to Red Hat, even if `redhat.telemetry.enabled` is set to `true`. If `telemetry.telemetryLevel` is set to `error` or `crash`, only events containing an error or errors property will be sent to Red Hat. diff --git a/changes b/changes new file mode 100644 index 000000000..92b7e65b1 --- /dev/null +++ b/changes @@ -0,0 +1,7 @@ +Fetching issues from https://api.github.com/repos/redhat-developer/vscode-java/issues?state=closed&milestone=154&page=1 + * enhancement - Fix #3210: map decorator token to annotation scope. See [#4421](https://github.com/redhat-developer/vscode-java/pull/4421). + * enhancement - Add feature: copy fully qualified name . See [#374](https://github.com/redhat-developer/vscode-java/issues/374). + * bug fix - Sanitize existing command links from hover Javadocs. See [#4429](https://github.com/redhat-developer/vscode-java/pull/4429). + * bug fix - Maven project 5 folders deap are not loaded as java projects. See [#4364](https://github.com/redhat-developer/vscode-java/issues/4364). + * bug fix - Very long Javadoc is truncated on hover. See [#4219](https://github.com/redhat-developer/vscode-java/issues/4219). + * bug fix - Failed to initialize language server due to "Internal error. Caused by: NPE: Cannot invoke 'o.e.m.c.e.IMaven.getSettings()' because the return value of 'o.e.m.c.MavenPlugin.getMaven()' is null". See [#3469](https://github.com/redhat-developer/vscode-java/issues/3469). diff --git a/document/_java.learnMoreAboutCleanUps.md b/document/_java.learnMoreAboutCleanUps.md index 1989449cb..635eaaf04 100644 --- a/document/_java.learnMoreAboutCleanUps.md +++ b/document/_java.learnMoreAboutCleanUps.md @@ -16,7 +16,7 @@ For instance: ```java private int value; -public void getValue() { +public int getValue() { return value; } ``` @@ -26,7 +26,7 @@ becomes: ```java private int value; -public void getValue() { +public int getValue() { return this.value; } ``` @@ -220,7 +220,7 @@ if (object instanceof Integer i) { ``` -### `lambdaExpression` +### `lambdaExpressionFromAnonymousClass` Convert anonymous class declarations for functional interfaces to lambda expressions wherever possible. It is only applicable for Java level 8 or above. @@ -297,4 +297,289 @@ final FileInputStream inputStream = new FileInputStream("out.txt"); try (inputStream) { System.out.println(inputStream.read()); } -``` \ No newline at end of file +``` + +### `lambdaExpression` + +Cleans up lambda expression wherever possible in the following ways: + +1. Removes unnecessary parentheses. + + For example: + + ```java + (someString) -> someString.trim().toLowerCase(); + ``` + + becomes: + + ```java + someString -> someString.trim().toLowerCase(); + ``` + +2. Converts lambda expression blocks to a single statement when possible. + + For example: + + ```java + someString -> {return someString.trim().toLowerCase();}; + ``` + + becomes: + + ```java + someString -> someString.trim().toLowerCase(); + ``` + +3. Converts lambda expression to method reference. + + For example: + + ```java + () -> new ArrayList<>(); + ``` + + becomes: + + ```java + ArrayList::new; + ``` + +### `organizeImports` + +Performs the "Organize Imports" operation. + +**Note** : Since clean ups are meant to be applied without user feedback (eg. prompts about ambiguous types), this may leave some types unresolved. To properly resolve these ambiguous types, one can do so manually (code actions, source actions), or by calling "Organize Imports" through the command palette / key binding (shift + alt + o). + +For example: + +```java +package test1; +public class A { + public void test() { + List a1; + Iterator a2; + Map a3; + Set a4; + JarFile a5; + StringTokenizer a6; + Path a7; + URI a8; + HttpURLConnection a9; + InputStream a10; + Field a11; + Parser a12; + } +} +``` + +becomes: + +```java +package test1; + +import java.io.InputStream; +import java.net.HttpURLConnection; +import java.net.URI; +import java.nio.file.Path; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.StringTokenizer; +import java.util.jar.JarFile; + +public class A { + public void test() { + List a1; + Iterator a2; + Map a3; + Set a4; + JarFile a5; + StringTokenizer a6; + Path a7; + URI a8; + HttpURLConnection a9; + InputStream a10; + Field a11; + Parser a12; + } +} +``` + +### `renameUnusedLocalVariables` + +Rename unused loop variables, try-with-resource variables, catch parameters, lambda parameters, pattern variables to `_`. + +For example: + +```java +J j = (a, b) -> System.out.println(a); + +switch (r) { + case R(_, long l) -> {} + case R r2 -> {} +} +``` + +becomes: + +```java +J j = (a, _) -> System.out.println(a); + +switch (r) { + case R(_, _) -> {} + case R _ -> {} +} +``` + +### `useSwitchForInstanceofPattern` + +Convert if/else chains to pattern matching switch statements. + +For example: + +```java +int i, j; +double d; +boolean b; +if (x instanceof Integer xint) { + i = xint.intValue(); +} else if (x instanceof Double xdouble) { + d = xdouble.doubleValue(); +} else if (x instanceof Boolean xboolean) { + b = xboolean.booleanValue(); +} else { + i = 0; + d = 0.0D; + b = false; +} +``` + +becomes: + +```java +int i, j; +double d; +boolean b; +switch (x) { + case Integer xint -> i = xint.intValue(); + case Double xdouble -> d = xdouble.doubleValue(); + case Boolean xboolean -> b = xboolean.booleanValue(); + case null, default -> { + i = 0; + d = 0.0D; + b = false; + } +} +``` + +### `redundantComparisonStatement` + +Remove redundant comparison statement. + +For example: + +```java +if (i != 123) { + return i; +} else { + return 123; +} +``` + +becomes: + +```java +return i; +``` + +### `redundantFallingThroughBlockEnd` + +Remove redundant end of block with jump statement. + +For example: + +```java +if (0 < i) { + System.out.println("Doing something"); + return i + 10; +} +return i + 10; +``` + +becomes: + +```java +if (0 < i) { + System.out.println("Doing something"); +} +return i + 10; +``` + +### `redundantIfCondition` + +Remove redundant if condition. + +For example: + +```java +if (isValid) { + return 0; +} else if (!isValid) { + return -1; +} +``` + +becomes: + +```java +if (isValid) { + return 0; +} else { + return -1; +} +``` + +### `redundantModifiers` + +Remove redundant modifiers. + +For example: + +```java +public abstract interface IFoo { + public static final int MAGIC_NUMBER = 646; + public abstract int foo (); + public int bar (int bazz); +} +``` + +becomes: + +```java +public interface IFoo { + int MAGIC_NUMBER = 646; + int foo (); + int bar (int bazz); +} +``` + +### `redundantSuperCall` + +Remove redundant `super()` class in constructor. + +For example: + +```java +MyClass() { + super(); +} +``` + +becomes: + +```java +MyClass() { +} +``` diff --git a/document/_java.learnMoreAboutRefactorings.md b/document/_java.learnMoreAboutRefactorings.md index eec0591ee..e153dace4 100644 --- a/document/_java.learnMoreAboutRefactorings.md +++ b/document/_java.learnMoreAboutRefactorings.md @@ -18,7 +18,9 @@ - [Inline constant](#inline-constant) - [Inline local variable](#inline-local-variable) - [Inline method](#inline-method) -- [Introduce Parameter](#introduce-parameter) +- Method signature + - [Introduce Parameter](#introduce-parameter) + - [Change method signature](#change-method-signature) - Invert boolean - [Invert conditions](#invert-conditions) - [Invert local variable](#invert-local-variable) @@ -190,7 +192,7 @@ public void order(String[] books) { Converts an anonymous class creation to the lambda expression. ### Example -Let's convert the anonymous class `Runnable(){...}` to a lamda expression. +Let's convert the anonymous class `Runnable(){...}` to a lambda expression. #### Before ```java @@ -469,6 +471,41 @@ public void addUser(String name) { } ``` +--- + +## Change Method Signature +Changes the method visibility, return type, name, and updates the parameters and exceptions. The above changes can be applied through the call hierarchy of the method. + +### Example +Let's change signature for the method `public void setAddress(String address)`. + +#### Before + +```java +public void setAddress(String address) { + this.address = address; +} + +public void setAddr() { + this.setAddress("Addr"); +} +``` + +#### Refactor configuration + +![change_signature](./refactoring_change_signature.png) +#### After +```java +public void setAddress1(Object newParam, String address) { + this.address = address; +} + +public void setAddr() { + this.setAddress1(null, "Addr"); +} +``` +--- + ## Invert conditions Inverts the boolean expression in the conditions. diff --git a/document/_java.metadataFilesGeneration.md b/document/_java.metadataFilesGeneration.md index 6ab9646db..4239b54c8 100644 --- a/document/_java.metadataFilesGeneration.md +++ b/document/_java.metadataFilesGeneration.md @@ -2,7 +2,7 @@ We use the setting `java.import.generatesMetadataFilesAtProjectRoot` to control where the project metadata files(.project, .classpath, .factorypath, .settings/) will be generated: - `true`: Metadata files will be generated at the project's root. -- `false`: Metadata files will be generated at the workspace storage. To be specifc, the path will be: `/redhat.java/jdt_ws/.metadata/.plugins/org.eclipse.core.resources/.projects//`. +- `false`: Metadata files will be generated at the workspace storage. To be specific, the path will be: `/redhat.java/jdt_ws/.metadata/.plugins/org.eclipse.core.resources/.projects//`. By default, the setting is set to `false`. diff --git a/document/_java.templateVariables.md b/document/_java.templateVariables.md index f3f78c5d0..2b4f0fcec 100644 --- a/document/_java.templateVariables.md +++ b/document/_java.templateVariables.md @@ -13,3 +13,7 @@ Below are the predefined variables you could use in the template settings such a - `${day}` - current day of the month - `${hour}` - current hour - `${minute}` - current minute +- `${todo}` - the configured task tag (e.g. "TODO") +- `${enclosing_method}` - name of the method being implemented or overridden +- `${body_statement}` - the generated body statement (e.g. a call to the overridden `super` method) +- `${exception_var}` - name of the caught exception variable diff --git a/document/refactoring_change_signature.png b/document/refactoring_change_signature.png new file mode 100644 index 000000000..6690f7471 Binary files /dev/null and b/document/refactoring_change_signature.png differ diff --git a/eslint.config.mjs b/eslint.config.mjs new file mode 100644 index 000000000..7eaef9353 --- /dev/null +++ b/eslint.config.mjs @@ -0,0 +1,146 @@ +import { defineConfig, globalIgnores } from "eslint/config"; +import tseslint from "typescript-eslint"; +import globals from "globals"; +import stylistic from "@stylistic/eslint-plugin"; + +export default defineConfig([globalIgnores([ + "out", + "server", + "node_modules", + "*.vsix", + ".DS_Store", + ".vscode-test", + "undefined", + "target", + "dist", + "jre", + "lombok", + "bin/", + ".settings", + ".classpath", + ".project", + "test/resources/projects/**/.vscode", + "test/resources/projects/maven/salut/testGradle", + "test-temp", + "vscode*.d.ts", +]), { + files: ["src/**"], + + plugins: { + "@typescript-eslint": tseslint.plugin, + "stylistic": stylistic, + }, + + languageOptions: { + globals: { + ...globals.node, + }, + + parser: tseslint.parser, + ecmaVersion: "latest", + sourceType: "commonjs", + + parserOptions: { + project: ["tsconfig.webview.json", "tsconfig.json"], + }, + }, + + rules: { + "stylistic/member-delimiter-style": ["error", { + multiline: { + delimiter: "semi", + requireLast: true, + }, + + singleline: { + delimiter: "semi", + requireLast: false, + }, + }], + + "@typescript-eslint/naming-convention": "error", + "@typescript-eslint/prefer-for-of": "error", + "stylistic/semi": ["error", "always"], + "stylistic/type-annotation-spacing": "error", + curly: ["error", "multi-line"], + eqeqeq: ["error", "always"], + + "id-denylist": [ + "error", + "any", + "Number", + "number", + "String", + "string", + "Boolean", + "boolean", + "Undefined", + "undefined", + ], + + "id-match": "error", + "no-debugger": "error", + "no-multiple-empty-lines": "error", + "no-trailing-spaces": "error", + "no-underscore-dangle": "error", + "no-var": "error", + + "prefer-arrow-callback": ["error", { + allowNamedFunctions: true, + }], + + "prefer-const": "error", + "prefer-template": "error", + "quote-props": ["error", "as-needed"], + semi: "error", + + "spaced-comment": ["error", "always", { + markers: ["/"], + }], + }, +}, { + files: ["**/*.js", "**/*.mjs"], + + plugins: { + "@typescript-eslint": tseslint.plugin, + }, + + languageOptions: { + globals: { + ...globals.node, + }, + + parser: tseslint.parser, + ecmaVersion: "latest", + sourceType: "commonjs", + }, + + rules: { + "@typescript-eslint/no-var-requires": "off", + "@typescript-eslint/naming-convention": "off", + "stylistic/semi": "off", + "prefer-arrow/prefer-arrow-functions": "off", + "prefer-arrow-callback": "off", + "no-useless-escape": "off", + "spaced-comment": "off", + semi: "off", + "prefer-template": "off", + "prefer-const": "off", + }, +}, { + files: ["**/*.test.ts"], + + languageOptions: { + globals: { + ...globals.node, + }, + + parser: tseslint.parser, + ecmaVersion: "latest", + sourceType: "commonjs", + }, + + rules: { + "prefer-arrow-callback": "off", + }, +}]); \ No newline at end of file diff --git a/formatters/eclipse-formatter.xml b/formatters/eclipse-formatter.xml index 7f8c57d13..8b078b85a 100644 --- a/formatters/eclipse-formatter.xml +++ b/formatters/eclipse-formatter.xml @@ -1,45 +1,69 @@ - - - - - - - - + + + + + + + + + + + + + + + + - + + + + + + + + + + + + + + + + + @@ -48,19 +72,25 @@ + + + + + + @@ -69,11 +99,15 @@ + + + + @@ -88,6 +122,7 @@ + @@ -112,18 +147,14 @@ - - - - - - - + + + - + @@ -149,11 +180,17 @@ + + + + + + @@ -170,6 +207,7 @@ + @@ -178,13 +216,19 @@ + + + + + + - + @@ -201,6 +245,7 @@ + @@ -227,11 +272,16 @@ + + + + + @@ -243,6 +293,8 @@ + + @@ -258,6 +310,7 @@ + @@ -268,9 +321,12 @@ + + + @@ -280,16 +336,40 @@ + + + + + + + + + + + + + + + + + + + + + + + + @@ -299,17 +379,27 @@ + + + + - + + + + + + + diff --git a/gulpfile.js b/gulpfile.js deleted file mode 100644 index 2ed13f1bd..000000000 --- a/gulpfile.js +++ /dev/null @@ -1,230 +0,0 @@ -'use strict'; -const gulp = require('gulp'); -const cp = require('child_process'); -const decompress = require('gulp-decompress'); -const download = require('gulp-download'); -const request = require('request'); -const glob = require('glob'); -const fse = require('fs-extra'); -const path = require('path'); -const url = require("url"); -const argv = require('minimist')(process.argv.slice(2)); -const server_dir = '../eclipse.jdt.ls'; -const originalTestFolder = path.join(__dirname, 'test', 'resources', 'projects', 'maven', 'salut'); -const tempTestFolder = path.join(__dirname, 'test-temp'); -const testSettings = path.join(tempTestFolder, '.vscode', 'settings.json'); -//... - -gulp.task('clean_jre', function (done) { - if (fse.existsSync('./jre')) { - fse.removeSync('./jre'); - } - - done(); -}); - -// Pls update the latest JRE if a new JDK is announced. -const LATEST_JRE = 17; - -/** - * Usage: - * npx gulp download_jre // Download the latest JRE for the platform of the current running machine. - * npx gulp download_jre --target darwin-x64 --javaVersion 17 // Download the specified JRE for the specified platform. - * - * Supported platforms: - * win32-x64, - * linux-x64, - * linux-arm64, - * darwin-x64, - * darwin-arm64 - */ -gulp.task('download_jre', async function (done) { - if (fse.existsSync('./jre')) { - fse.removeSync('./jre'); - } - - const platformMapping = { - "linux-arm64": "linux-aarch64", - "linux-x64": "linux-x86_64", - "darwin-arm64": "macosx-aarch64", - "darwin-x64": "macosx-x86_64", - "win32-x64": "win32-x86_64" - } - - const targetPlatform = argv.target || process.platform + "-" + process.arch; - if (targetPlatform && Object.keys(platformMapping).includes(targetPlatform)) { - const javaVersion = (!argv.javaVersion || argv.javaVersion === "latest") ? LATEST_JRE : argv.javaVersion; - console.log("Downloading justj JRE " + javaVersion + " for the platform " + targetPlatform) + "..."; - - const manifestUrl = `https://download.eclipse.org/justj/jres/${javaVersion}/downloads/latest/justj.manifest`; - // Download justj.manifest file - const manifest = await new Promise(function (resolve, reject) { - request.get(manifestUrl, function (err, response, body) { - if (err || response.statusCode >= 400) { - reject(err || `${response.statusCode} returned from ${manifestUrl}`); - } else { - resolve(String(body)); - } - }); - }); - - if (!manifest) { - done(new Error(`Failed to download justj.manifest, please check if the link ${manifestUrl} is valid.`)) - return; - } - - /** - * Here are the contents for a sample justj.manifest file: - * ../20211012_0921/org.eclipse.justj.openjdk.hotspot.jre.full.stripped-17-linux-aarch64.tar.gz - * ../20211012_0921/org.eclipse.justj.openjdk.hotspot.jre.full.stripped-17-linux-x86_64.tar.gz - * ../20211012_0921/org.eclipse.justj.openjdk.hotspot.jre.full.stripped-17-macosx-aarch64.tar.gz - * ../20211012_0921/org.eclipse.justj.openjdk.hotspot.jre.full.stripped-17-macosx-x86_64.tar.gz - * ../20211012_0921/org.eclipse.justj.openjdk.hotspot.jre.full.stripped-17-win32-x86_64.tar.gz - */ - const javaPlatform = platformMapping[targetPlatform]; - const list = manifest.split(/\r?\n/); - const jreIdentifier = list.find((value) => { - return value.indexOf("org.eclipse.justj.openjdk.hotspot.jre.full.stripped") >= 0 && value.indexOf(javaPlatform) >= 0; - }); - - if (!jreIdentifier) { - done(new Error(`justj doesn't support the jre ${javaVersion} for the platform ${javaPlatform} (${targetPlatform}), please refer to the link ${manifestUrl} for the supported platforms.`)); - return; - } - - const jreDownloadUrl = `https://download.eclipse.org/justj/jres/${javaVersion}/downloads/latest/${jreIdentifier}`; - const parsedDownloadUrl = url.parse(jreDownloadUrl); - const jreFileName = path.basename(parsedDownloadUrl.pathname) - .replace(/[\.7z|\.bz2|\.gz|\.rar|\.tar|\.zip|\.xz]*$/, ""); - const idx = jreFileName.indexOf('-'); - const jreVersionLabel = idx >= 0 ? jreFileName.substring(idx + 1) : jreFileName; - // Download justj JRE. - await new Promise(function (resolve, reject) { - download(jreDownloadUrl) - .on('error', reject) - .pipe(decompress({ strip: 0 })) - .pipe(gulp.dest('./jre/' + jreVersionLabel)) - .on('end', resolve); - }); - } else { - console.log("[Error] download_jre failed, please specify a valid target platform via --target argument. Here are the supported platform list:"); - for (const platform of Object.keys(platformMapping)) { - console.log(platform); - } - } - - done(); -}); - -gulp.task('download_lombok', function (done) { - if (fse.existsSync('./lombok')) { - fse.removeSync('./lombok'); - } - const lombokVersion = '1.18.24'; - // The latest lombok version can be found on the website https://projectlombok.org/downloads - const lombokUrl = `https://projectlombok.org/downloads/lombok-${lombokVersion}.jar`; - download(lombokUrl) - .pipe(gulp.dest('./lombok/')) - done(); -}); - -gulp.task('download_server', function (done) { - fse.removeSync('./server'); - download("http://download.eclipse.org/jdtls/snapshots/jdt-language-server-latest.tar.gz") - .pipe(decompress()) - .pipe(gulp.dest('./server')); - done(); -}); - -gulp.task('build_server', function (done) { - fse.removeSync('./server'); - cp.execSync(mvnw() + ' -Pserver-distro clean package -Declipse.jdt.ls.skipGradleChecksums', { cwd: server_dir, stdio: [0, 1, 2] }); - gulp.src(server_dir + '/org.eclipse.jdt.ls.product/distro/*.tar.gz') - .pipe(decompress()) - .pipe(gulp.dest('./server')); - done(); -}); - -gulp.task('dev_server', function (done) { - let command = mvnw() + ' -o -pl org.eclipse.jdt.ls.core,org.eclipse.jdt.ls.target clean package -Declipse.jdt.ls.skipGradleChecksums'; - console.log('executing ' + command); - cp.execSync(command, { cwd: server_dir, stdio: [0, 1, 2] }); - glob.Glob(server_dir + '/org.eclipse.jdt.ls.core/target/org.eclipse.jdt.ls.core-*-SNAPSHOT.jar', - (_error, sources) => { - glob.Glob('./server/plugins/org.eclipse.jdt.ls.core_*.jar', - (_error, targets) => { - console.log('Copying ' + sources[0] + ' to ' + targets[0]); - fse.copy(sources[0], targets[0]); - }); - }); - done(); -}); - -gulp.task('watch_server', function (done) { - gulp.watch(server_dir + '/org.eclipse.jdt.ls.core/**/*.java', gulp.series('dev_server')); - done(); -}); - -gulp.task('generate_standard_test_folder', function (done) { - fse.copySync(originalTestFolder, tempTestFolder); - fse.ensureDirSync(path.join(tempTestFolder, '.vscode')); - fse.writeJSONSync(testSettings, { - "java.server.launchMode": "Standard", - "java.configuration.updateBuildConfiguration": "automatic" - }); - done(); -}); - -gulp.task('generate_lightweight_test_folder', function (done) { - fse.copySync(originalTestFolder, tempTestFolder); - fse.ensureDirSync(path.join(tempTestFolder, '.vscode')); - fse.writeJSONSync(testSettings, { - "java.server.launchMode": "LightWeight", - }); - done(); -}); - -gulp.task('clean_test_folder', function (done) { - fse.removeSync(tempTestFolder); - done(); -}); - -gulp.task('prepare_pre_release', function (done) { - const json = JSON.parse(fse.readFileSync("./package.json").toString()); - const stableVersion = json.version.match(/(\d+)\.(\d+)\.(\d+)/); - const major = stableVersion[1]; - const minor = stableVersion[2]; - const date = new Date(); - const month = date.getMonth() + 1; - const day = date.getDate(); - const hours = date.getHours(); - const patch = `${date.getFullYear()}${prependZero(month)}${prependZero(day)}${prependZero(hours)}`; - const insiderPackageJson = Object.assign(json, { - version: `${major}.${minor}.${patch}`, - }); - fse.writeFileSync("./package.json", JSON.stringify(insiderPackageJson, null, 2)); - done(); -}); - -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"; -} - -function prependZero(num) { - if (num > 99) { - throw "Unexpected value to prepend with zero"; - } - return `${num < 10 ? "0" : ""}${num}`; -} diff --git a/icons/icon24.png b/icons/icon24.png new file mode 100644 index 000000000..41e133d27 Binary files /dev/null and b/icons/icon24.png differ diff --git a/icons/java-svgrepo-com.svg b/icons/java-svgrepo-com.svg new file mode 100644 index 000000000..17ea0060c --- /dev/null +++ b/icons/java-svgrepo-com.svg @@ -0,0 +1,13 @@ + + + + + + + + + + \ No newline at end of file diff --git a/language-support/html/inline-html.json b/language-support/html/inline-html.json new file mode 100644 index 000000000..b40dbf2a1 --- /dev/null +++ b/language-support/html/inline-html.json @@ -0,0 +1,44 @@ +{ + "injectionSelector": "L:source.java -comment -string", + "patterns": [ + { + "contentName": "meta.embedded.block.html", + "begin": "(?i)((/\\*\\s*(language=html)\\s*\\*/)|((//\\s*(language=html)\\s*)))", + "beginCaptures": { + "1": { + "name": "comment.block" + } + }, + "end": "(?<=\")", + "patterns": [ + { + "begin": "\\s*(\"\"\")$", + "beginCaptures": { + "0": { "name": "string.quoted.triple.java" } + }, + "end": "\\s*(\"\"\")", + "endCaptures": { + "0": { "name": "string.quoted.triple.java" } + }, + "patterns": [ + { "include": "text.html.derivative" } + ] + }, + { + "begin": "\\s*(\")", + "beginCaptures": { + "0": { "name": "string.quoted.double.java" } + }, + "end": "\\s*(\")", + "endCaptures": { + "0": { "name": "string.quoted.double.java" } + }, + "patterns": [ + { "include": "text.html.derivative" } + ] + } + ] + } + ], + "scopeName": "inline.html" +} diff --git a/language-support/java/java.tmLanguage.json b/language-support/java/java.tmLanguage.json new file mode 100644 index 000000000..2bdf9bf0e --- /dev/null +++ b/language-support/java/java.tmLanguage.json @@ -0,0 +1,1888 @@ +{ + "information_for_contributors": [ + "This file has been copied from https://github.com/microsoft/vscode/blob/b37252c18238fffcebdc9fd7680f1dabea3a50a0/extensions/java/syntaxes/java.tmLanguage.json", + "The source location lists https://github.com/atom/language-java/blob/29f977dc42a7e2568b39bb6fb34c4ef108eb59b3/LICENSE.md as the original repository. It is therefore licensed under MIT." + ], + "name": "Java", + "scopeName": "source.java", + "patterns": [ + { + "begin": "\\b(package)\\b\\s*", + "beginCaptures": { + "1": { + "name": "keyword.other.package.java" + } + }, + "end": "\\s*(;)", + "endCaptures": { + "1": { + "name": "punctuation.terminator.java" + } + }, + "name": "meta.package.java", + "contentName": "storage.modifier.package.java", + "patterns": [ + { + "include": "#comments" + }, + { + "match": "(?<=\\.)\\s*\\.|\\.(?=\\s*;)", + "name": "invalid.illegal.character_not_allowed_here.java" + }, + { + "match": "(?", + "endCaptures": { + "0": { + "name": "punctuation.bracket.angle.java" + } + }, + "patterns": [ + { + "match": "\\b(extends|super)\\b", + "name": "storage.modifier.$1.java" + }, + { + "match": "(?>>?|~|\\^)", + "name": "keyword.operator.bitwise.java" + }, + { + "match": "((&|\\^|\\||<<|>>>?)=)", + "name": "keyword.operator.assignment.bitwise.java" + }, + { + "match": "(===?|!=|<=|>=|<>|<|>)", + "name": "keyword.operator.comparison.java" + }, + { + "match": "([+*/%-]=)", + "name": "keyword.operator.assignment.arithmetic.java" + }, + { + "match": "(=)", + "name": "keyword.operator.assignment.java" + }, + { + "match": "(\\-\\-|\\+\\+)", + "name": "keyword.operator.increment-decrement.java" + }, + { + "match": "(\\-|\\+|\\*|\\/|%)", + "name": "keyword.operator.arithmetic.java" + }, + { + "match": "(!|&&|\\|\\|)", + "name": "keyword.operator.logical.java" + }, + { + "match": "(\\||&)", + "name": "keyword.operator.bitwise.java" + }, + { + "match": "\\b(const|goto)\\b", + "name": "keyword.reserved.java" + } + ] + }, + "lambda-expression": { + "patterns": [ + { + "match": "->", + "name": "storage.type.function.arrow.java" + } + ] + }, + "member-variables": { + "begin": "(?=private|protected|public|native|synchronized|abstract|threadsafe|transient|static|final)", + "end": "(?=\\=|;)", + "patterns": [ + { + "include": "#storage-modifiers" + }, + { + "include": "#variables" + }, + { + "include": "#primitive-arrays" + }, + { + "include": "#object-types" + } + ] + }, + "method-call": { + "begin": "(\\.)\\s*([A-Za-z_$][\\w$]*)\\s*(\\()", + "beginCaptures": { + "1": { + "name": "punctuation.separator.period.java" + }, + "2": { + "name": "entity.name.function.java" + }, + "3": { + "name": "punctuation.definition.parameters.begin.bracket.round.java" + } + }, + "end": "\\)", + "endCaptures": { + "0": { + "name": "punctuation.definition.parameters.end.bracket.round.java" + } + }, + "name": "meta.method-call.java", + "patterns": [ + { + "include": "#code" + } + ] + }, + "methods": { + "begin": "(?!new)(?=[\\w<].*\\s+)(?=([^=/]|/(?!/))+\\()", + "end": "(})|(?=;)", + "endCaptures": { + "1": { + "name": "punctuation.section.method.end.bracket.curly.java" + } + }, + "name": "meta.method.java", + "patterns": [ + { + "include": "#storage-modifiers" + }, + { + "begin": "(\\w+)\\s*(\\()", + "beginCaptures": { + "1": { + "name": "entity.name.function.java" + }, + "2": { + "name": "punctuation.definition.parameters.begin.bracket.round.java" + } + }, + "end": "\\)", + "endCaptures": { + "0": { + "name": "punctuation.definition.parameters.end.bracket.round.java" + } + }, + "name": "meta.method.identifier.java", + "patterns": [ + { + "include": "#parameters" + }, + { + "include": "#parens" + }, + { + "include": "#comments" + } + ] + }, + { + "include": "#generics" + }, + { + "begin": "(?=\\w.*\\s+\\w+\\s*\\()", + "end": "(?=\\s+\\w+\\s*\\()", + "name": "meta.method.return-type.java", + "patterns": [ + { + "include": "#all-types" + }, + { + "include": "#parens" + }, + { + "include": "#comments" + } + ] + }, + { + "include": "#throws" + }, + { + "begin": "{", + "beginCaptures": { + "0": { + "name": "punctuation.section.method.begin.bracket.curly.java" + } + }, + "end": "(?=})", + "contentName": "meta.method.body.java", + "patterns": [ + { + "include": "#code" + } + ] + }, + { + "include": "#comments" + } + ] + }, + "module": { + "begin": "((open)\\s)?(module)\\s+(\\w+)", + "end": "}", + "beginCaptures": { + "1": { + "name": "storage.modifier.java" + }, + "3": { + "name": "storage.modifier.java" + }, + "4": { + "name": "entity.name.type.module.java" + } + }, + "endCaptures": { + "0": { + "name": "punctuation.section.module.end.bracket.curly.java" + } + }, + "name": "meta.module.java", + "patterns": [ + { + "begin": "{", + "beginCaptures": { + "0": { + "name": "punctuation.section.module.begin.bracket.curly.java" + } + }, + "end": "(?=})", + "contentName": "meta.module.body.java", + "patterns": [ + { + "include": "#comments" + }, + { + "include": "#comments-javadoc" + }, + { + "match": "\\b(requires|transitive|exports|opens|to|uses|provides|with)\\b", + "name": "keyword.module.java" + } + ] + } + ] + }, + "numbers": { + "patterns": [ + { + "match": "(?x)\n\\b(?)?(\\()", + "beginCaptures": { + "1": { + "name": "storage.modifier.java" + }, + "2": { + "name": "entity.name.type.record.java" + }, + "3": { + "patterns": [ + { + "include": "#generics" + } + ] + }, + "4": { + "name": "punctuation.definition.parameters.begin.bracket.round.java" + } + }, + "end": "\\)", + "endCaptures": { + "0": { + "name": "punctuation.definition.parameters.end.bracket.round.java" + } + }, + "name": "meta.record.identifier.java", + "patterns": [ + { + "include": "#code" + } + ] + }, + { + "begin": "(implements)\\s", + "beginCaptures": { + "1": { + "name": "storage.modifier.implements.java" + } + }, + "end": "(?=\\s*\\{)", + "name": "meta.definition.class.implemented.interfaces.java", + "patterns": [ + { + "include": "#object-types-inherited" + }, + { + "include": "#comments" + } + ] + }, + { + "include": "#record-body" + } + ] + }, + "record-body": { + "begin": "{", + "beginCaptures": { + "0": { + "name": "punctuation.section.class.begin.bracket.curly.java" + } + }, + "end": "(?=})", + "name": "meta.record.body.java", + "patterns": [ + { + "include": "#record-constructor" + }, + { + "include": "#class-body" + } + ] + }, + "record-constructor": { + "begin": "(?!new)(?=[\\w<].*\\s+)(?=([^\\(=/]|/(?!/))+(?={))", + "end": "(})|(?=;)", + "endCaptures": { + "1": { + "name": "punctuation.section.method.end.bracket.curly.java" + } + }, + "name": "meta.method.java", + "patterns": [ + { + "include": "#storage-modifiers" + }, + { + "begin": "(\\w+)", + "beginCaptures": { + "1": { + "name": "entity.name.function.java" + } + }, + "end": "(?=\\s*{)", + "name": "meta.method.identifier.java", + "patterns": [ + { + "include": "#comments" + } + ] + }, + { + "include": "#comments" + }, + { + "begin": "{", + "beginCaptures": { + "0": { + "name": "punctuation.section.method.begin.bracket.curly.java" + } + }, + "end": "(?=})", + "contentName": "meta.method.body.java", + "patterns": [ + { + "include": "#code" + } + ] + } + ] + }, + "static-initializer": { + "patterns": [ + { + "include": "#anonymous-block-and-instance-initializer" + }, + { + "match": "static", + "name": "storage.modifier.java" + } + ] + }, + "storage-modifiers": { + "match": "\\b(public|private|protected|static|final|native|synchronized|abstract|threadsafe|transient|volatile|default|strictfp|sealed|non-sealed)\\b", + "name": "storage.modifier.java" + }, + "strings": { + "patterns": [ + { + "begin": "\"\"\"", + "beginCaptures": { + "0": { + "name": "punctuation.definition.string.begin.java" + } + }, + "end": "\"\"\"", + "endCaptures": { + "0": { + "name": "punctuation.definition.string.end.java" + } + }, + "name": "string.quoted.triple.java", + "patterns": [ + { + "match": "(\\\\\"\"\")(?!\")|(\\\\.)", + "name": "constant.character.escape.java" + } + ] + }, + { + "begin": "\"", + "beginCaptures": { + "0": { + "name": "punctuation.definition.string.begin.java" + } + }, + "end": "\"", + "endCaptures": { + "0": { + "name": "punctuation.definition.string.end.java" + } + }, + "name": "string.quoted.double.java", + "patterns": [ + { + "match": "\\\\.", + "name": "constant.character.escape.java" + } + ] + }, + { + "begin": "'", + "beginCaptures": { + "0": { + "name": "punctuation.definition.string.begin.java" + } + }, + "end": "'", + "endCaptures": { + "0": { + "name": "punctuation.definition.string.end.java" + } + }, + "name": "string.quoted.single.java", + "patterns": [ + { + "match": "\\\\.", + "name": "constant.character.escape.java" + } + ] + } + ] + }, + "throws": { + "begin": "throws", + "beginCaptures": { + "0": { + "name": "storage.modifier.java" + } + }, + "end": "(?={|;)", + "name": "meta.throwables.java", + "patterns": [ + { + "match": ",", + "name": "punctuation.separator.delimiter.java" + }, + { + "match": "[a-zA-Z$_][\\.a-zA-Z0-9$_]*", + "name": "storage.type.java" + }, + { + "include": "#comments" + } + ] + }, + "try-catch-finally": { + "patterns": [ + { + "begin": "\\btry\\b", + "beginCaptures": { + "0": { + "name": "keyword.control.try.java" + } + }, + "end": "}", + "endCaptures": { + "0": { + "name": "punctuation.section.try.end.bracket.curly.java" + } + }, + "name": "meta.try.java", + "patterns": [ + { + "begin": "\\(", + "beginCaptures": { + "0": { + "name": "punctuation.section.try.resources.begin.bracket.round.java" + } + }, + "end": "\\)", + "endCaptures": { + "0": { + "name": "punctuation.section.try.resources.end.bracket.round.java" + } + }, + "name": "meta.try.resources.java", + "patterns": [ + { + "include": "#code" + } + ] + }, + { + "begin": "{", + "beginCaptures": { + "0": { + "name": "punctuation.section.try.begin.bracket.curly.java" + } + }, + "end": "(?=})", + "contentName": "meta.try.body.java", + "patterns": [ + { + "include": "#code" + } + ] + } + ] + }, + { + "begin": "\\b(catch)\\b", + "beginCaptures": { + "1": { + "name": "keyword.control.catch.java" + } + }, + "end": "}", + "endCaptures": { + "0": { + "name": "punctuation.section.catch.end.bracket.curly.java" + } + }, + "name": "meta.catch.java", + "patterns": [ + { + "include": "#comments" + }, + { + "begin": "\\(", + "beginCaptures": { + "0": { + "name": "punctuation.definition.parameters.begin.bracket.round.java" + } + }, + "end": "\\)", + "endCaptures": { + "0": { + "name": "punctuation.definition.parameters.end.bracket.round.java" + } + }, + "contentName": "meta.catch.parameters.java", + "patterns": [ + { + "include": "#comments" + }, + { + "include": "#storage-modifiers" + }, + { + "begin": "[a-zA-Z$_][\\.a-zA-Z0-9$_]*", + "beginCaptures": { + "0": { + "name": "storage.type.java" + } + }, + "end": "(\\|)|(?=\\))", + "endCaptures": { + "1": { + "name": "punctuation.catch.separator.java" + } + }, + "patterns": [ + { + "include": "#comments" + }, + { + "match": "\\w+", + "captures": { + "0": { + "name": "variable.parameter.java" + } + } + } + ] + } + ] + }, + { + "begin": "{", + "beginCaptures": { + "0": { + "name": "punctuation.section.catch.begin.bracket.curly.java" + } + }, + "end": "(?=})", + "contentName": "meta.catch.body.java", + "patterns": [ + { + "include": "#code" + } + ] + } + ] + }, + { + "begin": "\\bfinally\\b", + "beginCaptures": { + "0": { + "name": "keyword.control.finally.java" + } + }, + "end": "}", + "endCaptures": { + "0": { + "name": "punctuation.section.finally.end.bracket.curly.java" + } + }, + "name": "meta.finally.java", + "patterns": [ + { + "begin": "{", + "beginCaptures": { + "0": { + "name": "punctuation.section.finally.begin.bracket.curly.java" + } + }, + "end": "(?=})", + "contentName": "meta.finally.body.java", + "patterns": [ + { + "include": "#code" + } + ] + } + ] + } + ] + }, + "variables": { + "begin": "(?x)\n(?=\n \\b\n (\n (void|boolean|byte|char|short|int|float|long|double)\n |\n (?>(\\w+\\.)*[A-Z_]+\\w*) # e.g. `javax.ws.rs.Response`, or `String`\n )\n \\b\n \\s*\n (\n <[\\w<>,\\.?\\s\\[\\]]*> # e.g. `HashMap`, or `List`\n )?\n \\s*\n (\n (\\[\\])* # int[][]\n )?\n \\s+\n [A-Za-z_$][\\w$]* # At least one identifier after space\n ([\\w\\[\\],$][\\w\\[\\],\\s]*)? # possibly primitive array or additional identifiers\n \\s*(=|:|;)\n)", + "end": "(?=\\=|:|;)", + "name": "meta.definition.variable.java", + "patterns": [ + { + "match": "([A-Za-z$_][\\w$]*)(?=\\s*(\\[\\])*\\s*(;|:|=|,))", + "captures": { + "1": { + "name": "variable.other.definition.java" + } + } + }, + { + "include": "#all-types" + }, + { + "include": "#code" + } + ] + }, + "variables-local": { + "begin": "(?=\\b(var)\\b\\s+[A-Za-z_$][\\w$]*\\s*(=|:|;))", + "end": "(?=\\=|:|;)", + "name": "meta.definition.variable.local.java", + "patterns": [ + { + "match": "\\bvar\\b", + "name": "storage.type.local.java" + }, + { + "match": "([A-Za-z$_][\\w$]*)(?=\\s*(\\[\\])*\\s*(=|:|;))", + "captures": { + "1": { + "name": "variable.other.definition.java" + } + } + }, + { + "include": "#code" + } + ] + } + } +} diff --git a/language-support/java/language-configuration.json b/language-support/java/language-configuration.json index 884b85d0e..90e2c5fec 100644 --- a/language-support/java/language-configuration.json +++ b/language-support/java/language-configuration.json @@ -37,10 +37,13 @@ "(", ")" ], - [ - "\"", - "\"" - ], + { + "open": "\"", + "close": "\"", + "notIn": [ + "string" + ] + }, [ "'", "'" @@ -85,5 +88,139 @@ "<", ">" ] + ], + "autoCloseBefore": ";:.,=}])>` \n\t", + "folding": { + "markers": { + "start": "^\\s*//\\s*#?region\\b", + "end": "^\\s*//\\s*#?endregion\\b" + } + }, + "wordPattern": { + "pattern": "(-?\\d*\\.\\d\\w*)|([^\\`\\~\\!\\@\\#\\%\\^\\&\\*\\(\\)\\-\\=\\+\\[\\{\\]\\}\\\\\\|\\;\\:\\'\\\"\\,\\.\\<\\>\\/\\?\\s]+)" + }, + "indentationRules": { + "decreaseIndentPattern": { + "pattern": "^((?!.*?\\/\\*).*\\*/)?\\s*[\\)\\}\\]].*$" + }, + "increaseIndentPattern": { + "pattern": "^((?!\\/\\/).)*(\\{[^}\"'`]*|\\([^)\"'`]*|\\[[^\\]\"'`]*)$" + }, + "unIndentedLinePattern": { + "pattern": "^(\\t|[ ])*[ ]\\*[^/]*\\*/\\s*$|^(\\t|[ ])*[ ]\\*/\\s*$|^(\\t|[ ])*[ ]\\*([ ]([^\\*]|\\*(?!/))*)?$" + }, + "indentNextLinePattern": { + "pattern": "^((.*=>\\s*)|((.*[^\\w]+|\\s*)((if|while|for)\\s*\\(.*\\)\\s*|else\\s*)))$" + } + }, + "onEnterRules": [ + { + "beforeText": { + "pattern": "^\\s*/\\*\\*(?!/)([^\\*]|\\*(?!/))*$" + }, + "afterText": { + "pattern": "^\\s*\\*/$" + }, + "action": { + "indent": "indentOutdent", + "appendText": " * " + } + }, + { + "beforeText": { + "pattern": "^\\s*/\\*\\*(?!/)([^\\*]|\\*(?!/))*$" + }, + "action": { + "indent": "none", + "appendText": " * " + } + }, + { + "beforeText": { + "pattern": "^(\\t|[ ])*[ ]\\*([ ]([^\\*]|\\*(?!/))*)?$" + }, + "previousLineText": { + "pattern": "(?=^(\\s*(/\\*\\*|\\*)).*)(?=(?!(\\s*\\*/)))" + }, + "action": { + "indent": "none", + "appendText": "* " + } + }, + { + "beforeText": { + "pattern": "^(\\t|[ ])*[ ]\\*/\\s*$" + }, + "action": { + "indent": "none", + "removeText": 1 + } + }, + { + "beforeText": { + "pattern": "^(\\t|[ ])*[ ]\\*[^/]*\\*/\\s*$" + }, + "action": { + "indent": "none", + "removeText": 1 + } + }, + { + "beforeText": { + "pattern": "^\\s*(\\bcase\\s.+:|\\bdefault:)$" + }, + "afterText": { + "pattern": "^(?!\\s*(\\bcase\\b|\\bdefault\\b))" + }, + "action": { + "indent": "indent" + } + }, + { + "previousLineText": "^\\s*(((else ?)?if|for|while)\\s*\\(.*\\)\\s*|else\\s*)$", + "beforeText": "^\\s+([^{i\\s]|i(?!f\\b))", + "action": { + "indent": "outdent" + } + }, + { + "beforeText": "^.*\\([^\\)]*$", + "afterText": "^\\s*\\).*$", + "action": { + "indent": "indentOutdent", + "appendText": "\t" + } + }, + { + "beforeText": "^.*\\{[^\\}]*$", + "afterText": "^\\s*\\}.*$", + "action": { + "indent": "indentOutdent", + "appendText": "\t" + } + }, + { + "beforeText": "^.*\\[[^\\]]*$", + "afterText": "^\\s*\\].*$", + "action": { + "indent": "indentOutdent", + "appendText": "\t" + } + }, + { + "beforeText": "(?<([^<>]|\\g)+>)?", + "captures": { + "1": { + "name": "storage.type.class.kotlin" + }, + "2": { + "name": "entity.name.type.class.kotlin" + }, + "3": { + "patterns": [ + { + "include": "#type-parameter" + } + ] + } + } + }, + "object-declaration": { + "match": "\\b(object)\\s+(\\b\\w+\\b|`[^`]+`)", + "captures": { + "1": { + "name": "storage.type.object.kotlin" + }, + "2": { + "name": "entity.name.type.object.kotlin" + } + } + }, + "type-alias": { + "match": "\\b(typealias)\\s+(\\b\\w+\\b|`[^`]+`)\\s*(?<([^<>]|\\g)+>)?", + "captures": { + "1": { + "name": "storage.type.alias.kotlin" + }, + "2": { + "name": "entity.name.type.kotlin" + }, + "3": { + "patterns": [ + { + "include": "#type-parameter" + } + ] + } + } + }, + "function-declaration": { + "begin": "\\b(fun)\\b\\s*(?<([^<>]|\\g)+>)?\\s*(?:(\\w+)\\.)?(\\b\\w+\\b|`[^`]+`)\\(", + "beginCaptures": { + "1": { + "name": "storage.type.function.kotlin" + }, + "2": { + "patterns": [ + { + "include": "#type-parameter" + } + ] + }, + "4": { + "name": "entity.name.type.class.extension.kotlin" + }, + "5": { + "name": "entity.name.function.declaration.kotlin" + } + }, + "end": "\\)", + "endCaptures": { + "1": { + "name": "keyword.operator.assignment.type.kotlin" + } + }, + "patterns": [ + { + "include": "#parameter-declaration" + } + ] + }, + "parameter-declaration": { + "match": "\\b(\\w+)\\s*(:)\\s*(\\w+)(\\?)?(,)?", + "captures": { + "1": { + "name": "variable.parameter.kotlin" + }, + "2": { + "name": "keyword.operator.assignment.type.kotlin" + }, + "3": { + "name": "entity.name.type.kotlin" + }, + "4": { + "name": "keyword.operator.optional" + }, + "5": { + "name": "punctuation.separator.delimiter.kotlin" + } + } + }, + "variable-declaration": { + "match": "\\b(var)\\b\\s*(?<([^<>]|\\g)+>)?", + "captures": { + "1": { + "name": "storage.type.variable.kotlin" + }, + "2": { + "patterns": [ + { + "include": "#type-parameter" + } + ] + } + } + }, + "constant-declaration": { + "match": "\\b(val)\\b\\s*(?<([^<>]|\\g)+>)?", + "captures": { + "1": { + "name": "storage.type.variable.readonly.kotlin" + }, + "2": { + "patterns": [ + { + "include": "#type-parameter" + } + ] + } + } + }, + "variable" : { + "match": "\\b(\\w+)(?=\\s*[:=])", + "captures": { + "1": { + "name": "variable.other.definition.kotlin" + } + } + }, + "object" : { + "match": "\\b(\\w+)(?=\\.)", + "captures": { + "1": { + "name": "variable.other.object.kotlin" + } + } + }, + "type-parameter": { + "patterns": [ + { + "match": "(:)?\\s*(\\b\\w+\\b)(\\?)?", + "captures": { + "1": { + "name": "keyword.operator.assignment.kotlin" + }, + "2": { + "name": "entity.name.type.kotlin" + }, + "3": { + "name": "keyword.operator.optional" + } + } + }, + { + "match": "\\b(in|out)\\b", + "name": "storage.modifier.kotlin" + } + ] + }, + "type-annotation": { + "match": "(?|(?[<(]([^<>()\"']|\\g)+[)>]))+", + "captures": { + "0": { + "patterns": [ + { + "include": "#type-parameter" + } + ] + } + } + }, + "function-call": { + "match": "(?:(\\?\\.)|(\\.))?(\\b\\w+\\b|`[^`]+`)\\s*(?<([^<>]|\\g)+>)?\\s*(?=[({])", + "captures": { + "1": { + "name": "punctuation.accessor.optional.kotlin" + }, + "2": { + "name": "punctuation.separator.period.kotlin" + }, + "3": { + "name": "entity.name.function.call.kotlin" + }, + "4": { + "patterns": [ + { + "include": "#type-parameter" + } + ] + } + } + }, + "property.reference": { + "match": "(?:(\\?\\.)|(\\.))(\\w+)\\b", + "captures": { + "1": { + "name": "punctuation.accessor.optional.kotlin" + }, + "2": { + "name": "punctuation.separator.period.kotlin" + }, + "3": { + "name": "variable.other.property.kotlin" + } + } + }, + "method-reference": { + "match": "\\??::(\\b\\w+\\b|`[^`]+`)", + "captures": { + "1": { + "name": "entity.name.function.reference.kotlin" + } + } + }, + "key": { + "match": "\\b(\\w=)\\s*(=)", + "captures": { + "1": { + "name": "variable.parameter.kotlin" + }, + "2": { + "name": "keyword.operator.assignment.kotlin" + } + } + }, + "string-empty": { + "match": "(?", + "name": "storage.type.function.arrow.kotlin" + }, + "operators": { + "patterns": [ + { + "match": "(===?|\\!==?|<=|>=|<|>)", + "name": "keyword.operator.comparison.kotlin" + }, + { + "match": "(\\?:)", + "name": "keyword.operator.elvis.kotlin" + }, + { + "match": "([+*/%-]=)", + "name": "keyword.operator.assignment.arithmetic.kotlin" + }, + { + "match": "(=)", + "name": "keyword.operator.assignment.kotlin" + }, + { + "match": "([+*/%-])", + "name": "keyword.operator.arithmetic.kotlin" + }, + { + "match": "(!|&&|\\|\\|)", + "name": "keyword.operator.logical.kotlin" + }, + { + "match": "(--|\\+\\+)", + "name": "keyword.operator.increment-decrement.kotlin" + }, + { + "match": "(\\.\\.)", + "name": "keyword.operator.range.kotlin" + } + ] + }, + "self-reference": { + "match": "\\b(this|super)(@\\w+)?\\b", + "name": "variable.language.this.kotlin" + } + } +} diff --git a/language-support/kotlin/language-configuration.json b/language-support/kotlin/language-configuration.json new file mode 100644 index 000000000..56225afa7 --- /dev/null +++ b/language-support/kotlin/language-configuration.json @@ -0,0 +1,27 @@ +{ + "comments": { + "lineComment": "//", + "blockComment": [ "/*", "*/" ] + }, + "brackets": [ + ["{", "}"], + ["[", "]"], + ["(", ")"] + ], + "autoClosingPairs": [ + { "open": "{", "close": "}" }, + { "open": "[", "close": "]" }, + { "open": "(", "close": ")" }, + { "open": "'", "close": "'", "notIn": ["string", "comment"] }, + { "open": "\"", "close": "\"", "notIn": ["string"] }, + { "open": "/*", "close": " */", "notIn": ["string"] } + ], + "surroundingPairs": [ + ["{", "}"], + ["[", "]"], + ["(", ")"], + ["<", ">"], + ["'", "'"], + ["\"", "\""] + ] +} \ No newline at end of file diff --git a/language-support/sql/inline-sql.json b/language-support/sql/inline-sql.json new file mode 100644 index 000000000..9d13e384f --- /dev/null +++ b/language-support/sql/inline-sql.json @@ -0,0 +1,46 @@ +{ + "injectionSelector": "L:source.java -comment -string", + "patterns": [ + { + "contentName": "meta.embedded.block.sql", + "begin": "(?i)((/\\*\\s*(language=sql)\\s*\\*/)|((//\\s*(language=sql)\\s*)))", + "beginCaptures": { + "1": { + "name": "comment.block" + } + }, + "end": "(?<=\")", + "patterns": [ + { + "begin": "\\s*(\"\"\")$", + "beginCaptures": { + "0": { "name": "string.quoted.triple.java" } + }, + "end": "\\s*(\"\"\")", + "endCaptures": { + "0": { "name": "string.quoted.triple.java" } + }, + "patterns": [ + { "include": "source.sql" }, + { "include": "source.plpgsql.postgres" } + ] + }, + { + "begin": "\\s*(\")", + "beginCaptures": { + "0": { "name": "string.quoted.double.java" } + }, + "end": "\\s*(\")", + "endCaptures": { + "0": { "name": "string.quoted.double.java" } + }, + "patterns": [ + { "include": "source.sql" }, + { "include": "source.plpgsql.postgres" } + ] + } + ] + } + ], + "scopeName": "inline.sql" +} diff --git a/language-support/xml/inline-xml.json b/language-support/xml/inline-xml.json new file mode 100644 index 000000000..69ec0a491 --- /dev/null +++ b/language-support/xml/inline-xml.json @@ -0,0 +1,44 @@ +{ + "injectionSelector": "L:source.java -comment -string", + "patterns": [ + { + "contentName": "meta.embedded.block.xml", + "begin": "(?i)((/\\*\\s*(language=xml)\\s*\\*/)|((//\\s*(language=xml)\\s*)))", + "beginCaptures": { + "1": { + "name": "comment.block" + } + }, + "end": "(?<=\")", + "patterns": [ + { + "begin": "\\s*(\"\"\")$", + "beginCaptures": { + "0": { "name": "string.quoted.triple.java" } + }, + "end": "\\s*(\"\"\")", + "endCaptures": { + "0": { "name": "string.quoted.triple.java" } + }, + "patterns": [ + { "include": "text.xml" } + ] + }, + { + "begin": "\\s*(\")", + "beginCaptures": { + "0": { "name": "string.quoted.double.java" } + }, + "end": "\\s*(\")", + "endCaptures": { + "0": { "name": "string.quoted.double.java" } + }, + "patterns": [ + { "include": "text.xml" } + ] + } + ] + } + ], + "scopeName": "inline.xml" +} diff --git a/language-support/yaml/inline-yaml.json b/language-support/yaml/inline-yaml.json new file mode 100644 index 000000000..e0051e518 --- /dev/null +++ b/language-support/yaml/inline-yaml.json @@ -0,0 +1,44 @@ +{ + "injectionSelector": "L:source.java -comment -string", + "patterns": [ + { + "contentName": "meta.embedded.block.yaml", + "begin": "(?i)((/\\*\\s*(language=yaml)\\s*\\*/)|((//\\s*(language=yaml)\\s*)))", + "beginCaptures": { + "1": { + "name": "comment.block" + } + }, + "end": "(?<=\")", + "patterns": [ + { + "begin": "\\s*(\"\"\")$", + "beginCaptures": { + "0": { "name": "string.quoted.triple.java" } + }, + "end": "\\s*(\"\"\")", + "endCaptures": { + "0": { "name": "string.quoted.triple.java" } + }, + "patterns": [ + { "include": "source.yaml" } + ] + }, + { + "begin": "\\s*(\")", + "beginCaptures": { + "0": { "name": "string.quoted.double.java" } + }, + "end": "\\s*(\")", + "endCaptures": { + "0": { "name": "string.quoted.double.java" } + }, + "patterns": [ + { "include": "source.yaml" } + ] + } + ] + } + ], + "scopeName": "inline.yaml" +} diff --git a/lombok/lombok-1.18.39-4050.jar b/lombok/lombok-1.18.39-4050.jar new file mode 100644 index 000000000..d624c2078 Binary files /dev/null and b/lombok/lombok-1.18.39-4050.jar differ diff --git a/package-lock.json b/package-lock.json index 173ea5fbf..44a307b19 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,5828 +1,4154 @@ { "name": "java", - "version": "1.16.0", - "lockfileVersion": 1, + "version": "1.56.0", + "lockfileVersion": 3, "requires": true, - "dependencies": { - "@discoveryjs/json-ext": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.2.tgz", - "integrity": "sha512-HyYEUDeIj5rRQU2Hk5HTB2uHsbRQpF70nvMhVzi+VJR0X+xNEhjPui4/kBf3VeH/wqD28PT4sVOm8qqLjBrSZg==", - "dev": true + "packages": { + "": { + "name": "java", + "version": "1.56.0", + "license": "EPL-2.0", + "dependencies": { + "@redhat-developer/vscode-extension-proposals": "0.0.23", + "@redhat-developer/vscode-redhat-telemetry": "0.10.2", + "@vscode/codicons": "^0.0.32", + "chokidar": "^3.5.3", + "expand-home-dir": "^0.0.3", + "fmtr": "^1.1.2", + "fs-extra": "^8.1.0", + "glob": "^11.1.0", + "htmlparser2": "6.0.1", + "jdk-utils": "^0.6.0", + "react": "^17.0.2", + "react-dom": "^17.0.2", + "semver": "^7.5.2", + "vscode-languageclient": "8.2.0-next.3", + "vscode-variables": "^1.0.1", + "winreg-utf8": "^0.1.1", + "winston": "^3.2.1", + "winston-daily-rotate-file": "^4.7.1" + }, + "devDependencies": { + "@stylistic/eslint-plugin": "^5.10.0", + "@types/fs-extra": "^8.0.0", + "@types/glob": "5.0.30", + "@types/lodash.findindex": "^4.6.6", + "@types/mocha": "^5.2.5", + "@types/node": "^18.17.1", + "@types/react": "^17.0.37", + "@types/react-dom": "^17.0.11", + "@types/semver": "^7.3.8", + "@types/sinon": "^10.0.12", + "@types/vscode": "^1.77.0", + "@types/vscode-webview": "^1.57.0", + "@types/winreg": "^1.2.30", + "@types/winston": "^2.4.4", + "@vscode/test-electron": "^3.1.0", + "css-loader": "^6.7.3", + "eslint": "^10.7.0", + "eslint-webpack-plugin": "^6.0.0", + "globals": "^17.7.0", + "lodash.findindex": "^4.6.0", + "mini-css-extract-plugin": "^2.9.4", + "minimist": ">=1.2.6", + "mocha": "^11.1.0", + "sinon": "^14.0.0", + "tar": "^7.5.11", + "ts-loader": "^9.4.2", + "typescript": "^4.6.4", + "typescript-eslint": "^8.65.0", + "webpack": "^5.105.0", + "webpack-cli": "^7.2.1" + }, + "engines": { + "vscode": "^1.77.0" + } + }, + "node_modules/@colors/colors": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", + "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", + "engines": { + "node": ">=0.1.90" + } + }, + "node_modules/@discoveryjs/json-ext": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-1.1.0.tgz", + "integrity": "sha512-Xc3VhU02wqZ1HvHRJUwL09HkZSTvidqY5Ya0NXBSYOxAp+Ln9dcJr9fySI+CkONzP3PekQo9WdzCv0PGER/mOA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.17.0" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.10.1.tgz", + "integrity": "sha512-cuadcxVFE8sDK6iWJbs8Sn0av2Nrh2QSGQhVlBW9AaAHqHwjWsZHT8LJ4hFGPh7ASBV2deFdM7H/DPjulmh8rg==", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", + "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/config-array": { + "version": "0.23.5", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.23.5.tgz", + "integrity": "sha512-Y3kKLvC1dvTOT+oGlqNQ1XLqK6D1HU2YXPc52NmAlJZbMMWDzGYXMiPRJ8TYD39muD/OTjlZmNJ4ib7dvSrMBA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/object-schema": "^3.0.5", + "debug": "^4.3.1", + "minimatch": "^10.2.4" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + } + }, + "node_modules/@eslint/config-helpers": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.6.0.tgz", + "integrity": "sha512-ii6Bw9jJ2zi2cWA2Z+9/QZ/+3DX6kwaV5Q986D/CdP3Lap3w/pgQZ373FV7byY/i7L4IRH/G43I5dz1ClsCbpA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^1.2.1" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + } }, - "@eslint/eslintrc": { + "node_modules/@eslint/core": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.2.1.tgz", - "integrity": "sha512-bxvbYnBPN1Gibwyp6NrpnFzA3YtRL3BBAyEAFVIpNTm2Rn4Vy87GA5M4aSn3InRrlsbX5N0GW7XIx+U4SAEKdQ==", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-1.2.1.tgz", + "integrity": "sha512-MwcE1P+AZ4C6DWlpin/OmOA54mmIZ/+xZuJiQd4SyB29oAJjN30UW9wkKNptW2ctp4cEsvhlLY/CsQ1uoHDloQ==", "dev": true, - "requires": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^9.3.1", - "globals": "^13.9.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.0.4", - "strip-json-comments": "^3.1.1" + "license": "Apache-2.0", + "dependencies": { + "@types/json-schema": "^7.0.15" }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + } + }, + "node_modules/@eslint/object-schema": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-3.0.5.tgz", + "integrity": "sha512-vqTaUEgxzm+YDSdElad6PiRoX4t8VGDjCtt05zn4nU810UIx/uNEV7/lZJ6KwFThKZOzOxzXy48da+No7HZaMw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + } + }, + "node_modules/@eslint/plugin-kit": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.7.2.tgz", + "integrity": "sha512-+CNAzxglkrpNf/kKywqQfk74QjtceuOE7Qm+AF8miRvPF/wmmK5+OJOgVh3AVTT3RP2mH3+FOaxlE5v72owk0A==", + "dev": true, + "license": "Apache-2.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 - }, - "debug": { - "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" - } - }, - "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" - } - }, - "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 - } + "@eslint/core": "^1.2.1", + "levn": "^0.4.1" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" } }, - "@humanwhocodes/config-array": { - "version": "0.9.5", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.9.5.tgz", - "integrity": "sha512-ObyMyWxZiCu/yTisA7uzx81s40xR2fD5Cg/2Kq7G02ajkNubJf6BopgDTmDyc3U7sXpNKM8cYOw7s7Tyr+DnCw==", + "node_modules/@humanfs/core": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.2.tgz", + "integrity": "sha512-UhXNm+CFMWcbChXywFwkmhqjs3PRCmcSa/hfBgLIb7oQ5HNb1wS0icWsGtSAUNgefHeI+eBrA8I1fxmbHsGdvA==", "dev": true, - "requires": { - "@humanwhocodes/object-schema": "^1.2.1", - "debug": "^4.1.1", - "minimatch": "^3.0.4" + "license": "Apache-2.0", + "dependencies": { + "@humanfs/types": "^0.15.0" }, + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node": { + "version": "0.16.8", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.8.tgz", + "integrity": "sha512-gE1eQNZ3R++kTzFUpdGlpmy8kDZD/MLyHqDwqjkVQI0JMdI1D51sy1H958PNXYkM2rAac7e5/CnIKZrHtPh3BQ==", + "dev": true, + "license": "Apache-2.0", "dependencies": { - "debug": { - "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" - } - }, - "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 - } + "@humanfs/core": "^0.19.2", + "@humanfs/types": "^0.15.0", + "@humanwhocodes/retry": "^0.4.0" + }, + "engines": { + "node": ">=18.18.0" } }, - "@humanwhocodes/object-schema": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", - "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", - "dev": true + "node_modules/@humanfs/types": { + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/@humanfs/types/-/types-0.15.0.tgz", + "integrity": "sha512-ZZ1w0aoQkwuUuC7Yf+7sdeaNfqQiiLcSRbfI08oAxqLtpXQr9AIVX7Ay7HLDuiLYAaFPu8oBYNq/QIi9URHJ3Q==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18.0" + } }, - "@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==", + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", "dev": true, - "requires": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" + "license": "Apache-2.0", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" } }, - "@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 + "node_modules/@humanwhocodes/retry": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz", + "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } }, - "@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 + "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==", + "license": "ISC", + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } }, - "@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==", + "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==", + "license": "MIT", + "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==", + "license": "MIT" + }, + "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==", + "license": "MIT", + "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/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "license": "MIT", + "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/@isaacs/fs-minipass": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz", + "integrity": "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==", "dev": true, - "requires": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" + "license": "ISC", + "dependencies": { + "minipass": "^7.0.4" + }, + "engines": { + "node": ">=18.0.0" } }, - "@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/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } }, - "@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==", + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", "dev": true, - "requires": { - "@jridgewell/resolve-uri": "3.1.0", - "@jridgewell/sourcemap-codec": "1.4.14" + "license": "MIT", + "engines": { + "node": ">=6.0.0" } }, - "@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "node_modules/@jridgewell/source-map": { + "version": "0.3.11", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.11.tgz", + "integrity": "sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==", "dev": true, - "requires": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25" } }, - "@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@lukeed/csprng": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@lukeed/csprng/-/csprng-1.1.0.tgz", + "integrity": "sha512-Z7C/xXCiGWsg0KuKsHTKJxbWhpI3Vs5GwLfOean7MGyVFGqdRgBbAjOCh6u4bbjPc/8MJ2pZmK/0DLdCbivLDA==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@lukeed/uuid": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@lukeed/uuid/-/uuid-2.0.1.tgz", + "integrity": "sha512-qC72D4+CDdjGqJvkFMMEAtancHUQ7/d/tAiHf64z8MopFDmcrtbcJuerDtFceuAfQJ2pDSfCKCtbqoGBNnwg0w==", + "license": "MIT", + "dependencies": { + "@lukeed/csprng": "^1.1.0" + }, + "engines": { + "node": ">=8" + } }, - "@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "node_modules/@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": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" + "license": "MIT", + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@redhat-developer/vscode-extension-proposals": { + "version": "0.0.23", + "resolved": "https://registry.npmjs.org/@redhat-developer/vscode-extension-proposals/-/vscode-extension-proposals-0.0.23.tgz", + "integrity": "sha512-ecJcUShveU2qFPvp/h/YaICRATQQAZarCQ+MApZmqWD1OC9ultnDHsSgqX2ircBX3d2Ni5mqRbKf+LlHQEFhKA==" + }, + "node_modules/@redhat-developer/vscode-redhat-telemetry": { + "version": "0.10.2", + "resolved": "https://registry.npmjs.org/@redhat-developer/vscode-redhat-telemetry/-/vscode-redhat-telemetry-0.10.2.tgz", + "integrity": "sha512-bkrwQN3J+VXbyk5fd173ezUq/uQxJuO2Sp1CXUwGmxf8KExFbCMUaTdXeJPdoFVMtY4sA5wyJ5EZNTtltSMiDQ==", + "license": "Apache-2.0", + "dependencies": { + "@segment/analytics-node": "2.3.0", + "countries-and-timezones": "^3.4.1", + "getos": "^3.2.1", + "object-hash": "^3.0.0", + "os-locale": "^5.0.0", + "picomatch": "^4.0.2", + "ua-parser-js": "1.0.39", + "uuid": "^11.0.3" + } + }, + "node_modules/@redhat-developer/vscode-redhat-telemetry/node_modules/object-hash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", + "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/@redhat-developer/vscode-redhat-telemetry/node_modules/picomatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/@redhat-developer/vscode-redhat-telemetry/node_modules/uuid": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-11.1.0.tgz", + "integrity": "sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "license": "MIT", + "bin": { + "uuid": "dist/esm/bin/uuid" + } + }, + "node_modules/@segment/analytics-core": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/@segment/analytics-core/-/analytics-core-1.8.2.tgz", + "integrity": "sha512-5FDy6l8chpzUfJcNlIcyqYQq4+JTUynlVoCeCUuVz+l+6W0PXg+ljKp34R4yLVCcY5VVZohuW+HH0VLWdwYVAg==", + "license": "MIT", + "dependencies": { + "@lukeed/uuid": "^2.0.0", + "@segment/analytics-generic-utils": "1.2.0", + "dset": "^3.1.4", + "tslib": "^2.4.1" + } + }, + "node_modules/@segment/analytics-core/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==", + "license": "0BSD" + }, + "node_modules/@segment/analytics-generic-utils": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@segment/analytics-generic-utils/-/analytics-generic-utils-1.2.0.tgz", + "integrity": "sha512-DfnW6mW3YQOLlDQQdR89k4EqfHb0g/3XvBXkovH1FstUN93eL1kfW9CsDcVQyH3bAC5ZsFyjA/o/1Q2j0QeoWw==", + "license": "MIT", + "dependencies": { + "tslib": "^2.4.1" + } + }, + "node_modules/@segment/analytics-generic-utils/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==", + "license": "0BSD" + }, + "node_modules/@segment/analytics-node": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@segment/analytics-node/-/analytics-node-2.3.0.tgz", + "integrity": "sha512-fOXLL8uY0uAWw/sTLmezze80hj8YGgXXlAfvSS6TUmivk4D/SP0C0sxnbpFdkUzWg2zT64qWIZj26afEtSnxUA==", + "license": "MIT", + "dependencies": { + "@lukeed/uuid": "^2.0.0", + "@segment/analytics-core": "1.8.2", + "@segment/analytics-generic-utils": "1.2.0", + "buffer": "^6.0.3", + "jose": "^5.1.0", + "node-fetch": "^2.6.7", + "tslib": "^2.4.1" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@segment/analytics-node/node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "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" } }, - "@sinonjs/commons": { - "version": "1.8.3", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.3.tgz", - "integrity": "sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ==", + "node_modules/@segment/analytics-node/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==", + "license": "0BSD" + }, + "node_modules/@sinonjs/commons": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-2.0.0.tgz", + "integrity": "sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg==", "dev": true, - "requires": { + "dependencies": { "type-detect": "4.0.8" } }, - "@sinonjs/fake-timers": { + "node_modules/@sinonjs/fake-timers": { "version": "9.1.2", "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-9.1.2.tgz", "integrity": "sha512-BPS4ynJW/o92PUR4wgriz2Ud5gpST5vz6GQfMixEDK0Z8ZCUv2M7SkBLykH56T++Xs+8ln9zTGbOvNGIe02/jw==", "dev": true, - "requires": { + "dependencies": { "@sinonjs/commons": "^1.7.0" } }, - "@sinonjs/samsam": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-6.1.1.tgz", - "integrity": "sha512-cZ7rKJTLiE7u7Wi/v9Hc2fs3Ucc3jrWeMgPHbbTCeVAB2S0wOBbYlkJVeNSL04i7fdhT8wIbDq1zhC/PXTD2SA==", + "node_modules/@sinonjs/fake-timers/node_modules/@sinonjs/commons": { + "version": "1.8.6", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.6.tgz", + "integrity": "sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ==", + "dev": true, + "dependencies": { + "type-detect": "4.0.8" + } + }, + "node_modules/@sinonjs/samsam": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-7.0.1.tgz", + "integrity": "sha512-zsAk2Jkiq89mhZovB2LLOdTCxJF4hqqTToGP0ASWlhp4I1hqOjcfmZGafXntCN7MDC6yySH0mFHrYtHceOeLmw==", "dev": true, - "requires": { - "@sinonjs/commons": "^1.6.0", + "dependencies": { + "@sinonjs/commons": "^2.0.0", "lodash.get": "^4.4.2", "type-detect": "^4.0.8" } }, - "@sinonjs/text-encoding": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/@sinonjs/text-encoding/-/text-encoding-0.7.1.tgz", - "integrity": "sha512-+iTbntw2IZPb/anVDbypzfQa+ay64MW0Zo8aJ8gZPWMMK6/OubMVb6lUPMagqjOPnmtauXnFCACVl3O7ogjeqQ==", + "node_modules/@sinonjs/text-encoding": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/@sinonjs/text-encoding/-/text-encoding-0.7.3.tgz", + "integrity": "sha512-DE427ROAphMQzU4ENbliGYrBSYPXF+TtLg9S8vzeA+OF4ZKzoDdzfL8sxuMUGS/lgRhM6j1URSk9ghf7Xo1tyA==", "dev": true }, - "@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 + "node_modules/@stylistic/eslint-plugin": { + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/@stylistic/eslint-plugin/-/eslint-plugin-5.10.0.tgz", + "integrity": "sha512-nPK52ZHvot8Ju/0A4ucSX1dcPV2/1clx0kLcH5wDmrE4naKso7TUC/voUyU1O9OTKTrR6MYip6LP0ogEMQ9jPQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.9.1", + "@typescript-eslint/types": "^8.56.0", + "eslint-visitor-keys": "^4.2.1", + "espree": "^10.4.0", + "estraverse": "^5.3.0", + "picomatch": "^4.0.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "peerDependencies": { + "eslint": "^9.0.0 || ^10.0.0" + } + }, + "node_modules/@stylistic/eslint-plugin/node_modules/eslint-visitor-keys": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@stylistic/eslint-plugin/node_modules/espree": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", + "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.15.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^4.2.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@stylistic/eslint-plugin/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } }, - "@types/eslint": { - "version": "7.2.10", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-7.2.10.tgz", - "integrity": "sha512-kUEPnMKrqbtpCq/KTaGFFKAcz6Ethm2EjCoKIDaCmfRBWLbFuTcOJfTlorwbnboXBzahqWLgUp1BQeKHiJzPUQ==", + "node_modules/@stylistic/eslint-plugin/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, - "requires": { + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/@types/eslint": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-9.6.1.tgz", + "integrity": "sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==", + "dev": true, + "license": "MIT", + "dependencies": { "@types/estree": "*", "@types/json-schema": "*" } }, - "@types/eslint-scope": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.0.tgz", - "integrity": "sha512-O/ql2+rrCUe2W2rs7wMR+GqPRcgB6UiqN5RhrR5xruFlY7l9YLMn0ZkDzjoHLeiFkR8MCQZVudUuuvQ2BLC9Qw==", + "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, - "requires": { + "license": "MIT", + "dependencies": { "@types/eslint": "*", "@types/estree": "*" } }, - "@types/estree": { - "version": "0.0.47", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.47.tgz", - "integrity": "sha512-c5ciR06jK8u9BstrmJyO97m+klJrrhCf9u3rLu3DEAJBirxRqSCvDQoYKmxuYwQI5SZChAWu+tq9oVlGRuzPAg==", - "dev": true + "node_modules/@types/esrecurse": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@types/esrecurse/-/esrecurse-4.3.1.tgz", + "integrity": "sha512-xJBAbDifo5hpffDBuHl0Y8ywswbiAp/Wi7Y/GtAgSlZyIABppyurxVueOPE8LUQOxdlgi6Zqce7uoEpqNTeiUw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/estree": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "dev": true, + "license": "MIT" }, - "@types/fs-extra": { + "node_modules/@types/fs-extra": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-8.0.0.tgz", "integrity": "sha512-bCtL5v9zdbQW86yexOlXWTEGvLNqWxMFyi7gQA7Gcthbezr2cPSOb8SkESVKA937QD5cIwOFLDFt0MQoXOEr9Q==", "dev": true, - "requires": { + "dependencies": { "@types/node": "*" } }, - "@types/glob": { + "node_modules/@types/glob": { "version": "5.0.30", "resolved": "https://registry.npmjs.org/@types/glob/-/glob-5.0.30.tgz", "integrity": "sha1-ECZAnFYlqGiQdGAoCNCCsoZ7ilE=", "dev": true, - "requires": { + "dependencies": { "@types/minimatch": "*", "@types/node": "*" } }, - "@types/json-schema": { - "version": "7.0.7", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.7.tgz", - "integrity": "sha512-cxWFQVseBm6O9Gbw1IWb8r6OS4OhSt3hPZLkFApLjM8TEXROBuQGLAH2i2gZpcXdLBIrpXuTDhH7Vbm1iXmNGA==", + "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 }, - "@types/lodash": { + "node_modules/@types/lodash": { "version": "4.14.146", "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.146.tgz", "integrity": "sha512-JzJcmQ/ikHSv7pbvrVNKJU5j9jL9VLf3/gqs048CEnBVVVEv4kve3vLxoPHGvclutS+Il4SBIuQQ087m1eHffw==", "dev": true }, - "@types/lodash.findindex": { + "node_modules/@types/lodash.findindex": { "version": "4.6.6", "resolved": "https://registry.npmjs.org/@types/lodash.findindex/-/lodash.findindex-4.6.6.tgz", "integrity": "sha512-quPh7tw70yhryaubH6wBvgIQgeU1PFjdoT4eaW6WCKzjIlxgImLKIv4bvJhMTUlRkMgf5VAfECKKXKuB8cexgw==", "dev": true, - "requires": { + "dependencies": { "@types/lodash": "*" } }, - "@types/minimatch": { + "node_modules/@types/minimatch": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz", "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==", "dev": true }, - "@types/mocha": { + "node_modules/@types/mocha": { "version": "5.2.5", "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-5.2.5.tgz", "integrity": "sha512-lAVp+Kj54ui/vLUFxsJTMtWvZraZxum3w3Nwkble2dNuV5VnPA+Mi2oGX9XYJAaIvZi3tn3cbjS/qcJXRb6Bww==", "dev": true }, - "@types/node": { - "version": "16.18.12", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.12.tgz", - "integrity": "sha512-vzLe5NaNMjIE3mcddFVGlAXN1LEWueUsMsOJWaT6wWMJGyljHAWHznqfnKUQWGzu7TLPrGvWdNAsvQYW+C0xtw==", + "node_modules/@types/node": { + "version": "18.18.8", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.18.8.tgz", + "integrity": "sha512-OLGBaaK5V3VRBS1bAkMVP2/W9B+H8meUfl866OrMNQqt7wDgdpWPp5o6gmIc9pB+lIQHSq4ZL8ypeH1vPxcPaQ==", + "dev": true, + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "node_modules/@types/prop-types": { + "version": "15.7.5", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz", + "integrity": "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==", + "dev": true + }, + "node_modules/@types/react": { + "version": "17.0.53", + "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.53.tgz", + "integrity": "sha512-1yIpQR2zdYu1Z/dc1OxC+MA6GR240u3gcnP4l6mvj/PJiVaqHsQPmWttsvHsfnhfPbU2FuGmo0wSITPygjBmsw==", + "dev": true, + "dependencies": { + "@types/prop-types": "*", + "@types/scheduler": "*", + "csstype": "^3.0.2" + } + }, + "node_modules/@types/react-dom": { + "version": "17.0.19", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-17.0.19.tgz", + "integrity": "sha512-PiYG40pnQRdPHnlf7tZnp0aQ6q9tspYr72vD61saO6zFCybLfMqwUCN0va1/P+86DXn18ZWeW30Bk7xlC5eEAQ==", + "dev": true, + "dependencies": { + "@types/react": "^17" + } + }, + "node_modules/@types/scheduler": { + "version": "0.16.2", + "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.2.tgz", + "integrity": "sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==", "dev": true }, - "@types/semver": { + "node_modules/@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/sinon": { + "node_modules/@types/sinon": { "version": "10.0.13", - "resolved": "https://repository.engineering.redhat.com/nexus/repository/registry.npmjs.org/@types/sinon/-/sinon-10.0.13.tgz", + "resolved": "https://registry.npmjs.org/@types/sinon/-/sinon-10.0.13.tgz", "integrity": "sha512-UVjDqJblVNQYvVNUsj0PuYYw0ELRmgt1Nt5Vk0pT5f16ROGfcKJY8o1HVuMOJOpD727RrGB9EGvoaTQE5tgxZQ==", "dev": true, - "requires": { + "dependencies": { "@types/sinonjs__fake-timers": "*" } }, - "@types/sinonjs__fake-timers": { + "node_modules/@types/sinonjs__fake-timers": { "version": "8.1.2", "resolved": "https://registry.npmjs.org/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-8.1.2.tgz", "integrity": "sha512-9GcLXF0/v3t80caGs5p2rRfkB+a8VBGLJZVih6CNFkx8IZ994wiKKLSRs9nuFwk1HevWs/1mnUmkApGrSGsShA==", "dev": true }, - "@types/vscode": { - "version": "1.75.1", - "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.75.1.tgz", - "integrity": "sha512-emg7wdsTFzdi+elvoyoA+Q8keEautdQHyY5LNmHVM4PTpY8JgOTVADrGVyXGepJ6dVW2OS5/xnLUWh+nZxvdiA==", + "node_modules/@types/triple-beam": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@types/triple-beam/-/triple-beam-1.3.2.tgz", + "integrity": "sha512-txGIh+0eDFzKGC25zORnswy+br1Ha7hj5cMVwKIU7+s0U2AxxJru/jZSMU6OC9MJWP6+pc/hc6ZjyZShpsyY2g==" + }, + "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==", + "dev": true + }, + "node_modules/@types/vscode-webview": { + "version": "1.57.1", + "resolved": "https://registry.npmjs.org/@types/vscode-webview/-/vscode-webview-1.57.1.tgz", + "integrity": "sha512-ghW5SfuDmsGDS2A4xkvGsLwDRNc3Vj5rS6rPOyPm/IryZuf3wceZKxgYaUoW+k9f0f/CB7y2c1rRsdOWZWn0PQ==", "dev": true }, - "@types/winreg": { + "node_modules/@types/winreg": { "version": "1.2.30", "resolved": "https://registry.npmjs.org/@types/winreg/-/winreg-1.2.30.tgz", "integrity": "sha1-kdZxDlNtNFucmwF8V0z2qNpkxRg=", "dev": true }, - "@types/winston": { + "node_modules/@types/winston": { "version": "2.4.4", "resolved": "https://registry.npmjs.org/@types/winston/-/winston-2.4.4.tgz", "integrity": "sha512-BVGCztsypW8EYwJ+Hq+QNYiT/MUyCif0ouBH+flrY66O5W+KIXAMML6E/0fJpm7VjIzgangahl5S03bJJQGrZw==", + "deprecated": "This is a stub types definition. winston provides its own type definitions, so you do not need this installed.", "dev": true, - "requires": { + "dependencies": { "winston": "*" } }, - "@typescript-eslint/eslint-plugin": { - "version": "5.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.18.0.tgz", - "integrity": "sha512-tzrmdGMJI/uii9/V6lurMo4/o+dMTKDH82LkNjhJ3adCW22YQydoRs5MwTiqxGF9CSYxPxQ7EYb4jLNlIs+E+A==", + "node_modules/@typescript-eslint/project-service": { + "version": "8.65.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.65.0.tgz", + "integrity": "sha512-SxnPhbTsGahizDgbu7oqFH/xVtzIqMd/s+WtnSxNxJZJpLbdT5IPdzg8EZxO3+PoKahXmwJLeNQOpKJb3/bi7Q==", "dev": true, - "requires": { - "@typescript-eslint/scope-manager": "5.18.0", - "@typescript-eslint/type-utils": "5.18.0", - "@typescript-eslint/utils": "5.18.0", - "debug": "^4.3.2", - "functional-red-black-tree": "^1.0.1", - "ignore": "^5.1.8", - "regexpp": "^3.2.0", - "semver": "^7.3.5", - "tsutils": "^3.21.0" - }, - "dependencies": { - "debug": { - "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" - } - }, - "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 - }, - "tsutils": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", - "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", - "dev": true, - "requires": { - "tslib": "^1.8.1" - } - } + "license": "MIT", + "dependencies": { + "@typescript-eslint/tsconfig-utils": "^8.65.0", + "@typescript-eslint/types": "^8.65.0", + "debug": "^4.4.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.1.0" } }, - "@typescript-eslint/parser": { - "version": "5.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.18.0.tgz", - "integrity": "sha512-+08nYfurBzSSPndngnHvFw/fniWYJ5ymOrn/63oMIbgomVQOvIDhBoJmYZ9lwQOCnQV9xHGvf88ze3jFGUYooQ==", + "node_modules/@typescript-eslint/tsconfig-utils": { + "version": "8.65.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.65.0.tgz", + "integrity": "sha512-j6GzGqCiRdA7Qhur2VVmKZAkBLfnHFQfx4TaJGL9RMveZqCo48jSHHO0DTgizEnGhtWnqmbtCUSrqSkdiY/0Hg==", "dev": true, - "requires": { - "@typescript-eslint/scope-manager": "5.18.0", - "@typescript-eslint/types": "5.18.0", - "@typescript-eslint/typescript-estree": "5.18.0", - "debug": "^4.3.2" + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, - "dependencies": { - "debug": { - "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" - } - }, - "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 - } + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.1.0" } }, - "@typescript-eslint/scope-manager": { - "version": "5.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.18.0.tgz", - "integrity": "sha512-C0CZML6NyRDj+ZbMqh9FnPscg2PrzSaVQg3IpTmpe0NURMVBXlghGZgMYqBw07YW73i0MCqSDqv2SbywnCS8jQ==", + "node_modules/@typescript-eslint/types": { + "version": "8.65.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.65.0.tgz", + "integrity": "sha512-JSSwWNy+H0E/01jJEM+hrX6N0OFDzFzeIhHFSAS01tlVaevpG8cFyYRPhS5yjGOvBUx3sqQHVMjCL1CAZZMxBg==", "dev": true, - "requires": { - "@typescript-eslint/types": "5.18.0", - "@typescript-eslint/visitor-keys": "5.18.0" + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "@typescript-eslint/type-utils": { - "version": "5.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.18.0.tgz", - "integrity": "sha512-vcn9/6J5D6jtHxpEJrgK8FhaM8r6J1/ZiNu70ZUJN554Y3D9t3iovi6u7JF8l/e7FcBIxeuTEidZDR70UuCIfA==", + "node_modules/@vscode/codicons": { + "version": "0.0.32", + "resolved": "https://registry.npmjs.org/@vscode/codicons/-/codicons-0.0.32.tgz", + "integrity": "sha512-3lgSTWhAzzWN/EPURoY4ZDBEA80OPmnaknNujA3qnI4Iu7AONWd9xF3iE4L+4prIe8E3TUnLQ4pxoaFTEEZNwg==" + }, + "node_modules/@vscode/test-electron": { + "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": { - "@typescript-eslint/utils": "5.18.0", - "debug": "^4.3.2", - "tsutils": "^3.21.0" + "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": ">=22" + } + }, + "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": { - "debug": { - "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" - } - }, - "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 - }, - "tsutils": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", - "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", - "dev": true, - "requires": { - "tslib": "^1.8.1" - } - } + "@webassemblyjs/helper-numbers": "1.13.2", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2" } }, - "@typescript-eslint/types": { - "version": "5.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.18.0.tgz", - "integrity": "sha512-bhV1+XjM+9bHMTmXi46p1Led5NP6iqQcsOxgx7fvk6gGiV48c6IynY0apQb7693twJDsXiVzNXTflhplmaiJaw==", - "dev": true + "node_modules/@webassemblyjs/floating-point-hex-parser": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz", + "integrity": "sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==", + "dev": true, + "license": "MIT" }, - "@typescript-eslint/typescript-estree": { - "version": "5.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.18.0.tgz", - "integrity": "sha512-wa+2VAhOPpZs1bVij9e5gyVu60ReMi/KuOx4LKjGx2Y3XTNUDJgQ+5f77D49pHtqef/klglf+mibuHs9TrPxdQ==", + "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, - "requires": { - "@typescript-eslint/types": "5.18.0", - "@typescript-eslint/visitor-keys": "5.18.0", - "debug": "^4.3.2", - "globby": "^11.0.4", - "is-glob": "^4.0.3", - "semver": "^7.3.5", - "tsutils": "^3.21.0" - }, - "dependencies": { - "debug": { - "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" - } - }, - "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 - }, - "tsutils": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", - "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", - "dev": true, - "requires": { - "tslib": "^1.8.1" - } - } + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-buffer": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.14.1.tgz", + "integrity": "sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-numbers": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.13.2.tgz", + "integrity": "sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/floating-point-hex-parser": "1.13.2", + "@webassemblyjs/helper-api-error": "1.13.2", + "@xtuc/long": "4.2.2" } }, - "@typescript-eslint/utils": { - "version": "5.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.18.0.tgz", - "integrity": "sha512-+hFGWUMMri7OFY26TsOlGa+zgjEy1ssEipxpLjtl4wSll8zy85x0GrUSju/FHdKfVorZPYJLkF3I4XPtnCTewA==", + "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, - "requires": { - "@types/json-schema": "^7.0.9", - "@typescript-eslint/scope-manager": "5.18.0", - "@typescript-eslint/types": "5.18.0", - "@typescript-eslint/typescript-estree": "5.18.0", - "eslint-scope": "^5.1.1", - "eslint-utils": "^3.0.0" - }, - "dependencies": { - "@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 - } + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-wasm-section": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.14.1.tgz", + "integrity": "sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/wasm-gen": "1.14.1" } }, - "@typescript-eslint/visitor-keys": { - "version": "5.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.18.0.tgz", - "integrity": "sha512-Hf+t+dJsjAKpKSkg3EHvbtEpFFb/1CiOHnvI8bjHgOD4/wAw3gKrA0i94LrbekypiZVanJu3McWJg7rWDMzRTg==", + "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, - "requires": { - "@typescript-eslint/types": "5.18.0", - "eslint-visitor-keys": "^3.0.0" + "license": "MIT", + "dependencies": { + "@xtuc/ieee754": "^1.2.0" } }, - "@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/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" - }, - "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==", - "dev": true, - "requires": { - "debug": "4" - } - }, - "debug": { - "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" - } - }, - "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, - "requires": { - "@tootallnate/once": "1", - "agent-base": "6", - "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==", - "dev": true, - "requires": { - "agent-base": "6", - "debug": "4" - } - }, - "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 - }, - "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" - } - } - } - }, - "@webassemblyjs/ast": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.0.tgz", - "integrity": "sha512-kX2W49LWsbthrmIRMbQZuQDhGtjyqXfEmmHyEi4XWnSZtPmxY0+3anPIzsnRb45VH/J55zlOfWvZuY47aJZTJg==", - "dev": true, - "requires": { - "@webassemblyjs/helper-numbers": "1.11.0", - "@webassemblyjs/helper-wasm-bytecode": "1.11.0" - } - }, - "@webassemblyjs/floating-point-hex-parser": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.0.tgz", - "integrity": "sha512-Q/aVYs/VnPDVYvsCBL/gSgwmfjeCb4LW8+TMrO3cSzJImgv8lxxEPM2JA5jMrivE7LSz3V+PFqtMbls3m1exDA==", - "dev": true - }, - "@webassemblyjs/helper-api-error": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.0.tgz", - "integrity": "sha512-baT/va95eXiXb2QflSx95QGT5ClzWpGaa8L7JnJbgzoYeaA27FCvuBXU758l+KXWRndEmUXjP0Q5fibhavIn8w==", - "dev": true - }, - "@webassemblyjs/helper-buffer": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.0.tgz", - "integrity": "sha512-u9HPBEl4DS+vA8qLQdEQ6N/eJQ7gT7aNvMIo8AAWvAl/xMrcOSiI2M0MAnMCy3jIFke7bEee/JwdX1nUpCtdyA==", - "dev": true - }, - "@webassemblyjs/helper-numbers": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.0.tgz", - "integrity": "sha512-DhRQKelIj01s5IgdsOJMKLppI+4zpmcMQ3XboFPLwCpSNH6Hqo1ritgHgD0nqHeSYqofA6aBN/NmXuGjM1jEfQ==", + "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, - "requires": { - "@webassemblyjs/floating-point-hex-parser": "1.11.0", - "@webassemblyjs/helper-api-error": "1.11.0", + "license": "Apache-2.0", + "dependencies": { "@xtuc/long": "4.2.2" } }, - "@webassemblyjs/helper-wasm-bytecode": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.0.tgz", - "integrity": "sha512-MbmhvxXExm542tWREgSFnOVo07fDpsBJg3sIl6fSp9xuu75eGz5lz31q7wTLffwL3Za7XNRCMZy210+tnsUSEA==", - "dev": true + "node_modules/@webassemblyjs/utf8": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.13.2.tgz", + "integrity": "sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==", + "dev": true, + "license": "MIT" }, - "@webassemblyjs/helper-wasm-section": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.0.tgz", - "integrity": "sha512-3Eb88hcbfY/FCukrg6i3EH8H2UsD7x8Vy47iVJrP967A9JGqgBVL9aH71SETPx1JrGsOUVLo0c7vMCN22ytJew==", + "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, - "requires": { - "@webassemblyjs/ast": "1.11.0", - "@webassemblyjs/helper-buffer": "1.11.0", - "@webassemblyjs/helper-wasm-bytecode": "1.11.0", - "@webassemblyjs/wasm-gen": "1.11.0" + "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" } }, - "@webassemblyjs/ieee754": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.0.tgz", - "integrity": "sha512-KXzOqpcYQwAfeQ6WbF6HXo+0udBNmw0iXDmEK5sFlmQdmND+tr773Ti8/5T/M6Tl/413ArSJErATd8In3B+WBA==", + "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, - "requires": { - "@xtuc/ieee754": "^1.2.0" + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/ieee754": "1.13.2", + "@webassemblyjs/leb128": "1.13.2", + "@webassemblyjs/utf8": "1.13.2" } }, - "@webassemblyjs/leb128": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.0.tgz", - "integrity": "sha512-aqbsHa1mSQAbeeNcl38un6qVY++hh8OpCOzxhixSYgbRfNWcxJNJQwe2rezK9XEcssJbbWIkblaJRwGMS9zp+g==", + "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, - "requires": { - "@xtuc/long": "4.2.2" + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/wasm-gen": "1.14.1", + "@webassemblyjs/wasm-parser": "1.14.1" } }, - "@webassemblyjs/utf8": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.0.tgz", - "integrity": "sha512-A/lclGxH6SpSLSyFowMzO/+aDEPU4hvEiooCMXQPcQFPPJaYcPQNKGOCLUySJsYJ4trbpr+Fs08n4jelkVTGVw==", - "dev": true - }, - "@webassemblyjs/wasm-edit": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.0.tgz", - "integrity": "sha512-JHQ0damXy0G6J9ucyKVXO2j08JVJ2ntkdJlq1UTiUrIgfGMmA7Ik5VdC/L8hBK46kVJgujkBIoMtT8yVr+yVOQ==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.11.0", - "@webassemblyjs/helper-buffer": "1.11.0", - "@webassemblyjs/helper-wasm-bytecode": "1.11.0", - "@webassemblyjs/helper-wasm-section": "1.11.0", - "@webassemblyjs/wasm-gen": "1.11.0", - "@webassemblyjs/wasm-opt": "1.11.0", - "@webassemblyjs/wasm-parser": "1.11.0", - "@webassemblyjs/wast-printer": "1.11.0" - } - }, - "@webassemblyjs/wasm-gen": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.0.tgz", - "integrity": "sha512-BEUv1aj0WptCZ9kIS30th5ILASUnAPEvE3tVMTrItnZRT9tXCLW2LEXT8ezLw59rqPP9klh9LPmpU+WmRQmCPQ==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.11.0", - "@webassemblyjs/helper-wasm-bytecode": "1.11.0", - "@webassemblyjs/ieee754": "1.11.0", - "@webassemblyjs/leb128": "1.11.0", - "@webassemblyjs/utf8": "1.11.0" - } - }, - "@webassemblyjs/wasm-opt": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.0.tgz", - "integrity": "sha512-tHUSP5F4ywyh3hZ0+fDQuWxKx3mJiPeFufg+9gwTpYp324mPCQgnuVKwzLTZVqj0duRDovnPaZqDwoyhIO8kYg==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.11.0", - "@webassemblyjs/helper-buffer": "1.11.0", - "@webassemblyjs/wasm-gen": "1.11.0", - "@webassemblyjs/wasm-parser": "1.11.0" - } - }, - "@webassemblyjs/wasm-parser": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.0.tgz", - "integrity": "sha512-6L285Sgu9gphrcpDXINvm0M9BskznnzJTE7gYkjDbxET28shDqp27wpruyx3C2S/dvEwiigBwLA1cz7lNUi0kw==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.11.0", - "@webassemblyjs/helper-api-error": "1.11.0", - "@webassemblyjs/helper-wasm-bytecode": "1.11.0", - "@webassemblyjs/ieee754": "1.11.0", - "@webassemblyjs/leb128": "1.11.0", - "@webassemblyjs/utf8": "1.11.0" - } - }, - "@webassemblyjs/wast-printer": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.0.tgz", - "integrity": "sha512-Fg5OX46pRdTgB7rKIUojkh9vXaVN6sGYCnEiJN1GYkb0RPwShZXp6KTDqmoMdQPKhcroOXh3fEzmkWmCYaKYhQ==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.11.0", - "@xtuc/long": "4.2.2" + "node_modules/@webassemblyjs/wasm-parser": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz", + "integrity": "sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-api-error": "1.13.2", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/ieee754": "1.13.2", + "@webassemblyjs/leb128": "1.13.2", + "@webassemblyjs/utf8": "1.13.2" } }, - "@webpack-cli/configtest": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-1.0.2.tgz", - "integrity": "sha512-3OBzV2fBGZ5TBfdW50cha1lHDVf9vlvRXnjpVbJBa20pSZQaSkMJZiwA8V2vD9ogyeXn8nU5s5A6mHyf5jhMzA==", - "dev": true - }, - "@webpack-cli/info": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-1.2.3.tgz", - "integrity": "sha512-lLek3/T7u40lTqzCGpC6CAbY6+vXhdhmwFRxZLMnRm6/sIF/7qMpT8MocXCRQfz0JAh63wpbXLMnsQ5162WS7Q==", + "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, - "requires": { - "envinfo": "^7.7.3" + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@xtuc/long": "4.2.2" } }, - "@webpack-cli/serve": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-1.3.1.tgz", - "integrity": "sha512-0qXvpeYO6vaNoRBI52/UsbcaBydJCggoBBnIo/ovQQdn6fug0BgwsjorV1hVS7fMqGVTZGcVxv8334gjmbj5hw==", - "dev": true - }, - "@xtuc/ieee754": { + "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 + "dev": true, + "license": "BSD-3-Clause" }, - "@xtuc/long": { + "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 + "dev": true, + "license": "Apache-2.0" }, - "acorn": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.1.1.tgz", - "integrity": "sha512-xYiIVjNuqtKXMxlRMDc6mZUhXehod4a3gbZ1qRlM7icK4EbxUFNLhWoPblCvFtB2Y9CIqHP3CF/rdxLItaQv8g==", - "dev": true + "node_modules/acorn": { + "version": "8.17.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.17.0.tgz", + "integrity": "sha512-xRQbDb9BnwDafYNn6Vwl839DYVjqXYb1XVGtWAZ1kcDc6iwAL4hg3B1dZlRiuENFeO2H53gFG3in621AdERVAg==", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } }, - "acorn-jsx": { + "node_modules/acorn-import-phases": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/acorn-import-phases/-/acorn-import-phases-1.0.4.tgz", + "integrity": "sha512-wKmbr/DDiIXzEOiWrTTUcDm24kQ2vGfZQvM2fwg2vXqR5uW6aapr7ObPtj1th32b9u90/Pf4AItvdTh42fBmVQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.13.0" + }, + "peerDependencies": { + "acorn": "^8.14.0" + } + }, + "node_modules/acorn-jsx": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true + "dev": true, + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } }, - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "node_modules/agent-base": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", + "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==", "dev": true, - "requires": { + "license": "MIT", + "engines": { + "node": ">= 14" + } + }, + "node_modules/ajv": { + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz", + "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==", + "dev": true, + "license": "MIT", + "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" } }, - "ajv-formats": { + "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, - "requires": { + "dependencies": { "ajv": "^8.0.0" }, - "dependencies": { + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { "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 + "optional": 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 - }, - "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-gray": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ansi-gray/-/ansi-gray-0.1.1.tgz", - "integrity": "sha1-KWLPVOyXksSFEKPetSRDaGHvclE=", + "node_modules/ajv-formats/node_modules/ajv": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", + "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", "dev": true, - "requires": { - "ansi-wrap": "0.1.0" + "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" } }, - "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": "2.2.1", - "resolved": "https://repository.engineering.redhat.com/nexus/repository/registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==", - "dev": true - }, - "ansi-wrap": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/ansi-wrap/-/ansi-wrap-0.1.0.tgz", - "integrity": "sha1-qCJQ3bABXponyoLoLqYDu/pF768=", + "node_modules/ajv-formats/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", "dev": true }, - "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" - } - }, - "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" + "node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, - "archive-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/archive-type/-/archive-type-4.0.0.tgz", - "integrity": "sha1-+S5yIzBW38aWlHJ0nCZ72wRrHXA=", - "dev": true, - "requires": { - "file-type": "^4.2.0" + "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==", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" } }, - "archy": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", - "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=", - "dev": true - }, - "argparse": { + "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 }, - "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" + "node_modules/async": { + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", + "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", + "dependencies": { + "lodash": "^4.17.14" } }, - "arr-flatten": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", - "integrity": "sha1-NgSLv/TntH4TZkQxbJlmnqWukfE=", - "dev": true + "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==" }, - "arr-map": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/arr-map/-/arr-map-2.0.2.tgz", - "integrity": "sha1-Onc0X/wc814qkYJWAfnljy4kysQ=", + "node_modules/base64-js": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz", + "integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==" + }, + "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, - "requires": { - "make-iterator": "^1.0.0" + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.js" } }, - "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-differ": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-1.0.0.tgz", - "integrity": "sha512-LeZY+DZDRnvP7eMuQ6LHfCzUGxAAIViUBliK24P3hWXL6y4SortgR6Nim6xrkfSLlmH0+k+9NYNwVC2s53ZrYQ==", - "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 - } + "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==", + "engines": { + "node": ">=8" } }, - "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" - }, + "node_modules/brace-expansion": { + "version": "5.0.9", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.9.tgz", + "integrity": "sha512-ScQ4IuvIEF1TMlP7Zt+vjJ//9zlPb2SDcxWxM3bk8s6t6GGdJ7KO1dCcTidOPJKePW30LE/2cT7wCyPho9/Wxg==", + "license": "MIT", "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 - } + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "20 || >=22" } }, - "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 + "node_modules/brace-expansion/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==", + "license": "MIT", + "engines": { + "node": "18 || 20 || >=22" + } }, - "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" - }, + "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": { - "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 - } + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" } }, - "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==", - "dev": true - }, - "array-uniq": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", - "integrity": "sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q==", - "dev": true - }, - "array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "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 }, - "asn1": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", - "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", + "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, - "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 - }, - "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": { - "version": "2.6.4", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", - "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", - "requires": { - "lodash": "^4.17.14" + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "baseline-browser-mapping": "^2.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" } }, - "async-done": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/async-done/-/async-done-1.3.2.tgz", - "integrity": "sha512-uYkTP8dw2og1tu1nmza1n1CMW0qb8gWWlwqMmLb7MhBVs4BXrFziT6HXUd+/RlRA/i4H9AkofYloUbs1fwMqlw==", + "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, - "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 + "license": "MIT" }, - "async-settle": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/async-settle/-/async-settle-1.0.0.tgz", - "integrity": "sha1-HQqRS7Aldb7IqPOnTlCA9yssDGs=", + "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, - "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 - }, - "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 - }, - "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" - } + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" }, - "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" - } + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" }, - "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" - } + { + "type": "github", + "url": "https://github.com/sponsors/ai" } - } - }, - "base64-js": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz", - "integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==", - "dev": true + ], + "license": "CC-BY-4.0" }, - "bcrypt-pbkdf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", + "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, - "requires": { - "tweetnacl": "^0.14.3" + "license": "MIT", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "beeper": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/beeper/-/beeper-1.1.1.tgz", - "integrity": "sha512-3vqtKL1N45I5dV0RdssXZG7X6pCqQrWPNOlBPZPrd+QkE2HEhR57Z04m0KtpbsZH73j+a3F8UD1TQnn+ExTvIA==", - "dev": true + "node_modules/chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "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" + } }, - "big-integer": { - "version": "1.6.51", - "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.51.tgz", - "integrity": "sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg==", - "dev": true + "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==", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } }, - "binary": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/binary/-/binary-0.3.0.tgz", - "integrity": "sha512-D4H1y5KYwpJgK8wk1Cue5LLPgmwHKYSChkbspQg5JtVuR5ulGckxfR62H3AE9UDkdMC8yyXlqYihuz3Aqg2XZg==", + "node_modules/chownr": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz", + "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==", "dev": true, - "requires": { - "buffers": "~0.1.1", - "chainsaw": "~0.1.0" + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=18" } }, - "binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==" + "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" + } }, - "bindings": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", - "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", + "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, - "optional": true, - "requires": { - "file-uri-to-path": "1.0.0" + "license": "MIT", + "dependencies": { + "restore-cursor": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "bl": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.3.tgz", - "integrity": "sha512-pvcNpa0UU69UT341rO6AYy4FVAIkUHuZXRIWbq+zHnsVcRzDDjIAhGuuYoi0d//cwIwtt4pkpKycWEfjdV+vww==", + "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, - "requires": { - "readable-stream": "^2.3.5", - "safe-buffer": "^5.1.1" + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "bluebird": { - "version": "3.4.7", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.4.7.tgz", - "integrity": "sha512-iD3898SR7sWVRHbiQv+sHUtHnMvC1o3nW5rAcqnq3uOn07DSAppZYUkIGslDz6gXC7HfunPe7YVBgoEJASPcHA==", - "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==", - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "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" - } - } - } - }, - "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 - }, - "browserslist": { - "version": "4.16.6", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.6.tgz", - "integrity": "sha512-Wspk/PqO+4W9qp5iUTJsa1B/QrYn1keNCcEP5OvP7WBwT4KaDly0uONYmC6Xa3Z5IqnUgS0KcgLYu1l74x0ZXQ==", - "dev": true, - "requires": { - "caniuse-lite": "^1.0.30001219", - "colorette": "^1.2.2", - "electron-to-chromium": "^1.3.723", - "escalade": "^3.1.1", - "node-releases": "^1.1.71" - } - }, - "buffer": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.6.0.tgz", - "integrity": "sha512-/gDYp/UtU0eA1ys8bOs9J6a+E/KWIY+DZ+Q2WESNUA0jFRsJOc0SNUO6xJ5SGA1xueg3NL65W6s+NY5l9cunuw==", - "dev": true, - "requires": { - "base64-js": "^1.0.2", - "ieee754": "^1.1.4" - } - }, - "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", - "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 - }, - "buffers": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/buffers/-/buffers-0.1.1.tgz", - "integrity": "sha512-9q/rDEGSb/Qsvv2qvzIzdluL5k7AaJOTrw23z9reQthrbF7is4CtlT0DXyO1oei2DCp4uojjzQ7igaSHp1kAEQ==", - "dev": true - }, - "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", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", - "dev": true, - "requires": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" - } - }, - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true - }, - "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.30001230", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001230.tgz", - "integrity": "sha512-5yBd5nWCBS+jWKTcHOzXwo5xzcj4ePE/yjtkZyUV1BTUmrBaA9MRGC+e7mxnqXSA90CmCA8L3eKLaSUkt099IQ==", - "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", - "integrity": "sha512-75kWfWt6MEKNC8xYXIdRpDehRYY/tNSgwKaJq+dbbDcxORuVrrQ+SEHoWsniVn9XPYfP4gmdWIeDk/4YNp1rNQ==", - "dev": true, - "requires": { - "traverse": ">=0.3.0 <0.4" - } - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://repository.engineering.redhat.com/nexus/repository/registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==", - "dev": true, - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - } - }, - "chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", - "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": { - "anymatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", - "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", - "requires": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - } - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "requires": { - "fill-range": "^7.0.1" - } - }, - "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==", - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "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" - } - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" - }, - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" - }, - "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==", - "requires": { - "is-number": "^7.0.0" - } - } - } - }, - "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 - }, - "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" - } - } - } - }, - "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": { + "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, - "requires": { + "license": "MIT", + "dependencies": { "is-plain-object": "^2.0.4", "kind-of": "^6.0.2", "shallow-clone": "^3.0.0" + }, + "engines": { + "node": ">=6" } }, - "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" - } - }, - "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 - }, - "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": { + "node_modules/color": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/color/-/color-3.0.0.tgz", "integrity": "sha512-jCpd5+s0s0t7p3pHQKpnJ0TpQKKdleP71LWcA0aqiljpiuAkOSUFN/dyH8ZwF0hRmFlrIuRhufds1QyEP9EB+w==", - "requires": { + "dependencies": { "color-convert": "^1.9.1", "color-string": "^1.5.2" } }, - "color-convert": { + "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==", - "requires": { + "dependencies": { "color-name": "1.1.3" } }, - "color-name": { + "node_modules/color-name": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" }, - "color-string": { + "node_modules/color-string": { "version": "1.5.5", "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.5.5.tgz", "integrity": "sha512-jgIoum0OfQfq9Whcfc2z/VhCNcmQjWbey6qBX0vqt7YICflUmBCh9E9CiQD5GSJ+Uehixm3NUwHVhqUAWRivZg==", - "requires": { + "dependencies": { "color-name": "^1.0.0", "simple-swizzle": "^0.2.2" } }, - "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.2.2", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.2.tgz", - "integrity": "sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w==", - "dev": true - }, - "colornames": { + "node_modules/colornames": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/colornames/-/colornames-1.1.1.tgz", "integrity": "sha1-+IiQMGhcfE/54qVZ9Qd+t2qBb5Y=" }, - "colors": { + "node_modules/colors": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/colors/-/colors-1.3.3.tgz", - "integrity": "sha512-mmGt/1pZqYRjMxB1axhTo16/snVZ5krrKkcmMeVKxzECMMXoCgnvTPp10QgHfcbQZw8Dq2jMNG6je4JlWU0gWg==" + "integrity": "sha512-mmGt/1pZqYRjMxB1axhTo16/snVZ5krrKkcmMeVKxzECMMXoCgnvTPp10QgHfcbQZw8Dq2jMNG6je4JlWU0gWg==", + "engines": { + "node": ">=0.1.90" + } }, - "colorspace": { + "node_modules/colorspace": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/colorspace/-/colorspace-1.1.2.tgz", "integrity": "sha512-vt+OoIP2d76xLhjwbBaucYlNSpPsrJWPlBTtwCpQKIu6/CSMutyzX93O/Do0qzpH3YoHEes8YEFXyZ797rEhzQ==", - "requires": { + "dependencies": { "color": "3.0.x", "text-hex": "1.0.x" } }, - "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": { + "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 - }, - "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": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" - }, - "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" - } - }, - "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" - } - }, - "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 - } - } + "license": "MIT" }, - "core-util-is": { + "node_modules/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=" }, - "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": { + "node_modules/countries-and-timezones": { + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/countries-and-timezones/-/countries-and-timezones-3.8.0.tgz", + "integrity": "sha512-+Ze9h5f4dQpUwbzTm0DEkiPiZyim9VHV4/mSnT4zNYJnrnfwsKjAZPtnp7J5VzejCDgySs+2SSc6MDdCnD43GA==", + "license": "MIT", + "engines": { + "node": ">=8.x", + "npm": ">=5.x" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", "which": "^2.0.1" }, - "dependencies": { - "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" - } - } - } - }, - "cycle": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/cycle/-/cycle-1.0.3.tgz", - "integrity": "sha1-IegLK+hYD5i0aPN5QwZisEbDStI=" - }, - "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", - "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0" - } - }, - "dateformat": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-2.2.0.tgz", - "integrity": "sha512-GODcnWq3YGoTnygPfi02ygEiRxqUxpJwuRHjdhJYuxpcZmDq4rjBiXYmbCCzStxo176ixfLT6i4NPwQooRySnw==", - "dev": true - }, - "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.2", - "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz", - "integrity": "sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==", - "dev": true - }, - "decompress": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/decompress/-/decompress-4.2.1.tgz", - "integrity": "sha512-e48kc2IjU+2Zw8cTb6VZcJQ3lgVbS4uuB1TfCHbiZIP/haNXm+SVyhu+87jts5/3ROpd82GSVCoNs/z8l4ZOaQ==", - "dev": true, - "requires": { - "decompress-tar": "^4.0.0", - "decompress-tarbz2": "^4.0.0", - "decompress-targz": "^4.0.0", - "decompress-unzip": "^4.0.1", - "graceful-fs": "^4.1.10", - "make-dir": "^1.0.0", - "pify": "^2.3.0", - "strip-dirs": "^2.0.0" + "engines": { + "node": ">= 8" } }, - "decompress-tar": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/decompress-tar/-/decompress-tar-4.1.1.tgz", - "integrity": "sha1-cYy9P8sWIJcW5womuE57pFkuWvE=", + "node_modules/css-loader": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.11.0.tgz", + "integrity": "sha512-CTJ+AEQJjq5NzLga5pE39qdiSV56F8ywCIsqNIRF0r7BDgWsN25aazToqAFg7ZrtA/U016xudB3ffgweORxX7g==", "dev": true, - "requires": { - "file-type": "^5.2.0", - "is-stream": "^1.1.0", - "tar-stream": "^1.5.2" - }, "dependencies": { - "file-type": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/file-type/-/file-type-5.2.0.tgz", - "integrity": "sha1-LdvqfHP/42No365J3DOMBYwritY=", - "dev": true - } - } - }, - "decompress-tarbz2": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/decompress-tarbz2/-/decompress-tarbz2-4.1.1.tgz", - "integrity": "sha1-MIKluIDqQEOBY0nzeLVsUWvho5s=", - "dev": true, - "requires": { - "decompress-tar": "^4.1.0", - "file-type": "^6.1.0", - "is-stream": "^1.1.0", - "seek-bzip": "^1.0.5", - "unbzip2-stream": "^1.0.9" + "icss-utils": "^5.1.0", + "postcss": "^8.4.33", + "postcss-modules-extract-imports": "^3.1.0", + "postcss-modules-local-by-default": "^4.0.5", + "postcss-modules-scope": "^3.2.0", + "postcss-modules-values": "^4.0.0", + "postcss-value-parser": "^4.2.0", + "semver": "^7.5.4" }, - "dependencies": { - "file-type": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/file-type/-/file-type-6.2.0.tgz", - "integrity": "sha1-5QzXXTVv/tTjBtxPW89Sp5kDqRk=", - "dev": true - } - } - }, - "decompress-targz": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/decompress-targz/-/decompress-targz-4.1.1.tgz", - "integrity": "sha1-wJvDXE0R894J8tLaU+neI+fOHu4=", - "dev": true, - "requires": { - "decompress-tar": "^4.1.1", - "file-type": "^5.2.0", - "is-stream": "^1.1.0" + "engines": { + "node": ">= 12.13.0" }, - "dependencies": { - "file-type": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/file-type/-/file-type-5.2.0.tgz", - "integrity": "sha1-LdvqfHP/42No365J3DOMBYwritY=", - "dev": true - } - } - }, - "decompress-unzip": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/decompress-unzip/-/decompress-unzip-4.0.1.tgz", - "integrity": "sha1-3qrM39FK6vhVePczroIQ+bSEj2k=", - "dev": true, - "requires": { - "file-type": "^3.8.0", - "get-stream": "^2.2.0", - "pify": "^2.3.0", - "yauzl": "^2.4.2" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" }, - "dependencies": { - "file-type": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/file-type/-/file-type-3.9.0.tgz", - "integrity": "sha1-JXoHg4TR24CHvESdEH1SpSZyuek=", - "dev": true + "peerDependencies": { + "@rspack/core": "0.x || 1.x", + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "@rspack/core": { + "optional": true + }, + "webpack": { + "optional": true } } }, - "deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true - }, - "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==", + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", "dev": true, - "requires": { - "kind-of": "^5.0.2" + "bin": { + "cssesc": "bin/cssesc" }, - "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 - } + "engines": { + "node": ">=4" } }, - "default-resolution": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/default-resolution/-/default-resolution-2.0.0.tgz", - "integrity": "sha1-vLgrqnKtebQmp2cy8aga1t8m1oQ=", + "node_modules/csstype": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.1.tgz", + "integrity": "sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw==", "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==", + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", "dev": true, - "requires": { - "is-descriptor": "^1.0.2", - "isobject": "^3.0.1" - }, + "license": "MIT", "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" - } + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true } } }, - "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 - }, - "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 + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true, + "license": "MIT" }, - "diagnostics": { + "node_modules/diagnostics": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/diagnostics/-/diagnostics-1.1.1.tgz", "integrity": "sha512-8wn1PmdunLJ9Tqbx+Fx/ZEuHfJf4NKSN2ZBj7SJC/OWRWha843+WsTjqMe1B5E3p28jqBlp+mJ2fPVxPyNgYKQ==", - "requires": { + "dependencies": { "colorspace": "1.1.x", "enabled": "1.0.x", "kuler": "1.0.x" } }, - "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 - }, - "dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "node_modules/diff": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.2.0.tgz", + "integrity": "sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==", "dev": true, - "requires": { - "path-type": "^4.0.0" - }, - "dependencies": { - "path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true - } + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.3.1" } }, - "doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, - "requires": { - "esutils": "^2.0.2" - } - }, - "dom-serializer": { + "node_modules/dom-serializer": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", - "requires": { + "dependencies": { "domelementtype": "^2.0.1", "domhandler": "^4.2.0", "entities": "^2.0.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" } }, - "domelementtype": { + "node_modules/domelementtype": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", - "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==" + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ] }, - "domhandler": { + "node_modules/domhandler": { "version": "4.3.1", "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", - "requires": { + "dependencies": { "domelementtype": "^2.2.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" } }, - "domutils": { + "node_modules/domutils": { "version": "2.8.0", "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", - "requires": { + "dependencies": { "dom-serializer": "^1.0.1", "domelementtype": "^2.2.0", "domhandler": "^4.2.0" - } - }, - "duplexer2": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.0.2.tgz", - "integrity": "sha512-+AWBwjGadtksxjOQSFDhPNQbed7icNXApT4+2BNpsXzcCBiInq2H9XW0O8sfHFaPmnQRs7cg/P0fAr2IWQSW0g==", - "dev": true, - "requires": { - "readable-stream": "~1.1.9" }, - "dependencies": { - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", - "dev": true - }, - "readable-stream": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", - "integrity": "sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ==", - "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://repository.engineering.redhat.com/nexus/repository/registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==", - "dev": true - } + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" } }, - "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" + "node_modules/dset": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/dset/-/dset-3.1.4.tgz", + "integrity": "sha512-2QF/g9/zTaPDc3BjNcVTGoBbXBgYfMTTceLaYcFJ/W9kggFUkhxD/hMEeuLKbugyef9SqAx8cpgwlIP/jinUTA==", + "license": "MIT", + "engines": { + "node": ">=4" } }, - "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" - } + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "license": "MIT" }, - "ecc-jsbn": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", + "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, - "requires": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" - } + "license": "ISC" }, - "electron-to-chromium": { - "version": "1.3.740", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.740.tgz", - "integrity": "sha512-Mi2m55JrX2BFbNZGKYR+2ItcGnR4O5HhrvgoRRyZQlaMGQULqDhoGkLWHzJoshSzi7k1PUofxcDbNhlFrDZNhg==", - "dev": true - }, - "emoji-regex": { + "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 + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" }, - "enabled": { + "node_modules/enabled": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/enabled/-/enabled-1.0.2.tgz", "integrity": "sha1-ll9lE9LC0cX0ZStkouM5ZGf8L5M=", - "requires": { + "dependencies": { "env-variable": "0.0.x" } }, - "end-of-stream": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", - "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", - "dev": true, - "requires": { + "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==", + "dependencies": { "once": "^1.4.0" } }, - "enhanced-resolve": { - "version": "5.8.3", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.8.3.tgz", - "integrity": "sha512-EGAbGvH7j7Xt2nc0E7D99La1OiEs8LnyimkRgwExpUMScN6O+3x9tIWs7PLQZVNx4YD+00skHXPXi1yQHpAmZA==", + "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, - "requires": { + "license": "MIT", + "dependencies": { "graceful-fs": "^4.2.4", - "tapable": "^2.2.0" + "tapable": "^2.3.0" }, - "dependencies": { - "graceful-fs": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz", - "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==", - "dev": true - } + "engines": { + "node": ">=10.13.0" } }, - "enquirer": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", - "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", - "dev": true, - "requires": { - "ansi-colors": "^4.1.1" - }, - "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 - } - } - }, - "entities": { + "node_modules/entities": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", - "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==" + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } }, - "env-variable": { + "node_modules/env-variable": { "version": "0.0.5", "resolved": "https://registry.npmjs.org/env-variable/-/env-variable-0.0.5.tgz", "integrity": "sha512-zoB603vQReOFvTg5xMl9I1P2PnHsHQQKTEowsKKD7nseUfJq6UWzK+4YtlWUO1nhiQUxe6XMkk+JleSZD1NZFA==" }, - "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", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "node_modules/envinfo": { + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.21.0.tgz", + "integrity": "sha512-Lw7I8Zp5YKHFCXL7+Dz95g4CcbMEpgvqZNNq3AmlT5XAV6CgAAk6gyAMqn2zjw08K9BHfcNuKrMiCPLByGafow==", "dev": true, - "requires": { - "is-arrayish": "^0.2.1" + "license": "MIT", + "bin": { + "envinfo": "dist/cli.js" + }, + "engines": { + "node": ">=4" } }, - "es-module-lexer": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.4.1.tgz", - "integrity": "sha512-ooYciCUtfw6/d2w56UVeqHPcoCFAiJdz5XOkYpv/Txl1HMUozpXjz/2RIQgqwKdXNDPSF1W7mJCFse3G+HDyAA==", - "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==", + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", "dev": true, - "requires": { - "es6-iterator": "~2.0.3", - "es6-symbol": "~3.1.3", - "next-tick": "~1.0.0" + "license": "MIT", + "engines": { + "node": ">= 0.4" } }, - "es6-iterator": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", - "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", + "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, - "requires": { - "d": "1", - "es5-ext": "^0.10.35", - "es6-symbol": "^3.1.1" - } + "license": "MIT" }, - "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==", + "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, - "requires": { - "d": "^1.0.1", - "ext": "^1.1.2" + "license": "MIT", + "engines": { + "node": ">=6" } }, - "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==", + "node_modules/eslint": { + "version": "10.7.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-10.7.0.tgz", + "integrity": "sha512-GVTD7s1vdIl6UYvAfriOPeY1Df8LIZjfofLvHwde+erDHGGuHyuM6xoxRxmHiebhYuD2p1vN4wWh0XzPARSGDQ==", "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", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://repository.engineering.redhat.com/nexus/repository/registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true - }, - "eslint": { - "version": "8.13.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.13.0.tgz", - "integrity": "sha512-D+Xei61eInqauAyTJ6C0q6x9mx7kTUC1KZ0m0LSEexR0V+e94K12LmWX076ZIsldwfQ2RONdaJe0re0TRGQbRQ==", - "dev": true, - "requires": { - "@eslint/eslintrc": "^1.2.1", - "@humanwhocodes/config-array": "^0.9.2", - "ajv": "^6.10.0", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", + "license": "MIT", + "workspaces": [ + "packages/*" + ], + "dependencies": { + "@eslint-community/eslint-utils": "^4.8.0", + "@eslint-community/regexpp": "^4.12.2", + "@eslint/config-array": "^0.23.5", + "@eslint/config-helpers": "^0.6.0", + "@eslint/core": "^1.2.1", + "@eslint/plugin-kit": "^0.7.2", + "@humanfs/node": "^0.16.6", + "@humanwhocodes/module-importer": "^1.0.1", + "@humanwhocodes/retry": "^0.4.2", + "@types/estree": "^1.0.6", + "ajv": "^6.14.0", + "cross-spawn": "^7.0.6", "debug": "^4.3.2", - "doctrine": "^3.0.0", "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.1.1", - "eslint-utils": "^3.0.0", - "eslint-visitor-keys": "^3.3.0", - "espree": "^9.3.1", - "esquery": "^1.4.0", + "eslint-scope": "^9.1.2", + "eslint-visitor-keys": "^5.0.1", + "espree": "^11.2.0", + "esquery": "^1.7.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", - "functional-red-black-tree": "^1.0.1", - "glob-parent": "^6.0.1", - "globals": "^13.6.0", + "file-entry-cache": "^8.0.0", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", "ignore": "^5.2.0", - "import-fresh": "^3.0.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", - "js-yaml": "^4.1.0", "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.0.4", + "minimatch": "^10.2.4", "natural-compare": "^1.4.0", - "optionator": "^0.9.1", - "regexpp": "^3.2.0", - "strip-ansi": "^6.0.1", - "strip-json-comments": "^3.1.0", - "text-table": "^0.2.0", - "v8-compile-cache": "^2.0.3" + "optionator": "^0.9.3" }, - "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 - }, - "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, - "requires": { - "color-convert": "^2.0.1" - } - }, - "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 - }, - "chalk": { - "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", - "supports-color": "^7.1.0" - } - }, - "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, - "requires": { - "color-name": "~1.1.4" - } - }, - "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 - }, - "debug": { - "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" - } - }, - "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 - }, - "eslint-scope": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", - "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", - "dev": true, - "requires": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - } - }, - "estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true - }, - "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, - "requires": { - "is-glob": "^4.0.3" - } - }, - "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 - }, - "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" - } - }, - "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 - }, - "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" - } - }, - "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" - } + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "jiti": "*" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true } } }, - "eslint-scope": { + "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, - "requires": { + "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" } }, - "eslint-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", - "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", + "node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", "dev": true, - "requires": { - "eslint-visitor-keys": "^2.0.0" + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, - "dependencies": { - "eslint-visitor-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", - "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", - "dev": true - } + "funding": { + "url": "https://opencollective.com/eslint" } }, - "eslint-visitor-keys": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", - "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", - "dev": true - }, - "eslint-webpack-plugin": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/eslint-webpack-plugin/-/eslint-webpack-plugin-3.2.0.tgz", - "integrity": "sha512-avrKcGncpPbPSUHX6B3stNGzkKFto3eL+DKM4+VyMrVnhPc3vRczVlCq3uhuFOdRvDHTVXuzwk1ZKUrqDQHQ9w==", + "node_modules/eslint-webpack-plugin": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/eslint-webpack-plugin/-/eslint-webpack-plugin-6.0.0.tgz", + "integrity": "sha512-x9m9cH0Rw0RNJB/utP9AMGzmuXg/yLP/FCHSVSfsyjQUyetXN4g1BaIqxkj1i3mVX48aOys0bsVt63LLfh6oYg==", "dev": true, - "requires": { - "@types/eslint": "^7.29.0 || ^8.4.1", - "jest-worker": "^28.0.2", - "micromatch": "^4.0.5", + "license": "MIT", + "dependencies": { + "@types/eslint": "^9.6.1", + "micromatch": "^4.0.8", "normalize-path": "^3.0.0", - "schema-utils": "^4.0.0" - }, - "dependencies": { - "@types/eslint": { - "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": "*", - "@types/json-schema": "*" - } - }, - "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" - } - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "requires": { - "fill-range": "^7.0.1" - } - }, - "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==", - "dev": true, - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true - }, - "jest-worker": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-28.1.3.tgz", - "integrity": "sha512-CqRA220YV/6jCo8VWvAt1KKx6eek1VIHMPeLEbpcfSfkEeWyBNppynM/o6q+Wmw+sOhos2ml34wZbSX3G13//g==", - "dev": true, - "requires": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - } - }, - "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 - }, - "micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "dev": true, - "requires": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" - } - }, - "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 - }, - "picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "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" - }, - "dependencies": { - "@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 - } - } - }, - "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" - } - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "requires": { - "is-number": "^7.0.0" - } - } - } - }, - "espree": { - "version": "9.3.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.3.1.tgz", - "integrity": "sha512-bvdyLmJMfwkV3NCRl5ZhJf22zBFo1y8bYh3VYb+bfzqNB4Je68P2sSuXyuFquzWLebHpNd2/d5uv7yoP9ISnGQ==", - "dev": true, - "requires": { - "acorn": "^8.7.0", - "acorn-jsx": "^5.3.1", - "eslint-visitor-keys": "^3.3.0" + "schema-utils": "^4.3.3" }, - "dependencies": { - "acorn": { - "version": "8.7.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.0.tgz", - "integrity": "sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ==", - "dev": true - } + "engines": { + "node": ">= 20.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "eslint": "^9.0.0 || ^10.0.0", + "webpack": "^5.0.0" } }, - "esquery": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", - "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", + "node_modules/eslint/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, - "requires": { - "estraverse": "^5.1.0" + "engines": { + "node": ">=10" }, - "dependencies": { - "estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true - } + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "node_modules/eslint/node_modules/eslint-scope": { + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-9.1.2.tgz", + "integrity": "sha512-xS90H51cKw0jltxmvmHy2Iai1LIqrfbw57b79w/J7MfvDfkIkFZ+kj6zC3BjtUwh150HsSSdxXZcsuv72miDFQ==", "dev": true, - "requires": { + "license": "BSD-2-Clause", + "dependencies": { + "@types/esrecurse": "^4.3.1", + "@types/estree": "^1.0.8", + "esrecurse": "^4.3.0", "estraverse": "^5.2.0" }, - "dependencies": { - "estraverse": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", - "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", - "dev": true - } + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, - "estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true - }, - "esutils": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", - "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", - "dev": true - }, - "events": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", - "dev": true - }, - "execa": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.0.0.tgz", - "integrity": "sha512-ov6w/2LCiuyO4RLYGdpFGjkcs0wMTgGE8PrkTHikeUy5iJekXyPIKUjifk5CsE0pt7sMCrMZ3YNqoCj6idQOnQ==", + "node_modules/eslint/node_modules/eslint-visitor-keys": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", + "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", "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" + "license": "Apache-2.0", + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" }, - "dependencies": { - "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.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", - "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==", - "dev": true - } + "funding": { + "url": "https://opencollective.com/eslint" } }, - "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-home-dir": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/expand-home-dir/-/expand-home-dir-0.0.3.tgz", - "integrity": "sha1-ct6KBIbMKKO71wRjU5iCW1tign0=" - }, - "expand-tilde": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", - "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=", + "node_modules/eslint/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, - "requires": { - "homedir-polyfill": "^1.0.1" + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" } }, - "ext": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/ext/-/ext-1.6.0.tgz", - "integrity": "sha512-sdBImtzkq2HpkdRLtlLWDa6w4DX22ijZLKx8BMPUuKe1c5lbN6xwQDQCxSfxBQnHZ13ls/FH0MQZx/q/gr6FQg==", + "node_modules/espree": { + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-11.2.0.tgz", + "integrity": "sha512-7p3DrVEIopW1B1avAGLuCSh1jubc01H2JHc8B4qqGblmg5gI9yumBgACjWo4JlIc04ufug4xJ3SQI8HkS/Rgzw==", "dev": true, - "requires": { - "type": "^2.5.0" - }, + "license": "BSD-2-Clause", "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 - } + "acorn": "^8.16.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^5.0.1" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, - "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=", + "node_modules/espree/node_modules/eslint-visitor-keys": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", + "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", "dev": true, - "requires": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" + "license": "Apache-2.0", + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" }, - "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" - } - } + "funding": { + "url": "https://opencollective.com/eslint" } }, - "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==", + "node_modules/esquery": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz", + "integrity": "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==", "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", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "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==", - "dev": true, - "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": { - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "requires": { - "fill-range": "^7.0.1" - } - }, - "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==", - "dev": true, - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "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" - } - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true - }, - "micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "dev": true, - "requires": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" - } - }, - "picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "requires": { - "is-number": "^7.0.0" - } - } + "license": "BSD-3-Clause", + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" } }, - "fast-json-stable-stringify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", - "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", - "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 - }, - "fast-safe-stringify": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.0.6.tgz", - "integrity": "sha512-q8BZ89jjc+mz08rSxROs8VsrBBcn1SIw1kq9NjolL509tkABRk9io01RAjSaEv1Xb2uFLt8VtRiZbGp5H8iDtg==" - }, - "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.13.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", - "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", + "node_modules/esquery/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, - "requires": { - "reusify": "^1.0.4" + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" } }, - "fd-slicer": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", - "integrity": "sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4=", + "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, - "requires": { - "pend": "~1.2.0" + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" } }, - "fecha": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fecha/-/fecha-2.3.3.tgz", - "integrity": "sha512-lUGBnIamTAwk4znq5BcqsDaxSmZ9nDVJaij6NvRt/Tg4R69gERA+otPKbS86ROw9nxVMw2/mp1fnaiWqbs6Sdg==" - }, - "file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "node_modules/esrecurse/node_modules/estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", "dev": true, - "requires": { - "flat-cache": "^3.0.4" + "engines": { + "node": ">=4.0" } }, - "file-stream-rotator": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/file-stream-rotator/-/file-stream-rotator-0.4.1.tgz", - "integrity": "sha512-W3aa3QJEc8BS2MmdVpQiYLKHj3ijpto1gMDlsgCRSKfIUe6MwkcpODGPQ3vZfb0XvCeCqlu9CBQTN7oQri2TZQ==", - "requires": { - "moment": "^2.11.2" - } - }, - "file-type": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/file-type/-/file-type-4.4.0.tgz", - "integrity": "sha1-G2AOX8ofvcboDApwxxyNul95BsU=", - "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", - "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", + "node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", "dev": true, - "optional": 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" - } - } + "engines": { + "node": ">=4.0" } }, - "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" - }, - "dependencies": { - "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" - } - } - } - }, - "findup-sync": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-3.0.0.tgz", - "integrity": "sha512-YbffarhcicEhOrm4CtrwdKBdCuz576RLdhJDsIfvNtxUuhdRet1qZcsMjqbePtAseKdAnDyM/IyXbu7PRPRLYg==", + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", "dev": true, - "requires": { - "detect-file": "^1.0.0", - "is-glob": "^4.0.0", - "micromatch": "^3.0.4", - "resolve-dir": "^1.0.1" + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" } }, - "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==", + "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, - "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" + "engines": { + "node": ">=0.8.x" } }, - "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 + "node_modules/expand-home-dir": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/expand-home-dir/-/expand-home-dir-0.0.3.tgz", + "integrity": "sha1-ct6KBIbMKKO71wRjU5iCW1tign0=" }, - "flat": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", - "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", + "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 }, - "flat-cache": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", - "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "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, - "requires": { - "flatted": "^3.1.0", - "rimraf": "^3.0.2" - }, - "dependencies": { - "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" - } - } - } + "license": "MIT" }, - "flatted": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.5.tgz", - "integrity": "sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg==", - "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==", + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", "dev": true, - "requires": { - "inherits": "^2.0.3", - "readable-stream": "^2.3.6" - } + "license": "MIT" }, - "fmtr": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/fmtr/-/fmtr-1.1.2.tgz", - "integrity": "sha512-GYZV5D+SI/2AZBWF2HHKTxdQ7fty+2C/Jq2lyTseyZ1VBkkznSE2wzlbUPAutesC0hmJFpe+KXt6mzPE7qUXiw==", - "requires": { - "lodash": "^4.17.14" - } - }, - "for-in": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", - "dev": true + "node_modules/fast-safe-stringify": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.0.6.tgz", + "integrity": "sha512-q8BZ89jjc+mz08rSxROs8VsrBBcn1SIw1kq9NjolL509tkABRk9io01RAjSaEv1Xb2uFLt8VtRiZbGp5H8iDtg==" }, - "for-own": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz", - "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=", + "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==", "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", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", - "dev": true + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "BSD-3-Clause" }, - "form-data": { + "node_modules/fecha": { "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" - } + "resolved": "https://registry.npmjs.org/fecha/-/fecha-2.3.3.tgz", + "integrity": "sha512-lUGBnIamTAwk4znq5BcqsDaxSmZ9nDVJaij6NvRt/Tg4R69gERA+otPKbS86ROw9nxVMw2/mp1fnaiWqbs6Sdg==" }, - "fragment-cache": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", - "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", + "node_modules/file-entry-cache": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", + "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", "dev": true, - "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", - "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", - "dev": true - }, - "fs-extra": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", - "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - }, + "license": "MIT", "dependencies": { - "graceful-fs": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.2.tgz", - "integrity": "sha512-IItsdsea19BoLC7ELy13q1iJFNmd7ofZH5+X/pJr90/nRoPEX0DJo1dHDbgtYWOhJhcCgMDTOw84RZ72q6lB+Q==" - } - } - }, - "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=" - }, - "fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "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" - } - }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true - }, - "functional-red-black-tree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", - "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", - "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", - "dev": true, - "requires": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1" + "flat-cache": "^4.0.0" + }, + "engines": { + "node": ">=16.0.0" } }, - "get-stream": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-2.3.1.tgz", - "integrity": "sha1-Xzj5PzRgCWZu4BUKBUFn+Rvdld4=", - "dev": true, - "requires": { - "object-assign": "^4.0.1", - "pinkie-promise": "^2.0.0" + "node_modules/file-stream-rotator": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/file-stream-rotator/-/file-stream-rotator-0.6.1.tgz", + "integrity": "sha512-u+dBid4PvZw17PmDeRcNOtCP9CCK/9lRN2w+r1xIS7yOL9JFrIBKTvrYsxT4P0pGtThYTn++QS5ChHaUov3+zQ==", + "dependencies": { + "moment": "^2.29.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 + "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" + } }, - "getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "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, - "requires": { - "assert-plus": "^1.0.0" + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "glob": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", - "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", - "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" + "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" } }, - "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" - } - } + "node_modules/flat-cache": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", + "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.4" + }, + "engines": { + "node": ">=16" } }, - "glob-stream": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/glob-stream/-/glob-stream-6.1.0.tgz", - "integrity": "sha1-cEXJlBOz65SIjYOrRtC0BMx73eQ=", + "node_modules/flatted": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.3.tgz", + "integrity": "sha512-/zipXxyO6rGvuNGDiULY9MvEGSkb2gaG4GGH4ygMi0ZZzyMHdUZBmntJmx5x1G2VuPytCwGN4xsJP6cw+sK+vQ==", "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" + "license": "ISC" + }, + "node_modules/fmtr": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/fmtr/-/fmtr-1.1.2.tgz", + "integrity": "sha512-GYZV5D+SI/2AZBWF2HHKTxdQ7fty+2C/Jq2lyTseyZ1VBkkznSE2wzlbUPAutesC0hmJFpe+KXt6mzPE7qUXiw==", + "dependencies": { + "lodash": "^4.17.14" } }, - "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/foreground-child": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", + "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", + "license": "ISC", + "dependencies": { + "cross-spawn": "^7.0.6", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } }, - "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" + "node_modules/foreground-child/node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "license": "ISC", + "engines": { + "node": ">=14" }, - "dependencies": { - "binary-extensions": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", - "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", - "dev": true - }, - "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" - } - }, - "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" - } - }, - "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" - } - }, - "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 - }, - "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" - } - } + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "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" + "node_modules/fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" } }, - "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" - }, - "dependencies": { - "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" - } - } + "node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } }, - "globals": { - "version": "13.13.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.13.0.tgz", - "integrity": "sha512-EQ7Q18AJlPwp3vUDL4mKA0KXrXyNIQyWon6T6XQiBQF0XHvRsiCSrWmmeATpUzdJN2HhWZU6Pdl0a9zdep5p6A==", + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", "dev": true, - "requires": { - "type-fest": "^0.20.2" + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "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, - "requires": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" + "engines": { + "node": "6.* || 8.* || >= 10.*" } }, - "glogg": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/glogg/-/glogg-1.0.1.tgz", - "integrity": "sha512-ynYqXLoluBKf9XGR1gA59yEJisIL7YHEH4xr3ZziHB5/yl4qWfaK8Js9jGe6gBGCSCKVqiyO30WnRZADvemUNw==", + "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, - "requires": { - "sparkles": "^1.0.0" + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "graceful-fs": { - "version": "4.1.15", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz", - "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==" + "node_modules/getos": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/getos/-/getos-3.2.1.tgz", + "integrity": "sha512-U56CfOK17OKgTVqozZjUKNdkfEv6jk5WISBJ8SHoagjE6L69zOwl3Z+O8myjY9MEW3i2HPWQBt/LTbCgcC973Q==", + "license": "MIT", + "dependencies": { + "async": "^3.2.0" + } }, - "growl": { - "version": "1.10.5", - "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", - "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", - "dev": true + "node_modules/getos/node_modules/async": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", + "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==", + "license": "MIT" }, - "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" - } - } + "node_modules/glob": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-11.1.0.tgz", + "integrity": "sha512-vuNwKSaKiqm7g0THUBu2x7ckSs3XJLXE+2ssL7/MfTGPLLcrJQ/4Uq1CjPTtO5cCIiRxqvN6Twy1qOwhL0Xjcw==", + "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" } }, - "gulp-decompress": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/gulp-decompress/-/gulp-decompress-3.0.0.tgz", - "integrity": "sha512-F7plBXKgjS2yBWRNqhLnPR5peOWbmKU1dTUHgUSATo4/Eet9FJC55S0mc13S+WptNvEx0cR8DMlFU7zGZJuYDQ==", - "dev": true, - "requires": { - "archive-type": "^4.0.0", - "decompress": "^4.0.0", - "plugin-error": "^1.0.1", - "readable-stream": "^3.4.0", - "vinyl": "^2.1.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" - } - } + "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" } }, - "gulp-download": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/gulp-download/-/gulp-download-0.0.1.tgz", - "integrity": "sha1-VKMBj8YZs0HM9kkWBvet8L08c5c=", - "dev": true, - "requires": { - "gulp-util": "^3.0.8", - "request": "^2.88.2", - "request-progress": "^3.0.0", - "through": "^2.3.8" - }, - "dependencies": { - "request": { - "version": "2.88.2", - "resolved": "https://repository.engineering.redhat.com/nexus/repository/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" - } - }, - "request-progress": { - "version": "3.0.0", - "resolved": "https://repository.engineering.redhat.com/nexus/repository/registry.npmjs.org/request-progress/-/request-progress-3.0.0.tgz", - "integrity": "sha512-MnWzEHHaxHO2iWiQuHrUPBi/1WeBf5PkxQqNyNvLl9VAYSdXkP8tQ3pBSeCPD+yw0v0Aq1zosWLz0BdeXpWwZg==", - "dev": true, - "requires": { - "throttleit": "^1.0.0" - } - }, - "through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", - "dev": true - } - } + "node_modules/glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", + "dev": true, + "license": "BSD-2-Clause" }, - "gulp-util": { - "version": "3.0.8", - "resolved": "https://repository.engineering.redhat.com/nexus/repository/registry.npmjs.org/gulp-util/-/gulp-util-3.0.8.tgz", - "integrity": "sha512-q5oWPc12lwSFS9h/4VIjG+1NuNDlJ48ywV2JKItY4Ycc/n1fXJeYPVQsfu5ZrhQi7FGSDBalwUCLar/GyHXKGw==", - "dev": true, - "requires": { - "array-differ": "^1.0.0", - "array-uniq": "^1.0.2", - "beeper": "^1.0.0", - "chalk": "^1.0.0", - "dateformat": "^2.0.0", - "fancy-log": "^1.1.0", - "gulplog": "^1.0.0", - "has-gulplog": "^0.1.0", - "lodash._reescape": "^3.0.0", - "lodash._reevaluate": "^3.0.0", - "lodash._reinterpolate": "^3.0.0", - "lodash.template": "^3.0.0", - "minimist": "^1.1.0", - "multipipe": "^0.1.2", - "object-assign": "^3.0.0", - "replace-ext": "0.0.1", - "through2": "^2.0.0", - "vinyl": "^0.5.0" - }, - "dependencies": { - "clone": { - "version": "1.0.4", - "resolved": "https://repository.engineering.redhat.com/nexus/repository/registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", - "dev": true - }, - "clone-stats": { - "version": "0.0.1", - "resolved": "https://repository.engineering.redhat.com/nexus/repository/registry.npmjs.org/clone-stats/-/clone-stats-0.0.1.tgz", - "integrity": "sha512-dhUqc57gSMCo6TX85FLfe51eC/s+Im2MLkAgJwfaRRexR2tA4dd3eLEW4L6efzHc2iNorrRRXITifnDLlRrhaA==", - "dev": true - }, - "lodash.template": { - "version": "3.6.2", - "resolved": "https://repository.engineering.redhat.com/nexus/repository/registry.npmjs.org/lodash.template/-/lodash.template-3.6.2.tgz", - "integrity": "sha512-0B4Y53I0OgHUJkt+7RmlDFWKjVAI/YUpWNiL9GQz5ORDr4ttgfQGo+phBWKFLJbBdtOwgMuUkdOHOnPg45jKmQ==", - "dev": true, - "requires": { - "lodash._basecopy": "^3.0.0", - "lodash._basetostring": "^3.0.0", - "lodash._basevalues": "^3.0.0", - "lodash._isiterateecall": "^3.0.0", - "lodash._reinterpolate": "^3.0.0", - "lodash.escape": "^3.0.0", - "lodash.keys": "^3.0.0", - "lodash.restparam": "^3.0.0", - "lodash.templatesettings": "^3.0.0" - } - }, - "object-assign": { - "version": "3.0.0", - "resolved": "https://repository.engineering.redhat.com/nexus/repository/registry.npmjs.org/object-assign/-/object-assign-3.0.0.tgz", - "integrity": "sha512-jHP15vXVGeVh1HuaA2wY6lxk+whK/x4KBG88VXeRma7CCun7iGD5qPc4eYykQ9sdQvg8jkwFKsSxHln2ybW3xQ==", - "dev": true - }, - "replace-ext": { - "version": "0.0.1", - "resolved": "https://repository.engineering.redhat.com/nexus/repository/registry.npmjs.org/replace-ext/-/replace-ext-0.0.1.tgz", - "integrity": "sha512-AFBWBy9EVRTa/LhEcG8QDP3FvpwZqmvN2QFDuJswFeaVhWnZMp8q3E6Zd90SR04PlIwfGdyVjNyLPyen/ek5CQ==", - "dev": true - }, - "vinyl": { - "version": "0.5.3", - "resolved": "https://repository.engineering.redhat.com/nexus/repository/registry.npmjs.org/vinyl/-/vinyl-0.5.3.tgz", - "integrity": "sha512-P5zdf3WB9uzr7IFoVQ2wZTmUwHL8cMZWJGzLBNCHNZ3NB6HTMsYABtt7z8tAGIINLXyAob9B9a1yzVGMFOYKEA==", - "dev": true, - "requires": { - "clone": "^1.0.0", - "clone-stats": "^0.0.1", - "replace-ext": "0.0.1" - } - } + "node_modules/glob/node_modules/jackspeak": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-4.1.1.tgz", + "integrity": "sha512-zptv57P3GpL+O0I7VdMJNBZCu+BPHVQUk55Ft8/QCJjTVxrnJHuVuX/0Bl2A6/+2oyR/ZMEuFKwmzqqZ/U5nPQ==", + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "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" + "node_modules/glob/node_modules/lru-cache": { + "version": "11.2.2", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.2.tgz", + "integrity": "sha512-F9ODfyqML2coTIsQpSkRHnLSZMtkU8Q+mSfcaIyKwy58u+8k5nvAYeiNhsyMARvzNcXJ9QfWVrcPsC9e9rAxtg==", + "license": "ISC", + "engines": { + "node": "20 || >=22" } }, - "har-schema": { + "node_modules/glob/node_modules/path-scurry": { "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" + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.0.tgz", + "integrity": "sha512-ypGJsmGtdXUOeM5u93TyeIEfEhM6s+ljAhrk5vAvSx8uyY/02OvrZnA0YNGUrPXfpJMgI1ODd3nwz8Npx4O4cg==", + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^11.0.0", + "minipass": "^7.1.2" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "node_modules/globals": { + "version": "17.7.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-17.7.0.tgz", + "integrity": "sha512-Czmyns5dUsq4seFBR/Kdydhmo8y9kC79hiSkPn0YcGtNnYWnrgt0vjrSjx9tspoDGWm2CMarffRuLjM4xUz8xg==", "dev": true, - "requires": { - "function-bind": "^1.1.1" + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "has-ansi": { - "version": "2.0.0", - "resolved": "https://repository.engineering.redhat.com/nexus/repository/registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" }, - "has-flag": { + "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 - }, - "has-gulplog": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/has-gulplog/-/has-gulplog-0.1.0.tgz", - "integrity": "sha512-+F4GzLjwHNNDEAJW2DC1xXfEoPkRDmUdJ7CBYw4MpqtDwOnqdImJl7GWlpqx+Wko6//J8uKTnIe4wZSv7yCqmw==", "dev": true, - "requires": { - "sparkles": "^1.0.0" + "engines": { + "node": ">=8" } }, - "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==", - "dev": true - }, - "has-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", - "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", + "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==", "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": { - "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" - } - } + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" } }, - "he": { + "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 - }, - "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" + "bin": { + "he": "bin/he" } }, - "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": { + "node_modules/htmlparser2": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.0.1.tgz", "integrity": "sha512-GDKPd+vk4jvSuvCbyuzx/unmXkk090Azec7LovXP8as1Hn8q9p3hbjmDGbUqqhknw0ajwit6LiiWqfiTUPMK7w==", - "requires": { + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "dependencies": { "domelementtype": "^2.0.1", "domhandler": "^4.0.0", "domutils": "^2.4.4", "entities": "^2.0.0" } }, - "http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "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, - "requires": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.0", + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" } }, - "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 + "node_modules/https-proxy-agent": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", + "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } }, - "ieee754": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.12.tgz", - "integrity": "sha512-GguP+DRY+pJ3soyIiGPTvdiVXjZ+DbXOxGpXn3eMvNW4x4irjqXm4wHKscC+TfxSJ0yw/S1F24tqdMNsMZTiLA==", - "dev": true + "node_modules/icss-utils": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", + "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", + "dev": true, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.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==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] }, - "ignore": { + "node_modules/ignore": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", - "dev": true - }, - "import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", "dev": true, - "requires": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "dependencies": { - "resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true - } + "engines": { + "node": ">= 4" } }, - "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==", + "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.2.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.2.0.tgz", + "integrity": "sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==", "dev": true, - "requires": { + "license": "MIT", + "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" } }, - "imurmurhash": { + "node_modules/imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "dev": true - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "requires": { - "once": "^1.3.0", - "wrappy": "1" + "dev": true, + "engines": { + "node": ">=0.8.19" } }, - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" - }, - "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 + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, - "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==", + "node_modules/interpret": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-3.1.1.tgz", + "integrity": "sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ==", "dev": true, - "requires": { - "is-relative": "^1.0.0", - "is-windows": "^1.0.1" + "license": "MIT", + "engines": { + "node": ">=10.13.0" } }, - "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" + "node_modules/invert-kv": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-3.0.1.tgz", + "integrity": "sha512-CYdFeFexxhv/Bcny+Q0BfOV+ltRlJcd4BBZBYFX/O0u4npJrgZtIcjokegtiSMAvlMTJ+Koq0GBCc//3bueQxw==", + "license": "MIT", + "engines": { + "node": ">=8" }, - "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" - } - } + "funding": { + "url": "https://github.com/sindresorhus/invert-kv?sponsor=1" } }, - "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": { + "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==", - "requires": { + "dependencies": { "binary-extensions": "^2.0.0" - } - }, - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha1-76ouqdqg16suoTqXsritUf776L4=", - "dev": true - }, - "is-core-module": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.2.0.tgz", - "integrity": "sha512-XRAfAdyyY5F5cOXn7hYQDqh2Xmii+DEfIcQGxK/uNwMHhIkPWO0g8msXcbzLe+MpGoR951MlqM/2iIlU4vKDdQ==", - "dev": true, - "requires": { - "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" - } - } + "engines": { + "node": ">=8" } }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "node_modules/is-core-module": { + "version": "2.16.2", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.2.tgz", + "integrity": "sha512-evOr8xfXKxE6qSR0hSXL2r3sd7ALj8+7jQEUvPYcm5sgZFdJ+AYzT6yNmJenvIYQBgIGwfwz08sL8zoL7yq2BA==", "dev": true, - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, + "license": "MIT", "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 - } + "hasown": "^2.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "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": { + "node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=" + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "engines": { + "node": ">=0.10.0" + } }, - "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" + "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==", + "engines": { + "node": ">=8" } }, - "is-glob": { + "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==", - "requires": { + "dependencies": { "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" } }, - "is-natural-number": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-natural-number/-/is-natural-number-4.0.1.tgz", - "integrity": "sha1-q5124dtM7VHjXeDHLr7PCfc0zeg=", - "dev": true - }, - "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": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "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, - "requires": { - "kind-of": "^3.0.2" + "license": "MIT", + "engines": { + "node": ">=12" }, - "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" - } - } + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "is-plain-obj": { + "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 + "dev": true, + "engines": { + "node": ">=8" + } }, - "is-plain-object": { + "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": "sha1-LBY7P6+xtgbZ0Xko8FwqHDjgdnc=", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", "dev": true, - "requires": { + "license": "MIT", + "dependencies": { "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" } }, - "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": { + "node_modules/is-stream": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" - }, - "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", - "integrity": "sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==", - "dev": true, - "requires": { - "unc-path-regex": "^0.1.2" + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "engines": { + "node": ">=0.10.0" } }, - "is-unicode-supported": { + "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 - }, - "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 + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "isarray": { + "node_modules/isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" }, - "isexe": { + "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" }, - "isobject": { + "node_modules/isobject": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } }, - "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 + "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": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } }, - "jdk-utils": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/jdk-utils/-/jdk-utils-0.4.4.tgz", - "integrity": "sha512-QSwVdPtwdHRvY6zDD0GOZo5Fu7AdgfNDyizZWhk16jnrcLTPbmsww4WLDC+5wyxCWm8izZZfmjTVcicdreuJLw==" + "node_modules/jdk-utils": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/jdk-utils/-/jdk-utils-0.6.0.tgz", + "integrity": "sha512-/CHgo6Q5xyfW/+vWXLz7cAb+iwIye3mNo7SV8UTHsbLhRykk+N7LzKXRlCvdeoblyuTrA8pb00iZX8De3txvWQ==", + "license": "MIT", + "bin": { + "jdk-utils": "bin/cli.js" + } }, - "jest-worker": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz", - "integrity": "sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==", + "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, - "requires": { + "license": "MIT", + "dependencies": { "@types/node": "*", "merge-stream": "^2.0.0", - "supports-color": "^7.0.0" + "supports-color": "^8.0.0" }, - "dependencies": { - "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 - }, - "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" - } - } + "engines": { + "node": ">= 10.13.0" } }, - "js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "node_modules/jose": { + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/jose/-/jose-5.10.0.tgz", + "integrity": "sha512-s+3Al/p9g32Iq+oqXxkW//7jk2Vig6FF1CFqzVXoTUXt2qz89YWbL+OwS17NFYEvxC35n0FKeGO2LGYSxeM2Gg==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/panva" + } + }, + "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/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, - "requires": { + "license": "MIT", + "dependencies": { "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" } }, - "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 + "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, + "license": "MIT" }, - "json-schema": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", - "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", + "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 }, - "json-schema-traverse": { + "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 + "dev": true, + "license": "MIT" }, - "json-stable-stringify-without-jsonify": { + "node_modules/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", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", - "dev": true - }, - "jsonfile": { + "node_modules/jsonfile": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", - "requires": { + "optionalDependencies": { "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==", + "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, - "requires": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.4.0", - "verror": "1.10.0" + "dependencies": { + "lie": "~3.3.0", + "pako": "~1.0.2", + "readable-stream": "~2.3.6", + "setimmediate": "^1.0.5" } }, - "just-debounce": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/just-debounce/-/just-debounce-1.1.0.tgz", - "integrity": "sha512-qpcRocdkUmf+UTNBYx5w6dexX5J31AKK1OmPwH630a83DdVVUIngk55RSAiIGpQyoH0dlr872VHfPjnQnK1qDQ==", + "node_modules/just-extend": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-6.2.0.tgz", + "integrity": "sha512-cYofQu2Xpom82S6qD778jBDpwvvy39s1l/hrYij2u9AMdQcGRpaBu6kY4mVhuno5kJVi1DAz4aiphA2WI1/OAw==", "dev": true }, - "just-extend": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-4.2.1.tgz", - "integrity": "sha512-g3UB796vUFIY90VIv/WX3L2c8CS2MdWUww3CNrYmqza1Fg0DURc2K/O4YrnklBdQarSJ/y8JnJYDGc+1iumQjg==", - "dev": true + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } }, - "kind-of": { + "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 + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } }, - "kuler": { + "node_modules/kuler": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/kuler/-/kuler-1.0.1.tgz", "integrity": "sha512-J9nVUucG1p/skKul6DU3PUZrhs0LPulNaeUOox0IyXDi8S4CztTHs1gQphhuZmzXG7VOQSf6NJfKuzteQLv9gQ==", - "requires": { + "dependencies": { "colornames": "^1.1.1" } }, - "last-run": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/last-run/-/last-run-1.1.1.tgz", - "integrity": "sha1-RblpQsF7HHnHchmCWbqUO+v4yls=", - "dev": true, - "requires": { - "default-resolution": "^2.0.0", - "es6-weak-map": "^2.0.1" - } - }, - "lazystream": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.1.tgz", - "integrity": "sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==", - "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" + "node_modules/lcid": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-3.1.1.tgz", + "integrity": "sha512-M6T051+5QCGLBQb8id3hdvIW8+zeFV2FyBGFS9IEK5H9Wt4MueD4bW1eWikpHgZp+5xR3l5c8pZUkQsIA0BFZg==", + "license": "MIT", + "dependencies": { + "invert-kv": "^3.0.0" + }, + "engines": { + "node": ">=8" } }, - "levn": { + "node_modules/levn": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", "dev": true, - "requires": { + "license": "MIT", + "dependencies": { "prelude-ls": "^1.2.1", "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" } }, - "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" + "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" } }, - "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 - }, - "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=", + "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, - "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" + "license": "MIT", + "engines": { + "node": ">=6.11.5" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" } }, - "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==", - "dev": true - }, - "locate-path": { + "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, - "requires": { + "dependencies": { "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" - }, - "lodash._basecopy": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz", - "integrity": "sha512-rFR6Vpm4HeCK1WPGvjZSJ+7yik8d8PVUdCJx5rT2pogG4Ve/2ZS7kfmO5l5T2o5V2mqlNIfSF5MZlr1+xOoYQQ==", - "dev": true - }, - "lodash._basetostring": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/lodash._basetostring/-/lodash._basetostring-3.0.1.tgz", - "integrity": "sha512-mTzAr1aNAv/i7W43vOR/uD/aJ4ngbtsRaCubp2BfZhlGU/eORUjg/7F6X0orNMdv33JOrdgGybtvMN/po3EWrA==", - "dev": true - }, - "lodash._basevalues": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash._basevalues/-/lodash._basevalues-3.0.0.tgz", - "integrity": "sha512-H94wl5P13uEqlCg7OcNNhMQ8KvWSIyqXzOPusRgHC9DK3o54P6P3xtbXlVbRABG4q5gSmp7EDdJ0MSuW9HX6Mg==", - "dev": true - }, - "lodash._getnative": { - "version": "3.9.1", - "resolved": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz", - "integrity": "sha512-RrL9VxMEPyDMHOd9uFbvMe8X55X16/cGM5IgOKgRElQZutpX89iS6vwl64duTV1/16w5JY7tuFNXqoekmh1EmA==", - "dev": true - }, - "lodash._isiterateecall": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz", - "integrity": "sha512-De+ZbrMu6eThFti/CSzhRvTKMgQToLxbij58LMfM8JnYDNSOjkjTCIaa8ixglOeGh2nyPlakbt5bJWJ7gvpYlQ==", - "dev": true - }, - "lodash._reescape": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash._reescape/-/lodash._reescape-3.0.0.tgz", - "integrity": "sha512-Sjlavm5y+FUVIF3vF3B75GyXrzsfYV8Dlv3L4mEpuB9leg8N6yf/7rU06iLPx9fY0Mv3khVp9p7Dx0mGV6V5OQ==", - "dev": true - }, - "lodash._reevaluate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash._reevaluate/-/lodash._reevaluate-3.0.0.tgz", - "integrity": "sha512-OrPwdDc65iJiBeUe5n/LIjd7Viy99bKwDdk7Z5ljfZg0uFRFlfQaCy9tZ4YMAag9WAZmlVpe1iZrkIMMSMHD3w==", - "dev": true - }, - "lodash._reinterpolate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", - "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=", - "dev": true - }, - "lodash._root": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/lodash._root/-/lodash._root-3.0.1.tgz", - "integrity": "sha512-O0pWuFSK6x4EXhM1dhZ8gchNtG7JMqBtrHdoUFUWXD7dJnNSUze1GuyQr5sOs0aCvgGeI3o/OJW8f4ca7FDxmQ==", - "dev": true - }, - "lodash.escape": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/lodash.escape/-/lodash.escape-3.2.0.tgz", - "integrity": "sha512-n1PZMXgaaDWZDSvuNZ/8XOcYO2hOKDqZel5adtR30VKQAtoWs/5AOeFA0vPV8moiPzlqe7F4cP2tzpFewQyelQ==", - "dev": true, - "requires": { - "lodash._root": "^3.0.0" - } + "node_modules/lodash": { + "version": "4.17.23", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.23.tgz", + "integrity": "sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w==", + "license": "MIT" }, - "lodash.findindex": { + "node_modules/lodash.findindex": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/lodash.findindex/-/lodash.findindex-4.6.0.tgz", "integrity": "sha1-oyRd7mH7m24GJLU1ElYku2nBEQY=", "dev": true }, - "lodash.get": { + "node_modules/lodash.get": { "version": "4.4.2", "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", "integrity": "sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==", + "deprecated": "This package is deprecated. Use the optional chaining (?.) operator instead.", "dev": true }, - "lodash.isarguments": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", - "integrity": "sha512-chi4NHZlZqZD18a0imDHnZPrDeBbTtVN7GXMwuGdRH9qotxAjYs3aVLKc7zNOG9eddR5Ksd8rvFEBc9SsggPpg==", - "dev": true - }, - "lodash.isarray": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz", - "integrity": "sha512-JwObCrNJuT0Nnbuecmqr5DgtuBppuCvGD9lxjFpAzwnVtdGoDQ1zig+5W8k5/6Gcn0gZ3936HDAlGd28i7sOGQ==", - "dev": true - }, - "lodash.keys": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz", - "integrity": "sha512-CuBsapFjcubOGMn3VD+24HOAPxM79tH+V6ivJL3CHYjtrawauDJHUk//Yew9Hvc6e9rbCrURGk8z6PC+8WJBfQ==", + "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, - "requires": { - "lodash._getnative": "^3.0.0", - "lodash.isarguments": "^3.0.0", - "lodash.isarray": "^3.0.0" + "dependencies": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true - }, - "lodash.restparam": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/lodash.restparam/-/lodash.restparam-3.6.1.tgz", - "integrity": "sha512-L4/arjjuq4noiUJpt3yS6KIKDtJwNe2fIYgMqyYYKoeIfV1iEqvPwhCx23o+R9dzouGihDAPN1dTIRWa7zk8tw==", - "dev": true - }, - "lodash.template": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-4.5.0.tgz", - "integrity": "sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A==", - "dev": true, - "requires": { - "lodash._reinterpolate": "^3.0.0", - "lodash.templatesettings": "^4.0.0" - }, - "dependencies": { - "lodash.templatesettings": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-4.2.0.tgz", - "integrity": "sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ==", - "dev": true, - "requires": { - "lodash._reinterpolate": "^3.0.0" - } - } + "node_modules/log-symbols/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "lodash.templatesettings": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-3.1.1.tgz", - "integrity": "sha512-TcrlEr31tDYnWkHFWDCV3dHYroKEXpJZ2YJYvJdhN+y4AkWMDZ5I4I8XDtUKqSAyG81N7w+I1mFEJtcED+tGqQ==", + "node_modules/log-symbols/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, - "requires": { - "lodash._reinterpolate": "^3.0.0", - "lodash.escape": "^3.0.0" + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "log-symbols": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", - "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "node_modules/log-symbols/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, - "requires": { - "chalk": "^4.1.0", - "is-unicode-supported": "^0.1.0" + "dependencies": { + "color-name": "~1.1.4" }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/log-symbols/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/log-symbols/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, "dependencies": { - "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, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "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", - "supports-color": "^7.1.0" - } - }, - "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, - "requires": { - "color-name": "~1.1.4" - } - }, - "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 - }, - "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" - } - } + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" } }, - "logform": { + "node_modules/logform": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/logform/-/logform-2.1.2.tgz", "integrity": "sha512-+lZh4OpERDBLqjiwDLpAWNQu6KMjnlXH2ByZwCuSqVPJletw0kTWJf5CgSNAUKn1KUkv3m2cUz/LK8zyEy7wzQ==", - "requires": { + "dependencies": { "colors": "^1.2.1", "fast-safe-stringify": "^2.0.4", "fecha": "^2.3.3", "ms": "^2.1.1", "triple-beam": "^1.3.0" - }, - "dependencies": { - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - } - } - }, - "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==", - "requires": { - "yallist": "^4.0.0" } }, - "make-dir": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", - "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", - "dev": true, - "requires": { - "pify": "^3.0.0" - }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", "dependencies": { - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "dev": true - } - } - }, - "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" + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" } }, - "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-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" + "node_modules/map-age-cleaner": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz", + "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==", + "license": "MIT", + "dependencies": { + "p-defer": "^1.0.0" + }, + "engines": { + "node": ">=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": { - "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" - } - } + "node_modules/mem": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/mem/-/mem-5.1.1.tgz", + "integrity": "sha512-qvwipnozMohxLXG1pOqoLiZKNkC4r4qqRucSoDwXowsNGDSULiqFTRUF05vcZWnwJSG22qTsynQhxbaMtnX9gw==", + "license": "MIT", + "dependencies": { + "map-age-cleaner": "^0.1.3", + "mimic-fn": "^2.1.0", + "p-is-promise": "^2.1.0" + }, + "engines": { + "node": ">=8" } }, - "merge-stream": { + "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 - }, - "merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" }, - "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" + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" } }, - "mime-db": { + "node_modules/mime-db": { "version": "1.51.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.51.0.tgz", "integrity": "sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g==", - "dev": true + "dev": true, + "engines": { + "node": ">= 0.6" + } }, - "mime-types": { + "node_modules/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==", "dev": true, - "requires": { + "dependencies": { "mime-db": "1.51.0" + }, + "engines": { + "node": ">= 0.6" } }, - "mimic-fn": { + "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" + } }, - "minimatch": { - "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" + "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" + } + }, + "node_modules/mini-css-extract-plugin": { + "version": "2.9.4", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.9.4.tgz", + "integrity": "sha512-ZWYT7ln73Hptxqxk2DxPU9MmapXRhxkJD6tkSR04dnQxm8BGu2hzgKLugK5yySD97u/8yy7Ma7E76k9ZdvtjkQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "schema-utils": "^4.0.0", + "tapable": "^2.2.1" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + } + }, + "node_modules/minimatch": { + "version": "10.2.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz", + "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==", + "license": "BlueOak-1.0.0", + "dependencies": { + "brace-expansion": "^5.0.5" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "minimist": { + "node_modules/minimist": { "version": "1.2.6", - "resolved": "https://repository.engineering.redhat.com/nexus/repository/registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", "dev": true }, - "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" - } - } + "node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/minizlib": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.1.0.tgz", + "integrity": "sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "minipass": "^7.1.2" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/mocha": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-11.1.0.tgz", + "integrity": "sha512-8uJR5RTC2NgpY3GrYcgpZrsEd9zKbPDpob1RezyR2upGHRQtHWofmzTMzTMSV6dru3tj5Ukt0+Vnq1qhFEEwAg==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-colors": "^4.1.3", + "browser-stdout": "^1.3.1", + "chokidar": "^3.5.3", + "debug": "^4.3.5", + "diff": "^5.2.0", + "escape-string-regexp": "^4.0.0", + "find-up": "^5.0.0", + "glob": "^10.4.5", + "he": "^1.2.0", + "js-yaml": "^4.1.0", + "log-symbols": "^4.1.0", + "minimatch": "^5.1.6", + "ms": "^2.1.3", + "serialize-javascript": "^6.0.2", + "strip-json-comments": "^3.1.1", + "supports-color": "^8.1.1", + "workerpool": "^6.5.1", + "yargs": "^17.7.2", + "yargs-parser": "^21.1.1", + "yargs-unparser": "^2.0.0" + }, + "bin": { + "_mocha": "bin/_mocha", + "mocha": "bin/mocha.js" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/mocha/node_modules/ansi-colors": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", + "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/mocha/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/mocha/node_modules/brace-expansion": { + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" } }, - "mkdirp": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "node_modules/mocha/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, - "requires": { - "minimist": "^1.2.6" + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" } }, - "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" - }, - "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 - }, - "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, - "requires": { - "color-convert": "^2.0.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" - } - }, - "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, - "requires": { - "color-name": "~1.1.4" - } - }, - "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 - }, - "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 - } - } - }, - "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 - }, - "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, - "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.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" - } - } - } - }, - "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 - }, - "minimatch": { - "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" - } - }, - "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 - }, - "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" - } - }, - "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" - } - }, - "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 - } + "node_modules/mocha/node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "moment": { - "version": "2.29.4", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.4.tgz", - "integrity": "sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==" + "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": "ISC", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true + "node_modules/mocha/node_modules/glob/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": "ISC", + "dependencies": { + "brace-expansion": "^2.0.2" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } }, - "multipipe": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/multipipe/-/multipipe-0.1.2.tgz", - "integrity": "sha512-7ZxrUybYv9NonoXgwoOqtStIu18D1c3eFZj27hqgf5kBrBF8Q+tE8V0MW8dKM5QLkQPh1JhhbKgHLY9kifov4Q==", + "node_modules/mocha/node_modules/minimatch": { + "version": "5.1.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.9.tgz", + "integrity": "sha512-7o1wEA2RyMP7Iu7GNba9vc0RWWGACJOCZBJX2GJWip0ikV+wcOsgVuY9uE8CPiyQhkGFSlhuSkZPavN7u1c2Fw==", "dev": true, - "requires": { - "duplexer2": "0.0.2" + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" } }, - "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 + "node_modules/mocha/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } }, - "nan": { - "version": "2.17.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.17.0.tgz", - "integrity": "sha512-2ZTgtl0nJsO0KQCjEpxcIr5D+Yv90plTitZt9JBfQvVJDS5seMl3FOvsh3+9CoYWXf/1l5OaZzzF6nDm4cagaQ==", + "node_modules/mocha/node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", "dev": true, - "optional": true + "license": "MIT", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } }, - "nanoid": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.1.tgz", - "integrity": "sha512-n6Vs/3KGyxPQd6uO0eH4Bv0ojGSUvuLlIHtC3Y0kEO23YRge8H9x1GCzLn28YX0H66pMkxuaeESFq4tKISKwdw==", - "dev": true + "node_modules/mocha/node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=12" + } }, - "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" + "node_modules/moment": { + "version": "2.29.4", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.4.tgz", + "integrity": "sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==", + "engines": { + "node": "*" + } + }, + "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==", + "license": "MIT" + }, + "node_modules/nanoid": { + "version": "3.3.8", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.8.tgz", + "integrity": "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" } }, - "natural-compare": { + "node_modules/natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", "dev": true }, - "neo-async": { + "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 }, - "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 + "node_modules/nise": { + "version": "5.1.9", + "resolved": "https://registry.npmjs.org/nise/-/nise-5.1.9.tgz", + "integrity": "sha512-qOnoujW4SV6e40dYxJOb3uvuoPHtmLzIk4TFo+j0jPJoC+5Z9xja5qH5JZobEPsa8+YYphMrOSwnrshEhG2qww==", + "dev": true, + "dependencies": { + "@sinonjs/commons": "^3.0.0", + "@sinonjs/fake-timers": "^11.2.2", + "@sinonjs/text-encoding": "^0.7.2", + "just-extend": "^6.2.0", + "path-to-regexp": "^6.2.1" + } }, - "nise": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/nise/-/nise-5.1.1.tgz", - "integrity": "sha512-yr5kW2THW1AkxVmCnKEh4nbYkJdB3I7LUkiUgOvEkOp414mc2UMaHMA7pjq1nYowhdoJZGwEKGaQVbxfpWj10A==", + "node_modules/nise/node_modules/@sinonjs/commons": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", + "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", "dev": true, - "requires": { - "@sinonjs/commons": "^1.8.3", - "@sinonjs/fake-timers": ">=5", - "@sinonjs/text-encoding": "^0.7.1", - "just-extend": "^4.0.2", - "path-to-regexp": "^1.7.0" + "dependencies": { + "type-detect": "4.0.8" } }, - "node-releases": { - "version": "1.1.72", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.72.tgz", - "integrity": "sha512-LLUo+PpH3dU6XizX3iVoubUNheF/owjXCZZ5yACDxNnPtgFuludV1ZL3ayK1kVep42Rmm0+R9/Y60NQbZ2bifw==", - "dev": true + "node_modules/nise/node_modules/@sinonjs/fake-timers": { + "version": "11.3.1", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-11.3.1.tgz", + "integrity": "sha512-EVJO7nW5M/F5Tur0Rf2z/QoMo+1Ia963RiMtapiQrEWvY0iBUvADo8Beegwjpnle5BHkyHuoxSTW3jF43H1XRA==", + "dev": true, + "dependencies": { + "@sinonjs/commons": "^3.0.1" + } }, - "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": { - "resolve": { - "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.2.0", - "path-parse": "^1.0.6" - } - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true + "node_modules/node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "license": "MIT", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true } } }, - "normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "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, - "requires": { - "remove-trailing-separator": "^1.0.1" - } + "license": "MIT" }, - "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" + "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==", + "engines": { + "node": ">=0.10.0" } }, - "npm-run-path": { + "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, - "requires": { + "dependencies": { "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" } }, - "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": { + "node_modules/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", - "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-hash": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-1.3.1.tgz", - "integrity": "sha512-OSuu/pU4ENM9kmREg0BdNrUDIl1heYa4mBZacJc+vVWz4GtAwu7jO8s4AIt2aGRUTqxykpWzI3Oqnsm13tTMDA==" - }, - "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" + "engines": { + "node": ">=0.10.0" } }, - "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" + "node_modules/object-hash": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-2.2.0.tgz", + "integrity": "sha512-gScRMn0bS5fH+IuwyIFgnh9zBdo4DV+6GhygmWM9HyNJSgS0hScp1f5vjtm7oIIOiT9trXrShAkLFSc2IqKNgw==", + "engines": { + "node": ">= 6" } }, - "once": { + "node_modules/once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "requires": { + "dependencies": { "wrappy": "1" } }, - "one-time": { + "node_modules/one-time": { "version": "0.0.4", "resolved": "https://registry.npmjs.org/one-time/-/one-time-0.0.4.tgz", "integrity": "sha1-+M33eISCb+Tf+T46nMN7HkSAdC4=" }, - "onetime": { + "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, - "requires": { + "dependencies": { "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "optionator": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", - "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "node_modules/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", "dev": true, - "requires": { + "license": "MIT", + "dependencies": { "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", "levn": "^0.4.1", "prelude-ls": "^1.2.1", "type-check": "^0.4.0", - "word-wrap": "^1.2.3" + "word-wrap": "^1.2.5" }, + "engines": { + "node": ">= 0.8.0" + } + }, + "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": { - "fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", - "dev": true - } + "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": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "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=", + "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" + }, + "node_modules/ora/node_modules/is-unicode-supported": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-2.1.0.tgz", + "integrity": "sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ora/node_modules/log-symbols": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-6.0.0.tgz", + "integrity": "sha512-i24m8rpwhmPIS4zscNzK6MSEhk0DUWa/8iYQWxhffV8jkI4Phvs3F+quL5xvS0gdQR0FyTCMMH33Y78dDTzzIw==", "dev": true, - "requires": { - "readable-stream": "^2.0.1" + "license": "MIT", + "dependencies": { + "chalk": "^5.3.0", + "is-unicode-supported": "^1.3.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "os-locale": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", - "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", + "node_modules/ora/node_modules/log-symbols/node_modules/is-unicode-supported": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-1.3.0.tgz", + "integrity": "sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ora/node_modules/string-width": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", "dev": true, - "requires": { - "lcid": "^1.0.0" + "license": "MIT", + "dependencies": { + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/os-locale": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-5.0.0.tgz", + "integrity": "sha512-tqZcNEDAIZKBEPnHPlVDvKrp7NzgLi7jRmhKiUoa2NUmhl13FtkAGLUVR+ZsYvApBQdBfYm43A4tXXQ4IrYLBA==", + "license": "MIT", + "dependencies": { + "execa": "^4.0.0", + "lcid": "^3.0.0", + "mem": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/os-locale/node_modules/execa": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz", + "integrity": "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==", + "license": "MIT", + "dependencies": { + "cross-spawn": "^7.0.0", + "get-stream": "^5.0.0", + "human-signals": "^1.1.1", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.0", + "onetime": "^5.1.0", + "signal-exit": "^3.0.2", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/os-locale/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==", + "license": "MIT", + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/os-locale/node_modules/human-signals": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", + "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==", + "license": "Apache-2.0", + "engines": { + "node": ">=8.12.0" } }, - "p-limit": { + "node_modules/os-locale/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==", + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-defer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", + "integrity": "sha512-wB3wfAxZpk2AzOfUMJNL+d36xothRSyj8EXOa4f6GMqYDN9BJaaSISbsk+wS9abmnebVw95C2Kb5t85UmpCxuw==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/p-is-promise": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-2.1.0.tgz", + "integrity": "sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "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, - "requires": { + "dependencies": { "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "p-locate": { + "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, - "requires": { + "dependencies": { "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "p-try": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.0.0.tgz", - "integrity": "sha512-hMp0onDKIajHfIkdRk3P4CdCmErkYAxxDtP3Wx/4nZ3aGlau2VKh3mZpcuFkH27WQkL/3WBCPOktzA9ZOAnMQQ==", - "dev": true - }, - "parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, - "requires": { - "callsites": "^3.0.0" - } - }, - "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": { + "node_modules/p-try": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", - "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", "dev": true, - "requires": { - "error-ex": "^1.2.0" + "license": "MIT", + "engines": { + "node": ">=6" } }, - "parse-node-version": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/parse-node-version/-/parse-node-version-1.0.0.tgz", - "integrity": "sha512-02GTVHD1u0nWc20n2G7WX/PgdhNFG04j5fi1OkaJzPWLTcf6vh6229Lta1wTmXG/7Dg42tCssgkccVt7qvd8Kg==", - "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 - }, - "pascalcase": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", - "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", - "dev": true + "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==", + "license": "BlueOak-1.0.0" }, - "path-dirname": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", - "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", + "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 }, - "path-exists": { + "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 - }, - "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=" + "dev": true, + "engines": { + "node": ">=8" + } }, - "path-key": { + "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" + } }, - "path-parse": { + "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, + "license": "MIT" + }, + "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": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/path-to-regexp": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.3.0.tgz", + "integrity": "sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==", "dev": true }, - "path-root": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/path-root/-/path-root-0.1.1.tgz", - "integrity": "sha1-mkpoFMrBwM1zNgqV8yCDyOpHRbc=", + "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==", + "license": "MIT", + "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, - "requires": { - "path-root-regex": "^0.1.0" + "license": "MIT", + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" } }, - "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-to-regexp": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz", - "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==", + "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, - "requires": { - "isarray": "0.0.1" - }, + "license": "MIT", "dependencies": { - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", - "dev": true - } + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" } }, - "path-type": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", - "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", + "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, - "requires": { - "graceful-fs": "^4.1.2", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" + "license": "MIT", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=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": { + "node_modules/pkg-dir/node_modules/p-limit": { "version": "2.3.0", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz", - "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==" + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true + "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": ">=8" + } }, - "pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", - "dev": true + "node_modules/postcss": { + "version": "8.5.3", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.3.tgz", + "integrity": "sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "nanoid": "^3.3.8", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } }, - "pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "node_modules/postcss-modules-extract-imports": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.1.0.tgz", + "integrity": "sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q==", "dev": true, - "requires": { - "pinkie": "^2.0.0" + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" } }, - "pkg-dir": { + "node_modules/postcss-modules-local-by-default": { "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==", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.2.0.tgz", + "integrity": "sha512-5kcJm/zk+GJDSfw+V/42fJ5fhjL5YbFDl8nVdXkJPLLW+Vf9mTD5Xe0wqIaDnLuL2U6cDNpTr+UQ+v2HWIBhzw==", "dev": true, - "requires": { - "find-up": "^4.0.0" + "dependencies": { + "icss-utils": "^5.0.0", + "postcss-selector-parser": "^7.0.0", + "postcss-value-parser": "^4.1.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-scope": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.2.1.tgz", + "integrity": "sha512-m9jZstCVaqGjTAuny8MdgE88scJnCiQSlSrOWcTQgM2t32UBe+MUmFSO5t7VMSfAf/FJKImAxBav8ooCHJXCJA==", + "dev": true, "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" - } - }, - "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 - } + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" } }, - "plugin-error": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/plugin-error/-/plugin-error-1.0.1.tgz", - "integrity": "sha512-L1zP0dk7vGweZME2i+EeakvUNqSrdiI3F91TwEoYiGrAfUXmVv6fJIq4g82PAXxNsWOp0J7ZqQy/3Szz0ajTxA==", + "node_modules/postcss-modules-values": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", + "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", + "dev": true, + "dependencies": { + "icss-utils": "^5.0.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-selector-parser": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", + "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", "dev": true, - "requires": { - "ansi-colors": "^1.0.1", - "arr-diff": "^4.0.0", - "arr-union": "^3.1.0", - "extend-shallow": "^3.0.2" + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" } }, - "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=", + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", "dev": true }, - "prelude-ls": { + "node_modules/prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "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 + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } }, - "process-nextick-args": { + "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 + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" }, - "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": "2.0.1", - "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", - "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", - "dev": true, - "requires": { + "node_modules/pump": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.3.tgz", + "integrity": "sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA==", + "license": "MIT", + "dependencies": { "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": { + "node_modules/punycode": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "dev": true - }, - "qs": { - "version": "6.5.3", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", - "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==", - "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==", - "dev": true + "dev": true, + "engines": { + "node": ">=6" + } }, - "randombytes": { + "node_modules/randombytes": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", "dev": true, - "requires": { + "dependencies": { "safe-buffer": "^5.1.0" } }, - "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" + "node_modules/react": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react/-/react-17.0.2.tgz", + "integrity": "sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA==", + "dependencies": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1" + }, + "engines": { + "node": ">=0.10.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" + "node_modules/react-dom": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-17.0.2.tgz", + "integrity": "sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA==", + "dependencies": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1", + "scheduler": "^0.20.2" + }, + "peerDependencies": { + "react": "17.0.2" } }, - "readable-stream": { + "node_modules/readable-stream": { "version": "2.3.6", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "requires": { + "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", "isarray": "~1.0.0", @@ -5830,1679 +4156,1398 @@ "safe-buffer": "~5.1.1", "string_decoder": "~1.1.1", "util-deprecate": "~1.0.1" - }, - "dependencies": { - "process-nextick-args": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", - "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==" - } } }, - "readdirp": { + "node_modules/readdirp": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "requires": { + "dependencies": { "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" } }, - "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" - } - }, - "regexpp": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", - "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", - "dev": true - }, - "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=", + "node_modules/rechoir": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.8.0.tgz", + "integrity": "sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==", "dev": true, - "requires": { - "remove-bom-buffer": "^3.0.0", - "safe-buffer": "^5.1.0", - "through2": "^2.0.3" + "license": "MIT", + "dependencies": { + "resolve": "^1.20.0" + }, + "engines": { + "node": ">= 10.13.0" } }, - "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", - "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": { + "node_modules/require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", - "dev": true + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "require-from-string": { + "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 - }, - "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 + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "resolve": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.8.1.tgz", - "integrity": "sha512-AicPrAC7Qu1JxPCZ9ZgCZlY35QgFnNqc+0LtbRNxnVw4TXvjQ72wnuL9JQcEBgXkI9JM8MsT9kaQoHcpCRJOYA==", + "node_modules/resolve": { + "version": "1.22.12", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.12.tgz", + "integrity": "sha512-TyeJ1zif53BPfHootBGwPRYT1RUt6oGWsaQr8UyZW/eAm9bKoijtvruSDEmZHm92CwS9nj7/fWttqPCgzep8CA==", "dev": true, - "requires": { - "path-parse": "^1.0.5" + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "is-core-module": "^2.16.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "resolve-cwd": { + "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, - "requires": { + "license": "MIT", + "dependencies": { "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" } }, - "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": { + "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 - }, - "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" + "license": "MIT", + "engines": { + "node": ">=8" } }, - "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", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true + "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" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "node_modules/restore-cursor/node_modules/onetime": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-7.0.0.tgz", + "integrity": "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==", "dev": true, - "requires": { - "glob": "^7.1.3" + "license": "MIT", + "dependencies": { + "mimic-function": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "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/restore-cursor/node_modules/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, - "requires": { - "queue-microtask": "^1.2.2" + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "safe-buffer": { + "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==" }, - "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" + "node_modules/safe-stable-stringify": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.4.3.tgz", + "integrity": "sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g==", + "engines": { + "node": ">=10" } }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true + "node_modules/scheduler": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.20.2.tgz", + "integrity": "sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ==", + "dependencies": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1" + } }, - "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==", + "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, - "requires": { - "@types/json-schema": "^7.0.6", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - }, + "license": "MIT", "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" - } - }, - "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 - } + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" } }, - "seek-bzip": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/seek-bzip/-/seek-bzip-1.0.6.tgz", - "integrity": "sha512-e1QtP3YL5tWww8uKaOCQ18UxIT2laNBXHjV/S2WYCiK4udiv8lkG89KRIoCjUagnAmCBurjF4zEVX2ByBbnCjQ==", + "node_modules/schema-utils/node_modules/ajv": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", "dev": true, - "requires": { - "commander": "^2.8.1" + "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" } }, - "semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", - "requires": { - "lru-cache": "^6.0.0" + "node_modules/schema-utils/node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" } }, - "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" + "node_modules/schema-utils/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true, + "license": "MIT" + }, + "node_modules/semver": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" } }, - "serialize-javascript": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", - "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", + "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==", "dev": true, - "requires": { + "license": "BSD-3-Clause", + "dependencies": { "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-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" - } - } - } - }, - "setimmediate": { + "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 }, - "shallow-clone": { + "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, - "requires": { + "license": "MIT", + "dependencies": { "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=8" } }, - "shebang-command": { + "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, - "requires": { + "dependencies": { "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" } }, - "shebang-regex": { + "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" + } }, - "signal-exit": { + "node_modules/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 + "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==" }, - "simple-swizzle": { + "node_modules/simple-swizzle": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", "integrity": "sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=", - "requires": { - "is-arrayish": "^0.3.1" - }, "dependencies": { - "is-arrayish": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", - "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==" - } + "is-arrayish": "^0.3.1" } }, - "sinon": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/sinon/-/sinon-14.0.0.tgz", - "integrity": "sha512-ugA6BFmE+WrJdh0owRZHToLd32Uw3Lxq6E6LtNRU+xTVBefx632h03Q7apXWRsRdZAJ41LB8aUfn2+O4jsDNMw==", + "node_modules/simple-swizzle/node_modules/is-arrayish": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", + "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==" + }, + "node_modules/sinon": { + "version": "14.0.2", + "resolved": "https://registry.npmjs.org/sinon/-/sinon-14.0.2.tgz", + "integrity": "sha512-PDpV0ZI3ZCS3pEqx0vpNp6kzPhHrLx72wA0G+ZLaaJjLIYeE0n8INlgaohKuGy7hP0as5tbUd23QWu5U233t+w==", + "deprecated": "16.1.1", "dev": true, - "requires": { - "@sinonjs/commons": "^1.8.3", + "dependencies": { + "@sinonjs/commons": "^2.0.0", "@sinonjs/fake-timers": "^9.1.2", - "@sinonjs/samsam": "^6.1.1", + "@sinonjs/samsam": "^7.0.1", "diff": "^5.0.0", - "nise": "^5.1.1", + "nise": "^5.1.2", "supports-color": "^7.2.0" }, - "dependencies": { - "diff": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-5.1.0.tgz", - "integrity": "sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw==", - "dev": true - }, - "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 - }, - "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" - } - } - } - }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true - }, - "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" - } - } - } - }, - "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" - } - } + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/sinon" } }, - "snapdragon-util": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", - "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", + "node_modules/sinon/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, - "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" - } - } + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" } }, - "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.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } }, - "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==", + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", "dev": true, - "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" + "engines": { + "node": ">=0.10.0" } }, - "source-map-support": { + "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, - "requires": { + "license": "MIT", + "dependencies": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" - }, - "dependencies": { - "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 - } } }, - "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" + "node_modules/stack-trace": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", + "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=", + "engines": { + "node": "*" } }, - "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==", + "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, - "requires": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "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" + "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==", + "dependencies": { + "safe-buffer": "~5.1.0" } }, - "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" + "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==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" } }, - "stack-trace": { - "version": "0.0.10", - "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", - "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=" - }, - "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" - } - } + "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==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" } }, - "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 + "node_modules/string-width-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } }, - "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 + "node_modules/string-width-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } }, - "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" + "node_modules/string-width/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==", + "engines": { + "node": ">=8" } }, - "string_decoder": { - "version": "1.1.1", - "resolved": "http://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "requires": { - "safe-buffer": "~5.1.0" + "node_modules/string-width/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==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" } }, - "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" + "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==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.2.2" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, - "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" + "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==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" } }, - "strip-dirs": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/strip-dirs/-/strip-dirs-2.1.0.tgz", - "integrity": "sha1-SYdzYmT8NEzyD2w0rKnRPR1O1sU=", - "dev": true, - "requires": { - "is-natural-number": "^4.0.1" + "node_modules/strip-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", + "engines": { + "node": ">=8" } }, - "strip-final-newline": { + "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": ">=6" + } }, - "strip-json-comments": { + "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 - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://repository.engineering.redhat.com/nexus/repository/registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==", - "dev": true - }, - "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", - "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", - "dev": true - }, - "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" - } - }, - "terser": { - "version": "5.15.1", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.15.1.tgz", - "integrity": "sha512-K1faMUvpm/FBxjBXud0LWVAGxmvoPbZbfTCYbSgaaYQaIXI3/TdI7a7ZGA73Zrou6Q8Zmz3oeUTsp/dj+ag2Xw==", - "dev": true, - "requires": { - "@jridgewell/source-map": "^0.3.2", - "acorn": "^8.5.0", - "commander": "^2.20.0", - "source-map-support": "~0.5.20" + "engines": { + "node": ">=8" }, - "dependencies": { - "acorn": { - "version": "8.8.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.1.tgz", - "integrity": "sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA==", - "dev": true - } + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "terser-webpack-plugin": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.1.1.tgz", - "integrity": "sha512-5XNNXZiR8YO6X6KhSGXfY0QrGrCRlSwAEjIIrlRQR4W8nP69TaJUlh3bkuac6zzgspiGPfKEHcY295MMVExl5Q==", - "dev": true, - "requires": { - "jest-worker": "^26.6.2", - "p-limit": "^3.1.0", - "schema-utils": "^3.0.0", - "serialize-javascript": "^5.0.1", - "source-map": "^0.6.1", - "terser": "^5.5.1" - }, - "dependencies": { - "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, - "requires": { - "yocto-queue": "^0.1.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" - } - }, - "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 - } + "node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" } }, - "text-hex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/text-hex/-/text-hex-1.0.0.tgz", - "integrity": "sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==" - }, - "text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", - "dev": true - }, - "throttleit": { + "node_modules/supports-preserve-symlinks-flag": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/throttleit/-/throttleit-1.0.0.tgz", - "integrity": "sha1-nnhYNtr0Z0MUWlmEtiaNgoUorGw=", - "dev": true - }, - "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==", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", "dev": true, - "requires": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "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==", + "node_modules/tapable": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.0.tgz", + "integrity": "sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==", "dev": true, - "requires": { - "through2": "~2.0.0", - "xtend": "~4.0.0" + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" } }, - "time-stamp": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-1.1.0.tgz", - "integrity": "sha1-dkpaEa9QVhkhsTPztE5hhofg9cM=", - "dev": true - }, - "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=", + "node_modules/tar": { + "version": "7.5.11", + "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.11.tgz", + "integrity": "sha512-ChjMH33/KetonMTAtpYdgUFr0tbz69Fp2v7zWxQfYZX4g5ZN2nOBXm1R2xyA+lMIKrLKIoKAwFj93jE/avX9cQ==", "dev": true, - "requires": { - "is-absolute": "^1.0.0", - "is-negated-glob": "^1.0.0" + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/fs-minipass": "^4.0.0", + "chownr": "^3.0.0", + "minipass": "^7.1.2", + "minizlib": "^3.1.0", + "yallist": "^5.0.0" + }, + "engines": { + "node": ">=18" } }, - "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/tar/node_modules/yallist": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz", + "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=18" + } }, - "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=", + "node_modules/terser": { + "version": "5.46.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.46.0.tgz", + "integrity": "sha512-jTwoImyr/QbOWFFso3YoU3ik0jBBDJ6JTOQiy/J2YxVJdZCc+5u7skhNwiOR3FQIygFqVUPHl7qbbxtjW2K3Qg==", "dev": true, - "requires": { - "kind-of": "^3.0.2" + "license": "BSD-2-Clause", + "dependencies": { + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.15.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.16", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.16.tgz", + "integrity": "sha512-h9oBFCWrq78NyWWVcSwZarJkZ01c2AyGrzs1crmHZO3QUg9D61Wu4NPjBy69n7JqylFF5y+CsUZYmYEIZ3mR+Q==", + "dev": true, + "license": "MIT", "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" - } + "@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 } } }, - "to-regex": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", - "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", + "node_modules/text-hex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/text-hex/-/text-hex-1.0.0.tgz", + "integrity": "sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==" + }, + "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, - "requires": { - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "regex-not": "^1.0.2", - "safe-regex": "^1.1.0" + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.4" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" } }, - "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=", + "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, - "requires": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } } }, - "to-through": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-through/-/to-through-2.0.0.tgz", - "integrity": "sha1-/JKtq6ByZHvAtn1rA2ZKoZUJOvY=", + "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, - "requires": { - "through2": "^2.0.3" + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" } }, - "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" + "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" } }, - "traverse": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.3.9.tgz", - "integrity": "sha512-iawgk0hLP3SxGKDfnDJf8wTz4p2qImnyihM5Hh/sGvQ3K37dPi/w8sRhdNIxYA1TwFwc5mDhIJq+O0RsvXBKdQ==", - "dev": true + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", + "license": "MIT" }, - "triple-beam": { + "node_modules/triple-beam": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/triple-beam/-/triple-beam-1.3.0.tgz", "integrity": "sha512-XrHUvV5HpdLmIj4uVMxHggLbFSZYIn7HEWsqePZcI50pco+MPqJ50wMGY794X7AOOhxOBAjbkqfAbEe/QMp2Lw==" }, - "ts-loader": { - "version": "9.2.6", - "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.2.6.tgz", - "integrity": "sha512-QMTC4UFzHmu9wU2VHZEmWWE9cUajjfcdcws+Gh7FhiO+Dy0RnR1bNz0YCHqhI0yRowCE9arVnNxYHqELOy9Hjw==", + "node_modules/ts-api-utils": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.5.0.tgz", + "integrity": "sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.12" + }, + "peerDependencies": { + "typescript": ">=4.8.4" + } + }, + "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, - "requires": { + "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/ts-loader/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": { - "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, - "requires": { - "color-convert": "^2.0.1" - } - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "requires": { - "fill-range": "^7.0.1" - } - }, - "chalk": { - "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", - "supports-color": "^7.1.0" - } - }, - "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, - "requires": { - "color-name": "~1.1.4" - } - }, - "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 - }, - "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==", - "dev": true, - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "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 - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true - }, - "micromatch": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", - "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", - "dev": true, - "requires": { - "braces": "^3.0.1", - "picomatch": "^2.2.3" - } - }, - "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" - } - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "requires": { - "is-number": "^7.0.0" - } - } + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "tslib": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.3.tgz", - "integrity": "sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==", - "dev": true + "node_modules/ts-loader/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" + } }, - "tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "node_modules/ts-loader/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, - "requires": { - "safe-buffer": "^5.0.1" + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" } }, - "tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", + "node_modules/ts-loader/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 }, - "type": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", - "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==", - "dev": true + "node_modules/ts-loader/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" + } }, - "type-check": { + "node_modules/type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", "dev": true, - "requires": { + "license": "MIT", + "dependencies": { "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" } }, - "type-detect": { + "node_modules/type-detect": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", - "dev": true + "dev": true, + "engines": { + "node": ">=4" + } }, - "type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true + "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, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } }, - "typedarray": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", - "dev": true + "node_modules/typescript-eslint": { + "version": "8.65.0", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.65.0.tgz", + "integrity": "sha512-/ggrHAwyjENDusvyxbuqxAC2dTnZg/Z8F+fgQtYIz+L6n/9HfSlEZcFGV/NsMNa6CkGk0xUjUAFwC0vHOflvIA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/eslint-plugin": "8.65.0", + "@typescript-eslint/parser": "8.65.0", + "@typescript-eslint/typescript-estree": "8.65.0", + "@typescript-eslint/utils": "8.65.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } }, - "typescript": { - "version": "4.6.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.6.4.tgz", - "integrity": "sha512-9ia/jWHIEbo49HfjrLGfKbZSuWo9iTMwXO+Ca3pRsSpbsMbc7/IU8NKdCZVRRBafVPGnoJeFL76ZOAA84I9fEg==", - "dev": true + "node_modules/typescript-eslint/node_modules/@typescript-eslint/eslint-plugin": { + "version": "8.65.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.65.0.tgz", + "integrity": "sha512-IEgob78X12rHpUmtcwFsXhZdVGJtwTVP8FiCLZkR6GlYVrl2PcuB+KhCE5BlVC/eQpQnu8WXRtkHZuPar+gCRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/regexpp": "^4.12.2", + "@typescript-eslint/scope-manager": "8.65.0", + "@typescript-eslint/type-utils": "8.65.0", + "@typescript-eslint/utils": "8.65.0", + "@typescript-eslint/visitor-keys": "8.65.0", + "ignore": "^7.0.5", + "natural-compare": "^1.4.0", + "ts-api-utils": "^2.5.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^8.65.0", + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/typescript-eslint/node_modules/@typescript-eslint/parser": { + "version": "8.65.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.65.0.tgz", + "integrity": "sha512-CZ4nMxWwgu1HEEFNkeaCptra9QCtkmKdgf3sWh1rl1trIhmxLilgTV4cwcbQ4wemnT4sWQN8CaKOmdYx+g2gMA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/scope-manager": "8.65.0", + "@typescript-eslint/types": "8.65.0", + "@typescript-eslint/typescript-estree": "8.65.0", + "@typescript-eslint/visitor-keys": "8.65.0", + "debug": "^4.4.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/typescript-eslint/node_modules/@typescript-eslint/scope-manager": { + "version": "8.65.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.65.0.tgz", + "integrity": "sha512-Esbl8OSYiVxBokYgWPf7VVWg/BE798wXhimnn9ML9Pt5qoDf8bfQlgjlKXR/k98+AcNzlLKYrpCcrcuZ9DZLgg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.65.0", + "@typescript-eslint/visitor-keys": "8.65.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/typescript-eslint/node_modules/@typescript-eslint/type-utils": { + "version": "8.65.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.65.0.tgz", + "integrity": "sha512-YjaZ7PRI5qY7ax2L3PbvX0rRyGtipAReCWs0mhhDBHjH/vl0g0BonaGXrKdKpMbIIsMIwDgbk/xzkBTyAltS5g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.65.0", + "@typescript-eslint/typescript-estree": "8.65.0", + "@typescript-eslint/utils": "8.65.0", + "debug": "^4.4.3", + "ts-api-utils": "^2.5.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/typescript-eslint/node_modules/@typescript-eslint/typescript-estree": { + "version": "8.65.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.65.0.tgz", + "integrity": "sha512-JboAE2swaYt4tb1fHhHTABE2K+OLy09XfcTbhnk4Pw96f9dd2e9iYsJ28gBggHlo5z5x1rkyWvcPoTuNTd4oGg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/project-service": "8.65.0", + "@typescript-eslint/tsconfig-utils": "8.65.0", + "@typescript-eslint/types": "8.65.0", + "@typescript-eslint/visitor-keys": "8.65.0", + "debug": "^4.4.3", + "minimatch": "^10.2.2", + "semver": "^7.7.3", + "tinyglobby": "^0.2.15", + "ts-api-utils": "^2.5.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.1.0" + } }, - "unbzip2-stream": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz", - "integrity": "sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==", + "node_modules/typescript-eslint/node_modules/@typescript-eslint/utils": { + "version": "8.65.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.65.0.tgz", + "integrity": "sha512-gXiwIHsYreboxeJucHKPvgwl7dXt50mF8s1/c00cP/WoVTyWKFdtfhRWwZiXYFU5H2O8vVoSLNrexFZjYS/SGA==", "dev": true, - "requires": { - "buffer": "^5.2.1", - "through": "^2.3.8" + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.9.1", + "@typescript-eslint/scope-manager": "8.65.0", + "@typescript-eslint/types": "8.65.0", + "@typescript-eslint/typescript-estree": "8.65.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" } }, - "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 - }, - "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==", + "node_modules/typescript-eslint/node_modules/@typescript-eslint/visitor-keys": { + "version": "8.65.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.65.0.tgz", + "integrity": "sha512-8C71BQkGjiMmXtop7pHVJu1l2NNShFdkCyD6a2ezzs5vU/L3LRtb69EtcteFwz0mYMPzIgOw0n6OV4VBUWZd7A==", "dev": true, - "requires": { - "arr-union": "^3.1.0", - "get-value": "^2.0.6", - "is-extendable": "^0.1.1", - "set-value": "^2.0.1" + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.65.0", + "eslint-visitor-keys": "^5.0.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "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==", + "node_modules/typescript-eslint/node_modules/eslint-visitor-keys": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", + "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", "dev": true, - "requires": { - "json-stable-stringify-without-jsonify": "^1.0.1", - "through2-filter": "^3.0.0" + "license": "Apache-2.0", + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, - "universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==" + "node_modules/typescript-eslint/node_modules/ignore": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.6.tgz", + "integrity": "sha512-BAg6QkE8W+TuQLrrw0Ugr7HegXduRuuj8/ti2kSOc+jz1dmx8/WNcjr6XGnq5YpDWxFwwaavqD0+jIUOKelTsw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } }, - "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" - } - } - } + "node_modules/ua-parser-js": { + "version": "1.0.39", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-1.0.39.tgz", + "integrity": "sha512-k24RCVWlEcjkdOxYmVJgeD/0a1TiSpqLg+ZalVGV9lsnr4yqu0w7tX/x2xX6G4zpkgQnRf89lxuZ1wsbjXM8lw==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/ua-parser-js" }, - "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 + { + "type": "paypal", + "url": "https://paypal.me/faisalman" + }, + { + "type": "github", + "url": "https://github.com/sponsors/faisalman" } + ], + "license": "MIT", + "bin": { + "ua-parser-js": "script/cli.js" + }, + "engines": { + "node": "*" } }, - "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" - }, - "dependencies": { - "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" - } + "node_modules/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", + "dev": true + }, + "node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/update-browserslist-db": { + "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": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" }, - "graceful-fs": { - "version": "4.2.10", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", - "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", - "dev": true + { + "type": "github", + "url": "https://github.com/sponsors/ai" } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" } }, - "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": { + "node_modules/uri-js": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", "dev": true, - "requires": { + "dependencies": { "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 - }, - "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 - }, - "util-deprecate": { + "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" }, - "uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", - "dev": true - }, - "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 - }, - "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" + "node_modules/vscode-jsonrpc": { + "version": "8.2.1-next.1", + "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-8.2.1-next.1.tgz", + "integrity": "sha512-L+DYtdUtqUXGpyMgHqer6IBKvFFhl/1ToiMmCmG85LYHuuX0jllHMz77MYt0RicakoYY+Lq1yLK6Qj3YBqgzDQ==", + "engines": { + "node": ">=14.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", - "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" + "node_modules/vscode-languageclient": { + "version": "8.2.0-next.3", + "resolved": "https://registry.npmjs.org/vscode-languageclient/-/vscode-languageclient-8.2.0-next.3.tgz", + "integrity": "sha512-Ojo6L2cb7GSiyD864k8vGb9fHxBdZeciHQQOF595C3IDHWg0w4KQ7iN7qGWVdl4wDNwlGTX3wWZawGfPTxnrPQ==", + "dependencies": { + "minimatch": "^5.1.0", + "semver": "^7.3.7", + "vscode-languageserver-protocol": "3.17.4-next.3" + }, + "engines": { + "vscode": "^1.79.0" } }, - "vinyl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.2.0.tgz", - "integrity": "sha512-MBH+yP0kC/GQ5GwBqrTPTzEfiiLjta7hTtvQtbxBgTeSXsmKQRQecjibMbxIXzVT3Y9KJK+drOz1/k+vsu8Nkg==", - "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" + "node_modules/vscode-languageclient/node_modules/brace-expansion": { + "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==", + "license": "MIT", + "dependencies": { + "balanced-match": "^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" + "node_modules/vscode-languageclient/node_modules/minimatch": { + "version": "5.1.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.9.tgz", + "integrity": "sha512-7o1wEA2RyMP7Iu7GNba9vc0RWWGACJOCZBJX2GJWip0ikV+wcOsgVuY9uE8CPiyQhkGFSlhuSkZPavN7u1c2Fw==", + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" } }, - "vscode-jsonrpc": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-8.1.0.tgz", - "integrity": "sha512-6TDy/abTQk+zDGYazgbIPc+4JoXdwC8NHU9Pbn4UJP1fehUyZmM4RHp5IthX7A6L5KS30PRui+j+tbbMMMafdw==" - }, - "vscode-languageclient": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/vscode-languageclient/-/vscode-languageclient-8.1.0.tgz", - "integrity": "sha512-GL4QdbYUF/XxQlAsvYWZRV3V34kOkpRlvV60/72ghHfsYFnS/v2MANZ9P6sHmxFcZKOse8O+L9G7Czg0NUWing==", - "requires": { - "minimatch": "^5.1.0", - "semver": "^7.3.7", - "vscode-languageserver-protocol": "3.17.3" - }, + "node_modules/vscode-languageserver-protocol": { + "version": "3.17.6-next.1", + "resolved": "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.17.6-next.1.tgz", + "integrity": "sha512-2npXUc8oe/fb9Bjcwm2HTWYZXyCbW4NTo7jkOrEciGO+/LfWbSMgqZ6PwKWgqUkgCbkPxQHNjoMqr9ol/Ehjgg==", "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" - } - }, - "minimatch": { - "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" - } - }, - "semver": { - "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" - } - } + "vscode-jsonrpc": "8.2.1-next.1", + "vscode-languageserver-types": "3.17.6-next.1" } }, - "vscode-languageserver-protocol": { - "version": "3.17.3", - "resolved": "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.17.3.tgz", - "integrity": "sha512-924/h0AqsMtA5yK22GgMtCYiMdCOtWTSGgUOkgEDX+wk2b0x4sAfLiO4NxBxqbiVtz7K7/1/RgVrVI0NClZwqA==", - "requires": { - "vscode-jsonrpc": "8.1.0", - "vscode-languageserver-types": "3.17.3" - } + "node_modules/vscode-languageserver-types": { + "version": "3.17.6-next.1", + "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.17.6-next.1.tgz", + "integrity": "sha512-7xVc/xLtNhKuCKX0mINT6mFUrUuRz0EinhwPGT8Gtsv2hlo+xJb5NKbiGailcWa1/T5e4dr5Pb2MfGchHreHAA==" }, - "vscode-languageserver-types": { - "version": "3.17.3", - "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.17.3.tgz", - "integrity": "sha512-SYU4z1dL0PyIMd4Vj8YOqFvHu7Hz/enbWtpfnVbJHU4Nd1YNYx8u0ennumc6h48GQNeOLxmwySmnADouT/AuZA==" + "node_modules/vscode-variables": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/vscode-variables/-/vscode-variables-1.0.1.tgz", + "integrity": "sha512-iZ1d08I30ktqv4mMszGz2Y2o53r+PBpF5tEnwf8NNzKoxeuo0thoaFRG98uJkNVhOtiDmH4HJ3KlqfjM6XIxbA==" }, - "watchpack": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.1.1.tgz", - "integrity": "sha512-Oo7LXCmc1eE1AjyuSBmtC3+Wy4HcV8PxWh2kP6fOl8yTlNS7r0K9l1ao2lrrUza7V39Y3D/BbJgY8VeSlc5JKw==", + "node_modules/watchpack": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.5.1.tgz", + "integrity": "sha512-Zn5uXdcFNIA1+1Ei5McRd+iRzfhENPCe7LeABkJtNulSxjma+l7ltNx55BWZkRlwRnpOgHqxnjyaDgJnNXnqzg==", "dev": true, - "requires": { + "license": "MIT", + "dependencies": { "glob-to-regexp": "^0.4.1", "graceful-fs": "^4.1.2" + }, + "engines": { + "node": ">=10.13.0" } }, - "webpack": { - "version": "5.34.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.34.0.tgz", - "integrity": "sha512-+WiFMgaZqhu7zKN64LQ7z0Ml4WWI+9RwG6zmS0wJDQXiCeg3hpN8fYFNJ+6WlosDT55yVxTfK7XHUAOVR4rLyA==", + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", + "license": "BSD-2-Clause" + }, + "node_modules/webpack": { + "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.0", - "@types/estree": "^0.0.47", - "@webassemblyjs/ast": "1.11.0", - "@webassemblyjs/wasm-edit": "1.11.0", - "@webassemblyjs/wasm-parser": "1.11.0", - "acorn": "^8.0.4", - "browserslist": "^4.14.5", + "license": "MIT", + "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.8.0", - "es-module-lexer": "^0.4.0", - "eslint-scope": "^5.1.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.4", - "json-parse-better-errors": "^1.0.2", - "loader-runner": "^4.2.0", + "graceful-fs": "^4.2.11", + "json-parse-even-better-errors": "^2.3.1", + "loader-runner": "^4.3.1", "mime-types": "^2.1.27", "neo-async": "^2.6.2", - "schema-utils": "^3.0.0", - "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.1.1", - "watchpack": "^2.0.0", - "webpack-sources": "^2.1.1" - }, - "dependencies": { - "enhanced-resolve": { - "version": "5.8.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.8.0.tgz", - "integrity": "sha512-Sl3KRpJA8OpprrtaIswVki3cWPiPKxXuFxJXBp+zNb6s6VwNWwFRUdtmzd2ReUut8n+sCPx7QCtQ7w5wfJhSgQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.2.4", - "tapable": "^2.2.0" - } - }, - "graceful-fs": { - "version": "4.2.6", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz", - "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==", - "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" - } - }, - "tapable": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.0.tgz", - "integrity": "sha512-FBk4IesMV1rBxX2tfiK8RAmogtWn53puLOQlvO8XuwlgxcYbP4mVPS9Ph4aeamSyyVjOl24aYWAuc8U5kCVwMw==", - "dev": true + "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" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true } } }, - "webpack-cli": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-4.6.0.tgz", - "integrity": "sha512-9YV+qTcGMjQFiY7Nb1kmnupvb1x40lfpj8pwdO/bom+sQiP4OBMKjHq29YQrlDWDPZO9r/qWaRRywKaRDKqBTA==", - "dev": true, - "requires": { - "@discoveryjs/json-ext": "^0.5.0", - "@webpack-cli/configtest": "^1.0.2", - "@webpack-cli/info": "^1.2.3", - "@webpack-cli/serve": "^1.3.1", - "colorette": "^1.2.1", - "commander": "^7.0.0", - "enquirer": "^2.3.6", - "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 + "node_modules/webpack-cli": { + "version": "7.2.1", + "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-7.2.1.tgz", + "integrity": "sha512-YwSGbcZdfz12DM8JIseVPr3oBb09IgVCVc4vY3oDvZnI/mALTGPAP1QiqOi4/bBLSJrRHaqDIXeHcNA0+G38aw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@discoveryjs/json-ext": "^1.1.0", + "commander": "^14.0.3", + "cross-spawn": "^7.0.6", + "envinfo": "^7.21.0", + "import-local": "^3.2.0", + "interpret": "^3.1.1", + "rechoir": "^0.8.0", + "webpack-merge": "^6.0.1" + }, + "bin": { + "webpack-cli": "bin/cli.js" + }, + "engines": { + "node": ">=20.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "js-yaml": "^4.0.0 || ^5.0.0", + "json5": "^2.2.3", + "toml": "^3.0.0 || ^4.0.0", + "webpack": "^5.101.0", + "webpack-bundle-analyzer": "^4.0.0 || ^5.0.0", + "webpack-dev-server": "^5.0.0 || ^6.0.0" + }, + "peerDependenciesMeta": { + "js-yaml": { + "optional": 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 + "json5": { + "optional": true }, - "rechoir": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.7.0.tgz", - "integrity": "sha512-ADsDEH2bvbjltXEP+hTIAmeFekTFK0V2BTxMkok6qILyAJEXV0AFfoWcAq4yfll5VdIMd/RVXq0lR+wQi5ZU3Q==", - "dev": true, - "requires": { - "resolve": "^1.9.0" - } + "toml": { + "optional": true }, - "resolve": { - "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.2.0", - "path-parse": "^1.0.6" - } + "webpack-bundle-analyzer": { + "optional": true + }, + "webpack-dev-server": { + "optional": true } } }, - "webpack-merge": { - "version": "5.7.3", - "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.7.3.tgz", - "integrity": "sha512-6/JUQv0ELQ1igjGDzHkXbVDRxkfA57Zw7PfiupdLFJYrgFqY5ZP8xxbpp2lU3EPwYx89ht5Z/aDkD40hFCm5AA==", + "node_modules/webpack-cli/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, - "requires": { - "clone-deep": "^4.0.1", - "wildcard": "^2.0.0" + "license": "MIT", + "engines": { + "node": ">=20" } }, - "webpack-sources": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-2.2.0.tgz", - "integrity": "sha512-bQsA24JLwcnWGArOKUxYKhX3Mz/nK1Xf6hxullKERyktjNMC4x8koOeaDNTA2fEJ09BdWLbM/iTW0ithREUP0w==", + "node_modules/webpack-merge": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-6.0.1.tgz", + "integrity": "sha512-hXXvrjtx2PLYx4qruKl+kyRSLc52V+cCvMxRjmKwoA+CBbbF5GfIBtR6kCvl0fYGqTUPKB+1ktVmTHqMOzgCBg==", "dev": true, - "requires": { - "source-list-map": "^2.0.1", - "source-map": "^0.6.1" + "license": "MIT", + "dependencies": { + "clone-deep": "^4.0.1", + "flat": "^5.0.2", + "wildcard": "^2.0.1" }, + "engines": { + "node": ">=18.0.0" + } + }, + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "license": "MIT", "dependencies": { - "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 - } + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" } }, - "which": { + "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, - "requires": { + "dependencies": { "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" } }, - "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 - }, - "wildcard": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.0.tgz", - "integrity": "sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw==", - "dev": true + "node_modules/wildcard": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz", + "integrity": "sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==", + "dev": true, + "license": "MIT" }, - "winreg-utf8": { + "node_modules/winreg-utf8": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/winreg-utf8/-/winreg-utf8-0.1.1.tgz", "integrity": "sha512-A4tBCO0bx3FCA/s8RowK40h3BQhKOWRFmsn6gYrXj6WjRAbOGnNJkTOpVmtA82UeGNMtpn3Wr0TWb742C1AS+g==" }, - "winston": { + "node_modules/winston": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/winston/-/winston-3.2.1.tgz", "integrity": "sha512-zU6vgnS9dAWCEKg/QYigd6cgMVVNwyTzKs81XZtTFuRwJOcDdBg7AU0mXVyNbs7O5RH2zdv+BdNZUlx7mXPuOw==", - "requires": { + "dependencies": { "async": "^2.6.1", "diagnostics": "^1.1.1", "is-stream": "^1.1.0", @@ -7513,193 +5558,320 @@ "triple-beam": "^1.3.0", "winston-transport": "^4.3.0" }, - "dependencies": { - "readable-stream": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.4.0.tgz", - "integrity": "sha512-jItXPLmrSR8jmTRmRWJXCnGJsfy85mB3Wd/uINMXA65yrnFo0cPClFIUWzo2najVNSl+mx7/4W8ttlLWJe99pQ==", - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - } + "engines": { + "node": ">= 6.4.0" } }, - "winston-compat": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/winston-compat/-/winston-compat-0.1.4.tgz", - "integrity": "sha512-mMEfFsSm6GmkFF+f4/0UJtG4N1vSaczGmXLVJYmS/+u2zUaIPcw2ZRuwUg2TvVBjswgiraN+vNnAG8z4fRUZ4w==", - "requires": { - "cycle": "~1.0.3", - "logform": "^1.6.0", - "triple-beam": "^1.2.0" + "node_modules/winston-daily-rotate-file": { + "version": "4.7.1", + "resolved": "https://registry.npmjs.org/winston-daily-rotate-file/-/winston-daily-rotate-file-4.7.1.tgz", + "integrity": "sha512-7LGPiYGBPNyGHLn9z33i96zx/bd71pjBn9tqQzO3I4Tayv94WPmBNwKC7CO1wPHdP9uvu+Md/1nr6VSH9h0iaA==", + "dependencies": { + "file-stream-rotator": "^0.6.1", + "object-hash": "^2.0.1", + "triple-beam": "^1.3.0", + "winston-transport": "^4.4.0" }, + "engines": { + "node": ">=8" + }, + "peerDependencies": { + "winston": "^3" + } + }, + "node_modules/winston-daily-rotate-file/node_modules/fecha": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/fecha/-/fecha-4.2.3.tgz", + "integrity": "sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==" + }, + "node_modules/winston-daily-rotate-file/node_modules/logform": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/logform/-/logform-2.5.1.tgz", + "integrity": "sha512-9FyqAm9o9NKKfiAKfZoYo9bGXXuwMkxQiQttkT4YjjVtQVIQtK6LmVtlxmCaFswo6N4AfEkHqZTV0taDtPotNg==", "dependencies": { - "logform": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/logform/-/logform-1.10.0.tgz", - "integrity": "sha512-em5ojIhU18fIMOw/333mD+ZLE2fis0EzXl1ZwHx4iQzmpQi6odNiY/t+ITNr33JZhT9/KEaH+UPIipr6a9EjWg==", - "requires": { - "colors": "^1.2.1", - "fast-safe-stringify": "^2.0.4", - "fecha": "^2.3.3", - "ms": "^2.1.1", - "triple-beam": "^1.2.0" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - } + "@colors/colors": "1.5.0", + "@types/triple-beam": "^1.3.2", + "fecha": "^4.2.0", + "ms": "^2.1.1", + "safe-stable-stringify": "^2.3.1", + "triple-beam": "^1.3.0" } }, - "winston-daily-rotate-file": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/winston-daily-rotate-file/-/winston-daily-rotate-file-3.10.0.tgz", - "integrity": "sha512-KO8CfbI2CvdR3PaFApEH02GPXiwJ+vbkF1mCkTlvRIoXFI8EFlf1ACcuaahXTEiDEKCii6cNe95gsL4ZkbnphA==", - "requires": { - "file-stream-rotator": "^0.4.1", - "object-hash": "^1.3.0", - "semver": "^6.2.0", - "triple-beam": "^1.3.0", - "winston-compat": "^0.1.4", - "winston-transport": "^4.2.0" + "node_modules/winston-daily-rotate-file/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==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/winston-daily-rotate-file/node_modules/winston-transport": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/winston-transport/-/winston-transport-4.5.0.tgz", + "integrity": "sha512-YpZzcUzBedhlTAfJg6vJDlyEai/IFMIVcaEZZyl3UXIl4gmqRpU7AE89AHLkbzLUsv0NVmw7ts+iztqKxxPW1Q==", "dependencies": { - "semver": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.2.0.tgz", - "integrity": "sha512-jdFC1VdUGT/2Scgbimf7FSx9iJLXoqfglSF+gJeuNWVpiE37OIbc1jywR/GJyFdz3mnkz2/id0L0J/cr0izR5A==" - } + "logform": "^2.3.2", + "readable-stream": "^3.6.0", + "triple-beam": "^1.3.0" + }, + "engines": { + "node": ">= 6.4.0" } }, - "winston-transport": { + "node_modules/winston-transport": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/winston-transport/-/winston-transport-4.3.0.tgz", "integrity": "sha512-B2wPuwUi3vhzn/51Uukcao4dIduEiPOcOt9HJ3QeaXgkJ5Z7UwpBzxS4ZGNHtrxrUvTwemsQiSys0ihOf8Mp1A==", - "requires": { + "dependencies": { "readable-stream": "^2.3.6", "triple-beam": "^1.2.0" + }, + "engines": { + "node": ">= 6.4.0" } }, - "word-wrap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", - "dev": true + "node_modules/winston/node_modules/readable-stream": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.4.0.tgz", + "integrity": "sha512-jItXPLmrSR8jmTRmRWJXCnGJsfy85mB3Wd/uINMXA65yrnFo0cPClFIUWzo2najVNSl+mx7/4W8ttlLWJe99pQ==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } }, - "workerpool": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.0.tgz", - "integrity": "sha512-Rsk5qQHJ9eowMH28Jwhe8HEbmdYDX4lwoMWshiCXugjtHqMD9ZbiqSDLxcsfdqsETPzVUtX5s1Z5kStiIM6l4A==", - "dev": true + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } }, - "wrap-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", - "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "node_modules/workerpool": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.5.1.tgz", + "integrity": "sha512-Fs4dNYcsdpYSAfVxhnl1L5zTksjvOJxtC5hzMNl+1t9B8hTJTdKDyZ5ju7ztgPy+ft9tBFXoOlDNiOT9WUXZlA==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/wrap-ansi": { + "version": "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": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1" + "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" } }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + "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==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } }, - "xtend": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", - "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", - "dev": true + "node_modules/wrap-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } }, - "y18n": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.2.tgz", - "integrity": "sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ==", - "dev": true + "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + "node_modules/wrap-ansi-cjs/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } }, - "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" + "node_modules/wrap-ansi-cjs/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "license": "MIT" + }, + "node_modules/wrap-ansi-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" } }, - "yargs-parser": { + "node_modules/wrap-ansi/node_modules/ansi-regex": { "version": "5.0.1", - "resolved": "https://repository.engineering.redhat.com/nexus/repository/registry.npmjs.org/yargs-parser/-/yargs-parser-5.0.1.tgz", - "integrity": "sha512-wpav5XYiddjXxirPoCTUPbqM0PXvJ9hiBMvuJgInvo4/lAOTZzUprArw17q2O1P2+GHhbBr18/iQwjL5Z9BqfA==", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/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/wrap-ansi/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, - "requires": { - "camelcase": "^3.0.0", - "object.assign": "^4.1.0" + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/wrap-ansi/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/wrap-ansi/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/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + }, + "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" } }, - "yargs-unparser": { + "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, - "requires": { + "dependencies": { "camelcase": "^6.0.0", "decamelize": "^4.0.0", "flat": "^5.0.2", "is-plain-obj": "^2.1.0" }, - "dependencies": { - "camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", - "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 - } + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs-unparser/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" } }, - "yauzl": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", - "integrity": "sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk=", + "node_modules/yargs-unparser/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, - "requires": { - "buffer-crc32": "~0.2.3", - "fd-slicer": "~1.1.0" + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "yocto-queue": { + "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 + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } } } } diff --git a/package.json b/package.json index e70da57df..fff1f8de0 100644 --- a/package.json +++ b/package.json @@ -5,7 +5,7 @@ "author": "Red Hat", "icon": "icons/icon128.png", "license": "EPL-2.0", - "version": "1.16.0", + "version": "1.56.0", "publisher": "redhat", "bugs": "https://github.com/redhat-developer/vscode-java/issues", "preview": false, @@ -17,13 +17,14 @@ "java.home", "java.jdt.ls.vmargs", "java.configuration.runtimes", - "java.import.gradle.java.home" + "java.import.gradle.java.home", + "java.import.gradle.home" ] }, "virtualWorkspaces": false }, "engines": { - "vscode": "^1.74.0" + "vscode": "^1.77.0" }, "repository": { "type": "git", @@ -39,7 +40,6 @@ "multi-root ready" ], "activationEvents": [ - "onLanguage:java", "workspaceContains:pom.xml", "workspaceContains:*/pom.xml", "workspaceContains:build.gradle", @@ -57,10 +57,63 @@ ], "main": "./dist/extension", "contributes": { + "customEditors": [ + { + "viewType": "decompiled.javaClass", + "displayName": "Decompiled Java Class File", + "selector": [ + { + "filenamePattern": "file:/**/*.class" + }, + { + "filenamePattern": "vscode-remote:/**/*.class" + } + ] + } + ], "javaBuildFilePatterns": [ "^pom\\.xml$", ".*\\.gradle(\\.kts)?$" ], + "javaBuildTools": [ + { + "displayName": "Maven", + "buildFileNames": [ + "pom.xml" + ] + }, + { + "displayName": "Gradle", + "buildFileNames": [ + "build.gradle", + "settings.gradle", + "build.gradle.kts", + "settings.gradle.kts" + ] + } + ], + "javaShortcuts": [ + { + "title": "$(settings-gear) Open Java Settings", + "command": "workbench.action.openSettings", + "arguments": [ + "java" + ] + }, + { + "title": "$(output) Open Logs", + "command": "java.open.logs" + }, + { + "title": "$(trash) Clean Workspace Cache...", + "command": "java.clean.workspace" + }, + { + "command": "java.change.searchScope", + "title": "$(search) Search Scope", + "category": "Java" + } + ], "semanticTokenTypes": [ { "id": "annotation", @@ -129,6 +182,9 @@ "annotation": [ "storage.type.annotation.java" ], + "decorator": [ + "storage.type.annotation.java" + ], "annotationMember": [ "entity.name.annotationMember.java", "constant.other.key.java" @@ -163,19 +219,83 @@ ".properties" ], "configuration": "./language-support/properties/java-properties-configuration.json" + }, + { + "id": "gradle-kotlin-dsl", + "aliases": [ + "Gradle Kotlin DSL" + ], + "extensions": [ + ".gradle.kts" + ], + "configuration": "./language-support/kotlin/language-configuration.json" } ], "grammars": [ + { + "language": "java", + "scopeName": "source.java", + "path": "./language-support/java/java.tmLanguage.json" + }, { "language": "java-properties", "scopeName": "source.java-properties", "path": "./language-support/properties/JavaProperties.tmLanguage.json" - } - ], - "snippets": [ + }, { - "language": "java", - "path": "./snippets/java.json" + "language": "gradle-kotlin-dsl", + "scopeName": "source.gradle-kotlin-dsl", + "path": "./language-support/kotlin/kotlin.tmLanguage.json" + }, + { + "injectTo": [ + "source.java" + ], + "scopeName": "inline.sql", + "path": "./language-support/sql/inline-sql.json", + "embeddedLanguages": { + "meta.embedded.block.sql": "sql" + } + }, + { + "injectTo": [ + "source.java" + ], + "scopeName": "inline.json", + "path": "./language-support/json/inline-json.json", + "embeddedLanguages": { + "meta.embedded.block.json": "json" + } + }, + { + "injectTo": [ + "source.java" + ], + "scopeName": "inline.xml", + "path": "./language-support/xml/inline-xml.json", + "embeddedLanguages": { + "meta.embedded.block.xml": "xml" + } + }, + { + "injectTo": [ + "source.java" + ], + "scopeName": "inline.yaml", + "path": "./language-support/yaml/inline-yaml.json", + "embeddedLanguages": { + "meta.embedded.block.yaml": "yaml" + } + }, + { + "injectTo": [ + "source.java" + ], + "scopeName": "inline.html", + "path": "./language-support/html/inline-html.json", + "embeddedLanguages": { + "meta.embedded.block.html": "html" + } } ], "jsonValidation": [ @@ -184,905 +304,1431 @@ "url": "./schemas/package.schema.json" } ], - "configuration": { - "type": "object", - "title": "Java", - "properties": { - "java.home": { - "type": [ - "string", - "null" - ], - "default": null, - "description": "Specifies the folder path to the JDK (17 or more recent) used to launch the Java Language Server.\nOn Windows, backslashes must be escaped, i.e.\n\"java.home\":\"C:\\\\Program Files\\\\Java\\\\jdk-17.0_3\"", - "scope": "machine-overridable", - "deprecationMessage": "This setting is deprecated, please use 'java.jdt.ls.java.home' instead." - }, - "java.jdt.ls.java.home": { - "type": [ - "string", - "null" - ], - "default": null, - "description": "Specifies the folder path to the JDK (17 or more recent) used to launch the Java Language Server. This setting will replace the Java extension's embedded JRE to start the Java Language Server. \n\nOn Windows, backslashes must be escaped, i.e.\n\"java.jdt.ls.java.home\":\"C:\\\\Program Files\\\\Java\\\\jdk-17.0_3\"", - "scope": "machine-overridable" - }, - "java.jdt.ls.vmargs": { - "type": [ - "string", - "null" - ], - "default": "-XX:+UseParallelGC -XX:GCTimeRatio=4 -XX:AdaptiveSizePolicyWeight=90 -Dsun.zip.disableMemoryMapping=true -Xmx1G -Xms100m -Xlog:disable", - "description": "Specifies extra VM arguments used to launch the Java Language Server. Eg. use `-XX:+UseParallelGC -XX:GCTimeRatio=4 -XX:AdaptiveSizePolicyWeight=90 -Dsun.zip.disableMemoryMapping=true -Xmx1G -Xms100m -Xlog:disable` to optimize memory usage with the parallel garbage collector", - "scope": "machine-overridable" - }, - "java.errors.incompleteClasspath.severity": { - "type": [ - "string" - ], - "enum": [ - "ignore", - "info", - "warning", - "error" - ], - "default": "warning", - "description": "Specifies the severity of the message when the classpath is incomplete for a Java file", - "scope": "window" - }, - "java.configuration.checkProjectSettingsExclusions": { - "deprecationMessage": "Please use 'java.import.generatesMetadataFilesAtProjectRoot' to control whether to generate the project metadata files at the project root. And use 'files.exclude' to control whether to hide the project metadata files from the file explorer.", - "type": "boolean", - "default": false, - "description": "Controls whether to exclude extension-generated project settings files (.project, .classpath, .factorypath, .settings/) from the file explorer.", - "scope": "window" - }, - "java.configuration.updateBuildConfiguration": { - "type": [ - "string" - ], - "enum": [ - "disabled", - "interactive", - "automatic" - ], - "default": "interactive", - "description": "Specifies how modifications on build files update the Java classpath/configuration", - "scope": "window" - }, - "java.trace.server": { - "type": "string", - "enum": [ - "off", - "messages", - "verbose" - ], - "default": "off", - "description": "Traces the communication between VS Code and the Java language server.", - "scope": "window" - }, - "java.import.maven.enabled": { - "type": "boolean", - "default": true, - "description": "Enable/disable the Maven importer.", - "scope": "window" - }, - "java.import.maven.offline.enabled": { - "type": "boolean", - "default": false, - "description": "Enable/disable the Maven offline mode.", - "scope": "window" - }, - "java.import.maven.disableTestClasspathFlag": { - "type": "boolean", - "default": false, - "description": "Enable/disable test classpath segregation. When enabled, this permits the usage of test resources within a Maven project as dependencies within the compile scope of other projects.", - "scope": "window" - }, - "java.import.gradle.enabled": { - "type": "boolean", - "default": true, - "description": "Enable/disable the Gradle importer.", - "scope": "window" - }, - "java.import.gradle.wrapper.enabled": { - "type": "boolean", - "default": true, - "description": "Use Gradle from the 'gradle-wrapper.properties' file.", - "scope": "window" - }, - "java.import.gradle.version": { - "type": "string", - "default": null, - "description": "Use Gradle from the specific version if the Gradle wrapper is missing or disabled.", - "scope": "window" - }, - "java.import.gradle.home": { - "type": "string", - "default": null, - "description": "Use Gradle from the specified local installation directory or GRADLE_HOME if the Gradle wrapper is missing or disabled and no 'java.import.gradle.version' is specified.", - "scope": "window" - }, - "java.import.gradle.java.home": { - "type": "string", - "default": null, - "description": "The location to the JVM used to run the Gradle daemon.", - "scope": "machine-overridable" - }, - "java.import.gradle.offline.enabled": { - "type": "boolean", - "default": false, - "description": "Enable/disable the Gradle offline mode.", - "scope": "window" - }, - "java.import.gradle.arguments": { - "type": "string", - "default": null, - "description": "Arguments to pass to Gradle.", - "scope": "machine" - }, - "java.import.gradle.jvmArguments": { - "type": "string", - "default": null, - "description": "JVM arguments to pass to Gradle.", - "scope": "machine" - }, - "java.import.gradle.user.home": { - "type": "string", - "default": null, - "description": "Setting for GRADLE_USER_HOME.", - "scope": "window" - }, - "java.import.gradle.annotationProcessing.enabled": { - "type": "boolean", - "default": true, - "description": "Enable/disable the annotation processing on Gradle projects and delegate Annotation Processing to JDT APT. Only works for Gradle 5.2 or higher.", - "scope": "window" - }, - "java.maven.downloadSources": { - "type": "boolean", - "default": false, - "description": "Enable/disable download of Maven source artifacts as part of importing Maven projects.", - "scope": "window" - }, - "java.eclipse.downloadSources": { - "type": "boolean", - "default": false, - "description": "Enable/disable download of Maven source artifacts for Eclipse projects.", - "scope": "window" - }, - "java.maven.updateSnapshots": { - "type": "boolean", - "default": false, - "description": "Force update of Snapshots/Releases.", - "scope": "window" - }, - "java.referencesCodeLens.enabled": { - "type": "boolean", - "default": false, - "description": "Enable/disable the references code lens.", - "scope": "window" - }, - "java.signatureHelp.enabled": { - "type": "boolean", - "default": true, - "description": "Enable/disable the signature help.", - "scope": "window" - }, - "java.signatureHelp.description.enabled": { - "type": "boolean", - "default": false, - "description": "Enable/disable to show the description in signature help.", - "scope": "window" - }, - "java.implementationsCodeLens.enabled": { - "type": "boolean", - "default": false, - "description": "Enable/disable the implementations code lens.", - "scope": "window" - }, - "java.configuration.maven.userSettings": { - "type": "string", - "default": null, - "description": "Path to Maven's user settings.xml", - "scope": "window" - }, - "java.configuration.maven.globalSettings": { - "type": "string", - "default": null, - "description": "Path to Maven's global settings.xml", - "scope": "window" - }, - "java.configuration.maven.notCoveredPluginExecutionSeverity": { - "type": "string", - "enum": [ - "ignore", - "warning", - "error" - ], - "default": "warning", - "description": "Specifies severity if the plugin execution is not covered by Maven build lifecycle.", - "scope": "window" - }, - "java.configuration.maven.defaultMojoExecutionAction": { - "type": "string", - "enum": [ - "ignore", - "warn", - "error", - "execute" - ], - "default": "ignore", - "description": "Specifies default mojo execution action when no associated metadata can be detected.", - "scope": "window" - }, - "java.configuration.workspaceCacheLimit": { - "type": [ - "null", - "integer" - ], - "default": 90, - "minimum": 1, - "description": "The number of days (if enabled) to keep unused workspace cache data. Beyond this limit, cached workspace data may be removed.", - "scope": "application" - }, - "java.format.enabled": { - "type": "boolean", - "default": true, - "description": "Enable/disable default Java formatter", - "scope": "window" - }, - "java.saveActions.organizeImports": { - "type": "boolean", - "default": false, - "description": "Enable/disable auto organize imports on save action", - "scope": "window" - }, - "java.import.exclusions": { - "type": "array", - "description": "Configure glob patterns for excluding folders. Use `!` to negate patterns to allow subfolders imports. You have to include a parent directory. The order is important.", - "default": [ - "**/node_modules/**", - "**/.metadata/**", - "**/archetype-resources/**", - "**/META-INF/maven/**" - ], - "scope": "window" - }, - "java.import.generatesMetadataFilesAtProjectRoot": { - "type": "boolean", - "markdownDescription": "Specify whether the project metadata files(.project, .classpath, .factorypath, .settings/) will be generated at the project root. Click [HERE](command:_java.metadataFilesGeneration) to learn how to change the setting to make it take effect.", - "default": false, - "scope": "window" - }, - "java.project.referencedLibraries": { - "type": [ - "array", - "object" - ], - "description": "Configure glob patterns for referencing local libraries to a Java project.", - "default": [ - "lib/**/*.jar" - ], - "properties": { - "include": { - "type": "array" + "configuration": [ + { + "id": "java-startup", + "title": "Startup", + "order": 10, + "properties": { + "java.home": { + "type": [ + "string", + "null" + ], + "default": null, + "description": "Specifies the folder path to the JDK (21 or more recent) used to launch the Java Language Server.\nOn Windows, backslashes must be escaped, i.e.\n\"java.home\":\"C:\\\\Program Files\\\\Java\\\\jdk-21.0_5\"", + "scope": "machine-overridable", + "deprecationMessage": "This setting is deprecated, please use 'java.jdt.ls.java.home' instead.", + "order": 0 + }, + "java.jdt.ls.java.home": { + "type": [ + "string", + "null" + ], + "default": null, + "description": "Specifies the folder path to the JDK (21 or more recent) used to launch the Java Language Server. This setting will replace the Java extension's embedded JRE to start the Java Language Server. \n\nOn Windows, backslashes must be escaped, i.e.\n\"java.jdt.ls.java.home\":\"C:\\\\Program Files\\\\Java\\\\jdk-21.0_5\"", + "scope": "machine-overridable", + "order": 10 + }, + "java.jdt.ls.vmargs": { + "type": [ + "string", + "null" + ], + "default": "-XX:+UseParallelGC -XX:GCTimeRatio=4 -XX:AdaptiveSizePolicyWeight=90 -Dsun.zip.disableMemoryMapping=true -Xmx2G -Xms100m -Xlog:disable", + "description": "Specifies extra VM arguments used to launch the Java Language Server. Eg. use `-XX:+UseParallelGC -XX:GCTimeRatio=4 -XX:AdaptiveSizePolicyWeight=90 -Dsun.zip.disableMemoryMapping=true -Xmx2G -Xms100m -Xlog:disable` to optimize memory usage with the parallel garbage collector", + "scope": "machine-overridable", + "order": 20 + }, + "java.server.launchMode": { + "type": "string", + "enum": [ + "Standard", + "LightWeight", + "Hybrid" + ], + "enumDescriptions": [ + "Provides full features such as intellisense, refactoring, building, Maven/Gradle support etc.", + "Starts a syntax server with lower start-up cost. Only provides syntax features such as outline, navigation, javadoc, syntax errors.", + "Provides full features with better responsiveness. It starts a standard language server and a secondary syntax server. The syntax server provides syntax features until the standard server is ready." + ], + "description": "The launch mode for the Java extension", + "default": "Hybrid", + "scope": "window", + "order": 30 + }, + "java.configuration.workspaceCacheLimit": { + "type": [ + "null", + "integer" + ], + "default": 90, + "minimum": 1, + "description": "The number of days (if enabled) to keep unused workspace cache data. Beyond this limit, cached workspace data may be removed.", + "scope": "application", + "order": 40 + }, + "java.sharedIndexes.enabled": { + "type": "string", + "enum": [ + "auto", + "on", + "off" + ], + "default": "auto", + "markdownDescription": "[Experimental] Specify whether to share indexes between different workspaces. When set to `auto`, shared indexes will be enabled in Visual Studio Code - Insiders.", + "scope": "window", + "order": 50 + }, + "java.sharedIndexes.location": { + "type": "string", + "markdownDescription": "Specifies a common index location for all workspaces. See default values as follows:\n \nWindows: First use `\"$APPDATA\\\\.jdt\\\\index\"`, or `\"~\\\\.jdt\\\\index\"` if it does not exist\n \nmacOS: `\"~/Library/Caches/.jdt/index\"`\n \nLinux: First use `\"$XDG_CACHE_HOME/.jdt/index\"`, or `\"~/.cache/.jdt/index\"` if it does not exist", + "default": "", + "scope": "window", + "order": 60 + }, + "java.jdt.ls.lombokSupport.enabled": { + "type": "boolean", + "default": true, + "description": "Whether to load lombok processors from project classpath", + "scope": "window", + "order": 70 + }, + "java.jdt.ls.protobufSupport.enabled": { + "type": "boolean", + "default": true, + "markdownDescription": "Specify whether to automatically add Protobuf output source directories to the classpath.\n\n**Note:** Only works for Gradle `com.google.protobuf` plugin `0.8.4` or higher.", + "scope": "window", + "order": 80 + }, + "java.jdt.ls.aspectjSupport.enabled": { + "type": "boolean", + "default": false, + "markdownDescription": "Specify whether to enable `io.freefair.aspectj` plugin in Gradle projects. Defaults to `false`.", + "scope": "window", + "order": 80 + }, + "java.jdt.ls.kotlinSupport.enabled": { + "type": "boolean", + "default": true, + "markdownDescription": "[Experimental] Specify whether to enable `org.jetbrains.kotlin.jvm` plugin in Gradle projects. Defaults to `true`.", + "scope": "window", + "order": 80 + }, + "java.jdt.ls.scalaSupport.enabled": { + "type": "boolean", + "default": true, + "markdownDescription": "[Experimental] Specify whether to enable `scala` plugin in Gradle projects. Defaults to `true`.", + "scope": "window", + "order": 80 + }, + "java.jdt.ls.groovySupport.enabled": { + "type": "boolean", + "default": true, + "markdownDescription": "[Experimental] Specify whether to enable `groovy` plugin in Gradle projects. Defaults to `true`.", + "scope": "window", + "order": 80 + }, + "java.jdt.ls.androidSupport.enabled": { + "type": "string", + "enum": [ + "auto", + "on", + "off" + ], + "default": "auto", + "markdownDescription": "[Experimental] Specify whether to enable Android project importing. When set to `auto`, the Android support will be enabled in Visual Studio Code - Insiders.\n\n**Note:** Only works for Android Gradle Plugin `3.2.0` or higher.", + "scope": "window", + "order": 90 + }, + "java.jdt.ls.javac.enabled": { + "type": "string", + "enum": [ + "on", + "off" + ], + "default": "off", + "markdownDescription": "[Experimental] Specify whether to enable Javac-based compilation in the language server. Requires running this extension with Java 25", + "scope": "window", + "order": 95 + }, + "java.jdt.ls.appcds.enabled": { + "type": "string", + "enum": [ + "auto", + "on", + "off" + ], + "default": "auto", + "markdownDescription": "[Experimental] Enable Java AppCDS (Application Class Data Sharing) for improvements to extension activation. When set to `auto`, AppCDS will be enabled in Visual Studio Code - Insiders, and for pre-release versions.", + "scope": "machine-overridable", + "order": 100 + }, + "java.trace.server": { + "type": "string", + "enum": [ + "off", + "messages", + "verbose" + ], + "default": "off", + "description": "Traces the communication between VS Code and the Java language server.", + "scope": "window" + }, + "redhat.telemetry.enabled": { + "type": "boolean", + "default": null, + "markdownDescription": "Enable usage data and errors to be sent to Red Hat servers. Read our [privacy statement](https://developers.redhat.com/article/tool-data-collection).", + "scope": "window", + "tags": [ + "usesOnlineServices", + "telemetry" + ] + } + } + }, + { + "id": "java-projectimport", + "title": "Project Import/Update", + "order": 20, + "properties": { + "java.import.projectSelection": { + "type": "string", + "enum": [ + "manual", + "automatic" + ], + "enumDescriptions": [ + "Manually select the build configuration files.", + "Let extension automatically scan and select the build configuration files." + ], + "default": "automatic", + "markdownDescription": "[Experimental] Specifies how to select build configuration files to import. \nNote: Currently, `Gradle` projects cannot be partially imported.", + "scope": "window", + "order": 10 + }, + "java.configuration.updateBuildConfiguration": { + "type": [ + "string" + ], + "enum": [ + "disabled", + "interactive", + "automatic" + ], + "default": "interactive", + "description": "Specifies how modifications on build files update the Java classpath/configuration", + "scope": "window", + "order": 20 + }, + "java.import.exclusions": { + "type": "array", + "description": "Configure glob patterns for excluding folders. Use `!` to negate patterns to allow subfolders imports. You have to include a parent directory. The order is important.", + "default": [ + "**/node_modules/**", + "**/.metadata/**", + "**/archetype-resources/**", + "**/META-INF/maven/**" + ], + "scope": "window" + }, + "java.project.resourceFilters": { + "type": "array", + "items": { + "type": "string", + "pattern": "^(?!\\*).*" + }, + "default": [ + "node_modules", + "\\.git" + ], + "markdownDescription": "Excludes files and folders from being refreshed by the Java Language Server, which can improve the overall performance. For example, [\"node_modules\",\"\\.git\"] will exclude all files and folders named `node_modules` or `.git`. Pattern expressions must be compatible with `java.util.regex.Pattern`. Defaults to [\"node_modules\",\"\\.git\"].", + "scope": "window" + }, + "java.configuration.checkProjectSettingsExclusions": { + "deprecationMessage": "Please use 'java.import.generatesMetadataFilesAtProjectRoot' to control whether to generate the project metadata files at the project root. And use 'files.exclude' to control whether to hide the project metadata files from the file explorer.", + "type": "boolean", + "default": false, + "description": "Controls whether to exclude extension-generated project settings files (.project, .classpath, .factorypath, .settings/) from the file explorer.", + "scope": "window" + }, + "java.import.generatesMetadataFilesAtProjectRoot": { + "type": "boolean", + "markdownDescription": "Specify whether the project metadata files(.project, .classpath, .factorypath, .settings/) will be generated at the project root. Click [HERE](command:_java.metadataFilesGeneration) to learn how to change the setting to make it take effect.", + "default": false, + "scope": "window" + }, + "java.project.importOnFirstTimeStartup": { + "type": "string", + "enum": [ + "disabled", + "interactive", + "automatic" + ], + "default": "automatic", + "description": "Specifies whether to import the Java projects, when opening the folder in Hybrid mode for the first time.", + "scope": "application" + }, + "java.project.importHint": { + "type": "boolean", + "description": "Enable/disable the server-mode switch information, when Java projects import is skipped on startup.", + "default": true, + "scope": "application" + }, + "java.showBuildStatusOnStart.enabled": { + "anyOf": [ + { + "enum": [ + "notification", + "terminal", + "off" + ], + "enumDescriptions": [ + "Show the build status via progress notification on start", + "Show the build status via terminal on start", + "Do not show any build status on start" + ] + }, + "boolean" + ], + "description": "Automatically show build status on startup.", + "default": "notification", + "scope": "window" + }, + "java.project.encoding": { + "enum": [ + "ignore", + "warning", + "setDefault" + ], + "enumDescriptions": [ + "Ignore project encoding settings", + "Show warning if a project has no explicit encoding set", + "Set the default workspace encoding settings" + ], + "default": "ignore", + "markdownDescription": "Project encoding settings", + "scope": "window" + } + } + }, + { + "id": "java-unmanagedfolder", + "title": "Unmanaged Folder", + "order": 30, + "properties": { + "java.project.sourcePaths": { + "type": "array", + "items": { + "type": "string" + }, + "markdownDescription": "Relative paths to the workspace where stores the source files. `Only` effective in the `WORKSPACE` scope. The setting will `NOT` affect Maven or Gradle project.", + "default": [], + "scope": "window", + "order": 10 + }, + "java.project.outputPath": { + "type": [ + "string", + "null" + ], + "markdownDescription": "A relative path to the workspace where stores the compiled output. `Only` effective in the `WORKSPACE` scope. The setting will `NOT` affect Maven or Gradle project.", + "default": "", + "scope": "window", + "order": 20 + }, + "java.project.referencedLibraries": { + "type": [ + "array", + "object" + ], + "description": "Configure glob patterns for referencing local libraries to a Java project.", + "default": [ + "lib/**/*.jar" + ], + "properties": { + "include": { + "type": "array" + }, + "exclude": { + "type": "array" + }, + "sources": { + "type": "object" + } + }, + "required": [ + "include" + ], + "additionalProperties": false, + "scope": "window", + "order": 30 + } + } + }, + { + "id": "java-maven", + "title": "Maven", + "order": 40, + "properties": { + "java.import.maven.enabled": { + "type": "boolean", + "default": true, + "description": "Enable/disable the Maven importer.", + "scope": "window", + "order": 10 + }, + "java.import.maven.offline.enabled": { + "type": "boolean", + "default": false, + "description": "Enable/disable the Maven offline mode.", + "scope": "window", + "order": 20 + }, + "java.import.maven.disableTestClasspathFlag": { + "type": "boolean", + "default": false, + "description": "Enable/disable test classpath segregation. When enabled, this permits the usage of test resources within a Maven project as dependencies within the compile scope of other projects.", + "scope": "window", + "order": 30 + }, + "java.maven.downloadSources": { + "type": "boolean", + "default": false, + "description": "Enable/disable download of Maven source artifacts as part of importing Maven projects.", + "scope": "window", + "order": 40 + }, + "java.maven.updateSnapshots": { + "type": "boolean", + "default": false, + "description": "Force update of Snapshots/Releases.", + "scope": "window", + "order": 50 + }, + "java.configuration.maven.userSettings": { + "type": "string", + "default": null, + "description": "Path to Maven's user settings.xml", + "scope": "window", + "order": 60 + }, + "java.configuration.maven.globalSettings": { + "type": "string", + "default": null, + "description": "Path to Maven's global settings.xml", + "scope": "window", + "order": 70 + }, + "java.configuration.maven.notCoveredPluginExecutionSeverity": { + "type": "string", + "enum": [ + "ignore", + "warning", + "error" + ], + "default": "warning", + "description": "Specifies severity if the plugin execution is not covered by Maven build lifecycle.", + "scope": "window", + "order": 80 + }, + "java.configuration.maven.defaultMojoExecutionAction": { + "type": "string", + "enum": [ + "ignore", + "warn", + "error", + "execute" + ], + "default": "ignore", + "description": "Specifies default mojo execution action when no associated metadata can be detected.", + "scope": "window", + "order": 90 + }, + "java.configuration.maven.lifecycleMappings": { + "type": "string", + "default": null, + "description": "Path to Maven's lifecycle mappings xml", + "scope": "window", + "order": 100 + } + } + }, + { + "id": "java-gradle", + "title": "Gradle", + "order": 50, + "properties": { + "java.import.gradle.enabled": { + "type": "boolean", + "default": true, + "description": "Enable/disable the Gradle importer.", + "scope": "window", + "order": 10 + }, + "java.import.gradle.wrapper.enabled": { + "type": "boolean", + "default": true, + "description": "Use Gradle from the 'gradle-wrapper.properties' file.", + "scope": "window", + "order": 20 + }, + "java.import.gradle.version": { + "type": "string", + "default": null, + "description": "Use Gradle from the specific version if the Gradle wrapper is missing or disabled.", + "scope": "window", + "order": 30 + }, + "java.import.gradle.home": { + "type": "string", + "default": null, + "description": "Use Gradle from the specified local installation directory or GRADLE_HOME if the Gradle wrapper is missing or disabled and no 'java.import.gradle.version' is specified.", + "scope": "machine-overridable", + "order": 40 + }, + "java.import.gradle.java.home": { + "type": "string", + "default": null, + "description": "The location to the JVM used to run the Gradle daemon.", + "scope": "machine-overridable", + "order": 50 + }, + "java.import.gradle.user.home": { + "type": "string", + "default": null, + "description": "Setting for GRADLE_USER_HOME.", + "scope": "machine-overridable", + "order": 55 + }, + "java.import.gradle.offline.enabled": { + "type": "boolean", + "default": false, + "description": "Enable/disable the Gradle offline mode.", + "scope": "window", + "order": 60 + }, + "java.import.gradle.arguments": { + "type": "string", + "default": null, + "description": "Arguments to pass to Gradle.", + "scope": "machine", + "order": 70 + }, + "java.import.gradle.jvmArguments": { + "type": "string", + "default": null, + "description": "JVM arguments to pass to Gradle.", + "scope": "machine", + "order": 80 + }, + "java.import.gradle.annotationProcessing.enabled": { + "type": "boolean", + "default": true, + "description": "Enable/disable the annotation processing on Gradle projects and delegate Annotation Processing to JDT APT. Only works for Gradle 5.2 or higher.", + "scope": "window", + "order": 90 + }, + "java.imports.gradle.wrapper.checksums": { + "type": "array", + "items": { + "type": "object", + "default": {}, + "required": [ + "sha256" + ], + "properties": { + "sha256": { + "type": "string", + "label": "SHA-256 checksum." + }, + "allowed": { + "type": "boolean", + "default": true, + "label": "Is allowed?" + } + }, + "additionalProperties": false, + "uniqueItems": true }, - "exclude": { - "type": "array" + "description": "Defines allowed/disallowed SHA-256 checksums of Gradle Wrappers", + "default": [], + "scope": "application" + } + } + }, + { + "id": "java-build", + "title": "Build", + "order": 60, + "properties": { + "java.autobuild.enabled": { + "type": "boolean", + "default": true, + "description": "Enable/disable the 'auto build'", + "scope": "window", + "order": 10 + }, + "java.maxConcurrentBuilds": { + "type": "integer", + "default": 1, + "description": "Max simultaneous project builds", + "scope": "window", + "minimum": 1, + "order": 20 + }, + "java.settings.url": { + "type": "string", + "markdownDescription": "Specifies the url or file path to the workspace Java settings. See [Setting Global Preferences](https://github.com/redhat-developer/vscode-java/wiki/Settings-Global-Preferences)", + "default": null, + "scope": "window", + "order": 30 + }, + "java.compile.nullAnalysis.nonnull": { + "type": "array", + "default": [ + "javax.annotation.Nonnull", + "org.eclipse.jdt.annotation.NonNull", + "org.springframework.lang.NonNull", + "org.jspecify.annotations.NonNull" + ], + "markdownDescription": "Specify the Nonnull annotation types to be used for null analysis. If more than one annotation is specified, then the topmost annotation will be used first if it exists in project dependencies. This setting will be ignored if `java.compile.nullAnalysis.mode` is set to `disabled`", + "scope": "window" + }, + "java.compile.nullAnalysis.nullable": { + "type": "array", + "default": [ + "javax.annotation.Nullable", + "org.eclipse.jdt.annotation.Nullable", + "org.springframework.lang.Nullable", + "org.jspecify.annotations.Nullable" + ], + "markdownDescription": "Specify the Nullable annotation types to be used for null analysis. If more than one annotation is specified, then the topmost annotation will be used first if it exists in project dependencies. This setting will be ignored if `java.compile.nullAnalysis.mode` is set to `disabled`", + "scope": "window" + }, + "java.compile.nullAnalysis.nonnullbydefault": { + "type": "array", + "default": [ + "javax.annotation.ParametersAreNonnullByDefault", + "org.eclipse.jdt.annotation.NonNullByDefault", + "org.springframework.lang.NonNullApi", + "org.jspecify.annotations.NullMarked" + ], + "markdownDescription": "Specify the NonNullByDefault annotation types to be used for null analysis. If more than one annotation is specified, then the topmost annotation will be used first if it exists in project dependencies. This setting will be ignored if `java.compile.nullAnalysis.mode` is set to `disabled`", + "scope": "window" + }, + "java.compile.nullAnalysis.mode": { + "type": "string", + "enum": [ + "disabled", + "interactive", + "automatic" + ], + "default": "interactive", + "markdownDescription": "Specify how to enable the annotation-based null analysis.", + "scope": "window" + }, + "java.errors.incompleteClasspath.severity": { + "type": [ + "string" + ], + "enum": [ + "ignore", + "info", + "warning", + "error" + ], + "default": "warning", + "description": "Specifies the severity of the message when the classpath is incomplete for a Java file", + "scope": "window" + } + } + }, + { + "id": "java-jdks", + "title": "Installed JDKs", + "order": 70, + "properties": { + "java.configuration.runtimes": { + "type": "array", + "description": "Map Java Execution Environments to local JDKs.", + "items": { + "type": "object", + "default": {}, + "required": [ + "path", + "name" + ], + "properties": { + "name": { + "type": "string", + "enum": [ + "JavaSE-1.8", + "JavaSE-9", + "JavaSE-10", + "JavaSE-11", + "JavaSE-12", + "JavaSE-13", + "JavaSE-14", + "JavaSE-15", + "JavaSE-16", + "JavaSE-17", + "JavaSE-18", + "JavaSE-19", + "JavaSE-20", + "JavaSE-21", + "JavaSE-22", + "JavaSE-23", + "JavaSE-24", + "JavaSE-25", + "JavaSE-26" + ], + "description": "Java Execution Environment name. Must be unique." + }, + "path": { + "type": "string", + "pattern": ".*(?` or `}`", + "default": true, + "scope": "window" + } + } + }, + { + "id": "java-codecompletion", + "title": "Code Completion", + "order": 90, + "properties": { + "java.completion.enabled": { + "type": "boolean", + "default": true, + "description": "Enable/disable code completion support", + "scope": "window", + "order": 10 + }, + "java.completion.engine": { + "type": "string", + "default": "ecj", + "description": "[Experimental] Select code completion engine", + "scope": "window", + "enum": [ + "ecj", + "dom" + ], + "markdownEnumDescriptions": [ + "Use ECJ-based code completion engine (default)", + "Use (highly experimental) JDT DOM-based code completion engine (requires `java.jdt.ls.javac.enabled` to be `on`)" + ], + "order": 1000 + }, + "java.completion.postfix.enabled": { + "type": "boolean", + "default": true, + "markdownDescription": "Enable/disable postfix completion support. `#editor.snippetSuggestions#` can be used to customize how postfix snippets are sorted.", + "scope": "window", + "order": 20 + }, + "java.completion.chain.enabled": { + "type": "boolean", + "default": false, + "markdownDescription": "Enable/disable chain completion support. Chain completions are only available when completions are invoked by the completions shortcut", + "scope": "window", + "order": 30 + }, + "java.completion.favoriteStaticMembers": { + "type": "array", + "description": "Defines a list of static members or types with static members. Content assist will propose those static members even if the import is missing.", + "default": [ + "org.junit.Assert.*", + "org.junit.Assume.*", + "org.junit.jupiter.api.Assertions.*", + "org.junit.jupiter.api.Assumptions.*", + "org.junit.jupiter.api.DynamicContainer.*", + "org.junit.jupiter.api.DynamicTest.*", + "org.mockito.Mockito.*", + "org.mockito.ArgumentMatchers.*", + "org.mockito.Answers.*" + ], + "scope": "window", + "order": 40 + }, + "java.completion.filteredTypes": { + "type": "array", + "description": "Defines the type filters. All types whose fully qualified name matches the selected filter strings will be ignored in content assist or quick fix proposals and when organizing imports. For example 'java.awt.*' will hide all types from the awt packages.", + "default": [ + "java.awt.*", + "com.sun.*", + "sun.*", + "jdk.*", + "org.graalvm.*", + "io.micrometer.shaded.*" + ], + "scope": "window", + "order": 50 + }, + "java.completion.guessMethodArguments": { + "type": [ + "boolean", + "string" + ], + "enum": [ + "auto", + "off", + "insertParameterNames", + "insertBestGuessedArguments" + ], + "enumDescriptions": [ + "Use 'off' only when using Visual Studio Code - Insiders, other platform will defaults to 'insertBestGuessedArguments'.", + "Method arguments will not be inserted during completion.", + "The parameter names will be inserted during completion.", + "The best guessed arguments will be inserted during completion according to the code context." + ], + "default": "auto", + "description": "Specify how the arguments will be filled during completion.", + "scope": "window", + "order": 60 + }, + "java.completion.matchCase": { + "type": "string", + "enum": [ + "firstLetter", + "off" + ], + "enumDescriptions": [ + "Match case for the first letter when doing completion.", + "Do not match case when doing completion." + ], + "default": "firstLetter", + "markdownDescription": "Specify whether to match case for code completion.", + "scope": "window", + "order": 70 + }, + "java.completion.importOrder": { + "type": "array", + "description": "Defines the sorting order of import statements. A package or type name prefix (e.g. 'org.eclipse') is a valid entry. An import is always added to the most specific group. As a result, the empty string (e.g. '') can be used to group all other imports. Static imports are prefixed with a '#'", + "default": [ + "#", + "java", + "javax", + "org", + "com", + "" + ], + "scope": "window", + "order": 80 + }, + "java.completion.lazyResolveTextEdit.enabled": { + "type": "boolean", + "default": true, + "description": "[Experimental] Enable/disable lazily resolving text edits for code completion.", + "scope": "window" + }, + "java.completion.maxResults": { + "type": "integer", + "default": 0, + "markdownDescription": "Maximum number of completion results (not including snippets).\n`0` (the default value) disables the limit, all results are returned. In case of performance problems, consider setting a sensible limit.", + "scope": "window" + }, + "java.signatureHelp.enabled": { + "type": "boolean", + "default": true, + "description": "Enable/disable the signature help.", + "scope": "window" + }, + "java.signatureHelp.description.enabled": { + "type": "boolean", + "default": false, + "description": "Enable/disable to show the description in signature help.", + "scope": "window" }, - "required": [ - "include" - ], - "additionalProperties": false, - "scope": "window" - }, - "java.project.outputPath": { - "type": [ - "string", - "null" - ], - "markdownDescription": "A relative path to the workspace where stores the compiled output. `Only` effective in the `WORKSPACE` scope. The setting will `NOT` affect Maven or Gradle project.", - "default": "", - "scope": "window" - }, - "java.project.sourcePaths": { - "type": "array", - "items": { - "type": "string" - }, - "markdownDescription": "Relative paths to the workspace where stores the source files. `Only` effective in the `WORKSPACE` scope. The setting will `NOT` affect Maven or Gradle project.", - "default": [], - "scope": "window" - }, - "java.contentProvider.preferred": { - "type": "string", - "description": "Preferred content provider (a 3rd party decompiler id, usually)", - "default": null, - "scope": "window" - }, - "java.autobuild.enabled": { - "type": "boolean", - "default": true, - "description": "Enable/disable the 'auto build'", - "scope": "window" - }, - "java.maxConcurrentBuilds": { - "type": "integer", - "default": 1, - "description": "Max simultaneous project builds", - "scope": "window", - "minimum": 1 - }, - "java.recommendations.dependency.analytics.show": { - "type": "boolean", - "default": true, - "description": "Show the recommended Dependency Analytics extension.", - "scope": "window" - }, - "java.completion.maxResults": { - "type": "integer", - "default": 0, - "markdownDescription": "Maximum number of completion results (not including snippets).\n`0` (the default value) disables the limit, all results are returned. In case of performance problems, consider setting a sensible limit.", - "scope": "window" - }, - "java.completion.enabled": { - "type": "boolean", - "default": true, - "description": "Enable/disable code completion support", - "scope": "window" - }, - "java.completion.guessMethodArguments": { - "type": "boolean", - "default": true, - "description": "When set to true, method arguments are guessed when a method is selected from as list of code assist proposals.", - "scope": "window" - }, - "java.completion.favoriteStaticMembers": { - "type": "array", - "description": "Defines a list of static members or types with static members. Content assist will propose those static members even if the import is missing.", - "default": [ - "org.junit.Assert.*", - "org.junit.Assume.*", - "org.junit.jupiter.api.Assertions.*", - "org.junit.jupiter.api.Assumptions.*", - "org.junit.jupiter.api.DynamicContainer.*", - "org.junit.jupiter.api.DynamicTest.*", - "org.mockito.Mockito.*", - "org.mockito.ArgumentMatchers.*", - "org.mockito.Answers.*" - ], - "scope": "window" - }, - "java.completion.filteredTypes": { - "type": "array", - "description": "Defines the type filters. All types whose fully qualified name matches the selected filter strings will be ignored in content assist or quick fix proposals and when organizing imports. For example 'java.awt.*' will hide all types from the awt packages.", - "default": [ - "java.awt.*", - "com.sun.*", - "sun.*", - "jdk.*", - "org.graalvm.*", - "io.micrometer.shaded.*" - ], - "scope": "window" - }, - "java.completion.importOrder": { - "type": "array", - "description": "Defines the sorting order of import statements. A package or type name prefix (e.g. 'org.eclipse') is a valid entry. An import is always added to the most specific group. As a result, the empty string (e.g. '') can be used to group all other imports. Static imports are prefixed with a '#'", - "default": [ - "#", - "java", - "javax", - "org", - "com", - "" - ], - "scope": "window" - }, - "java.completion.postfix.enabled": { - "type": "boolean", - "default": true, - "markdownDescription": "Enable/disable postfix completion support. `#editor.snippetSuggestions#` can be used to customize how postfix snippets are sorted.", - "scope": "window" - }, - "java.completion.matchCase": { - "type": "string", - "enum": [ - "auto", - "firstLetter", - "off" - ], - "enumDescriptions": [ - "Only match case for the first letter when using Visual Studio Code - Insiders.", - "Match case for the first letter when doing completion.", - "Do not match case when doing completion." - ], - "default": "auto", - "markdownDescription": "Specify whether to match case for code completion.", - "scope": "window" - }, - "java.foldingRange.enabled": { - "type": "boolean", - "default": true, - "description": "Enable/disable smart folding range support. If disabled, it will use the default indentation-based folding range provided by VS Code.", - "scope": "window" - }, - "java.progressReports.enabled": { - "type": "boolean", - "description": "[Experimental] Enable/disable progress reports from background processes on the server.", - "default": true, - "scope": "window" - }, - "java.format.settings.url": { - "type": "string", - "markdownDescription": "Specifies the url or file path to the [Eclipse formatter xml settings](https://github.com/redhat-developer/vscode-java/wiki/Formatter-settings).", - "default": null, - "scope": "window" - }, - "java.format.settings.profile": { - "type": "string", - "description": "Optional formatter profile name from the Eclipse formatter settings.", - "default": null, - "scope": "window" - }, - "java.format.comments.enabled": { - "type": "boolean", - "description": "Includes the comments during code formatting.", - "default": true, - "scope": "window" - }, - "java.format.onType.enabled": { - "type": "boolean", - "description": "Enable/disable automatic block formatting when typing `;`, `` or `}`", - "default": true, - "scope": "window" - }, - "java.codeGeneration.hashCodeEquals.useJava7Objects": { - "type": "boolean", - "description": "Use Objects.hash and Objects.equals when generating the hashCode and equals methods. This setting only applies to Java 7 and higher.", - "default": false, - "scope": "window" - }, - "java.codeGeneration.hashCodeEquals.useInstanceof": { - "type": "boolean", - "description": "Use 'instanceof' to compare types when generating the hashCode and equals methods.", - "default": false, - "scope": "window" - }, - "java.codeGeneration.useBlocks": { - "type": "boolean", - "description": "Use blocks in 'if' statements when generating the methods.", - "default": false, - "scope": "window" - }, - "java.codeGeneration.generateComments": { - "type": "boolean", - "description": "Generate method comments when generating the methods.", - "default": false, - "scope": "window" - }, - "java.codeGeneration.toString.template": { - "type": "string", - "description": "The template for generating the toString method.", - "default": "${object.className} [${member.name()}=${member.value}, ${otherMembers}]" - }, - "java.codeGeneration.toString.codeStyle": { - "type": "string", - "enum": [ - "STRING_CONCATENATION", - "STRING_BUILDER", - "STRING_BUILDER_CHAINED", - "STRING_FORMAT" - ], - "enumDescriptions": [ - "String concatenation", - "StringBuilder/StringBuffer", - "StringBuilder/StringBuffer - chained call", - "String.format/MessageFormat" - ], - "description": "The code style for generating the toString method.", - "default": "STRING_CONCATENATION" - }, - "java.codeGeneration.toString.skipNullValues": { - "type": "boolean", - "description": "Skip null values when generating the toString method.", - "default": false, - "scope": "window" - }, - "java.codeGeneration.toString.listArrayContents": { - "type": "boolean", - "description": "List contents of arrays instead of using native toString().", - "default": true, - "scope": "window" - }, - "java.codeGeneration.toString.limitElements": { - "type": "integer", - "description": "Limit number of items in arrays/collections/maps to list, if 0 then list all.", - "default": 0, - "scope": "window" - }, - "java.codeGeneration.insertionLocation": { - "type": "string", - "enum": [ - "afterCursor", - "beforeCursor", - "lastMember" - ], - "enumDescriptions": [ - "Insert the generated code after the member where the cursor is located.", - "Insert the generated code before the member where the cursor is located.", - "Insert the generated code as the last member of the target type." - ], - "description": "Specifies the insertion location of the code generated by source actions.", - "default": "afterCursor", - "scope": "window" - }, - "java.selectionRange.enabled": { - "type": "boolean", - "default": true, - "description": "Enable/disable Smart Selection support for Java. Disabling this option will not affect the VS Code built-in word-based and bracket-based smart selection.", - "scope": "window" - }, - "java.showBuildStatusOnStart.enabled": { - "anyOf": [ - { + "java.completion.collapseCompletionItems": { + "type": "boolean", + "default": false, + "markdownDescription": "Enable/disable the collapse of overloaded methods in completion items. Overrides `#java.completion.guessMethodArguments#`.", + "scope": "window" + } + } + }, + { + "id": "java-codegeneration", + "title": "Code Generation", + "order": 100, + "properties": { + "java.templates.newFile.enabled": { + "type": "boolean", + "default": true, + "markdownDescription": "Enable/disable automatic generation of class body and package declaration when creating a new Java file. Set to `false` to create empty Java files. Defaults to `true`.", + "scope": "window", + "order": 5 + }, + "java.templates.fileHeader": { + "type": "array", + "markdownDescription": "Specifies the file header comment for new Java file. Supports configuring multi-line comments with an array of strings, and using ${variable} to reference the [predefined variables](command:_java.templateVariables).", + "scope": "window", + "default": [], + "order": 10 + }, + "java.templates.typeComment": { + "type": "array", + "markdownDescription": "Specifies the type comment for new Java type. Supports configuring multi-line comments with an array of strings, and using ${variable} to reference the [predefined variables](command:_java.templateVariables).", + "scope": "window", + "default": [], + "order": 20 + }, + "java.templates.methodBody": { + "type": "array", + "markdownDescription": "Specifies the method body snippet for unimplemented methods (e.g. generated by \"Add unimplemented methods\"). Supports configuring multi-line content with an array of strings, and using ${variable} to reference the [predefined variables](command:_java.templateVariables).", + "scope": "window", + "default": [ + "// ${todo} Auto-generated method stub", + "throw new UnsupportedOperationException(\"Unimplemented method '${enclosing_method}'\");" + ], + "order": 30 + }, + "java.templates.preferPackagePrivateVisibility": { + "type": "boolean", + "markdownDescription": "Specifies whether newly created top-level types (class/interface/record) should be package-private instead of public.", + "scope": "window", + "default": false, + "order": 40 + }, + "java.templates.methodBodySuper": { + "type": "array", + "markdownDescription": "Specifies the method body snippet for overridden methods that call `super` (e.g. generated by \"Override/Implement Methods\"). Supports configuring multi-line content with an array of strings, and using ${variable} to reference the [predefined variables](command:_java.templateVariables).", + "scope": "window", + "default": [ + "// ${todo} Auto-generated method stub", + "${body_statement}" + ], + "order": 31 + }, + "java.templates.catchBody": { + "type": "array", + "markdownDescription": "Specifies the catch block body snippet (e.g. generated by \"Surround with try/catch\"). Supports configuring multi-line content with an array of strings, and using ${variable} to reference the [predefined variables](command:_java.templateVariables).", + "scope": "window", + "default": [ + "// ${todo} Auto-generated catch block", + "${exception_var}.printStackTrace();" + ], + "order": 32 + }, + "java.codeGeneration.insertionLocation": { + "type": "string", + "enum": [ + "afterCursor", + "beforeCursor", + "lastMember" + ], + "enumDescriptions": [ + "Insert the generated code after the member where the cursor is located.", + "Insert the generated code before the member where the cursor is located.", + "Insert the generated code as the last member of the target type." + ], + "description": "Specifies the insertion location of the code generated by source actions.", + "default": "afterCursor", + "scope": "window", + "order": 30 + }, + "java.codeGeneration.addFinalForNewDeclaration": { + "type": "string", + "enum": [ + "none", + "fields", + "variables", + "all" + ], + "enumDescriptions": [ + "Do not generate final modifier.", + "Generate 'final' modifier only for new field declarations.", + "Generate 'final' modifier only for new variable declarations.", + "Generate 'final' modifier for all new declarations." + ], + "description": "Whether to generate the 'final' modifer for code actions that create new declarations.", + "default": "none", + "scope": "window" + }, + "java.codeGeneration.hashCodeEquals.useJava7Objects": { + "type": "boolean", + "description": "Use Objects.hash and Objects.equals when generating the hashCode and equals methods. This setting only applies to Java 7 and higher.", + "default": false, + "scope": "window" + }, + "java.codeGeneration.hashCodeEquals.useInstanceof": { + "type": "boolean", + "description": "Use 'instanceof' to compare types when generating the hashCode and equals methods.", + "default": false, + "scope": "window" + }, + "java.codeGeneration.useBlocks": { + "type": "boolean", + "description": "Use blocks in 'if' statements when generating the methods.", + "default": false, + "scope": "window" + }, + "java.codeGeneration.generateComments": { + "type": "boolean", + "description": "Generate method comments when generating the methods.", + "default": false, + "scope": "window" + }, + "java.codeGeneration.generateCommentsInMarkdown": { + "type": "boolean", + "description": "Generate Javadoc comments in Markdown style (requires source compliance >= 23).", + "default": false + }, + "java.codeGeneration.toString.template": { + "type": "string", + "description": "The template for generating the toString method.", + "default": "${object.className} [${member.name()}=${member.value}, ${otherMembers}]" + }, + "java.codeGeneration.toString.codeStyle": { + "type": "string", + "enum": [ + "STRING_CONCATENATION", + "STRING_BUILDER", + "STRING_BUILDER_CHAINED", + "STRING_FORMAT" + ], + "enumDescriptions": [ + "String concatenation", + "StringBuilder/StringBuffer", + "StringBuilder/StringBuffer - chained call", + "String.format/MessageFormat" + ], + "description": "The code style for generating the toString method.", + "default": "STRING_CONCATENATION" + }, + "java.codeGeneration.toString.skipNullValues": { + "type": "boolean", + "description": "Skip null values when generating the toString method.", + "default": false, + "scope": "window" + }, + "java.codeGeneration.toString.listArrayContents": { + "type": "boolean", + "description": "List contents of arrays instead of using native toString().", + "default": true, + "scope": "window" + }, + "java.codeGeneration.toString.limitElements": { + "type": "integer", + "description": "Limit number of items in arrays/collections/maps to list, if 0 then list all.", + "default": 0, + "scope": "window" + }, + "java.edit.smartSemicolonDetection.enabled": { + "type": "boolean", + "default": false, + "markdownDescription": "Defines the `smart semicolon` detection. Defaults to `false`.", + "scope": "window" + } + } + }, + { + "id": "java-codeaction", + "title": "Code Action", + "order": 110, + "properties": { + "java.cleanup.actions": { + "type": "array", + "markdownDescription": "The list of clean ups to be run on the current document when it's saved or when the cleanup command is issued. Clean ups can automatically fix code style or programming mistakes. Click [HERE](command:_java.learnMoreAboutCleanUps) to learn more about what each clean up does.", + "items": { + "type": "string", "enum": [ - "notification", - "terminal", - "off" - ], - "enumDescriptions": [ - "Show the build status via progress notification on start", - "Show the build status via terminal on start", - "Do not show any build status on start" + "qualifyMembers", + "qualifyStaticMembers", + "addOverride", + "addDeprecated", + "stringConcatToTextBlock", + "invertEquals", + "addFinalModifier", + "instanceofPatternMatch", + "lambdaExpressionFromAnonymousClass", + "lambdaExpression", + "switchExpression", + "tryWithResource", + "renameFileToType", + "organizeImports", + "renameUnusedLocalVariables", + "useSwitchForInstanceofPattern", + "redundantComparisonStatement", + "redundantFallingThroughBlockEnd", + "redundantIfCondition", + "redundantModifiers", + "redundantSuperCall" ] }, - "boolean" - ], - "description": "Automatically show build status on startup.", - "default": "notification", - "scope": "window" - }, - "java.configuration.runtimes": { - "type": "array", - "description": "Map Java Execution Environments to local JDKs.", - "items": { - "type": "object", - "default": {}, - "required": [ - "path", - "name" + "default": [ + "renameFileToType" ], - "properties": { - "name": { - "type": "string", - "enum": [ - "J2SE-1.5", - "JavaSE-1.6", - "JavaSE-1.7", - "JavaSE-1.8", - "JavaSE-9", - "JavaSE-10", - "JavaSE-11", - "JavaSE-12", - "JavaSE-13", - "JavaSE-14", - "JavaSE-15", - "JavaSE-16", - "JavaSE-17", - "JavaSE-18", - "JavaSE-19" - ], - "description": "Java Execution Environment name. Must be unique." - }, - "path": { - "type": "string", - "pattern": ".*(? n % 2 == 0).toList();\n \n```", + "scope": "window" + }, + "java.inlayHints.formatParameters.enabled": { + "type": "boolean", + "default": false, + "markdownDescription": "Enable/disable inlay hints for format specifiers in format strings (e.g. `String.format()`, `String.formatted()`, `PrintStream.printf()`). Shows which argument corresponds to each format specifier.", + "scope": "window" + }, + "java.search.scope": { "type": "string", "enum": [ - "qualifyMembers", - "qualifyStaticMembers", - "addOverride", - "addDeprecated", - "stringConcatToTextBlock", - "invertEquals", - "addFinalModifier", - "instanceofPatternMatch", - "lambdaExpression", - "switchExpression", - "tryWithResource" - ] + "all", + "main", + "projectOnly" + ], + "enumDescriptions": [ + "Search on all classpath entries including reference libraries and projects.", + "All classpath entries excluding test classpath entries.", + "Only search sources, tests, and referenced projects, excluding the JDK and referenced libraries from the search." + ], + "default": "all", + "markdownDescription": "Specifies the scope which must be used for search operation like \n - Find Reference\n - Call Hierarchy\n - Workspace Symbols", + "scope": "window", + "order": 100 + } + } + }, + { + "id": "java-others", + "title": "Others", + "order": 130, + "properties": { + "java.eclipse.downloadSources": { + "type": "boolean", + "default": false, + "description": "Enable/disable download of Maven source artifacts for Eclipse projects.", + "scope": "window" }, - "default": [], - "scope": "window" - }, - "java.sharedIndexes.enabled": { - "type": "string", - "enum": [ - "auto", - "on", - "off" - ], - "default": "auto", - "markdownDescription": "[Experimental] Specify whether to share indexes between different workspaces. When set to `auto`, shared indexes will be enabled in Visual Studio Code - Insiders.", - "scope": "window" - }, - "java.sharedIndexes.location": { - "type": "string", - "markdownDescription": "Specifies a common index location for all workspaces. See default values as follows:\n \nWindows: First use `\"$APPDATA\\\\.jdt\\\\index\"`, or `\"~\\\\.jdt\\\\index\"` if it does not exist\n \nmacOS: `\"~/Library/Caches/.jdt/index\"`\n \nLinux: First use `\"$XDG_CACHE_HOME/.jdt/index\"`, or `\"~/.cache/.jdt/index\"` if it does not exist", - "default": "", - "scope": "window" - }, - "java.refactoring.extract.interface.replace": { - "type": "boolean", - "markdownDescription": "Specify whether to replace all the occurrences of the subtype with the new extracted interface.", - "default": true + "java.contentProvider.preferred": { + "type": "string", + "description": "Preferred content provider (a 3rd party decompiler id, usually)", + "default": null, + "scope": "window" + }, + "java.foldingRange.enabled": { + "type": "boolean", + "default": true, + "description": "Enable/disable smart folding range support. If disabled, it will use the default indentation-based folding range provided by VS Code.", + "scope": "window" + }, + "java.selectionRange.enabled": { + "type": "boolean", + "default": true, + "description": "Enable/disable Smart Selection support for Java. Disabling this option will not affect the VS Code built-in word-based and bracket-based smart selection.", + "scope": "window" + }, + "java.edit.validateAllOpenBuffersOnChanges": { + "type": "boolean", + "default": false, + "markdownDescription": "Specifies whether to recheck all open Java files for diagnostics when editing a Java file.", + "scope": "window" + }, + "java.diagnostic.filter": { + "type": "array", + "items": { + "type": "string" + }, + "default": [], + "description": "Specifies a list of file patterns for which matching documents should not have their diagnostics reported (eg. '**/Foo.java').", + "scope": "window" + }, + "java.editor.reloadChangedSources": { + "type": "string", + "enum": [ + "ask", + "auto", + "manual" + ], + "enumDescriptions": [ + "Ask to reload the sources of the open class files", + "Automatically reload the sources of the open class files", + "Manually reload the sources of the open class files" + ], + "default": "ask", + "markdownDescription": "Specifies whether to reload the sources of the open class files when their source jar files are changed.", + "scope": "window" + } } } - }, + ], "configurationDefaults": { "[java]": { "editor.suggest.snippetsPreventQuickSuggestions": false @@ -1222,6 +1868,60 @@ "command": "java.clean.sharedIndexes", "title": "%java.clean.sharedIndexes%", "category": "Java" + }, + { + "command": "java.server.restart", + "title": "%java.server.restart%", + "category": "Java" + }, + { + "command": "java.action.filesExplorerPasteAction", + "title": "%java.action.filesExplorerPasteAction%", + "category": "Java" + }, + { + "command": "java.action.doCleanup", + "title": "%java.action.doCleanup%", + "category": "Java" + }, + { + "command": "java.change.searchScope", + "title": "%java.change.searchScope%" + }, + { + "command": "java.action.showExtendedOutline", + "title": "%java.action.showExtendedOutline%", + "category": "Java" + }, + { + "command": "java.dashboard.refresh", + "category": "Java", + "title": "Refresh", + "icon": "$(refresh)", + "when": "java:dashboard == true" + }, + { + "command": "java.dashboard.dumpState", + "category": "Java", + "title": "Dump State", + "icon": "$(json)", + "when": "java:dashboard == true" + }, + { + "command": "java.dashboard.open", + "category": "Java", + "title": "Open Java Dashboard", + "icon": "$(dashboard)" + }, + { + "command": "java.runtimes.add", + "title": "%java.runtimes.add%", + "category": "Java" + }, + { + "command": "java.action.copyFullyQualifiedName", + "title": "%java.action.copyFullyQualifiedName%", + "category": "Java" } ], "keybindings": [ @@ -1239,6 +1939,22 @@ "key": "ctrl+shift+v", "mac": "cmd+shift+v", "when": "javaLSReady && editorLangId == java" + }, + { + "command": "java.action.filesExplorerPasteAction", + "key": "ctrl+shift+v", + "mac": "cmd+shift+v", + "when": "explorerViewletFocus && config.editor.pasteAs.enabled" + }, + { + "command": "java.action.doCleanup", + "key": "ctrl+shift+alt+s", + "when": "javaLSReady && editorLangId == java" + }, + { + "command": "java.action.showExtendedOutline", + "key": "ctrl+o", + "when": "javaLSReady && inQuickOpen" } ], "menus": { @@ -1249,16 +1965,28 @@ "group": "1_javaactions" }, { - "when": "explorerResourceIsFolder&&javaLSReady", + "when": "explorerResourceIsFolder&&javaLSReady&&resourceDirname in java.projects", "command": "java.project.addToSourcePath.command", "group": "1_javaactions@1" }, { - "when": "explorerResourceIsFolder&&javaLSReady", + "when": "explorerResourceIsFolder&&javaLSReady&&resourceDirname in java.projects", "command": "java.project.removeFromSourcePath.command", "group": "1_javaactions@2" } ], + "editor/title": [ + { + "command": "java.dashboard.refresh", + "group": "navigation", + "when": "webviewId == java.dashboard" + }, + { + "command": "java.dashboard.dumpState", + "group": "navigation", + "when": "webviewId == java.dashboard" + } + ], "editor/context": [ { "command": "java.project.updateSourceAttachment.command", @@ -1279,6 +2007,11 @@ "command": "java.action.showTypeHierarchy", "when": "javaLSReady && editorTextFocus && editorLangId == java", "group": "0_navigation@3" + }, + { + "command": "java.action.copyFullyQualifiedName", + "when": "javaLSReady && editorTextFocus && editorLangId == java", + "group": "1_javaactions" } ], "commandPalette": [ @@ -1353,6 +2086,18 @@ { "command": "java.server.mode.switch", "when": "java:serverMode == LightWeight" + }, + { + "command": "java.server.restart", + "when": "javaLSReady" + }, + { + "command": "java.action.filesExplorerPasteAction", + "when": "false" + }, + { + "command": "java.action.doCleanup", + "when": "false" } ], "view/title": [ @@ -1382,58 +2127,82 @@ } }, "scripts": { - "vscode:prepublish": "webpack --mode production", + "vscode:prepublish": "node scripts/prepublish.mjs", "compile": "tsc -p ./&webpack --mode development", "watch": "webpack --mode development --watch", "pretest": "npm run compile", "test": "node ./out/test/runtest.js", - "build-server": "./node_modules/.bin/gulp build_server", - "fast-build-server": "./node_modules/.bin/gulp dev_server", - "watch-server": "./node_modules/.bin/gulp watch_server", - "eslint": "eslint --ignore-path .eslintignore --ext .js,.ts ." + "build-server": "node scripts/index.mjs build-server", + "build": "node scripts/index.mjs build-or-download", + "fast-build-server": "node scripts/index.mjs dev-server", + "watch-server": "node scripts/index.mjs watch-server", + "eslint": "eslint .", + "repo:check": "node scripts/index.mjs repo-check", + "repo:fix": "node scripts/index.mjs repo-fix", + "clean-jre": "node scripts/index.mjs clean-jre", + "download-jre": "node scripts/index.mjs download-jre", + "download-lombok": "node scripts/index.mjs download-lombok", + "download-server": "node scripts/index.mjs download-server", + "generate-standard-test-folder": "node scripts/index.mjs generate-standard-test-folder", + "generate-lightweight-test-folder": "node scripts/index.mjs generate-lightweight-test-folder", + "clean-test-folder": "node scripts/index.mjs clean-test-folder", + "prepare-pre-release": "node scripts/index.mjs prepare-pre-release" }, "devDependencies": { + "@stylistic/eslint-plugin": "^5.10.0", "@types/fs-extra": "^8.0.0", "@types/glob": "5.0.30", "@types/lodash.findindex": "^4.6.6", "@types/mocha": "^5.2.5", - "@types/node": "^16.11.7", + "@types/node": "^18.17.1", + "@types/react": "^17.0.37", + "@types/react-dom": "^17.0.11", "@types/semver": "^7.3.8", "@types/sinon": "^10.0.12", - "@types/vscode": "^1.74.0", + "@types/vscode": "^1.77.0", + "@types/vscode-webview": "^1.57.0", "@types/winreg": "^1.2.30", "@types/winston": "^2.4.4", - "@vscode/test-electron": "^2.1.5", - "@typescript-eslint/eslint-plugin": "^5.18.0", - "@typescript-eslint/parser": "^5.18.0", - "eslint": "^8.13.0", - "eslint-webpack-plugin": "^3.2.0", - "gulp": "^4.0.2", - "gulp-decompress": "^3.0.0", - "gulp-download": "0.0.1", + "@vscode/test-electron": "^3.1.0", + "css-loader": "^6.7.3", + "eslint": "^10.7.0", + "eslint-webpack-plugin": "^6.0.0", + "globals": "^17.7.0", "lodash.findindex": "^4.6.0", - "lodash.template": ">=4.5.0", + "mini-css-extract-plugin": "^2.9.4", "minimist": ">=1.2.6", - "mocha": "^9.2.2", - "request": "^2.88.2", + "mocha": "^11.1.0", "sinon": "^14.0.0", - "ts-loader": "^9.2.6", + "tar": "^7.5.11", + "ts-loader": "^9.4.2", "typescript": "^4.6.4", - "webpack": "^5.28.0", - "webpack-cli": "^4.6.0" + "typescript-eslint": "^8.65.0", + "webpack": "^5.105.0", + "webpack-cli": "^7.2.1" }, "dependencies": { + "@redhat-developer/vscode-extension-proposals": "0.0.23", + "@redhat-developer/vscode-redhat-telemetry": "0.10.2", + "@vscode/codicons": "^0.0.32", "chokidar": "^3.5.3", "expand-home-dir": "^0.0.3", "fmtr": "^1.1.2", "fs-extra": "^8.1.0", - "glob": "^7.1.3", + "glob": "^11.1.0", "htmlparser2": "6.0.1", - "jdk-utils": "^0.4.4", - "semver": "^7.3.5", - "vscode-languageclient": "8.1.0", + "jdk-utils": "^0.6.0", + "react": "^17.0.2", + "react-dom": "^17.0.2", + "semver": "^7.5.2", + "vscode-languageclient": "8.2.0-next.3", + "vscode-variables": "^1.0.1", "winreg-utf8": "^0.1.1", "winston": "^3.2.1", - "winston-daily-rotate-file": "^3.10.0" - } + "winston-daily-rotate-file": "^4.7.1" + }, + "overrides": { + "vscode-languageserver-protocol": "3.17.6-next.1" + }, + "segmentWriteKey": "Y7Y5Xk8dKEhVZHTmAkFZkqgdN4d7c4lt", + "segmentWriteKeyDebug": "BflPll7uuKOCm3y0g7JpfXLVBVFBivDE" } diff --git a/package.nls.json b/package.nls.json index e82f5287f..c695cfe3e 100644 --- a/package.nls.json +++ b/package.nls.json @@ -11,7 +11,7 @@ "java.project.build": "Rebuild Projects", "java.open.formatter.settings": "Open Java Formatter Settings", "java.clean.workspace": "Clean Java Language Server Workspace", - "java.project.updateSourceAttachment": "Attach Source", + "java.project.updateSourceAttachment": "Attach Source...", "java.project.addToSourcePath": "Add Folder to Java Source Path", "java.project.removeFromSourcePath": "Remove Folder from Java Source Path", "java.project.listSourcePaths": "List All Java Source Paths", @@ -23,5 +23,13 @@ "java.action.showSubtypeHierarchy": "Show Subtype Hierarchy", "java.action.changeBaseType": "Base on this Type", "java.project.createModuleInfo.command": "Create module-info.java", - "java.clean.sharedIndexes": "Clean Shared Indexes" + "java.clean.sharedIndexes": "Clean Shared Indexes", + "java.server.restart": "Restart Java Language Server", + "java.edit.smartSemicolonDetection": "Java Smart Semicolon Detection", + "java.action.filesExplorerPasteAction": "Paste Clipboard Text Into a File", + "java.action.doCleanup": "Performs Cleanup Actions", + "java.change.searchScope": "Change Search Scope", + "java.action.showExtendedOutline": "Open Extended Outline", + "java.runtimes.add": "Add Java Runtime", + "java.action.copyFullyQualifiedName": "Copy Fully Qualified Name" } diff --git a/package.nls.ko.json b/package.nls.ko.json index 13cf6afbc..0b185fa05 100644 --- a/package.nls.ko.json +++ b/package.nls.ko.json @@ -7,20 +7,27 @@ "java.open.serverStderrLog": "Java Language Server ์˜ค๋ฅ˜ ๋กœ๊ทธ ํŒŒ์ผ ์—ด๊ธฐ", "java.open.clientLog": "Java Extension ๋กœ๊ทธ ํŒŒ์ผ ์—ด๊ธฐ", "java.open.logs": "๋ชจ๋“  ๋กœ๊ทธ ํŒŒ์ผ ์—ด๊ธฐ", - "java.workspace.compile": "Java ๊ฐ•์ œ ์ปดํŒŒ์ผ", + "java.workspace.compile": "Java ์ปดํŒŒ์ผ ๊ฐ•์ œ ์‹คํ–‰", "java.project.build": "ํ”„๋กœ์ ํŠธ ๋‹ค์‹œ ๋นŒ๋“œ", "java.open.formatter.settings": "Java Formatter ์„ค์ • ์—ด๊ธฐ", "java.clean.workspace": "Java Language Server ์ž‘์—… ์˜์—ญ ์ •๋ฆฌ", - "java.project.updateSourceAttachment": "Attach Source", - "java.project.addToSourcePath": "Java Source ๊ฒฝ๋กœ์— ํด๋” ์ถ”๊ฐ€", - "java.project.removeFromSourcePath": "Java Source ๊ฒฝ๋กœ์—์„œ ํด๋” ์ œ๊ฑฐ", - "java.project.listSourcePaths": "๋ชจ๋“  Java Source ๊ฒฝ๋กœ๋ฅผ ๋‚˜์—ด", + "java.project.updateSourceAttachment": "์†Œ์Šค ์ฒจ๋ถ€...", + "java.project.addToSourcePath": "Java ์†Œ์Šค ๊ฒฝ๋กœ์— ํด๋” ์ถ”๊ฐ€", + "java.project.removeFromSourcePath": "Java ์†Œ์Šค ๊ฒฝ๋กœ์—์„œ ํด๋” ์ œ๊ฑฐ", + "java.project.listSourcePaths": "๋ชจ๋“  Java ์†Œ์Šค ๊ฒฝ๋กœ ํ‘œ์‹œ", "java.show.server.task.status": "๋นŒ๋“œ ์ž‘์—… ์ƒํƒœ ํ‘œ์‹œ", "java.action.navigateToSuperImplementation": "์ƒ์œ„ ๊ตฌํ˜„์œผ๋กœ ์ด๋™", "java.action.showTypeHierarchy": "Type ๊ณ„์ธต ๊ตฌ์กฐ ํ‘œ์‹œ", "java.action.showClassHierarchy": "Class ๊ณ„์ธต ๊ตฌ์กฐ ํ‘œ์‹œ", "java.action.showSupertypeHierarchy": "Supertype ๊ณ„์ธต ๊ตฌ์กฐ ํ‘œ์‹œ", "java.action.showSubtypeHierarchy": "Subtype ๊ณ„์ธต ๊ตฌ์กฐ ํ‘œ์‹œ", - "java.action.changeBaseType": "์ด ์œ ํ˜•์„ ๊ธฐ์ค€์œผ๋กœ", - "java.project.createModuleInfo.command": "module-info.java ์ƒ์„ฑ" + "java.action.changeBaseType": "์ด ํƒ€์ž…์„ ๊ธฐ์ค€์œผ๋กœ", + "java.project.createModuleInfo.command": "module-info.java ์ƒ์„ฑ", + "java.clean.sharedIndexes": "๊ณต์œ  ์ธ๋ฑ์Šค ์ •๋ฆฌ", + "java.server.restart": "Java Language Server ๋‹ค์‹œ ์‹œ์ž‘", + "java.edit.smartSemicolonDetection": "Java ์Šค๋งˆํŠธ ์„ธ๋ฏธ์ฝœ๋ก  ๊ฐ์ง€", + "java.action.filesExplorerPasteAction": "ํด๋ฆฝ๋ณด๋“œ ํ…์ŠคํŠธ๋ฅผ ํŒŒ์ผ์— ๋ถ™์—ฌ๋„ฃ๊ธฐ", + "java.action.doCleanup": "์ •๋ฆฌ ์ž‘์—…์„ ์ˆ˜ํ–‰", + "java.change.searchScope": "๊ฒ€์ƒ‰ ๋ฒ”์œ„ ๋ณ€๊ฒฝ", + "java.action.showExtendedOutline": "ํ™•์žฅ ๊ฐœ์š” ์—ด๊ธฐ" } diff --git a/package.nls.zh-cn.json b/package.nls.zh-cn.json index 87eb77c5f..2526d4c36 100644 --- a/package.nls.zh-cn.json +++ b/package.nls.zh-cn.json @@ -11,7 +11,7 @@ "java.project.build": "้‡ๆ–ฐๆž„ๅปบ้กน็›ฎ", "java.open.formatter.settings": "ๆ‰“ๅผ€ Java ๆ ผๅผ่ฎพ็ฝฎ", "java.clean.workspace": "ๆธ…็† Java ่ฏญ่จ€ๆœๅŠกๅ™จๅทฅไฝœๅŒบ", - "java.project.updateSourceAttachment": "้™„ๅŠ ๆบไปฃ็ ", + "java.project.updateSourceAttachment": "้™„ๅŠ ๆบไปฃ็ ...", "java.project.addToSourcePath": "ๅฐ†ๆ–‡ไปถๅคนๅŠ ๅ…ฅ Java ๆบไปฃ็ ่ทฏๅพ„", "java.project.removeFromSourcePath": "ๅฐ†ๆ–‡ไปถๅคนไปŽ Java ๆบไปฃ็ ่ทฏๅพ„ไธญๅˆ ้™ค", "java.project.listSourcePaths": "ๅˆ—ๅ‡บๆ‰€ๆœ‰ Java ๆบไปฃ็ ่ทฏๅพ„", @@ -23,5 +23,7 @@ "java.action.showSubtypeHierarchy": "ๆ˜พ็คบๅญ็ฑปๅฑ‚ๆฌก็ป“ๆž„", "java.action.changeBaseType": "ๅŸบไบŽๆญค็ฑปๅž‹", "java.project.createModuleInfo.command": "ๅˆ›ๅปบ module-info.java", - "java.clean.sharedIndexes": "ๆธ…็†ๅ…ฑไบซ็š„็ดขๅผ•ๆ–‡ไปถ" + "java.clean.sharedIndexes": "ๆธ…็†ๅ…ฑไบซ็š„็ดขๅผ•ๆ–‡ไปถ", + "java.action.filesExplorerPasteAction": "ๅฐ†ๅ‰ช่ดดๆฟๆ–‡ๆœฌ็ฒ˜่ดดๅˆฐๆ–‡ไปถไธญ", + "java.action.doCleanup": "ๆ‰ง่กŒๆธ…็†ๆ“ไฝœ" } diff --git a/package.nls.zh-tw.json b/package.nls.zh-tw.json index 8c6856e68..808fc1d97 100644 --- a/package.nls.zh-tw.json +++ b/package.nls.zh-tw.json @@ -11,7 +11,7 @@ "java.project.build": "้‡ๆ–ฐๅปบ็ฝฎๅฐˆๆกˆ", "java.open.formatter.settings": "้–‹ๅ•Ÿ Java ๆ ผๅผ่จญๅฎš", "java.clean.workspace": "ๆธ…็† Java ่ชž่จ€ไผบๆœๅ™จๅทฅไฝœๅ€", - "java.project.updateSourceAttachment": "้™„ๅŠ ๅŽŸๅง‹็ขผ", + "java.project.updateSourceAttachment": "้™„ๅŠ ๅŽŸๅง‹็ขผ...", "java.project.addToSourcePath": "ๅฐ‡่ณ‡ๆ–™ๅคพๅŠ ๅ…ฅ Java ๅŽŸๅง‹็ขผ่ทฏๅพ‘", "java.project.removeFromSourcePath": "ๅพž Java ๅง‹็ขผ่ทฏๅพ‘ไธญ็งป้™ค่ณ‡ๆ–™ๅคพ", "java.project.listSourcePaths": "ๅˆ—ๅ‡บๆ‰€ๆœ‰ Java ๅง‹็ขผ่ทฏๅพ‘", @@ -22,5 +22,7 @@ "java.action.showSupertypeHierarchy": "้กฏ็คบ็ˆถ้กžๅˆฅ้šŽๅฑค็ตๆง‹", "java.action.showSubtypeHierarchy": "้กฏ็คบๅญ้กžๅˆฅ้šŽๅฑค็ตๆง‹", "java.action.changeBaseType": "ไปฅๆญคๅž‹ๅˆฅ็‚บๅŸบ็คŽ", - "java.project.createModuleInfo.command": "ๅ‰ตๅปบ module-info.java" + "java.project.createModuleInfo.command": "ๅ‰ตๅปบ module-info.java", + "java.action.filesExplorerPasteAction": "ๅฐ‡ๅ‰ช่ฒผ็ฐฟๆ–‡ๅญ—่ฒผๅˆฐๆ–‡ไปถไธญ", + "java.action.doCleanup": "ๅŸท่กŒๆธ…็†ๆ“ไฝœ" } \ No newline at end of file diff --git a/schemas/package.schema.json b/schemas/package.schema.json index a147e2d3a..53d17634c 100644 --- a/schemas/package.schema.json +++ b/schemas/package.schema.json @@ -1,6 +1,5 @@ { "$schema": "http://json-schema.org/draft-04/schema#", - "title": "Java Language server contributions to package.json", "type": "object", "properties": { "contributes": { @@ -21,6 +20,47 @@ "type": "string", "description": "Regular expressions for specifying build file" } + }, + "javaBuildTools": { + "type": "array", + "description": "Information about the cared build files. Will be used when 'java.import.projectSelection' is 'manual'.", + "items": { + "type": "object", + "properties": { + "displayName": { + "description": "The display name of the build file type.", + "type": "string" + }, + "buildFileNames": { + "description": "The build file names that supported by the build tool.", + "type": "array", + "items": { + "type": "string" + } + } + } + } + }, + "javaShortcuts": { + "type": "array", + "description": "Shortcuts to be listed when clicking server status bar item.", + "items": { + "type": "object", + "properties": { + "title": { + "description": "The title of the quick pick item.", + "type": "string" + }, + "command": { + "description": "The command to be executed when the quick pick is selected.", + "type": "string" + }, + "arguments": { + "description": "The arguments to be passed to the command.", + "type": "array" + } + } + } } } } diff --git a/scripts/index.mjs b/scripts/index.mjs new file mode 100644 index 000000000..ceb5f9c86 --- /dev/null +++ b/scripts/index.mjs @@ -0,0 +1,143 @@ +#!/usr/bin/env node + +import { cleanJre, downloadJre } from './jre.mjs'; +import { downloadLombok } from './lombok.mjs'; +import { downloadServer, buildServer, buildOrDownload, devServer, watchServer } from './server.mjs'; +import { generateStandardTestFolder, generateLightweightTestFolder, cleanTestFolder } from './test.mjs'; +import { preparePreRelease } from './release.mjs'; +import { repoCheck, repoFix } from './repo.mjs'; +import { pathToFileURL } from 'url'; + +async function main() { + const command = process.argv[2]; + const args = process.argv.slice(3); + + switch (command) { + // JRE commands + case 'clean-jre': + await cleanJre(); + break; + case 'download-jre': + const targetIndex = args.indexOf('--target'); + const versionIndex = args.indexOf('--javaVersion'); + const targetPlatform = targetIndex !== -1 ? args[targetIndex + 1] : undefined; + const javaVersion = versionIndex !== -1 ? args[versionIndex + 1] : undefined; + await downloadJre(targetPlatform, javaVersion); + break; + + // Lombok commands + case 'download-lombok': + await downloadLombok(); + break; + + // Server commands + case 'download-server': + await downloadServer(); + break; + case 'build-server': + try { + await buildServer(); + } catch (error) { + console.error('Build failed:', error.message); + process.exit(1); + } + break; + case 'build-or-download': + await buildOrDownload(); + break; + case 'dev-server': + await devServer(); + break; + case 'watch-server': + try { + await watchServer(); + } catch (error) { + console.error('Error:', error.message); + process.exit(1); + } + break; + + // Test commands + case 'generate-standard-test-folder': + await generateStandardTestFolder(); + break; + case 'generate-lightweight-test-folder': + await generateLightweightTestFolder(); + break; + case 'clean-test-folder': + await cleanTestFolder(); + break; + + // Release commands + case 'prepare-pre-release': + await preparePreRelease(); + break; + + // Repository commands + case 'repo-check': + await repoCheck(); + break; + case 'repo-fix': + await repoFix(); + break; + + default: + console.log(` +Usage: node scripts/index.js [options] + +Commands: + JRE Management: + clean-jre Clean JRE directory + download-jre [--target ] [--javaVersion ] Download JRE + + Lombok Management: + download-lombok Download Lombok + + Server Management: + download-server Download JDT Language Server + build-server Build JDT Language Server + build-or-download Build or download JDT Language Server + dev-server Build development server + watch-server Watch server files for changes + + Test Environment: + generate-standard-test-folder Generate standard test folder + generate-lightweight-test-folder Generate lightweight test folder + clean-test-folder Clean test folder + + Release Management: + prepare-pre-release Prepare pre-release version + + Repository Management: + repo-check Check package-lock.json for internal registry references + repo-fix Fix package-lock.json registry references + +Examples: + node scripts/index.js download-jre --target darwin-x64 --javaVersion 21 + node scripts/index.js build-or-download + node scripts/index.js watch-server + `); + process.exit(1); + } +} + +if (import.meta.url === pathToFileURL(process.argv[1]).toString()) { + main().catch(console.error); +} + +export { + cleanJre, + downloadJre, + downloadLombok, + downloadServer, + buildServer, + buildOrDownload, + devServer, + watchServer, + generateStandardTestFolder, + generateLightweightTestFolder, + cleanTestFolder, + preparePreRelease, + repoCheck, + repoFix +}; diff --git a/scripts/jre.mjs b/scripts/jre.mjs new file mode 100644 index 000000000..f66f8062f --- /dev/null +++ b/scripts/jre.mjs @@ -0,0 +1,126 @@ +#!/usr/bin/env node + +import fs from 'fs-extra'; +import path from 'path'; +import https from 'https'; +import { downloadFile, getScriptDir, extractTarGz, handleError, setupMainExecution } from './utils.mjs'; + +const dirname = getScriptDir(); + +const LATEST_JRE = 21; + +const platformMapping = { + "linux-arm64": "linux-aarch64", + "linux-x64": "linux-x86_64", + "darwin-arm64": "macosx-aarch64", + "darwin-x64": "macosx-x86_64", + "win32-x64": "win32-x86_64", + "win32-arm64": "win32-aarch64" +}; + + +async function downloadManifest(manifestUrl) { + return new Promise((resolve, reject) => { + https.get(manifestUrl, (response) => { + if (response.statusCode >= 400) { + reject(new Error(`${response.statusCode} returned from ${manifestUrl}`)); + return; + } + let body = ''; + response.on('data', (chunk) => body += chunk); + response.on('end', () => resolve(body)); + }).on('error', reject); + }); +} + + +async function cleanJre() { + if (fs.existsSync('./jre')) { + fs.removeSync('./jre'); + console.log('Cleaned JRE directory'); + } +} + +async function downloadJre(targetPlatform, javaVersion) { + if (fs.existsSync('./jre')) { + fs.removeSync('./jre'); + } + + if (!targetPlatform || !Object.keys(platformMapping).includes(targetPlatform)) { + console.log("[Error] download_jre failed, please specify a valid target platform via --target argument. Here are the supported platform list:"); + for (const platform of Object.keys(platformMapping)) { + console.log(platform); + } + return; + } + + const version = (!javaVersion || javaVersion === "latest") ? LATEST_JRE : javaVersion; + console.log(`Downloading justj JRE ${version} for the platform ${targetPlatform}...`); + + const manifestUrl = `https://download.eclipse.org/justj/jres/${version}/downloads/latest/justj.manifest`; + + try { + const manifest = await downloadManifest(manifestUrl); + + if (!manifest) { + throw new Error(`Failed to download justj.manifest, please check if the link ${manifestUrl} is valid.`); + } + + const javaPlatform = platformMapping[targetPlatform]; + const list = manifest.split(/\r?\n/); + const jreIdentifier = list.find((value) => { + return value.indexOf("org.eclipse.justj.openjdk.hotspot.jre.full.stripped") >= 0 && value.indexOf(javaPlatform) >= 0; + }); + + if (!jreIdentifier) { + throw new Error(`justj doesn't support the jre ${version} for the platform ${javaPlatform} (${targetPlatform}), please refer to the link ${manifestUrl} for the supported platforms.`); + } + + const jreDownloadUrl = `https://download.eclipse.org/justj/jres/${version}/downloads/latest/${jreIdentifier}`; + const parsedDownloadUrl = new URL(jreDownloadUrl); + const jreFileName = path.basename(parsedDownloadUrl.pathname) + .replace(/[\.7z|\.bz2|\.gz|\.rar|\.tar|\.zip|\.xz]*$/, ""); + const idx = jreFileName.indexOf('-'); + const jreVersionLabel = idx >= 0 ? jreFileName.substring(idx + 1) : jreFileName; + + const tempFile = path.join(dirname, 'temp-jre.tar.gz'); + const destDir = path.join('./jre', jreVersionLabel); + + // Ensure the jre directory exists + fs.ensureDirSync('./jre'); + fs.ensureDirSync(destDir); + + console.log(`Downloading JRE from ${jreDownloadUrl}...`); + await downloadFile(jreDownloadUrl, tempFile); + + console.log(`Extracting JRE to ${destDir}...`); + await extractTarGz(tempFile, destDir); + + // Clean up temp file + fs.removeSync(tempFile); + + console.log(`Successfully downloaded and extracted JRE ${jreVersionLabel}`); + } catch (error) { + handleError(error, 'downloading JRE'); + } +} + +// Main execution +async function main() { + const args = process.argv.slice(2); + const targetIndex = args.indexOf('--target'); + const versionIndex = args.indexOf('--javaVersion'); + + const targetPlatform = targetIndex !== -1 ? args[targetIndex + 1] : `${process.platform}-${process.arch}`; + const javaVersion = versionIndex !== -1 ? args[versionIndex + 1] : LATEST_JRE; + + if (args.includes('clean')) { + await cleanJre(); + } else { + await downloadJre(targetPlatform, javaVersion); + } +} + +setupMainExecution(main); + +export { cleanJre, downloadJre }; diff --git a/scripts/lombok.mjs b/scripts/lombok.mjs new file mode 100644 index 000000000..fe372e2b2 --- /dev/null +++ b/scripts/lombok.mjs @@ -0,0 +1,36 @@ +#!/usr/bin/env node + +import fs from 'fs-extra'; +import path from 'path'; +import { downloadFile, handleError, setupMainExecution } from './utils.mjs'; + +async function downloadLombok() { + if (fs.existsSync('./lombok')) { + fs.removeSync('./lombok'); + } + + try { + const lombokVersion = '1.18.38'; + // The latest lombok version can be found on the website https://projectlombok.org/downloads + const lombokUrl = `https://projectlombok.org/downloads/lombok-${lombokVersion}.jar`; + + // Ensure the lombok directory exists + fs.ensureDirSync('./lombok'); + + console.log(`Downloading Lombok ${lombokVersion}...`); + await downloadFile(lombokUrl, path.join('./lombok', `lombok-${lombokVersion}.jar`)); + + console.log(`Successfully downloaded Lombok ${lombokVersion}`); + } catch (error) { + handleError(error, 'downloading Lombok'); + } +} + +// Main execution +async function main() { + await downloadLombok(); +} + +setupMainExecution(main); + +export { downloadLombok }; diff --git a/scripts/prepublish.mjs b/scripts/prepublish.mjs new file mode 100644 index 000000000..4159eef9f --- /dev/null +++ b/scripts/prepublish.mjs @@ -0,0 +1,35 @@ +#!/usr/bin/env node + +// Skip webpack if SKIP_WEBPACK environment variable is set to 'true' +if (process.env.SKIP_WEBPACK === 'true') { + console.log('Skipping webpack compilation (SKIP_WEBPACK=true)'); + process.exit(0); +} + +// Otherwise, run webpack using the local webpack-cli installation +const { spawn } = await import('child_process'); +const { fileURLToPath } = await import('url'); +const { dirname, resolve, join } = await import('path'); + +const scriptFilename = fileURLToPath(import.meta.url); +const scriptDirname = dirname(scriptFilename); +const projectRoot = resolve(scriptDirname, '..'); + +// Use webpack-cli from local node_modules (cross-platform) +const webpackCliPath = join(projectRoot, 'node_modules', '.bin', 'webpack'); +const isWindows = process.platform === 'win32'; +const webpackCommand = isWindows ? `${webpackCliPath}.cmd` : webpackCliPath; + +const webpack = spawn(webpackCommand, ['--mode', 'production'], { + stdio: 'inherit', + cwd: projectRoot +}); + +webpack.on('close', (code) => { + process.exit(code || 0); +}); + +webpack.on('error', (error) => { + console.error('Error running webpack:', error); + process.exit(1); +}); diff --git a/scripts/release.mjs b/scripts/release.mjs new file mode 100644 index 000000000..d9433b8ea --- /dev/null +++ b/scripts/release.mjs @@ -0,0 +1,60 @@ +#!/usr/bin/env node + +import fs from 'fs-extra'; +import { getProjectPath, handleError, setupMainExecution } from './utils.mjs'; + +function prependZero(num) { + if (num > 99) { + throw "Unexpected value to prepend with zero"; + } + return `${num < 10 ? "0" : ""}${num}`; +} + +async function preparePreRelease() { + console.log('Preparing pre-release version...'); + + try { + const packageJsonPath = getProjectPath('package.json'); + const json = JSON.parse(fs.readFileSync(packageJsonPath).toString()); + const stableVersion = json.version.match(/(\d+)\.(\d+)\.(\d+)/); + + if (!stableVersion) { + throw new Error('Invalid version format in package.json'); + } + + const major = stableVersion[1]; + const minor = stableVersion[2]; + const date = new Date(); + const month = date.getMonth() + 1; + const day = date.getDate(); + const hours = date.getHours(); + const patch = `${date.getFullYear()}${prependZero(month)}${prependZero(day)}${prependZero(hours)}`; + + const insiderPackageJson = Object.assign(json, { + version: `${major}.${minor}.${patch}`, + }); + + fs.writeFileSync(packageJsonPath, JSON.stringify(insiderPackageJson, null, 2)); + console.log(`Successfully updated version to ${insiderPackageJson.version}`); + } catch (error) { + handleError(error, 'preparing pre-release'); + } +} + +// Main execution +async function main() { + const command = process.argv[2]; + + switch (command) { + case 'prepare': + await preparePreRelease(); + break; + default: + console.log('Usage: node release.js [prepare]'); + process.exit(1); + } +} + +setupMainExecution(main); + +export { preparePreRelease }; diff --git a/scripts/repo.mjs b/scripts/repo.mjs new file mode 100644 index 000000000..1f51e2452 --- /dev/null +++ b/scripts/repo.mjs @@ -0,0 +1,69 @@ +#!/usr/bin/env node + +import fs from 'fs-extra'; +import { getProjectPath, handleError, setupMainExecution } from './utils.mjs'; + +const NON_NPM_REPOSITORY_RE = new RegExp( + String.raw`"resolved":\s*"https://.+/registry.npmjs.org/`, + "g" +); + +async function repoCheck() { + console.log('Checking package-lock.json for internal registry references...'); + + try { + const packageLockPath = getProjectPath('package-lock.json'); + const data = fs.readFileSync(packageLockPath, { encoding: "utf-8" }); + + if (NON_NPM_REPOSITORY_RE.test(data)) { + console.error("Found references to the internal registry in the file package-lock.json. Please fix it with 'npm run repo:fix'"); + process.exit(1); + } else { + console.log('No internal registry references found'); + } + } catch (error) { + handleError(error, 'checking repository'); + } +} + +async function repoFix() { + console.log('Fixing package-lock.json registry references...'); + + try { + const packageLockPath = getProjectPath('package-lock.json'); + const data = fs.readFileSync(packageLockPath, { encoding: "utf-8" }); + const newData = data.replace(NON_NPM_REPOSITORY_RE, `"resolved": "https://registry.npmjs.org/`); + + if (data !== newData) { + fs.writeFileSync(packageLockPath, newData, { + encoding: "utf-8", + }); + console.log('Successfully fixed package-lock.json'); + } else { + console.log('Nothing to fix'); + } + } catch (error) { + handleError(error, 'fixing repository'); + } +} + +// Main execution +async function main() { + const command = process.argv[2]; + + switch (command) { + case 'check': + await repoCheck(); + break; + case 'fix': + await repoFix(); + break; + default: + console.log('Usage: node repo.js [check|fix]'); + process.exit(1); + } +} + +setupMainExecution(main); + +export { repoCheck, repoFix }; diff --git a/scripts/server.mjs b/scripts/server.mjs new file mode 100644 index 000000000..b2592250f --- /dev/null +++ b/scripts/server.mjs @@ -0,0 +1,165 @@ +#!/usr/bin/env node + +import fs from 'fs-extra'; +import path from 'path'; +import { execSync } from 'child_process'; +import chokidar from 'chokidar'; +import { glob } from 'glob'; +import { downloadFile, getScriptDir, extractTarGz, handleError, setupMainExecution } from './utils.mjs'; + +const dirname = getScriptDir(); + +const serverDir = path.join(dirname, '..', '..', 'eclipse.jdt.ls'); +const JDT_LS_SNAPSHOT_URL = "https://download.eclipse.org/jdtls/snapshots/jdt-language-server-latest.tar.gz"; + +function isWin() { + return /^win/.test(process.platform); +} + +function mvnw() { + return isWin() ? "mvnw.cmd" : "./mvnw"; +} + + +async function downloadServer() { + console.log('Downloading Eclipse JDT Language Server snapshot...'); + + fs.removeSync('./server'); + fs.ensureDirSync('./server'); + + const tempFile = path.join(dirname, 'temp-server.tar.gz'); + + try { + await downloadFile(JDT_LS_SNAPSHOT_URL, tempFile); + await extractTarGz(tempFile, './server'); + fs.removeSync(tempFile); + + console.log('Successfully downloaded and extracted JDT Language Server'); + } catch (error) { + handleError(error, 'downloading server'); + } +} + +async function buildServer() { + console.log('Building Eclipse JDT Language Server...'); + + fs.removeSync('./server'); + fs.ensureDirSync('./server'); + + try { + const command = `${mvnw() } -Pserver-distro clean package -U -Declipse.jdt.ls.skipGradleChecksums`; + console.log(`Executing: ${command}`); + execSync(command, { cwd: serverDir, stdio: [0, 1, 2] }); + + const sources = await glob(`${serverDir }/org.eclipse.jdt.ls.product/distro/*.tar.gz`); + + if (sources.length > 0) { + await extractTarGz(sources[0], './server'); + console.log('Successfully built and extracted JDT Language Server'); + } else { + throw new Error('No server distribution found after build'); + } + } catch (error) { + handleError(error, 'building server', false); + throw error; + } +} + +async function buildOrDownload() { + if (!fs.existsSync(serverDir)) { + console.log('NOTE: eclipse.jdt.ls is not found as a sibling directory, downloading the latest snapshot of the Eclipse JDT Language Server...'); + await downloadServer(); + } else { + await buildServer(); + } +} + +async function devServer() { + console.log('Building development server...'); + + try { + const command = `${mvnw() } -o -pl org.eclipse.jdt.ls.core,org.eclipse.jdt.ls.target clean package -Declipse.jdt.ls.skipGradleChecksums`; + console.log(`Executing: ${command}`); + execSync(command, { cwd: serverDir, stdio: [0, 1, 2] }); + + const sources = await glob(`${serverDir }/org.eclipse.jdt.ls.core/target/org.eclipse.jdt.ls.core-*-SNAPSHOT.jar`); + const targets = await glob('./server/plugins/org.eclipse.jdt.ls.core_*.jar'); + + if (sources.length > 0 && targets.length > 0) { + console.log(`Copying ${sources[0]} to ${targets[0]}`); + fs.copySync(sources[0], targets[0]); + console.log('Successfully built development server'); + } else { + throw new Error('Source or target JAR files not found'); + } + } catch (error) { + handleError(error, 'building development server'); + } +} + +async function watchServer() { + console.log('Watching server files for changes...'); + // if server_dir is not a directory, throw an error + if (!fs.existsSync(serverDir)) { + throw new Error(`Server directory '${serverDir}' does not exist. This command is for JDT Language Server development. You need to have the eclipse.jdt.ls repository as a sibling directory to use this feature.`); + } + const watcher = chokidar.watch(`${serverDir }/org.eclipse.jdt.ls.core/**/*.java`, { + ignored: /(^|[\/\\])\../, // ignore dotfiles + persistent: true + }); + + watcher.on('change', async (path) => { + console.log(`File ${path} has been changed, rebuilding...`); + try { + await devServer(); + } catch (error) { + handleError(error, 'rebuilding server', false); + } + }); + + console.log('Watching for changes. Press Ctrl+C to stop.'); + + // Handle graceful shutdown + process.on('SIGINT', () => { + console.log('\nStopping watcher...'); + watcher.close(); + process.exit(0); + }); + + // Keep the process alive by waiting indefinitely + return new Promise((resolve, reject) => { + console.log('Watcher is now active and waiting for file changes...'); + // This promise never resolves, keeping the process alive + // The process will only exit when SIGINT is received + }); +} + +// Main execution +async function main() { + const command = process.argv[2]; + + switch (command) { + case 'download': + await downloadServer(); + break; + case 'build': + await buildServer(); + break; + case 'build-or-download': + await buildOrDownload(); + break; + case 'dev': + await devServer(); + break; + case 'watch': + await watchServer(); + break; + default: + console.log('Usage: node server.js [download|build|build-or-download|dev|watch]'); + process.exit(1); + } +} + +setupMainExecution(main); + +export { downloadServer, buildServer, buildOrDownload, devServer, watchServer }; diff --git a/scripts/test.mjs b/scripts/test.mjs new file mode 100644 index 000000000..b3c6489ff --- /dev/null +++ b/scripts/test.mjs @@ -0,0 +1,81 @@ +#!/usr/bin/env node + +import fs from 'fs-extra'; +import path from 'path'; +import { getProjectPath, handleError, setupMainExecution } from './utils.mjs'; + +const originalTestFolder = getProjectPath('test', 'resources', 'projects', 'maven', 'salut'); +const tempTestFolder = getProjectPath('test-temp'); +const testSettings = path.join(tempTestFolder, '.vscode', 'settings.json'); + +async function generateStandardTestFolder() { + console.log('Generating standard test folder...'); + + try { + fs.copySync(originalTestFolder, tempTestFolder); + fs.ensureDirSync(path.join(tempTestFolder, '.vscode')); + fs.writeJSONSync(testSettings, { + "java.server.launchMode": "Standard", + "java.configuration.updateBuildConfiguration": "automatic" + }); + + console.log('Successfully generated standard test folder'); + } catch (error) { + handleError(error, 'generating standard test folder'); + } +} + +async function generateLightweightTestFolder() { + console.log('Generating lightweight test folder...'); + + try { + fs.copySync(originalTestFolder, tempTestFolder); + fs.ensureDirSync(path.join(tempTestFolder, '.vscode')); + fs.writeJSONSync(testSettings, { + "java.server.launchMode": "LightWeight", + }); + + console.log('Successfully generated lightweight test folder'); + } catch (error) { + handleError(error, 'generating lightweight test folder'); + } +} + +async function cleanTestFolder() { + console.log('Cleaning test folder...'); + + try { + if (fs.existsSync(tempTestFolder)) { + fs.removeSync(tempTestFolder); + console.log('Successfully cleaned test folder'); + } else { + console.log('Test folder does not exist'); + } + } catch (error) { + handleError(error, 'cleaning test folder'); + } +} + +// Main execution +async function main() { + const command = process.argv[2]; + + switch (command) { + case 'standard': + await generateStandardTestFolder(); + break; + case 'lightweight': + await generateLightweightTestFolder(); + break; + case 'clean': + await cleanTestFolder(); + break; + default: + console.log('Usage: node test.js [standard|lightweight|clean]'); + process.exit(1); + } +} + +setupMainExecution(main); + +export { generateStandardTestFolder, generateLightweightTestFolder, cleanTestFolder }; diff --git a/scripts/utils.mjs b/scripts/utils.mjs new file mode 100644 index 000000000..49a2d1ad7 --- /dev/null +++ b/scripts/utils.mjs @@ -0,0 +1,102 @@ +#!/usr/bin/env node + +import https from 'https'; +import { createWriteStream } from 'fs'; +import { pipeline } from 'stream'; +import { promisify } from 'util'; +import { fileURLToPath } from 'url'; +import path from 'path'; +import fs from 'fs-extra'; +import * as tar from 'tar'; +import zlib from 'zlib'; + +const pipelineAsync = promisify(pipeline); + +/** + * Downloads a file from a URL to a destination path + * @param {string} url - The URL to download from + * @param {string} destPath - The destination path to save the file + * @returns {Promise} A promise that resolves when the download is complete + */ +async function downloadFile(url, destPath) { + return new Promise((resolve, reject) => { + const file = createWriteStream(destPath); + https.get(url, (response) => { + if (response.statusCode >= 400) { + reject(new Error(`${response.statusCode} returned from ${url}`)); + return; + } + pipelineAsync(response, file) + .then(() => resolve()) + .catch(reject); + }).on('error', reject); + }); +} + +/** + * Gets the directory name of the current script (ESM equivalent of __dirname) + * @returns {string} The directory path of the current script + */ +function getScriptDir() { + const filename = fileURLToPath(import.meta.url); + return path.dirname(filename); +} + +/** + * Extracts a tar.gz file to a destination directory + * @param {string} tarGzPath - Path to the tar.gz file + * @param {string} destDir - Destination directory for extraction + * @returns {Promise} A promise that resolves when extraction is complete + */ +async function extractTarGz(tarGzPath, destDir) { + return new Promise((resolve, reject) => { + fs.createReadStream(tarGzPath) + .pipe(zlib.createGunzip()) + .pipe(tar.extract({ cwd: destDir, strip: 0 })) + .on('end', resolve) + .on('error', reject); + }); +} + +/** + * Creates a path relative to the project root (parent of scripts directory) + * @param {...string} pathSegments - Path segments to join + * @returns {string} The constructed path + */ +function getProjectPath(...pathSegments) { + const scriptDir = getScriptDir(); + const projectRoot = path.join(scriptDir, '..'); + return path.join(projectRoot, ...pathSegments); +} + +/** + * Handles errors with consistent logging and exit behavior + * @param {Error} error - The error to handle + * @param {string} context - Context description for the error + * @param {boolean} shouldExit - Whether to exit the process (default: true) + */ +function handleError(error, context, shouldExit = true) { + console.error(`Error ${context}:`, error.message); + if (shouldExit) { + process.exit(1); + } +} + +/** + * Sets up the main execution pattern for scripts + * @param {Function} mainFunction - The main function to execute + */ +function setupMainExecution(mainFunction) { + if (import.meta.url === `file://${process.argv[1]}`) { + mainFunction().catch(console.error); + } +} + +export { + downloadFile, + getScriptDir, + extractTarGz, + getProjectPath, + handleError, + setupMainExecution +}; diff --git a/snippets/java.json b/snippets/java.json deleted file mode 100644 index cac5a264c..000000000 --- a/snippets/java.json +++ /dev/null @@ -1,115 +0,0 @@ -{ - "main": { - "prefix": ["main", "psvm"], - "body": [ - "public static void main(String[] args) {", - "\t$0", - "}" - ], - "description": "Public static main method" - }, - "Public constructor": { - "prefix": "ctor", - "body": [ - "public ${1:${TM_FILENAME_BASE}}($2) {", - "\t${3:super();}$0", - "}" - ], - "description": "Public constructor" - }, - "trycatch": { - "prefix": "try_catch", - "body": [ - "try {", - "\t$1", - "} catch (${2:Exception} ${3:e}) {", - "\t$0// TODO: handle exception", - "}" - ], - "description": "try/catch block" - }, - "tryresources": { - "prefix": "try_resources", - "body": [ - "try ($1) {", - "\t$2", - "} catch (${3:Exception} ${4:e}) {", - "\t$0// TODO: handle exception", - "}" - ] - }, - "private_method": { - "prefix": "private_method", - "body": [ - "private ${1:void} ${2:name}($3) {", - "\t$0", - "}" - ], - "description": "private method" - }, - "Public method": { - "prefix": "public_method", - "body": [ - "public ${1:void} ${2:name}(${3}) {", - "\t$0", - "}" - ], - "description": "public method" - }, - "Private static method": { - "prefix": "private_static_method", - "body": [ - "private static ${1:Type} ${2:name}(${3}) {", - "\t$0", - "}" - ], - "description": "private static method" - }, - "Public static method": { - "prefix": "public_static_method", - "body": [ - "public static ${1:void} ${2:name}(${3}) {", - "\t$0", - "}" - ], - "description": "public static method" - }, - "Protected Method": { - "prefix": "protected_method", - "body": [ - "protected ${1:void} ${2:name}(${3}) {", - "\t$0", - "}" - ], - "description": "Protected method" - }, - "Switch Statement": { - "prefix": "switch", - "body": [ - "switch (${1:key}) {", - "\tcase ${2:value}:", - "\t\t$0", - "\t\tbreak;", - "", - "\tdefault:", - "\t\tbreak;", - "}" - ], - "description": "Switch Statement" - }, - "newObject": { - "prefix": "new", - "body": [ - "${1:Object} ${2:foo} = new ${1}($3);", - "$0" - ], - "description": "Create new Object" - }, - "Private field": { - "prefix": "prf", - "body": [ - "private ${1:String} ${2:name};" - ], - "description": "Private field" - } -} \ No newline at end of file diff --git a/snippets/server.json b/snippets/server.json index c7d5493ec..57e7c4f68 100644 --- a/snippets/server.json +++ b/snippets/server.json @@ -1,13 +1,13 @@ { "sysout": { - "prefix": ["sysout", "sout"], + "prefix": ["sysout", "sout", "System.out.println()"], "body": [ "System.out.println($0);" ], "description": "Print to standard out" }, "syserr": { - "prefix": ["syserr", "serr"], + "prefix": ["syserr", "serr", "System.err.println()"], "body": [ "System.err.println($0);" ], @@ -86,5 +86,82 @@ "} while (${1:condition});" ], "description": "Do-While Statement" + }, + "Switch Statement": { + "prefix": "switch", + "body": [ + "switch (${1:key}) {", + "\tcase ${2:value}:", + "\t\t$0", + "\t\tbreak;", + "", + "\tdefault:", + "\t\tbreak;", + "}" + ], + "description": "Switch Statement" + }, + "trycatch": { + "prefix": "try_catch", + "body": [ + "try {", + "\t${TM_SELECTED_TEXT:$1}", + "} catch (${2:Exception} ${3:e}) {", + "\t$0// TODO: handle exception", + "}" + ], + "description": "try/catch block" + }, + "tryresources": { + "prefix": "try_resources", + "body": [ + "try ($1) {", + "\t$2", + "} catch (${3:Exception} ${4:e}) {", + "\t$0// TODO: handle exception", + "}" + ] + }, + "main": { + "prefix": ["main", "psvm", "public static void main(String[] args)"], + "body": [ + "public static void main(String[] args) {", + "\t$0", + "}" + ], + "description": "Public static main method" + }, + "Constructor": { + "prefix": "ctor", + "body": [ + "${1|public,protected,private|} ${2:${TM_FILENAME_BASE}}($3) {", + "\t${4:super();}$0", + "}" + ], + "description": "Constructor" + }, + "method": { + "prefix": "method", + "body": [ + "${1|public,protected,private|}${2| , static |}${3:void} ${4:name}($5) {", + "\t$0", + "}" + ], + "description": "Method" + }, + "newObject": { + "prefix": "new", + "body": [ + "${1:Object} ${2:foo} = new ${1}($3);", + "$0" + ], + "description": "Create new Object" + }, + "Field": { + "prefix": "field", + "body": [ + "${1|public,protected,private|} ${2:String} ${3:name};" + ], + "description": "Field" } } \ No newline at end of file diff --git a/src/TracingLanguageClient.ts b/src/TracingLanguageClient.ts new file mode 100644 index 000000000..667b52977 --- /dev/null +++ b/src/TracingLanguageClient.ts @@ -0,0 +1,146 @@ +import { performance } from "perf_hooks"; +import { Event, EventEmitter } from "vscode"; +import { CancellationToken, LanguageClient, LanguageClientOptions, ProtocolRequestType, ProtocolRequestType0, RequestType, RequestType0, ServerOptions } from "vscode-languageclient/node"; +import { TraceEvent } from "./extension.api"; + +const requestStartEventEmitter = new EventEmitter(); +const requestEndEventEmitter = new EventEmitter(); +export const onWillRequestStart: Event = requestStartEventEmitter.event; +export const onDidRequestEnd: Event = requestEndEventEmitter.event; + +export class TracingLanguageClient extends LanguageClient { + private isStarted: boolean = false; + private isSyntaxServer: boolean = false; + + constructor(id: string, name: string, serverOptions: ServerOptions, clientOptions: LanguageClientOptions, forceDebug?: boolean) { + super(id, name, serverOptions, clientOptions, forceDebug); + this.isSyntaxServer = name?.includes("Syntax Server"); + } + + start(): Promise { + const isFirstTimeStart: boolean = !this.isStarted; + this.isStarted = true; + const startAt: number = performance.now(); + if (isFirstTimeStart) { + this.fireRequestStartTraceEvent("initialize"); + } + return super.start().then(value => { + if (isFirstTimeStart) { + this.fireSuccessTraceEvent("initialize", startAt, undefined); + } + return value; + }, reason => { + if (isFirstTimeStart) { + this.fireFailureTraceEvent("initialize", startAt, reason); + } + throw reason; + }); + } + + stop(timeout?: number): Promise { + this.isStarted = false; + return super.stop(timeout); + } + + sendRequest(type: ProtocolRequestType0, token?: CancellationToken): Promise; + sendRequest(type: ProtocolRequestType, params: P, token?: CancellationToken): Promise; + sendRequest(type: RequestType0, token?: CancellationToken): Promise; + sendRequest(type: RequestType, params: P, token?: CancellationToken): Promise; + sendRequest(method: string, token?: CancellationToken): Promise; + sendRequest(method: string, param: any, token?: CancellationToken): Promise; + sendRequest(method: any, ...args) { + const startAt: number = performance.now(); + const requestType: string = this.getRequestType(method, ...args); + let data: any = undefined; + if (args?.[0]?.context?.triggerKind !== undefined) { + data = { + triggerKind: args[0].context.triggerKind, + triggerCharacter: args[0].context.triggerCharacter, + }; + } + this.fireRequestStartTraceEvent(requestType); + return this.sendRequest0(method, ...args).then((value: any) => { + if (data && value?.itemDefaults?.data?.completionKinds) { + // Include the completionKinds from the completion response. + data.completionKinds = value.itemDefaults.data.completionKinds; + } + this.fireSuccessTraceEvent(requestType, startAt, this.getResultLength(value), data); + return value; + }, reason => { + this.fireFailureTraceEvent(requestType, startAt, reason, data); + throw reason; + }); + } + + private sendRequest0(method: any, ...args) { + if (!args || !args.length) { + return super.sendRequest(method); + } + + const first = args[0]; + const last = args[args.length - 1]; + if (CancellationToken.is(last)) { + if (first === last) { + return super.sendRequest(method, last); + } else { + return super.sendRequest(method, first, last); + } + } + + return super.sendRequest(method, first); + } + + private getRequestType(method: any, ...args): string { + let requestType: string; + if (typeof method === 'string' || method instanceof String) { + requestType = String(method); + } else { + requestType = method?.method; + } + + if (requestType === "workspace/executeCommand") { + if (args?.[0]?.command) { + requestType = `workspace/executeCommand/${args[0].command}`; + } + } + + return requestType; + } + + private fireRequestStartTraceEvent(type: string): void { + requestStartEventEmitter.fire({ + type, + fromSyntaxServer: !!this.isSyntaxServer, + }); + } + + private fireSuccessTraceEvent(type: string, startAt: number, resultLength: number | undefined, data?: any): void { + const duration: number = performance.now() - startAt; + requestEndEventEmitter.fire({ + type, + duration, + resultLength, + data, + fromSyntaxServer: !!this.isSyntaxServer, + }); + } + + private fireFailureTraceEvent(type: string, startAt: number, error: any, data?: any): void { + const duration: number = performance.now() - startAt; + requestEndEventEmitter.fire({ + type, + duration, + error, + data, + fromSyntaxServer: !!this.isSyntaxServer, + }); + } + + private getResultLength(value: any): number | undefined { + if (!value) { + return 0; + } + + return value?.length ?? value?.items?.length; + } +} diff --git a/src/apiManager.ts b/src/apiManager.ts index b7daf493c..7f3879188 100644 --- a/src/apiManager.ts +++ b/src/apiManager.ts @@ -1,6 +1,6 @@ 'use strict'; -import { ExtensionAPI, ClasspathQueryOptions, ClasspathResult, extensionApiVersion, ClientStatus } from "./extension.api"; +import { ExtensionAPI, ClasspathQueryOptions, ClasspathResult, extensionApiVersion, ClientStatus, SourceInvalidatedEvent } from "./extension.api"; import { RequirementsData } from "./requirements"; import { GetDocumentSymbolsCommand, getDocumentSymbolsProvider } from "./documentSymbols"; import { GoToDefinitionCommand, goToDefinitionProvider } from "./goToDefinition"; @@ -9,6 +9,8 @@ import { Commands } from "./commands"; import { Emitter } from "vscode-languageclient"; import { ServerMode } from "./settings"; import { registerHoverCommand } from "./hoverAction"; +import { onDidRequestEnd, onWillRequestStart } from "./TracingLanguageClient"; +import { getJavaConfiguration } from "./utils"; class ApiManager { @@ -16,9 +18,18 @@ class ApiManager { private onDidClasspathUpdateEmitter: Emitter = new Emitter(); private onDidServerModeChangeEmitter: Emitter = new Emitter(); private onDidProjectsImportEmitter: Emitter = new Emitter(); + private onDidProjectsDeleteEmitter: Emitter = new Emitter(); + private traceEventEmitter: Emitter = new Emitter(); + private sourceInvalidatedEventEmitter: Emitter = new Emitter(); private serverReadyPromiseResolve: (result: boolean) => void; + private serverRunningPromiseResolve: (result: boolean) => void; public initialize(requirements: RequirementsData, serverMode: ServerMode): void { + // if it's manual import mode, set the server mode to lightweight, so that the + // project explorer won't spinning until import project is triggered. + if (getJavaConfiguration().get("import.projectSelection") === "manual") { + serverMode = ServerMode.lightWeight; + } const getDocumentSymbols: GetDocumentSymbolsCommand = getDocumentSymbolsProvider(); const goToDefinition: GoToDefinitionCommand = goToDefinitionProvider(); @@ -37,6 +48,8 @@ class ApiManager { const onDidClasspathUpdate = this.onDidClasspathUpdateEmitter.event; const onDidServerModeChange = this.onDidServerModeChangeEmitter.event; const onDidProjectsImport = this.onDidProjectsImportEmitter.event; + const onDidProjectsDelete = this.onDidProjectsDeleteEmitter.event; + const traceEvent = this.traceEventEmitter.event; const serverReadyPromise: Promise = new Promise((resolve) => { this.serverReadyPromiseResolve = resolve; @@ -45,6 +58,13 @@ class ApiManager { return serverReadyPromise; }; + const serverRunningPromise: Promise = new Promise((resolve) => { + this.serverRunningPromiseResolve = resolve; + }); + const serverRunning = async () => { + return serverRunningPromise; + }; + this.api = { apiVersion: extensionApiVersion, javaRequirement: requirements, @@ -59,7 +79,13 @@ class ApiManager { serverMode, onDidServerModeChange, onDidProjectsImport, + onDidProjectsDelete, serverReady, + serverRunning, + onWillRequestStart, + onDidRequestEnd, + trackEvent: traceEvent, + onDidSourceInvalidate: this.sourceInvalidatedEventEmitter.event, }; } @@ -83,6 +109,18 @@ class ApiManager { this.onDidProjectsImportEmitter.fire(event); } + public fireDidProjectsDelete(event: Uri[]): void { + this.onDidProjectsDeleteEmitter.fire(event); + } + + public fireTraceEvent(event: any): void { + this.traceEventEmitter.fire(event); + } + + public fireSourceInvalidatedEvent(event: SourceInvalidatedEvent): void { + this.sourceInvalidatedEventEmitter.fire(event); + } + public updateServerMode(mode: ServerMode): void { this.api.serverMode = mode; } @@ -94,6 +132,10 @@ class ApiManager { public resolveServerReadyPromise(): void { this.serverReadyPromiseResolve(true); } + + public resolveServerRunningPromise(): void { + this.serverRunningPromiseResolve?.(true); + } } export const apiManager: ApiManager = new ApiManager(); diff --git a/src/buildFilesSelector.ts b/src/buildFilesSelector.ts new file mode 100644 index 000000000..f595e02db --- /dev/null +++ b/src/buildFilesSelector.ts @@ -0,0 +1,302 @@ +import { ExtensionContext, MessageItem, QuickPickItem, QuickPickItemKind, Uri, WorkspaceFolder, window, workspace } from "vscode"; +import { convertToGlob, getExclusionGlob, getInclusionPatternsFromNegatedExclusion } from "./utils"; +import * as path from "path"; +import { IBuildTool, getContributedBuildTools } from "./plugin"; +import { ACTIVE_BUILD_TOOL_STATE } from "./settings"; + +export const PICKED_BUILD_FILES = "java.pickedBuildFiles"; +export const BUILD_TOOL_FOR_CONFLICTS = "java.buildToolForConflicts"; +export const IMPORT_METHOD = "java.importMethod"; +export class BuildFileSelector { + /** + * The build tools that are contributed/supported by extensions. + */ + private buildTools: IBuildTool[] = []; + /** + * The extension context. + */ + private context: ExtensionContext; + /** + * Glob pattern that needs to be excluded from the search. + */ + private exclusionGlobPattern: string; + /** + * Glob pattern to search build files. + */ + private searchPattern: string; + /** + * Glob pattern for build files that are explicitly + * included from the setting: "java.import.exclusions" (negated exclusion). + */ + private negatedExclusionSearchPattern: string | undefined; + + /** + * string array for the imported folder paths. + */ + private importedFolderPaths: string[]; + + /** + * Mark if the selector is used during initialization. + */ + private isInitialization: boolean; + + /** + * The build files that are found in the workspace. + */ + private foundBuildFiles: Uri[] = []; + + /** + * @param context The extension context. + * @param isInitialization Mark if the selector is used during initialization. + */ + constructor(context: ExtensionContext, importedFolderUris: string[], isInitialization: boolean = true) { + this.context = context; + this.importedFolderPaths = importedFolderUris.map(uri => Uri.parse(uri).fsPath); + this.isInitialization = isInitialization; + const buildTool = this.context.workspaceState.get(BUILD_TOOL_FOR_CONFLICTS); + if (!buildTool) { + this.buildTools = getContributedBuildTools(); + } else { + this.buildTools.push(buildTool); + } + // TODO: should we introduce the exclusion globs into the contribution point? + this.exclusionGlobPattern = getExclusionGlob(["**/target/**", "**/bin/**", "**/build/**"]); + this.searchPattern = `**/{${this.buildTools.map(buildTool => buildTool.buildFileNames.join(","))}}`; + const inclusionFolderPatterns: string[] = getInclusionPatternsFromNegatedExclusion(); + if (inclusionFolderPatterns.length > 0) { + const buildFileNames: string[] = []; + this.buildTools.forEach(buildTool => buildFileNames.push(...buildTool.buildFileNames)); + this.negatedExclusionSearchPattern = convertToGlob(buildFileNames, inclusionFolderPatterns); + } + } + + /** + * @returns `true` if there are build files in the workspace, `false` otherwise. + */ + public async hasBuildFiles(): Promise { + if (this.buildTools.length === 0) { + return false; + } + + let uris: Uri[]; + if (this.negatedExclusionSearchPattern) { + uris = await workspace.findFiles(this.negatedExclusionSearchPattern, null /* force not use default exclusion */, 1); + if (uris.length > 0) { + return true; + } + } + uris = await workspace.findFiles(this.searchPattern, this.exclusionGlobPattern, 1); + if (uris.length > 0) { + return true; + } + return false; + } + + /** + * Get the uri strings for the build files that the user selected. + * @returns An array of uri string for the build files that the user selected. + * An empty array means user canceled the selection. Or `undefined` on cancellation. + */ + public async selectBuildFiles(): Promise { + const choices = await this.chooseBuildFilePickers(); + if (choices === undefined) { + return undefined; + } + const pickedUris = await this.eliminateBuildToolConflict(choices); + this.context.workspaceState.update(PICKED_BUILD_FILES, pickedUris); + return pickedUris; + } + + private async chooseBuildFilePickers(): Promise { + return window.showQuickPick(this.getBuildFilePickers(), { + placeHolder: "Note: Currently only Maven projects can be partially imported.", + title: "Select build files to import", + ignoreFocusOut: true, + canPickMany: true, + matchOnDescription: true, + matchOnDetail: true, + }); + } + + /** + * Get pickers for all build files in the workspace. + */ + private async getBuildFilePickers(): Promise { + const addedFolders: Map = new Map(); + const uris: Uri[] = await workspace.findFiles(this.searchPattern, this.exclusionGlobPattern); + if (this.negatedExclusionSearchPattern) { + uris.push(...await workspace.findFiles(this.negatedExclusionSearchPattern, null /* force not use default exclusion */)); + } + this.foundBuildFiles.push(...uris); + + for (const uri of uris) { + const containingFolder = path.dirname(uri.fsPath); + const buildTool = this.buildTools.find(buildTool => buildTool.buildFileNames.includes(path.basename(uri.fsPath))); + if (!buildTool) { + continue; + } + if (addedFolders.has(containingFolder)) { + const picker = addedFolders.get(containingFolder); + if (!picker.buildToolAndUri.has(buildTool)) { + picker.buildToolAndUri.set(buildTool, uri); + } + } else { + addedFolders.set(containingFolder, { + label: path.basename(containingFolder), + detail: "", // update later + description: "", // update later + buildToolAndUri: new Map([[buildTool, uri]]), + }); + } + } + const pickers: IBuildFilePicker[] = Array.from(addedFolders.values()); + await this.setPickerUiComponents(pickers); + return this.addSeparator(pickers); + } + + private isImported(uri: Uri): boolean { + return this.importedFolderPaths.some(importedFolderPath => + path.relative(importedFolderPath, path.dirname(uri.fsPath)) === ""); + } + + /** + * Update the picker's UI components, including detail, description and picked flag. + */ + private async setPickerUiComponents(pickers: IBuildFilePicker[]) { + for (const picker of pickers) { + const buildTools = Array.from(picker.buildToolAndUri.keys()) + .sort((a, b) => a.displayName.localeCompare(b.displayName)); + + const details = buildTools.map(buildTool => workspace.asRelativePath(picker.buildToolAndUri.get(buildTool))); + const descriptions = buildTools.map(buildTool => buildTool.displayName); + + picker.detail = details.join(', '); + picker.description = descriptions.join(', '); + picker.picked = this.isInitialization || this.isImported(picker.buildToolAndUri.values().next().value); + } + } + + /** + * Add a separator pickers between pickers that belong to different workspace folders. + */ + private addSeparator(pickers: IBuildFilePicker[]): IBuildFilePicker[] { + // group pickers by their containing workspace folder + const workspaceFolders = new Map(); + for (const picker of pickers) { + const folder = workspace.getWorkspaceFolder(picker.buildToolAndUri.values().next().value); + if (folder) { + workspaceFolders.set(folder, [...(workspaceFolders.get(folder) || []), picker]); + } + } + + const newPickers: IBuildFilePicker[] = []; + const folderArray = Array.from(workspaceFolders.keys()); + folderArray.sort((a, b) => a.name.localeCompare(b.name)); + for (const folder of folderArray) { + const pickersInFolder = workspaceFolders.get(folder); + newPickers.push({ + label: folder.name, + kind: QuickPickItemKind.Separator, + buildToolAndUri: null + }); + newPickers.push(...this.sortPickers(pickersInFolder)); + } + return newPickers; + } + + private sortPickers(pickers: IBuildFilePicker[]): IBuildFilePicker[] { + return pickers.sort((a, b) => { + const pathA = path.dirname(a.buildToolAndUri.values().next().value.fsPath); + const pathB = path.dirname(b.buildToolAndUri.values().next().value.fsPath); + return pathA.localeCompare(pathB); + }); + } + + /** + * Ask user to choose a build tool when there are multiple build tools in the same folder. + */ + private async eliminateBuildToolConflict(choices?: IBuildFilePicker[]): Promise { + // group uris by build tool + const conflictBuildToolAndUris = new Map(); + const result: string[] = []; + for (const picker of choices) { + if (picker.buildToolAndUri.size > 1) { + picker.buildToolAndUri.forEach((uri, buildTool) => { + conflictBuildToolAndUris.set(buildTool, [...(conflictBuildToolAndUris.get(buildTool) || []), uri]); + }); + } else { + result.push(picker.buildToolAndUri.values().next().value.toString()); + } + } + + if (conflictBuildToolAndUris.size > 0) { + const buildTool = this.context.workspaceState.get(BUILD_TOOL_FOR_CONFLICTS); + if (buildTool) { + result.push(...this.filterByCachedBuildTool(conflictBuildToolAndUris, buildTool)); + } else { + result.push(...await this.askToResolveConflicts(conflictBuildToolAndUris)); + } + } + return result; + } + + private filterByCachedBuildTool(conflictBuildToolAndUris: Map, buildTool: IBuildTool): string[] { + const result: string[] = []; + if (conflictBuildToolAndUris.has(buildTool)) { + result.push(...conflictBuildToolAndUris.get(buildTool)!.map(uri => uri.toString())); + } + return result; + } + + private async askToResolveConflicts(conflictBuildToolAndUris: Map): Promise { + const result: string[] = []; + const conflictItems: IConflictItem[] = []; + for (const buildTool of conflictBuildToolAndUris.keys()) { + conflictItems.push({ + title: buildTool.displayName, + buildTool: buildTool, + uris: conflictBuildToolAndUris.get(buildTool), + }); + } + conflictItems.sort((a, b) => a.title.localeCompare(b.title)); + conflictItems.push({ + title: "Skip", + uris: [], + isCloseAffordance: true, + }); + + const choice = await window.showInformationMessage( + "Which build tool would you like to use for the workspace?", + { + modal: true, + }, + ...conflictItems + ); + + if (choice?.title !== "Skip") { + result.push(...choice.uris.map(uri => uri.toString())); + this.context.workspaceState.update(BUILD_TOOL_FOR_CONFLICTS, choice.buildTool); + } + return result; + } + + public getAllFoundBuildFiles(): Uri[] { + return this.foundBuildFiles; + } +} + +interface IConflictItem extends MessageItem { + uris: Uri[]; + buildTool?: IBuildTool; +} + +interface IBuildFilePicker extends QuickPickItem { + buildToolAndUri: Map; +} + +export function cleanupWorkspaceState(context: ExtensionContext) { + context.workspaceState.update(PICKED_BUILD_FILES, undefined); + context.workspaceState.update(BUILD_TOOL_FOR_CONFLICTS, undefined); + context.workspaceState.update(IMPORT_METHOD, undefined); + context.workspaceState.update(ACTIVE_BUILD_TOOL_STATE, undefined); +} diff --git a/src/clientCodeActionProvider.ts b/src/clientCodeActionProvider.ts new file mode 100644 index 000000000..5095f277a --- /dev/null +++ b/src/clientCodeActionProvider.ts @@ -0,0 +1,32 @@ +import { CancellationToken, CodeAction, CodeActionContext, CodeActionKind, CodeActionProvider, Command, ExtensionContext, ProviderResult, Range, Selection, TextDocument, commands } from "vscode"; +import { apiManager } from "./apiManager"; + +const configureStaticImportsCommand = "java.action.configureFavoriteStaticMembers"; +const UNDEFINED_METHOD = "67108964"; +export class ClientCodeActionProvider implements CodeActionProvider { + constructor(readonly context: ExtensionContext) { + context.subscriptions.push(commands.registerCommand(configureStaticImportsCommand, async () => { + commands.executeCommand("workbench.action.openSettings", "java.completion.favoriteStaticMembers"); + apiManager.fireTraceEvent({ + name: "java.ls.command", + properties: { + command: configureStaticImportsCommand, + }, + }); + })); + } + + provideCodeActions(document: TextDocument, range: Range | Selection, context: CodeActionContext, token: CancellationToken): ProviderResult<(CodeAction | Command)[]> { + const codeActions = []; + if (context.diagnostics?.some(diagnostic => diagnostic.code === UNDEFINED_METHOD) + || document.lineAt(range.start.line)?.text?.startsWith("import ")) { + const action = new CodeAction("Configure static import...", CodeActionKind.QuickFix); + action.command = { + title: "Configure static import...", + command: configureStaticImportsCommand, + }; + codeActions.push(action); + } + return codeActions; + } +} diff --git a/src/clientErrorHandler.ts b/src/clientErrorHandler.ts index ff7f55118..5caf1e797 100644 --- a/src/clientErrorHandler.ts +++ b/src/clientErrorHandler.ts @@ -1,8 +1,11 @@ import { window, commands } from "vscode"; +import { serverStatusBarProvider } from './serverStatusBarProvider'; import { ErrorHandler, Message, ErrorAction, CloseAction, ErrorHandlerResult, CloseHandlerResult } from "vscode-languageclient"; import { Commands } from "./commands"; import { logger } from "./log"; +import { apiManager } from "./apiManager"; +const CLIENT_ERROR = "java.client.error"; export class ClientErrorHandler implements ErrorHandler { private restarts: number[]; @@ -14,13 +17,22 @@ export class ClientErrorHandler implements ErrorHandler { if (count && count <= 3) { logger.error(`${this.name} server encountered error: ${_message}, ${_error && _error.toString()}`); return { - action: ErrorAction.Continue + action: ErrorAction.Continue, + handled: true }; } - logger.error(`${this.name} server encountered error and will shut down: ${_message}, ${_error && _error.toString()}`); + const errorMessage = `${this.name} server encountered error and will shut down: ${_message}, ${_error && _error.toString()}`; + apiManager.fireTraceEvent({ + name: CLIENT_ERROR, + properties: { + message: errorMessage, + }, + }); + logger.error(errorMessage); return { - action: ErrorAction.Shutdown + action: ErrorAction.Shutdown, + handled: true }; } @@ -29,13 +41,21 @@ export class ClientErrorHandler implements ErrorHandler { if (this.restarts.length < 5) { logger.error(`The ${this.name} server crashed and will restart.`); return { - action: CloseAction.Restart + action: CloseAction.Restart, + handled: true }; } else { const diff = this.restarts[this.restarts.length - 1] - this.restarts[0]; if (diff <= 3 * 60 * 1000) { const message = `The ${this.name} server crashed 5 times in the last 3 minutes. The server will not be restarted.`; + apiManager.fireTraceEvent({ + name: CLIENT_ERROR, + properties: { + message, + }, + }); logger.error(message); + serverStatusBarProvider.setError(); const action = "Show logs"; window.showErrorMessage(message, action).then(selection => { if (selection === action) { @@ -43,14 +63,16 @@ export class ClientErrorHandler implements ErrorHandler { } }); return { - action: CloseAction.DoNotRestart + action: CloseAction.DoNotRestart, + handled: true }; } logger.error(`The ${this.name} server crashed and will restart.`); this.restarts.shift(); return { - action: CloseAction.Restart + action: CloseAction.Restart, + handled: true }; } } diff --git a/src/codeActionProvider.ts b/src/codeActionProvider.ts index 8d2498270..e3ac0283c 100644 --- a/src/codeActionProvider.ts +++ b/src/codeActionProvider.ts @@ -19,7 +19,12 @@ export const javaRefactorKinds: Map = new Map([ export class RefactorDocumentProvider implements CodeActionProvider { provideCodeActions() { - return []; + return [{ + // The aim of this is to expose the source actions in the light bulb. + title: "Source Actions...", + command: "editor.action.sourceAction", + kind: CodeActionKind.Empty, + }]; } public static readonly metadata: CodeActionProviderMetadata = { @@ -32,9 +37,7 @@ export class RefactorDocumentProvider implements CodeActionProvider { command: { command: Commands.LEARN_MORE_ABOUT_REFACTORING, title: 'Learn more about Java refactorings...', - // comment out due to https://github.com/microsoft/vscode/issues/175737. - // TODO: revert the change once the issue is fixed. - // arguments: [kind] + arguments: [kind] } }; }), diff --git a/src/commands.ts b/src/commands.ts index 371448fee..ab5aa0543 100644 --- a/src/commands.ts +++ b/src/commands.ts @@ -79,9 +79,9 @@ export namespace Commands { */ export const EXECUTE_WORKSPACE_COMMAND = 'java.execute.workspaceCommand'; - /** - * Execute Workspace build (compilation) - */ + /** + * Execute Workspace build (compilation) + */ export const COMPILE_WORKSPACE = 'java.workspace.compile'; /** @@ -119,10 +119,10 @@ export namespace Commands { */ export const OPEN_FORMATTER = 'java.open.formatter.settings'; - /** - * Open a file given the URI - */ - export const OPEN_FILE = 'java.open.file'; + /** + * Open a file given the URI + */ + export const OPEN_FILE = 'java.open.file'; /** * Clean the Java language server workspace @@ -130,7 +130,7 @@ export namespace Commands { export const CLEAN_WORKSPACE = 'java.clean.workspace'; /** * Update the source attachment for the selected class file - * client-side & server-side commands + * client-side & server-side commands */ export const UPDATE_SOURCE_ATTACHMENT_CMD = 'java.project.updateSourceAttachment.command'; export const UPDATE_SOURCE_ATTACHMENT = 'java.project.updateSourceAttachment'; @@ -140,28 +140,29 @@ export namespace Commands { export const RESOLVE_SOURCE_ATTACHMENT = 'java.project.resolveSourceAttachment'; /** * Mark the folder as the source root of the closest project. - * client-side & server-side commands + * client-side & server-side commands */ export const ADD_TO_SOURCEPATH_CMD = 'java.project.addToSourcePath.command'; export const ADD_TO_SOURCEPATH = 'java.project.addToSourcePath'; /** * Unmark the folder as the source root of the project. - * client-side & server-side commands + * client-side & server-side commands */ export const REMOVE_FROM_SOURCEPATH_CMD = 'java.project.removeFromSourcePath.command'; export const REMOVE_FROM_SOURCEPATH = 'java.project.removeFromSourcePath'; /** * List all recognized source roots in the workspace. - * client-side & server-side commands + * client-side & server-side commands */ export const LIST_SOURCEPATHS_CMD = 'java.project.listSourcePaths.command'; export const LIST_SOURCEPATHS = 'java.project.listSourcePaths'; /** * Import new projects - * client-side & server-side commands + * client-side & server-side commands */ export const IMPORT_PROJECTS_CMD = 'java.project.import.command'; export const IMPORT_PROJECTS = 'java.project.import'; + export const CHANGE_IMPORTED_PROJECTS = 'java.project.changeImportedProjects'; /** * Override or implements the methods from the supertypes. */ @@ -170,7 +171,7 @@ export namespace Commands { * Generate hashCode() and equals(). */ export const HASHCODE_EQUALS_PROMPT = 'java.action.hashCodeEqualsPrompt'; - /** + /** * Open settings.json */ export const OPEN_JSON_SETTINGS = 'workbench.action.openSettingsJson'; @@ -182,14 +183,19 @@ export namespace Commands { * Organize imports silently. */ export const ORGANIZE_IMPORTS_SILENTLY = "java.edit.organizeImports"; - /** - * Handle a paste event. - */ - export const HANDLE_PASTE_EVENT = "java.edit.handlePasteEvent"; + export const MANUAL_CLEANUP = "java.action.doCleanup"; + /** + * Handle a paste event. + */ + export const HANDLE_PASTE_EVENT = "java.edit.handlePasteEvent"; /** * Custom paste action (triggers auto-import) */ export const CLIPBOARD_ONPASTE = 'java.action.clipboardPasteAction'; + /** + * Custom paste action in files explorer + */ + export const FILESEXPLORER_ONPASTE = 'java.action.filesExplorerPasteAction'; /** * Choose type to import. */ @@ -274,6 +280,10 @@ export namespace Commands { * Command to switch between standard mode and lightweight mode. */ export const SWITCH_SERVER_MODE = 'java.server.mode.switch'; + /** + * Command to restart the language server. + */ + export const RESTART_LANGUAGE_SERVER = 'java.server.restart'; export const LEARN_MORE_ABOUT_REFACTORING = '_java.learnMoreAboutRefactorings'; @@ -283,7 +293,7 @@ export namespace Commands { export const NOT_COVERED_EXECUTION = '_java.notCoveredExecution'; - export const MEATDATA_FILES_GENERATION = '_java.metadataFilesGeneration'; + export const METADATA_FILES_GENERATION = '_java.metadataFilesGeneration'; export const RUNTIME_VALIDATION_OPEN = 'java.runtimeValidation.open'; @@ -291,6 +301,11 @@ export namespace Commands { export const GET_WORKSPACE_PATH = '_java.workspace.path'; + /** + * Update the gradle wrapper version for the given project + * client-side & server-side commands + */ + export const UPGRADE_GRADLE_WRAPPER_CMD = 'java.project.upgradeGradle.command'; export const UPGRADE_GRADLE_WRAPPER = 'java.project.upgradeGradle'; export const LOMBOK_CONFIGURE = "java.lombokConfigure"; @@ -320,4 +335,69 @@ export namespace Commands { * Clean everything in the shared index directory. */ export const CLEAN_SHARED_INDEXES = "java.clean.sharedIndexes"; + + /** + * Get the uri of the decompiled class file. + */ + export const GET_DECOMPILED_SOURCE = "java.decompile"; + + /** + * Smart semicolon detection. + */ + export const SMARTSEMICOLON_DETECTION = "java.edit.smartSemicolonDetection"; + + /** + * Determine if pasted text is a java file and resolve packages + */ + export const RESOLVE_PASTED_TEXT = "java.project.resolveText"; + + /** + * The command when clicking the server status bar item. + */ + export const OPEN_STATUS_SHORTCUT = "_java.openShortcuts"; + + /** + * Change java search scope. + */ + export const CHANGE_JAVA_SEARCH_SCOPE = "java.change.searchScope"; + + /** + * Show Extended Outline for current document. + */ + export const SHOW_EXTEND_OUTLINE = 'java.action.showExtendedOutline'; + + /** + * Get the content of the currently visible editor. + */ + export const GET_VISIBLE_EDITOR_CONTENT = '_java.getVisibleEditorContent'; + + /** + * Get troubleshooting info command in jdt.ls + */ + export const GET_TROUBLESHOOTING_INFO = 'java.getTroubleshootingInfo'; + + /** + * Open Java Dashboard + */ + export const OPEN_JAVA_DASHBOARD = 'java.dashboard.open'; + + /** + * Add Java Runtime + */ + export const ADD_JAVA_RUNTIME = 'java.runtimes.add'; + + /** + * Copy fully qualified name. + */ + export const COPY_FULLY_QUALIFIED_NAME = 'java.action.copyFullyQualifiedName'; + export const GET_FULLY_QUALIFIED_NAME = 'java.getFullyQualifiedName'; +} + +/** + * Command titles used to render in the UI + */ +export namespace CommandTitle { + export const OPEN_JAVA_SETTINGS = "$(settings-gear) Open Java Settings"; + export const OPEN_LOGS = "$(output) Open Logs"; + export const CLEAN_WORKSPACE_CACHE = "$(trash) Clean Workspace Cache..."; } diff --git a/src/dashboard/dashboard.ts b/src/dashboard/dashboard.ts new file mode 100644 index 000000000..772b06e94 --- /dev/null +++ b/src/dashboard/dashboard.ts @@ -0,0 +1,185 @@ +import * as vscode from 'vscode'; +import { apiManager } from '../apiManager'; +import { Commands } from '../commands'; +import { getComputedJavaConfig, getWorkspacePath } from '../extension'; +import { isLombokSupportEnabled, Lombok } from '../lombokSupport'; +import { DashboardState, DiagnosticInfo, JVM, UpdateMessage } from '../webviewProtocol/toDashboard'; +import { getNonce, getUri } from '../webviewUtils'; +import { Uri } from 'vscode'; +import * as path from 'path'; + +const currentState: DashboardState = { +}; + + +class DashboardPanel { + private disposables: vscode.Disposable[] = []; + + constructor(private webView: vscode.Webview, private readonly context: vscode.ExtensionContext) { + this.init(); + } + + private init(): void { + this.disposables.push(vscode.workspace.onDidChangeConfiguration(e => { + if (e.affectsConfiguration('java.jdt.ls.lombokSupport.enabled')) { + currentState.lombokEnabled = isLombokSupportEnabled(); + const msg: UpdateMessage = { + type: "update", + lombokEnabled: isLombokSupportEnabled() + }; + this.postMessage(msg); + } + if (e.affectsConfiguration('java')) { + setTimeout(() => this.refreshLSInfo(), 1000); // wait for LS to pick up the config change + } + })); + this.setWebviewMessageListener(); + this.webView.html = this.getWebviewContent(); + this.disposables.push(vscode.commands.registerCommand('java.dashboard.refresh', async () => { + this.refreshLSInfo(); + })); + + this.disposables.push(vscode.commands.registerCommand('java.dashboard.revealFileInOS', async (arg: { path: string }) => { + await vscode.commands.executeCommand('revealFileInOS', vscode.Uri.file(arg.path)); + })); + + this.disposables.push(vscode.commands.registerCommand('java.dashboard.dumpState', async () => { + const doc = await vscode.workspace.openTextDocument({ + language: 'json', + content: JSON.stringify(currentState, null, 2) + }); + vscode.window.showTextDocument(doc); + })); + } + + private postMessage(message: UpdateMessage) { + if (this.webView) { + this.webView.postMessage(message); + } + } + + private setWebviewMessageListener() { + this.webView.onDidReceiveMessage( + async (message: any) => { + const command = message.command; + switch (command) { + case "webviewReady": { + await apiManager.getApiInstance().serverReady(); + currentState.lombokEnabled = isLombokSupportEnabled(); + currentState.activeLombokPath = Lombok.getActiveLombokPath(); + currentState.workspacePath = getWorkspacePath(); + const message: UpdateMessage = { + type: "update", + lombokEnabled: isLombokSupportEnabled(), + activeLombokPath: Lombok.getActiveLombokPath(), + workspacePath: getWorkspacePath(), + }; + await this.postMessage(message); + this.getJvms().then(jvms => { + currentState.jvms = jvms; + const msg: UpdateMessage = { + type: "update", + jvms: jvms + }; + + this.postMessage(msg); + }); + + this.refreshLSInfo(); + break; + } + } + } + ); + } + + public dispose(): void { + this.webView = undefined; + for (const disposable of this.disposables) { + disposable.dispose(); + } + } + + private async getJvms(): Promise { + const config = await getComputedJavaConfig(); + const jres: JVM[] = config.configuration.runtimes.map(jre => ({ + name: jre.name, + version: jre.version, + path: jre.path, + })); + return jres; + + } + + private getWebviewContent(): string { + const scriptUri = getUri(this.webView, this.context.extensionUri, "dist", "dashboard.js"); + const styleUri = getUri(this.webView, this.context.extensionUri, "dist", "dashboard.css"); + + return /* html*/ ` + + + + + + + + Dashboard + + + +
+ + + + `; + } + + private async refreshLSInfo(): Promise { + if (!this.webView) { + return; + } + try { + vscode.commands.executeCommand(Commands.EXECUTE_WORKSPACE_COMMAND, Commands.GET_TROUBLESHOOTING_INFO).then(info => { + currentState.diagnosticInfo = info; + const msg: UpdateMessage = { + type: "update", + diagnosticInfo: info + }; + this.postMessage(msg); + }); + } catch (e) { + console.error('Failed to get diagnostic info', e); + } + } +} + +export namespace Dashboard { + export function initialize(context: vscode.ExtensionContext): void { + console.log('registering dashboard webview provider'); + let dashboardPanel: DashboardPanel; + let webviewPanel: vscode.WebviewPanel; + + context.subscriptions.push(vscode.commands.registerCommand(Commands.OPEN_JAVA_DASHBOARD, async () => { + if (!dashboardPanel) { + webviewPanel = vscode.window.createWebviewPanel('java.dashboard', 'Java Dashboard', vscode.ViewColumn.Active, { + enableScripts: true, + enableCommandUris: true, + retainContextWhenHidden: true, + localResourceRoots: [context.extensionUri], + }); + webviewPanel.iconPath = Uri.file(path.join(context.extensionPath, 'icons', 'icon128.png')); + dashboardPanel = new DashboardPanel(webviewPanel.webview, context); + + webviewPanel.onDidDispose(() => { + dashboardPanel.dispose(); + dashboardPanel = undefined; + webviewPanel = undefined; + vscode.commands.executeCommand('setContext', 'java:dashboard', false); + }, undefined, context.subscriptions); + } else { + webviewPanel.reveal(); + } + })); + console.log('registered dashboard webview provider'); + } +} diff --git a/src/diagnostic.ts b/src/diagnostic.ts new file mode 100644 index 000000000..e68d2b05a --- /dev/null +++ b/src/diagnostic.ts @@ -0,0 +1,19 @@ +import { ExtensionContext, window } from "vscode"; +import { ValidateDocumentNotification } from "./protocol"; +import { LanguageClient } from "vscode-languageclient/node"; +import { validateAllOpenBuffersOnChanges } from "./settings"; + +export function registerDocumentValidationListener(context: ExtensionContext, languageClient: LanguageClient) { + context.subscriptions.push(window.onDidChangeActiveTextEditor(textEditor => { + // Refresh the diagnostics when the focus is switched to a Java file. + if (textEditor?.document.uri?.scheme === "file" && textEditor?.document.languageId === "java") { + if (!validateAllOpenBuffersOnChanges()) { + languageClient.sendNotification(ValidateDocumentNotification.type, { + textDocument: { + uri: textEditor.document.uri.toString(), + }, + }); + } + } + })); +} diff --git a/src/errorUtils.ts b/src/errorUtils.ts new file mode 100644 index 000000000..a098b7369 --- /dev/null +++ b/src/errorUtils.ts @@ -0,0 +1,24 @@ +// copied from https://github.com/redhat-developer/openshift-dd-ext/blob/f8c053bded9bc6c1bfac682cf4867b187e87ee76/client/src/utils/ErrorUtils.ts#L12 +export function getMessage(error: any): string { + return getRawMessage(error).trim(); +} + +export function getRawMessage(error: any): string { + if (typeof error === 'string') { + return error; + } + if (error.stderr) { + return error.stderr; + } + if (error.message) { + return error.message; + } + if (error.error) { + return error.error; + } + + // Unlikely to happen, as we're either getting an Error object with a message + // or we're dealing with a failed promise with a stderr message + // in any other case, we'll need to figure out what to return on a case by case basis + return JSON.stringify(error); +} \ No newline at end of file diff --git a/src/extension.api.ts b/src/extension.api.ts index caa9378df..7e44da530 100644 --- a/src/extension.api.ts +++ b/src/extension.api.ts @@ -73,7 +73,45 @@ export enum ClientStatus { stopping = "Stopping", } -export const extensionApiVersion = '0.7'; +export interface TraceEvent { + /** + * Request type. + */ + type: string; + /** + * Time (in milliseconds) taken to process a request. + */ + duration?: number; + /** + * Error that occurs while processing a request. + */ + error?: any; + /** + * The number of results returned by a response. + */ + resultLength?: number | undefined; + /** + * Additional data properties, such as the completion trigger context. + */ + data?: any; + /** + * Whether the response is from the syntax server. + */ + fromSyntaxServer?: boolean; +} + +export interface SourceInvalidatedEvent { + /** + * The paths of the jar files that are linked to new source attachments. + */ + affectedRootPaths: string[]; + /** + * The opened editors with updated source. + */ + affectedEditorDocuments?: Uri[]; +} + +export const extensionApiVersion = '0.14'; export interface ExtensionAPI { readonly apiVersion: string; @@ -98,6 +136,16 @@ export interface ExtensionAPI { * The Uris in the array point to the project root path. */ readonly onDidProjectsImport: Event; + + /** + * An event fires on projects deleted. This API is not supported in light weight server mode so far. + * The Uris in the array point to the project root path. + * + * @since API version 0.13 + * @since extension version 1.25.0 + */ + readonly onDidProjectsDelete: Event; + readonly goToDefinition: GoToDefinitionCommand; /** * Indicates the current active mode for Java Language Server. Possible modes are: @@ -118,4 +166,44 @@ export interface ExtensionAPI { * @since extension version 1.7.0 */ readonly serverReady: () => Promise; + + /** + * A promise that will be resolved when the language server process is running + * and can accept requests, even if project imports have not yet completed. + * This allows extensions to start querying for projects incrementally during import. + * @since API version 0.14 + */ + readonly serverRunning?: () => Promise; + + /** + * An event that's fired when a request is about to send to language server. + * @since API version 0.12 + * @since extension version 1.23.0 + */ + readonly onWillRequestStart: Event; + + /** + * An event that's fired when a request has been responded. + * @since API version 0.8 + * @since extension version 1.16.0 + */ + readonly onDidRequestEnd: Event; + + /** + * Allow 3rd party trace handler to track the language client & server error events. + * + * @since API version 0.9 + * @since extension version 1.20.0 + */ + readonly trackEvent: Event; + + /** + * An event that occurs when the package fragment roots have updated source attachments. + * The client should refresh the new source if it has previously requested the source + * from them. + * + * @since API version 0.10 + * @since extension version 1.21.0 + */ + readonly onDidSourceInvalidate: Event; } diff --git a/src/extension.ts b/src/extension.ts index 6c223c455..b7bec291a 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -3,33 +3,48 @@ import * as chokidar from 'chokidar'; import * as fs from 'fs'; import * as fse from 'fs-extra'; +import { glob } from 'glob'; import * as os from 'os'; import * as path from 'path'; -import { CodeActionContext, commands, ConfigurationTarget, Diagnostic, env, EventEmitter, ExtensionContext, extensions, IndentAction, InputBoxOptions, languages, RelativePattern, TextDocument, UIKind, Uri, ViewColumn, window, workspace, WorkspaceConfiguration } from 'vscode'; -import { CancellationToken, CodeActionParams, CodeActionRequest, Command, DidChangeConfigurationNotification, ExecuteCommandParams, ExecuteCommandRequest, LanguageClientOptions, RevealOutputChannelOn } from 'vscode-languageclient'; -import { LanguageClient } from 'vscode-languageclient/node'; +import * as semver from 'semver'; +import { + CodeActionContext, commands, CompletionItem, ConfigurationTarget, Diagnostic, env, EventEmitter, ExtensionContext, extensions, + InputBoxOptions, Location, MarkdownString, RelativePattern, + SnippetString, SnippetTextEdit, TextDocument, TextEditorRevealType, UIKind, Uri, version, ViewColumn, window, workspace, WorkspaceConfiguration +} from 'vscode'; +import { CancellationToken, CodeActionParams, CodeActionRequest, CodeActionResolveRequest, Command, CompletionRequest, DidChangeConfigurationNotification, ExecuteCommandParams, ExecuteCommandRequest, LanguageClientOptions, RevealOutputChannelOn } from 'vscode-languageclient'; +import { Executable, LanguageClient } from 'vscode-languageclient/node'; import { apiManager } from './apiManager'; +import { BuildFileSelector, cleanupWorkspaceState, PICKED_BUILD_FILES } from './buildFilesSelector'; import { ClientErrorHandler } from './clientErrorHandler'; import { Commands } from './commands'; -import { ClientStatus, ExtensionAPI } from './extension.api'; +import { Dashboard } from './dashboard/dashboard'; +import { getMessage } from './errorUtils'; +import { ClientStatus, ExtensionAPI, TraceEvent } from './extension.api'; import * as fileEventHandler from './fileEventHandler'; -import { getSharedIndexCache, HEAP_DUMP_LOCATION, prepareExecutable } from './javaServerStarter'; +import { JavaClassEditorProvider } from './javaClassEditor'; +import { getSharedIndexCache, HEAP_DUMP_LOCATION, prepareExecutable, removeEquinoxFragmentOnDarwinX64, startedFromSources } from './javaServerStarter'; +import { loadSupportedJreNames } from './jdkUtils'; import { initializeLogFile, logger } from './log'; import { cleanupLombokCache } from "./lombokSupport"; import { markdownPreviewProvider } from "./markdownPreviewProvider"; import { OutputInfoCollector } from './outputInfoCollector'; -import { collectJavaExtensions, getBundlesToReload, isContributedPartUpdated } from './plugin'; -import { registerClientProviders } from './providerDispatcher'; -import { initialize as initializeRecommendation } from './recommendation'; +import { pasteFile } from './pasteAction'; +import { collectJavaExtensions, getBundlesToReload, getShortcuts, IJavaShortcut, isContributedPartUpdated } from './plugin'; +import { Deferred } from './promiseUtil'; +import { fixJdtSchemeHoverLinks, registerClientProviders } from './providerDispatcher'; import * as requirements from './requirements'; -import { runtimeStatusBarProvider } from './runtimeStatusBarProvider'; -import { serverStatusBarProvider } from './serverStatusBarProvider'; -import { ACTIVE_BUILD_TOOL_STATE, cleanWorkspaceFileName, getJavaServerMode, handleTextBlockClosing, onConfigurationChange, ServerMode } from './settings'; +import { languageStatusBarProvider } from './runtimeStatusBarProvider'; +import { ServerStatusKind } from './serverStatus'; +import { serverStatusBarProvider, ShortcutQuickPickItem } from './serverStatusBarProvider'; +import { activationProgressNotification } from "./serverTaskPresenter"; +import { ACTIVE_BUILD_TOOL_STATE, cleanWorkspaceFileName, getImportMode, getJavaServerMode, handleTextDocumentChanges, ImportMode, onConfigurationChange, ServerMode } from './settings'; import { snippetCompletionProvider } from './snippetCompletionProvider'; import { StandardLanguageClient } from './standardLanguageClient'; import { SyntaxLanguageClient } from './syntaxLanguageClient'; -import { convertToGlob, deleteDirectory, ensureExists, getBuildFilePatterns, getExclusionBlob, getInclusionPatternsFromNegatedExclusion, getJavaConfig, getJavaConfiguration, hasBuildToolConflicts } from './utils'; -import glob = require('glob'); +import { Telemetry } from './telemetry'; +import { cleanJavaLSConfiguration, convertToGlob, deleteClientLog, deleteDirectory, ensureExists, getBuildFilePatterns, getExclusionGlob, getInclusionPatternsFromNegatedExclusion, getJavaConfig, getJavaConfiguration, getVersion, hasBuildToolConflicts, resolveActualCause } from './utils'; +import { JavaRuntimes } from './javaRuntimes'; const syntaxClient: SyntaxLanguageClient = new SyntaxLanguageClient(); const standardClient: StandardLanguageClient = new StandardLanguageClient(); @@ -37,6 +52,18 @@ const jdtEventEmitter = new EventEmitter(); const extensionName = 'Language Support for Java'; let storagePath: string; let clientLogFile: string; +let standardServerStart: Promise | undefined; + +const excutable= new Deferred(); + +export async function getExecutable(): Promise { + return excutable.promise; +} + +const javaConfigDeferred = new Deferred(); +export async function getComputedJavaConfig(): Promise { + return javaConfigDeferred.promise; +} /** * Shows a message about the server crashing due to an out of memory issue @@ -58,8 +85,16 @@ async function showOOMMessage(): Promise { } } +function getMaxMemFromConfiguration(includeUnit?: boolean): string | undefined { + const jvmArgs: string = getJavaConfiguration().get('jdt.ls.vmargs'); + const results = includeUnit ? MAX_HEAP_SIZE_EXTRACTOR_WITH_UNIT.exec(jvmArgs) + : MAX_HEAP_SIZE_EXTRACTOR.exec(jvmArgs); + return results && results[0] ? results[1] : undefined; +} + const HEAP_DUMP_FOLDER_EXTRACTOR = new RegExp(`${HEAP_DUMP_LOCATION}(?:'([^']+)'|"([^"]+)"|([^\\s]+))`); const MAX_HEAP_SIZE_EXTRACTOR = new RegExp(`-Xmx([0-9]+)[kKmMgG]`); +const MAX_HEAP_SIZE_EXTRACTOR_WITH_UNIT = new RegExp(`-Xmx([0-9]+[kKmMgG])`); /** * Returns the heap dump folder defined in the user's preferences, or undefined if the user does not set the heap dump folder @@ -75,8 +110,48 @@ function getHeapDumpFolderFromSettings(): string { return results[1] || results[2] || results[3]; } +const REPLACE_JDT_LINKS_PATTERN: RegExp = /(\[(?:[^\]])+\]\()(jdt:\/\/(?:(?:(?:\\\))|([^)]))+))\)/g; +const EXISTING_COMMAND_PATTERN: RegExp = /\[([^\]]+)\]\(command:[^)]+\)/g; + +/** + * Replace `jdt://` links in the documentation with links that execute the VS Code command required to open the referenced file. + * + * Extracted from {@link fixJdtSchemeHoverLinks} for use in completion item documentation. + * + * @param oldDocumentation the documentation to fix the links in + * @returns the documentation with fixed links + */ +export function fixJdtLinksInDocumentation(oldDocumentation: MarkdownString): MarkdownString { + // sanitize existing command: links + const sanitizedContent = oldDocumentation.value.replace(EXISTING_COMMAND_PATTERN, (_substring, group1: string, group2) => { + return group1; + }); + const newContent: string = sanitizedContent.replace(REPLACE_JDT_LINKS_PATTERN, (_substring, group1, group2) => { + const uri = `command:${Commands.OPEN_FILE}?${encodeURI(JSON.stringify([encodeURIComponent(group2)]))}`; + return `${group1}${uri})`; + }); + const mdString = new MarkdownString(newContent); + mdString.isTrusted = true; + return mdString; +} -export function activate(context: ExtensionContext): Promise { +export async function activate(context: ExtensionContext): Promise { + storagePath = context.storagePath; + if (!storagePath) { + storagePath = getTempWorkspace(); + } + Dashboard.initialize(context); + + await loadSupportedJreNames(context); + await JavaRuntimes.initialize(context); + context.subscriptions.push(commands.registerCommand(Commands.FILESEXPLORER_ONPASTE, async () => { + const originalClipboard = await env.clipboard.readText(); + // Hack in order to get path to selected folder if applicable (see https://github.com/microsoft/vscode/issues/3553#issuecomment-1098562676) + await commands.executeCommand('copyFilePath'); + const folder = await env.clipboard.readText(); + await env.clipboard.writeText(originalClipboard); + pasteFile(folder); + })); context.subscriptions.push(markdownPreviewProvider); context.subscriptions.push(commands.registerCommand(Commands.TEMPLATE_VARIABLES, async () => { markdownPreviewProvider.show(context.asAbsolutePath(path.join('document', `${Commands.TEMPLATE_VARIABLES}.md`)), 'Predefined Variables', "", context); @@ -85,30 +160,47 @@ export function activate(context: ExtensionContext): Promise { markdownPreviewProvider.show(context.asAbsolutePath(path.join('document', `_java.notCoveredExecution.md`)), 'Not Covered Maven Plugin Execution', "", context); })); - storagePath = context.storagePath; - context.subscriptions.push(commands.registerCommand(Commands.MEATDATA_FILES_GENERATION, async () => { + context.subscriptions.push(commands.registerCommand(Commands.METADATA_FILES_GENERATION, async () => { markdownPreviewProvider.show(context.asAbsolutePath(path.join('document', `_java.metadataFilesGeneration.md`)), 'Metadata Files Generation', "", context); })); context.subscriptions.push(commands.registerCommand(Commands.LEARN_MORE_ABOUT_CLEAN_UPS, async () => { markdownPreviewProvider.show(context.asAbsolutePath(path.join('document', `${Commands.LEARN_MORE_ABOUT_CLEAN_UPS}.md`)), 'Java Clean Ups', "java-clean-ups", context); })); - if (!storagePath) { - storagePath = getTempWorkspace(); - } + + const workspacePath = path.resolve(`${storagePath}/jdt_ws`); clientLogFile = path.join(storagePath, 'client.log'); + const cleanWorkspaceExists = fs.existsSync(path.join(workspacePath, cleanWorkspaceFileName)); + if (cleanWorkspaceExists) { + deleteClientLog(storagePath); + } initializeLogFile(clientLogFile); - enableJavadocSymbols(); - - initializeRecommendation(context); + Telemetry.startTelemetry(context); registerOutOfMemoryDetection(storagePath); cleanJavaWorkspaceStorage(); - serverStatusBarProvider.initialize(); + if (!startedFromSources()) { // Dev mode: version may not match package.json, deleting the in-use folder + cleanOldGlobalStorage(context); + } + + // https://github.com/redhat-developer/vscode-java/issues/3484 + if (process.platform === 'darwin' && process.arch === 'x64') { + try { + if (semver.lt(os.release(), '20.0.0')) { + removeEquinoxFragmentOnDarwinX64(context); + } + } catch (error) { + // do nothing + } + } + + let requirementsData: requirements.RequirementsData; - return requirements.resolveRequirements(context).catch(error => { + try { + requirementsData = await requirements.resolveRequirements(context); + } catch (error) { // show error window.showErrorMessage(error.message, error.label).then((selection) => { if (error.label && error.label === selection && error.command) { @@ -117,317 +209,584 @@ export function activate(context: ExtensionContext): Promise { }); // rethrow to disrupt the chain. throw error; - }).then(async (requirements) => { - const triggerFiles = await getTriggerFiles(); - return new Promise(async (resolve) => { - const workspacePath = path.resolve(`${storagePath}/jdt_ws`); - const syntaxServerWorkspacePath = path.resolve(`${storagePath}/ss_ws`); - - let serverMode = getJavaServerMode(); - const isWorkspaceTrusted = (workspace as any).isTrusted; // TODO: use workspace.isTrusted directly when other clients catch up to adopt 1.56.0 - if (isWorkspaceTrusted !== undefined && !isWorkspaceTrusted) { // keep compatibility for old engines < 1.56.0 - serverMode = ServerMode.lightWeight; - } - commands.executeCommand('setContext', 'java:serverMode', serverMode); - const isDebugModeByClientPort = !!process.env['SYNTAXLS_CLIENT_PORT'] || !!process.env['JDTLS_CLIENT_PORT']; - const requireSyntaxServer = (serverMode !== ServerMode.standard) && (!isDebugModeByClientPort || !!process.env['SYNTAXLS_CLIENT_PORT']); - let requireStandardServer = (serverMode !== ServerMode.lightWeight) && (!isDebugModeByClientPort || !!process.env['JDTLS_CLIENT_PORT']); - - // Options to control the language client - const clientOptions: LanguageClientOptions = { - // Register the server for java - documentSelector: [ - { scheme: 'file', language: 'java' }, - { scheme: 'jdt', language: 'java' }, - { scheme: 'untitled', language: 'java' } - ], - synchronize: { - configurationSection: ['java', 'editor.insertSpaces', 'editor.tabSize'], - }, - initializationOptions: { - bundles: collectJavaExtensions(extensions.all), - workspaceFolders: workspace.workspaceFolders ? workspace.workspaceFolders.map(f => f.uri.toString()) : null, - settings: { java: getJavaConfig(requirements.java_home) }, - extendedClientCapabilities: { - progressReportProvider: getJavaConfiguration().get('progressReports.enabled'), - classFileContentsSupport: true, - overrideMethodsPromptSupport: true, - hashCodeEqualsPromptSupport: true, - advancedOrganizeImportsSupport: true, - generateToStringPromptSupport: true, - advancedGenerateAccessorsSupport: true, - generateConstructorsPromptSupport: true, - generateDelegateMethodsPromptSupport: true, - advancedExtractRefactoringSupport: true, - inferSelectionSupport: ["extractMethod", "extractVariable", "extractField"], - moveRefactoringSupport: true, - clientHoverProvider: true, - clientDocumentSymbolProvider: true, - gradleChecksumWrapperPromptSupport: true, - resolveAdditionalTextEditsSupport: true, - advancedIntroduceParameterRefactoringSupport: true, - actionableRuntimeNotificationSupport: true, - onCompletionItemSelectedCommand: "editor.action.triggerParameterHints", - extractInterfaceSupport: true, - }, - triggerFiles, - }, - middleware: { - workspace: { - didChangeConfiguration: async () => { - await standardClient.getClient().sendNotification(DidChangeConfigurationNotification.type, { - settings: { - java: getJavaConfig(requirements.java_home), + } + const triggerFiles = await getTriggerFiles(); + const syntaxServerWorkspacePath = path.resolve(`${storagePath}/ss_ws`); + + let serverMode = getJavaServerMode(); + const isWorkspaceTrusted = (workspace as any).isTrusted; // TODO: use workspace.isTrusted directly when other clients catch up to adopt 1.56.0 + if (isWorkspaceTrusted !== undefined && !isWorkspaceTrusted) { // keep compatibility for old engines < 1.56.0 + serverMode = ServerMode.lightWeight; + } + commands.executeCommand('setContext', 'java:serverMode', serverMode); + const isDebugModeByClientPort = !!process.env['SYNTAXLS_CLIENT_PORT'] || !!process.env['JDTLS_CLIENT_PORT']; + const requireSyntaxServer = (serverMode !== ServerMode.standard) && (!isDebugModeByClientPort || !!process.env['SYNTAXLS_CLIENT_PORT']); + const requireStandardServer = (serverMode !== ServerMode.lightWeight) && (!isDebugModeByClientPort || !!process.env['JDTLS_CLIENT_PORT']); + let initFailureReported: boolean = false; + + const javaConfig = await getJavaConfig(requirementsData.java_home); + javaConfigDeferred.resolve(javaConfig); + + // Options to control the language client + const clientOptions: LanguageClientOptions = { + // Register the server for java + documentSelector: [ + { scheme: 'file', language: 'java' }, + { scheme: 'jdt', language: 'java' }, + { scheme: 'untitled', language: 'java' }, + { scheme: 'vscode-notebook-cell', language: 'java' } + ], + synchronize: { + configurationSection: ['java', 'editor.insertSpaces', 'editor.tabSize', "files.associations"], + }, + initializationOptions: { + bundles: collectJavaExtensions(extensions.all), + workspaceFolders: workspace.workspaceFolders ? workspace.workspaceFolders.map(f => f.uri.toString()) : null, + settings: { java: javaConfig }, + extendedClientCapabilities: { + classFileContentsSupport: true, + overrideMethodsPromptSupport: true, + hashCodeEqualsPromptSupport: true, + advancedOrganizeImportsSupport: true, + generateToStringPromptSupport: true, + advancedGenerateAccessorsSupport: true, + generateConstructorsPromptSupport: true, + generateDelegateMethodsPromptSupport: true, + advancedExtractRefactoringSupport: true, + inferSelectionSupport: ["extractMethod", "extractVariable", "extractField"], + moveRefactoringSupport: true, + moveRefactoringConfirmationSupport: true, + clientHoverProvider: true, + clientDocumentSymbolProvider: true, + gradleChecksumWrapperPromptSupport: true, + advancedIntroduceParameterRefactoringSupport: true, + actionableRuntimeNotificationSupport: true, + onCompletionItemSelectedCommand: "editor.action.triggerParameterHints", + extractInterfaceSupport: true, + advancedUpgradeGradleSupport: true, + executeClientCommandSupport: true, + snippetEditSupport: true, + nonStandardJavaFormatting: { + schemes: ["vscode-notebook-cell"], + extensions: ["jsh", "jshell", "ipynb"], + getContentCallback: Commands.GET_VISIBLE_EDITOR_CONTENT, + } + }, + triggerFiles, + }, + middleware: { + workspace: { + didChangeConfiguration: async () => { + await standardClient.getClient().sendNotification(DidChangeConfigurationNotification.type, { + settings: { + java: await getJavaConfig(requirementsData.java_home), + } + }); + } + }, + resolveCompletionItem: async (item, token, next): Promise => { + const completionItem = await next(item, token); + if (completionItem?.documentation instanceof MarkdownString) { + completionItem.documentation = fixJdtLinksInDocumentation(completionItem.documentation); + } + return completionItem; + }, + // https://github.com/redhat-developer/vscode-java/issues/2130 + // include all diagnostics for the current line in the CodeActionContext params for the performance reason + provideCodeActions: async (document, range, context, token, next) => { + const client: LanguageClient = standardClient.getClient(); + const params: CodeActionParams = { + textDocument: client.code2ProtocolConverter.asTextDocumentIdentifier(document), + range: client.code2ProtocolConverter.asRange(range), + context: await client.code2ProtocolConverter.asCodeActionContext(context) + }; + const showAt = getJavaConfiguration().get("quickfix.showAt"); + if (showAt === 'line' && range.start.line === range.end.line && range.start.character === range.end.character) { + const textLine = document.lineAt(params.range.start.line); + if (textLine !== null) { + const diagnostics = client.diagnostics.get(document.uri); + const allDiagnostics: Diagnostic[] = []; + for (const diagnostic of diagnostics) { + if (textLine.range.intersection(diagnostic.range)) { + const newLen = allDiagnostics.push(diagnostic); + if (newLen > 1000) { + break; } - }); + } } - }, - // https://github.com/redhat-developer/vscode-java/issues/2130 - // include all diagnostics for the current line in the CodeActionContext params for the performance reason - provideCodeActions: async (document, range, context, token, next) => { - const client: LanguageClient = standardClient.getClient(); - const params: CodeActionParams = { - textDocument: client.code2ProtocolConverter.asTextDocumentIdentifier(document), - range: client.code2ProtocolConverter.asRange(range), - context: await client.code2ProtocolConverter.asCodeActionContext(context) + const codeActionContext: CodeActionContext = { + diagnostics: allDiagnostics, + only: context.only, + triggerKind: context.triggerKind, }; - const showAt = getJavaConfiguration().get("quickfix.showAt"); - if (showAt === 'line' && range.start.line === range.end.line && range.start.character === range.end.character) { - const textLine = document.lineAt(params.range.start.line); - if (textLine !== null) { - const diagnostics = client.diagnostics.get(document.uri); - const allDiagnostics: Diagnostic[] = []; - for (const diagnostic of diagnostics) { - if (textLine.range.intersection(diagnostic.range)) { - const newLen = allDiagnostics.push(diagnostic); - if (newLen > 1000) { - break; + params.context = await client.code2ProtocolConverter.asCodeActionContext(codeActionContext); + } + } + return client.sendRequest(CodeActionRequest.type, params, token).then(async (values) => { + if (values === null) { + return undefined; + } + const result = []; + for (const item of values) { + if (Command.is(item)) { + result.push(client.protocol2CodeConverter.asCommand(item)); + } + else { + result.push(await client.protocol2CodeConverter.asCodeAction(item)); + } + } + return result; + }, (error) => { + return client.handleFailedRequest(CodeActionRequest.type, token, error, []); + }); + }, + + resolveCodeAction: async (item, token, next) => { + const client: LanguageClient = standardClient.getClient(); + const documentUris = []; + const snippetEdits = []; + return client.sendRequest(CodeActionResolveRequest.type, client.code2ProtocolConverter.asCodeActionSync(item), token).then(async (result) => { + if (token.isCancellationRequested) { + return item; + } + const docChanges = result.edit !== undefined ? result.edit.documentChanges : undefined; + if (docChanges !== undefined) { + for (const docChange of docChanges) { + if ("textDocument" in docChange) { + for (const edit of docChange.edits) { + if ("snippet" in edit) { + documentUris.push(Uri.parse(docChange.textDocument.uri).toString()); + const snippetValue = (edit as any).snippet.value; + const snippet = new SnippetTextEdit( + client.protocol2CodeConverter.asRange((edit as any).range), + new SnippetString(escapeSnippetLiterals(snippetValue)) + ); + if (semver.gte(version, '1.98.0')) { + snippet["keepWhitespace"] = true; } + snippetEdits.push(snippet); } } - const codeActionContext: CodeActionContext = { - diagnostics: allDiagnostics, - only: context.only, - triggerKind: context.triggerKind, - }; - params.context = await client.code2ProtocolConverter.asCodeActionContext(codeActionContext); } } - return client.sendRequest(CodeActionRequest.type, params, token).then(async (values) => { - if (values === null) { - return undefined; - } - const result = []; - for (const item of values) { - if (Command.is(item)) { - result.push(client.protocol2CodeConverter.asCommand(item)); - } - else { - result.push(await client.protocol2CodeConverter.asCodeAction(item)); + const codeAction = await client.protocol2CodeConverter.asCodeAction(result, token); + const docEdits = codeAction.edit !== undefined ? codeAction.edit.entries() : []; + for (const docEdit of docEdits) { + const uri = docEdit[0]; + if (documentUris.includes(uri.toString())) { + const editList = []; + for (const edit of docEdit[1]) { + let isSnippet = false; + snippetEdits.forEach((snippet, index) => { + if (edit.range.isEqual(snippet.range) && documentUris[index] === uri.toString()) { + editList.push(snippet); + isSnippet = true; + } + }); + if (!isSnippet) { + editList.push(edit); + } } + codeAction.edit.set(uri, null); + codeAction.edit.set(uri, editList); } - return result; - }, (error) => { - return client.handleFailedRequest(CodeActionRequest.type, token, error, []); - }); + } + return codeAction; } - }, - revealOutputChannelOn: RevealOutputChannelOn.Never, - errorHandler: new ClientErrorHandler(extensionName), - initializationFailedHandler: error => { - logger.error(`Failed to initialize ${extensionName} due to ${error && error.toString()}`); - return true; - }, - outputChannel: requireStandardServer ? new OutputInfoCollector(extensionName) : undefined, - outputChannelName: extensionName - }; - - apiManager.initialize(requirements, serverMode); - resolve(apiManager.getApiInstance()); - // the promise is resolved - // no need to pass `resolve` into any code past this point, - // since `resolve` is a no-op from now on - - const serverOptions = prepareExecutable(requirements, syntaxServerWorkspacePath, getJavaConfig(requirements.java_home), context, true); - if (requireSyntaxServer) { - if (process.env['SYNTAXLS_CLIENT_PORT']) { - syntaxClient.initialize(requirements, clientOptions); - } else { - syntaxClient.initialize(requirements, clientOptions, serverOptions); - } - syntaxClient.start().then(() => { - syntaxClient.registerSyntaxClientActions(serverOptions); + return await client.protocol2CodeConverter.asCodeAction(result, token); + }, (error) => { + return client.handleFailedRequest(CodeActionResolveRequest.type, token, error, item); }); - serverStatusBarProvider.showLightWeightStatus(); - } + }, - context.subscriptions.push(commands.registerCommand(Commands.EXECUTE_WORKSPACE_COMMAND, (command, ...rest) => { - const api: ExtensionAPI = apiManager.getApiInstance(); - if (api.serverMode === ServerMode.lightWeight) { - console.warn(`The command: ${command} is not supported in LightWeight mode. See: https://github.com/redhat-developer/vscode-java/issues/1480`); - return; - } - let token: CancellationToken; - let commandArgs: any[] = rest; - if (rest && rest.length && CancellationToken.is(rest[rest.length - 1])) { - token = rest[rest.length - 1]; - commandArgs = rest.slice(0, rest.length - 1); - } - const params: ExecuteCommandParams = { - command, - arguments: commandArgs - }; - if (token) { - return standardClient.getClient().sendRequest(ExecuteCommandRequest.type, params, token); - } else { - return standardClient.getClient().sendRequest(ExecuteCommandRequest.type, params); - } - })); - - const cleanWorkspaceExists = fs.existsSync(path.join(workspacePath, cleanWorkspaceFileName)); - if (cleanWorkspaceExists) { - try { - cleanupLombokCache(context); - deleteDirectory(workspacePath); - deleteDirectory(syntaxServerWorkspacePath); - } catch (error) { - window.showErrorMessage(`Failed to delete ${workspacePath}: ${error}`); + provideReferences: async (document, position, options, token, next): Promise => { + // Override includeDeclaration from VS Code by allowing it to be configured + options.includeDeclaration = getJavaConfiguration().get('references.includeDeclarations'); + return await next(document, position, options, token); + } + }, + revealOutputChannelOn: RevealOutputChannelOn.Never, + errorHandler: new ClientErrorHandler(extensionName), + initializationFailedHandler: error => { + logger.error(`Failed to initialize ${extensionName} due to ${error && error.toString()}`); + if ((error.toString().includes('Connection') && error.toString().includes('disposed')) || error.toString().includes('Internal error')) { + if (!initFailureReported) { + apiManager.fireTraceEvent({ + name: "java.client.error.initialization", + properties: { + message: error && error.toString(), + data: resolveActualCause(error?.data), + }, + }); } + initFailureReported = true; + return false; + } else { + return true; } + }, + outputChannel: requireStandardServer ? new OutputInfoCollector(extensionName) : undefined, + outputChannelName: extensionName + }; - // Register commands here to make it available even when the language client fails - context.subscriptions.push(commands.registerCommand(Commands.OPEN_SERVER_LOG, (column: ViewColumn) => openServerLogFile(workspacePath, column))); - context.subscriptions.push(commands.registerCommand(Commands.OPEN_SERVER_STDOUT_LOG, (column: ViewColumn) => openRollingServerLogFile(workspacePath, '.out-jdt.ls', column))); - context.subscriptions.push(commands.registerCommand(Commands.OPEN_SERVER_STDERR_LOG, (column: ViewColumn) => openRollingServerLogFile(workspacePath, '.error-jdt.ls', column))); + apiManager.initialize(requirementsData, serverMode); + registerCodeCompletionTelemetryListener(); + void postExtensionStartInit( + context, + requirementsData, + clientOptions, + workspacePath, + syntaxServerWorkspacePath, + serverMode, + requireSyntaxServer, + requireStandardServer, + cleanWorkspaceExists + ); + + return apiManager.getApiInstance(); +} - context.subscriptions.push(commands.registerCommand(Commands.OPEN_CLIENT_LOG, (column: ViewColumn) => openClientLogFile(clientLogFile, column))); +async function getStandardLanguageClient(): Promise { + try { + if (standardServerStart) { + return await standardServerStart; + } + } catch (error) { + logger.error(`Failed to initialize the Java language client: ${getMessage(error)}`); + } + return standardClient.getClient(); +} - context.subscriptions.push(commands.registerCommand(Commands.OPEN_LOGS, () => openLogs())); +async function postExtensionStartInit( + context: ExtensionContext, + requirements: requirements.RequirementsData, + clientOptions: LanguageClientOptions, + workspacePath: string, + syntaxServerWorkspacePath: string, + serverMode: ServerMode, + requireSyntaxServer: boolean, + requireStandardServer: boolean, + cleanWorkspaceExists: boolean +): Promise { + if (requireSyntaxServer) { + const serverOptions = prepareExecutable(requirements, syntaxServerWorkspacePath, context, true); + excutable.resolve(serverOptions); + if (process.env['SYNTAXLS_CLIENT_PORT']) { + syntaxClient.initialize(requirements, clientOptions); + } else { + syntaxClient.initialize(requirements, clientOptions, serverOptions); + } + syntaxClient.start().then(() => { + syntaxClient.registerSyntaxClientActions(serverOptions); + }); + serverStatusBarProvider.showLightWeightStatus(); + } - context.subscriptions.push(commands.registerCommand(Commands.OPEN_FORMATTER, async () => openFormatter(context.extensionPath))); - context.subscriptions.push(commands.registerCommand(Commands.OPEN_FILE, async (uri: string) => { - const parsedUri = Uri.parse(uri); - await window.showTextDocument(parsedUri); - })); + apiManager.getApiInstance().onDidServerModeChange((event: ServerMode) => { + if (event === ServerMode.standard) { + syntaxClient.stop(); + fileEventHandler.setServerStatus(true); + languageStatusBarProvider.initialize(context); + } + commands.executeCommand('setContext', 'java:serverMode', event); + }); - context.subscriptions.push(commands.registerCommand(Commands.CLEAN_WORKSPACE, (force?: boolean) => cleanWorkspace(workspacePath, force))); - context.subscriptions.push(commands.registerCommand(Commands.CLEAN_SHARED_INDEXES, () => cleanSharedIndexes(context))); + if (cleanWorkspaceExists) { + const data = {}; + try { + cleanupLombokCache(context); + cleanupWorkspaceState(context); + deleteDirectory(workspacePath); + deleteDirectory(syntaxServerWorkspacePath); + cleanJavaLSConfiguration(context); + } catch (error) { + data['error'] = getMessage(error); + window.showErrorMessage(`Failed to delete ${workspacePath}: ${error}`); + } + await Telemetry.sendTelemetry(Commands.CLEAN_WORKSPACE, data); + } - context.subscriptions.push(commands.registerCommand(Commands.GET_WORKSPACE_PATH, () => workspacePath)); + if (serverMode === ServerMode.hybrid && !await fse.pathExists(path.join(workspacePath, ".metadata", ".plugins"))) { + const config = getJavaConfiguration(); + const importOnStartupSection: string = "project.importOnFirstTimeStartup"; + const importOnStartup = config.get(importOnStartupSection); + if (importOnStartup === "disabled" || + env.uiKind === UIKind.Web && env.appName.includes("Visual Studio Code")) { + apiManager.getApiInstance().serverMode = ServerMode.lightWeight; + apiManager.fireDidServerModeChange(ServerMode.lightWeight); + requireStandardServer = false; + } else if (importOnStartup === "interactive" && await workspaceContainsBuildFiles()) { + apiManager.getApiInstance().serverMode = ServerMode.lightWeight; + apiManager.fireDidServerModeChange(ServerMode.lightWeight); + requireStandardServer = await promptUserForStandardServer(config); + } else { + requireStandardServer = true; + } + } - context.subscriptions.push(commands.registerCommand(Commands.REFRESH_BUNDLES_COMMAND, () => { - return getBundlesToReload(); - })); + if (requireStandardServer) { + void startStandardServer(context, requirements, clientOptions, workspacePath); + } - context.subscriptions.push(onConfigurationChange(workspacePath, context)); + context.subscriptions.push(commands.registerCommand(Commands.EXECUTE_WORKSPACE_COMMAND, async (command, ...rest) => { + const api: ExtensionAPI = apiManager.getApiInstance(); + if (api.serverMode === ServerMode.lightWeight) { + console.warn(`The command: ${command} is not supported in LightWeight mode. See: https://github.com/redhat-developer/vscode-java/issues/1480`); + return; + } + let token: CancellationToken; + let commandArgs: any[] = rest; + if (rest && rest.length && CancellationToken.is(rest[rest.length - 1])) { + token = rest[rest.length - 1]; + commandArgs = rest.slice(0, rest.length - 1); + } + const params: ExecuteCommandParams = { + command, + arguments: commandArgs + }; + const client: LanguageClient | undefined = await getStandardLanguageClient(); + if (!client) { + console.warn(`Cannot execute Java workspace command '${command}' because the Java language client is not initialized`); + return; + } + if (token) { + return client.sendRequest(ExecuteCommandRequest.type, params, token); + } else { + return client.sendRequest(ExecuteCommandRequest.type, params); + } + })); - /** - * Command to switch the server mode. Currently it only supports switch from lightweight to standard. - * @param force force to switch server mode without asking - */ - commands.registerCommand(Commands.SWITCH_SERVER_MODE, async (switchTo: ServerMode, force: boolean = false) => { - const isWorkspaceTrusted = (workspace as any).isTrusted; - if (isWorkspaceTrusted !== undefined && !isWorkspaceTrusted) { // keep compatibility for old engines < 1.56.0 - const button = "Manage Workspace Trust"; - const choice = await window.showInformationMessage("For security concern, Java language server cannot be switched to Standard mode in untrusted workspaces.", button); - if (choice === button) { - commands.executeCommand("workbench.trust.manage"); - } - return; - } + context.subscriptions.push(commands.registerCommand(Commands.OPEN_STATUS_SHORTCUT, async (status: string) => { + const items: ShortcutQuickPickItem[] = []; + if (status === ServerStatusKind.error || status === ServerStatusKind.warning) { + commands.executeCommand("workbench.panel.markers.view.focus"); + } else { + commands.executeCommand(Commands.SHOW_SERVER_TASK_STATUS, true); + } - const clientStatus: ClientStatus = standardClient.getClientStatus(); - if (clientStatus === ClientStatus.starting || clientStatus === ClientStatus.started) { - return; - } + items.push(...getShortcuts().map((shortcut: IJavaShortcut) => { + return { + label: shortcut.title, + command: shortcut.command, + args: shortcut.arguments, + }; + })); - const api: ExtensionAPI = apiManager.getApiInstance(); - if (api.serverMode === switchTo || api.serverMode === ServerMode.standard) { - return; - } + const choice = await window.showQuickPick(items); + if (!choice) { + return; + } - let choice: string; - if (force) { - choice = "Yes"; - } else { - choice = await window.showInformationMessage("Are you sure you want to switch the Java language server to Standard mode?", "Yes", "No"); - } + apiManager.fireTraceEvent({ + name: "triggerShortcutCommand", + properties: { + message: choice.command, + }, + }); - if (choice === "Yes") { - await startStandardServer(context, requirements, clientOptions, workspacePath); - } - }); + if (choice.command) { + commands.executeCommand(choice.command, ...(choice.args || [])); + } + })); + context.subscriptions.push(commands.registerCommand(Commands.OPEN_SERVER_LOG, (column: ViewColumn) => openServerLogFile(storagePath, column))); + context.subscriptions.push(commands.registerCommand(Commands.OPEN_SERVER_STDOUT_LOG, (column: ViewColumn) => openRollingServerLogFile(storagePath, '.out-jdt.ls', column))); + context.subscriptions.push(commands.registerCommand(Commands.OPEN_SERVER_STDERR_LOG, (column: ViewColumn) => openRollingServerLogFile(storagePath, '.error-jdt.ls', column))); + + context.subscriptions.push(commands.registerCommand(Commands.OPEN_CLIENT_LOG, (column: ViewColumn) => openClientLogFile(clientLogFile, column))); + + context.subscriptions.push(commands.registerCommand(Commands.OPEN_LOGS, () => openLogs())); + + context.subscriptions.push(commands.registerCommand(Commands.OPEN_FORMATTER, async () => openFormatter(context.extensionPath))); + context.subscriptions.push(commands.registerCommand(Commands.OPEN_FILE, async (uri: string) => { + const parsedUri = Uri.parse(uri); + const editor = await window.showTextDocument(parsedUri); + // Reveal the document at the specified line, if possible (e.g. jumping to a specific javadoc method). + if (editor && parsedUri.scheme === 'jdt' && parsedUri.fragment) { + const line = parseInt(parsedUri.fragment); + if (isNaN(line) || line < 1 || line > editor.document.lineCount) { + return; + } + const range = editor.document.lineAt(line - 1).range; + editor.revealRange(range, TextEditorRevealType.AtTop); + } + })); - context.subscriptions.push(snippetCompletionProvider.initialize()); - context.subscriptions.push(serverStatusBarProvider); - context.subscriptions.push(runtimeStatusBarProvider); + context.subscriptions.push(commands.registerCommand(Commands.CLEAN_WORKSPACE, (force?: boolean) => cleanWorkspace(workspacePath, force))); + context.subscriptions.push(commands.registerCommand(Commands.CLEAN_SHARED_INDEXES, () => cleanSharedIndexes(context))); - registerClientProviders(context, { contentProviderEvent: jdtEventEmitter.event }); + context.subscriptions.push(commands.registerCommand(Commands.GET_WORKSPACE_PATH, () => workspacePath)); - apiManager.getApiInstance().onDidServerModeChange((event: ServerMode) => { - if (event === ServerMode.standard) { - syntaxClient.stop(); - fileEventHandler.setServerStatus(true); - runtimeStatusBarProvider.initialize(context); - } - commands.executeCommand('setContext', 'java:serverMode', event); - }); + context.subscriptions.push(commands.registerCommand(Commands.REFRESH_BUNDLES_COMMAND, () => { + return getBundlesToReload(); + })); - if (serverMode === ServerMode.hybrid && !await fse.pathExists(path.join(workspacePath, ".metadata", ".plugins"))) { - const config = getJavaConfiguration(); - const importOnStartupSection: string = "project.importOnFirstTimeStartup"; - const importOnStartup = config.get(importOnStartupSection); - if (importOnStartup === "disabled" || - env.uiKind === UIKind.Web && env.appName.includes("Visual Studio Code")) { - apiManager.getApiInstance().serverMode = ServerMode.lightWeight; - apiManager.fireDidServerModeChange(ServerMode.lightWeight); - requireStandardServer = false; - } else if (importOnStartup === "interactive" && await workspaceContainsBuildFiles()) { - apiManager.getApiInstance().serverMode = ServerMode.lightWeight; - apiManager.fireDidServerModeChange(ServerMode.lightWeight); - requireStandardServer = await promptUserForStandardServer(config); - } else { - requireStandardServer = true; - } + context.subscriptions.push(onConfigurationChange(workspacePath, context)); + + context.subscriptions.push(commands.registerCommand(Commands.GET_VISIBLE_EDITOR_CONTENT, (uri: string) => { + for (const editor of window.visibleTextEditors) { + if (editor.document.uri.toString() === uri) { + return editor.document.getText(); } + } + const editor = window.activeTextEditor; + if (editor) { + return editor.document.getText(); + } else { + return null; + } + })); + + context.subscriptions.push(commands.registerCommand(Commands.COPY_FULLY_QUALIFIED_NAME, async () => { + const editor = window.activeTextEditor; + if (!editor || editor.document.languageId !== 'java') { + return; + } - if (requireStandardServer) { - await startStandardServer(context, requirements, clientOptions, workspacePath); + const params = { + textDocument: { + uri: editor.document.uri.toString() + }, + position: { + line: editor.selection.active.line, + character: editor.selection.active.character } + }; - const onDidGrantWorkspaceTrust = (workspace as any).onDidGrantWorkspaceTrust; - if (onDidGrantWorkspaceTrust !== undefined) { // keep compatibility for old engines < 1.56.0 - context.subscriptions.push(onDidGrantWorkspaceTrust(() => { - if (getJavaServerMode() !== ServerMode.lightWeight) { - // See the issue https://github.com/redhat-developer/vscode-java/issues/1994 - // Need to recollect the Java bundles before starting standard mode. - let pollingCount: number = 0; - // Poll every ~100ms (timeout after 1s) and check whether contributing javaExtensions have changed. - const intervalId = setInterval(() => { - const existingJavaExtensions = clientOptions.initializationOptions.bundles; - clientOptions.initializationOptions.bundles = collectJavaExtensions(extensions.all); - if (++pollingCount >= 10 || isContributedPartUpdated(existingJavaExtensions, clientOptions.initializationOptions.bundles)) { - clearInterval(intervalId); - commands.executeCommand(Commands.SWITCH_SERVER_MODE, ServerMode.standard, true); - return; - } - }, 100); - } - })); + const fullyQualifiedName = await commands.executeCommand( + Commands.EXECUTE_WORKSPACE_COMMAND, + Commands.GET_FULLY_QUALIFIED_NAME, + JSON.stringify(params) + ); + + if (fullyQualifiedName) { + await env.clipboard.writeText(fullyQualifiedName); + } + })); + registerRestartJavaLanguageServerCommand(context); + + /** + * Command to switch the server mode. Currently it only supports switch from lightweight to standard. + * @param force force to switch server mode without asking + */ + commands.registerCommand(Commands.SWITCH_SERVER_MODE, async (switchTo: ServerMode, force: boolean = false) => { + const isWorkspaceTrusted = (workspace as any).isTrusted; + if (isWorkspaceTrusted !== undefined && !isWorkspaceTrusted) { // keep compatibility for old engines < 1.56.0 + const button = "Manage Workspace Trust"; + const choice = await window.showInformationMessage("For security concern, Java language server cannot be switched to Standard mode in untrusted workspaces.", button); + if (choice === button) { + commands.executeCommand("workbench.trust.manage"); } - context.subscriptions.push(workspace.onDidChangeTextDocument(event => handleTextBlockClosing(event.document, event.contentChanges))); - }); + return; + } + + const clientStatus: ClientStatus = standardClient.getClientStatus(); + if (clientStatus === ClientStatus.starting || clientStatus === ClientStatus.started) { + return; + } + + const api: ExtensionAPI = apiManager.getApiInstance(); + if (!force && (api.serverMode === switchTo || api.serverMode === ServerMode.standard)) { + return; + } + + let choice: string; + if (force) { + choice = "Yes"; + } else { + choice = await window.showInformationMessage("Are you sure you want to switch the Java language server to Standard mode?", "Yes", "No"); + } + + if (choice === "Yes") { + await startStandardServer(context, requirements, clientOptions, workspacePath, true /* triggeredByCommand */); + } }); -} -async function startStandardServer(context: ExtensionContext, requirements: requirements.RequirementsData, clientOptions: LanguageClientOptions, workspacePath: string) { + context.subscriptions.push(commands.registerCommand(Commands.CHANGE_JAVA_SEARCH_SCOPE, async () => { + const selection = await window.showQuickPick(["all", "main", "projectOnly"], { + canPickMany: false, + placeHolder: `Current: ${workspace.getConfiguration().get("java.search.scope")}`, + }); + if (selection) { + workspace.getConfiguration().update("java.search.scope", selection, false); + } + })); + + context.subscriptions.push(snippetCompletionProvider.initialize()); + context.subscriptions.push(serverStatusBarProvider); + context.subscriptions.push(languageStatusBarProvider); + + const classEditorProviderRegistration = window.registerCustomEditorProvider(JavaClassEditorProvider.viewType, new JavaClassEditorProvider(context)); + context.subscriptions.push(classEditorProviderRegistration); + + registerClientProviders(context, { contentProviderEvent: jdtEventEmitter.event }); + + const onDidGrantWorkspaceTrust = (workspace as any).onDidGrantWorkspaceTrust; + if (onDidGrantWorkspaceTrust !== undefined) { // keep compatibility for old engines < 1.56.0 + context.subscriptions.push(onDidGrantWorkspaceTrust(() => { + if (getJavaServerMode() !== ServerMode.lightWeight) { + // See the issue https://github.com/redhat-developer/vscode-java/issues/1994 + // Need to recollect the Java bundles before starting standard mode. + let pollingCount: number = 0; + // Poll every ~100ms (timeout after 1s) and check whether contributing javaExtensions have changed. + const intervalId = setInterval(() => { + const existingJavaExtensions = clientOptions.initializationOptions.bundles; + clientOptions.initializationOptions.bundles = collectJavaExtensions(extensions.all); + if (++pollingCount >= 10 || isContributedPartUpdated(existingJavaExtensions, clientOptions.initializationOptions.bundles)) { + clearInterval(intervalId); + commands.executeCommand(Commands.SWITCH_SERVER_MODE, ServerMode.standard, true); + return; + } + }, 100); + } + })); + } + context.subscriptions.push(workspace.onDidChangeTextDocument(event => handleTextDocumentChanges(event.document, event.contentChanges))); +} +async function startStandardServer( + context: ExtensionContext, + requirements: requirements.RequirementsData, + clientOptions: LanguageClientOptions, + workspacePath: string, + triggeredByCommand: boolean = false +): Promise { + if (standardServerStart) { + const client = await standardServerStart; + if (client || !triggeredByCommand) { + return client; + } + } if (standardClient.getClientStatus() !== ClientStatus.uninitialized) { - return; + return standardClient.getClient(); } + standardServerStart = doStartStandardServer(context, requirements, clientOptions, workspacePath, triggeredByCommand).finally(() => { + standardServerStart = undefined; + }); + return standardServerStart; +} - const checkConflicts: boolean = await ensureNoBuildToolConflicts(context, clientOptions); - if (!checkConflicts) { - return; +async function doStartStandardServer(context: ExtensionContext, requirements: requirements.RequirementsData, clientOptions: LanguageClientOptions, workspacePath: string, triggeredByCommand: boolean = false): Promise { + const selector: BuildFileSelector = new BuildFileSelector(context, []); + const importMode: ImportMode = await getImportMode(context, selector); + if (importMode === ImportMode.automatic) { + if (!await ensureNoBuildToolConflicts(context, clientOptions)) { + return undefined; + } + } else { + const buildFiles: string[] = []; + if (importMode === ImportMode.manual) { + const cache = context.workspaceState.get(PICKED_BUILD_FILES); + if (cache === undefined || cache.length === 0 && triggeredByCommand) { + buildFiles.push(...await selector.selectBuildFiles() || []); + } else { + buildFiles.push(...cache); + } + } + if (buildFiles.length === 0) { + commands.executeCommand('setContext', 'java:serverMode', ServerMode.lightWeight); + serverStatusBarProvider.showNotImportedStatus(); + return undefined; + } + clientOptions.initializationOptions.projectConfigurations = buildFiles; } if (apiManager.getApiInstance().serverMode === ServerMode.lightWeight) { @@ -439,7 +798,8 @@ async function startStandardServer(context: ExtensionContext, requirements: requ standardClient.start().then(async () => { standardClient.registerLanguageClientActions(context, await fse.pathExists(path.join(workspacePath, ".metadata", ".plugins")), jdtEventEmitter); }); - serverStatusBarProvider.showStandardStatus(); + serverStatusBarProvider.setBusy("Activating..."); + return standardClient.getClient(); } async function workspaceContainsBuildFiles(): Promise { @@ -448,14 +808,14 @@ async function workspaceContainsBuildFiles(): Promise { const inclusionPatterns: string[] = getBuildFilePatterns(); const inclusionPatternsFromNegatedExclusion: string[] = getInclusionPatternsFromNegatedExclusion(); if (inclusionPatterns.length > 0 && inclusionPatternsFromNegatedExclusion.length > 0 && - (await workspace.findFiles(convertToGlob(inclusionPatterns, inclusionPatternsFromNegatedExclusion), null, 1 /* maxResults */)).length > 0) { + (await workspace.findFiles(convertToGlob(inclusionPatterns, inclusionPatternsFromNegatedExclusion), null, 1 /* maxResults */)).length > 0) { return true; } // Nothing found in negated exclusion pattern, do a normal search then. - const inclusionBlob: string = convertToGlob(inclusionPatterns); - const exclusionBlob: string = getExclusionBlob(); - if (inclusionBlob && (await workspace.findFiles(inclusionBlob, exclusionBlob, 1 /* maxResults */)).length > 0) { + const inclusionGlob: string = convertToGlob(inclusionPatterns); + const exclusionGlob: string = getExclusionGlob(); + if (inclusionGlob && (await workspace.findFiles(inclusionGlob, exclusionGlob, 1 /* maxResults */)).length > 0) { return true; } @@ -485,7 +845,7 @@ async function ensureNoBuildToolConflicts(context: ExtensionContext, clientOptio clientOptions.initializationOptions.settings.java.import.maven.enabled = false; context.workspaceState.update(ACTIVE_BUILD_TOOL_STATE, "gradle"); } else { - throw new Error (`Unknown build tool: ${activeBuildTool}`); // unreachable + throw new Error(`Unknown build tool: ${activeBuildTool}`); // unreachable } } @@ -547,49 +907,8 @@ export async function getActiveLanguageClient(): Promise\/\?\s]+)/g, - onEnterRules: [ - { - // e.g. /** | */ or /* | */ - beforeText: /^\s*\/\*\*?(?!\/)([^\*]|\*(?!\/))*$/, - afterText: /^\s*\*\/$/, - action: { indentAction: IndentAction.IndentOutdent, appendText: ' * ' } - }, - { - // e.g. /** ...| - beforeText: /^\s*\/\*\*(?!\/)([^\*]|\*(?!\/))*$/, - action: { indentAction: IndentAction.None, appendText: ' * ' } - }, - { - // e.g. * ...| - beforeText: /^(\t|(\ \ ))*\ \*(\ ([^\*]|\*(?!\/))*)?$/, - action: { indentAction: IndentAction.None, appendText: '* ' } - }, - { - // e.g. */| - beforeText: /^(\t|(\ \ ))*\ \*\/\s*$/, - action: { indentAction: IndentAction.None, removeText: 1 } - }, - { - // e.g. *-----*/| - beforeText: /^(\t|(\ \ ))*\ \*[^/]*\*\/\s*$/, - action: { indentAction: IndentAction.None, removeText: 1 } - } - ] - }); -} -function getTempWorkspace() { +export function getTempWorkspace() { return path.resolve(os.tmpdir(), `vscodesws_${makeRandomHexString(5)}`); } @@ -630,56 +949,65 @@ async function cleanSharedIndexes(context: ExtensionContext) { } } -function openServerLogFile(workspacePath, column: ViewColumn = ViewColumn.Active): Thenable { +function openServerLogFile(storagePath, column: ViewColumn = ViewColumn.Active): Thenable { + const workspacePath = computeWorkspacePath(storagePath); const serverLogFile = path.join(workspacePath, '.metadata', '.log'); return openLogFile(serverLogFile, 'Could not open Java Language Server log file', column); } -function openRollingServerLogFile(workspacePath, filename, column: ViewColumn = ViewColumn.Active): Thenable { - return new Promise((resolve) => { - const dirname = path.join(workspacePath, '.metadata'); +function computeWorkspacePath(storagePath: any) { + return path.join(storagePath, apiManager.getApiInstance().serverMode === ServerMode.lightWeight ? 'ss_ws' : 'jdt_ws'); +} + +export function getWorkspacePath() { + return computeWorkspacePath(storagePath); +} + +async function openRollingServerLogFile(storagePath, filename, column: ViewColumn = ViewColumn.Active): Promise { + const workspacePath = computeWorkspacePath(storagePath); + const dirname = path.join(workspacePath, '.metadata'); + try { // find out the newest one - glob(`${filename}-*`, { cwd: dirname }, (err, files) => { - if (!err && files.length > 0) { - files.sort(); + const files = await glob(`${filename}-*`, { cwd: dirname }); + if (files.length > 0) { + files.sort(); - const logFile = path.join(dirname, files[files.length - 1]); - openLogFile(logFile, `Could not open Java Language Server log file ${filename}`, column).then((result) => resolve(result)); - } else { - resolve(false); - } - }); - }); + const logFile = path.join(dirname, files[files.length - 1]); + return await openLogFile(logFile, `Could not open Java Language Server log file ${filename}`, column); + } + } catch (err) { + console.error("Error opening rolling server log file", err); + } + return false; } -function openClientLogFile(logFile: string, column: ViewColumn = ViewColumn.Active): Thenable { - return new Promise((resolve) => { - const filename = path.basename(logFile); - const dirname = path.dirname(logFile); +async function openClientLogFile(logFile: string, column: ViewColumn = ViewColumn.Active): Promise { + const filename = path.basename(logFile); + const dirname = path.dirname(logFile); + try { // find out the newest one - glob(`${filename}.*`, { cwd: dirname }, (err, files) => { - if (!err && files.length > 0) { - files.sort((a, b) => { - const dateA = a.slice(11, 21), dateB = b.slice(11, 21); - if (dateA === dateB) { - if (a.length > 22 && b.length > 22) { - const extA = a.slice(22), extB = b.slice(22); - return parseInt(extA) - parseInt(extB); - } else { - return a.length - b.length; - } - } else { - return dateA < dateB ? -1 : 1; + const files = await glob(`${filename}.*`, { cwd: dirname }); + if (files.length > 0) { + files.sort((a, b) => { + const dateA = a.slice(11, 21), dateB = b.slice(11, 21); + if (dateA === dateB) { + if (a.length > 22 && b.length > 22) { + const extA = a.slice(22), extB = b.slice(22); + return parseInt(extA) - parseInt(extB); } - }); - logFile = path.join(dirname, files[files.length - 1]); - } + return a.length - b.length; + } + return dateA < dateB ? -1 : 1; + }); + logFile = path.join(dirname, files[files.length - 1]); + } - openLogFile(logFile, 'Could not open Java extension log file', column).then((result) => resolve(result)); - }); - }); + } catch (err) { + console.error("Error opening client log file", err); + } + return await openLogFile(logFile, 'Could not open Java extension log file', column); } async function openLogs() { @@ -687,6 +1015,8 @@ async function openLogs() { await commands.executeCommand(Commands.OPEN_SERVER_LOG, ViewColumn.One); await commands.executeCommand(Commands.OPEN_SERVER_STDOUT_LOG, ViewColumn.One); await commands.executeCommand(Commands.OPEN_SERVER_STDERR_LOG, ViewColumn.One); + const client = await getActiveLanguageClient(); + client?.outputChannel.show(true); } function openLogFile(logFile, openingFailureWarning: string, column: ViewColumn = ViewColumn.Active): Thenable { @@ -699,7 +1029,7 @@ function openLogFile(logFile, openingFailureWarning: string, column: ViewColumn if (!doc) { return false; } - return window.showTextDocument(doc, {viewColumn: column, preview: false}) + return window.showTextDocument(doc, { viewColumn: column, preview: false }) .then(editor => !!editor); }, () => false) .then(didOpen => { @@ -873,7 +1203,9 @@ async function getTriggerFiles(): Promise { } } - const javaFilesUnderRoot: Uri[] = await workspace.findFiles(new RelativePattern(rootFolder, "*.java"), undefined, 1); + // Paths set by 'java.import.exclusions' will be ignored when searching trigger files. + const exclusionGlob = getExclusionGlob(); + const javaFilesUnderRoot: Uri[] = await workspace.findFiles(new RelativePattern(rootFolder, "*.java"), exclusionGlob, 1); for (const javaFile of javaFilesUnderRoot) { if (isPrefix(rootPath, javaFile.fsPath)) { openedJavaFiles.push(javaFile.toString()); @@ -881,7 +1213,7 @@ async function getTriggerFiles(): Promise { } } - const javaFilesInCommonPlaces: Uri[] = await workspace.findFiles(new RelativePattern(rootFolder, "{src, test}/**/*.java"), undefined, 1); + const javaFilesInCommonPlaces: Uri[] = await workspace.findFiles(new RelativePattern(rootFolder, "{src, test}/**/*.java"), exclusionGlob, 1); for (const javaFile of javaFilesInCommonPlaces) { if (isPrefix(rootPath, javaFile.fsPath)) { openedJavaFiles.push(javaFile.toString()); @@ -896,7 +1228,7 @@ async function getTriggerFiles(): Promise { function getJavaFilePathOfTextDocument(document: TextDocument): string | undefined { if (document) { const resource = document.uri; - if (resource.scheme === 'file' && resource.fsPath.endsWith('.java')) { + if (resource.scheme === 'file' && document.languageId === "java") { return path.normalize(resource.fsPath); } } @@ -927,7 +1259,8 @@ async function cleanJavaWorkspaceStorage() { // find all folders of the form "redhat.java/jdt_ws/" and delete "redhat.java/" if (fs.existsSync(wsRoot)) { - new glob.Glob(`${wsRoot}/**/jdt_ws`, (_err, matches) => { + try { + const matches = await glob(`${wsRoot}/**/jdt_ws`); for (const javaWSCache of matches) { const entry = path.dirname(javaWSCache); const entryModTime = fs.statSync(entry).mtimeMs; @@ -936,8 +1269,49 @@ async function cleanJavaWorkspaceStorage() { deleteDirectory(entry); } } - }); - } + } catch (err) { + logger.error('Error cleaning workspace storage:', err); + } + } +} + +async function cleanOldGlobalStorage(context: ExtensionContext) { + const currentVersion = getVersion(context.extensionPath); + const globalStoragePath = context.globalStorageUri?.fsPath; // .../Code/User/globalStorage/redhat.java + + ensureExists(globalStoragePath); + + // delete folders in .../User/globalStorage/redhat.java that are not named the current version + fs.promises.readdir(globalStoragePath).then(async (files) => { + await Promise.all(files.map(async (file) => { + const currentPath = path.join(globalStoragePath, file); + const stat = await fs.promises.stat(currentPath); + + if (stat.isDirectory() && file !== currentVersion) { + logger.info(`Removing old folder in globalStorage : ${file}`); + deleteDirectory(currentPath); + } + })); + }); +} + +export function registerCodeCompletionTelemetryListener() { + apiManager.getApiInstance().onDidRequestEnd((traceEvent: TraceEvent) => { + if (traceEvent.type === CompletionRequest.method) { + // Exclude the invalid completion requests. + if (!traceEvent.resultLength) { + return; + } + const props = { + duration: Math.round(traceEvent.duration * 100) / 100, + resultLength: traceEvent.resultLength || 0, + error: !!traceEvent.error, + fromSyntaxServer: !!traceEvent.fromSyntaxServer, + engine: getJavaConfiguration().get('completion.engine'), + }; + return Telemetry.sendTelemetry(Telemetry.COMPLETION_EVENT, props); + } + }); } function registerOutOfMemoryDetection(storagePath: string) { @@ -951,6 +1325,44 @@ function registerOutOfMemoryDetection(storagePath: string) { if (heapDumpFolder === storagePath) { fse.remove(path); } + apiManager.fireTraceEvent({ + name: "java.process.outofmemory", + properties: { + maxMem: getMaxMemFromConfiguration(true), + } + }); + Telemetry.sendTelemetry("java.process.outofmemory", { + maxMem: getMaxMemFromConfiguration(true), + }); showOOMMessage(); + serverStatusBarProvider.setError(); + activationProgressNotification.hide(); }); } + +function registerRestartJavaLanguageServerCommand(context: ExtensionContext) { + context.subscriptions.push(commands.registerCommand(Commands.RESTART_LANGUAGE_SERVER, async () => { + switch (getJavaServerMode()) { + case (ServerMode.standard): + // Standard server restart + await standardClient.getClient().restart(); + break; + case (ServerMode.lightWeight): + // Syntax server restart + await syntaxClient.getClient().restart(); + break; + case (ServerMode.hybrid): + if (syntaxClient.isAlive()) { + await syntaxClient.getClient().restart(); + } + await standardClient.getClient().restart(); + break; + } + })); +} + +export function escapeSnippetLiterals(value: string): string { + return value + .replace(/\\(?!,)/g, '\\\\') // Escape backslashes, but preserve escaped commas + .replace(/\$(?!\{)/g, '\\$'); // Escape $ only if NOT followed by { +} diff --git a/src/fileEventHandler.ts b/src/fileEventHandler.ts index 668322815..2fa9a35cf 100644 --- a/src/fileEventHandler.ts +++ b/src/fileEventHandler.ts @@ -10,14 +10,22 @@ import { WillRenameFiles } from './protocol'; import { getJavaConfiguration } from './utils'; import { userInfo } from 'os'; import * as stringInterpolate from 'fmtr'; +import { apiManager } from './apiManager'; let serverReady: boolean = false; +type LanguageClientProvider = LanguageClient | (() => LanguageClient); + +const BRACE_POSITION_KEY = "org.eclipse.jdt.core.formatter.brace_position_for_type_declaration"; +const END_OF_LINE = "end_of_line"; +const NEXT_LINE = "next_line"; +const NEXT_LINE_SHIFTED = "next_line_shifted"; + export function setServerStatus(ready: boolean) { serverReady = ready; } -export function registerFileEventHandlers(client: LanguageClient, context: ExtensionContext) { +export function registerFileEventHandlers(client: LanguageClientProvider, context: ExtensionContext) { if (workspace.onDidCreateFiles) {// Theia doesn't support workspace.onDidCreateFiles yet context.subscriptions.push(workspace.onDidCreateFiles(handleNewJavaFiles)); } @@ -25,9 +33,24 @@ export function registerFileEventHandlers(client: LanguageClient, context: Exten if (workspace.onWillRenameFiles) { context.subscriptions.push(workspace.onWillRenameFiles(getWillRenameHandler(client))); } + + // extension activated and empty Java file is in active editor ? + // type declaration snippet handler activated too late so adjust the file here + apiManager.getApiInstance().serverReady().then(async () => { + const te = window.activeTextEditor?.document; + if (te && te.getText().trim().length === 0) { + setServerStatus(true); + handleNewJavaFiles({ + files: [te.uri] + }); + } + }); } async function handleNewJavaFiles(e: FileCreateEvent) { + if (!getJavaConfiguration().get('templates.newFile.enabled', true)) { + return; + } const emptyFiles: Uri[] = []; const textDocuments: TextDocument[] = []; for (const uri of e.files) { @@ -57,12 +80,20 @@ async function handleNewJavaFiles(e: FileCreateEvent) { } // See https://github.com/redhat-developer/vscode-java/issues/2939 - // The client side listener should avoid inserting duplicated conents + // The client side listener should avoid inserting duplicated contents // when the file creation event is triggered from a WorkspaceEdit. // Given that the VS Code API doesn't provide a way to distinguish // the event source, a workaround is to wait 100ms and let WorkspaceEdit // to take effect first, then check if the workingcopy is filled with content. const timeout = setTimeout(async() => { + const editorConfig = workspace.getConfiguration('editor'); + const insertSpaces = editorConfig.get('insertSpaces', true); + const tabSize = editorConfig.get('tabSize', 4); + const indent = insertSpaces ? ' '.repeat(tabSize) : '\t'; + + const projectSetting: {} = await commands.executeCommand<{}>(Commands.EXECUTE_WORKSPACE_COMMAND, Commands.GET_PROJECT_SETTINGS, emptyFiles[0].toString(), [BRACE_POSITION_KEY]); + projectSetting[BRACE_POSITION_KEY] = projectSetting[BRACE_POSITION_KEY] || END_OF_LINE; + const formatNumber = (num => num > 9 ? String(num) : `0${num}`); for (let i = 0; i < emptyFiles.length; i++) { if (textDocuments[i].getText()) { @@ -113,16 +144,39 @@ async function handleNewJavaFiles(e: FileCreateEvent) { snippets.push(stringInterpolate(template, context)); } } - + let declaration: string; + const preferPackagePrivate = getJavaConfiguration().get("templates.preferPackagePrivateVisibility", false); + const visibilityPrefix = preferPackagePrivate ? "" : "public "; if (isModuleInfo) { - snippets.push(`module \${1:name} {`); + declaration = `module \${1:name}`; } else if (!serverReady || await isVersionLessThan(emptyFiles[i].toString(), 14)) { - snippets.push(`public \${1|class,interface,enum,abstract class,@interface|} ${typeName} {`); + declaration = `${visibilityPrefix}\${1|class,interface,enum,abstract class,@interface|} ${typeName}`; + } else { + declaration = `${visibilityPrefix}\${1|class ${typeName},interface ${typeName},enum ${typeName},record ${typeName}(),abstract class ${typeName},@interface ${typeName}|}`; + } + let bracePosition = projectSetting[BRACE_POSITION_KEY]; + if (bracePosition !== END_OF_LINE && bracePosition !== NEXT_LINE && bracePosition !== NEXT_LINE_SHIFTED) { + bracePosition = END_OF_LINE; + } + + let body = `${indent}\${0}`; + if (bracePosition === END_OF_LINE) { + snippets.push(`${declaration} {`); + } else if (bracePosition === NEXT_LINE) { + snippets.push(`${declaration}`); + snippets.push("{"); + } else if (bracePosition === NEXT_LINE_SHIFTED) { + snippets.push(declaration); + snippets.push(`${indent}{`); + body = `${indent}${body}`; + } + snippets.push(body); + if (bracePosition === NEXT_LINE_SHIFTED) { + snippets.push(`${indent}}`); } else { - snippets.push(`public \${1|class ${typeName},interface ${typeName},enum ${typeName},record ${typeName}(),abstract class ${typeName},@interface ${typeName}|} {`); + snippets.push("}"); } - snippets.push("\t${0}"); - snippets.push("}"); + snippets.push(""); } const textEditor = await window.showTextDocument(textDocuments[i]); @@ -137,7 +191,11 @@ async function handleNewJavaFiles(e: FileCreateEvent) { }, 100); } -function getWillRenameHandler(client: LanguageClient) { +function getLanguageClient(client: LanguageClientProvider): LanguageClient { + return typeof client === 'function' ? client() : client; +} + +function getWillRenameHandler(client: LanguageClientProvider) { return function handleWillRenameFiles(e: FileWillRenameEvent): void { if (!serverReady) { return; @@ -162,10 +220,11 @@ function getWillRenameHandler(client: LanguageClient) { return; } - const edit = await client.sendRequest(WillRenameFiles.type, { + const languageClient = getLanguageClient(client); + const edit = await languageClient.sendRequest(WillRenameFiles.type, { files: javaRenameEvents }); - resolve(await client.protocol2CodeConverter.asWorkspaceEdit(edit)); + resolve(await languageClient.protocol2CodeConverter.asWorkspaceEdit(edit)); } catch (ex) { reject(ex); } @@ -174,7 +233,25 @@ function getWillRenameHandler(client: LanguageClient) { } function isJavaFile(uri: Uri): boolean { - return uri.fsPath && uri.fsPath.endsWith(".java"); + if (uri.fsPath && uri.fsPath.endsWith(".java")) { + return true; + } + let result = false; + const associations = workspace.getConfiguration().get("files.associations"); + if (associations !== null) { + Object.keys(associations).forEach(pattern => { + const langId = associations[pattern]; + if (langId === 'java' && pattern.startsWith('*.') && pattern.length > 2) { + const ext = pattern.substring(2); + if (!ext.includes('?') && !ext.includes('*')) { + if (uri.fsPath && uri.fsPath.endsWith(`.${ext}`)) { + result = true; + } + } + } + }); + } + return result; } async function isFile(uri: Uri): Promise { diff --git a/src/gradle/gradleCodeActionProvider.ts b/src/gradle/gradleCodeActionProvider.ts index f3cb6b0f7..d09af4704 100644 --- a/src/gradle/gradleCodeActionProvider.ts +++ b/src/gradle/gradleCodeActionProvider.ts @@ -41,7 +41,7 @@ export class GradleCodeActionProvider implements CodeActionProvider const projectUri = Uri.file(projectPath).toString(); const upgradeWrapperCommand: Command = { title: UPGRADE_GRADLE_WRAPPER_TITLE, - command: Commands.UPGRADE_GRADLE_WRAPPER, + command: Commands.UPGRADE_GRADLE_WRAPPER_CMD, arguments: [projectUri] }; const codeAction = new CodeAction(UPGRADE_GRADLE_WRAPPER_TITLE, CodeActionKind.QuickFix.append("gradle")); diff --git a/src/hoverAction.ts b/src/hoverAction.ts index f4e91f4d0..760013524 100644 --- a/src/hoverAction.ts +++ b/src/hoverAction.ts @@ -74,7 +74,7 @@ class JavaHoverProvider implements HoverProvider { } const contributed = new MarkdownString(contributedCommands.map((command) => this.convertCommandToMarkdown(command)).join(' | ')); - contributed.isTrusted = true; + contributed.isTrusted = { enabledCommands: contributedCommands.map((command) => command.command) }; let contents: MarkdownString[] = [ contributed ]; let range; if (serverHover && serverHover.contents) { diff --git a/src/javaClassEditor.ts b/src/javaClassEditor.ts new file mode 100644 index 000000000..2cf0f6bd0 --- /dev/null +++ b/src/javaClassEditor.ts @@ -0,0 +1,60 @@ +import path = require('path'); +import * as vscode from 'vscode'; +import { Uri, window, ExtensionContext} from "vscode"; +import { getNonce } from "./webviewUtils"; + +class JavaClassDocument implements vscode.CustomDocument { + constructor(uri: Uri) { this.uri = uri; } + uri: Uri; + dispose(): void { } +} + +export class JavaClassEditorProvider implements vscode.CustomReadonlyEditorProvider { + + private context: ExtensionContext; + + openCustomDocument(uri: Uri, openContext: vscode.CustomDocumentOpenContext, token: vscode.CancellationToken): JavaClassDocument { + return new JavaClassDocument(uri); + } + + constructor (context: ExtensionContext) { + this.context = context; + } + + public static readonly viewType = 'decompiled.javaClass'; + + async resolveCustomEditor(document: vscode.CustomDocument, webviewPanel: vscode.WebviewPanel, token: vscode.CancellationToken): Promise { + const nonce: string = getNonce(); + webviewPanel.webview.options = { + enableScripts: true, + localResourceRoots: [Uri.joinPath(Uri.parse(this.context.extensionPath), 'webview-resources')] + }; + const classUri = Uri.parse((document.uri.toString()).replace(/^file/, "class")); + const styleUri = Uri.file( + path.join(this.context.extensionPath, 'webview-resources', 'button.css') + ); + const style: string = ``; + webviewPanel.webview.html = ` + + + + ${style} + + + + + + `; + webviewPanel.webview.onDidReceiveMessage(message => { + switch (message.command) { + case 'decompiled': + webviewPanel.dispose(); + window.showTextDocument(classUri, { preview: false }); + return; + } + }, undefined, this.context.subscriptions); + } +} \ No newline at end of file diff --git a/src/javaRuntimes.ts b/src/javaRuntimes.ts new file mode 100644 index 000000000..4301318d5 --- /dev/null +++ b/src/javaRuntimes.ts @@ -0,0 +1,69 @@ +import { getRuntime, IJavaRuntime } from "jdk-utils"; +import * as vscode from "vscode"; +import { getSupportedJreNames } from "./jdkUtils"; +import { Commands } from "./commands"; +import * as path from "path"; + + +export namespace JavaRuntimes { + function compatible(runtime: IJavaRuntime, jreName: string): boolean { + if (!runtime.version) { + return true; + } + const majorVersion = runtime.version.major; + if (majorVersion === 8) { + return jreName === 'JavaSE-1.8'; + } + const versionStrings = /[0-9]+/g.exec(jreName); + if (versionStrings && versionStrings.length > 0) { + return majorVersion >= parseInt(versionStrings[0]); + } + return false; + } + + export async function initialize(context: vscode.ExtensionContext): Promise { + context.subscriptions.push(vscode.commands.registerCommand(Commands.ADD_JAVA_RUNTIME, async () => { + const lastSelectedDirectory: vscode.Uri | undefined = context.workspaceState.get('java.runtimes.lastSelectedDirectory'); + const directory = await vscode.window.showOpenDialog({ + canSelectFiles: false, + canSelectFolders: true, + canSelectMany: false, + title: 'Select JDK Directory', + defaultUri: lastSelectedDirectory, + }); + if (directory) { + context.workspaceState.update('java.runtimes.lastSelectedDirectory', vscode.Uri.file(path.dirname(directory[0].fsPath))); + const runtime = await getRuntime(directory[0].fsPath, {withVersion: true}); + if (runtime) { + const config = vscode.workspace.getConfiguration('java.configuration').get('runtimes'); + if (Array.isArray(config)) { + const candidates = getSupportedJreNames().filter(name => compatible(runtime, name)).reverse(); + if (candidates.length > 0) { + const name = await vscode.window.showQuickPick(candidates, { + title: 'Select Java Runtime', + }); + if (name) { + const newConfig = { + name: name, + path: directory[0].fsPath, + }; + const index = config.findIndex(r => r.name === name); + if (index >= 0) { + config[index] = newConfig; + } else { + config.push(newConfig); + } + vscode.workspace.getConfiguration('java.configuration').update('runtimes', config, vscode.ConfigurationTarget.Global); + vscode.window.showInformationMessage(`JDK Directory ${directory[0].fsPath} added`); + } + } else { + vscode.window.showErrorMessage('No compatible environment available'); + } + } + } else { + vscode.window.showErrorMessage(`Invalid JDK Directory ${directory[0].fsPath}`); + } + } + })); + } +} \ No newline at end of file diff --git a/src/javaServerStarter.ts b/src/javaServerStarter.ts index 1b01b9437..9b566f372 100644 --- a/src/javaServerStarter.ts +++ b/src/javaServerStarter.ts @@ -1,35 +1,48 @@ import * as fs from 'fs'; -import * as glob from 'glob'; +import * as fse from 'fs-extra'; +import { globSync } from 'glob'; import * as net from 'net'; import * as os from 'os'; import * as path from 'path'; import { ExtensionContext, version, workspace } from 'vscode'; -import { Executable, ExecutableOptions, StreamInfo } from 'vscode-languageclient/node'; +import { Executable, ExecutableOptions, StreamInfo, TransportKind, generateRandomPipeName } from 'vscode-languageclient/node'; import { logger } from './log'; import { addLombokParam, isLombokSupportEnabled } from './lombokSupport'; import { RequirementsData } from './requirements'; -import { getJavaagentFlag, getJavaEncoding, getKey, isInWorkspaceFolder, IS_WORKSPACE_VMARGS_ALLOWED } from './settings'; -import { deleteDirectory, ensureExists, getJavaConfiguration, getTimestamp } from './utils'; - +import { IS_WORKSPACE_VMARGS_ALLOWED, getJavaEncoding, getJavaagentFlag, getKey, isInWorkspaceFolder } from './settings'; +import { deleteDirectory, ensureExists, getJavaConfiguration, getTimestamp, getVersion, getVSCodeVariablesMap, isInsiderEditor, isPrereleaseOrInsiderVersion } from './utils'; // eslint-disable-next-line no-var declare var v8debug; -const DEBUG = (typeof v8debug === 'object') || startedInDebugMode(); +export const DEBUG = (typeof v8debug === 'object') || startedInDebugMode(); /** * Argument that tells the program where to generate the heap dump that is created when an OutOfMemoryError is raised and `HEAP_DUMP` has been passed */ - export const HEAP_DUMP_LOCATION = '-XX:HeapDumpPath='; +export const HEAP_DUMP_LOCATION = '-XX:HeapDumpPath='; + +/** + * Argument that tells the program to generate a heap dump file when an OutOfMemoryError is raised + */ +export const HEAP_DUMP = '-XX:+HeapDumpOnOutOfMemoryError'; - /** - * Argument that tells the program to generate a heap dump file when an OutOfMemoryError is raised - */ - export const HEAP_DUMP = '-XX:+HeapDumpOnOutOfMemoryError'; +/** + * Argument that specifies name of the dependency collector implementation to use. + * `df` for depth-first and `bf` for breadth-first. + * See: https://github.com/apache/maven-resolver/blob/maven-resolver-1.9.7/src/site/markdown/configuration.md + */ +const DEPENDENCY_COLLECTOR_IMPL= '-Daether.dependencyCollector.impl='; +const DEPENDENCY_COLLECTOR_IMPL_BF= 'bf'; -export function prepareExecutable(requirements: RequirementsData, workspacePath, javaConfig, context: ExtensionContext, isSyntaxServer: boolean): Executable { +const UNLOCK_DIAGNOSTIC_VM_OPTIONS= '-XX:+UnlockDiagnosticVMOptions'; +const ALLOW_ARCHIVING_WITH_JAVA_AGENT= '-XX:+AllowArchivingWithJavaAgent'; +const AUTO_CREATE_SHARED_ARCHIVE= '-XX:+AutoCreateSharedArchive'; +const SHARED_ARCHIVE_FILE_LOC= '-XX:SharedArchiveFile='; + +export function prepareExecutable(requirements: RequirementsData, workspacePath, context: ExtensionContext, isSyntaxServer: boolean): Executable { const executable: Executable = Object.create(null); const options: ExecutableOptions = Object.create(null); - options.env = Object.assign({ syntaxserver : isSyntaxServer }, process.env); + options.env = Object.assign({ syntaxserver: isSyntaxServer }, process.env, getVSCodeVariablesMap(), getUnicodeLocaleEnv()); if (os.platform() === 'win32') { const vmargs = getJavaConfiguration().get('jdt.ls.vmargs', ''); const watchParentProcess = '-DwatchParentProcess=false'; @@ -39,10 +52,82 @@ export function prepareExecutable(requirements: RequirementsData, workspacePath, } executable.options = options; executable.command = path.resolve(`${requirements.tooling_jre}/bin/java`); - executable.args = prepareParams(requirements, javaConfig, workspacePath, context, isSyntaxServer); - logger.info(`Starting Java server with: ${executable.command} ${executable.args.join(' ')}`); + executable.args = prepareParams(requirements, workspacePath, context, isSyntaxServer); + const transportKind = getJavaConfiguration().get('transport'); + + switch (transportKind) { + case 'stdio': + executable.transport = TransportKind.stdio; + break; + case 'pipe': + default: + executable.transport = TransportKind.pipe; + try { + generateRandomPipeName(); + } catch (error) { + logger.warn(`Falling back to 'stdio' (from 'pipe') due to : ${error}`); + executable.transport = TransportKind.stdio; + } + break; + } + logger.info(`Starting Java server with: ${executable.command} ${executable.args?.join(' ')}`); return executable; } + +/** + * Environment variables that select the JVM's file name charset on POSIX systems, in the precedence + * order POSIX defines for the `LC_CTYPE` category. The JVM reads them through `setlocale(LC_ALL, "")` + * followed by `ParseLocale(LC_CTYPE, ...)` in `unix/native/libjava/java_props_md.c`. + */ +export const LOCALE_ENV_VARS: string[] = ['LC_ALL', 'LC_CTYPE', 'LANG']; + +/** Locales under which the JVM falls back to ASCII and cannot represent non-ASCII file names. */ +const ASCII_LOCALES: string[] = ['C', 'POSIX', 'C.ASCII']; + +export const UTF8_LOCALE: string = 'C.UTF-8'; + +/** + * On POSIX systems the JVM decodes and encodes file names with `sun.jnu.encoding`, which it derives + * from the process locale at startup. `-Dsun.jnu.encoding=...` is silently ignored, so neither + * `java.jdt.ls.vmargs` nor `-Dfile.encoding` can influence it. + * + * Containers and services routinely start with an unset or `C`/`POSIX` locale, which makes the JVM + * fall back to ASCII. Every workspace file whose name contains non-ASCII characters is then decoded + * into U+FFFD by `JNU_NewStringPlatform` and can no longer be encoded back by `UnixPath.encode`, + * which throws `InvalidPathException: Malformed input or input contains unmappable characters` and + * aborts the whole workspace initialization. + * See https://github.com/microsoft/vscode-java-dependency/issues/1041 + * + * Only the unset/`C`/`POSIX` cases are overridden, so a deliberately configured non-UTF-8 locale + * (e.g. `zh_CN.GBK`, matching file names actually stored in that encoding) is left untouched. When + * the locale has to be corrected, only the `LC_CTYPE` category is set, so message/number/time + * formatting keeps following the environment. + */ +export function getUnicodeLocaleEnv(): { [key: string]: string } { + // Windows is unaffected and does not read these variables: the JVM derives sun.jnu.encoding from + // GetACP() there, and file names never go through a charset because WinNTFileSystem hands the + // UTF-16 WIN32_FIND_DATAW.cFileName straight to NewString and WindowsPath copies the Java String + // into the native buffer verbatim. Injecting POSIX locale variables would only leak into the + // child processes JDT LS spawns. + if (os.platform() === 'win32') { + return {}; + } + const locale = LOCALE_ENV_VARS.map(name => process.env[name]).find(value => !!value); + if (locale && !ASCII_LOCALES.includes(locale)) { + return {}; + } + logger.info(`Locale '${locale ?? ''}' cannot represent non-ASCII file names, starting JDT LS with ${UTF8_LOCALE}`); + const env: { [key: string]: string } = {}; + if (process.env.LC_ALL) { + // LC_ALL overrides every other category, so it has to be replaced when it is the one selecting ASCII. + env.LC_ALL = UTF8_LOCALE; + } else { + // LC_CTYPE is the only category that selects the charset, so leave the others alone. + env.LC_CTYPE = UTF8_LOCALE; + } + return env; +} + export function awaitServerConnection(port): Thenable { const addr = parseInt(port); return new Promise((res, rej) => { @@ -60,7 +145,7 @@ export function awaitServerConnection(port): Thenable { }); } -function prepareParams(requirements: RequirementsData, javaConfiguration, workspacePath, context: ExtensionContext, isSyntaxServer: boolean): string[] { +function prepareParams(requirements: RequirementsData, workspacePath, context: ExtensionContext, isSyntaxServer: boolean): string[] { const params: string[] = []; if (DEBUG) { const port = isSyntaxServer ? 1045 : 1044; @@ -69,6 +154,13 @@ function prepareParams(requirements: RequirementsData, javaConfiguration, worksp // params.push('-agentlib:jdwp=transport=dt_socket,server=y,address=1044'); } + // See https://github.com/eclipse-jdtls/eclipse.jdt.ls/issues/3465 + if (requirements.tooling_jre_version >= 24) { + params.push('-Djdk.xml.maxGeneralEntitySizeLimit=0', + '-Djdk.xml.totalEntitySizeLimit=0' + ); + } + params.push('--add-modules=ALL-SYSTEM', '--add-opens', 'java.base/java.util=ALL-UNNAMED', @@ -77,7 +169,63 @@ function prepareParams(requirements: RequirementsData, javaConfiguration, worksp // See https://github.com/redhat-developer/vscode-java/issues/2264 // It requires the internal API sun.nio.fs.WindowsFileAttributes.isDirectoryLink() to check if a Windows directory is symlink. '--add-opens', - 'java.base/sun.nio.fs=ALL-UNNAMED'); + 'java.base/sun.nio.fs=ALL-UNNAMED' + ); + + const javacEnabled = 'on' === getJavaConfiguration().get('jdt.ls.javac.enabled'); + if (javacEnabled) { + // Javac flags + params.push( + '--add-opens', + 'jdk.compiler/com.sun.tools.javac.main=ALL-UNNAMED', + '--add-opens', + 'jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED', + '--add-opens', + 'jdk.compiler/com.sun.tools.javac.tree=ALL-UNNAMED', + '--add-opens', + 'jdk.compiler/com.sun.tools.javac.api=ALL-UNNAMED', + '--add-opens', + 'jdk.compiler/com.sun.tools.javac.file=ALL-UNNAMED', + '--add-opens', + 'jdk.compiler/com.sun.tools.javac.parser=ALL-UNNAMED', + '--add-opens', + 'jdk.compiler/com.sun.tools.javac.comp=ALL-UNNAMED', + '--add-opens', + 'jdk.compiler/com.sun.tools.javac.code=ALL-UNNAMED', + '--add-opens', + 'jdk.javadoc/jdk.javadoc.internal.doclets.formats.html.taglets.snippet=ALL-UNNAMED', + '--add-opens', + 'jdk.javadoc/jdk.javadoc.internal.doclets.formats.html.taglets=ALL-UNNAMED', + '--add-opens', + 'jdk.compiler/com.sun.tools.javac.processing=ALL-UNNAMED', + '--add-opens', + 'jdk.compiler/com.sun.tools.javac.jvm=ALL-UNNAMED', + '--add-opens', + 'jdk.compiler/com.sun.tools.javac.model=ALL-UNNAMED', + '--add-opens', + 'jdk.compiler/com.sun.tools.javac.platform=ALL-UNNAMED', + '--add-opens', + 'jdk.compiler/com.sun.tools.javac.resources=ALL-UNNAMED', + '--add-opens', + 'java.base/sun.nio.ch=ALL-UNNAMED', + '--add-opens', + 'jdk.zipfs/jdk.nio.zipfs=ALL-UNNAMED', + '--add-opens', + 'java.compiler/javax.tools=ALL-UNNAMED', + '--add-opens', + 'java.base/java.nio.channels=ALL-UNNAMED', + '-DICompilationUnitResolver=org.eclipse.jdt.core.dom.JavacCompilationUnitResolver', + '-DAbstractImageBuilder.compilerFactory=org.eclipse.jdt.internal.javac.JavacCompilerFactory', + '-DCompilationUnit.DOM_BASED_OPERATIONS=true', + '-DSourceIndexer.DOM_BASED_INDEXER=true', + '-DMatchLocator.DOM_BASED_MATCH=true', + '-DIJavaSearchDelegate=org.eclipse.jdt.internal.core.search.DOMJavaSearchDelegate', + ); + + if('dom' === getJavaConfiguration().get('completion.engine')){ + params.push('-DCompilationUnit.codeComplete.DOM_BASED_OPERATIONS=true'); + }; + } params.push('-Declipse.application=org.eclipse.jdt.ls.core.id1', '-Dosgi.bundles.defaultStartLevel=4', @@ -109,6 +257,9 @@ function prepareParams(requirements: RequirementsData, javaConfiguration, worksp } else { vmargs = ''; } + if (vmargs.indexOf('-DDetectVMInstallationsJob.disabled=') < 0) { + params.push('-DDetectVMInstallationsJob.disabled=true'); + } const encodingKey = '-Dfile.encoding='; if (vmargs.indexOf(encodingKey) < 0) { params.push(encodingKey + getJavaEncoding()); @@ -130,11 +281,29 @@ function prepareParams(requirements: RequirementsData, javaConfiguration, worksp if (vmargs.indexOf(HEAP_DUMP_LOCATION) < 0) { params.push(`${HEAP_DUMP_LOCATION}${path.dirname(workspacePath)}`); } + if (vmargs.indexOf(DEPENDENCY_COLLECTOR_IMPL) < 0) { + params.push(`${DEPENDENCY_COLLECTOR_IMPL}${DEPENDENCY_COLLECTOR_IMPL_BF}`); + } const sharedIndexLocation: string = resolveIndexCache(context); if (sharedIndexLocation) { params.push(`-Djdt.core.sharedIndexLocation=${sharedIndexLocation}`); } + + const hasJDWP = params.find((param: string) => param.includes('jdwp')) !== undefined; + const extVersion = getVersion(context.extensionPath); + const globalStoragePath = path.resolve(context.globalStorageUri?.fsPath, extVersion); // .../Code/User/globalStorage/redhat.java/1.42.0/ + const appCDSMode = workspace.getConfiguration().get('java.jdt.ls.appcds.enabled'); + const useAppCDS = (appCDSMode === 'on') || (appCDSMode === 'auto' && (isPrereleaseOrInsiderVersion(context))); + + ensureExists(globalStoragePath); + const sharedArchiveLocation = path.join(globalStoragePath, "jdtls.jsa"); + if (useAppCDS && vmargs.indexOf(SHARED_ARCHIVE_FILE_LOC) < 0 && !hasJDWP) { + params.push(UNLOCK_DIAGNOSTIC_VM_OPTIONS); + params.push(ALLOW_ARCHIVING_WITH_JAVA_AGENT); // required due to use of '-javaagent' + params.push(AUTO_CREATE_SHARED_ARCHIVE); + params.push(`${SHARED_ARCHIVE_FILE_LOC}${sharedArchiveLocation}`); + } } // "OpenJDK 64-Bit Server VM warning: Options -Xverify:none and -noverify @@ -144,8 +313,8 @@ function prepareParams(requirements: RequirementsData, javaConfiguration, worksp params.push('-noverify'); } - const serverHome: string = path.resolve(__dirname, '../server'); - const launchersFound: Array = glob.sync('**/plugins/org.eclipse.equinox.launcher_*.jar', { cwd: serverHome }); + const serverHome: string = process.env.JDT_LS_PATH || path.resolve(__dirname, '../server'); + const launchersFound: Array = globSync('**/plugins/org.eclipse.equinox.launcher_*.jar', { cwd: serverHome }); if (launchersFound.length) { params.push('-jar'); params.push(path.resolve(serverHome, launchersFound[0])); } else { @@ -160,12 +329,12 @@ function prepareParams(requirements: RequirementsData, javaConfiguration, worksp configDir = isSyntaxServer ? 'config_ss_linux' : 'config_linux'; } params.push('-configuration'); + params.push(startedFromSources() || process.env.JDT_LS_PATH !== undefined ? + path.resolve(serverHome, configDir) : resolveConfiguration(context, configDir)); if (startedFromSources()) { // Dev Mode: keep the config.ini in the installation location console.log(`Starting jdt.ls ${isSyntaxServer?'(syntax)' : '(standard)'} from vscode-java sources`); - params.push(path.resolve(__dirname, '../server', configDir)); - } else { - params.push(resolveConfiguration(context, configDir)); } + params.push('-data'); params.push(workspacePath); return params; } @@ -173,7 +342,7 @@ function prepareParams(requirements: RequirementsData, javaConfiguration, worksp function resolveIndexCache(context: ExtensionContext) { let enabled: string = getJavaConfiguration().get("sharedIndexes.enabled"); if (enabled === "auto") { - enabled = version.includes("insider") ? "on" : "off"; + enabled = isInsiderEditor() ? "on" : "off"; } if (enabled !== "on") { @@ -221,15 +390,7 @@ export function getSharedIndexCache(context: ExtensionContext): string { function resolveConfiguration(context, configDir) { ensureExists(context.globalStoragePath); - const extensionPath = path.resolve(context.extensionPath, "package.json"); - const packageFile = JSON.parse(fs.readFileSync(extensionPath, 'utf8')); - let version; - if (packageFile) { - version = packageFile.version; - } - else { - version = '0.0.0'; - } + const version = getVersion(context.extensionPath); let configuration = path.resolve(context.globalStoragePath, version); ensureExists(configuration); configuration = path.resolve(configuration, configDir); @@ -255,7 +416,7 @@ function startedInDebugMode(): boolean { return hasDebugFlag(args); } -function startedFromSources(): boolean { +export function startedFromSources(): boolean { return process.env['DEBUG_VSCODE_JAVA'] === 'true'; } @@ -282,8 +443,16 @@ export function parseVMargs(params: any[], vmargsLine: string) { arg = arg.replace(/(\\)?"/g, ($0, $1) => { return ($1 ? $0 : ''); }); // unescape all escaped double quotes arg = arg.replace(/(\\)"/g, '"'); - if (params.indexOf(arg) < 0) { - params.push(arg); - } + params.push(arg); }); } + +export function removeEquinoxFragmentOnDarwinX64(context: ExtensionContext) { + // https://github.com/redhat-developer/vscode-java/issues/3484 + const extensionPath = context.extensionPath; + const matches = globSync(`${extensionPath}/server/plugins/org.eclipse.equinox.launcher.cocoa.macosx.x86_64*.jar`); + for (const fragment of matches) { + fse.removeSync(fragment); + logger.info(`Removing Equinox launcher fragment : ${fragment}`); + } +} diff --git a/src/jdkUtils.ts b/src/jdkUtils.ts new file mode 100644 index 000000000..5cf801b34 --- /dev/null +++ b/src/jdkUtils.ts @@ -0,0 +1,96 @@ +'use strict'; + +import { existsSync } from 'fs'; +import { IJavaRuntime, findRuntimes, getSources } from 'jdk-utils'; +import { join } from 'path'; +import { ExtensionContext, Uri, workspace } from 'vscode'; + +let cachedJdks: IJavaRuntime[]; +let cachedJreNames: string[]; + +export async function loadSupportedJreNames(context: ExtensionContext): Promise { + const config = await getContributesConfiguration(context, "java.configuration.runtimes"); + cachedJreNames = config?.items?.properties?.name?.enum; +} + +async function getContributesConfiguration(context: ExtensionContext, configId: string): Promise { + const buffer = await workspace.fs.readFile(Uri.file(context.asAbsolutePath("package.json"))); + const packageJson = JSON.parse(buffer.toString()); + /** + * contributes.configuration can either be a single object, + * representing a single category of settings, or an array + * of objects, representing multiple categories of settings. + */ + const categories = packageJson?.contributes?.configuration; + if (Array.isArray(categories)) { + for (const category of categories) { + if (category?.properties?.[configId]) { + return category.properties[configId]; + } + } + } else { + return categories?.properties?.[configId]; + } +} + +export function getSupportedJreNames(): string[] { + return cachedJreNames; +} + +export async function listJdks(force?: boolean): Promise { + if (force || !cachedJdks) { + cachedJdks = await findRuntimes({ checkJavac: true, withVersion: true, withTags: true }) + .then(jdks => jdks.filter(jdk => { + // Validate if it's a real Java Home. + return existsSync(join(jdk.homedir, "lib", "rt.jar")) + || existsSync(join(jdk.homedir, "jre", "lib", "rt.jar")) // Java 8 + || existsSync(join(jdk.homedir, "lib", "jrt-fs.jar")); // Java 9+ + })); + } + + return [].concat(cachedJdks); +} + +/** + * Sort by source where JDk is located. + * The order is: + * 1. JDK_HOME, JAVA_HOME, PATH + * 2. JDK manager such as SDKMAN, jEnv, jabba, asdf + * 3. Common places such as /usr/lib/jvm + * 4. Others + */ +export function sortJdksBySource(jdks: IJavaRuntime[]) { + const rankedJdks = jdks as Array; + const env: string[] = ["JDK_HOME", "JAVA_HOME", "PATH"]; + const jdkManagers: string[] = ["SDKMAN", "jEnv", "jabba", "asdf"]; + for (const jdk of rankedJdks) { + const detectedSources: string[] = getSources(jdk); + for (const [index, source] of env.entries()) { + if (detectedSources.includes(source)) { + jdk.rank = index; // jdk from environment variables + break; + } + } + + if (jdk.rank) { + continue; + } + + const fromManager: boolean = detectedSources.some(source => jdkManagers.includes(source)); + if (fromManager) { + jdk.rank = env.length + 1; // jdk from the jdk managers such as SDKMAN + } else if (!detectedSources.length){ + jdk.rank = env.length + 2; // jdk from common places + } else { + jdk.rank = env.length + 3; // jdk from other source such as ~/.gradle/jdks + } + } + rankedJdks.sort((a, b) => a.rank - b.rank); +} + +/** + * Sort by major version in descend order. + */ +export function sortJdksByVersion(jdks: IJavaRuntime[]) { + jdks.sort((a, b) => (b.version?.major ?? 0) - (a.version?.major ?? 0)); +} diff --git a/src/languageStatusItemFactory.ts b/src/languageStatusItemFactory.ts index 12c310ec8..d647bf6d2 100644 --- a/src/languageStatusItemFactory.ts +++ b/src/languageStatusItemFactory.ts @@ -3,7 +3,6 @@ import * as path from "path"; import * as vscode from "vscode"; import { Commands } from "./commands"; -import { StatusIcon } from "./serverStatusBarProvider"; const languageServerDocumentSelector = [ { scheme: 'file', language: 'java' }, @@ -14,111 +13,40 @@ const languageServerDocumentSelector = [ { pattern: '**/{build,settings}.gradle.kts'} ]; -export function supportsLanguageStatus(): boolean { - return !!vscode.languages.createLanguageStatusItem; -} - export namespace StatusCommands { export const switchToStandardCommand = { title: "Load Projects", command: Commands.SWITCH_SERVER_MODE, - arguments: ["Standard", true], + arguments: ['Standard', true], tooltip: "LightWeight mode only provides limited features, please load projects to get full feature set" }; - export const showServerStatusCommand = { - title: "Show Build Status", - command: Commands.SHOW_SERVER_TASK_STATUS, - tooltip: "Show Build Status" - }; - export const configureJavaRuntimeCommand = { title: "Configure Java Runtime", command: "workbench.action.openSettings", arguments: ["java.configuration.runtimes"], tooltip: "Configure Java Runtime" }; -} - -export namespace ServerStatusItemFactory { - export function create(): any { - if (supportsLanguageStatus()) { - const item = vscode.languages.createLanguageStatusItem("JavaServerStatusItem", languageServerDocumentSelector); - item.name = "Java Language Server Status"; - return item; - } - return undefined; - } - - export function showLightWeightStatus(item: any): void { - item.severity = vscode.LanguageStatusSeverity?.Warning; - item.text = StatusIcon.lightWeight; - item.detail = "Lightweight Mode"; - item.command = StatusCommands.switchToStandardCommand; - } - - export function showStandardStatus(item: any): void { - item.severity = vscode.LanguageStatusSeverity?.Information; - item.command = StatusCommands.showServerStatusCommand; - } - - export function setBusy(item: any): void { - if (item.busy === true) { - return; - } - item.text = "Building"; - item.busy = true; - } - - export function setError(item: any): void { - item.busy = false; - item.severity = vscode.LanguageStatusSeverity?.Error; - item.command = { - title: "Open logs", - command: Commands.OPEN_LOGS - }; - item.text = StatusIcon.error; - item.detail = "Errors occurred in initializing language server"; - } - - export function setWarning(item: any): void { - item.busy = false; - item.severity = vscode.LanguageStatusSeverity?.Error; - item.command = { - title: "Show PROBLEMS Panel", - command: "workbench.panel.markers.view.focus", - tooltip: "Errors occurred in project configurations, click to show the PROBLEMS panel" - }; - item.text = StatusIcon.warning; - item.detail = "Project Configuration Error"; - } - export function setReady(item: any): void { - if (item.text === StatusIcon.ready) { - return; - } - item.busy = false; - item.severity = vscode.LanguageStatusSeverity?.Information; - item.command = StatusCommands.showServerStatusCommand; - item.text = StatusIcon.ready; - item.detail = ""; - } + export const startStandardServerCommand = { + title: "Select Projects...", + command: Commands.SWITCH_SERVER_MODE, + arguments: ['Standard', true], + tooltip: "Select Projects..." + }; } export namespace RuntimeStatusItemFactory { - export function create(text: string, vmInstallPath: string): any { - if (supportsLanguageStatus()) { - const item = vscode.languages.createLanguageStatusItem("javaRuntimeStatusItem", languageServerDocumentSelector); - item.severity = vscode.LanguageStatusSeverity?.Information; - item.name = "Java Runtime"; - item.text = text; - item.command = StatusCommands.configureJavaRuntimeCommand; - if (vmInstallPath) { - item.command.tooltip = `Language Level: ${text} <${vmInstallPath}>`; - } - return item; + export function create(text: string, vmInstallPath: string): vscode.LanguageStatusItem { + const item = vscode.languages.createLanguageStatusItem("javaRuntimeStatusItem", languageServerDocumentSelector); + item.severity = vscode.LanguageStatusSeverity?.Information; + item.name = "Java Runtime"; + item.text = text; + item.command = StatusCommands.configureJavaRuntimeCommand; + if (vmInstallPath) { + item.command.tooltip = `Language Level: ${text} <${vmInstallPath}>`; } - return undefined; + return item; } export function update(item: any, text: string, vmInstallPath: string): void { @@ -128,17 +56,14 @@ export namespace RuntimeStatusItemFactory { } export namespace BuildFileStatusItemFactory { - export function create(buildFilePath: string): any { - if (supportsLanguageStatus()) { - const fileName = path.basename(buildFilePath); - const item = vscode.languages.createLanguageStatusItem("javaBuildFileStatusItem", languageServerDocumentSelector); - item.severity = vscode.LanguageStatusSeverity?.Information; - item.name = "Java Build File"; - item.text = fileName; - item.command = getOpenBuildFileCommand(buildFilePath); - return item; - } - return undefined; + export function create(buildFilePath: string): vscode.LanguageStatusItem { + const fileName = path.basename(buildFilePath); + const item = vscode.languages.createLanguageStatusItem("javaBuildFileStatusItem", languageServerDocumentSelector); + item.severity = vscode.LanguageStatusSeverity?.Information; + item.name = "Java Build File"; + item.text = fileName; + item.command = getOpenBuildFileCommand(buildFilePath); + return item; } export function update(item: any, buildFilePath: string): void { diff --git a/src/lombokSupport.ts b/src/lombokSupport.ts index bfdd77d4e..1ec595d56 100644 --- a/src/lombokSupport.ts +++ b/src/lombokSupport.ts @@ -4,11 +4,10 @@ import * as fse from "fs-extra"; import * as path from "path"; import * as semver from 'semver'; import * as vscode from "vscode"; -import { ExtensionContext, window, commands } from "vscode"; +import { ExtensionContext, window, commands, Uri } from "vscode"; import { Commands } from "./commands"; import { apiManager } from "./apiManager"; -import { supportsLanguageStatus } from "./languageStatusItemFactory"; -import { runtimeStatusBarProvider } from './runtimeStatusBarProvider'; +import { languageStatusBarProvider } from './runtimeStatusBarProvider'; import { logger } from './log'; import { getAllJavaProjects } from "./utils"; @@ -31,6 +30,12 @@ let isLombokCommandInitialized: boolean = false; let isExtensionLombok: boolean = false; // whether use extension's Lombok or not let projectLombokPath: string = undefined; // the project's Lombok classpath +export namespace Lombok { + + export function getActiveLombokPath(): string | undefined { + return activeLombokPath; + } +} export function isLombokSupportEnabled(): boolean { return vscode.workspace.getConfiguration().get("java.jdt.ls.lombokSupport.enabled"); } @@ -62,22 +67,30 @@ function getExtensionLombokPath(context: ExtensionContext): string { return path.join(context.asAbsolutePath("lombok"), files[0]); } -function lombokPath2Version(lombokPath: string): string { - const lombokVersion = lombokJarRegex.exec(lombokPath)[0].split('.jar')[0]; +function lombokPath2Version(lombokPath: string): string | undefined { + const match = lombokJarRegex.exec(lombokPath); + if (!match) { + return undefined; + } + const lombokVersion = match[0].split('.jar')[0]; return lombokVersion; } -function lombokPath2VersionNumber(lombokPath: string): string { - const lombokVersioNumber = lombokPath2Version(lombokPath).split('-')[1]; - return lombokVersioNumber; +function lombokPath2VersionNumber(lombokPath: string): string | undefined { + const lombokVersion = lombokPath2Version(lombokPath); + if (!lombokVersion) { + return undefined; + } + const lombokVersionNumber = lombokVersion.split('-')[1]; + return lombokVersionNumber; } -export function getLombokVersion(): string { - return lombokPath2Version(activeLombokPath); +export function getLombokVersion(): string | undefined { + return lombokPath2VersionNumber(activeLombokPath); } -function isCompatibleLombokVersion(currentVersion: string): boolean { - return semver.gte(currentVersion, compatibleVersion); +function isCompatibleLombokVersion(currentVersion: string | undefined): boolean { + return currentVersion && semver.gte(currentVersion, compatibleVersion); } export function addLombokParam(context: ExtensionContext, params: string[]) { @@ -97,12 +110,14 @@ export function addLombokParam(context: ExtensionContext, params: string[]) { isExtensionLombok = true; let lombokJarPath: string = context.workspaceState.get(JAVA_LOMBOK_PATH); if (lombokJarPath && fse.existsSync(lombokJarPath)) { - if (isCompatibleLombokVersion(lombokPath2VersionNumber(lombokJarPath))) { + const lombokVersion = lombokPath2VersionNumber(lombokJarPath); + if (lombokVersion && isCompatibleLombokVersion(lombokVersion)) { isExtensionLombok = false; } else { cleanupLombokCache(context); - logger.warn(`The project's Lombok version ${lombokPath2VersionNumber(lombokJarPath)} is not supported, Falling back to the built-in Lombok version ${lombokPath2VersionNumber(getExtensionLombokPath(context))}`); + const extensionLombokVersion = lombokPath2VersionNumber(getExtensionLombokPath(context)); + logger.warn(`The project's Lombok version ${lombokVersion || 'unknown'} is not supported, Falling back to the built-in Lombok version ${extensionLombokVersion || 'unknown'}`); } } if (isExtensionLombok) { @@ -118,7 +133,7 @@ export function addLombokParam(context: ExtensionContext, params: string[]) { updateActiveLombokPath(lombokJarPath); } -export async function checkLombokDependency(context: ExtensionContext) { +export async function checkLombokDependency(context: ExtensionContext, projectUri?: Uri) { if (!isLombokSupportEnabled()) { return; } @@ -127,7 +142,7 @@ export async function checkLombokDependency(context: ExtensionContext) { let currentLombokVersion: string = undefined; let previousLombokVersion: string = undefined; let currentLombokClasspath: string = undefined; - const projectUris: string[] = await getAllJavaProjects(); + const projectUris: string[] = projectUri ? [projectUri.toString()] : await getAllJavaProjects(); for (const projectUri of projectUris) { const classpathResult = await apiManager.getApiInstance().getClasspaths(projectUri, {scope: 'test'}); for (const classpath of classpathResult.classpaths) { @@ -150,18 +165,18 @@ export async function checkLombokDependency(context: ExtensionContext) { } projectLombokPath = currentLombokClasspath; /* if projectLombokPath is undefined, it means that this project has not imported Lombok. - * We don't need initalize Lombok status bar in this case. + * We don't need initialize Lombok status bar in this case. */ if (!isLombokStatusBarInitialized && projectLombokPath) { if (!isLombokCommandInitialized) { registerLombokConfigureCommand(context); isLombokCommandInitialized = true; } - runtimeStatusBarProvider.initializeLombokStatusBar(); + languageStatusBarProvider.initializeLombokStatusBar(); isLombokStatusBarInitialized = true; } if (isLombokStatusBarInitialized && !projectLombokPath) { - runtimeStatusBarProvider.destroyLombokStatusBar(); + languageStatusBarProvider.destroyLombokStatusBar(); isLombokStatusBarInitialized = false; cleanupLombokCache(context); } @@ -192,11 +207,11 @@ export function registerLombokConfigureCommand(context: ExtensionContext) { const lombokPathItems = [ { label: isExtensionLombok? extensionItemLabelCheck : extensionItemLabel, - description: lombokPath2Version(extensionLombokPath) + description: `Lombok ${lombokPath2VersionNumber(extensionLombokPath) || 'unknown'}` }, { label: isExtensionLombok? projectItemLabel : projectItemLabelCheck, - description: lombokPath2Version(projectLombokPath), + description: `Lombok ${lombokPath2VersionNumber(projectLombokPath) || 'unknown'}`, detail: projectLombokPath } ]; @@ -217,7 +232,7 @@ export function registerLombokConfigureCommand(context: ExtensionContext) { if (isExtensionLombok) { const projectLombokVersion = lombokPath2VersionNumber(projectLombokPath); if (!isCompatibleLombokVersion(projectLombokVersion)) { - const msg = `The project's Lombok version ${projectLombokVersion} is not supported. Falling back to the built-in Lombok version in the extension.`; + const msg = `The project's Lombok version ${projectLombokVersion || 'unknown'} is not supported. Falling back to the built-in Lombok version in the extension.`; window.showWarningMessage(msg); return; } @@ -245,20 +260,17 @@ export function registerLombokConfigureCommand(context: ExtensionContext) { } export namespace LombokVersionItemFactory { - export function create(text: string): any { - if (supportsLanguageStatus()) { - const item = vscode.languages.createLanguageStatusItem("javaLombokVersionItem", languageServerDocumentSelector); - item.severity = vscode.LanguageStatusSeverity?.Information; - item.name = "Lombok Version"; - item.text = text; - item.command = getLombokChangeCommand(); - return item; - } - return undefined; + export function create(version: string): vscode.LanguageStatusItem { + const item = vscode.languages.createLanguageStatusItem("javaLombokVersionItem", languageServerDocumentSelector); + item.severity = vscode.LanguageStatusSeverity?.Information; + item.name = "Lombok Version"; + update(item, version); + item.command = getLombokChangeCommand(); + return item; } - export function update(item: any, text: string): void { - item.text = text; + export function update(item: any, version: string | undefined): void { + item.text = `Lombok ${version || 'unknown'}`; } function getLombokChangeCommand(): vscode.Command { diff --git a/src/markdownPreviewProvider.ts b/src/markdownPreviewProvider.ts index 9dbe94ea1..ad43e535c 100644 --- a/src/markdownPreviewProvider.ts +++ b/src/markdownPreviewProvider.ts @@ -2,6 +2,7 @@ import { Disposable, WebviewPanel, window, ViewColumn, commands, Uri, Webview, E import * as fse from 'fs-extra'; import * as path from 'path'; import { Commands } from "./commands"; +import { getNonce } from "./webviewUtils"; class MarkdownPreviewProvider implements Disposable { private panel: WebviewPanel | undefined; @@ -42,7 +43,7 @@ class MarkdownPreviewProvider implements Disposable { } protected async getHtmlContent(webview: Webview, markdownFilePath: string, section: string, context: ExtensionContext): Promise { - const nonce: string = this.getNonce(); + const nonce: string = getNonce(); const styles: string = this.getStyles(webview, context); let body: string | undefined = this.documentCache.get(markdownFilePath); if (!body) { @@ -93,15 +94,6 @@ class MarkdownPreviewProvider implements Disposable { ]; return styles.map((styleUri: Uri) => ``).join('\n'); } - - private getNonce(): string { - let text = ""; - const possible = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'; - for (let i = 0; i < 32; i++) { - text += possible.charAt(Math.floor(Math.random() * possible.length)); - } - return text; - } } export const markdownPreviewProvider: MarkdownPreviewProvider = new MarkdownPreviewProvider(); diff --git a/src/outline/extendedOutlineQuickPick.ts b/src/outline/extendedOutlineQuickPick.ts new file mode 100644 index 000000000..79c4e2b40 --- /dev/null +++ b/src/outline/extendedOutlineQuickPick.ts @@ -0,0 +1,81 @@ +import { DocumentSymbolParams, LanguageClient, TextDocumentIdentifier } from "vscode-languageclient/node"; +import { getActiveLanguageClient } from "../extension"; +import { ExtendedDocumentSymbolRequest } from "./protocol"; +import { Location, Position, QuickPick, QuickPickItem, Uri, window, workspace } from "vscode"; +import { getLThemeIcon } from "../themeUtils"; + +export class ExtendedOutlineQuickPick { + private api: QuickPick; + private client: LanguageClient; + public initialized: boolean; + + constructor() { + this.initialized = false; + } + + async initialize() { + this.api = window.createQuickPick(); + this.api.ignoreFocusOut = true; + this.api.onDidChangeActive((items: QuickPickItem[]) => { + if (items.length > 0) { + const active: QuickPickItem = items[0]; + const uri = active["uri"]; + const range = active["range"]; + if (uri !== undefined) { + workspace.openTextDocument(Uri.parse(uri)).then(doc => { + window.showTextDocument(doc, {preserveFocus: true, selection: range}); + }); + } else { + window.showTextDocument(window.activeTextEditor.document, {preserveFocus: true, selection: range}); + } + } + }); + this.api.onDidAccept(() => { + this.api.hide(); + }); + this.client = await getActiveLanguageClient(); + this.initialized = true; + } + + async open(uri: Uri) { + if (!this.initialized) { + await this.initialize(); + } + + if (!this.api) { + return; + } + + const location = new Location(uri, new Position(0, 0)); + const params: DocumentSymbolParams = { + textDocument: TextDocumentIdentifier.create(location.uri.toString()) + }; + const symbols = await this.client.sendRequest(ExtendedDocumentSymbolRequest.type, params); + let quickPickItems: QuickPickItem[] = []; + for (const s of symbols) { + const icon = getLThemeIcon(s.kind).id; + const item = { + label: `$(${icon}) ${s.name}`, + description: s.detail.trim(), + uri: s.uri, + range: s.range + }; + quickPickItems.push(item); + if (icon === 'symbol-class' || icon === 'symbol-interface') { + const items: QuickPickItem[] = s.children.map(s => ({ + label: `$(${getLThemeIcon(s.kind).id}) ${s.name}`, + // custom quick pick has automatic space between label & description + description: s.detail.trim(), + uri: s.uri, + range: s.range + })); + quickPickItems = quickPickItems.concat(items); + } + } + this.api.items = quickPickItems; + this.api.activeItems = []; + this.api.show(); + } +} + +export const extendedOutlineQuickPick: ExtendedOutlineQuickPick = new ExtendedOutlineQuickPick(); diff --git a/src/outline/protocol.ts b/src/outline/protocol.ts new file mode 100644 index 000000000..ffba1508a --- /dev/null +++ b/src/outline/protocol.ts @@ -0,0 +1,10 @@ +import { DocumentSymbol, DocumentSymbolParams, RequestType } from "vscode-languageclient"; + +export namespace ExtendedDocumentSymbolRequest { + export const type = new RequestType('java/extendedDocumentSymbol'); +} + +export interface ExtendedDocumentSymbol extends DocumentSymbol { + uri: string; + children?: ExtendedDocumentSymbol[]; +} \ No newline at end of file diff --git a/src/pasteAction.ts b/src/pasteAction.ts index c500f0f3e..e5e03d9d7 100644 --- a/src/pasteAction.ts +++ b/src/pasteAction.ts @@ -1,9 +1,11 @@ 'use strict'; -import { commands, env, ExtensionContext, Range, TextEditor, window } from 'vscode'; +import { TextEncoder } from 'util'; +import { commands, env, ExtensionContext, Range, TextEditor, Uri, window, workspace } from 'vscode'; import { LanguageClient } from 'vscode-languageclient/node'; - +import { apiManager } from './apiManager'; import { Commands } from './commands'; +import fs = require('fs'); export function registerCommands(languageClient: LanguageClient, context: ExtensionContext) { context.subscriptions.push(commands.registerCommand(Commands.CLIPBOARD_ONPASTE, () => { @@ -12,6 +14,7 @@ export function registerCommands(languageClient: LanguageClient, context: Extens } export async function registerOrganizeImportsOnPasteCommand(): Promise { + const clipboardText: string = await env.clipboard.readText(); const editor: TextEditor = window.activeTextEditor; const documentText: string = editor.document.getText(); @@ -37,8 +40,12 @@ export async function registerOrganizeImportsOnPasteCommand(): Promise { }); action.then((wasApplied) => { - const fileURI = editor.document.uri.toString(); - if (wasApplied && fileURI.endsWith(".java")) { + if (wasApplied && editor.document.languageId === "java") { + const updateImportsOnPasteEnabled = workspace.getConfiguration().get("java.updateImportsOnPaste.enabled", true); + if (!updateImportsOnPasteEnabled) { + return; + } + const fileURI = editor.document.uri.toString(); const hasText: boolean = documentText !== null && /\S/.test(documentText); if (hasText) { // Organize imports silently to avoid surprising the user @@ -48,4 +55,32 @@ export async function registerOrganizeImportsOnPasteCommand(): Promise { } } }); +} + +let serverReady = false; + +export async function pasteFile(folder: fs.PathLike): Promise { + const clipboardText: string = await env.clipboard.readText(); + let filePath = folder.toString(); + fs.stat(folder, async (err, stats) => { + // If given path to selected folder is invalid (no folder is selected) + if (filePath === clipboardText || stats.isFile() || (filePath === "." && workspace.workspaceFolders !== undefined)) { + filePath = workspace.workspaceFolders[0].uri.fsPath; + } + if (!serverReady) { + await apiManager.getApiInstance().serverReady().then( async () => { + serverReady = true; + }); + } + const fileString: string = await commands.executeCommand(Commands.EXECUTE_WORKSPACE_COMMAND, Commands.RESOLVE_PASTED_TEXT, filePath, clipboardText); + const fileUri = fileString !== null ? Uri.file(fileString) : null; + if (fileUri !== null){ + try { + await workspace.fs.writeFile(fileUri, new TextEncoder().encode(clipboardText)); + window.showTextDocument(fileUri, { preview: false }); + } catch (error: unknown) { + // Do nothing (file does not have write permissions) + } + } + }); } \ No newline at end of file diff --git a/src/pasteEventHandler.ts b/src/pasteEventHandler.ts index cff25bd4f..c93cc0376 100644 --- a/src/pasteEventHandler.ts +++ b/src/pasteEventHandler.ts @@ -1,12 +1,14 @@ -import { CancellationToken, commands, DataTransfer, DocumentPasteEdit as VDocumentPasteEdit, DocumentPasteEditProvider, DocumentPasteProviderMetadata, ExtensionContext, languages, Range, TextDocument, window } from "vscode"; +import { CancellationToken, commands, DataTransfer, DocumentPasteEdit as VDocumentPasteEdit, DocumentPasteEditProvider, DocumentPasteProviderMetadata, ExtensionContext, languages, Range, TextDocument, window, DocumentPasteEditContext, ProviderResult, DocumentPasteEdit, version } from "vscode"; import { FormattingOptions, Location, WorkspaceEdit as PWorkspaceEdit } from "vscode-languageclient"; import { LanguageClient } from "vscode-languageclient/node"; import { Commands } from "./commands"; import { JAVA_SELECTOR } from "./standardLanguageClient"; +import * as semver from 'semver'; const TEXT_MIMETYPE: string = "text/plain"; const MIMETYPES: DocumentPasteProviderMetadata = { - pasteMimeTypes: [TEXT_MIMETYPE] + pasteMimeTypes: [TEXT_MIMETYPE], + providedPasteEditKinds: [] }; /** @@ -53,6 +55,7 @@ class PasteEditProvider implements DocumentPasteEditProvider { this.languageClient = languageClient; } + async prepareDocumentPaste?(document: TextDocument, _ranges: readonly Range[], dataTransfer: DataTransfer, _token: CancellationToken): Promise { const copiedContent: string = await dataTransfer.get(TEXT_MIMETYPE).asString(); if (copiedContent) { @@ -61,15 +64,23 @@ class PasteEditProvider implements DocumentPasteEditProvider { } } - async provideDocumentPasteEdits(document: TextDocument, ranges: readonly Range[], dataTransfer: DataTransfer, token: CancellationToken): Promise { + async provideDocumentPasteEdits?(document: TextDocument, ranges: readonly Range[], dataTransfer: DataTransfer, context: DocumentPasteEditContext, token: CancellationToken): Promise { + const insertText: string = await dataTransfer.get(TEXT_MIMETYPE).asString(); // don't try to provide for multi character inserts; the implementation will get messy and the feature won't be that helpful - if (!insertText || token.isCancellationRequested || ranges.length !== 1) { + if (!insertText || (!!token && token.isCancellationRequested) || ranges.length !== 1) { return null; } + const editorData = dataTransfer.get("vscode-editor-data")?.value; + const isSingleLineCopy = Boolean(editorData && JSON.parse(editorData).isFromEmptySelection); + const isFromSameDocument = this.copiedContent === insertText && this.copiedDocumentUri === document.uri.toString(); + if (isSingleLineCopy && isFromSameDocument) { + return undefined; // Let VS Code handle this normally + } + const range = ranges[0]; const location: Location = { @@ -92,10 +103,15 @@ class PasteEditProvider implements DocumentPasteEditProvider { try { const pasteResponse: PDocumentPasteEdit = await commands.executeCommand(Commands.EXECUTE_WORKSPACE_COMMAND, Commands.HANDLE_PASTE_EVENT, JSON.stringify(pasteEventParams)); if (pasteResponse) { - return { + const pasteEdit = { insertText: pasteResponse.insertText, additionalEdit: pasteResponse.additionalEdit ? await this.languageClient.protocol2CodeConverter.asWorkspaceEdit(pasteResponse.additionalEdit) : undefined - } as VDocumentPasteEdit; + }; + if (semver.lt(version, '1.88.0')) { + return pasteEdit as DocumentPasteEdit; + } else { + return [ pasteEdit ] as DocumentPasteEdit[]; + } } } catch (e) { // Do nothing diff --git a/src/plugin.ts b/src/plugin.ts index 886ef2c52..d35dcdaaf 100644 --- a/src/plugin.ts +++ b/src/plugin.ts @@ -8,6 +8,46 @@ import { extensions } from 'vscode'; export let existingExtensions: Array = []; export let buildFilePatterns: Array = []; +let javaShortcuts: Array | undefined; +export interface IJavaShortcut { + title: string; + command: string; + arguments?: any[]; +} +export function getShortcuts(): Array { + if (javaShortcuts === undefined) { + javaShortcuts = []; + const selfOwnedShortcuts = getShortcutsRegistration(extensions.getExtension(EXTENSION_ID)); + if (selfOwnedShortcuts) { + javaShortcuts.push(...selfOwnedShortcuts); + } + for (const extension of extensions.all) { + if (extension.id === EXTENSION_ID) { + continue; + } + const shortcuts = getShortcutsRegistration(extension); + if (shortcuts) { + javaShortcuts.push(...shortcuts); + } + } + } + return javaShortcuts; +} + +function getShortcutsRegistration(extension: vscode.Extension): Array | undefined { + if (!extension) { + return undefined; + } + const contributesSection = extension.packageJSON['contributes']; + if (contributesSection) { + const shortcuts = contributesSection['javaShortcuts']; + if (shortcuts && Array.isArray(shortcuts) && shortcuts.length) { + return shortcuts; + } + } + return undefined; +} + export function collectJavaExtensions(extensions: readonly vscode.Extension[]): string[] { const result = []; if (extensions && extensions.length) { @@ -97,3 +137,32 @@ export function isContributedPartUpdated(oldContributedPart: Array, newC } return hasChanged; } + +export function getContributedBuildTools(): IBuildTool[] { + const buildTypes: IBuildTool[] = []; + for (const extension of extensions.all) { + const javaBuildTools: IBuildTool[] = extension.packageJSON.contributes?.javaBuildTools; + if (!Array.isArray(javaBuildTools)) { + continue; + } + + for (const buildType of javaBuildTools) { + if (!isValidBuildTypeConfiguration(buildType)) { + continue; + } + buildTypes.push(buildType); + } + } + return buildTypes; +} + +export interface IBuildTool { + displayName: string; + buildFileNames: string[]; +} + +function isValidBuildTypeConfiguration(buildType: IBuildTool): boolean { + return !!buildType.displayName && !!buildType.buildFileNames; +} + +const EXTENSION_ID = 'redhat.java'; diff --git a/src/promiseUtil.ts b/src/promiseUtil.ts new file mode 100644 index 000000000..b38510e68 --- /dev/null +++ b/src/promiseUtil.ts @@ -0,0 +1,13 @@ +export class Deferred { + readonly promise: Promise; + + resolve: (result: T) => void; + reject: (error: any) => void; + + constructor() { + this.promise= new Promise((resolve, reject) => { + this.resolve = resolve; + this.reject = reject; + }); + } +} diff --git a/src/protocol.ts b/src/protocol.ts index cabf992f3..6e9f61b9d 100644 --- a/src/protocol.ts +++ b/src/protocol.ts @@ -1,5 +1,6 @@ 'use strict'; +import { Command, Range } from 'vscode'; import { CodeActionParams, ExecuteCommandParams, @@ -13,7 +14,6 @@ import { WorkspaceEdit, WorkspaceSymbolParams, } from 'vscode-languageclient'; -import { Command, Range } from 'vscode'; /** * The message type. Copied from vscode protocol @@ -58,8 +58,10 @@ export enum FeatureStatus { export enum EventType { classpathUpdated = 100, projectsImported = 200, + projectsDeleted = 210, incompatibleGradleJdkIssue = 300, - upgradeGradleWrapper = 400, + upgradeGradleWrapper = 400, + sourceInvalidated = 500, } export enum CompileWorkspaceStatus { @@ -76,25 +78,27 @@ export enum AccessorKind { } export interface StatusReport { - message: string; - type: string; + message: string; + type: string; } export interface ProgressReport { - id: string; - task: string; - subTask: string; - status: string; - workDone: number; - totalWork: number; - complete: boolean; + token: string; + value: any; + complete: boolean; +} + +export enum ProgressKind { + begin = "begin", + report = "report", + end = "end" } export interface ActionableMessage { - severity: MessageType; - message: string; - data?: any; - commands?: Command[]; + severity: MessageType; + message: string; + data?: any; + commands?: Command[]; } export interface EventNotification { @@ -103,11 +107,12 @@ export interface EventNotification { } export namespace StatusNotification { - export const type = new NotificationType('language/status'); + export const type = new NotificationType('language/status'); } -export namespace ProgressReportNotification { - export const type = new NotificationType('language/progressReport'); +// See https://github.com/microsoft/vscode-languageserver-node/blob/release/client/8.1.0/jsonrpc/src/common/connection.ts#L53-L55 +export namespace ProgressNotification { + export const type = new NotificationType('$/progress'); } export namespace ClassFileContentsRequest { @@ -179,8 +184,8 @@ export interface OverridableMethod { } export interface OverridableMethodsResponse { - type: string; - methods: OverridableMethod[]; + type: string; + methods: OverridableMethod[]; } export namespace ListOverridableMethodsRequest { @@ -228,6 +233,10 @@ export namespace OrganizeImportsRequest { export const type = new RequestType('java/organizeImports'); } +export namespace CleanupRequest { + export const type = new RequestType('java/cleanup'); +} + export interface ImportCandidate { fullyQualifiedName: string; id: string; @@ -341,9 +350,10 @@ export interface RenamePosition { } export interface RefactorWorkspaceEdit { - edit: WorkspaceEdit; + edit?: WorkspaceEdit; command?: Command; errorMessage?: string; + confirmationToken?: string; } export interface GetRefactorEditParams { @@ -357,6 +367,10 @@ export namespace GetRefactorEditRequest { export const type = new RequestType('java/getRefactorEdit'); } +export namespace GetChangeSignatureInfoRequest { + export const type = new RequestType('java/getChangeSignatureInfo'); +} + export interface SelectionInfo { name: string; length: number; @@ -364,6 +378,16 @@ export interface SelectionInfo { params?: string[]; } +export interface ChangeSignatureInfo { + methodIdentifier: string; + modifier: string; + returnType: string; + methodName: string; + parameters: any; + exceptions: any; + errorMessage: string; +} + export interface InferSelectionParams { command: string; context: CodeActionParams; @@ -388,6 +412,7 @@ export interface MoveParams { params: CodeActionParams; destination?: any; updateReferences?: boolean; + confirmationToken?: string; } export interface MoveDestinationsResponse { @@ -443,9 +468,9 @@ export interface GradleCompatibilityInfo { } export interface UpgradeGradleWrapperInfo { - projectUri: string; - message: string; - recommendedGradleVersion: string; + projectUri: string; + message: string; + recommendedGradleVersion: string; } export interface Member { @@ -464,3 +489,20 @@ export interface CheckExtractInterfaceStatusResponse { export namespace CheckExtractInterfaceStatusRequest { export const type = new RequestType('java/checkExtractInterfaceStatus'); } + +export interface ValidateDocumentParams { + textDocument: TextDocumentIdentifier; +} + +export namespace ValidateDocumentNotification { + export const type = new NotificationType('java/validateDocument'); +} + +export interface SourceInvalidatedEvent { + /** + * The package fragment roots that get new source attachments. + * The key is its root path, the value means if its source is + * automatically downloaded. + */ + affectedRootPaths: { [key: string]: boolean }; +} diff --git a/src/providerDispatcher.ts b/src/providerDispatcher.ts index 0b6b0e2ce..abacbe141 100644 --- a/src/providerDispatcher.ts +++ b/src/providerDispatcher.ts @@ -5,7 +5,7 @@ import { DocumentSymbol as clientDocumentSymbol, DocumentSymbolRequest, HoverReq import { LanguageClient } from "vscode-languageclient/node"; import { apiManager } from "./apiManager"; import { Commands } from "./commands"; -import { getActiveLanguageClient } from "./extension"; +import { fixJdtLinksInDocumentation, getActiveLanguageClient } from "./extension"; import { createClientHoverProvider } from "./hoverAction"; import { ClassFileContentsRequest } from "./protocol"; import { ServerMode } from "./settings"; @@ -28,10 +28,13 @@ export function registerClientProviders(context: ExtensionContext, options: Prov const jdtProvider = createJDTContentProvider(options); context.subscriptions.push(workspace.registerTextDocumentContentProvider('jdt', jdtProvider)); + const classProvider = createClassContentProvider(options); + context.subscriptions.push(workspace.registerTextDocumentContentProvider('class', classProvider)); + overwriteWorkspaceSymbolProvider(context); return { - handles: [hoverProvider, symbolProvider, jdtProvider] + handles: [hoverProvider, symbolProvider, jdtProvider, classProvider] }; } @@ -81,6 +84,27 @@ function createJDTContentProvider(options: ProviderOptions): TextDocumentContent }; } +function createClassContentProvider(options: ProviderOptions): TextDocumentContentProvider { + return { + onDidChange: options.contentProviderEvent, + provideTextDocumentContent: async (uri: Uri, token: CancellationToken): Promise => { + const languageClient: LanguageClient | undefined = await getActiveLanguageClient(); + + if (!languageClient) { + return ''; + } + const originalUri = uri.toString().replace(/^class/, "file"); + const decompiledContent: string = await commands.executeCommand(Commands.EXECUTE_WORKSPACE_COMMAND, Commands.GET_DECOMPILED_SOURCE, originalUri); + if (!decompiledContent) { + console.log(`Error while getting decompiled source : ${originalUri}`); + return "Error while getting decompiled source."; + } else { + return decompiledContent; + } + } + }; +} + function createDocumentSymbolProvider(): DocumentSymbolProvider { return { provideDocumentSymbols: async (document: TextDocument, token: CancellationToken): Promise => { @@ -109,7 +133,7 @@ function createDocumentSymbolProvider(): DocumentSymbolProvider { const START_OF_DOCUMENT = new Range(new Position(0, 0), new Position(0, 0)); -function createWorkspaceSymbolProvider(existingWorkspaceSymbolProvider: WorkspaceSymbolProvider): WorkspaceSymbolProvider { +function createWorkspaceSymbolProvider(existingWorkspaceSymbolProvider: WorkspaceSymbolProvider): WorkspaceSymbolProvider { return { provideWorkspaceSymbols: async (query: string, token: CancellationToken) => { // This is a workaround until vscode add support for qualified symbol search which is tracked by @@ -159,12 +183,12 @@ function createWorkspaceSymbolProvider(existingWorkspaceSymbolProvider: Workspac } function overwriteWorkspaceSymbolProvider(context: ExtensionContext): void { - const disposable = apiManager.getApiInstance().onDidServerModeChange( async (mode) => { + const disposable = apiManager.getApiInstance().onDidServerModeChange(async (mode) => { if (mode === ServerMode.standard) { - const feature = (await getActiveLanguageClient()).getFeature(WorkspaceSymbolRequest.method); + const feature = (await getActiveLanguageClient()).getFeature(WorkspaceSymbolRequest.method); const providers = feature.getProviders(); if (providers && providers.length > 0) { - feature.dispose(); + feature.clear(); const workspaceSymbolProvider = createWorkspaceSymbolProvider(providers[0]); context.subscriptions.push(languages.registerWorkspaceSymbolProvider(workspaceSymbolProvider)); disposable.dispose(); @@ -173,8 +197,6 @@ function overwriteWorkspaceSymbolProvider(context: ExtensionContext): void { }); } -const REPLACE_JDT_LINKS_PATTERN: RegExp = /(\[(?:[^\]])+\]\()(jdt:\/\/(?:(?:(?:\\\))|([^)]))+))\)/g; - /** * Returns the hover with all jdt:// links replaced with a command:// link that opens the jdt URI. * @@ -185,17 +207,17 @@ const REPLACE_JDT_LINKS_PATTERN: RegExp = /(\[(?:[^\]])+\]\()(jdt:\/\/(?:(?:(?:\ * @param hover The hover to fix the jdt:// links for * @returns the hover with all jdt:// links replaced with a command:// link that opens the jdt URI */ -function fixJdtSchemeHoverLinks(hover: Hover): Hover { - const newContents: (MarkedString|MarkdownString)[] = []; +export function fixJdtSchemeHoverLinks(hover: Hover): Hover { + const newContents: (MarkedString | MarkdownString)[] = []; for (const content of hover.contents) { if (content instanceof MarkdownString) { - const newContent: string = (content).value.replace(REPLACE_JDT_LINKS_PATTERN, (_substring, group1, group2) => { - const uri = `command:${Commands.OPEN_FILE}?${encodeURI(JSON.stringify([encodeURIComponent(group2)]))}`; - return `${group1}${uri})`; - }); - const mdString = new MarkdownString(newContent); - mdString.isTrusted = true; - newContents.push(mdString); + // Skip our own trusted contributed commands (e.g. "Go to Super Implementation"); + // only sanitize untrusted server-provided Javadoc. + if (content.isTrusted) { + newContents.push(content); + } else { + newContents.push(fixJdtLinksInDocumentation(content)); + } } else { newContents.push(content); } diff --git a/src/recommendation/dependencyAnalytics.ts b/src/recommendation/dependencyAnalytics.ts deleted file mode 100644 index 9f74aa2b5..000000000 --- a/src/recommendation/dependencyAnalytics.ts +++ /dev/null @@ -1,35 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. - -'use strict'; - -import * as vscode from "vscode"; -import { IHandler } from "./handler"; - -const EXTENSION_NAME = "redhat.fabric8-analytics"; -const GH_ORG_URL = `https://github.com/fabric8-analytics`; -const RECOMMENDATION_MESSAGE = `Do you want to install the [Dependency Analytics](${GH_ORG_URL}) extension to stay informed about vulnerable dependencies in pom.xml files?`; -const JAVA_DEPENDENCY_ANALYTICS_SHOW = "java.recommendations.dependency.analytics.show"; - -function isPomDotXml(uri: vscode.Uri) { - return !!uri.path && uri.path.toLowerCase().endsWith("pom.xml"); -} - -export function initialize (context: vscode.ExtensionContext, handler: IHandler): void { - const show = vscode.workspace.getConfiguration().get(JAVA_DEPENDENCY_ANALYTICS_SHOW); - if (!show) { - return; - } - if (!handler.canRecommendExtension(EXTENSION_NAME)) { - return; - } - context.subscriptions.push(vscode.workspace.onDidOpenTextDocument(e => { - if (isPomDotXml(e.uri)) { - handler.handle(EXTENSION_NAME, RECOMMENDATION_MESSAGE); - } - })); - - const isPomDotXmlOpened = vscode.workspace.textDocuments.findIndex(doc => isPomDotXml(doc.uri)) !== -1; - if (isPomDotXmlOpened) { - handler.handle(EXTENSION_NAME, RECOMMENDATION_MESSAGE); - } -} diff --git a/src/recommendation/handler.ts b/src/recommendation/handler.ts deleted file mode 100644 index 25a66139a..000000000 --- a/src/recommendation/handler.ts +++ /dev/null @@ -1,6 +0,0 @@ -'use strict'; - -export interface IHandler { - handle(extName: string, message: string): Promise; - canRecommendExtension(extName: string): boolean; -} diff --git a/src/recommendation/handlerImpl.ts b/src/recommendation/handlerImpl.ts deleted file mode 100644 index 78027ba51..000000000 --- a/src/recommendation/handlerImpl.ts +++ /dev/null @@ -1,64 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. - -'use strict'; - -import * as vscode from "vscode"; -import { IHandler } from "./handler"; - -const KEY_RECOMMENDATION_USER_CHOICE_MAP = "recommendationUserChoice"; - -async function installExtensionCmdHandler(extensionName: string, displayName: string) { - return vscode.window.withProgress({ location: vscode.ProgressLocation.Notification, title: `Installing ${displayName||extensionName}...`}, progress => { - return vscode.commands.executeCommand("workbench.extensions.installExtension", extensionName); - }).then(() => { - vscode.window.showInformationMessage(`Successfully installed ${displayName||extensionName}.`); - }); -} - -enum UserChoice { - install = "Install", - never = "Never", - later = "Later", -} - -export class HandlerImpl implements IHandler { - userChoice: any; - storeUserChoice: any; - constructor(context: vscode.ExtensionContext) { - this.userChoice = () => { - return context.globalState.get(KEY_RECOMMENDATION_USER_CHOICE_MAP, {}); - }; - - this.storeUserChoice = (choice: object) => { - context.globalState.update(KEY_RECOMMENDATION_USER_CHOICE_MAP, choice); - }; - } - - isExtensionInstalled(extName: string): boolean { - return !!vscode.extensions.getExtension(extName); - } - - canRecommendExtension(extName: string): boolean { - return this.userChoice()[extName] !== UserChoice.never && !this.isExtensionInstalled(extName); - } - - async handle(extName: string, message: string): Promise { - if (this.isExtensionInstalled(extName)) { - return; - } - - const choice = this.userChoice(); - if (choice[extName] === UserChoice.never) { - return; - } - - const actions: Array = Object.values(UserChoice); - const answer = await vscode.window.showInformationMessage(message, ...actions); - if (answer === UserChoice.install) { - await installExtensionCmdHandler(extName, extName); - } - - choice[extName] = answer; - this.storeUserChoice(choice); - } -} diff --git a/src/recommendation/index.ts b/src/recommendation/index.ts deleted file mode 100644 index 7a46fb630..000000000 --- a/src/recommendation/index.ts +++ /dev/null @@ -1,12 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. - -'use strict'; - -import * as vscode from "vscode"; -import { HandlerImpl } from "./handlerImpl"; -import { initialize as initDependencyAnalytics } from "./dependencyAnalytics"; - -export function initialize (context: vscode.ExtensionContext) { - const handler = new HandlerImpl(context); - initDependencyAnalytics(context, handler); -} diff --git a/src/refactorAction.ts b/src/refactorAction.ts index bc90e103d..b675f6408 100644 --- a/src/refactorAction.ts +++ b/src/refactorAction.ts @@ -6,7 +6,8 @@ import { commands, ExtensionContext, Position, QuickPickItem, TextDocument, Uri, import { FormattingOptions, WorkspaceEdit, RenameFile, DeleteFile, TextDocumentEdit, CodeActionParams, SymbolInformation } from 'vscode-languageclient'; import { LanguageClient } from 'vscode-languageclient/node'; import { Commands as javaCommands } from './commands'; -import { GetRefactorEditRequest, MoveRequest, RefactorWorkspaceEdit, RenamePosition, GetMoveDestinationsRequest, SearchSymbols, SelectionInfo, InferSelectionRequest } from './protocol'; +import { GetRefactorEditRequest, MoveRequest, RefactorWorkspaceEdit, RenamePosition, GetMoveDestinationsRequest, SearchSymbols, SelectionInfo, InferSelectionRequest, GetChangeSignatureInfoRequest, ChangeSignatureInfo, MoveParams } from './protocol'; +import { ChangeSignaturePanel } from './refactoring/changeSignaturePanel'; import { getExtractInterfaceArguments, revealExtractedInterface } from './refactoring/extractInterface'; export function registerCommands(languageClient: LanguageClient, context: ExtensionContext) { @@ -40,6 +41,7 @@ function registerApplyRefactorCommand(languageClient: LanguageClient, context: E || command === 'extractMethod' || command === 'extractField' || command === 'extractInterface' + || command === 'changeSignature' || command === 'assignField' || command === 'convertVariableToField' || command === 'invertVariable' @@ -109,6 +111,14 @@ function registerApplyRefactorCommand(languageClient: LanguageClient, context: E return; } commandArguments.push(...args); + } else if (command === 'changeSignature') { + const changeSignatureInfo: ChangeSignatureInfo = await languageClient.sendRequest(GetChangeSignatureInfoRequest.type, params); + if (changeSignatureInfo.errorMessage !== undefined) { + window.showWarningMessage(changeSignatureInfo.errorMessage); + return; + } + ChangeSignaturePanel.render(context.extensionUri, languageClient, command, params, formattingOptions, changeSignatureInfo); + return; } const result: RefactorWorkspaceEdit = await languageClient.sendRequest(GetRefactorEditRequest.type, { @@ -242,6 +252,32 @@ async function applyRefactorEdit(languageClient: LanguageClient, refactorEdit: R } } +async function requestMoveWithConfirmation(languageClient: LanguageClient, moveParams: MoveParams): Promise { + let refactorEdit: RefactorWorkspaceEdit = await languageClient.sendRequest(MoveRequest.type, moveParams); + if (!refactorEdit?.confirmationToken) { + await applyRefactorEdit(languageClient, refactorEdit); + return refactorEdit; + } + + const continueAction = 'Continue'; + const detail = 'Review the details below before continuing:\n\n' + refactorEdit.errorMessage; + const selection = await window.showWarningMessage( + 'This refactoring may change program behavior. Continue anyway?', + { modal: true, detail }, + continueAction, + ); + if (selection !== continueAction) { + return undefined; + } + + refactorEdit = await languageClient.sendRequest(MoveRequest.type, { + ...moveParams, + confirmationToken: refactorEdit.confirmationToken, + }); + await applyRefactorEdit(languageClient, refactorEdit); + return refactorEdit; +} + async function moveFile(languageClient: LanguageClient, fileUris: Uri[]) { if (!hasCommonParent(fileUris)) { window.showErrorMessage("Moving files from different directories are not supported. Please make sure they are from the same directory."); @@ -407,13 +443,12 @@ async function moveInstanceMethod(languageClient: LanguageClient, params: CodeAc return; } - const refactorEdit: RefactorWorkspaceEdit = await languageClient.sendRequest(MoveRequest.type, { + await requestMoveWithConfirmation(languageClient, { moveKind: 'moveInstanceMethod', sourceUris: [ params.textDocument.uri ], params, destination: selected.destination, }); - await applyRefactorEdit(languageClient, refactorEdit); } async function moveStaticMember(languageClient: LanguageClient, params: CodeActionParams, commandInfo: any) { diff --git a/src/refactoring/changeSignaturePanel.ts b/src/refactoring/changeSignaturePanel.ts new file mode 100644 index 000000000..f5f7728a0 --- /dev/null +++ b/src/refactoring/changeSignaturePanel.ts @@ -0,0 +1,190 @@ +import * as path from "path"; +import { Disposable, Webview, WebviewPanel, window, Uri, ViewColumn, workspace, WorkspaceEdit } from "vscode"; +import { LanguageClient } from "vscode-languageclient/node"; +import { GetRefactorEditRequest, RefactorWorkspaceEdit } from "../protocol"; +import { getNonce, getUri } from "../webviewUtils"; + +interface MethodParameter { + type: string; + name: string; + defaultValue: string; + originalIndex: number; +} + +interface MethodException { + type: string; + typeHandleIdentifier: string; +} + +export class ChangeSignaturePanel { + public static type = "java.refactor.changeSignature"; + public static title = "Refactor: Change Method Signature"; + public static currentPanel: ChangeSignaturePanel | undefined; + private readonly panel: WebviewPanel; + private disposables: Disposable[] = []; + + // method metadata + private methodIdentifier: string | undefined; + private methodName: string | undefined; + private modifier: string | undefined; + private returnType: string | undefined; + private parameters: MethodParameter[] | undefined; + private exceptions: MethodException[] | undefined; + + // refactor metadata + private languageClient: LanguageClient; + private params: any; + private formattingOptions: any; + private command: any; + + private constructor(panel: WebviewPanel, extensionUri: Uri) { + this.panel = panel; + this.panel.onDidDispose(() => this.dispose(), null, this.disposables); + this.panel.webview.html = this.getWebviewContent(this.panel.webview, extensionUri); + this.setWebviewMessageListener(this.panel.webview); + } + + public static render(extensionUri: Uri, languageClient: LanguageClient, command: any, params: any, formattingOptions: any, commandInfo: any) { + if (ChangeSignaturePanel.currentPanel) { + if (!commandInfo?.methodIdentifier) { + // the new method to do refactoring is not available, just reveal the current panel. + ChangeSignaturePanel.currentPanel.panel.reveal(ViewColumn.Beside); + return; + } + if (commandInfo.methodIdentifier === ChangeSignaturePanel.currentPanel.methodIdentifier) { + // the new method to do refactoring is the same as the old one, just reveal the current panel. + ChangeSignaturePanel.currentPanel.panel.reveal(ViewColumn.Beside); + return; + } else { + window.showInformationMessage(`Change Method Signature for '${ChangeSignaturePanel.currentPanel.methodName}' is in process. Would you like to reveal or abort it?`, "Reveal", "Abort").then(async (selection) => { + if (selection === "Reveal") { + ChangeSignaturePanel.currentPanel.panel.reveal(ViewColumn.Beside); + } else if (selection === "Abort") { + ChangeSignaturePanel.currentPanel.dispose(); + ChangeSignaturePanel.render(extensionUri, languageClient, command, params, formattingOptions, commandInfo); + } + }); + } + } else { + const panel = window.createWebviewPanel( + ChangeSignaturePanel.type, + ChangeSignaturePanel.title, + ViewColumn.Beside, + { + enableCommandUris: true, + enableScripts: true, + localResourceRoots: [Uri.joinPath(extensionUri, "dist")], + retainContextWhenHidden: true, + } + ); + panel.iconPath = Uri.file(path.join(extensionUri.fsPath, "icons", "icon128.png")); + ChangeSignaturePanel.currentPanel = new ChangeSignaturePanel(panel, extensionUri); + ChangeSignaturePanel.currentPanel.setMetadata(languageClient, command, params, formattingOptions, commandInfo); + } + } + + public setMetadata(languageClient: LanguageClient, command: any, params: any, formattingOptions: any, commandInfo: any) { + this.languageClient = languageClient; + this.command = command; + this.params = params; + this.formattingOptions = formattingOptions; + this.methodIdentifier = commandInfo.methodIdentifier; + this.methodName = commandInfo.methodName as string; + this.modifier = commandInfo.modifier as string; + this.returnType = commandInfo.returnType as string; + this.parameters = commandInfo.parameters as MethodParameter[]; + this.exceptions = commandInfo.exceptions as MethodException[]; + } + + public dispose() { + ChangeSignaturePanel.currentPanel = undefined; + this.panel.dispose(); + while (this.disposables.length) { + const disposable = this.disposables.pop(); + if (disposable) { + disposable.dispose(); + } + } + } + + private getWebviewContent(webview: Webview, extensionUri: Uri) { + const scriptUri = getUri(webview, extensionUri, "dist", "changeSignature.js"); + const styleUri = getUri(webview, extensionUri, "dist", "changeSignature.css"); + + return /* html*/ ` + + + + + + + + + Change Signature + + + +
+ + + + `; + } + + private setWebviewMessageListener(webview: Webview) { + webview.onDidReceiveMessage( + async (message: any) => { + const command = message.command; + switch (command) { + case "webviewReady": + await this.panel.webview.postMessage({ + command: "setInitialState", + methodIdentifier: this.methodIdentifier, + methodName: this.methodName, + modifier: this.modifier, + returnType: this.returnType, + parameters: this.parameters, + exceptions: this.exceptions + }); + break; + case "doRefactor": + if (await this.doRefactor(message.methodIdentifier, message.isDelegate, message.methodName, message.accessType, message.returnType, message.parameters, message.exceptions, message.preview)) { + this.dispose(); + } + break; + } + }, + undefined, + this.disposables + ); + } + + /** + * refactor the method with the given parameters. + * + * @param methodIdentifier the handle identifier of the method to refactor. + * @param isDelegate if true, the method will be refactored to a delegate method. + * @param methodName the new name of the method. + * @param accessType the new access type of the method. + * @param returnType the new return type of the method. + * @param parameters the new parameters of the method. + * @param exceptions the new exceptions of the method. + * @param preview if true, the refactoring will be previewed before applied. + * @returns true if the refactoring is successful, false otherwise. + */ + private async doRefactor(methodIdentifier: string, isDelegate: boolean, methodName: string, accessType: string, returnType: string, parameters: MethodParameter[], exceptions: MethodException[], preview: boolean): Promise { + const clientWorkspaceEdit: RefactorWorkspaceEdit = await this.languageClient.sendRequest(GetRefactorEditRequest.type, { + command: this.command, + context: this.params, + options: this.formattingOptions, + commandArguments: [methodIdentifier, isDelegate, methodName, accessType, returnType, parameters, exceptions, preview] + }); + if (clientWorkspaceEdit?.edit) { + const codeEdit: WorkspaceEdit = await this.languageClient.protocol2CodeConverter.asWorkspaceEdit(clientWorkspaceEdit.edit); + if (codeEdit) { + return workspace.applyEdit(codeEdit); + } + } + return false; + } +} diff --git a/src/requirements.ts b/src/requirements.ts index 1ca128b1e..cedb881ba 100644 --- a/src/requirements.ts +++ b/src/requirements.ts @@ -2,14 +2,15 @@ import * as expandHomeDir from 'expand-home-dir'; import * as fse from 'fs-extra'; -import { findRuntimes, getRuntime, getSources, IJavaRuntime, JAVAC_FILENAME, JAVA_FILENAME } from 'jdk-utils'; +import { getRuntime, getSources, JAVAC_FILENAME, JAVA_FILENAME } from 'jdk-utils'; import * as path from 'path'; import { env, ExtensionContext, Uri, window, workspace } from 'vscode'; import { Commands } from './commands'; import { logger } from './log'; import { checkJavaPreferences } from './settings'; +import { listJdks, sortJdksBySource, sortJdksByVersion } from './jdkUtils'; +import { getJavaConfiguration } from './utils'; -const REQUIRED_JDK_VERSION = 17; /* eslint-disable @typescript-eslint/naming-convention */ export interface RequirementsData { tooling_jre: string; @@ -40,6 +41,11 @@ export async function resolveRequirements(context: ExtensionContext): Promise r.version.major >= REQUIRED_JDK_VERSION); if (validJdks.length > 0) { sortJdksBySource(validJdks); - javaHome = validJdks[0].homedir; - javaVersion = validJdks[0].version.major; - toolingJre = javaHome; - toolingJreVersion = javaVersion; + toolingJre = validJdks[0].homedir; + toolingJreVersion = validJdks[0].version.major; + if (!javaHome) { // keep javaHome if set even if it is an older JDK version + javaHome = toolingJre; + javaVersion = toolingJreVersion; + } } } else { // pick a default project JDK/JRE /** @@ -159,27 +167,6 @@ async function findDefaultRuntimeFromSettings(): Promise { return undefined; } -export function sortJdksBySource(jdks: IJavaRuntime[]) { - const rankedJdks = jdks as Array; - const sources = ["JDK_HOME", "JAVA_HOME", "PATH"]; - for (const [index, source] of sources.entries()) { - for (const jdk of rankedJdks) { - if (jdk.rank === undefined && getSources(jdk).includes(source)) { - jdk.rank = index; - } - } - } - rankedJdks.filter(jdk => jdk.rank === undefined).forEach(jdk => jdk.rank = sources.length); - rankedJdks.sort((a, b) => a.rank - b.rank); -} - -/** - * Sort by major version in descend order. - */ -export function sortJdksByVersion(jdks: IJavaRuntime[]) { - jdks.sort((a, b) => (b.version?.major ?? 0) - (a.version?.major ?? 0)); -} - export function parseMajorVersion(version: string): number { if (!version) { return 0; @@ -236,4 +223,4 @@ async function getMajorVersion(javaHome: string): Promise { } const runtime = await getRuntime(javaHome, { withVersion: true }); return runtime?.version?.major || 0; -} \ No newline at end of file +} diff --git a/src/runtimeStatusBarProvider.ts b/src/runtimeStatusBarProvider.ts index ae86d9112..08fa38962 100644 --- a/src/runtimeStatusBarProvider.ts +++ b/src/runtimeStatusBarProvider.ts @@ -1,35 +1,29 @@ 'use strict'; import * as fse from "fs-extra"; -import { StatusBarItem, window, StatusBarAlignment, TextEditor, Uri, commands, workspace, version, languages, Command, ExtensionContext } from "vscode"; +import { window, TextEditor, Uri, commands, workspace, ExtensionContext, LanguageStatusItem } from "vscode"; import { Commands } from "./commands"; import { Disposable } from "vscode-languageclient"; import * as path from "path"; import { apiManager } from "./apiManager"; -import * as semver from "semver"; import { ACTIVE_BUILD_TOOL_STATE } from "./settings"; -import { BuildFileStatusItemFactory, RuntimeStatusItemFactory, StatusCommands, supportsLanguageStatus } from "./languageStatusItemFactory"; +import { BuildFileStatusItemFactory, RuntimeStatusItemFactory } from "./languageStatusItemFactory"; import { getAllJavaProjects, getJavaConfiguration, hasBuildToolConflicts } from "./utils"; import { LombokVersionItemFactory, getLombokVersion, isLombokImported } from "./lombokSupport"; -class RuntimeStatusBarProvider implements Disposable { - private statusBarItem: StatusBarItem; - private runtimeStatusItem: any; - private buildFileStatusItem: any; - private lombokVersionItem: any; +class LanguageStatusBarProvider implements Disposable { + private runtimeStatusItem: LanguageStatusItem; + private buildFileStatusItem: LanguageStatusItem; + private lombokVersionItem: LanguageStatusItem; private javaProjects: Map; private fileProjectMapping: Map; private storagePath: string | undefined; private disposables: Disposable[]; - // Adopt new API for status bar item, meanwhile keep the compatibility with Theia. - // See: https://github.com/redhat-developer/vscode-java/issues/1982 - private isAdvancedStatusBarItem: boolean; constructor() { this.javaProjects = new Map(); this.fileProjectMapping = new Map(); this.disposables = []; - this.isAdvancedStatusBarItem = semver.gte(version, "1.57.0"); } public async initialize(context: ExtensionContext): Promise { @@ -39,15 +33,6 @@ class RuntimeStatusBarProvider implements Disposable { this.storagePath = Uri.file(path.join(storagePath, "..", "..")).fsPath; } - if (!supportsLanguageStatus()) { - if (this.isAdvancedStatusBarItem) { - this.statusBarItem = (window.createStatusBarItem as any)("java.runtimeStatus", StatusBarAlignment.Right, 0); - (this.statusBarItem as any).name = "Java Runtime Configuration"; - } else { - this.statusBarItem = window.createStatusBarItem(StatusBarAlignment.Right, 0); - } - } - let projectUriStrings: string[]; try { projectUriStrings = await getAllJavaProjects(false); @@ -59,10 +44,6 @@ class RuntimeStatusBarProvider implements Disposable { this.javaProjects.set(Uri.parse(uri).fsPath, undefined); } - if (!supportsLanguageStatus()) { - this.statusBarItem.command = StatusCommands.configureJavaRuntimeCommand; - } - this.disposables.push(window.onDidChangeActiveTextEditor((textEditor) => { this.updateItem(context, textEditor); })); @@ -111,7 +92,6 @@ class RuntimeStatusBarProvider implements Disposable { } public dispose(): void { - this.statusBarItem?.dispose(); this.runtimeStatusItem?.dispose(); this.buildFileStatusItem?.dispose(); this.lombokVersionItem?.dispose(); @@ -176,63 +156,47 @@ class RuntimeStatusBarProvider implements Disposable { } private async updateItem(context: ExtensionContext, textEditor: TextEditor): Promise { - if (!textEditor || path.extname(textEditor.document.fileName) !== ".java" && !supportsLanguageStatus()) { - this.statusBarItem?.hide(); + if (!textEditor || path.extname(textEditor.document.fileName) !== ".java") { return; } const uri: Uri = textEditor.document.uri; const projectPath: string = this.findOwnerProject(uri); if (!projectPath) { - if (supportsLanguageStatus()) { - this.hideRuntimeStatusItem(); - this.hideBuildFileStatusItem(); - this.hideLombokVersionItem(); - } else { - this.statusBarItem?.hide(); - } + this.hideRuntimeStatusItem(); + this.hideBuildFileStatusItem(); + this.hideLombokVersionItem(); return; } const projectInfo: IProjectInfo = await this.getProjectInfo(projectPath); if (!projectInfo) { - if (supportsLanguageStatus()) { - this.hideRuntimeStatusItem(); - this.hideBuildFileStatusItem(); - this.hideLombokVersionItem(); - } else { - this.statusBarItem?.hide(); - } + this.hideRuntimeStatusItem(); + this.hideBuildFileStatusItem(); + this.hideLombokVersionItem(); return; } const text = this.getJavaRuntimeFromVersion(projectInfo.sourceLevel); - if (supportsLanguageStatus()) { - const buildFilePath = await this.getBuildFilePath(context, projectPath); - if (!this.runtimeStatusItem) { - this.runtimeStatusItem = RuntimeStatusItemFactory.create(text, projectInfo.vmInstallPath); - if (buildFilePath) { - this.buildFileStatusItem = BuildFileStatusItemFactory.create(buildFilePath); - } - } else { - RuntimeStatusItemFactory.update(this.runtimeStatusItem, text, projectInfo.vmInstallPath); - if (buildFilePath) { - BuildFileStatusItemFactory.update(this.buildFileStatusItem, buildFilePath); - } + const buildFilePath = await this.getBuildFilePath(context, projectPath); + if (!this.runtimeStatusItem) { + this.runtimeStatusItem = RuntimeStatusItemFactory.create(text, projectInfo.vmInstallPath); + if (buildFilePath) { + this.buildFileStatusItem = BuildFileStatusItemFactory.create(buildFilePath); + } + } else { + RuntimeStatusItemFactory.update(this.runtimeStatusItem, text, projectInfo.vmInstallPath); + if (buildFilePath) { + BuildFileStatusItemFactory.update(this.buildFileStatusItem, buildFilePath); } + } + + if (isLombokImported()) { if (!this.lombokVersionItem) { - if (isLombokImported()) { - this.lombokVersionItem = LombokVersionItemFactory.create(getLombokVersion()); - } + this.lombokVersionItem = LombokVersionItemFactory.create(getLombokVersion()); } else { - if (isLombokImported()) { - LombokVersionItemFactory.update(this.lombokVersionItem, getLombokVersion()); - } + LombokVersionItemFactory.update(this.lombokVersionItem, getLombokVersion()); } - } else { - this.statusBarItem.text = text; - this.statusBarItem.tooltip = projectInfo.vmInstallPath ? `Language Level: ${this.statusBarItem.text} <${projectInfo.vmInstallPath}>` : "Configure Java Runtime"; - this.statusBarItem.show(); } } @@ -302,4 +266,4 @@ interface IProjectInfo { const SOURCE_LEVEL_KEY = "org.eclipse.jdt.core.compiler.source"; const VM_INSTALL_PATH = "org.eclipse.jdt.ls.core.vm.location"; -export const runtimeStatusBarProvider: RuntimeStatusBarProvider = new RuntimeStatusBarProvider(); +export const languageStatusBarProvider: LanguageStatusBarProvider = new LanguageStatusBarProvider(); diff --git a/src/serverStatus.ts b/src/serverStatus.ts index c6260e139..28c51990a 100644 --- a/src/serverStatus.ts +++ b/src/serverStatus.ts @@ -2,6 +2,7 @@ import { EventEmitter } from "vscode"; import { serverTasks } from "./serverTasks"; +import { serverStatusBarProvider } from "./serverStatusBarProvider"; export enum ServerStatusKind { ready = "Ready", @@ -31,7 +32,11 @@ export namespace serverStatus { export function initialize() { serverTasks.onDidUpdateServerTask(tasks => { - isBusy = tasks.some(task => !task.complete); + const busyTask = tasks.find(task => !task.complete); + isBusy = !!busyTask; + if (isBusy) { + serverStatusBarProvider.setBusy(busyTask.value.message); + } fireEvent(); }); } diff --git a/src/serverStatusBarProvider.ts b/src/serverStatusBarProvider.ts index 57003877c..a410c65ce 100644 --- a/src/serverStatusBarProvider.ts +++ b/src/serverStatusBarProvider.ts @@ -1,118 +1,92 @@ 'use strict'; -import { StatusBarItem, window, StatusBarAlignment, version } from "vscode"; -import { Commands } from "./commands"; +import { StatusBarItem, window, StatusBarAlignment, ThemeColor, commands, QuickPickItem, QuickPickItemKind } from "vscode"; import { Disposable } from "vscode-languageclient"; -import * as semver from "semver"; -import { ServerStatusItemFactory, StatusCommands, supportsLanguageStatus } from "./languageStatusItemFactory"; +import { StatusCommands } from "./languageStatusItemFactory"; +import { Commands } from "./commands"; +import { ServerStatusKind } from "./serverStatus"; class ServerStatusBarProvider implements Disposable { private statusBarItem: StatusBarItem; - private languageStatusItem: any; - // Adopt new API for status bar item, meanwhile keep the compatibility with Theia. - // See: https://github.com/redhat-developer/vscode-java/issues/1982 - private isAdvancedStatusBarItem: boolean; constructor() { - this.isAdvancedStatusBarItem = semver.gte(version, "1.57.0"); - } - - public initialize(): void { - if (supportsLanguageStatus()) { - this.languageStatusItem = ServerStatusItemFactory.create(); - } else { - if (this.isAdvancedStatusBarItem) { - this.statusBarItem = (window.createStatusBarItem as any)("java.serverStatus", StatusBarAlignment.Right, Number.MIN_VALUE); - } else { - this.statusBarItem = window.createStatusBarItem(StatusBarAlignment.Right, Number.MIN_VALUE); - } - } + this.statusBarItem = window.createStatusBarItem("java.serverStatus", StatusBarAlignment.Left); + this.statusBarItem.show(); } public showLightWeightStatus(): void { - if (supportsLanguageStatus()) { - ServerStatusItemFactory.showLightWeightStatus(this.languageStatusItem); - } else { - if (this.isAdvancedStatusBarItem) { - (this.statusBarItem as any).name = "Java Server Mode"; - } - this.statusBarItem.text = StatusIcon.lightWeight; - this.statusBarItem.command = StatusCommands.switchToStandardCommand; - this.statusBarItem.tooltip = "Java language server is running in LightWeight mode, click to switch to Standard mode"; - this.statusBarItem.show(); - } + this.statusBarItem.name = "Java Server Mode"; + this.statusBarItem.text = `${StatusIcon.lightWeight} Java: Lightweight Mode`; + this.statusBarItem.command = StatusCommands.switchToStandardCommand; + this.statusBarItem.tooltip = "Java language server is running in LightWeight mode, click to switch to Standard mode"; } - public showStandardStatus(): void { - if (supportsLanguageStatus()) { - ServerStatusItemFactory.showStandardStatus(this.languageStatusItem); - ServerStatusItemFactory.setBusy(this.languageStatusItem); - } else { - if (this.isAdvancedStatusBarItem) { - (this.statusBarItem as any).name = "Java Server Status"; - } - this.statusBarItem.text = StatusIcon.busy; - this.statusBarItem.command = Commands.SHOW_SERVER_TASK_STATUS; - this.statusBarItem.tooltip = ""; - this.statusBarItem.show(); - } + public showNotImportedStatus(): void { + this.statusBarItem.name = "No projects are imported"; + this.statusBarItem.text = `${StatusIcon.notImported} Java: No Projects Imported`; + this.statusBarItem.command = StatusCommands.startStandardServerCommand; + this.statusBarItem.tooltip = "No projects are imported, click to load projects"; } - public setBusy(): void { - if (supportsLanguageStatus()) { - ServerStatusItemFactory.setBusy(this.languageStatusItem); - } else { - this.statusBarItem.text = StatusIcon.busy; - } + public setBusy(process: string): void { + this.statusBarItem.text = `${StatusIcon.busy} Java: ${process}`; + this.statusBarItem.tooltip = process; + this.statusBarItem.command = { + title: "Show Java status menu", + command: Commands.OPEN_STATUS_SHORTCUT, + tooltip: "Show Java status menu", + arguments: [ServerStatusKind.busy], + }; } public setError(): void { - if (supportsLanguageStatus()) { - ServerStatusItemFactory.setError(this.languageStatusItem); - } else { - this.statusBarItem.text = StatusIcon.error; - this.statusBarItem.command = Commands.OPEN_LOGS; - } + this.statusBarItem.text = `${StatusIcon.java} Java: Error`; + this.statusBarItem.tooltip = "Show Java status menu"; + this.statusBarItem.command = { + title: "Show Java status menu", + command: Commands.OPEN_STATUS_SHORTCUT, + tooltip: "Show Java status menu", + arguments: [ServerStatusKind.error], + }; } public setWarning(): void { - if (supportsLanguageStatus()) { - ServerStatusItemFactory.setWarning(this.languageStatusItem); - } else { - this.statusBarItem.text = StatusIcon.warning; - this.statusBarItem.command = "workbench.panel.markers.view.focus"; - this.statusBarItem.tooltip = "Errors occurred in project configurations, click to show the PROBLEMS panel"; - } + this.statusBarItem.text = `${StatusIcon.java} Java: Warning`; + this.statusBarItem.tooltip = "Show Java status menu"; + this.statusBarItem.command = { + title: "Show Java status menu", + command: Commands.OPEN_STATUS_SHORTCUT, + tooltip: "Show Java status menu", + arguments: [ServerStatusKind.warning], + }; } public setReady(): void { - if (supportsLanguageStatus()) { - ServerStatusItemFactory.setReady(this.languageStatusItem); - } else { - this.statusBarItem.text = StatusIcon.ready; - this.statusBarItem.command = Commands.SHOW_SERVER_TASK_STATUS; - this.statusBarItem.tooltip = "ServiceReady"; - } - } - - public updateTooltip(tooltip: string): void { - if (!supportsLanguageStatus()) { - this.statusBarItem.tooltip = tooltip; - } + this.statusBarItem.text = `${StatusIcon.java} Java: Ready`; + this.statusBarItem.tooltip = "Show Java status menu"; + this.statusBarItem.command = { + title: "Show Java status menu", + command: Commands.OPEN_STATUS_SHORTCUT, + tooltip: "Show Java status menu", + arguments: ["Ready"], + }; } public dispose(): void { this.statusBarItem?.dispose(); - this.languageStatusItem?.dispose(); } } export enum StatusIcon { lightWeight = "$(rocket)", + notImported = "$(info)", busy = "$(sync~spin)", - ready = "$(thumbsup)", - warning = "$(thumbsdown)", - error = "$(thumbsdown)" + java = "$(coffee)", +} + +export interface ShortcutQuickPickItem extends QuickPickItem { + command: string; + args?: any[]; } export const serverStatusBarProvider: ServerStatusBarProvider = new ServerStatusBarProvider(); diff --git a/src/serverTaskPresenter.ts b/src/serverTaskPresenter.ts index f8080f13a..2cf8a1030 100644 --- a/src/serverTaskPresenter.ts +++ b/src/serverTaskPresenter.ts @@ -1,19 +1,19 @@ -import { tasks, Task, TaskScope, Pseudoterminal, CustomExecution, TaskExecution, TaskRevealKind, TaskPanelKind, EventEmitter, Event, TerminalDimensions, window, ProgressLocation, Progress, workspace } from "vscode"; +import { tasks, Task, TaskScope, Pseudoterminal, CustomExecution, TaskExecution, TaskRevealKind, TaskPanelKind, EventEmitter, Event, TerminalDimensions, window, Progress, ProgressLocation, workspace } from "vscode"; import { serverTasks } from "./serverTasks"; import { Disposable } from "vscode-languageclient"; -import { ProgressReport } from "./protocol"; +import { ProgressReport, ProgressKind } from "./protocol"; import { Commands } from "./commands"; import { getJavaConfiguration } from "./utils"; const JAVA_SERVER_TASK_PRESENTER_TASK_NAME = "Java Build Status"; export namespace serverTaskPresenter { - export async function presentServerTaskView() { + export async function presentServerTaskView(preserveFocus?: boolean) { const execution = await getPresenterTaskExecution(); const terminals = window.terminals; const presenterTerminals = terminals.filter(terminal => terminal.name.indexOf(execution.task.name) >= 0); if (presenterTerminals.length > 0) { - presenterTerminals[0].show(); + presenterTerminals[0].show(preserveFocus); } activationProgressNotification.hide(); } @@ -47,7 +47,7 @@ async function getPresenterTaskExecution(): Promise { // Fix #1180. When switching to multiroot workspace by "Add Folder to Workspace...", vscode restarts the extension // host without deactivating the extension. See https://github.com/microsoft/vscode/issues/69335 // This is to clean up the existing task execution and terminal created by previous extension instance because they -// are no longer accessible to the current extension instance afte the restart. +// are no longer accessible to the current extension instance after the restart. // TODO - As mentioned in https://github.com/microsoft/vscode/issues/69335, vscode will no long restart because of // workspace changes. We can revisit this issue to see if we can remove the fix. async function killExistingExecutions() { @@ -91,11 +91,13 @@ class ServerTaskTerminal implements Pseudoterminal { private printTask(report: ProgressReport) { if (report.complete) { - this.onDidWriteEvent.fire(`${report.id.slice(0, 8)} ${report.task} [Done]\r\n`); + this.onDidWriteEvent.fire(`${report.token.slice(0, 8)} ${report.value.message} [Done]\r\n`); return; } - this.onDidWriteEvent.fire(`${report.id.slice(0, 8)} ${report.task}: ${report.status} [${report.workDone}/${report.totalWork}]\r\n`); + const taskMsg = `${report.token.slice(0, 8)} ${report.value.message}`; + + this.onDidWriteEvent.fire(`${taskMsg}\r\n`); } open(initialDimensions: TerminalDimensions): void { @@ -133,19 +135,16 @@ export class ActivationProgressNotification { } else if (!showBuildStatusEnabled) { return; } - const isProgressReportEnabled: boolean = getJavaConfiguration().get("progressReports.enabled"); - const title = isProgressReportEnabled ? "Opening Java Projects" : "Opening Java Projects..."; + const title = "Opening Java Projects"; window.withProgress({ location: ProgressLocation.Notification, title, cancellable: false, }, (progress: Progress<{ message?: string; increment?: number }>) => { return new Promise((resolve) => { - if (isProgressReportEnabled) { - progress.report({ - message: `[check details](command:${Commands.SHOW_SERVER_TASK_STATUS})` - }); - } + progress.report({ + message: `[check details](command:${Commands.SHOW_SERVER_TASK_STATUS})` + }); this.onHide(() => { for (const disposable of this.disposables) { disposable.dispose(); diff --git a/src/serverTasks.ts b/src/serverTasks.ts index 5d02c6473..f881be450 100644 --- a/src/serverTasks.ts +++ b/src/serverTasks.ts @@ -1,5 +1,5 @@ -import { EventEmitter, Progress } from "vscode"; -import { ProgressReport } from "./protocol"; +import { EventEmitter } from "vscode"; +import { ProgressReport, ProgressKind } from "./protocol"; const findIndex = require("lodash.findindex"); @@ -56,7 +56,7 @@ function recycleTasks(tasks: ProgressReport[], length: number) { } function applyReport(report: ProgressReport) { - const index = findIndex(tasks, task => task.id === report.id); + const index = findIndex(tasks, task => task.token === report.token); if (index === -1) { tasks.push(report); } else { diff --git a/src/settings.ts b/src/settings.ts index f46501c9a..1e3330ed2 100644 --- a/src/settings.ts +++ b/src/settings.ts @@ -2,10 +2,13 @@ import * as fs from 'fs'; import * as path from 'path'; -import { commands, ConfigurationTarget, env, ExtensionContext, Position, Range, SnippetString, TextDocument, Uri, window, workspace, WorkspaceConfiguration, WorkspaceFolder } from 'vscode'; +import { commands, ConfigurationTarget, env, ExtensionContext, Position, Range, Selection, SnippetString, TextDocument, Uri, window, workspace, WorkspaceConfiguration, WorkspaceFolder } from 'vscode'; import { Commands } from './commands'; import { cleanupLombokCache } from './lombokSupport'; import { ensureExists, getJavaConfiguration } from './utils'; +import { apiManager } from './apiManager'; +import { isActive, setActive, smartSemicolonDetection } from './smartSemicolonDetection'; +import { BuildFileSelector, IMPORT_METHOD, PICKED_BUILD_FILES } from './buildFilesSelector'; const DEFAULT_HIDDEN_FILES: string[] = ['**/.classpath', '**/.project', '**/.settings', '**/.factorypath']; const IS_WORKSPACE_JDK_ALLOWED = "java.ls.isJdkAllowed"; @@ -131,13 +134,21 @@ function hasJavaConfigChanged(oldConfig: WorkspaceConfiguration, newConfig: Work return hasConfigKeyChanged('jdt.ls.java.home', oldConfig, newConfig) || hasConfigKeyChanged('home', oldConfig, newConfig) || hasConfigKeyChanged('jdt.ls.vmargs', oldConfig, newConfig) - || hasConfigKeyChanged('progressReports.enabled', oldConfig, newConfig) || hasConfigKeyChanged('server.launchMode', oldConfig, newConfig) - || hasConfigKeyChanged('sharedIndexes.location', oldConfig, newConfig);; + || hasConfigKeyChanged('sharedIndexes.location', oldConfig, newConfig) + || hasConfigKeyChanged('transport', oldConfig, newConfig) + || hasConfigKeyChanged('diagnostic.filter', oldConfig, newConfig) + || hasConfigKeyChanged('jdt.ls.javac.enabled', oldConfig, newConfig) + || hasConfigKeyChanged('completion.engine', oldConfig, newConfig) + || hasConfigKeyChanged('jdt.ls.appcds.enabled', oldConfig, newConfig); } function hasConfigKeyChanged(key, oldConfig, newConfig) { - return oldConfig.get(key) !== newConfig.get(key); + const oldValue = oldConfig.get(key); + const newValue = newConfig.get(key); + return Array.isArray(oldValue) && Array.isArray(newValue) + ? JSON.stringify(oldValue) !== JSON.stringify(newValue) + : oldValue !== newValue; } export function getJavaEncoding(): string { @@ -274,6 +285,10 @@ export function getJavaServerMode(): ServerMode { || ServerMode.hybrid; } +export function validateAllOpenBuffersOnChanges(): boolean { + return workspace.getConfiguration().get('java.edit.validateAllOpenBuffersOnChanges'); +} + export function setGradleWrapperChecksum(wrapper: string, sha256?: string) { const opened = gradleWrapperPromptDialogs.filter(v => (v === sha256)); if (opened !== null && opened.length > 0) { @@ -314,19 +329,33 @@ function unregisterGradleWrapperPromptDialog(sha256: string) { } } -export function handleTextBlockClosing(document: TextDocument, changes: readonly import("vscode").TextDocumentContentChangeEvent[]): any { +let serverReady = false; + +export function handleTextDocumentChanges(document: TextDocument, changes: readonly import("vscode").TextDocumentContentChangeEvent[]): any { + if (!serverReady) { + apiManager.getApiInstance().serverReady().then(() => { + serverReady = true; + }); + } const activeTextEditor = window.activeTextEditor; const activeDocument = activeTextEditor && activeTextEditor.document; if (document !== activeDocument || changes.length === 0 || document.languageId !== 'java') { + setActive(false); return; } const lastChange = changes[changes.length - 1]; if (lastChange.text === null || lastChange.text.length <= 0) { + setActive(false); return; } if (lastChange.text !== '"""";') { + if (lastChange.text === ';' && serverReady && !isActive()) { + smartSemicolonDetection(); + } + setActive(false); return; } + setActive(false); const selection = activeTextEditor.selection.active; if (selection !== null) { const start = new Position(selection.line, selection.character - 2); @@ -345,3 +374,45 @@ export function handleTextBlockClosing(document: TextDocument, changes: readonly } } } + +export async function getImportMode(context: ExtensionContext, selector: BuildFileSelector): Promise { + const mode = getJavaConfiguration().get("import.projectSelection"); + if (mode === "manual") { + // use automatic mode if user has selected "Import All" before. + if (context.workspaceState.get(IMPORT_METHOD) === "Import All") { + return ImportMode.automatic; + } + + // if no selectable build files, use automatic mode + const hasBuildFiles = await selector.hasBuildFiles(); + if (!hasBuildFiles) { + return ImportMode.automatic; + } + + // If the the manually picked build files has already cached, return manual mode. + if (context.workspaceState.get(PICKED_BUILD_FILES) !== undefined) { + return ImportMode.manual; + } + + const answer: string = await window.showInformationMessage( + "Java build files are detected in the workspace. How do you want to import them?", + { modal: true }, + "Import All", "Let Me Select..."); + if (answer === "Import All") { + context.workspaceState.update(IMPORT_METHOD, "Import All"); + return ImportMode.automatic; + } else if (answer === "Let Me Select...") { + return ImportMode.manual; + } + + return ImportMode.skip; + } + + return ImportMode.automatic; +} + +export enum ImportMode { + automatic = 'automatic', + manual = 'manual', + skip = 'skip', +} diff --git a/src/smartSemicolonDetection.ts b/src/smartSemicolonDetection.ts new file mode 100644 index 000000000..675f9b90a --- /dev/null +++ b/src/smartSemicolonDetection.ts @@ -0,0 +1,45 @@ +'use strict'; + +import { commands, Position, Range, Selection, window } from 'vscode'; +import { Commands } from './commands'; +import { getJavaConfiguration } from './utils'; +let active = false; + +export async function smartSemicolonDetection() { + if (enabled()) { + const params: SmartDetectionParams = { + uri: window.activeTextEditor.document.uri.toString(), + position: window.activeTextEditor!.selection.active, + }; + setActive(true); + const response: SmartDetectionParams = await commands.executeCommand(Commands.EXECUTE_WORKSPACE_COMMAND, Commands.SMARTSEMICOLON_DETECTION, JSON.stringify(params)); + if (response !== null) { + window.activeTextEditor!.edit(editBuilder => { + const oldPosition = window.activeTextEditor!.selection.active; + editBuilder.delete(new Range(new Position(oldPosition.line, oldPosition.character - 1), oldPosition)); + const newPos = new Position(response.position.line, response.position.character + 1); + editBuilder.insert(newPos, ";"); + window.activeTextEditor.selections = [new Selection(newPos, newPos)]; + // newPosition = window.activeTextEditor!.selection.active; + }); + return; + } + } +} + +interface SmartDetectionParams { + uri: String; + position: Position; +} + +function enabled() { + return getJavaConfiguration().get("edit.smartSemicolonDetection.enabled"); +} + +export function isActive() { + return active; +} + +export function setActive(pActive: boolean) { + active = pActive; +} \ No newline at end of file diff --git a/src/snippetCompletionProvider.ts b/src/snippetCompletionProvider.ts index fda426de3..53601fd19 100644 --- a/src/snippetCompletionProvider.ts +++ b/src/snippetCompletionProvider.ts @@ -56,7 +56,11 @@ class SnippetCompletionProviderImpl implements CompletionItemProvider { } export function beautifyDocument(raw: string): MarkdownString { - const escapedString = raw.replace(/\$\{\d:?(.*?)\}/gm, '$1').replace(/\$\d/gm, ''); + const escapedString = raw.replace(/\$\{\d\|(.*?),.*?\}/gm, '$1') + .replace(/\$\{\d:?(.*?)\}/gm, '$1') + .replace(/\$\d/gm, '') + .replace(/\${TM_SELECTED_TEXT:}/gm, '') + .replace(/\${TM_FILENAME_BASE}/gm, ''); return new MarkdownString().appendCodeblock(escapedString, "java"); } diff --git a/src/sourceAction.ts b/src/sourceAction.ts index c2acea150..a0009a89b 100644 --- a/src/sourceAction.ts +++ b/src/sourceAction.ts @@ -1,17 +1,37 @@ 'use strict'; -import { commands, window, ExtensionContext, ViewColumn, Uri, Disposable, workspace, TextEditorRevealType } from 'vscode'; +import { Disposable, ExtensionContext, TextEditorRevealType, Uri, ViewColumn, commands, window, workspace } from 'vscode'; import { CodeActionParams, WorkspaceEdit } from 'vscode-languageclient'; import { LanguageClient } from 'vscode-languageclient/node'; import { Commands } from './commands'; -import { ListOverridableMethodsRequest, AddOverridableMethodsRequest, CheckHashCodeEqualsStatusRequest, GenerateHashCodeEqualsRequest, -OrganizeImportsRequest, ImportCandidate, ImportSelection, GenerateToStringRequest, CheckToStringStatusRequest, VariableBinding, GenerateAccessorsRequest, CheckConstructorStatusRequest, GenerateConstructorsRequest, CheckDelegateMethodsStatusRequest, GenerateDelegateMethodsRequest, AccessorKind, AccessorCodeActionRequest, AccessorCodeActionParams } from './protocol'; +import { getActiveLanguageClient } from './extension'; +import { + AccessorCodeActionParams, + AccessorCodeActionRequest, + AccessorKind, + AddOverridableMethodsRequest, + CheckConstructorStatusRequest, + CheckDelegateMethodsStatusRequest, + CheckHashCodeEqualsStatusRequest, + CheckToStringStatusRequest, + CleanupRequest, + GenerateAccessorsRequest, + GenerateConstructorsRequest, + GenerateDelegateMethodsRequest, + GenerateHashCodeEqualsRequest, + GenerateToStringRequest, + ImportCandidate, ImportSelection, + ListOverridableMethodsRequest, + OrganizeImportsRequest, + VariableBinding +} from './protocol'; import { applyWorkspaceEdit } from './standardLanguageClient'; export function registerCommands(languageClient: LanguageClient, context: ExtensionContext) { registerOverrideMethodsCommand(languageClient, context); registerHashCodeEqualsCommand(languageClient, context); registerOrganizeImportsCommand(languageClient, context); + registerCleanupCommand(languageClient, context); registerChooseImportCommand(context); registerGenerateToStringCommand(languageClient, context); registerGenerateAccessorsCommand(languageClient, context); @@ -67,6 +87,15 @@ function registerOverrideMethodsCommand(languageClient: LanguageClient, context: })); } +function registerCleanupCommand(languageClient: LanguageClient, context: ExtensionContext): void { + // Only active when editorLangId == java + context.subscriptions.push(commands.registerCommand(Commands.MANUAL_CLEANUP, async () => { + const languageClient: LanguageClient | undefined = await getActiveLanguageClient(); + const workspaceEdit = await languageClient.sendRequest(CleanupRequest.type, languageClient.code2ProtocolConverter.asTextDocumentIdentifier(window.activeTextEditor.document)); + await applyWorkspaceEdit(workspaceEdit, languageClient); + })); +} + function registerHashCodeEqualsCommand(languageClient: LanguageClient, context: ExtensionContext): void { context.subscriptions.push(commands.registerCommand(Commands.HASHCODE_EQUALS_PROMPT, async (params: CodeActionParams) => { const result = await languageClient.sendRequest(CheckHashCodeEqualsStatusRequest.type, params); @@ -186,7 +215,7 @@ function registerGenerateToStringCommand(languageClient: LanguageClient, context const fieldItems = result.fields.map((field) => { return { label: `${field.name}: ${field.type}`, - picked: true, + picked: field.isSelected, originalField: field }; }); diff --git a/src/standardLanguageClient.ts b/src/standardLanguageClient.ts index 17dc34bc7..8677708fc 100644 --- a/src/standardLanguageClient.ts +++ b/src/standardLanguageClient.ts @@ -1,12 +1,10 @@ 'use strict'; -import * as fse from 'fs-extra'; -import { findRuntimes } from "jdk-utils"; import * as net from 'net'; import * as path from 'path'; -import { CancellationToken, CodeActionKind, commands, ConfigurationTarget, DocumentSelector, EventEmitter, ExtensionContext, extensions, languages, Location, ProgressLocation, TextEditor, Uri, ViewColumn, window, workspace } from "vscode"; -import { ConfigurationParams, ConfigurationRequest, LanguageClientOptions, Location as LSLocation, MessageType, Position as LSPosition, TextDocumentPositionParams, WorkspaceEdit } from "vscode-languageclient"; -import { LanguageClient, StreamInfo } from "vscode-languageclient/node"; +import { CancellationToken, CodeActionKind, commands, ConfigurationTarget, DocumentSelector, EventEmitter, ExtensionContext, extensions, languages, Location, ProgressLocation, TextEditor, Uri, ViewColumn, window, workspace, WorkspaceConfiguration } from "vscode"; +import { ConfigurationParams, ConfigurationRequest, LanguageClientOptions, Location as LSLocation, MessageType, Position as LSPosition, TextDocumentPositionParams, WorkspaceEdit, StaticFeature, ClientCapabilities, FeatureState, TelemetryEventNotification } from "vscode-languageclient"; +import { LanguageClient, ServerOptions, StreamInfo } from "vscode-languageclient/node"; import { apiManager } from "./apiManager"; import * as buildPath from './buildpath'; import { javaRefactorKinds, RefactorDocumentProvider } from "./codeActionProvider"; @@ -14,7 +12,7 @@ import { Commands } from "./commands"; import { ClientStatus } from "./extension.api"; import * as fileEventHandler from './fileEventHandler'; import { gradleCodeActionMetadata, GradleCodeActionProvider } from "./gradle/gradleCodeActionProvider"; -import { awaitServerConnection, prepareExecutable } from "./javaServerStarter"; +import { awaitServerConnection, prepareExecutable, DEBUG } from "./javaServerStarter"; import { logger } from "./log"; import { checkLombokDependency } from "./lombokSupport"; import { markdownPreviewProvider } from "./markdownPreviewProvider"; @@ -22,9 +20,9 @@ import * as pasteAction from './pasteAction'; import { registerPasteEventHandler } from './pasteEventHandler'; import { collectBuildFilePattern, onExtensionChange } from "./plugin"; import { pomCodeActionMetadata, PomCodeActionProvider } from "./pom/pomCodeActionProvider"; -import { ActionableNotification, BuildProjectParams, BuildProjectRequest, CompileWorkspaceRequest, CompileWorkspaceStatus, EventNotification, EventType, ExecuteClientCommandRequest, FeatureStatus, FindLinks, GradleCompatibilityInfo, LinkLocation, ProgressReportNotification, ServerNotification, SourceAttachmentAttribute, SourceAttachmentRequest, SourceAttachmentResult, StatusNotification, UpgradeGradleWrapperInfo } from "./protocol"; +import { ActionableNotification, BuildProjectParams, BuildProjectRequest, CompileWorkspaceRequest, CompileWorkspaceStatus, EventNotification, EventType, ExecuteClientCommandRequest, FeatureStatus, FindLinks, GradleCompatibilityInfo, LinkLocation, ProgressKind, ProgressNotification, ServerNotification, SourceAttachmentAttribute, SourceAttachmentRequest, SourceAttachmentResult, SourceInvalidatedEvent, StatusNotification, UpgradeGradleWrapperInfo } from "./protocol"; import * as refactorAction from './refactorAction'; -import { getJdkUrl, RequirementsData, sortJdksBySource, sortJdksByVersion } from "./requirements"; +import { getJdkUrl, RequirementsData } from "./requirements"; import { serverStatus, ServerStatusKind } from "./serverStatus"; import { serverStatusBarProvider } from "./serverStatusBarProvider"; import { activationProgressNotification, serverTaskPresenter } from "./serverTaskPresenter"; @@ -33,9 +31,18 @@ import { excludeProjectSettingsFiles, ServerMode, setGradleWrapperChecksum } fro import { snippetCompletionProvider } from "./snippetCompletionProvider"; import * as sourceAction from './sourceAction'; import { askForProjects, projectConfigurationUpdate, upgradeGradle } from "./standardLanguageClientUtils"; +import { TracingLanguageClient } from './TracingLanguageClient'; import { TypeHierarchyDirection, TypeHierarchyItem } from "./typeHierarchy/protocol"; import { typeHierarchyTree } from "./typeHierarchy/typeHierarchyTree"; -import { getAllJavaProjects, getJavaConfig, getJavaConfiguration } from "./utils"; +import { getAllJavaProjects, getAllProjects, getJavaConfiguration, isPrereleaseOrInsiderVersion } from "./utils"; +import { Telemetry } from "./telemetry"; +import { TelemetryEvent } from "@redhat-developer/vscode-redhat-telemetry/lib"; +import { registerDocumentValidationListener } from './diagnostic'; +import { listJdks, sortJdksBySource, sortJdksByVersion } from './jdkUtils'; +import { ClientCodeActionProvider } from './clientCodeActionProvider'; +import { BuildFileSelector } from './buildFilesSelector'; +import { extendedOutlineQuickPick } from "./outline/extendedOutlineQuickPick"; +import { startWithStdioFallback } from './standardLanguageClientStart'; const extensionName = 'Language Support for Java'; const GRADLE_CHECKSUM = "gradle/checksum/prompt"; @@ -44,6 +51,7 @@ const USE_JAVA = "Use Java "; const AS_GRADLE_JVM = " as Gradle JVM"; const UPGRADE_GRADLE = "Upgrade Gradle to "; const GRADLE_IMPORT_JVM = "java.import.gradle.java.home"; +const PIPE_START_TIMEOUT_MS = 30000; export const JAVA_SELECTOR: DocumentSelector = [ { scheme: "file", language: "java", pattern: "**/*.java" }, { scheme: "jdt", language: "java", pattern: "**/*.class" }, @@ -53,6 +61,8 @@ export const JAVA_SELECTOR: DocumentSelector = [ export class StandardLanguageClient { private languageClient: LanguageClient; + private serverOptions: ServerOptions; + private clientOptions: LanguageClientOptions; private status: ClientStatus = ClientStatus.uninitialized; public async initialize(context: ExtensionContext, requirements: RequirementsData, clientOptions: LanguageClientOptions, workspacePath: string, jdtEventEmitter: EventEmitter): Promise { @@ -70,23 +80,21 @@ export class StandardLanguageClient { serverStatus.initialize(); serverStatus.onServerStatusChanged(status => { - if (status === ServerStatusKind.busy) { - serverStatusBarProvider.setBusy(); - } else if (status === ServerStatusKind.error) { + if (status === ServerStatusKind.error) { serverStatusBarProvider.setError(); } else if (status === ServerStatusKind.warning) { serverStatusBarProvider.setWarning(); - } else { + } else if (status === ServerStatusKind.ready) { serverStatusBarProvider.setReady(); } }); - let serverOptions; - const port = process.env['SERVER_PORT']; + let serverOptions: ServerOptions; + const port = process.env['JDTLS_SERVER_PORT']; if (!port) { const lsPort = process.env['JDTLS_CLIENT_PORT']; if (!lsPort) { - serverOptions = prepareExecutable(requirements, workspacePath, getJavaConfig(requirements.java_home), context, false); + serverOptions = prepareExecutable(requirements, workspacePath, context, false); } else { serverOptions = () => { const socket = net.connect(lsPort); @@ -101,21 +109,32 @@ export class StandardLanguageClient { // used during development serverOptions = awaitServerConnection.bind(null, port); } + this.serverOptions = serverOptions; + this.clientOptions = clientOptions; // Create the language client and start the client. - this.languageClient = new LanguageClient('java', extensionName, serverOptions, clientOptions); + this.languageClient = this.createLanguageClient(serverOptions, clientOptions); this.registerCommandsForStandardServer(context, jdtEventEmitter); - fileEventHandler.registerFileEventHandlers(this.languageClient, context); + fileEventHandler.registerFileEventHandlers(() => this.languageClient, context); collectBuildFilePattern(extensions.all); this.status = ClientStatus.initialized; } + private createLanguageClient(serverOptions: ServerOptions, clientOptions: LanguageClientOptions): LanguageClient { + const languageClient = new TracingLanguageClient('java', extensionName, serverOptions, clientOptions, DEBUG); + languageClient.registerFeature(new DisableWillRenameFeature()); + return languageClient; + } + public registerLanguageClientActions(context: ExtensionContext, hasImported: boolean, jdtEventEmitter: EventEmitter) { activationProgressNotification.showProgress(); - this.languageClient.onNotification(StatusNotification.type, (report) => { + this.languageClient.onNotification(StatusNotification.type, async (report) => { + // Resolve serverRunning on the first status notification from the server, + // indicating the server process is alive and can accept requests. + apiManager.resolveServerRunningPromise(); switch (report.type) { case 'ServiceReady': apiManager.updateServerMode(ServerMode.standard); @@ -127,29 +146,47 @@ export class StandardLanguageClient { await onExtensionChange(extensions.all); }); } - - registerPasteEventHandler(context, this.languageClient); + try { + registerPasteEventHandler(context, this.languageClient); + } catch (error) { + // clients may not have properly configured documentPaste + logger.error(error); + } activationProgressNotification.hide(); if (!hasImported) { showImportFinishNotification(context); } checkLombokDependency(context); - apiManager.getApiInstance().onDidClasspathUpdate((e: Uri) => { - checkLombokDependency(context); + apiManager.getApiInstance().onDidClasspathUpdate((projectUri: Uri) => { + checkLombokDependency(context, projectUri); + }); + apiManager.getApiInstance().onDidProjectsImport(() => { + updateJavaProjectsContext(); + }); + apiManager.getApiInstance().onDidProjectsDelete(() => { + updateJavaProjectsContext(); }); // Disable the client-side snippet provider since LS is ready. snippetCompletionProvider.dispose(); + registerDocumentValidationListener(context, this.languageClient); + commands.executeCommand('setContext', 'javaLSReady', true); + updateJavaProjectsContext(); break; case 'Started': this.status = ClientStatus.started; serverStatus.updateServerStatus(ServerStatusKind.ready); - commands.executeCommand('setContext', 'javaLSReady', true); apiManager.updateStatus(ClientStatus.started); break; case 'Error': this.status = ClientStatus.error; serverStatus.updateServerStatus(ServerStatusKind.error); apiManager.updateStatus(ClientStatus.error); + apiManager.fireTraceEvent({ + name: "java.ls.error.serviceError", + properties: { + message: report.message, + }, + }); break; case 'ProjectStatus': if (report.message === "WARNING") { @@ -165,12 +202,10 @@ export class StandardLanguageClient { // message goes to progress report instead break; } - if (!serverStatus.hasErrors()) { - serverStatusBarProvider.updateTooltip(report.message); - } }); - this.languageClient.onNotification(ProgressReportNotification.type, (progress) => { + this.languageClient.onNotification(ProgressNotification.type, (progress) => { + progress.complete = progress.value.kind === ProgressKind.end; serverTasks.updateServerTask(progress); }); @@ -179,7 +214,7 @@ export class StandardLanguageClient { case EventType.classpathUpdated: apiManager.fireDidClasspathUpdate(Uri.parse(notification.data)); break; - case EventType.projectsImported: + case EventType.projectsImported: { const projectUris: Uri[] = []; if (notification.data) { for (const uriString of notification.data) { @@ -190,11 +225,24 @@ export class StandardLanguageClient { apiManager.fireDidProjectsImport(projectUris); } break; + } + case EventType.projectsDeleted: { + const projectUris: Uri[] = []; + if (notification.data) { + for (const uriString of notification.data) { + projectUris.push(Uri.parse(uriString)); + } + } + if (projectUris.length > 0) { + apiManager.fireDidProjectsDelete(projectUris); + } + break; + } case EventType.incompatibleGradleJdkIssue: const options: string[] = []; const info = notification.data as GradleCompatibilityInfo; const highestJavaVersion = Number(info.highestJavaVersion); - let runtimes = await findRuntimes({ checkJavac: true, withVersion: true, withTags: true }); + let runtimes = await listJdks(true); runtimes = runtimes.filter(runtime => { return runtime.version.major <= highestJavaVersion; }); @@ -222,6 +270,23 @@ export class StandardLanguageClient { }); } break; + case EventType.sourceInvalidated: + const result = notification.data as SourceInvalidatedEvent; + const triggeredByUser: string[] = []; + const triggeredByAutoDownloadedSource: string[] = []; + Object.entries(result.affectedRootPaths || {})?.forEach(([key, value]) => { + if (value) { + triggeredByAutoDownloadedSource.push(key); + } else { + triggeredByUser.push(key); + } + }); + if (triggeredByUser?.length) { + this.handleSourceInvalidatedEvent(triggeredByUser, false, jdtEventEmitter); + } + if (triggeredByAutoDownloadedSource?.length) { + this.handleSourceInvalidatedEvent(triggeredByAutoDownloadedSource, true, jdtEventEmitter); + } default: break; } @@ -241,6 +306,12 @@ export class StandardLanguageClient { break; case MessageType.Error: show = window.showErrorMessage; + apiManager.fireTraceEvent({ + name: "java.ls.error.notification", + properties: { + message: notification.message, + }, + }); break; } if (!show) { @@ -286,6 +357,72 @@ export class StandardLanguageClient { return result; }); + function getJavaSettingsForTelemetry(config: WorkspaceConfiguration) { + // settings whose values we can record + const SETTINGS_BASIC = [ + "java.quickfix.showAt", "java.symbols.includeSourceMethodDeclarations", + "java.completion.collapseCompletionItems", "java.completion.guessMethodArguments", + "java.cleanup.actionsOnSave", "java.completion.postfix.enabled", + "java.sharedIndexes.enabled", "java.inlayHints.parameterNames.enabled", + "java.inlayHints.parameterNames.suppressWhenSameNameNumbered", + "java.inlayHints.variableTypes.enabled", + "java.inlayHints.parameterTypes.enabled", + "java.inlayHints.formatParameters.enabled", + "java.server.launchMode", "java.autobuild.enabled" + ]; + + // settings where we only record their existence + const SETTINGS_CUSTOM = [ + "java.settings.url", "java.format.settings.url" + ]; + + let value: any; + const properties = {}; + + for (const key of SETTINGS_CUSTOM) { + if (config.get(key)) { + properties[key] = true; + } + } + for (const key of SETTINGS_BASIC) { + value = config.get(key); + if (value !== undefined) { + properties[key] = value; + } + } + + return properties; + } + + this.languageClient.onTelemetry(async (e: TelemetryEvent) => { + apiManager.fireTraceEvent(e); + if (e.name === Telemetry.SERVER_INITIALIZED_EVT) { + const javaSettings = getJavaSettingsForTelemetry(workspace.getConfiguration()); + + const properties= { ...e.properties, ...javaSettings }; + await Telemetry.sendTelemetry(Telemetry.STARTUP_EVT, properties); + } else if (e.name === Telemetry.LS_ERROR) { + const tags = []; + const exception: string = e?.properties.exception; + const message: string = e?.properties.message; + if (exception !== undefined) { + if (exception.includes("dtree.ObjectNotFoundException")) { + tags.push("dtree.ObjectNotFoundException"); + } + } + if (message !== undefined) { + if (message.includes("workspace exited with unsaved changes")) { + tags.push("workspace-exited-unsaved-changes"); + } + } + + if (tags.length > 0 || DEBUG || isPrereleaseOrInsiderVersion(context)) { + e.properties['tags'] = tags; + await Telemetry.sendTelemetry(Telemetry.LS_ERROR, e.properties); + } + } + }); + context.subscriptions.push(commands.registerCommand(GRADLE_CHECKSUM, (wrapper: string, sha256: string) => { setGradleWrapperChecksum(wrapper, sha256); })); @@ -418,27 +555,27 @@ export class StandardLanguageClient { })), // we can consider expose 'isFullBuild' according to users' feedback, // currently set it to true by default. - isFullBuild: isFullBuild === undefined ? true : isFullBuild, + isFullBuild: isFullBuild === undefined ? false : isFullBuild, }; return window.withProgress({ location: ProgressLocation.Window }, async p => { p.report({ message: 'Rebuilding projects...' }); - return new Promise(async (resolve, reject) => { - const start = new Date().getTime(); + const start = new Date().getTime(); - let res: CompileWorkspaceStatus; - try { - res = token ? await this.languageClient.sendRequest(BuildProjectRequest.type, params, token) : - await this.languageClient.sendRequest(BuildProjectRequest.type, params); - } catch (error) { - if (error && error.code === -32800) { // Check if the request is cancelled. - res = CompileWorkspaceStatus.cancelled; - } - reject(error); + let res: CompileWorkspaceStatus; + try { + res = token ? await this.languageClient.sendRequest(BuildProjectRequest.type, params, token) : + await this.languageClient.sendRequest(BuildProjectRequest.type, params); + } catch (error) { + if (error && error.code === -32800) { // Check if the request is cancelled. + res = CompileWorkspaceStatus.cancelled; } + throw error; + } - const elapsed = new Date().getTime() - start; - const humanVisibleDelay = elapsed < 1000 ? 1000 : 0; + const elapsed = new Date().getTime() - start; + const humanVisibleDelay = elapsed < 1000 ? 1000 : 0; + return new Promise(async (resolve, reject) => { setTimeout(() => { // set a timeout so user would still see the message when build time is short resolve(res); }, humanVisibleDelay); @@ -470,11 +607,7 @@ export class StandardLanguageClient { const humanVisibleDelay = elapsed < 1000 ? 1000 : 0; return new Promise((resolve, reject) => { setTimeout(() => { // set a timeout so user would still see the message when build time is short - if (res === CompileWorkspaceStatus.succeed) { - resolve(res); - } else { - reject(res); - } + resolve(res); }, humanVisibleDelay); }); }); @@ -524,6 +657,17 @@ export class StandardLanguageClient { } })); + context.subscriptions.push(commands.registerCommand(Commands.SHOW_EXTEND_OUTLINE, (location: any) => { + if (location instanceof Uri) { + extendedOutlineQuickPick.open(location); + } else { + if (window.activeTextEditor?.document?.languageId !== "java") { + return; + } + extendedOutlineQuickPick.open(window.activeTextEditor.document.uri); + } + })); + buildPath.registerCommands(context); sourceAction.registerCommands(this.languageClient, context); refactorAction.registerCommands(this.languageClient, context); @@ -558,7 +702,7 @@ export class StandardLanguageClient { } })); - context.subscriptions.push(commands.registerCommand(Commands.UPGRADE_GRADLE_WRAPPER, (projectUri: string, version?: string) => { + context.subscriptions.push(commands.registerCommand(Commands.UPGRADE_GRADLE_WRAPPER_CMD, (projectUri: string, version?: string) => { upgradeGradle(projectUri, version); })); @@ -573,6 +717,10 @@ export class StandardLanguageClient { pattern: "**/{gradle/wrapper/gradle-wrapper.properties,build.gradle,build.gradle.kts,settings.gradle,settings.gradle.kts}" }, new GradleCodeActionProvider(), gradleCodeActionMetadata); + languages.registerCodeActionsProvider({ + scheme: 'file', + language: 'java' + }, new ClientCodeActionProvider(context)); } private showGradleCompatibilityIssueNotification(message: string, options: string[], projectUri: string, gradleVersion: string, newJavaHome: string) { @@ -591,17 +739,65 @@ export class StandardLanguageClient { private registerCommandsForStandardServer(context: ExtensionContext, jdtEventEmitter: EventEmitter): void { context.subscriptions.push(commands.registerCommand(Commands.IMPORT_PROJECTS_CMD, async () => { - return await commands.executeCommand(Commands.EXECUTE_WORKSPACE_COMMAND, Commands.IMPORT_PROJECTS); + if (getJavaConfiguration().get("import.projectSelection") === "automatic") { + return await commands.executeCommand(Commands.EXECUTE_WORKSPACE_COMMAND, Commands.IMPORT_PROJECTS); + } + const projectUris: string[] = await getAllProjects(true /* excludeDefaultProject */); + const buildFileSelector = new BuildFileSelector(context, projectUris, false); + const selectedBuildFiles = await buildFileSelector.selectBuildFiles(); + if (selectedBuildFiles === undefined) { + return; // cancelled by user + } + const importedFolders = projectUris.map(uri => Uri.parse(uri).fsPath); + const allFoundBuildFiles = buildFileSelector.getAllFoundBuildFiles(); + const foldersContainingBuildFiles = allFoundBuildFiles.map(uri => path.dirname(uri.fsPath)); + + const filesToImport = new Set(); + const folderToUpdate = new Set(); + selectedBuildFiles.forEach(buildFile => { + const folder = path.dirname(Uri.parse(buildFile).fsPath); + if (importedFolders.some(importedFolder => path.relative(importedFolder, folder) === "")) { + // update the project if the folder of the build file is already imported + folderToUpdate.add(Uri.file(folder).toString()); + } else { + filesToImport.add(buildFile); + } + }); + + const folderToRemove = new Set(); + foldersContainingBuildFiles.forEach(folder => { + // for those unselected folders, if the folder is imported, delete the project. + const isSelected = selectedBuildFiles.some(buildFile => path.relative(path.dirname(Uri.parse(buildFile).fsPath), folder) === ""); + const isFolderImported = importedFolders.some(importedFolder => path.relative(importedFolder, folder) === ""); + + if (!isSelected && isFolderImported) { + folderToRemove.add(Uri.file(folder).toString()); + } + }); + + if (filesToImport.size > 0 || folderToUpdate.size > 0 || folderToRemove.size > 0) { + return await commands.executeCommand(Commands.EXECUTE_WORKSPACE_COMMAND, Commands.CHANGE_IMPORTED_PROJECTS, + Array.from(filesToImport), Array.from(folderToUpdate), Array.from(folderToRemove)); + } })); context.subscriptions.push(commands.registerCommand(Commands.OPEN_OUTPUT, () => this.languageClient.outputChannel.show(ViewColumn.Three))); - context.subscriptions.push(commands.registerCommand(Commands.SHOW_SERVER_TASK_STATUS, () => serverTaskPresenter.presentServerTaskView())); + context.subscriptions.push(commands.registerCommand(Commands.SHOW_SERVER_TASK_STATUS, (preserveFocus?: boolean) => serverTaskPresenter.presentServerTaskView(preserveFocus))); } public start(): Promise { if (this.languageClient && this.status === ClientStatus.initialized) { this.status = ClientStatus.starting; - return this.languageClient.start(); + return startWithStdioFallback({ + languageClient: this.languageClient, + serverOptions: this.serverOptions, + createLanguageClient: (serverOptions) => this.createLanguageClient(serverOptions, this.clientOptions), + pipeStartTimeout: PIPE_START_TIMEOUT_MS, + onFallback: (error) => logger.warn(`Falling back to 'stdio' (from 'pipe') because starting the pipe transport failed: ${error}`), + }).then(result => { + this.languageClient = result.client; + this.serverOptions = result.serverOptions; + }); } } @@ -624,6 +820,64 @@ export class StandardLanguageClient { public getClientStatus(): ClientStatus { return this.status; } + + private async handleSourceInvalidatedEvent(jars: string[], isAutoDownloadSource: boolean, jdtContentProviderEventEmitter: EventEmitter): Promise { + const changedJarNames: Set = new Set(); + for (const jar of jars) { + const path = jar.split(/\/|\\/); + if (path?.length) { + changedJarNames.add(path[path.length - 1]); + } + } + + const affectedDocumentUris: Uri[] = []; + const affectedDocumentNames: string[] = []; + workspace.textDocuments.forEach(document => { + // Here is a sample jdt uri for classfile: + // jdt://contents/rt.jar/java.lang/System.class?... + if (document.uri.scheme === "jdt") { + const paths = document.uri.path?.split(/\/|\\/); + if (paths?.[1] && changedJarNames.has(paths[1])) { + affectedDocumentNames.push(paths[paths.length - 1]); + affectedDocumentUris.push(document.uri); + } + } + }); + if (affectedDocumentUris.length) { + if (isAutoDownloadSource) { + const reloadSources = workspace.getConfiguration().get("java.editor.reloadChangedSources"); + if (reloadSources === "manual") { + return; + } + + if (reloadSources === "ask") { + const choice = await window.showWarningMessage(`The following class(es): ${affectedDocumentNames.map(name => `'${name}'`).join(", ")} ` + + "have new source jar available on the local Maven repository. Do you want to reload them?", "Yes", "Always", "No"); + if (choice === "Always") { + workspace.getConfiguration().update("java.editor.reloadChangedSources", "auto", ConfigurationTarget.Global); + } else if (choice !== "Yes") { + return; + } + } + } + affectedDocumentUris.forEach(classFileUri => { + jdtContentProviderEventEmitter.fire(classFileUri); + }); + } + apiManager.fireSourceInvalidatedEvent({ + affectedRootPaths: jars, + affectedEditorDocuments: affectedDocumentUris, + }); + } +} + +function updateJavaProjectsContext(): void { + getAllJavaProjects().then((projectUris) => { + const projectPaths = projectUris.map((uriString) => Uri.parse(uriString).fsPath.replace(/[\\/]$/, '')); + commands.executeCommand('setContext', 'java.projects', projectPaths); + }).catch((error) => { + logger.error(error); + }); } async function showImportFinishNotification(context: ExtensionContext) { @@ -719,4 +973,21 @@ export async function applyWorkspaceEdit(workspaceEdit: WorkspaceEdit, languageC } else { return Promise.resolve(true); } -} \ No newline at end of file +} + +/** + * 'workspace/willRenameFiles' already handled so we need to disable it. + * @see fileEventHandler.registerFileEventHandlers + */ +export class DisableWillRenameFeature implements StaticFeature { + fillClientCapabilities(capabilities: ClientCapabilities): void { + capabilities.workspace.fileOperations.willRename = false; + } + getState(): FeatureState { + return null; + } + clear(): void {} + fillInitializeParams?: () => void; + preInitialize?: () => void; + initialize(): void {} +} diff --git a/src/standardLanguageClientStart.ts b/src/standardLanguageClientStart.ts new file mode 100644 index 000000000..5ba496859 --- /dev/null +++ b/src/standardLanguageClientStart.ts @@ -0,0 +1,66 @@ +import { Executable, ServerOptions, TransportKind } from "vscode-languageclient/node"; + +export interface StartableLanguageClient { + start(): Promise; +} + +export interface StartWithStdioFallbackOptions { + languageClient: T; + serverOptions: ServerOptions; + createLanguageClient(serverOptions: Executable): T; + pipeStartTimeout: number; + onFallback?(error: any): void; +} + +class PipeStartTimeoutError extends Error { +} + +export async function startWithStdioFallback(options: StartWithStdioFallbackOptions): Promise<{ client: T; serverOptions: ServerOptions }> { + if (!isPipeExecutable(options.serverOptions)) { + await options.languageClient.start(); + return { client: options.languageClient, serverOptions: options.serverOptions }; + } + + try { + await startWithTimeout(options.languageClient, options.pipeStartTimeout); + return { client: options.languageClient, serverOptions: options.serverOptions }; + } catch (error) { + if (!(error instanceof PipeStartTimeoutError)) { + throw error; + } + options.onFallback?.(error); + const stdioServerOptions = createStdioServerOptions(options.serverOptions); + const stdioClient = options.createLanguageClient(stdioServerOptions); + await stdioClient.start(); + return { client: stdioClient, serverOptions: stdioServerOptions }; + } +} + +async function startWithTimeout(client: StartableLanguageClient, timeout: number): Promise { + let timeoutHandle: NodeJS.Timeout | undefined; + try { + await Promise.race([ + client.start(), + new Promise((_resolve, reject) => { + timeoutHandle = setTimeout(() => reject(new PipeStartTimeoutError(`Starting pipe transport timed out after ${timeout}ms.`)), timeout); + }) + ]); + } finally { + if (timeoutHandle) { + clearTimeout(timeoutHandle); + } + } +} + +function isPipeExecutable(serverOptions: ServerOptions): serverOptions is Executable { + return !!serverOptions && typeof (serverOptions as Executable).command === 'string' && (serverOptions as Executable).transport === TransportKind.pipe; +} + +function createStdioServerOptions(serverOptions: Executable): Executable { + return { + ...serverOptions, + args: serverOptions.args?.slice(), + options: serverOptions.options ? { ...serverOptions.options } : undefined, + transport: TransportKind.stdio, + }; +} diff --git a/src/syntaxLanguageClient.ts b/src/syntaxLanguageClient.ts index 6af9d4271..92f7d42fa 100644 --- a/src/syntaxLanguageClient.ts +++ b/src/syntaxLanguageClient.ts @@ -8,11 +8,14 @@ import { ClientErrorHandler } from "./clientErrorHandler"; import { ClientStatus } from "./extension.api"; import { logger } from "./log"; import { OutputInfoCollector } from "./outputInfoCollector"; -import { StatusNotification } from "./protocol"; +import { ExecuteClientCommandRequest, StatusNotification } from "./protocol"; import { RequirementsData } from "./requirements"; import { ServerMode } from "./settings"; import { snippetCompletionProvider } from "./snippetCompletionProvider"; import { getJavaConfig } from "./utils"; +import { DEBUG } from "./javaServerStarter"; +import { TracingLanguageClient } from "./TracingLanguageClient"; +import { commands } from "vscode"; const extensionName = "Language Support for Java (Syntax Server)"; @@ -27,7 +30,7 @@ export class SyntaxLanguageClient { didChangeConfiguration: async () => { await this.languageClient.sendNotification(DidChangeConfigurationNotification.type, { settings: { - java: getJavaConfig(requirements.java_home), + java: await getJavaConfig(requirements.java_home), } }); } @@ -36,7 +39,11 @@ export class SyntaxLanguageClient { errorHandler: new ClientErrorHandler(extensionName), initializationFailedHandler: error => { logger.error(`Failed to initialize ${extensionName} due to ${error && error.toString()}`); - return true; + if (error.toString().includes('Connection') && error.toString().includes('disposed')) { + return false; + } else { + return true; + } }, outputChannel: new OutputInfoCollector(extensionName), outputChannelName: extensionName @@ -55,7 +62,7 @@ export class SyntaxLanguageClient { } if (serverOptions) { - this.languageClient = new LanguageClient('java', extensionName, serverOptions, newClientOptions); + this.languageClient = new TracingLanguageClient('java', extensionName, serverOptions, newClientOptions, DEBUG); } this.status = ClientStatus.initialized; @@ -84,6 +91,9 @@ export class SyntaxLanguageClient { apiManager.fireDidServerModeChange(ServerMode.lightWeight); } }); + this.languageClient.onRequest(ExecuteClientCommandRequest.type, (params) => { + return commands.executeCommand(params.command, ...params.arguments); + }); } } diff --git a/src/telemetry.ts b/src/telemetry.ts new file mode 100644 index 000000000..35f702603 --- /dev/null +++ b/src/telemetry.ts @@ -0,0 +1,63 @@ +import { TelemetryService, getRedHatService } from "@redhat-developer/vscode-redhat-telemetry"; +import { ExtensionContext, workspace, WorkspaceConfiguration } from "vscode"; +import { cyrb53 } from "./utils"; + +/** + * Wrap vscode-redhat-telemetry to suit vscode-java + */ +export namespace Telemetry { + + export const STARTUP_EVT = "startup"; + export const COMPLETION_EVENT = "textCompletion"; + export const SERVER_INITIALIZED_EVT = "java.workspace.initialized"; + export const LS_ERROR = "java.ls.error"; + + let telemetryManager: TelemetryService = null; + let workspaceHash; + + /** + * Starts the telemetry service + * + * @returns when the telemetry service has been started + * @throws Error if the telemetry service has already been started + */ + export async function startTelemetry(context: ExtensionContext): Promise { + if (!!telemetryManager) { + throw new Error("The telemetry service for vscode-java has already been started"); + } + workspaceHash = computeWorkspaceHash(); + workspace.onDidChangeWorkspaceFolders(() => { + workspaceHash = computeWorkspaceHash(); + }); + const redhatService = await getRedHatService(context); + const telemService = await redhatService.getTelemetryService(); + telemetryManager = telemService; + return telemService; + } + + function computeWorkspaceHash(): number { + if (!workspace.workspaceFolders?.length) { + return 0; + } + return cyrb53(workspace.workspaceFolders.map(f => f.uri.toString()).join('|')); + } + + /** + * Send a telemetry event with the given name and data + * + * @param eventName the name of the telemetry event + * @param data the telemetry data + * @throws Error if the telemetry service has not been started yet + */ + export async function sendTelemetry(eventName: string, data?: object): Promise { + if (!telemetryManager) { + throw new Error("The telemetry service for vscode-java has not been started yet"); + } + + const event = { + name: eventName, + properties: { workspaceHash, ...data} + }; + return telemetryManager.send(event); + } +} diff --git a/src/themeUtils.ts b/src/themeUtils.ts new file mode 100644 index 000000000..a4634e7eb --- /dev/null +++ b/src/themeUtils.ts @@ -0,0 +1,20 @@ +import { SymbolKind as VSymbolKind, ThemeIcon } from "vscode"; +import { SymbolKind as LSymbolKind} from "vscode-languageclient"; + +const themeIconIds = [ + 'symbol-file', 'symbol-module', 'symbol-namespace', 'symbol-package', 'symbol-class', 'symbol-method', + 'symbol-property', 'symbol-field', 'symbol-constructor', 'symbol-enum', 'symbol-interface', + 'symbol-function', 'symbol-variable', 'symbol-constant', 'symbol-string', 'symbol-number', 'symbol-boolean', + 'symbol-array', 'symbol-object', 'symbol-key', 'symbol-null', 'symbol-enum-member', 'symbol-struct', + 'symbol-event', 'symbol-operator', 'symbol-type-parameter' +]; + +export function getLThemeIcon(kind: LSymbolKind): ThemeIcon | undefined { + const id = themeIconIds[kind - 1]; + return id ? new ThemeIcon(id) : undefined; +} + +export function getThemeIcon(kind: VSymbolKind): ThemeIcon | undefined { + const id = themeIconIds[kind]; + return id ? new ThemeIcon(id) : undefined; +} \ No newline at end of file diff --git a/src/typeHierarchy/model.ts b/src/typeHierarchy/model.ts index 92e8e08df..2be703797 100644 --- a/src/typeHierarchy/model.ts +++ b/src/typeHierarchy/model.ts @@ -5,6 +5,7 @@ import { getActiveLanguageClient } from "../extension"; import { LanguageClient } from "vscode-languageclient/node"; import { getRootItem, resolveTypeHierarchy, typeHierarchyDirectionToContextString } from "./util"; import { CancellationToken, commands, workspace } from "vscode"; +import { getThemeIcon } from "../themeUtils"; export class TypeHierarchyTreeInput implements SymbolTreeInput { readonly contextValue: string = "javaTypeHierarchy"; @@ -15,19 +16,25 @@ export class TypeHierarchyTreeInput implements SymbolTreeInput> { @@ -118,7 +125,7 @@ class TypeHierarchyTreeDataProvider implements vscode.TreeDataProvider { @@ -33,6 +41,19 @@ export function deleteDirectory(dir) { } } +export function deleteClientLog(dir) { + if (fs.existsSync(dir)) { + fs.readdirSync(dir).forEach((child) => { + if (child.startsWith('client.log') || child.endsWith('audit.json')) { + const entry = path.join(dir, child); + if (!fs.lstatSync(entry).isDirectory()) { + fs.unlinkSync(entry); + } + } + }); + } +} + export function getTimestamp(file) { if (!fs.existsSync(file)) { return -1; @@ -95,7 +116,11 @@ export function convertToGlob(filePatterns: string[], basePatterns?: string[]): return parseToStringGlob(patterns); } -export function getExclusionBlob(): string { +/** + * Merge the values of setting 'java.import.exclusions' into one glob pattern. + * @param additionalExclusions Additional exclusions to be merged into the glob pattern. + */ +export function getExclusionGlob(additionalExclusions?: string[]): string { const config = getJavaConfiguration(); const exclusions: string[] = config.get("import.exclusions", []); const patterns: string[] = []; @@ -106,6 +131,9 @@ export function getExclusionBlob(): string { patterns.push(exclusion); } + if (additionalExclusions) { + patterns.push(...additionalExclusions); + } return parseToStringGlob(patterns); } @@ -123,9 +151,24 @@ function parseToStringGlob(patterns: string[]): string { * @returns string array for the project uris. */ export async function getAllJavaProjects(excludeDefaultProject: boolean = true): Promise { - let projectUris: string[] = await commands.executeCommand(Commands.EXECUTE_WORKSPACE_COMMAND, Commands.GET_ALL_JAVA_PROJECTS); + const projectUris: string[] = await commands.executeCommand(Commands.EXECUTE_WORKSPACE_COMMAND, Commands.GET_ALL_JAVA_PROJECTS); + return filterDefaultProject(projectUris, excludeDefaultProject); +} + +/** + * Get all projects from Java Language Server. + * @param excludeDefaultProject whether the default project should be excluded from the list, defaults to true. + * @returns string array for the project uris. + */ +export async function getAllProjects(excludeDefaultProject: boolean = true): Promise { + const projectUris: string[] = await commands.executeCommand(Commands.EXECUTE_WORKSPACE_COMMAND, Commands.GET_ALL_JAVA_PROJECTS, + JSON.stringify({ includeNonJava: true })); + return filterDefaultProject(projectUris, excludeDefaultProject); +} + +function filterDefaultProject(projectUris: string[], excludeDefaultProject: boolean): string[] { if (excludeDefaultProject) { - projectUris = projectUris.filter((uriString) => { + return projectUris.filter((uriString) => { const projectPath = Uri.parse(uriString).fsPath; return path.basename(projectPath) !== "jdt.ls-java-project"; }); @@ -140,7 +183,7 @@ export async function hasBuildToolConflicts(): Promise { // ignore the folders that already has .project file (already imported before) const gradleDirectories = getDirectoriesByBuildFile(projectConfigurationFsPaths, eclipseDirectories, ".gradle"); const gradleDirectoriesKts = getDirectoriesByBuildFile(projectConfigurationFsPaths, eclipseDirectories, ".gradle.kts"); - gradleDirectories.concat(gradleDirectoriesKts); + gradleDirectories.push(...gradleDirectoriesKts); const mavenDirectories = getDirectoriesByBuildFile(projectConfigurationFsPaths, eclipseDirectories, "pom.xml"); return gradleDirectories.some((gradleDir) => { return mavenDirectories.includes(gradleDir); @@ -158,10 +201,10 @@ async function getBuildFilesInWorkspace(): Promise { buildFiles.push(...await workspace.findFiles(convertToGlob(inclusionFilePatterns, inclusionFolderPatterns), null /* force not use default exclusion */)); } - const inclusionBlob: string = convertToGlob(inclusionFilePatterns); - const exclusionBlob: string = getExclusionBlob(); - if (inclusionBlob) { - buildFiles.push(...await workspace.findFiles(inclusionBlob, exclusionBlob)); + const inclusionGlob: string = convertToGlob(inclusionFilePatterns); + const exclusionGlob: string = getExclusionGlob(); + if (inclusionGlob) { + buildFiles.push(...await workspace.findFiles(inclusionGlob, exclusionGlob)); } return buildFiles; @@ -175,8 +218,9 @@ function getDirectoriesByBuildFile(inclusions: string[], exclusions: string[], f }); } +const detectJdksAtStart: boolean = getJavaConfiguration().get('configuration.detectJdksAtStart'); -export function getJavaConfig(javaHome: string) { +export async function getJavaConfig(javaHome: string) { const origConfig = getJavaConfiguration(); const javaConfig = JSON.parse(JSON.stringify(origConfig)); javaConfig.home = javaHome; @@ -188,7 +232,9 @@ export function getJavaConfig(javaHome: string) { const editorConfig = workspace.getConfiguration('editor'); javaConfig.format.insertSpaces = editorConfig.get('insertSpaces'); javaConfig.format.tabSize = editorConfig.get('tabSize'); - const isInsider: boolean = version.includes("insider"); + const filesConfig = workspace.getConfiguration('files'); + javaConfig.associations = filesConfig.get('associations'); + const isInsider: boolean = isInsiderEditor(); const androidSupport = javaConfig.jdt.ls.androidSupport.enabled; switch (androidSupport) { case "auto": @@ -205,9 +251,162 @@ export function getJavaConfig(javaHome: string) { break; } - const completionCaseMatching = javaConfig.completion.matchCase; - if (completionCaseMatching === "auto") { - javaConfig.completion.matchCase = isInsider ? "firstLetter" : "off"; + const javacSupport = javaConfig.jdt.ls.javac.enabled; + switch (javacSupport) { + case "on": + javaConfig.jdt.ls.javac.enabled = true; + break; + case "off": + javaConfig.jdt.ls.javac.enabled = false; + break; + default: + javaConfig.jdt.ls.javac.enabled = false; + break; + } + + if (javaConfig.completion.matchCase === "auto") { + javaConfig.completion.matchCase = "firstLetter"; + } + + const guessMethodArguments = javaConfig.completion.guessMethodArguments; + if (guessMethodArguments === "auto") { + javaConfig.completion.guessMethodArguments = isInsider ? "off" : "insertBestGuessedArguments"; } + + javaConfig.telemetry = { enabled: workspace.getConfiguration('redhat.telemetry').get('enabled', false) }; + if (detectJdksAtStart) { + const userConfiguredJREs: any[] = javaConfig.configuration.runtimes; + javaConfig.configuration.runtimes = await addAutoDetectedJdks(userConfiguredJREs); + } + + if (!isPreferenceOverridden("java.implementationCodeLens") && typeof javaConfig.implementationsCodeLens?.enabled === 'boolean'){ + const deprecatedImplementations = javaConfig.implementationsCodeLens.enabled; + javaConfig.implementationCodeLens = deprecatedImplementations ? "types" : "none"; + } + return javaConfig; } + +async function addAutoDetectedJdks(configuredJREs: any[]): Promise { + // search valid JDKs from env.JAVA_HOME, env.PATH, SDKMAN, jEnv, jabba, Common directories + const autoDetectedJREs: IJavaRuntime[] = await listJdks(); + sortJdksByVersion(autoDetectedJREs); + sortJdksBySource(autoDetectedJREs); + const addedJreNames: Set = new Set(); + const supportedJreNames: string[] = getSupportedJreNames(); + for (const jre of configuredJREs) { + if (jre.name) { + addedJreNames.add(jre.name); + } + } + for (const jre of autoDetectedJREs) { + const majorVersion: number = jre.version?.major ?? 0; + if (!majorVersion) { + continue; + } + + let jreName: string = `JavaSE-${majorVersion}`; + if (majorVersion <= 5) { + jreName = `J2SE-1.${majorVersion}`; + } else if (majorVersion <= 8) { + jreName = `JavaSE-1.${majorVersion}`; + } + + if (addedJreNames.has(jreName) || !supportedJreNames?.includes(jreName)) { + continue; + } + + configuredJREs.push({ + name: jreName, + path: jre.homedir, + }); + + addedJreNames.add(jreName); + } + + return configuredJREs; +} + +export function resolveActualCause(callstack: any): any { + if (!callstack) { + return; + } + + const callstacks = callstack.split(/\r?\n/); + if (callstacks?.length) { + for (let i = callstacks.length - 1; i >= 0; i--) { + if (callstacks[i]?.startsWith("Caused by:")) { + return callstacks.slice(i).join("\n"); + } + } + } + + return callstack; +} + +export function getVersion(extensionPath: string): string { + const packagePath = path.resolve(extensionPath, "package.json"); + const packageFile = JSON.parse(fs.readFileSync(packagePath, 'utf8')); + if (packageFile) { + return packageFile.version; + } + + return '0.0.0'; +} + +export function getVSCodeVariablesMap(): any { + const keys = [ + "userHome", "workspaceFolder", "workspaceFolderBasename" + ]; + const res = {}; + keys.forEach(key => res[key] = vscodeVariables(`\${${key}}`)); + return res; +} + +/** + * Check if the extension version is a pre-release version or running an insider editor. + * @param context The extension context or extension path + * @returns true if the version is a pre-release version or running an insider editor + */ +export function isPrereleaseOrInsiderVersion(context: ExtensionContext | string): boolean { + return isInsiderEditor() || isPreReleaseVersion(context); +} + +/** + * Check if the extension version is a pre-release version. + * Pre-release versions follow the pattern: major.minor.timestamp (e.g., 1.47.1234567890) + * @param context The extension context or extension path + * @returns true if the version is a pre-release version + */ +export function isPreReleaseVersion(context: ExtensionContext | string): boolean { + const extensionPath = typeof context === 'string' ? context : context.extensionPath; + const extVersion = getVersion(extensionPath); + return /^\d+\.\d+\.\d{10}/.test(extVersion); +} + +/** + * Check if the editor is an insider release. + * @returns true if the editor is an insider release + */ +export function isInsiderEditor(): boolean { + return version.includes("insider"); +} +/* +* cyrb53 (c) 2018 bryc (github.com/bryc) +* Public domain (or MIT if needed). Attribution appreciated. +* A fast and simple 53-bit string hash function with decent collision resistance. +* Largely inspired by MurmurHash2/3, but with a focus on speed/simplicity. +*/ +export function cyrb53 (str, seed = 0) { + let h1 = 0xdeadbeef ^ seed, h2 = 0x41c6ce57 ^ seed; + for (let i = 0, ch; i < str.length; i++) { + ch = str.charCodeAt(i); + h1 = Math.imul(h1 ^ ch, 2654435761); + h2 = Math.imul(h2 ^ ch, 1597334677); + } + h1 = Math.imul(h1 ^ (h1 >>> 16), 2246822507); + h1 ^= Math.imul(h2 ^ (h2 >>> 13), 3266489909); + h2 = Math.imul(h2 ^ (h2 >>> 16), 2246822507); + h2 ^= Math.imul(h1 ^ (h1 >>> 13), 3266489909); + return 4294967296 * (2097151 & h2) + (h1 >>> 0); +}; diff --git a/src/webview/changeSignature/App.css b/src/webview/changeSignature/App.css new file mode 100644 index 000000000..102e8222f --- /dev/null +++ b/src/webview/changeSignature/App.css @@ -0,0 +1,326 @@ +@import "../../../node_modules/@vscode/codicons/dist/codicon.css"; + +main { + max-width: 600px; + margin-left: auto; + margin-right: auto; + color: var(--vscode-foreground); + font-family: var(--vscode-font-family); + font-size: var(--vscode-font-size); +} + +.section { + margin-bottom: 0; +} + +.section-columns { + display: flex; + width: 100%; + padding-left: 4px; +} + +.text-title { + margin: 0; + height: 21px; +} + +.text-title-content { + padding: 0 0 0 4px; + margin: 0.5rem 0 0 0; + height: 21px; +} + +.header-left { + flex-direction: column; + display: flex; + padding: 0.5rem 0.5rem 0.5rem 0; + flex: 0 0 33%; + box-sizing: border-box; +} + +.header { + flex-direction: column; + display: flex; + padding: 0.5rem; + flex: 0 0 33%; + box-sizing: border-box; +} + +.header-right { + flex-direction: column; + display: flex; + padding: 0.5rem 0 0.5rem 0.5rem; + flex: 0 0 33%; + box-sizing: border-box; +} + +/* Form controls -------------------------------------------------------- */ + +.vsc-textfield, +.vsc-dropdown { + box-sizing: border-box; + width: 100%; + height: 26px; + padding: 2px 6px; + color: var(--vscode-input-foreground); + background-color: var(--vscode-input-background); + border: 1px solid var(--vscode-dropdown-border, var(--vscode-input-border, transparent)); + border-radius: 2px; + font-family: inherit; + font-size: inherit; + outline: none; +} + +.vsc-textfield:focus, +.vsc-dropdown:focus { + border-color: var(--vscode-focusBorder); +} + +.vsc-dropdown { + cursor: pointer; +} + +/* Buttons -------------------------------------------------------------- */ + +.btn { + display: inline-flex; + align-items: center; + justify-content: center; + box-sizing: border-box; + height: 26px; + padding: 0 11px; + border: 1px solid var(--vscode-button-border, transparent); + border-radius: 2px; + font-family: inherit; + font-size: inherit; + cursor: pointer; + outline: none; +} + +.btn:focus-visible { + outline: 1px solid var(--vscode-focusBorder); + outline-offset: 2px; +} + +.btn:disabled { + opacity: 0.4; + cursor: default; +} + +.btn-primary { + color: var(--vscode-button-foreground); + background-color: var(--vscode-button-background); +} + +.btn-primary:hover:not(:disabled) { + background-color: var(--vscode-button-hoverBackground); +} + +.btn-secondary { + color: var(--vscode-button-secondaryForeground); + background-color: var(--vscode-button-secondaryBackground); +} + +.btn-secondary:hover:not(:disabled) { + background-color: var(--vscode-button-secondaryHoverBackground); +} + +.btn-icon { + height: 22px; + width: 22px; + padding: 0; + color: var(--vscode-icon-foreground); + background-color: transparent; + border: none; + border-radius: 4px; +} + +.btn-icon:hover:not(:disabled) { + background-color: var(--vscode-toolbar-hoverBackground); +} + +.vsc-button-left { + float: left; + margin: 0 0.5rem 0.5rem 0; +} + +.vsc-button { + float: left; + margin: 0 0.5rem 0.5rem 0.5rem; +} + +.add-button { + margin: 0.5rem 0 0 0; +} + +.bottom-buttons { + padding: 0 0 0 4px; + margin: 0.5rem 0 0 0; + overflow: hidden; +} + +.preview { + box-sizing: border-box; + margin: 0 0 0.5rem 0; + width: 99%; + color: var(--vscode-input-foreground); + background-color: var(--vscode-input-background); + border: 1px solid var(--vscode-input-border, transparent); + border-radius: 2px; + padding: 4px 6px; + font-family: var(--vscode-editor-font-family, monospace); + font-size: inherit; + resize: vertical; + outline: none; +} + +.preview:focus { + border-color: var(--vscode-focusBorder); +} + +/* Tabs ----------------------------------------------------------------- */ + +.parameters-panel { + margin: 0; + width: calc(99% + 4px); +} + +.tabs { + display: flex; + border-bottom: 1px solid var(--vscode-panel-border, var(--vscode-editorGroup-border)); +} + +.tab { + padding: 6px 10px; + background-color: transparent; + border: none; + border-bottom: 1px solid transparent; + color: var(--vscode-panelTitle-inactiveForeground, var(--vscode-foreground)); + font-family: inherit; + font-size: inherit; + cursor: pointer; + outline: none; +} + +.tab:hover { + color: var(--vscode-panelTitle-activeForeground, var(--vscode-foreground)); +} + +.tab-active { + color: var(--vscode-panelTitle-activeForeground, var(--vscode-foreground)); + border-bottom-color: var(--vscode-panelTitle-activeBorder, var(--vscode-focusBorder)); +} + +.tab:focus-visible { + outline: 1px solid var(--vscode-focusBorder); + outline-offset: -1px; +} + +.parameters-view { + padding: 0 0 0 4px; + display: flex; + flex-direction: column; +} + +.parameters-view[hidden] { + display: none; +} + +/* Table ---------------------------------------------------------------- */ + +.parameter-table { + width: 100%; + border-collapse: collapse; + table-layout: fixed; +} + +.parameter-table th, +.parameter-table td { + text-align: left; + vertical-align: middle; + padding: 2px 4px; + height: 26px; + box-sizing: border-box; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +.parameter-cell-title { + padding-left: 4px; + font-weight: 600; +} + +.parameter-cell-header { + background-color: var(--vscode-keybindingTable-headerBackground); +} + +.parameter-cell { + padding-left: 4px; +} + +.parameter-cell-edit { + padding: 0 4px; + background-color: var(--vscode-input-background); +} + +.parameter-input { + box-sizing: border-box; + width: 100%; + height: 100%; + padding: 0; + border: 0; + outline: none; + background-color: transparent; + color: var(--vscode-input-foreground); + font-family: inherit; + font-size: inherit; +} + +.parameter-cell-edit-button, +.parameter-cell-button { + padding: 0; + border: 0; + text-align: right; + width: 1%; + white-space: nowrap; +} + +.parameter-cell-edit-button { + background-color: var(--vscode-input-background); +} + +.table-buttons { + display: inline-flex; + justify-content: flex-end; +} + +.table-buttons-edit { + display: inline-flex; + justify-content: flex-end; +} + +.table-buttons-edit-ok { + margin-left: 0.2rem; + margin-right: 0.2rem; +} + +.table-buttons-edit-cancel { + margin: 0; +} + +/* Checkbox ------------------------------------------------------------- */ + +.delegate { + display: flex; + align-items: center; + gap: 6px; + padding: 0 0 0 4px; + margin: 0.5rem 0 0.5rem 0; + cursor: pointer; +} + +.delegate input[type="checkbox"] { + accent-color: var(--vscode-checkbox-background); + cursor: pointer; +} diff --git a/src/webview/changeSignature/App.tsx b/src/webview/changeSignature/App.tsx new file mode 100644 index 000000000..4e33a3e16 --- /dev/null +++ b/src/webview/changeSignature/App.tsx @@ -0,0 +1,603 @@ +/* eslint-disable @typescript-eslint/naming-convention */ +/* eslint-disable @typescript-eslint/prefer-for-of */ +import "./App.css"; +import React from "react"; +import { vscode } from "../vscodeApiWrapper"; +import cloneDeep from "lodash/cloneDeep"; + +type State = UIState & Metadata; + +type ActiveTab = "parameters" | "exceptions"; + +interface UIState { + focusRow: number; + editParameterRow: number; + editExceptionRow: number; + activeTab: ActiveTab; +} + +interface Metadata { + methodIdentifier: string | undefined; + isDelegate: boolean; + methodName: string | undefined; + accessType: string | undefined; + returnType: string | undefined; + parameters: MethodParameter[]; + exceptions: MethodException[]; +} + +interface MethodParameter { + type: string; + name: string; + defaultValue: string; + originalIndex: number; +} + +interface MethodException { + type: string; + typeHandleIdentifier: string | undefined; +} + +export class App extends React.Component<{}, State> { + + private initialMetadata: Metadata; + private static TOOLTIP_RETURN_TYPE: string = "The method return type, can be either name or fully qualified name of the type."; + private static TOOLTIP_PARAMETER_TYPE: string = "The parameter type, can be either name or fully qualified name of the type."; + private static TOOLTIP_PARAMETER_DEFAULT: string = "The parameter default value, used when replacing the occurrences for an added parameter."; + private static TOOLTIP_EXCEPTION_TYPE: string = "The exception type, can be either name or fully qualified name of the type."; + + constructor(props: any) { + super(props); + this.state = { + focusRow: -1, + editParameterRow: -1, + editExceptionRow: -1, + activeTab: "parameters", + methodIdentifier: undefined, + isDelegate: false, + methodName: undefined, + accessType: undefined, + returnType: undefined, + parameters: [], + exceptions: [] + }; + } + + doRefactor = (preview: boolean) => { + vscode.postMessage({ + preview: preview, + command: "doRefactor", + methodIdentifier: this.state.methodIdentifier, + isDelegate: this.state.isDelegate, + accessType: this.getModifierString(this.state.accessType), + methodName: this.state.methodName, + returnType: this.state.returnType, + parameters: this.state.parameters, + exceptions: this.state.exceptions, + }); + }; + + onChange = (event: any) => { + const id = event.target.id as string; + if (!id) { + return; + } + if (id === "access-modifier") { + this.setState({ + accessType: event.target.value + }); + } else if (id === "returnType") { + this.setState({ + returnType: event.target.value + }); + } else if (id === "methodName") { + this.setState({ + methodName: event.target.value + }); + } else if (id === "delegate") { + this.setState({ + isDelegate: event.target.checked + }); + } + return; + }; + + getPreview = () => { + let parameters = ""; + for (let i = 0; i < this.state.parameters.length; i++) { + parameters += `${this.state.parameters[i].type} ${this.state.parameters[i].name}, `; + } + parameters = parameters.substring(0, parameters.length - 2); + let exceptions = ""; + if (this.state.exceptions.length) { + exceptions = " throws "; + for (let i = 0; i < this.state.exceptions.length; i++) { + exceptions += `${this.state.exceptions[i].type}, `; + } + exceptions = exceptions.substring(0, exceptions.length - 2); + } + let accessTypeString = this.getModifierString(this.state.accessType); + if (accessTypeString?.length) { + accessTypeString += " "; + } + return `${accessTypeString}${this.state.returnType} ${this.state.methodName}(${parameters})${exceptions}`; + }; + + onClick = (event: any) => { + const id = event.target.id as string; + if (!id) { + return; + } + if (id === "tab-parameters") { + this.setState({ activeTab: "parameters", focusRow: -1 }); + } else if (id === "tab-exceptions") { + this.setState({ activeTab: "exceptions", focusRow: -1 }); + } else if (id === "refactor") { + this.doRefactor(false); + } else if (id === "preview") { + this.doRefactor(true); + } else if (id === "reset") { + this.setState({ + methodIdentifier: this.initialMetadata.methodIdentifier, + isDelegate: this.initialMetadata.isDelegate, + accessType: this.initialMetadata.accessType, + methodName: this.initialMetadata.methodName, + returnType: this.initialMetadata.returnType, + parameters: cloneDeep(this.initialMetadata.parameters), + exceptions: cloneDeep(this.initialMetadata.exceptions), + focusRow: -1, + editParameterRow: -1, + editExceptionRow: -1, + }); + } else if (id === "addParameter") { + const parameterNames = this.state.parameters.map(e => { + return e.name; + }); + let newParameterName: string = "newParam"; + let i = 1; + while (parameterNames.includes(newParameterName)) { + i++; + newParameterName = `newParam${i}`; + } + this.setState({ + parameters: [...this.state.parameters, { + type: "Object", + name: newParameterName, + defaultValue: "null", + originalIndex: -1 + }] + }); + } else if (id.startsWith("removeParameter")) { + const selectedRowNumber: number | undefined = this.getSelectedRowNumber(id); + if (selectedRowNumber === undefined) { + return; + } + this.setState({ + parameters: this.state.parameters.filter((e, i) => { + return i !== selectedRowNumber; + }) + }); + } else if (id.startsWith("editParameter")) { + const selectedRowNumber: number | undefined = this.getSelectedRowNumber(id); + if (selectedRowNumber === undefined) { + return; + } + this.setState({ + editParameterRow: selectedRowNumber, + editExceptionRow: -1, + focusRow: -1, + }, () => { + const elementToSelect = document.getElementById(`parameterType-${selectedRowNumber}`) as HTMLInputElement | null; + if (elementToSelect) { + elementToSelect.focus(); + elementToSelect.select(); + } + }); + } else if (id.startsWith("editException")) { + const selectedRowNumber: number | undefined = this.getSelectedRowNumber(id); + if (selectedRowNumber === undefined) { + return; + } + this.setState({ + editParameterRow: -1, + editExceptionRow: selectedRowNumber, + focusRow: -1, + }, () => { + const elementToSelect = document.getElementById(`exceptionType-${selectedRowNumber}`) as HTMLInputElement | null; + if (elementToSelect) { + elementToSelect.focus(); + elementToSelect.select(); + } + }); + } else if (id.startsWith("upParameter")) { + const selectedRowNumber: number | undefined = this.getSelectedRowNumber(id); + if (selectedRowNumber === undefined) { + return; + } + const currentParameters = this.state.parameters; + const temp = currentParameters[selectedRowNumber - 1]; + currentParameters[selectedRowNumber - 1] = currentParameters[selectedRowNumber]; + currentParameters[selectedRowNumber] = temp; + this.setState({ + parameters: currentParameters + }); + } else if (id.startsWith("downParameter")) { + const selectedRowNumber: number | undefined = this.getSelectedRowNumber(id); + if (selectedRowNumber === undefined) { + return; + } + const currentParameters = this.state.parameters; + const temp = currentParameters[selectedRowNumber + 1]; + currentParameters[selectedRowNumber + 1] = currentParameters[selectedRowNumber]; + currentParameters[selectedRowNumber] = temp; + this.setState({ + parameters: currentParameters + }); + } else if (id === "addException") { + const exceptionNames = this.state.exceptions.map(e => { + return e.type; + }); + let newExceptionName: string = "Exception"; + let i = 1; + while (exceptionNames.includes(newExceptionName)) { + i++; + newExceptionName = `Exception${i}`; + } + this.setState({ + exceptions: [...this.state.exceptions, { + type: newExceptionName, + typeHandleIdentifier: undefined, + }] + }); + } else if (id.startsWith("removeException")) { + const selectedRowNumber: number | undefined = this.getSelectedRowNumber(id); + if (selectedRowNumber === undefined) { + return; + } + this.setState({ + exceptions: this.state.exceptions.filter((e, i) => { + return i !== selectedRowNumber; + }) + }); + } else if (id.startsWith("confirmParameter")) { + const selectedRowNumber: number | undefined = this.getSelectedRowNumber(id); + if (selectedRowNumber === undefined) { + return; + } + const parameterType = document.getElementById(`parameterType-${selectedRowNumber}`) as HTMLInputElement | null; + const parameterName = document.getElementById(`parameterName-${selectedRowNumber}`) as HTMLInputElement | null; + const parameterDefault = this.isDefaultValueEditable(selectedRowNumber) ? document.getElementById(`parameterDefault-${selectedRowNumber}`) as HTMLInputElement | null : undefined; + this.setState({ + parameters: this.state.parameters.map((e, i) => { + if (i === selectedRowNumber) { + if (parameterType?.value) { + e.type = parameterType.value; + } + if (parameterName?.value) { + e.name = parameterName.value; + } + if (parameterDefault?.value) { + e.defaultValue = parameterDefault.value; + } + } + return e; + }), + editParameterRow: -1, + editExceptionRow: -1, + focusRow: -1 + }); + } else if (id.startsWith("cancelParameter")) { + const selectedRowNumber: number | undefined = this.getSelectedRowNumber(id); + if (selectedRowNumber === undefined) { + return; + } + this.setState({ + editParameterRow: -1, + editExceptionRow: -1, + focusRow: -1 + }); + } else if (id.startsWith("confirmException")) { + const selectedRowNumber: number | undefined = this.getSelectedRowNumber(id); + if (selectedRowNumber === undefined) { + return; + } + const exceptionType = document.getElementById(`exceptionType-${selectedRowNumber}`) as HTMLInputElement | null; + this.setState({ + exceptions: this.state.exceptions.map((e, i) => { + if (i === selectedRowNumber) { + if (exceptionType?.value) { + e.type = exceptionType.value; + } + } + return e; + }), + editParameterRow: -1, + editExceptionRow: -1, + focusRow: -1 + }); + } else if (id.startsWith("cancelException")) { + const selectedRowNumber: number | undefined = this.getSelectedRowNumber(id); + if (selectedRowNumber === undefined) { + return; + } + this.setState({ + editParameterRow: -1, + editExceptionRow: -1, + focusRow: -1 + }); + } + }; + + handleMessage = (event: any) => { + const { data } = event; + const command = data.command as string; + if (command === "setInitialState") { + this.initialMetadata = { + methodIdentifier: data.methodIdentifier, + isDelegate: false, + accessType: this.getAccessTypeString(data.modifier), + methodName: data.methodName, + returnType: data.returnType, + parameters: data.parameters, + exceptions: data.exceptions, + }; + this.setState({ + methodIdentifier: this.initialMetadata.methodIdentifier, + isDelegate: this.initialMetadata.isDelegate, + accessType: this.initialMetadata.accessType, + methodName: this.initialMetadata.methodName, + returnType: this.initialMetadata.returnType, + parameters: cloneDeep(this.initialMetadata.parameters), + exceptions: cloneDeep(this.initialMetadata.exceptions), + }); + } + }; + + onMouseEnter = (event: any) => { + const currentTarget = event.currentTarget as HTMLElement | null; + const target = event.target as HTMLElement | null; + const id = currentTarget?.id || target?.id || currentTarget?.closest("tr")?.id || target?.closest("tr")?.id || ""; + if (id.includes("Header")) { + this.setState({ + focusRow: -1 + }); + } else if (id) { + const selectedRowNumber: number | undefined = this.getSelectedRowNumber(id); + if (selectedRowNumber !== undefined) { + this.setState({ + focusRow: selectedRowNumber + }); + } + } + }; + + onMouseLeave = (event: any) => { + this.setState({ + focusRow: -1 + }); + }; + + componentDidMount(): void { + window.addEventListener("message", this.handleMessage); + vscode.postMessage({ + command: "webviewReady" + }); + } + + isUnchanged = () => { + return this.state.isDelegate === this.initialMetadata?.isDelegate + && this.state.accessType === this.initialMetadata?.accessType + && this.state.methodName === this.initialMetadata?.methodName + && this.state.returnType === this.initialMetadata?.returnType + && this.isArrayEqual(this.state.parameters, this.initialMetadata?.parameters) + && this.isArrayEqual(this.state.exceptions, this.initialMetadata?.exceptions); + }; + + isArrayEqual = (a: any[], b: any[]) => { + return Array.isArray(a) && Array.isArray(b) && a.length === b.length && a.every((e, i) => this.objectsEqual(e, b[i])); + }; + + objectsEqual = (o1, o2) => { + return typeof o1 === 'object' && Object.keys(o1).length > 0 + ? Object.keys(o1).length === Object.keys(o2).length + && Object.keys(o1).every(p => this.objectsEqual(o1[p], o2[p])) + : o1 === o2; + }; + + isDefaultValueEditable = (row: number) => { + return this.state.parameters[row].originalIndex === -1; + }; + + getDefaultValue = (row: number) => { + return this.isDefaultValueEditable(row) ? this.state.parameters[row].defaultValue : "-"; + }; + + /** + * Render a table cell whose value can be edited. When editing, a real + * control is rendered so that the typed text is visibly rendered + * and read back reliably via its value (see redhat-developer/vscode-java#4417). + */ + renderEditableCell = (id: string, value: string, editing: boolean, editable: boolean) => { + return + {editable + ? + : {value}} + ; + }; + + generateParameterDataGridRow = (row: number) => { + const editing = row === this.state.editParameterRow; + return + {this.renderEditableCell(`parameterType-${row}`, this.state.parameters[row].type, editing, editing)} + {this.renderEditableCell(`parameterName-${row}`, this.state.parameters[row].name, editing, editing)} + {this.renderEditableCell(`parameterDefault-${row}`, this.getDefaultValue(row), editing, editing && this.isDefaultValueEditable(row))} + + {editing ? +
+ + +
: row === this.state.focusRow ?
+ {row === 0 ? <> : } + {row === this.state.parameters.length - 1 ? <> : } + + +
:
+ } + + ; + }; + + generateExceptionDataGridRow = (row: number) => { + const editing = row === this.state.editExceptionRow; + return + {this.renderEditableCell(`exceptionType-${row}`, this.state.exceptions[row].type, editing, editing)} + + {editing ? +
+ + +
: row === this.state.focusRow ?
+ + +
:
+ } + + ; + }; + + render = () => { + return ( +
+

Change Method Signature

+
+
+
+
Access modifier:
+ +
+
+
Return type:
+ +
+
+
Method name:
+ +
+
+
+
+
+ + +
+ + +
+
Method signature:
+ + +
+ + + +
+
+ ); + }; + + /** + * get the row number of the item id. The format is `${description}-${rowNumber}`. + * @param id the item id + * @returns the row number, or undefined if the id is not in the correct format + */ + private getSelectedRowNumber(id: string): number | undefined { + const idSplit: string[] = id.split("-"); + if (idSplit.length !== 2) { + return undefined; + } + return Number(idSplit[1]); + } + + private getModifierString(accessType: string | undefined): string { + if (!accessType || accessType === "package-private") { + return ""; + } + return accessType; + } + + private getAccessTypeString(visibility: string): string { + if (visibility === "") { + return "package-private"; + } + return visibility; + } + +} diff --git a/src/webview/changeSignature/index.tsx b/src/webview/changeSignature/index.tsx new file mode 100644 index 000000000..16e025841 --- /dev/null +++ b/src/webview/changeSignature/index.tsx @@ -0,0 +1,10 @@ +import React from "react"; +import ReactDOM from "react-dom"; +import { App } from "./App"; + +ReactDOM.render( + + + , + document.getElementById("root") +); diff --git a/src/webview/dashboard/dashboard.css b/src/webview/dashboard/dashboard.css new file mode 100644 index 000000000..96ed2d363 --- /dev/null +++ b/src/webview/dashboard/dashboard.css @@ -0,0 +1,14 @@ +@import "../../../node_modules/@vscode/codicons/dist/codicon.css"; + +.toolbar { + margin: 8px; + width: 100%; + display: flex; + flex-flow: row nowrap; + gap: 4px; + justify-content: flex-end; +} + +.toolbarItem { + color: var(--vscode-sideBarSectionHeader-foreground); +} \ No newline at end of file diff --git a/src/webview/dashboard/dashboard.tsx b/src/webview/dashboard/dashboard.tsx new file mode 100644 index 000000000..699157f21 --- /dev/null +++ b/src/webview/dashboard/dashboard.tsx @@ -0,0 +1,104 @@ +/* eslint-disable @typescript-eslint/naming-convention */ +/* eslint-disable @typescript-eslint/prefer-for-of */ +import React from "react"; +import { vscode } from "../vscodeApiWrapper"; +import { Jvms } from "./jvms"; +import { DiagnosticInfo, JVM, ToDashboardMessage, ToDashboardMessageType, UpdateMessage } from "../../webviewProtocol/toDashboard"; +import './dashboard.css'; + +type State = { + workspacePath: string; + jvms: JVM[]; + lombokEnabled: boolean; + activeLombokPath: string | undefined; + diagnosticInfo: DiagnosticInfo | undefined; +}; + +export interface AppProps { +} + +function openSettingsLink(settingId: string): string { + const args = { + query: settingId + }; + return `command:workbench.action.openSettings?${encodeURIComponent(JSON.stringify(args))}`; +} + +export class Dashboard extends React.Component { + + constructor(props: AppProps) { + super(props); + this.state = { + workspacePath: 'unknown', + jvms: [], + lombokEnabled: false, + activeLombokPath: 'unknown', + diagnosticInfo: { + mavenUserSettings: 'unknown', + mavenGlobalSettings: 'unknown', + activeImporters: [], + gradleUserHome: 'unknown', + gradleJavaHome: 'unknown' + } + }; + } + + handleMessage = (event: MessageEvent) => { + const message = event.data as ToDashboardMessage; + switch (message.type) { + case "update": { + for (const [key, value] of Object.entries(message as UpdateMessage)) { + this.setState({ [key]: value } as Pick); + } + } + break; + } + }; + + componentDidMount(): void { + window.addEventListener("message", this.handleMessage); + vscode.postMessage({ + command: "webviewReady" + }); + } + + + render = () => { + + const args = [ { + path: this.state.workspacePath + }]; + return ( +
+
+ + +
+

Workspace

+
Language Server Workspace: {this.state.workspacePath || 'undefined'}
+ +

Detected Java Installations

+ + configure... +
+

Lombok Support

+
+ enabled + + configure... +
+
Using Lombok at: {this.state.activeLombokPath || ''}
+

Maven

+
User Settings: {this.state.diagnosticInfo?.mavenUserSettings || 'undefined'} configure...
+
Global Settings: {this.state.diagnosticInfo?.mavenGlobalSettings || 'undefined'} configure...
+

Gradle

+
User Home: {this.state.diagnosticInfo?.gradleUserHome || 'undefined'} configure...
+
Java Home: {this.state.diagnosticInfo?.gradleJavaHome || 'undefined'} configure...
+

Registered Project Importers

+ {this.state.diagnosticInfo?.activeImporters.map((clazz, index) => ( +
{clazz}
+ ))} +
+ ); + }; +} diff --git a/src/webview/dashboard/index.tsx b/src/webview/dashboard/index.tsx new file mode 100644 index 000000000..ee2cd1ea5 --- /dev/null +++ b/src/webview/dashboard/index.tsx @@ -0,0 +1,11 @@ +import React from "react"; +import ReactDOM from "react-dom"; +import { Dashboard } from "./dashboard"; + + +ReactDOM.render( + + + , + document.getElementById('root') +); \ No newline at end of file diff --git a/src/webview/dashboard/jvms.css b/src/webview/dashboard/jvms.css new file mode 100644 index 000000000..0748e852f --- /dev/null +++ b/src/webview/dashboard/jvms.css @@ -0,0 +1,22 @@ +.jvm-table { + text-align: left; + width: 100%; + border-collapse: collapse; + border: 1px solid var(--vscode-panel-border); +} + +.jvm-table td{ + border-left: 1px solid var(--vscode-panel-border); +} + +.jvm-table th{ + border-bottom: 1px solid var(--vscode-panel-border); +} + +.jvm-table th>td { + background-color: var(--vscode-sideBarSectionHeader-background); +} + +.jvm-table tbody tr.odd { + background-color: var(--vscode-tree-tableOddRowsBackground); +} \ No newline at end of file diff --git a/src/webview/dashboard/jvms.tsx b/src/webview/dashboard/jvms.tsx new file mode 100644 index 000000000..780219770 --- /dev/null +++ b/src/webview/dashboard/jvms.tsx @@ -0,0 +1,37 @@ +import React from "react"; +import { JVM } from "../../webviewProtocol/toDashboard"; +import path from "path"; +import './jvms.css'; + +export interface JvmsProps { + jvms: JVM[]; +} + +export class Jvms extends React.Component { + constructor(props: any) { + super(props); + this.state = { + }; + } + + render = () => { + return ( + + + + + + + + + {this.props.jvms.map((jvm, index) => ( + + + + + ))} + +
NamePath
{jvm.name}{jvm.path}
+ ); + }; +} \ No newline at end of file diff --git a/src/webview/vscodeApiWrapper.ts b/src/webview/vscodeApiWrapper.ts new file mode 100644 index 000000000..0b0eaa011 --- /dev/null +++ b/src/webview/vscodeApiWrapper.ts @@ -0,0 +1,41 @@ +import type { WebviewApi } from "vscode-webview"; + +/** + * A utility wrapper around the acquireVsCodeApi() function, which enables + * message passing and state management between the webview and extension + * contexts. + * + * This utility also enables webview code to be run in a web browser-based + * dev server by using native web browser features that mock the functionality + * enabled by acquireVsCodeApi. + */ +class VSCodeAPIWrapper { + private readonly vsCodeApi: WebviewApi | undefined; + + constructor() { + // Check if the acquireVsCodeApi function exists in the current development + // context (i.e. VS Code development window or web browser) + if (typeof acquireVsCodeApi === "function") { + this.vsCodeApi = acquireVsCodeApi(); + } + } + + /** + * Post a message (i.e. send arbitrary data) to the owner of the webview. + * + * @remarks When running webview code inside a web browser, postMessage will instead + * log the given message to the console. + * + * @param message Abitrary data (must be JSON serializable) to send to the extension context. + */ + public postMessage(message: unknown) { + if (this.vsCodeApi) { + this.vsCodeApi.postMessage(message); + } else { + console.log(`VS Code API not available, raw message: ${message}`); + } + } +} + +// Exports class singleton to prevent multiple invocations of acquireVsCodeApi. +export const vscode = new VSCodeAPIWrapper(); diff --git a/src/webviewProtocol/common.ts b/src/webviewProtocol/common.ts new file mode 100644 index 000000000..efb51cd9f --- /dev/null +++ b/src/webviewProtocol/common.ts @@ -0,0 +1,6 @@ +export interface WebviewMessage { + type: T; +} + +export type FromWebviewMessageType = "webviewReady"; +export type ToWebviewMessageType = "update"; \ No newline at end of file diff --git a/src/webviewProtocol/fromDashboard.ts b/src/webviewProtocol/fromDashboard.ts new file mode 100644 index 000000000..f1d0ace2d --- /dev/null +++ b/src/webviewProtocol/fromDashboard.ts @@ -0,0 +1,8 @@ +import { FromWebviewMessageType, WebviewMessage } from "./common"; + +export type FromDashboardMessageType = FromWebviewMessageType; + +export interface DashboardMessage extends WebviewMessage { + message: FromDashboardMessageType; +} + diff --git a/src/webviewProtocol/toDashboard.ts b/src/webviewProtocol/toDashboard.ts new file mode 100644 index 000000000..df4133284 --- /dev/null +++ b/src/webviewProtocol/toDashboard.ts @@ -0,0 +1,32 @@ +import { Diagnostic } from "vscode"; +import { ToWebviewMessageType, WebviewMessage } from "./common"; + +export type ToDashboardMessageType = ToWebviewMessageType; + +export interface ToDashboardMessage extends WebviewMessage { +} + +export interface JVM { + name: string; + path: string; +} + +export interface DashboardState { + jvms?: JVM[]; + workspacePath?: string; + lombokEnabled?: boolean; + activeLombokPath?: string | undefined; + diagnosticInfo?: DiagnosticInfo; +} + +export interface DiagnosticInfo { + readonly mavenUserSettings: string; + readonly mavenGlobalSettings: string; + readonly activeImporters: string[]; + readonly gradleUserHome: string; + readonly gradleJavaHome: string; +} + +export interface UpdateMessage extends ToDashboardMessage, DashboardState { + type: "update"; +} \ No newline at end of file diff --git a/src/webviewUtils.ts b/src/webviewUtils.ts new file mode 100644 index 000000000..3d79f13d4 --- /dev/null +++ b/src/webviewUtils.ts @@ -0,0 +1,14 @@ +import { Uri, Webview } from "vscode"; + +export function getUri(webview: Webview, extensionUri: Uri, ...pathList: string[]) { + return webview.asWebviewUri(Uri.joinPath(extensionUri, ...pathList)); +} + +export function getNonce() { + let text = ""; + const possible = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"; + for (let i = 0; i < 32; i++) { + text += possible.charAt(Math.floor(Math.random() * possible.length)); + } + return text; +} diff --git a/test/lightweight-mode-suite/extension.test.ts b/test/lightweight-mode-suite/extension.test.ts index 29800e940..bb65dd02e 100644 --- a/test/lightweight-mode-suite/extension.test.ts +++ b/test/lightweight-mode-suite/extension.test.ts @@ -2,10 +2,12 @@ import * as assert from 'assert'; import * as vscode from 'vscode'; import { extensions } from 'vscode'; import { Commands } from '../../src/commands'; +import { getJavaConfiguration } from '../../src/utils'; suite('Java Language Extension - LightWeight', () => { suiteSetup(async function() { + getJavaConfiguration().update('server.launchMode', 'LightWeight'); await extensions.getExtension('redhat.java').activate(); }); @@ -24,6 +26,12 @@ suite('Java Language Extension - LightWeight', () => { Commands.SWITCH_SERVER_MODE, Commands.OPEN_FILE, Commands.CLEAN_SHARED_INDEXES, + Commands.RESTART_LANGUAGE_SERVER, + Commands.FILESEXPLORER_ONPASTE, + Commands.CHANGE_JAVA_SEARCH_SCOPE, + Commands.OPEN_JAVA_DASHBOARD, + Commands.ADD_JAVA_RUNTIME, + Commands.COPY_FULLY_QUALIFIED_NAME ].sort(); const foundJavaCommands = commands.filter((value) => { return JAVA_COMMANDS.indexOf(value)>=0 || value.startsWith('java.'); diff --git a/test/lightweight-mode-suite/index.ts b/test/lightweight-mode-suite/index.ts index b04cc328f..a32edaa0c 100644 --- a/test/lightweight-mode-suite/index.ts +++ b/test/lightweight-mode-suite/index.ts @@ -12,24 +12,32 @@ import * as path from 'path'; import * as Mocha from 'mocha'; -import * as glob from 'glob'; +import { glob } from 'glob'; -export function run(testsRoot: string): Promise { +export async function run(testsRoot: string): Promise { const mocha = new Mocha({ ui: 'tdd', useColors: true, timeout: 1 * 60 * 1000, /* ms*/ }); - return new Promise((c, e) => { - glob('**/**.test.js', { cwd: testsRoot }, (err, files) => { - if (err) { - return e(err); + try { + const files = await glob('**/**.test.js', { cwd: testsRoot }); + // make sure publicApi.test.ts is added last + files.sort((a, b) => { + if (a === 'publicApi.test.ts') { + return 1; } + return -1; + }); + // Add files to the test suite + files.forEach(f => { + const filePath = path.resolve(testsRoot, f); + console.log("Adding file", filePath); + mocha.addFile(filePath); + }); - // Add files to the test suite - files.forEach(f => mocha.addFile(path.resolve(testsRoot, f))); - + return new Promise((c, e) => { try { // Run the mocha test mocha.run(failures => { @@ -43,5 +51,7 @@ export function run(testsRoot: string): Promise { e(err); } }); - }); + } catch (err) { + throw err; + } } diff --git a/test/resources/projects/maven/salut-java11/pom.xml b/test/resources/projects/maven/salut-java11/pom.xml index e5f845376..b57ccc6c0 100644 --- a/test/resources/projects/maven/salut-java11/pom.xml +++ b/test/resources/projects/maven/salut-java11/pom.xml @@ -19,7 +19,7 @@ org.apache.commons commons-lang3 - 3.5 + 3.18.0 \ No newline at end of file diff --git a/test/runtest.ts b/test/runtest.ts index 17f806587..7f264237e 100644 --- a/test/runtest.ts +++ b/test/runtest.ts @@ -10,20 +10,21 @@ async function main() { // The folder containing the Extension Manifest package.json // Passed to `--extensionDevelopmentPath` const extensionDevelopmentPath = path.resolve(__dirname, '../..'); - - // run tests for standard mode await fse.copy(testProjectOriginPath, testProjectPath); await fse.ensureDir(path.join(testProjectPath, '.vscode')); + + // run tests for lightweight mode + console.log("setup settings.json for lightweight mode..."); /* eslint-disable @typescript-eslint/naming-convention */ await fse.writeJSON(settingsJsonPath, { - "java.server.launchMode": "Standard", - "java.configuration.updateBuildConfiguration": "automatic" + "java.server.launchMode": "LightWeight", }); - /* eslint-enable @typescript-eslint/naming-convention */ + console.log("running lightweight cases..."); + /* eslint-enable @typescript-eslint/naming-convention */ await runTests({ extensionDevelopmentPath, - extensionTestsPath: path.resolve(__dirname, './standard-mode-suite'), + extensionTestsPath: path.resolve(__dirname, './lightweight-mode-suite'), launchArgs: [ testProjectPath, '--disable-extensions', @@ -31,24 +32,29 @@ async function main() { ] }); - // run tests for lightweight mode - console.log("setup settings.json for lightweight mode..."); + + // run tests for standard mode + + console.log("setup settings.json for standard mode..."); /* eslint-disable @typescript-eslint/naming-convention */ await fse.writeJSON(settingsJsonPath, { - "java.server.launchMode": "LightWeight", + "java.server.launchMode": "Standard", + "java.configuration.updateBuildConfiguration": "automatic" }); - /* eslint-enable @typescript-eslint/naming-convention */ - console.log("running lightweight cases..."); + console.log("running standard cases..."); + /* eslint-enable @typescript-eslint/naming-convention */ await runTests({ extensionDevelopmentPath, - extensionTestsPath: path.resolve(__dirname, './lightweight-mode-suite'), + extensionTestsPath: path.resolve(__dirname, './standard-mode-suite'), launchArgs: [ testProjectPath, '--disable-extensions', '--disable-workspace-trust' ] }); + + } catch (err) { console.error(`Failed to run tests: ${err}`); process.exit(1); diff --git a/test/standard-mode-suite/extension.test.ts b/test/standard-mode-suite/extension.test.ts index 0634c730a..aee1a1d02 100644 --- a/test/standard-mode-suite/extension.test.ts +++ b/test/standard-mode-suite/extension.test.ts @@ -7,6 +7,7 @@ import { Commands } from '../../src/commands'; import * as java from '../../src/javaServerStarter'; import * as plugin from '../../src/plugin'; import * as requirements from '../../src/requirements'; +import { escapeSnippetLiterals } from '../../src/extension'; suite('Java Language Extension - Standard', () => { @@ -42,53 +43,97 @@ suite('Java Language Extension - Standard', () => { return vscode.commands.getCommands(true).then((commands) => { const JAVA_COMMANDS = [ + Commands.ADD_TO_SOURCEPATH, Commands.ADD_TO_SOURCEPATH_CMD, Commands.APPLY_REFACTORING_COMMAND, Commands.APPLY_WORKSPACE_EDIT, + Commands.BUILD_PROJECT, + Commands.CHANGE_BASE_TYPE, Commands.CHOOSE_IMPORTS, + Commands.CLEAN_SHARED_INDEXES, Commands.CLEAN_WORKSPACE, Commands.CLIPBOARD_ONPASTE, Commands.COMPILE_WORKSPACE, Commands.CONFIGURATION_UPDATE, + "java.action.configureFavoriteStaticMembers", + Commands.MANUAL_CLEANUP, + Commands.CREATE_MODULE_INFO, + Commands.CREATE_MODULE_INFO_COMMAND, Commands.EXECUTE_WORKSPACE_COMMAND, Commands.GENERATE_ACCESSORS_PROMPT, Commands.GENERATE_CONSTRUCTORS_PROMPT, Commands.GENERATE_DELEGATE_METHODS_PROMPT, Commands.GENERATE_TOSTRING_PROMPT, + Commands.GET_CLASSPATHS, + "java.project.updateClassPaths", + "java.project.updateJdk", + "java.vm.getAllInstalls", + Commands.GET_PROJECT_SETTINGS, + "java.project.updateSettings", + Commands.GET_ALL_JAVA_PROJECTS, + Commands.HANDLE_PASTE_EVENT, Commands.HASHCODE_EQUALS_PROMPT, Commands.IGNORE_INCOMPLETE_CLASSPATH, Commands.IGNORE_INCOMPLETE_CLASSPATH_HELP, + Commands.IMPORT_PROJECTS, Commands.IMPORT_PROJECTS_CMD, + Commands.CHANGE_IMPORTED_PROJECTS, + Commands.IS_TEST_FILE, + Commands.LIST_SOURCEPATHS, Commands.LIST_SOURCEPATHS_CMD, Commands.NAVIGATE_TO_SUPER_IMPLEMENTATION_COMMAND, + Commands.NULL_ANALYSIS_SET_MODE, Commands.OPEN_CLIENT_LOG, Commands.OPEN_FORMATTER, Commands.OPEN_JSON_SETTINGS, + Commands.OPEN_FILE, Commands.OPEN_LOGS, Commands.OPEN_OUTPUT, Commands.OPEN_SERVER_LOG, Commands.OPEN_SERVER_STDOUT_LOG, Commands.OPEN_SERVER_STDERR_LOG, + Commands.OPEN_TYPE_HIERARCHY, Commands.ORGANIZE_IMPORTS, + Commands.ORGANIZE_IMPORTS_SILENTLY, Commands.OVERRIDE_METHODS_PROMPT, Commands.PROJECT_CONFIGURATION_STATUS, - Commands.BUILD_PROJECT, + Commands.REFRESH_BUNDLES, + "java.project.refreshDiagnostics", + Commands.REMOVE_FROM_SOURCEPATH, Commands.REMOVE_FROM_SOURCEPATH_CMD, Commands.RENAME_COMMAND, + "java.project.resolveStackTraceLocation", + Commands.RESOLVE_TYPE_HIERARCHY, + Commands.RESOLVE_WORKSPACE_SYMBOL, + Commands.RUNTIME_VALIDATION_OPEN, + Commands.RESTART_LANGUAGE_SERVER, Commands.SHOW_JAVA_IMPLEMENTATIONS, Commands.SHOW_JAVA_REFERENCES, Commands.SHOW_SERVER_TASK_STATUS, Commands.SWITCH_SERVER_MODE, - Commands.UPDATE_SOURCE_ATTACHMENT_CMD, - Commands.RUNTIME_VALIDATION_OPEN, - Commands.CHANGE_BASE_TYPE, + "java.edit.stringFormatting", + "java.completion.onDidSelect", + "java.decompile", + "java.protobuf.generateSources", Commands.SHOW_TYPE_HIERARCHY, Commands.SHOW_SUBTYPE_HIERARCHY, Commands.SHOW_SUPERTYPE_HIERARCHY, Commands.SHOW_CLASS_HIERARCHY, - Commands.LEARN_MORE_ABOUT_CLEAN_UPS, - Commands.OPEN_FILE, - Commands.CLEAN_SHARED_INDEXES, + Commands.SHOW_EXTEND_OUTLINE, + Commands.UPGRADE_GRADLE_WRAPPER, + Commands.UPGRADE_GRADLE_WRAPPER_CMD, + Commands.UPDATE_SOURCE_ATTACHMENT, + Commands.UPDATE_SOURCE_ATTACHMENT_CMD, + Commands.SMARTSEMICOLON_DETECTION, + Commands.RESOLVE_SOURCE_ATTACHMENT, + Commands.FILESEXPLORER_ONPASTE, + Commands.RESOLVE_PASTED_TEXT, + Commands.CHANGE_JAVA_SEARCH_SCOPE, + Commands.COPY_FULLY_QUALIFIED_NAME, + Commands.GET_FULLY_QUALIFIED_NAME, + Commands.GET_TROUBLESHOOTING_INFO, + Commands.OPEN_JAVA_DASHBOARD, + Commands.ADD_JAVA_RUNTIME ].sort(); const foundJavaCommands = commands.filter((value) => { return JAVA_COMMANDS.indexOf(value)>=0 || value.startsWith('java.'); @@ -103,11 +148,11 @@ suite('Java Language Extension - Standard', () => { java.parseVMargs(vmArgs, userArgs); - assert.equal(4, vmArgs.length); + assert.equal(5, vmArgs.length); assert.equal('-noverify', vmArgs[0]); assert.equal('foo', vmArgs[1]); assert.equal('-Xmx512m', vmArgs[2]); - assert.equal('-Dfoo=something with blank', vmArgs[3]); + assert.equal('-Dfoo=something with blank', vmArgs[4]); }); test('should parse VM arguments with spaces', () => { @@ -189,4 +234,10 @@ suite('Java Language Extension - Standard', () => { assert(java.hasDebugFlag(['foo', '--debug=1234'])); assert(java.hasDebugFlag(['foo', '--debug-brk=1234'])); }); + + test('should preserve escaped commas in code action snippets', () => { + const snippet = '${1|HashMap,Map|} ${2:x} = new HashMap();'; + + assert.equal(escapeSnippetLiterals(snippet), snippet); + }); }); diff --git a/test/standard-mode-suite/gotoSuperImplementation.test.ts b/test/standard-mode-suite/gotoSuperImplementation.test.ts index 34a1285d1..7d00fd5eb 100644 --- a/test/standard-mode-suite/gotoSuperImplementation.test.ts +++ b/test/standard-mode-suite/gotoSuperImplementation.test.ts @@ -26,6 +26,6 @@ suite('Goto Super Implementation', () => { await commands.executeCommand(Commands.NAVIGATE_TO_SUPER_IMPLEMENTATION_COMMAND); - assert.equal(path.basename(window.activeTextEditor.document.fileName), "Object.class"); + assert.equal(path.basename(window.activeTextEditor.document.fileName), "Object.java"); }); }); diff --git a/test/standard-mode-suite/hoverLinks.test.ts b/test/standard-mode-suite/hoverLinks.test.ts new file mode 100644 index 000000000..627dc8867 --- /dev/null +++ b/test/standard-mode-suite/hoverLinks.test.ts @@ -0,0 +1,37 @@ +'use strict'; + +import * as assert from 'assert'; +import { Hover, MarkdownString } from 'vscode'; +import { fixJdtSchemeHoverLinks } from '../../src/providerDispatcher'; + +suite('Hover Links Test', () => { + + test('trusted contributed command links are preserved (super implementation)', () => { + const contributed = new MarkdownString('[Go to Super Implementation](command:java.action.navigateToSuperImplementation?%5B%5D)'); + contributed.isTrusted = { enabledCommands: ['java.action.navigateToSuperImplementation'] }; + const hover = new Hover([contributed]); + + const fixed = fixJdtSchemeHoverLinks(hover); + const value = (fixed.contents[0] as MarkdownString).value; + assert.ok(value.includes('(command:java.action.navigateToSuperImplementation'), 'contributed command link should not be sanitized'); + }); + + test('untrusted server command links are sanitized', () => { + const javadoc = new MarkdownString('[click here](command:evil.command?param=true)'); + const hover = new Hover([javadoc]); + + const fixed = fixJdtSchemeHoverLinks(hover); + const value = (fixed.contents[0] as MarkdownString).value; + assert.strictEqual(value, 'click here', 'server command link should be stripped to its label'); + }); + + test('jdt:// links are converted to command links', () => { + const javadoc = new MarkdownString('[String](jdt://contents/Foo.class)'); + const hover = new Hover([javadoc]); + + const fixed = fixJdtSchemeHoverLinks(hover); + const value = (fixed.contents[0] as MarkdownString).value; + assert.ok(value.includes('(command:'), 'jdt link should be converted to a command link'); + assert.ok(!value.includes('jdt://'), 'jdt scheme should be replaced'); + }); +}); diff --git a/test/standard-mode-suite/index.ts b/test/standard-mode-suite/index.ts index b04cc328f..479c5eedf 100644 --- a/test/standard-mode-suite/index.ts +++ b/test/standard-mode-suite/index.ts @@ -12,24 +12,21 @@ import * as path from 'path'; import * as Mocha from 'mocha'; -import * as glob from 'glob'; +import { glob } from 'glob'; -export function run(testsRoot: string): Promise { +export async function run(testsRoot: string): Promise { const mocha = new Mocha({ ui: 'tdd', useColors: true, timeout: 1 * 60 * 1000, /* ms*/ }); - 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 { + const files = await glob('**/**.test.js', { cwd: testsRoot }); + // Add files to the test suite + files.forEach(f => mocha.addFile(path.resolve(testsRoot, f))); + return new Promise((c, e) => { try { // Run the mocha test mocha.run(failures => { @@ -43,5 +40,7 @@ export function run(testsRoot: string): Promise { e(err); } }); - }); + } catch (err) { + throw err; + } } diff --git a/test/standard-mode-suite/javaServerStarter.test.ts b/test/standard-mode-suite/javaServerStarter.test.ts new file mode 100644 index 000000000..95e898d26 --- /dev/null +++ b/test/standard-mode-suite/javaServerStarter.test.ts @@ -0,0 +1,103 @@ +'use strict'; + +import * as assert from 'assert'; +import { platform } from 'os'; +import { getUnicodeLocaleEnv, LOCALE_ENV_VARS, UTF8_LOCALE } from '../../src/javaServerStarter'; + +function setLocale(...values: [string, string][]): void { + for (const name of LOCALE_ENV_VARS) { + delete process.env[name]; + } + for (const [name, value] of values) { + process.env[name] = value; + } +} + +function utf8Env(variable: string): { [key: string]: string } { + const env: { [key: string]: string } = {}; + env[variable] = UTF8_LOCALE; + return env; +} + +suite('Java Server Starter Test', () => { + + const saved: [string, string][] = []; + + suiteSetup(() => { + for (const name of LOCALE_ENV_VARS) { + if (process.env[name] !== undefined) { + saved.push([name, process.env[name]]); + } + } + }); + + suiteTeardown(() => { + setLocale(...saved); + }); + + test('getUnicodeLocaleEnv() - never overrides the locale on Windows', function () { + if (platform() !== 'win32') { + this.skip(); + } + setLocale(); + assert.deepStrictEqual(getUnicodeLocaleEnv(), {}); + }); + + test('getUnicodeLocaleEnv() - forces UTF-8 when the locale is unset', function () { + if (platform() === 'win32') { + this.skip(); + } + setLocale(); + assert.deepStrictEqual(getUnicodeLocaleEnv(), utf8Env('LC_CTYPE')); + }); + + test('getUnicodeLocaleEnv() - forces UTF-8 for ASCII only locales', function () { + if (platform() === 'win32') { + this.skip(); + } + for (const locale of ['C', 'POSIX', 'C.ASCII']) { + setLocale(['LANG', locale]); + assert.deepStrictEqual(getUnicodeLocaleEnv(), utf8Env('LC_CTYPE'), `LANG=${locale}`); + } + }); + + test('getUnicodeLocaleEnv() - keeps an existing UTF-8 locale', function () { + if (platform() === 'win32') { + this.skip(); + } + setLocale(['LANG', 'en_US.UTF-8']); + assert.deepStrictEqual(getUnicodeLocaleEnv(), {}); + }); + + test('getUnicodeLocaleEnv() - keeps a deliberately configured non-UTF-8 locale', function () { + if (platform() === 'win32') { + this.skip(); + } + setLocale(['LANG', 'zh_CN.GBK']); + assert.deepStrictEqual(getUnicodeLocaleEnv(), {}); + }); + + test('getUnicodeLocaleEnv() - replaces LC_ALL because it overrides every other category', function () { + if (platform() === 'win32') { + this.skip(); + } + setLocale(['LC_ALL', 'C'], ['LANG', 'en_US.UTF-8']); + assert.deepStrictEqual(getUnicodeLocaleEnv(), utf8Env('LC_ALL')); + }); + + test('getUnicodeLocaleEnv() - only corrects LC_CTYPE when LC_ALL is unset', function () { + if (platform() === 'win32') { + this.skip(); + } + setLocale(['LC_CTYPE', 'C'], ['LANG', 'en_US.UTF-8']); + assert.deepStrictEqual(getUnicodeLocaleEnv(), utf8Env('LC_CTYPE')); + }); + + test('getUnicodeLocaleEnv() - LC_CTYPE takes precedence over LANG', function () { + if (platform() === 'win32') { + this.skip(); + } + setLocale(['LC_CTYPE', 'en_US.UTF-8'], ['LANG', 'C']); + assert.deepStrictEqual(getUnicodeLocaleEnv(), {}); + }); +}); diff --git a/test/standard-mode-suite/standardLanguageClient.test.ts b/test/standard-mode-suite/standardLanguageClient.test.ts new file mode 100644 index 000000000..f30564da3 --- /dev/null +++ b/test/standard-mode-suite/standardLanguageClient.test.ts @@ -0,0 +1,83 @@ +'use strict'; + +import * as assert from 'assert'; +import { Executable, TransportKind } from 'vscode-languageclient/node'; +import { startWithStdioFallback, StartableLanguageClient } from '../../src/standardLanguageClientStart'; + +class TestLanguageClient implements StartableLanguageClient { + public startCount = 0; + + constructor(private readonly startResult: Promise) { + } + + public start(): Promise { + this.startCount++; + return this.startResult; + } +} + +suite('Standard Language Client Test', () => { + + test('startWithStdioFallback() - does not fall back when pipe start rejects', async () => { + const pipeClient = new TestLanguageClient(Promise.reject(new Error('pipe failed'))); + const stdioClient = new TestLanguageClient(Promise.resolve()); + const pipeOptions = createServerOptions(TransportKind.pipe); + let fallbackOptions: Executable | undefined; + + await assert.rejects(startWithStdioFallback({ + languageClient: pipeClient, + serverOptions: pipeOptions, + createLanguageClient: serverOptions => { + fallbackOptions = serverOptions; + return stdioClient; + }, + pipeStartTimeout: 1000, + }), /pipe failed/); + + assert.equal(pipeClient.startCount, 1); + assert.equal(stdioClient.startCount, 0); + assert.equal(fallbackOptions, undefined); + }); + + test('startWithStdioFallback() - falls back when pipe start times out', async () => { + const pipeClient = new TestLanguageClient(new Promise(() => { /* never resolves */ })); + const stdioClient = new TestLanguageClient(Promise.resolve()); + let fallbackError: any; + + const result = await startWithStdioFallback({ + languageClient: pipeClient, + serverOptions: createServerOptions(TransportKind.pipe), + createLanguageClient: () => stdioClient, + pipeStartTimeout: 1, + onFallback: error => fallbackError = error, + }); + + assert.equal(pipeClient.startCount, 1); + assert.equal(stdioClient.startCount, 1); + assert.equal(result.client, stdioClient); + assert.equal((result.serverOptions as Executable).transport, TransportKind.stdio); + assert.ok(String(fallbackError).includes('timed out')); + }); + + test('startWithStdioFallback() - does not fall back for stdio start failures', async () => { + const stdioClient = new TestLanguageClient(Promise.reject(new Error('stdio failed'))); + + await assert.rejects(startWithStdioFallback({ + languageClient: stdioClient, + serverOptions: createServerOptions(TransportKind.stdio), + createLanguageClient: () => new TestLanguageClient(Promise.resolve()), + pipeStartTimeout: 1, + }), /stdio failed/); + + assert.equal(stdioClient.startCount, 1); + }); +}); + +function createServerOptions(transport: TransportKind): Executable { + return { + command: 'java', + args: ['-version'], + options: { env: { test: 'true' } }, + transport, + }; +} diff --git a/test/standard-mode-suite/utils.test.ts b/test/standard-mode-suite/utils.test.ts index ee3d5b560..8ec72f1b8 100644 --- a/test/standard-mode-suite/utils.test.ts +++ b/test/standard-mode-suite/utils.test.ts @@ -1,8 +1,10 @@ 'use strict'; import * as assert from 'assert'; -import { getJavaConfiguration, getBuildFilePatterns, getInclusionPatternsFromNegatedExclusion, getExclusionBlob, convertToGlob } from '../../src/utils'; +import { getJavaConfiguration, getBuildFilePatterns, getInclusionPatternsFromNegatedExclusion, getExclusionGlob, convertToGlob } from '../../src/utils'; import { WorkspaceConfiguration } from 'vscode'; +import { listJdks } from '../../src/jdkUtils'; +import { platform } from 'os'; let exclusion: string[]; let isMavenImporterEnabled: boolean; @@ -75,7 +77,7 @@ suite('Utils Test', () => { assert.deepEqual(result, ["**/node_modules/test/**"]); }); - test('getExclusionBlob() - no negated exclusions', async function () { + test('getExclusionGlob() - no negated exclusions', async function () { await config.update(IMPORT_EXCLUSION, [ "**/node_modules/**", "**/.metadata/**", @@ -83,12 +85,12 @@ suite('Utils Test', () => { "**/META-INF/maven/**" ]); - const result: string = getExclusionBlob(); + const result: string = getExclusionGlob(); assert.equal(result, "{**/node_modules/**,**/.metadata/**,**/archetype-resources/**,**/META-INF/maven/**}"); }); - test('getExclusionBlob() - has negated exclusions', async function () { + test('getExclusionGlob() - has negated exclusions', async function () { await config.update(IMPORT_EXCLUSION, [ "**/node_modules/**", "!**/node_modules/test/**", @@ -97,7 +99,7 @@ suite('Utils Test', () => { "**/META-INF/maven/**" ]); - const result: string = getExclusionBlob(); + const result: string = getExclusionGlob(); assert.equal(result, "{**/node_modules/**,**/.metadata/**,**/archetype-resources/**,**/META-INF/maven/**}"); }); @@ -117,6 +119,16 @@ suite('Utils Test', () => { assert.equal(result, "{**/node_modules/test/**/**/pom.xml}"); }); + test('listJdks() - no /usr as Java home on macOS', async function () { + // Skip this test if it's not macOS. + if (platform() !== "darwin") { + this.skip(); + } + + const jdks = await listJdks(); + assert.ok(jdks.every(jdk => jdk.homedir !== "/usr")); + }); + teardown(async function() { await recover(); }); diff --git a/tsconfig.base.json b/tsconfig.base.json new file mode 100644 index 000000000..17c7bc77a --- /dev/null +++ b/tsconfig.base.json @@ -0,0 +1,14 @@ +{ + "compilerOptions": { + "target": "es6", + "moduleResolution": "node", + "outDir": "out", + "sourceMap": true, + "skipLibCheck": true, + "plugins": [ + { + "name": "eslint" + } + ], + } +} diff --git a/tsconfig.json b/tsconfig.json index 0a41f04d8..6b133b627 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,18 +1,16 @@ { + "extends": "./tsconfig.base.json", "compilerOptions": { - "target": "es6", "lib": [ - "es6" - ], + "es6" + ], "module": "commonjs", - "moduleResolution": "node", - "outDir": "out", - "sourceMap": true, - "plugins": [{ "name": "eslint" }] }, "exclude": [ "node_modules", "server", - ".vscode-test" + ".vscode-test", + "src/webview", + "test/resources/projects" ] } diff --git a/tsconfig.webview.json b/tsconfig.webview.json new file mode 100644 index 000000000..0c78cb638 --- /dev/null +++ b/tsconfig.webview.json @@ -0,0 +1,17 @@ +{ + "extends": "./tsconfig.base.json", + "compilerOptions": { + "lib": [ + "DOM", "ES6" + ], + "module": "ES6", + /* Enabled for React */ + "jsx": "react-jsx", + "esModuleInterop": true, + "allowSyntheticDefaultImports": true, + }, + "include": [ + "src/webview", + "src/webviewProtocol" + ] +} diff --git a/vscode.proposed.documentPaste.d.ts b/vscode.proposed.documentPaste.d.ts index 57ea908f8..627c8dcc1 100644 --- a/vscode.proposed.documentPaste.d.ts +++ b/vscode.proposed.documentPaste.d.ts @@ -8,42 +8,107 @@ declare module 'vscode' { // https://github.com/microsoft/vscode/issues/30066/ /** - * Provider invoked when the user copies and pastes code. + * The reason why paste edits were requested. */ - interface DocumentPasteEditProvider { + export enum DocumentPasteTriggerKind { + /** + * Pasting was requested as part of a normal paste operation. + */ + Automatic = 0, + + /** + * Pasting was requested by the user with the `paste as` command. + */ + PasteAs = 1, + } + + /** + * Additional information about the paste operation. + */ + + export interface DocumentPasteEditContext { + /** + * Requested kind of paste edits to return. + */ + readonly only: DocumentPasteEditKind | undefined; + + /** + * The reason why paste edits were requested. + */ + readonly triggerKind: DocumentPasteTriggerKind; + } + + /** + * Provider invoked when the user copies or pastes in a {@linkcode TextDocument}. + */ + interface DocumentPasteEditProvider { /** * Optional method invoked after the user copies text in a file. * - * During {@link prepareDocumentPaste}, an extension can compute metadata that is attached to - * a {@link DataTransfer} and is passed back to the provider in {@link provideDocumentPasteEdits}. + * This allows the provider to attach copy metadata to the {@link DataTransfer} + * which is then passed back to providers in {@linkcode provideDocumentPasteEdits}. + * + * Note that currently any changes to the {@linkcode DataTransfer} are isolated to the current editor session. + * This means that added metadata cannot be seen by other applications. * * @param document Document where the copy took place. - * @param ranges Ranges being copied in the `document`. - * @param dataTransfer The data transfer associated with the copy. You can store additional values on this for later use in {@link provideDocumentPasteEdits}. + * @param ranges Ranges being copied in {@linkcode document}. + * @param dataTransfer The data transfer associated with the copy. You can store additional values on this for later use in {@linkcode provideDocumentPasteEdits}. + * This object is only valid for the duration of this method. * @param token A cancellation token. + * + * @return Optional thenable that resolves when all changes to the `dataTransfer` are complete. */ prepareDocumentPaste?(document: TextDocument, ranges: readonly Range[], dataTransfer: DataTransfer, token: CancellationToken): void | Thenable; /** * Invoked before the user pastes into a document. * - * In this method, extensions can return a workspace edit that replaces the standard pasting behavior. + * Returned edits can replace the standard pasting behavior. * * @param document Document being pasted into - * @param ranges Currently selected ranges in the document. - * @param dataTransfer The data transfer associated with the paste. + * @param ranges Range in the {@linkcode document} to paste into. + * @param dataTransfer The {@link DataTransfer data transfer} associated with the paste. This object is only valid for the duration of the paste operation. + * @param context Additional context for the paste. + * @param token A cancellation token. + * + * @return Set of potential {@link DocumentPasteEdit edits} that apply the paste. Return `undefined` to use standard pasting. + */ + provideDocumentPasteEdits?(document: TextDocument, ranges: readonly Range[], dataTransfer: DataTransfer, context: DocumentPasteEditContext, token: CancellationToken): ProviderResult; + + /** + * Optional method which fills in the {@linkcode DocumentPasteEdit.additionalEdit} before the edit is applied. + * + * This is called once per edit and should be used if generating the complete edit may take a long time. + * Resolve can only be used to change {@link DocumentPasteEdit.additionalEdit}. + * + * @param pasteEdit The {@linkcode DocumentPasteEdit} to resolve. * @param token A cancellation token. * - * @return Optional workspace edit that applies the paste. Return undefined to use standard pasting. + * @returns The resolved paste edit or a thenable that resolves to such. It is OK to return the given + * `pasteEdit`. If no result is returned, the given `pasteEdit` is used. */ - provideDocumentPasteEdits(document: TextDocument, ranges: readonly Range[], dataTransfer: DataTransfer, token: CancellationToken): ProviderResult; + resolveDocumentPasteEdit?(pasteEdit: T, token: CancellationToken): ProviderResult; } /** - * An operation applied on paste + * An edit applied on paste. */ class DocumentPasteEdit { + + /** + * Human readable label that describes the edit. + */ + title: string; + + /** + * {@link DocumentPasteEditKind Kind} of the edit. + * + * Used to identify specific types of edits. + */ + kind: DocumentPasteEditKind; + /** * The text or snippet to insert at the pasted locations. */ @@ -55,21 +120,77 @@ declare module 'vscode' { additionalEdit?: WorkspaceEdit; /** + * Controls the ordering of paste edits provided by multiple providers. + * + * If this edit yields to another, it will be shown lower in the list of paste edit. + */ + yieldTo?: readonly DocumentPasteEditKind[]; + + /** + * Create a new paste edit. + * * @param insertText The text or snippet to insert at the pasted locations. + * @param title Human readable label that describes the edit. + * @param kind {@link DocumentPasteEditKind Kind} of the edit. */ - constructor(insertText: string | SnippetString); + constructor(insertText: string | SnippetString, title: string, kind: DocumentPasteEditKind); + } + + + /** + * TODO: Share with code action kind? + */ + class DocumentPasteEditKind { + static readonly Empty: DocumentPasteEditKind; + + // TODO: Add `Text` any others? + + private constructor(value: string); + + readonly value: string; + + append(...parts: string[]): CodeActionKind; + intersects(other: CodeActionKind): boolean; + contains(other: CodeActionKind): boolean; } interface DocumentPasteProviderMetadata { /** - * Mime types that `provideDocumentPasteEdits` should be invoked for. + * List of {@link DocumentPasteEditKind kinds} that the provider may return in {@linkcode DocumentPasteEditProvider.provideDocumentPasteEdits provideDocumentPasteEdits}. * - * Use the special `files` mimetype to indicate the provider should be invoked if any files are present in the `DataTransfer`. + * The provider will only be invoked when one of these kinds is being requested. For normal pasting, all providers will be invoked. + */ + readonly providedPasteEditKinds: readonly DocumentPasteEditKind[]; + + /** + * Mime types that {@linkcode DocumentPasteEditProvider.prepareDocumentPaste prepareDocumentPaste} may add on copy. */ - readonly pasteMimeTypes: readonly string[]; + readonly copyMimeTypes?: readonly string[]; + + /** + * Mime types that {@linkcode DocumentPasteEditProvider.provideDocumentPasteEdits provideDocumentPasteEdits} should be invoked for. + * + * This can either be an exact mime type such as `image/png`, or a wildcard pattern such as `image/*`. + * + * Use `text/uri-list` for resources dropped from the explorer or other tree views in the workbench. + * + * Use `files` to indicate that the provider should be invoked if any {@link DataTransferFile files} are present in the {@linkcode DataTransfer}. + * Note that {@linkcode DataTransferFile} entries are only created when dropping content from outside the editor, such as + * from the operating system. + */ + readonly pasteMimeTypes?: readonly string[]; } namespace languages { + /** + * Registers a new {@linkcode DocumentPasteEditProvider}. + * + * @param selector A selector that defines the documents this provider applies to. + * @param provider A paste editor provider. + * @param metadata Additional metadata about the provider. + * + * @returns A {@link Disposable} that unregisters this provider when disposed of. + */ export function registerDocumentPasteEditProvider(selector: DocumentSelector, provider: DocumentPasteEditProvider, metadata: DocumentPasteProviderMetadata): Disposable; } } diff --git a/webpack.config.js b/webpack.config.js index eec53b45c..ae1321324 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -3,6 +3,7 @@ //@ts-check const ESLintWebpackPlugin = require('eslint-webpack-plugin'); +const webpack = require('webpack'); const path = require('path'); /**@type {import('webpack').Configuration}*/ @@ -51,4 +52,98 @@ const config = { level: 'log', }, } -module.exports = config; + +const MiniCssExtractPlugin = require("mini-css-extract-plugin"); + +const configChangeSignature = { + name: 'changeSignature', + mode: 'none', + entry: { + changeSignature: './src/webview/changeSignature/index.tsx', + }, + module: { + rules: [{ + test: /\.ts(x?)$/, + exclude: /node_modules/, + loader: 'ts-loader', + options: { + configFile: 'tsconfig.webview.json' + } + }, { + test: /\.(css)$/, + use: [{ + loader: MiniCssExtractPlugin.loader, + }, { + loader: 'css-loader' + }] + }, { + test: /\.(ttf)$/, + type: 'asset/inline', + }] + }, + output: { + filename: '[name].js', + path: path.resolve(__dirname, 'dist'), + publicPath: '/', + devtoolModuleFilenameTemplate: "../[resource-path]" + }, + plugins: [ + new MiniCssExtractPlugin({ + filename: 'changeSignature.css' + }), + new webpack.ProvidePlugin({ + process: 'process/browser', + }), + ], + devtool: 'source-map', + resolve: { + extensions: ['.js', '.ts', '.tsx'] + } +} + +const configDashboard = { + name: 'dashboard', + mode: 'none', + entry: { + dashboard: './src/webview/dashboard/index.tsx', + }, + module: { + rules: [{ + test: /\.ts(x?)$/, + exclude: /node_modules/, + loader: 'ts-loader', + options: { + configFile: 'tsconfig.webview.json' + } + }, { + test: /\.(css)$/, + use: [{ + loader: MiniCssExtractPlugin.loader, + }, { + loader: 'css-loader' + }] + }, { + test: /\.(ttf)$/, + type: 'asset/inline', + }] + }, + output: { + filename: '[name].js', + path: path.resolve(__dirname, 'dist'), + publicPath: '/', + devtoolModuleFilenameTemplate: "../[resource-path]" + }, + plugins: [ + new MiniCssExtractPlugin({ + filename: 'dashboard.css' + }), + new webpack.ProvidePlugin({ + process: 'process/browser', + }), + ], + devtool: 'source-map', + resolve: { + extensions: ['.js', '.ts', '.tsx'] + } +} +module.exports = [config, configChangeSignature, configDashboard]; diff --git a/webview-resources/button.css b/webview-resources/button.css new file mode 100644 index 000000000..54e437988 --- /dev/null +++ b/webview-resources/button.css @@ -0,0 +1,34 @@ +/* https://css-tricks.com/overriding-default-button-styles/ */ + +button { + display: inline-block; + border: none; + padding: 12px 16px; + margin: 0; + text-decoration: none; + background: var(--vscode-button-background); + color: #ffffff; + font-family: sans-serif; + font-size: 14px; + cursor: pointer; + text-align: center; +} + +button:hover, +button:focus { + background: var(--vscode-button-hoverBackground); +} +button:focus { + outline: 1px solid var(--vscode-button-hoverBackground); + /* outline-offset: -4px; */ +} + +.center { + text-align: center; + margin: 0; + position: absolute; + top: 50%; + left: 50%; + -ms-transform: translate(-50%, -50%); + transform: translate(-50%, -50%); +} \ No newline at end of file diff --git a/webview-resources/dashboard.css b/webview-resources/dashboard.css new file mode 100644 index 000000000..bbe7b6424 --- /dev/null +++ b/webview-resources/dashboard.css @@ -0,0 +1,13 @@ +.title { + font-weight: bold; + font-size: large; +}; + +.label { + font-weight: bold; + width: 30%; +}; + +.row { + width: 100%; +}; \ No newline at end of file