diff --git a/.github/workflows/app-sec-template.yml b/.github/workflows/app-sec-template.yml new file mode 100644 index 00000000..b2761574 --- /dev/null +++ b/.github/workflows/app-sec-template.yml @@ -0,0 +1,74 @@ +name: Application Security + +on: + workflow_call: + inputs: + github_ref: + required: true + type: string + +jobs: + app-sec: + runs-on: ubuntu-latest + steps: + - name: Checkout source code + uses: actions/checkout@v2 + with: + fetch-depth: 0 + + - name: Install Node.js + uses: actions/setup-node@v3 + with: + node-version: 20.x + + - name: Install dependencies + run: npm install + + - name: get-npm-version + id: package-version + uses: martinbeentjes/npm-get-version-action@v1.3.1 + + - name: Download lcov result from test job + uses: actions/download-artifact@v3 + with: + name: lcov + + - name: SonarCloud Scan + uses: sonarsource/sonarqube-scan-action@master + env: + SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }} + SONAR_HOST_URL: ${{ secrets.SONAR_HOST_URL }} + with: + args: > + -Dsonar.projectVersion=${{ steps.package-version.outputs.current-version}} + + - name: Sonarqube Quality Gate Check + id: sonarqube-quality-gate-check + uses: sonarsource/sonarqube-quality-gate-action@master + # Force to fail step after specific time + timeout-minutes: 5 + env: + SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }} + SONAR_HOST_URL: ${{ secrets.SONAR_HOST_URL }} + + - name: Snyk scan for all vulnerabilities + uses: snyk/actions/node@master + continue-on-error: true + env: + SNYK_TOKEN: ${{ secrets.pink_snyk_api_key }} + + - name: Snyk scan for high or critical vulnerabilities + uses: snyk/actions/node@master + env: + SNYK_TOKEN: ${{ secrets.pink_snyk_api_key }} + with: + args: --severity-threshold=high + + - name: Snyk Monitor + uses: snyk/actions/node@master + if: ${{ (inputs.github_ref == 'ref/head/dev') || (inputs.github_ref == 'ref/head/main') }} + env: + SNYK_TOKEN: ${{ secrets.pink_snyk_api_key }} + with: + command: monitor + args: --target-reference=${{ inputs.github_ref }} diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index eb97c761..6b9ab672 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -54,50 +54,7 @@ jobs: app-sec: needs: test - runs-on: ubuntu-latest - steps: - - name: Checkout source code - uses: actions/checkout@v3 - with: - fetch-depth: 0 - - - name: Install Node.js - uses: actions/setup-node@v3 - with: - node-version: 16.x - - - name: Download lcov result from test job - uses: actions/download-artifact@v3 - with: - name: lcov - - - name: Install dependencies - run: npm install - - - name: SonarCloud Scan - uses: sonarsource/sonarqube-scan-action@master - env: - SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }} - SONAR_HOST_URL: ${{ secrets.SONAR_HOST_URL }} - - - name: Sonarqube Quality Gate Check - id: sonarqube-quality-gate-check - uses: sonarsource/sonarqube-quality-gate-action@master - # Force to fail step after specific time - timeout-minutes: 5 - env: - SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }} - SONAR_HOST_URL: ${{ secrets.SONAR_HOST_URL }} - - - name: Snyk scan for all vulnerabilities - uses: snyk/actions/node@master - continue-on-error: true - env: - SNYK_TOKEN: ${{ secrets.pink_snyk_api_key }} - - - name: Snyk scan for high or critical vulnerabilities - uses: snyk/actions/node@master - env: - SNYK_TOKEN: ${{ secrets.pink_snyk_api_key }} - with: - args: --severity-threshold=high + uses: ./.github/workflows/app-sec-template.yml + with: + github_ref: ${{ github.ref_name }} + secrets: inherit diff --git a/.github/workflows/prod_release.yml b/.github/workflows/prod_release.yml index b14a76c3..816cd9bf 100644 --- a/.github/workflows/prod_release.yml +++ b/.github/workflows/prod_release.yml @@ -25,7 +25,7 @@ jobs: - name: Build VSIX file run: npm run build - name: Run Tests - run: xvfb-run -a npm run test + run: xvfb-run -a npm run coverage - name: Packaging run: npm run package - name: Upload artifact @@ -33,51 +33,20 @@ jobs: with: name: KDB-VSCode-Extension path: ./kdb-*vsix + retention-days: 1 + - name: Upload lcov result for app-sec job + uses: actions/upload-artifact@v3 + with: + name: lcov + path: coverage-reports/lcov.info + retention-days: 1 app-sec: - runs-on: ubuntu-latest needs: build - steps: - - name: Checkout source code - uses: actions/checkout@v2 - with: - fetch-depth: 0 - - - name: Install Node.js - uses: actions/setup-node@v3 - with: - node-version: 16.x - - - name: Install dependencies - run: npm install - - - name: SonarCloud Scan - uses: sonarsource/sonarqube-scan-action@master - env: - SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }} - SONAR_HOST_URL: ${{ secrets.SONAR_HOST_URL }} - - - name: Sonarqube Quality Gate Check - id: sonarqube-quality-gate-check - uses: sonarsource/sonarqube-quality-gate-action@master - # Force to fail step after specific time - timeout-minutes: 5 - env: - SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }} - SONAR_HOST_URL: ${{ secrets.SONAR_HOST_URL }} - - - name: Snyk scan for all vulnerabilities - uses: snyk/actions/node@master - continue-on-error: true - env: - SNYK_TOKEN: ${{ secrets.pink_snyk_api_key }} - - - name: Snyk scan for high or critical vulnerabilities - uses: snyk/actions/node@master - env: - SNYK_TOKEN: ${{ secrets.pink_snyk_api_key }} - with: - args: --severity-threshold=high + uses: ./.github/workflows/app-sec-template.yml + with: + github_ref: ${{ github.ref_name }} + secrets: inherit release: needs: app-sec @@ -119,28 +88,30 @@ jobs: asset_name: kdb-${{ steps.vars.outputs.run_tag }}.vsix asset_content_type: application/octet-stream - # manual-approve: - # needs: release - # environment: - # name: approvers - # runs-on: ubuntu-latest - # steps: - # - name: Manual Approve - # run: echo "Manually approved" + manual-approve: + needs: release + environment: + name: manual-approval + runs-on: ubuntu-latest + steps: + - name: Manual Approve + run: echo "Manually approved" - # publish: - # needs: manual-approve - # - name: Checkout source code - # uses: actions/checkout@v2 - # with: - # fetch-depth: 0 - # - name: Install Node.js - # uses: actions/setup-node@v3 - # with: - # node-version: 16.x - # - name: Install dependencies - # run: npm ci --include=dev - # - name: Publish to VSCode Marketplace - # run: npm run publish - # env: - # VSCE_PAT: ${{ secrets.VSCE_PAT }} + publish: + needs: manual-approve + runs-on: ubuntu-latest + steps: + - name: Checkout source code + uses: actions/checkout@v2 + with: + fetch-depth: 0 + - name: Install Node.js + uses: actions/setup-node@v3 + with: + node-version: 20.x + - name: Install dependencies + run: npm ci --include=dev + - name: Publish to VSCode Marketplace + run: npm run publish + env: + VSCE_PAT: ${{ secrets.VSCE_PAT }} diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 24e9e8a3..2038c485 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -20,7 +20,7 @@ jobs: - name: Install Node.js uses: actions/setup-node@v3 with: - node-version: 16.x + node-version: 20.x - name: Install dependencies run: npm ci --include=dev - name: Build VSIX file @@ -34,6 +34,7 @@ jobs: with: name: KDB-VSCode-Extension path: ./kdb-*vsix + retention-days: 1 - name: Upload lcov result for app-sec job uses: actions/upload-artifact@v3 with: @@ -42,69 +43,11 @@ jobs: retention-days: 1 app-sec: - runs-on: ubuntu-latest needs: build - steps: - - name: Checkout source code - uses: actions/checkout@v2 - with: - fetch-depth: 0 - - - name: Install Node.js - uses: actions/setup-node@v3 - with: - node-version: 16.x - - - name: Install dependencies - run: npm install - - - name: get-npm-version - id: package-version - uses: martinbeentjes/npm-get-version-action@v1.3.1 - - - name: Download lcov result from test job - uses: actions/download-artifact@v3 - with: - name: lcov - - - name: SonarCloud Scan - uses: sonarsource/sonarqube-scan-action@master - env: - SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }} - SONAR_HOST_URL: ${{ secrets.SONAR_HOST_URL }} - with: - args: > - -Dsonar.projectVersion=${{ steps.package-version.outputs.current-version}} - - - name: Sonarqube Quality Gate Check - id: sonarqube-quality-gate-check - uses: sonarsource/sonarqube-quality-gate-action@master - # Force to fail step after specific time - timeout-minutes: 5 - env: - SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }} - SONAR_HOST_URL: ${{ secrets.SONAR_HOST_URL }} - - - name: Snyk scan for all vulnerabilities - uses: snyk/actions/node@master - continue-on-error: true - env: - SNYK_TOKEN: ${{ secrets.pink_snyk_api_key }} - - - name: Snyk scan for high or critical vulnerabilities - uses: snyk/actions/node@master - env: - SNYK_TOKEN: ${{ secrets.pink_snyk_api_key }} - with: - args: --severity-threshold=high - - - name: Snyk Monitor - uses: snyk/actions/node@master - env: - SNYK_TOKEN: ${{ secrets.pink_snyk_api_key }} - with: - command: monitor - args: --target-reference=${{ github.ref_name }} + uses: ./.github/workflows/app-sec-template.yml + with: + github_ref: ${{ github.ref_name }} + secrets: inherit release: runs-on: ubuntu-latest diff --git a/.vscode/settings.json b/.vscode/settings.json index cc4a4d7b..45c25b47 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -3,7 +3,7 @@ "editor.formatOnSave": true, "editor.defaultFormatter": "esbenp.prettier-vscode", "editor.codeActionsOnSave": { - "source.organizeImports": false + "source.organizeImports": "never" }, "cSpell.words": ["klaw", "picomatch"], "[antlr]": { diff --git a/CHANGELOG.md b/CHANGELOG.md index 1547fda3..46264251 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,63 @@ All notable changes to the kdb extension will be documented in this file. +# v1.3.0 + +### Enhancements + +- Ability to connect to Insights Enterprise in case of remote development environments such as WSL and SSH. +- Execute files from the right-click menu. +- On the Results tab, on a kdb Insights Enterprise connection, hover the mouse over a column header to see the column Q type if it exists. +- Linting enhancements: + - Implement the following rules: + - Declare after use + - Invalid Escape + - Fixed Seed + - Too many arguments - when more than 8 arguments are being passed + - Line length limits have been removed to ensure there are no warnings after a long block comment. + - Handle .z.exit correctly. + - Optionally disable linting. + +### Fixes + +- Ability to switch users connected to a kdb Insights Enterprise URL. The new flow to switch users when you are already logged in is as follows: + + - Disconnect from the URL. + - Log into the URL using browser and log out of environment. + - On reconnecting you are asked to enter your login details and you can chose a different user. + +- Fix to ensure you can login again if a login attempt fails. + +- Fix for an invalid "settings.json" file causing "Add Connection" to fail without error. + +- Ensure the "Execute Entire File" button works even if the cursor is not in the code editor window. + +- Fixes for the Data Sources: + + - Custom APIs are no longer listed, these will be added in a future release when the execution of a Custom API is supported. + - The "Run" button will be greyed out while a Data Source is executing, to ensure there are no concurrent executions. + - To see Data Source results within the "Output" tab, ensure that the output is from "q Console Output". + +- Fixes for the tree: + + - The only variables being displayed were longs. + - Connections were string queries were forbidden broke the tree + +- Fixes for KDB Results: + + - incorrect display of empty tables + - not displaying results for non-tables or non-atoms. + +- Fix for incorrectly displayed types for local q and kdb Insights Enterprise connections. + +- Fix for the console occasionally displaying the results from the previous query. + +- Fix for syntax highlighting when using the @see qdoc tag + +### Internal Improvements + +- Fixed various CVEs + # v1.2.1 ### Fixes diff --git a/package-lock.json b/package-lock.json index 4271f84a..825c5618 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,94 +1,92 @@ { "name": "kdb", - "version": "1.2.1", + "version": "1.3.0", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "kdb", - "version": "1.2.1", + "version": "1.3.0", "license": "MIT", "dependencies": { - "@types/antlr4": "^4.11.2", + "@types/antlr4": "^4.11.6", "@types/graceful-fs": "^4.1.6", "@types/klaw": "^3.0.3", "@types/picomatch": "^2.3.0", - "@vscode/webview-ui-toolkit": "^1.2.2", + "@vscode/webview-ui-toolkit": "^1.4.0", "@windozer/node-q": "^2.6.0", - "ag-grid-community": "^30.2.0", + "ag-grid-community": "^31.0.1", "antlr4-runtime": "^4.13.0", "antlr4ts": "^0.5.0-alpha.4", - "axios": "^1.6.0", + "axios": "^1.6.5", "chevrotain": "^10.5.0", "csv-parser": "^3.0.0", "esbuild-plugin-copy": "^2.1.1", "extract-zip": "^2.0.1", - "fs-extra": "^10.1.0", - "fuse.js": "^6.6.2", - "jwt-decode": "^3.1.2", + "fs-extra": "^11.2.0", + "fuse.js": "^7.0.0", + "jwt-decode": "^4.0.0", "klaw": "^4.1.0", - "moment": "^2.29.4", + "moment": "^2.30.1", "moment-duration-format": "^2.3.2", - "moment-timezone": "^0.5.43", + "moment-timezone": "^0.5.44", "node-fetch": "^2.6.6", "node-q": "^2.6.1", - "open": "^6.4.0", - "picomatch": "^2.3.1", + "pick-port": "^2.0.1", + "picomatch": "^3.0.1", "semver": "^7.5.3", "vscode-extension-telemetry": "^0.4.5", - "vscode-languageclient": "^8.0.2", - "vscode-languageserver": "^8.1.0", "vscode-languageserver-textdocument": "^1.0.7", "vscode-uri": "^3.0.7" }, "devDependencies": { "@types/extract-zip": "^2.0.1", - "@types/fs-extra": "^9.0.13", + "@types/fs-extra": "^11.0.4", "@types/glob": "^8.0.1", - "@types/graceful-fs": "^4.1.6", - "@types/istanbul-lib-coverage": "^2.0.4", - "@types/istanbul-reports": "^3.0.1", + "@types/graceful-fs": "^4.1.9", + "@types/istanbul-lib-coverage": "^2.0.6", + "@types/istanbul-reports": "^3.0.4", "@types/jwt-decode": "^3.1.0", - "@types/klaw": "^3.0.3", - "@types/mocha": "^10.0.1", + "@types/klaw": "^3.0.6", + "@types/mocha": "^10.0.6", "@types/node": "^18.15.11", - "@types/node-fetch": "^2.6.2", - "@types/picomatch": "^2.3.0", - "@types/semver": "^7.5.0", - "@types/sinon": "^10.0.13", - "@types/vscode": "^1.66.0", - "@types/vscode-webview": "^1.57.2", - "@typescript-eslint/eslint-plugin": "^5.36.2", - "@typescript-eslint/parser": "^5.36.2", - "@vscode/test-electron": "^2.2.3", + "@types/node-fetch": "^2.6.10", + "@types/picomatch": "^2.3.3", + "@types/semver": "^7.5.6", + "@types/sinon": "^17.0.2", + "@types/vscode": "^1.75.0", + "@types/vscode-webview": "^1.57.4", + "@typescript-eslint/eslint-plugin": "^6.18.1", + "@typescript-eslint/parser": "^6.18.1", + "@vscode/test-electron": "^2.3.8", "antlr4": "^4.13.0", - "esbuild": "^0.15.7", - "eslint": "^8.23.0", + "esbuild": "^0.19.11", + "eslint": "^8.56.0", "eslint-plugin-header": "^3.1.1", "eslint-plugin-license-header": "^0.6.0", "glob": "^8.1.0", - "istanbul-lib-coverage": "^3.2.0", + "istanbul-lib-coverage": "^3.2.2", "istanbul-lib-instrument": "^3.3.0", "istanbul-lib-report": "^2.0.8", "istanbul-lib-source-maps": "^3.0.6", "istanbul-reports": "^3.1.6", - "lit": "^2.8.0", + "lit": "^3.1.0", "mocha": "^10.2.0", "mocha-junit-reporter": "^2.2.0", "mocha-multi-reporters": "^1.5.1", "mock-fs": "^5.2.0", - "prettier": "^2.7.1", - "rimraf": "^3.0.2", - "sinon": "^15.0.1", - "typescript": "^4.8.2", + "prettier": "^3.1.1", + "rimraf": "^5.0.5", + "sinon": "^17.0.1", + "typescript": "^5.3.3", "vscode-dts": "^0.3.3", - "vscode-languageclient": "^8.0.2", - "vscode-languageserver": "^8.1.0", + "vscode-languageclient": "^9.0.1", + "vscode-languageserver": "^9.0.1", "vscode-languageserver-textdocument": "^1.0.7", "vscode-test": "^1.6.1" }, "engines": { - "vscode": "^1.66.0" + "vscode": "^1.75.0" } }, "node_modules/@aashutoshrathi/word-wrap": { @@ -101,12 +99,12 @@ } }, "node_modules/@babel/code-frame": { - "version": "7.22.13", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz", - "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==", + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.5.tgz", + "integrity": "sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==", "dev": true, "dependencies": { - "@babel/highlight": "^7.22.13", + "@babel/highlight": "^7.23.4", "chalk": "^2.4.2" }, "engines": { @@ -114,12 +112,12 @@ } }, "node_modules/@babel/generator": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.0.tgz", - "integrity": "sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g==", + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.6.tgz", + "integrity": "sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw==", "dev": true, "dependencies": { - "@babel/types": "^7.23.0", + "@babel/types": "^7.23.6", "@jridgewell/gen-mapping": "^0.3.2", "@jridgewell/trace-mapping": "^0.3.17", "jsesc": "^2.5.1" @@ -175,9 +173,9 @@ } }, "node_modules/@babel/helper-string-parser": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", - "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz", + "integrity": "sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==", "dev": true, "engines": { "node": ">=6.9.0" @@ -193,9 +191,9 @@ } }, "node_modules/@babel/highlight": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.20.tgz", - "integrity": "sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==", + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz", + "integrity": "sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==", "dev": true, "dependencies": { "@babel/helper-validator-identifier": "^7.22.20", @@ -207,9 +205,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.0.tgz", - "integrity": "sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw==", + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.6.tgz", + "integrity": "sha512-Z2uID7YJ7oNvAI20O9X0bblw7Qqs8Q2hFy0R9tAfnfLkp5MW0UH9eUvnDSnFwKZ0AvgS1ucqR4KzvVHgnke1VQ==", "dev": true, "bin": { "parser": "bin/babel-parser.js" @@ -233,20 +231,20 @@ } }, "node_modules/@babel/traverse": { - "version": "7.23.2", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.2.tgz", - "integrity": "sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw==", + "version": "7.23.7", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.7.tgz", + "integrity": "sha512-tY3mM8rH9jM0YHFGyfC0/xf+SB5eKUu7HPj7/k3fpi9dAlsMc5YbQvDi0Sh2QTPXqMhyaAtzAr807TIyfQrmyg==", "dev": true, "dependencies": { - "@babel/code-frame": "^7.22.13", - "@babel/generator": "^7.23.0", + "@babel/code-frame": "^7.23.5", + "@babel/generator": "^7.23.6", "@babel/helper-environment-visitor": "^7.22.20", "@babel/helper-function-name": "^7.23.0", "@babel/helper-hoist-variables": "^7.22.5", "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.23.0", - "@babel/types": "^7.23.0", - "debug": "^4.1.0", + "@babel/parser": "^7.23.6", + "@babel/types": "^7.23.6", + "debug": "^4.3.1", "globals": "^11.1.0" }, "engines": { @@ -263,12 +261,12 @@ } }, "node_modules/@babel/types": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.0.tgz", - "integrity": "sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg==", + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.6.tgz", + "integrity": "sha512-+uarb83brBzPKN38NX1MkB6vb6+mwvR6amUulqAE7ccQw1pEl+bCia9TbdG1lsnFP7lZySvUn37CHyXQdfTwzg==", "dev": true, "dependencies": { - "@babel/helper-string-parser": "^7.22.5", + "@babel/helper-string-parser": "^7.23.4", "@babel/helper-validator-identifier": "^7.22.20", "to-fast-properties": "^2.0.0" }, @@ -305,6 +303,351 @@ "resolved": "https://registry.npmjs.org/@chevrotain/utils/-/utils-10.5.0.tgz", "integrity": "sha512-hBzuU5+JjB2cqNZyszkDHZgOSrUUT8V3dhgRl8Q9Gp6dAj/H5+KILGjbhDpc3Iy9qmqlm/akuOI2ut9VUtzJxQ==" }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.19.11.tgz", + "integrity": "sha512-FnzU0LyE3ySQk7UntJO4+qIiQgI7KoODnZg5xzXIrFJlKd2P2gwHsHY4927xj9y5PJmJSzULiUCWmv7iWnNa7g==", + "cpu": [ + "ppc64" + ], + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.19.11.tgz", + "integrity": "sha512-5OVapq0ClabvKvQ58Bws8+wkLCV+Rxg7tUVbo9xu034Nm536QTII4YzhaFriQ7rMrorfnFKUsArD2lqKbFY4vw==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.19.11.tgz", + "integrity": "sha512-aiu7K/5JnLj//KOnOfEZ0D90obUkRzDMyqd/wNAUQ34m4YUPVhRZpnqKV9uqDGxT7cToSDnIHsGooyIczu9T+Q==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.19.11.tgz", + "integrity": "sha512-eccxjlfGw43WYoY9QgB82SgGgDbibcqyDTlk3l3C0jOVHKxrjdc9CTwDUQd0vkvYg5um0OH+GpxYvp39r+IPOg==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.19.11.tgz", + "integrity": "sha512-ETp87DRWuSt9KdDVkqSoKoLFHYTrkyz2+65fj9nfXsaV3bMhTCjtQfw3y+um88vGRKRiF7erPrh/ZuIdLUIVxQ==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.19.11.tgz", + "integrity": "sha512-fkFUiS6IUK9WYUO/+22omwetaSNl5/A8giXvQlcinLIjVkxwTLSktbF5f/kJMftM2MJp9+fXqZ5ezS7+SALp4g==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.11.tgz", + "integrity": "sha512-lhoSp5K6bxKRNdXUtHoNc5HhbXVCS8V0iZmDvyWvYq9S5WSfTIHU2UGjcGt7UeS6iEYp9eeymIl5mJBn0yiuxA==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.19.11.tgz", + "integrity": "sha512-JkUqn44AffGXitVI6/AbQdoYAq0TEullFdqcMY/PCUZ36xJ9ZJRtQabzMA+Vi7r78+25ZIBosLTOKnUXBSi1Kw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.19.11.tgz", + "integrity": "sha512-3CRkr9+vCV2XJbjwgzjPtO8T0SZUmRZla+UL1jw+XqHZPkPgZiyWvbDvl9rqAN8Zl7qJF0O/9ycMtjU67HN9/Q==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.19.11.tgz", + "integrity": "sha512-LneLg3ypEeveBSMuoa0kwMpCGmpu8XQUh+mL8XXwoYZ6Be2qBnVtcDI5azSvh7vioMDhoJFZzp9GWp9IWpYoUg==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.19.11.tgz", + "integrity": "sha512-caHy++CsD8Bgq2V5CodbJjFPEiDPq8JJmBdeyZ8GWVQMjRD0sU548nNdwPNvKjVpamYYVL40AORekgfIubwHoA==", + "cpu": [ + "ia32" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.19.11.tgz", + "integrity": "sha512-ppZSSLVpPrwHccvC6nQVZaSHlFsvCQyjnvirnVjbKSHuE5N24Yl8F3UwYUUR1UEPaFObGD2tSvVKbvR+uT1Nrg==", + "cpu": [ + "loong64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.19.11.tgz", + "integrity": "sha512-B5x9j0OgjG+v1dF2DkH34lr+7Gmv0kzX6/V0afF41FkPMMqaQ77pH7CrhWeR22aEeHKaeZVtZ6yFwlxOKPVFyg==", + "cpu": [ + "mips64el" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.19.11.tgz", + "integrity": "sha512-MHrZYLeCG8vXblMetWyttkdVRjQlQUb/oMgBNurVEnhj4YWOr4G5lmBfZjHYQHHN0g6yDmCAQRR8MUHldvvRDA==", + "cpu": [ + "ppc64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.19.11.tgz", + "integrity": "sha512-f3DY++t94uVg141dozDu4CCUkYW+09rWtaWfnb3bqe4w5NqmZd6nPVBm+qbz7WaHZCoqXqHz5p6CM6qv3qnSSQ==", + "cpu": [ + "riscv64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.19.11.tgz", + "integrity": "sha512-A5xdUoyWJHMMlcSMcPGVLzYzpcY8QP1RtYzX5/bS4dvjBGVxdhuiYyFwp7z74ocV7WDc0n1harxmpq2ePOjI0Q==", + "cpu": [ + "s390x" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.19.11.tgz", + "integrity": "sha512-grbyMlVCvJSfxFQUndw5mCtWs5LO1gUlwP4CDi4iJBbVpZcqLVT29FxgGuBJGSzyOxotFG4LoO5X+M1350zmPA==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.19.11.tgz", + "integrity": "sha512-13jvrQZJc3P230OhU8xgwUnDeuC/9egsjTkXN49b3GcS5BKvJqZn86aGM8W9pd14Kd+u7HuFBMVtrNGhh6fHEQ==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.19.11.tgz", + "integrity": "sha512-ysyOGZuTp6SNKPE11INDUeFVVQFrhcNDVUgSQVDzqsqX38DjhPEPATpid04LCoUr2WXhQTEZ8ct/EgJCUDpyNw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.19.11.tgz", + "integrity": "sha512-Hf+Sad9nVwvtxy4DXCZQqLpgmRTQqyFyhT3bZ4F2XlJCjxGmRFF0Shwn9rzhOYRB61w9VMXUkxlBy56dk9JJiQ==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.19.11.tgz", + "integrity": "sha512-0P58Sbi0LctOMOQbpEOvOL44Ne0sqbS0XWHMvvrg6NE5jQ1xguCSSw9jQeUk2lfrXYsKDdOe6K+oZiwKPilYPQ==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.19.11.tgz", + "integrity": "sha512-6YOrWS+sDJDmshdBIQU+Uoyh7pQKrdykdefC1avn76ss5c+RN6gut3LZA4E2cH5xUEp5/cA0+YxRaVtRAb0xBg==", + "cpu": [ + "ia32" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.19.11.tgz", + "integrity": "sha512-vfkhltrjCAb603XaFhqhAF4LGDi2M4OrCRrFusyQ+iTLQ/o60QQXxc9cZC/FFpihBI9N1Grn6SMKVJ4KP7Fuiw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, "node_modules/@eslint-community/eslint-utils": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", @@ -330,9 +673,9 @@ } }, "node_modules/@eslint/eslintrc": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.2.tgz", - "integrity": "sha512-+wvgpDsrB1YqAMdEUCcnTlpfVBH7Vqn6A/NT3D8WVXFIaKMlErPIZT3oCIAVCOtarRpMtelZLqJeU3t7WY6X6g==", + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", "dev": true, "dependencies": { "ajv": "^6.12.4", @@ -353,9 +696,9 @@ } }, "node_modules/@eslint/js": { - "version": "8.52.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.52.0.tgz", - "integrity": "sha512-mjZVbpaeMZludF2fsWLD0Z9gCref1Tk4i9+wddjRvpUNqqcndPkBD09N/Mapey0b3jaXbLm2kICwFv2E64QinA==", + "version": "8.56.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.56.0.tgz", + "integrity": "sha512-gMsVel9D7f2HLkBma9VbtzZRehRogVRfbr++f06nL2vnCGCNlzOD+/MUov/F4p8myyAHspEhVobgjpX64q5m6A==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -394,6 +737,102 @@ "integrity": "sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==", "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==", + "dev": true, + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true + }, + "node_modules/@isaacs/cliui/node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, "node_modules/@jridgewell/gen-mapping": { "version": "0.3.3", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", @@ -449,12 +888,12 @@ "dev": true }, "node_modules/@lit/reactive-element": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/@lit/reactive-element/-/reactive-element-1.6.3.tgz", - "integrity": "sha512-QuTgnG52Poic7uM1AN5yJ09QMe0O28e10XzSvWDz02TJiiKee4stsiownEIadWm8nYzyDAyT+gKzUoZmiWQtsQ==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@lit/reactive-element/-/reactive-element-2.0.2.tgz", + "integrity": "sha512-SVOwLAWUQg3Ji1egtOt1UiFe4zdDpnWHyc5qctSceJ5XIu0Uc76YmGpIjZgx9YJ0XtdW0Jm507sDvjOu+HnB8w==", "dev": true, "dependencies": { - "@lit-labs/ssr-dom-shim": "^1.0.0" + "@lit-labs/ssr-dom-shim": "^1.1.2" } }, "node_modules/@microsoft/fast-element": { @@ -463,9 +902,9 @@ "integrity": "sha512-gQutuDHPKNxUEcQ4pypZT4Wmrbapus+P9s3bR/SEOLsMbNqNoXigGImITygI5zhb+aA5rzflM6O8YWkmRbGkPA==" }, "node_modules/@microsoft/fast-foundation": { - "version": "2.49.2", - "resolved": "https://registry.npmjs.org/@microsoft/fast-foundation/-/fast-foundation-2.49.2.tgz", - "integrity": "sha512-xA7WP/Td33SW0zkpHRH5LUDxyLOPnPQQXieRxc080uLWxoGXhVxo6Rz7b6qwiL+e2IadNCm7X7KcrgsUhJwvBg==", + "version": "2.49.4", + "resolved": "https://registry.npmjs.org/@microsoft/fast-foundation/-/fast-foundation-2.49.4.tgz", + "integrity": "sha512-5I2tSPo6bnOfVAIX7XzX+LhilahwvD7h+yzl3jW0t5IYmMX9Lci9VUVyx5f8hHdb1O9a8Y9Atb7Asw7yFO/u+w==", "dependencies": { "@microsoft/fast-element": "^1.12.0", "@microsoft/fast-web-utilities": "^5.4.1", @@ -473,13 +912,18 @@ "tslib": "^1.13.0" } }, + "node_modules/@microsoft/fast-foundation/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, "node_modules/@microsoft/fast-react-wrapper": { - "version": "0.1.48", - "resolved": "https://registry.npmjs.org/@microsoft/fast-react-wrapper/-/fast-react-wrapper-0.1.48.tgz", - "integrity": "sha512-9NvEjru9Kn5ZKjomAMX6v+eF0DR+eDkxKDwDfi+Wb73kTbrNzcnmlwd4diN15ygH97kldgj2+lpvI4CKLQQWLg==", + "version": "0.3.22", + "resolved": "https://registry.npmjs.org/@microsoft/fast-react-wrapper/-/fast-react-wrapper-0.3.22.tgz", + "integrity": "sha512-XhlX4m6znh7XW92oPvlKoG9USUn9JtF9rP1qtUoIbkaDaFtUS+H8o1Jn6/oK/rS44LbBLJXrvRkInmSWlDiGFw==", "dependencies": { - "@microsoft/fast-element": "^1.9.0", - "@microsoft/fast-foundation": "^2.41.1" + "@microsoft/fast-element": "^1.12.0", + "@microsoft/fast-foundation": "^2.49.4" }, "peerDependencies": { "react": ">=16.9.0" @@ -525,6 +969,16 @@ "node": ">= 8" } }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "dev": true, + "optional": true, + "engines": { + "node": ">=14" + } + }, "node_modules/@sinonjs/commons": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.0.tgz", @@ -579,9 +1033,9 @@ } }, "node_modules/@types/antlr4": { - "version": "4.11.5", - "resolved": "https://registry.npmjs.org/@types/antlr4/-/antlr4-4.11.5.tgz", - "integrity": "sha512-fMe+kM+6ccLkUbCYQ7tNHlWNX4dVmTdRykib5S8sdWGHBxFFKN9/srtpXpILBY08RJYld5bOe3+tB2Qz6WmHZw==" + "version": "4.11.6", + "resolved": "https://registry.npmjs.org/@types/antlr4/-/antlr4-4.11.6.tgz", + "integrity": "sha512-YtxtT6vYfLK6jC55zC4Pb2YwV6Z8exn4DbDlQgoSEc6VqlFZloi6bgm0AqZns/7U4XQCAVMhv/+vnGcfyCkPfg==" }, "node_modules/@types/extract-zip": { "version": "2.0.1", @@ -594,11 +1048,12 @@ } }, "node_modules/@types/fs-extra": { - "version": "9.0.13", - "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-9.0.13.tgz", - "integrity": "sha512-nEnwB++1u5lVDM2UI4c1+5R+FYaKfaAzS4OococimjVm3nQw3TuzH5UNsocrcTBbhnerblyHj4A49qXbIiZdpA==", + "version": "11.0.4", + "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-11.0.4.tgz", + "integrity": "sha512-yTbItCNreRooED33qjunPthRcSjERP1r4MqCZc7wv0u2sUkzTFp45tgUfS5+r7FrZPdmCCNflLhVSP/o+SemsQ==", "dev": true, "dependencies": { + "@types/jsonfile": "*", "@types/node": "*" } }, @@ -613,18 +1068,18 @@ } }, "node_modules/@types/graceful-fs": { - "version": "4.1.8", - "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.8.tgz", - "integrity": "sha512-NhRH7YzWq8WiNKVavKPBmtLYZHxNY19Hh+az28O/phfp68CF45pMFud+ZzJ8ewnxnC5smIdF3dqFeiSUQ5I+pw==", + "version": "4.1.9", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz", + "integrity": "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==", "dev": true, "dependencies": { "@types/node": "*" } }, "node_modules/@types/istanbul-lib-coverage": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz", - "integrity": "sha512-zONci81DZYCZjiLe0r6equvZut0b+dBRPBN5kBDjsONnutYNtJMoWQ9uR2RkL1gLG9NMTzvf+29e5RFfPbeKhQ==", + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", + "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", "dev": true }, "node_modules/@types/istanbul-lib-report": { @@ -637,20 +1092,29 @@ } }, "node_modules/@types/istanbul-reports": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.3.tgz", - "integrity": "sha512-1nESsePMBlf0RPRffLZi5ujYh7IH1BWL4y9pr+Bn3cJBdxz+RTP8bUFljLz9HvzhhOSWKdyBZ4DIivdL6rvgZg==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", + "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", "dev": true, "dependencies": { "@types/istanbul-lib-report": "*" } }, "node_modules/@types/json-schema": { - "version": "7.0.14", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.14.tgz", - "integrity": "sha512-U3PUjAudAdJBeC2pgN8uTIKgxrb4nlDF3SF0++EldXQvQBGkpFZMSnwQiIoDU77tv45VgNkl/L4ouD+rEomujw==", + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", "dev": true }, + "node_modules/@types/jsonfile": { + "version": "6.1.4", + "resolved": "https://registry.npmjs.org/@types/jsonfile/-/jsonfile-6.1.4.tgz", + "integrity": "sha512-D5qGUYwjvnNNextdU59/+fI+spnwtTFmyQP0h+PfIOSkNfpU6AOICUOkm4i0OnSk+NyjdPJrxCDro0sJsWlRpQ==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@types/jwt-decode": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/@types/jwt-decode/-/jwt-decode-3.1.0.tgz", @@ -662,9 +1126,9 @@ } }, "node_modules/@types/klaw": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@types/klaw/-/klaw-3.0.5.tgz", - "integrity": "sha512-sX8M64GwQbEhPA4GrOUYEl/0Cc9oz5Effoaj43B4o3bsVwskxEipparp8tI1E6lhs2s1R1u/0KeNvf/9OR1cAA==", + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@types/klaw/-/klaw-3.0.6.tgz", + "integrity": "sha512-BErW5TrTz4nzt/c3VRGf0Bug4JyQJ1o807F4mAfXfvOzFZ8SKgFeHJ0T28Y1KtqlMEB+cUgN7S7CsyQDQ/qxqg==", "dev": true, "dependencies": { "@types/node": "*" @@ -677,9 +1141,9 @@ "dev": true }, "node_modules/@types/mocha": { - "version": "10.0.3", - "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-10.0.3.tgz", - "integrity": "sha512-RsOPImTriV/OE4A9qKjMtk2MnXiuLLbcO3nCXK+kvq4nr0iMfFgpjaX3MPLb6f7+EL1FGSelYvuJMV6REH+ZPQ==", + "version": "10.0.6", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-10.0.6.tgz", + "integrity": "sha512-dJvrYWxP/UcXm36Qn36fxhUKu8A/xMRXVT2cliFF1Z7UA9liG5Psj3ezNSZw+5puH2czDXRLcXQxf8JbJt0ejg==", "dev": true }, "node_modules/@types/node": { @@ -692,9 +1156,9 @@ } }, "node_modules/@types/node-fetch": { - "version": "2.6.7", - "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.7.tgz", - "integrity": "sha512-lX17GZVpJ/fuCjguZ5b3TjEbSENxmEk1B2z02yoXSK9WMEWRivhdSY73wWMn6bpcCDAOh6qAdktpKHIlkDk2lg==", + "version": "2.6.10", + "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.10.tgz", + "integrity": "sha512-PPpPK6F9ALFTn59Ka3BaL+qGuipRfxNE8qVgkp0bVixeiR2c2/L+IVOiBdu9JhhT22sWnQEp6YyHGI2b2+CMcA==", "dev": true, "dependencies": { "@types/node": "*", @@ -716,21 +1180,21 @@ } }, "node_modules/@types/picomatch": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/@types/picomatch/-/picomatch-2.3.2.tgz", - "integrity": "sha512-I+BytjxOlNYA285zP/3dVCRcE+OAvgHQZQt26MP7T7JbZ9DM/3W2WfViU1XuLypCzAx8PTC+MlYO3WLqjTyZ3g==", + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/@types/picomatch/-/picomatch-2.3.3.tgz", + "integrity": "sha512-Yll76ZHikRFCyz/pffKGjrCwe/le2CDwOP5F210KQo27kpRE46U2rDnzikNlVn6/ezH3Mhn46bJMTfeVTtcYMg==", "dev": true }, "node_modules/@types/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-MMzuxN3GdFwskAnb6fz0orFvhfqi752yjaXylr0Rp4oDg5H0Zn1IuyRhDVvYOwAXoJirx2xuS16I3WjxnAIHiQ==", + "version": "7.5.6", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.6.tgz", + "integrity": "sha512-dn1l8LaMea/IjDoHNd9J52uBbInB796CDffS6VdIxvqYCPSG0V0DzHp76GpaWnlhg88uYyPbXCDIowa86ybd5A==", "dev": true }, "node_modules/@types/sinon": { - "version": "10.0.20", - "resolved": "https://registry.npmjs.org/@types/sinon/-/sinon-10.0.20.tgz", - "integrity": "sha512-2APKKruFNCAZgx3daAyACGzWuJ028VVCUDk6o2rw/Z4PXT0ogwdV4KUegW0MwVs0Zu59auPXbbuBJHF12Sx1Eg==", + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/@types/sinon/-/sinon-17.0.2.tgz", + "integrity": "sha512-Zt6heIGsdqERkxctIpvN5Pv3edgBrhoeb3yHyxffd4InN0AX2SVNKSrhdDZKGQICVOxWP/q4DyhpfPNMSrpIiA==", "dev": true, "dependencies": { "@types/sinonjs__fake-timers": "*" @@ -743,21 +1207,21 @@ "dev": true }, "node_modules/@types/trusted-types": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.5.tgz", - "integrity": "sha512-I3pkr8j/6tmQtKV/ZzHtuaqYSQvyjGRKH4go60Rr0IDLlFxuRT5V32uvB1mecM5G1EVAUyF/4r4QZ1GHgz+mxA==", + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz", + "integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==", "dev": true }, "node_modules/@types/vscode": { - "version": "1.83.1", - "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.83.1.tgz", - "integrity": "sha512-BHu51NaNKOtDf3BOonY3sKFFmZKEpRkzqkZVpSYxowLbs5JqjOQemYFob7Gs5rpxE5tiGhfpnMpcdF/oKrLg4w==", + "version": "1.85.0", + "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.85.0.tgz", + "integrity": "sha512-CF/RBon/GXwdfmnjZj0WTUMZN5H6YITOfBCP4iEZlOtVQXuzw6t7Le7+cR+7JzdMrnlm7Mfp49Oj2TuSXIWo3g==", "dev": true }, "node_modules/@types/vscode-webview": { - "version": "1.57.3", - "resolved": "https://registry.npmjs.org/@types/vscode-webview/-/vscode-webview-1.57.3.tgz", - "integrity": "sha512-8at2UVGjA/6gcLOay+J8wOars6VsDqAqPxRHYihH0XFUaXt+2AZ+Hd9hSoUbnhjicb6V1xe7rfjb7j4Ri2n1fg==", + "version": "1.57.4", + "resolved": "https://registry.npmjs.org/@types/vscode-webview/-/vscode-webview-1.57.4.tgz", + "integrity": "sha512-RrVw9s6gBJuY1IkUHMNznWgj/ktjwLpATyOTcKxUDIbbp7AQeK7S0E1+P/8Z75OgAW13OMqSAmaiuWw25dh59Q==", "dev": true }, "node_modules/@types/yauzl": { @@ -770,32 +1234,33 @@ } }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.62.0.tgz", - "integrity": "sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag==", + "version": "6.18.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.18.1.tgz", + "integrity": "sha512-nISDRYnnIpk7VCFrGcu1rnZfM1Dh9LRHnfgdkjcbi/l7g16VYRri3TjXi9Ir4lOZSw5N/gnV/3H7jIPQ8Q4daA==", "dev": true, "dependencies": { - "@eslint-community/regexpp": "^4.4.0", - "@typescript-eslint/scope-manager": "5.62.0", - "@typescript-eslint/type-utils": "5.62.0", - "@typescript-eslint/utils": "5.62.0", + "@eslint-community/regexpp": "^4.5.1", + "@typescript-eslint/scope-manager": "6.18.1", + "@typescript-eslint/type-utils": "6.18.1", + "@typescript-eslint/utils": "6.18.1", + "@typescript-eslint/visitor-keys": "6.18.1", "debug": "^4.3.4", "graphemer": "^1.4.0", - "ignore": "^5.2.0", - "natural-compare-lite": "^1.4.0", - "semver": "^7.3.7", - "tsutils": "^3.21.0" + "ignore": "^5.2.4", + "natural-compare": "^1.4.0", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "@typescript-eslint/parser": "^5.0.0", - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + "@typescript-eslint/parser": "^6.0.0 || ^6.0.0-alpha", + "eslint": "^7.0.0 || ^8.0.0" }, "peerDependenciesMeta": { "typescript": { @@ -804,25 +1269,26 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.62.0.tgz", - "integrity": "sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==", + "version": "6.18.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.18.1.tgz", + "integrity": "sha512-zct/MdJnVaRRNy9e84XnVtRv9Vf91/qqe+hZJtKanjojud4wAVy/7lXxJmMyX6X6J+xc6c//YEWvpeif8cAhWA==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "5.62.0", - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/typescript-estree": "5.62.0", + "@typescript-eslint/scope-manager": "6.18.1", + "@typescript-eslint/types": "6.18.1", + "@typescript-eslint/typescript-estree": "6.18.1", + "@typescript-eslint/visitor-keys": "6.18.1", "debug": "^4.3.4" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + "eslint": "^7.0.0 || ^8.0.0" }, "peerDependenciesMeta": { "typescript": { @@ -831,16 +1297,16 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz", - "integrity": "sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==", + "version": "6.18.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.18.1.tgz", + "integrity": "sha512-BgdBwXPFmZzaZUuw6wKiHKIovms97a7eTImjkXCZE04TGHysG+0hDQPmygyvgtkoB/aOQwSM/nWv3LzrOIQOBw==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/visitor-keys": "5.62.0" + "@typescript-eslint/types": "6.18.1", + "@typescript-eslint/visitor-keys": "6.18.1" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", @@ -848,25 +1314,25 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.62.0.tgz", - "integrity": "sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew==", + "version": "6.18.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.18.1.tgz", + "integrity": "sha512-wyOSKhuzHeU/5pcRDP2G2Ndci+4g653V43gXTpt4nbyoIOAASkGDA9JIAgbQCdCkcr1MvpSYWzxTz0olCn8+/Q==", "dev": true, "dependencies": { - "@typescript-eslint/typescript-estree": "5.62.0", - "@typescript-eslint/utils": "5.62.0", + "@typescript-eslint/typescript-estree": "6.18.1", + "@typescript-eslint/utils": "6.18.1", "debug": "^4.3.4", - "tsutils": "^3.21.0" + "ts-api-utils": "^1.0.1" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "*" + "eslint": "^7.0.0 || ^8.0.0" }, "peerDependenciesMeta": { "typescript": { @@ -875,12 +1341,12 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz", - "integrity": "sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==", + "version": "6.18.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.18.1.tgz", + "integrity": "sha512-4TuMAe+tc5oA7wwfqMtB0Y5OrREPF1GeJBAjqwgZh1lEMH5PJQgWgHGfYufVB51LtjD+peZylmeyxUXPfENLCw==", "dev": true, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", @@ -888,21 +1354,22 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz", - "integrity": "sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==", + "version": "6.18.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.18.1.tgz", + "integrity": "sha512-fv9B94UAhywPRhUeeV/v+3SBDvcPiLxRZJw/xZeeGgRLQZ6rLMG+8krrJUyIf6s1ecWTzlsbp0rlw7n9sjufHA==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/visitor-keys": "5.62.0", + "@typescript-eslint/types": "6.18.1", + "@typescript-eslint/visitor-keys": "6.18.1", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" + "minimatch": "9.0.3", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", @@ -914,43 +1381,66 @@ } } }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/@typescript-eslint/utils": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.62.0.tgz", - "integrity": "sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==", + "version": "6.18.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.18.1.tgz", + "integrity": "sha512-zZmTuVZvD1wpoceHvoQpOiewmWu3uP9FuTWo8vqpy2ffsmfCE8mklRPi+vmnIYAIk9t/4kOThri2QCDgor+OpQ==", "dev": true, "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@types/json-schema": "^7.0.9", - "@types/semver": "^7.3.12", - "@typescript-eslint/scope-manager": "5.62.0", - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/typescript-estree": "5.62.0", - "eslint-scope": "^5.1.1", - "semver": "^7.3.7" + "@eslint-community/eslint-utils": "^4.4.0", + "@types/json-schema": "^7.0.12", + "@types/semver": "^7.5.0", + "@typescript-eslint/scope-manager": "6.18.1", + "@typescript-eslint/types": "6.18.1", + "@typescript-eslint/typescript-estree": "6.18.1", + "semver": "^7.5.4" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + "eslint": "^7.0.0 || ^8.0.0" } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz", - "integrity": "sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==", + "version": "6.18.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.18.1.tgz", + "integrity": "sha512-/kvt0C5lRqGoCfsbmm7/CwMqoSkY3zzHLIjdhHZQW3VFrnz7ATecOHR7nb7V+xn4286MBxfnQfQhAmCI0u+bJA==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.62.0", - "eslint-visitor-keys": "^3.3.0" + "@typescript-eslint/types": "6.18.1", + "eslint-visitor-keys": "^3.4.1" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", @@ -964,9 +1454,9 @@ "dev": true }, "node_modules/@vscode/test-electron": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/@vscode/test-electron/-/test-electron-2.3.6.tgz", - "integrity": "sha512-M31xGH0RgqNU6CZ4/9g39oUMJ99nLzfjA+4UbtIQ6TcXQ6+2qkjOOxedmPBDDCg26/3Al5ubjY80hIoaMwKYSw==", + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/@vscode/test-electron/-/test-electron-2.3.8.tgz", + "integrity": "sha512-b4aZZsBKtMGdDljAsOPObnAi7+VWIaYl3ylCz1jTs+oV6BZ4TNHcVNC3xUn0azPeszBmwSBDQYfFESIaUQnrOg==", "dev": true, "dependencies": { "http-proxy-agent": "^4.0.1", @@ -979,13 +1469,14 @@ } }, "node_modules/@vscode/webview-ui-toolkit": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@vscode/webview-ui-toolkit/-/webview-ui-toolkit-1.2.2.tgz", - "integrity": "sha512-xIQoF4FC3Xh6d7KNKIoIezSiFWYFuf6gQMdDyKueKBFGeKwaHWEn+dY2g3makvvEsNMEDji/woEwvg9QSbuUsw==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@vscode/webview-ui-toolkit/-/webview-ui-toolkit-1.4.0.tgz", + "integrity": "sha512-modXVHQkZLsxgmd5yoP3ptRC/G8NBDD+ob+ngPiWNQdlrH6H1xR/qgOBD85bfU3BhOB5sZzFWBwwhp9/SfoHww==", "dependencies": { - "@microsoft/fast-element": "^1.6.2", - "@microsoft/fast-foundation": "^2.38.0", - "@microsoft/fast-react-wrapper": "^0.1.18" + "@microsoft/fast-element": "^1.12.0", + "@microsoft/fast-foundation": "^2.49.4", + "@microsoft/fast-react-wrapper": "^0.3.22", + "tslib": "^2.6.2" }, "peerDependencies": { "react": ">=16.9.0" @@ -1005,9 +1496,9 @@ } }, "node_modules/acorn": { - "version": "8.11.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.2.tgz", - "integrity": "sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==", + "version": "8.11.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", + "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", "dev": true, "bin": { "acorn": "bin/acorn" @@ -1026,9 +1517,9 @@ } }, "node_modules/ag-grid-community": { - "version": "30.2.0", - "resolved": "https://registry.npmjs.org/ag-grid-community/-/ag-grid-community-30.2.0.tgz", - "integrity": "sha512-Gd6GXmtzEQSCDloBdRxxCDqnjTBRAOf/zzlaxxyyVBJgc+cePuNgGdplRUhT/rwIiDwvyuoynvxelVE/iYdXsA==" + "version": "31.0.1", + "resolved": "https://registry.npmjs.org/ag-grid-community/-/ag-grid-community-31.0.1.tgz", + "integrity": "sha512-RZQlW1DTOJHsUR/tnbnTJQKgAnDlHi05YYyTe5AgNor/1TlX1hoYdcqrGsJjvcHQgTjeEgzWOL0yf+KcqXZzxg==" }, "node_modules/agent-base": { "version": "6.0.2", @@ -1125,6 +1616,17 @@ "node": ">= 8" } }, + "node_modules/anymatch/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", @@ -1145,11 +1647,11 @@ "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" }, "node_modules/axios": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.0.tgz", - "integrity": "sha512-EZ1DYihju9pwVB+jg67ogm+Tmqc6JmhamRN6I4Zt8DfZu5lbcQGw3ozH9lFejSJgs/ibaef3A9PMXPLeefFGJg==", + "version": "1.6.5", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.5.tgz", + "integrity": "sha512-Ii012v05KEVuUoFWmMW/UQv9aRIc3ZwkWDcM+h5Il8izZCtRVpDUfwpoFf7eOtajT3QiGR4yDUx7lPqHJULgbg==", "dependencies": { - "follow-redirects": "^1.15.0", + "follow-redirects": "^1.15.4", "form-data": "^4.0.0", "proxy-from-env": "^1.1.0" } @@ -1302,15 +1804,6 @@ "node": ">=4" } }, - "node_modules/chalk/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, "node_modules/charenc": { "version": "0.0.2", "resolved": "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz", @@ -1528,6 +2021,12 @@ "readable-stream": "^2.0.2" } }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true + }, "node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", @@ -1541,56 +2040,42 @@ "dependencies": { "once": "^1.4.0" } - }, - "node_modules/esbuild": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.15.18.tgz", - "integrity": "sha512-x/R72SmW3sSFRm5zrrIjAhCeQSAWoni3CmHEqfQrZIQTM3lVCdehdwuIqaOtfC2slvpdlLa62GYoN8SxT23m6Q==", - "hasInstallScript": true, - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=12" - }, - "optionalDependencies": { - "@esbuild/android-arm": "0.15.18", - "@esbuild/linux-loong64": "0.15.18", - "esbuild-android-64": "0.15.18", - "esbuild-android-arm64": "0.15.18", - "esbuild-darwin-64": "0.15.18", - "esbuild-darwin-arm64": "0.15.18", - "esbuild-freebsd-64": "0.15.18", - "esbuild-freebsd-arm64": "0.15.18", - "esbuild-linux-32": "0.15.18", - "esbuild-linux-64": "0.15.18", - "esbuild-linux-arm": "0.15.18", - "esbuild-linux-arm64": "0.15.18", - "esbuild-linux-mips64le": "0.15.18", - "esbuild-linux-ppc64le": "0.15.18", - "esbuild-linux-riscv64": "0.15.18", - "esbuild-linux-s390x": "0.15.18", - "esbuild-netbsd-64": "0.15.18", - "esbuild-openbsd-64": "0.15.18", - "esbuild-sunos-64": "0.15.18", - "esbuild-windows-32": "0.15.18", - "esbuild-windows-64": "0.15.18", - "esbuild-windows-arm64": "0.15.18" - } - }, - "node_modules/esbuild-darwin-arm64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.15.18.tgz", - "integrity": "sha512-tKPSxcTJ5OmNb1btVikATJ8NftlyNlc8BVNtyT/UAr62JFOhwHlnoPrhYWz09akBLHI9nElFVfWSTSRsrZiDUA==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "darwin" - ], + }, + "node_modules/esbuild": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.19.11.tgz", + "integrity": "sha512-HJ96Hev2hX/6i5cDVwcqiJBBtuo9+FeIJOtZ9W1kA5M6AMJRHUZlpYZ1/SbEwtO0ioNAW8rUooVpC/WehY2SfA==", + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, "engines": { "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.19.11", + "@esbuild/android-arm": "0.19.11", + "@esbuild/android-arm64": "0.19.11", + "@esbuild/android-x64": "0.19.11", + "@esbuild/darwin-arm64": "0.19.11", + "@esbuild/darwin-x64": "0.19.11", + "@esbuild/freebsd-arm64": "0.19.11", + "@esbuild/freebsd-x64": "0.19.11", + "@esbuild/linux-arm": "0.19.11", + "@esbuild/linux-arm64": "0.19.11", + "@esbuild/linux-ia32": "0.19.11", + "@esbuild/linux-loong64": "0.19.11", + "@esbuild/linux-mips64el": "0.19.11", + "@esbuild/linux-ppc64": "0.19.11", + "@esbuild/linux-riscv64": "0.19.11", + "@esbuild/linux-s390x": "0.19.11", + "@esbuild/linux-x64": "0.19.11", + "@esbuild/netbsd-x64": "0.19.11", + "@esbuild/openbsd-x64": "0.19.11", + "@esbuild/sunos-x64": "0.19.11", + "@esbuild/win32-arm64": "0.19.11", + "@esbuild/win32-ia32": "0.19.11", + "@esbuild/win32-x64": "0.19.11" } }, "node_modules/esbuild-plugin-copy": { @@ -1652,6 +2137,19 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, + "node_modules/esbuild-plugin-copy/node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, "node_modules/esbuild-plugin-copy/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -1680,16 +2178,25 @@ "node": ">=6" } }, + "node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, "node_modules/eslint": { - "version": "8.52.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.52.0.tgz", - "integrity": "sha512-zh/JHnaixqHZsolRB/w9/02akBk9EPrOs9JwcTP2ek7yL5bVvXuRariiaAjjoJ5DvuwQ1WAE/HsMz+w17YgBCg==", + "version": "8.56.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.56.0.tgz", + "integrity": "sha512-Go19xM6T9puCOWntie1/P997aXxFsOi37JIHRWI514Hc6ZnaHGKY9xFhrU65RT6CcBEzZoGG1e6Nq+DT04ZtZQ==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", - "@eslint/eslintrc": "^2.1.2", - "@eslint/js": "8.52.0", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.56.0", "@humanwhocodes/config-array": "^0.11.13", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", @@ -1753,19 +2260,6 @@ "requireindex": "^1.2.0" } }, - "node_modules/eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "dev": true, - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, "node_modules/eslint-visitor-keys": { "version": "3.4.3", "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", @@ -1956,15 +2450,6 @@ "node": ">=4.0" } }, - "node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, "node_modules/esutils": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", @@ -2109,6 +2594,41 @@ "node": ">=12.0.0" } }, + "node_modules/flat-cache/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/flat-cache/node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/flatted": { "version": "3.2.9", "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.9.tgz", @@ -2116,9 +2636,9 @@ "dev": true }, "node_modules/follow-redirects": { - "version": "1.15.3", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.3.tgz", - "integrity": "sha512-1VzOtuEM8pC9SFU1E+8KfTjZyMztRsgEfwQl44z8A25uy13jSzTj6dyK2Df52iV0vgHCfBwLhDWevLn95w5v6Q==", + "version": "1.15.4", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.4.tgz", + "integrity": "sha512-Cr4D/5wlrb0z9dgERpUL3LrmPKVDsETIJhaCMeDfuFYcqa5bldGV6wBsAN6X/vxlXQtFBMrXdXxdL8CbDTGniw==", "funding": [ { "type": "individual", @@ -2134,17 +2654,33 @@ } } }, + "node_modules/foreground-child": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz", + "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", + "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", "universalify": "^2.0.0" }, "engines": { - "node": ">=12" + "node": ">=14.14" } }, "node_modules/fs.realpath": { @@ -2226,9 +2762,9 @@ } }, "node_modules/fuse.js": { - "version": "6.6.2", - "resolved": "https://registry.npmjs.org/fuse.js/-/fuse.js-6.6.2.tgz", - "integrity": "sha512-cJaJkxCCxC8qIIcPBF9yGxY0W/tVZS3uEISDxhYIdtk8OL93pe+6Zj7LjCqVV4dzbqcriOZ+kQ/NE4RXZHsIGA==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/fuse.js/-/fuse.js-7.0.0.tgz", + "integrity": "sha512-14F4hBIxqKvD4Zz/XjDc3y94mNZN6pRv3U13Udo0lNLCWRBUsrMv2xwcF/y/Z5sV6+FQW+/ow68cHpm4sunt8Q==", "engines": { "node": ">=10" } @@ -2308,9 +2844,9 @@ } }, "node_modules/globals": { - "version": "13.23.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.23.0.tgz", - "integrity": "sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==", + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", "dev": true, "dependencies": { "type-fest": "^0.20.2" @@ -2541,14 +3077,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-wsl": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", - "integrity": "sha512-gfygJYZ2gLTDlmbWMI0CE2MwnFzSN/2SZfkMlItC4K/JBlsWVDB0bO6XhqcY13YXE7iMcAJnzTCJjPiTeJJ0Mw==", - "engines": { - "node": ">=4" - } - }, "node_modules/isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", @@ -2562,9 +3090,9 @@ "dev": true }, "node_modules/istanbul-lib-coverage": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", - "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", + "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", "dev": true, "engines": { "node": ">=8" @@ -2761,6 +3289,24 @@ "node": ">=8" } }, + "node_modules/jackspeak": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz", + "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==", + "dev": true, + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -2838,9 +3384,12 @@ "dev": true }, "node_modules/jwt-decode": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/jwt-decode/-/jwt-decode-3.1.2.tgz", - "integrity": "sha512-UfpWE/VZn0iP50d8cz9NrZLM9lSWhcJ+0Gt/nm4by88UL+J1SiKN8/5dkjMmbEzwL2CAe+67GsegCbIKtbp75A==" + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jwt-decode/-/jwt-decode-4.0.0.tgz", + "integrity": "sha512-+KJGIyHgkGuIq3IEBNftfhW/LfWhXUIY6OmyVWjliu5KH1y0fw7VQ8YndE2O4qZdMSd9SqbnC8GOcZEy0Om7sA==", + "engines": { + "node": ">=18" + } }, "node_modules/keyv": { "version": "4.5.4", @@ -2897,31 +3446,31 @@ "dev": true }, "node_modules/lit": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/lit/-/lit-2.8.0.tgz", - "integrity": "sha512-4Sc3OFX9QHOJaHbmTMk28SYgVxLN3ePDjg7hofEft2zWlehFL3LiAuapWc4U/kYwMYJSh2hTCPZ6/LIC7ii0MA==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/lit/-/lit-3.1.0.tgz", + "integrity": "sha512-rzo/hmUqX8zmOdamDAeydfjsGXbbdtAFqMhmocnh2j9aDYqbu0fjXygjCa0T99Od9VQ/2itwaGrjZz/ZELVl7w==", "dev": true, "dependencies": { - "@lit/reactive-element": "^1.6.0", - "lit-element": "^3.3.0", - "lit-html": "^2.8.0" + "@lit/reactive-element": "^2.0.0", + "lit-element": "^4.0.0", + "lit-html": "^3.1.0" } }, "node_modules/lit-element": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/lit-element/-/lit-element-3.3.3.tgz", - "integrity": "sha512-XbeRxmTHubXENkV4h8RIPyr8lXc+Ff28rkcQzw3G6up2xg5E8Zu1IgOWIwBLEQsu3cOVFqdYwiVi0hv0SlpqUA==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/lit-element/-/lit-element-4.0.2.tgz", + "integrity": "sha512-/W6WQZUa5VEXwC7H9tbtDMdSs9aWil3Ou8hU6z2cOKWbsm/tXPAcsoaHVEtrDo0zcOIE5GF6QgU55tlGL2Nihg==", "dev": true, "dependencies": { - "@lit-labs/ssr-dom-shim": "^1.1.0", - "@lit/reactive-element": "^1.3.0", - "lit-html": "^2.8.0" + "@lit-labs/ssr-dom-shim": "^1.1.2", + "@lit/reactive-element": "^2.0.0", + "lit-html": "^3.1.0" } }, "node_modules/lit-html": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/lit-html/-/lit-html-2.8.0.tgz", - "integrity": "sha512-o9t+MQM3P4y7M7yNzqAyjp7z+mQGa4NS4CxiyLqFPyFWyc4O+nodLrkrxSaCTrla6M5YOLaT3RpbbqjszB5g3Q==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/lit-html/-/lit-html-3.1.0.tgz", + "integrity": "sha512-FwAjq3iNsaO6SOZXEIpeROlJLUlrbyMkn4iuv4f4u1H40Jw8wkeR/OUXZUHUoiYabGk8Y4Y0F/rgq+R4MrOLmA==", "dev": true, "dependencies": { "@types/trusted-types": "^2.0.2" @@ -3129,6 +3678,17 @@ "node": ">=8.6" } }, + "node_modules/micromatch/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/mime-db": { "version": "1.52.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", @@ -3168,6 +3728,15 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/minipass": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", + "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", + "dev": true, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, "node_modules/mkdirp": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-3.0.1.tgz", @@ -3360,9 +3929,9 @@ } }, "node_modules/moment": { - "version": "2.29.4", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.4.tgz", - "integrity": "sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==", + "version": "2.30.1", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.30.1.tgz", + "integrity": "sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==", "engines": { "node": "*" } @@ -3373,9 +3942,9 @@ "integrity": "sha512-cBMXjSW+fjOb4tyaVHuaVE/A5TqkukDWiOfxxAjY+PEqmmBQlLwn+8OzwPiG3brouXKY5Un4pBjAeB6UToXHaQ==" }, "node_modules/moment-timezone": { - "version": "0.5.43", - "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.43.tgz", - "integrity": "sha512-72j3aNyuIsDxdF1i7CEgV2FfxM1r6aaqJyLB2vwb33mXYyoyLly+F1zbWqhA3/bVIoJ4szlUoMbUnVdid32NUQ==", + "version": "0.5.44", + "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.44.tgz", + "integrity": "sha512-nv3YpzI/8lkQn0U6RkLd+f0W/zy/JnoR5/EyPz/dNkPTBjA2jNLCVxaiQ8QpeLymhSZvX0wCL5s27NQWdOPwAw==", "dependencies": { "moment": "^2.29.4" }, @@ -3406,12 +3975,6 @@ "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", "dev": true }, - "node_modules/natural-compare-lite": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz", - "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==", - "dev": true - }, "node_modules/nise": { "version": "5.1.5", "resolved": "https://registry.npmjs.org/nise/-/nise-5.1.5.tgz", @@ -3491,17 +4054,6 @@ "wrappy": "1" } }, - "node_modules/open": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/open/-/open-6.4.0.tgz", - "integrity": "sha512-IFenVPgF70fSm1keSd2iDBIDIBZkroLeuffXq+wKTzTJlBpesFWojV9lb8mzOfaAzM1sr7HQHuO0vtV0zYekGg==", - "dependencies": { - "is-wsl": "^1.1.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/optionator": { "version": "0.9.3", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", @@ -3594,6 +4146,31 @@ "node": ">=8" } }, + "node_modules/path-scurry": { + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.1.tgz", + "integrity": "sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==", + "dev": true, + "dependencies": { + "lru-cache": "^9.1.1 || ^10.0.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.1.0.tgz", + "integrity": "sha512-/1clY/ui8CzjKFyjdvwPWJUYKiFVXG2I2cY0ssG7h4+hwk+XOIX7ZSG9Q7TW8TW3Kp3BUSqgFWBLgL4PJ+Blag==", + "dev": true, + "engines": { + "node": "14 || >=16.14" + } + }, "node_modules/path-to-regexp": { "version": "1.8.0", "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz", @@ -3622,12 +4199,23 @@ "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==" }, + "node_modules/pick-port": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pick-port/-/pick-port-2.0.1.tgz", + "integrity": "sha512-8GSFuOCelctwcW0CkNGFahrGJyKxx2hMOmzDxVaHTknsikh4Zi+edCFUMgfAcBLRkV0GYQT64QivSi4SxDeKdA==", + "dependencies": { + "debug": "^4.3.4" + }, + "engines": { + "node": ">=16" + } + }, "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-3.0.1.tgz", + "integrity": "sha512-I3EurrIQMlRc9IaAZnqRR044Phh2DXY+55o7uJ0V+hYZAcQYSuFWsc9q5PvyDHUSCe1Qxn/iBz+78s86zWnGag==", "engines": { - "node": ">=8.6" + "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/jonschlinkert" @@ -3652,15 +4240,15 @@ } }, "node_modules/prettier": { - "version": "2.8.8", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", - "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.1.1.tgz", + "integrity": "sha512-22UbSzg8luF4UuZtzgiUOfcGM8s4tjBv6dJRT7j275NXsy2jb4aJa4NNveul5x4eqlF1wuhuR2RElK71RvmVaw==", "dev": true, "bin": { - "prettier": "bin-prettier.js" + "prettier": "bin/prettier.cjs" }, "engines": { - "node": ">=10.13.0" + "node": ">=14" }, "funding": { "url": "https://github.com/prettier/prettier?sponsor=1" @@ -3700,9 +4288,9 @@ } }, "node_modules/punycode": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", - "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", "dev": true, "engines": { "node": ">=6" @@ -3780,6 +4368,17 @@ "node": ">=8.10.0" } }, + "node_modules/readdirp/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/regexp-to-ast": { "version": "0.5.0", "resolved": "https://registry.npmjs.org/regexp-to-ast/-/regexp-to-ast-0.5.0.tgz", @@ -3822,35 +4421,64 @@ } }, "node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-5.0.5.tgz", + "integrity": "sha512-CqDakW+hMe/Bz202FPEymy68P+G50RfMQK+Qo5YUqc9SPipvbGjCGKd0RSKEelbsfQuw3g5NZDSrlZZAJurH1A==", "dev": true, "dependencies": { - "glob": "^7.1.3" + "glob": "^10.3.7" }, "bin": { - "rimraf": "bin.js" + "rimraf": "dist/esm/bin.mjs" + }, + "engines": { + "node": ">=14" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/rimraf/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, "node_modules/rimraf/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "version": "10.3.10", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", + "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", "dev": true, "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "foreground-child": "^3.1.0", + "jackspeak": "^2.3.5", + "minimatch": "^9.0.1", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", + "path-scurry": "^1.10.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" }, "engines": { - "node": "*" + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rimraf/node_modules/minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" }, "funding": { "url": "https://github.com/sponsors/isaacs" @@ -3948,18 +4576,29 @@ "node": ">=8" } }, + "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, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/sinon": { - "version": "15.2.0", - "resolved": "https://registry.npmjs.org/sinon/-/sinon-15.2.0.tgz", - "integrity": "sha512-nPS85arNqwBXaIsFCkolHjGIkFo+Oxu9vbgmBJizLAhqe6P2o3Qmj3KCUoRkfhHtvgDhZdWD3risLHAUJ8npjw==", - "deprecated": "16.1.1", + "version": "17.0.1", + "resolved": "https://registry.npmjs.org/sinon/-/sinon-17.0.1.tgz", + "integrity": "sha512-wmwE19Lie0MLT+ZYNpDymasPHUKTaZHUH/pKEubRXIzySv9Atnlw+BUMGCzWgV7b7wO+Hw6f1TEOr0IUnmU8/g==", "dev": true, "dependencies": { "@sinonjs/commons": "^3.0.0", - "@sinonjs/fake-timers": "^10.3.0", + "@sinonjs/fake-timers": "^11.2.2", "@sinonjs/samsam": "^8.0.0", "diff": "^5.1.0", - "nise": "^5.1.4", + "nise": "^5.1.5", "supports-color": "^7.2.0" }, "funding": { @@ -3967,6 +4606,15 @@ "url": "https://opencollective.com/sinon" } }, + "node_modules/sinon/node_modules/@sinonjs/fake-timers": { + "version": "11.2.2", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-11.2.2.tgz", + "integrity": "sha512-G2piCSxQ7oWOxwGSAyFHfPIsyeJGXYtc6mFbnFA+kRXkiEnTl8c/8jul2S329iFBnDI9HGoeWWAZvuvOkZccgw==", + "dev": true, + "dependencies": { + "@sinonjs/commons": "^3.0.0" + } + }, "node_modules/sinon/node_modules/diff": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/diff/-/diff-5.1.0.tgz", @@ -4041,15 +4689,43 @@ "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" }, "engines": { "node": ">=8" } }, - "node_modules/strip-ansi": { + "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==", @@ -4130,26 +4806,23 @@ "node": "*" } }, - "node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" - }, - "node_modules/tsutils": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", - "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", + "node_modules/ts-api-utils": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.0.3.tgz", + "integrity": "sha512-wNMeqtMz5NtwpT/UZGY5alT+VoKdSsOOP/kqHFcUW1P/VRhH2wJ48+DN2WwUliNbQ976ETwDL0Ifd2VVvgonvg==", "dev": true, - "dependencies": { - "tslib": "^1.8.1" - }, "engines": { - "node": ">= 6" + "node": ">=16.13.0" }, "peerDependencies": { - "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" + "typescript": ">=4.2.0" } }, + "node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + }, "node_modules/type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", @@ -4184,16 +4857,16 @@ } }, "node_modules/typescript": { - "version": "4.9.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", - "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.3.3.tgz", + "integrity": "sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==", "dev": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" }, "engines": { - "node": ">=4.2.0" + "node": ">=14.17" } }, "node_modules/undici-types": { @@ -4264,6 +4937,41 @@ "vscode-dts": "index.js" } }, + "node_modules/vscode-dts/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/vscode-dts/node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/vscode-extension-telemetry": { "version": "0.4.5", "resolved": "https://registry.npmjs.org/vscode-extension-telemetry/-/vscode-extension-telemetry-0.4.5.tgz", @@ -4274,26 +4982,26 @@ } }, "node_modules/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==", + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-8.2.0.tgz", + "integrity": "sha512-C+r0eKJUIfiDIfwJhria30+TYWPtuHJXHtI7J0YlOmKAo7ogxP20T0zxB7HZQIFhIyvoBPwWskjxrvAtfjyZfA==", "dev": true, "engines": { "node": ">=14.0.0" } }, "node_modules/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==", + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/vscode-languageclient/-/vscode-languageclient-9.0.1.tgz", + "integrity": "sha512-JZiimVdvimEuHh5olxhxkht09m3JzUGwggb5eRUkzzJhZ2KjCN0nh55VfiED9oez9DyF8/fz1g1iBV3h+0Z2EA==", "dev": true, "dependencies": { "minimatch": "^5.1.0", "semver": "^7.3.7", - "vscode-languageserver-protocol": "3.17.3" + "vscode-languageserver-protocol": "3.17.5" }, "engines": { - "vscode": "^1.67.0" + "vscode": "^1.82.0" } }, "node_modules/vscode-languageclient/node_modules/brace-expansion": { @@ -4318,25 +5026,25 @@ } }, "node_modules/vscode-languageserver": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/vscode-languageserver/-/vscode-languageserver-8.1.0.tgz", - "integrity": "sha512-eUt8f1z2N2IEUDBsKaNapkz7jl5QpskN2Y0G01T/ItMxBxw1fJwvtySGB9QMecatne8jFIWJGWI61dWjyTLQsw==", + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/vscode-languageserver/-/vscode-languageserver-9.0.1.tgz", + "integrity": "sha512-woByF3PDpkHFUreUa7Hos7+pUWdeWMXRd26+ZX2A8cFx6v/JPTtd4/uN0/jB6XQHYaOlHbio03NTHCqrgG5n7g==", "dev": true, "dependencies": { - "vscode-languageserver-protocol": "3.17.3" + "vscode-languageserver-protocol": "3.17.5" }, "bin": { "installServerIntoExtension": "bin/installServerIntoExtension" } }, "node_modules/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==", + "version": "3.17.5", + "resolved": "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.17.5.tgz", + "integrity": "sha512-mb1bvRJN8SVznADSGWM9u/b07H7Ecg0I3OgXDuLdn307rl/J3A9YD6/eYOssqhecL27hK1IPZAsaqh00i/Jljg==", "dev": true, "dependencies": { - "vscode-jsonrpc": "8.1.0", - "vscode-languageserver-types": "3.17.3" + "vscode-jsonrpc": "8.2.0", + "vscode-languageserver-types": "3.17.5" } }, "node_modules/vscode-languageserver-textdocument": { @@ -4346,9 +5054,9 @@ "dev": true }, "node_modules/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==", + "version": "3.17.5", + "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.17.5.tgz", + "integrity": "sha512-Ld1VelNuX9pdF39h2Hgaeb5hEZM2Z3jUrrMgWQAu82jMtZp7p3vJT3BzToKtZI7NgQssZje5o0zryOrhQvzQAg==", "dev": true }, "node_modules/vscode-test": { @@ -4367,6 +5075,41 @@ "node": ">=8.9.3" } }, + "node_modules/vscode-test/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/vscode-test/node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/vscode-uri": { "version": "3.0.8", "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.0.8.tgz", @@ -4424,6 +5167,57 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, "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", @@ -4554,22 +5348,22 @@ "dev": true }, "@babel/code-frame": { - "version": "7.22.13", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz", - "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==", + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.5.tgz", + "integrity": "sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==", "dev": true, "requires": { - "@babel/highlight": "^7.22.13", + "@babel/highlight": "^7.23.4", "chalk": "^2.4.2" } }, "@babel/generator": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.0.tgz", - "integrity": "sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g==", + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.6.tgz", + "integrity": "sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw==", "dev": true, "requires": { - "@babel/types": "^7.23.0", + "@babel/types": "^7.23.6", "@jridgewell/gen-mapping": "^0.3.2", "@jridgewell/trace-mapping": "^0.3.17", "jsesc": "^2.5.1" @@ -4610,9 +5404,9 @@ } }, "@babel/helper-string-parser": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", - "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz", + "integrity": "sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==", "dev": true }, "@babel/helper-validator-identifier": { @@ -4622,9 +5416,9 @@ "dev": true }, "@babel/highlight": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.20.tgz", - "integrity": "sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==", + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz", + "integrity": "sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==", "dev": true, "requires": { "@babel/helper-validator-identifier": "^7.22.20", @@ -4633,9 +5427,9 @@ } }, "@babel/parser": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.0.tgz", - "integrity": "sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw==", + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.6.tgz", + "integrity": "sha512-Z2uID7YJ7oNvAI20O9X0bblw7Qqs8Q2hFy0R9tAfnfLkp5MW0UH9eUvnDSnFwKZ0AvgS1ucqR4KzvVHgnke1VQ==", "dev": true }, "@babel/template": { @@ -4650,20 +5444,20 @@ } }, "@babel/traverse": { - "version": "7.23.2", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.2.tgz", - "integrity": "sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw==", + "version": "7.23.7", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.7.tgz", + "integrity": "sha512-tY3mM8rH9jM0YHFGyfC0/xf+SB5eKUu7HPj7/k3fpi9dAlsMc5YbQvDi0Sh2QTPXqMhyaAtzAr807TIyfQrmyg==", "dev": true, "requires": { - "@babel/code-frame": "^7.22.13", - "@babel/generator": "^7.23.0", + "@babel/code-frame": "^7.23.5", + "@babel/generator": "^7.23.6", "@babel/helper-environment-visitor": "^7.22.20", "@babel/helper-function-name": "^7.23.0", "@babel/helper-hoist-variables": "^7.22.5", "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.23.0", - "@babel/types": "^7.23.0", - "debug": "^4.1.0", + "@babel/parser": "^7.23.6", + "@babel/types": "^7.23.6", + "debug": "^4.3.1", "globals": "^11.1.0" }, "dependencies": { @@ -4676,12 +5470,12 @@ } }, "@babel/types": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.0.tgz", - "integrity": "sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg==", + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.6.tgz", + "integrity": "sha512-+uarb83brBzPKN38NX1MkB6vb6+mwvR6amUulqAE7ccQw1pEl+bCia9TbdG1lsnFP7lZySvUn37CHyXQdfTwzg==", "dev": true, "requires": { - "@babel/helper-string-parser": "^7.22.5", + "@babel/helper-string-parser": "^7.23.4", "@babel/helper-validator-identifier": "^7.22.20", "to-fast-properties": "^2.0.0" } @@ -4715,6 +5509,144 @@ "resolved": "https://registry.npmjs.org/@chevrotain/utils/-/utils-10.5.0.tgz", "integrity": "sha512-hBzuU5+JjB2cqNZyszkDHZgOSrUUT8V3dhgRl8Q9Gp6dAj/H5+KILGjbhDpc3Iy9qmqlm/akuOI2ut9VUtzJxQ==" }, + "@esbuild/aix-ppc64": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.19.11.tgz", + "integrity": "sha512-FnzU0LyE3ySQk7UntJO4+qIiQgI7KoODnZg5xzXIrFJlKd2P2gwHsHY4927xj9y5PJmJSzULiUCWmv7iWnNa7g==", + "optional": true + }, + "@esbuild/android-arm": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.19.11.tgz", + "integrity": "sha512-5OVapq0ClabvKvQ58Bws8+wkLCV+Rxg7tUVbo9xu034Nm536QTII4YzhaFriQ7rMrorfnFKUsArD2lqKbFY4vw==", + "optional": true + }, + "@esbuild/android-arm64": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.19.11.tgz", + "integrity": "sha512-aiu7K/5JnLj//KOnOfEZ0D90obUkRzDMyqd/wNAUQ34m4YUPVhRZpnqKV9uqDGxT7cToSDnIHsGooyIczu9T+Q==", + "optional": true + }, + "@esbuild/android-x64": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.19.11.tgz", + "integrity": "sha512-eccxjlfGw43WYoY9QgB82SgGgDbibcqyDTlk3l3C0jOVHKxrjdc9CTwDUQd0vkvYg5um0OH+GpxYvp39r+IPOg==", + "optional": true + }, + "@esbuild/darwin-arm64": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.19.11.tgz", + "integrity": "sha512-ETp87DRWuSt9KdDVkqSoKoLFHYTrkyz2+65fj9nfXsaV3bMhTCjtQfw3y+um88vGRKRiF7erPrh/ZuIdLUIVxQ==", + "optional": true + }, + "@esbuild/darwin-x64": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.19.11.tgz", + "integrity": "sha512-fkFUiS6IUK9WYUO/+22omwetaSNl5/A8giXvQlcinLIjVkxwTLSktbF5f/kJMftM2MJp9+fXqZ5ezS7+SALp4g==", + "optional": true + }, + "@esbuild/freebsd-arm64": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.11.tgz", + "integrity": "sha512-lhoSp5K6bxKRNdXUtHoNc5HhbXVCS8V0iZmDvyWvYq9S5WSfTIHU2UGjcGt7UeS6iEYp9eeymIl5mJBn0yiuxA==", + "optional": true + }, + "@esbuild/freebsd-x64": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.19.11.tgz", + "integrity": "sha512-JkUqn44AffGXitVI6/AbQdoYAq0TEullFdqcMY/PCUZ36xJ9ZJRtQabzMA+Vi7r78+25ZIBosLTOKnUXBSi1Kw==", + "optional": true + }, + "@esbuild/linux-arm": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.19.11.tgz", + "integrity": "sha512-3CRkr9+vCV2XJbjwgzjPtO8T0SZUmRZla+UL1jw+XqHZPkPgZiyWvbDvl9rqAN8Zl7qJF0O/9ycMtjU67HN9/Q==", + "optional": true + }, + "@esbuild/linux-arm64": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.19.11.tgz", + "integrity": "sha512-LneLg3ypEeveBSMuoa0kwMpCGmpu8XQUh+mL8XXwoYZ6Be2qBnVtcDI5azSvh7vioMDhoJFZzp9GWp9IWpYoUg==", + "optional": true + }, + "@esbuild/linux-ia32": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.19.11.tgz", + "integrity": "sha512-caHy++CsD8Bgq2V5CodbJjFPEiDPq8JJmBdeyZ8GWVQMjRD0sU548nNdwPNvKjVpamYYVL40AORekgfIubwHoA==", + "optional": true + }, + "@esbuild/linux-loong64": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.19.11.tgz", + "integrity": "sha512-ppZSSLVpPrwHccvC6nQVZaSHlFsvCQyjnvirnVjbKSHuE5N24Yl8F3UwYUUR1UEPaFObGD2tSvVKbvR+uT1Nrg==", + "optional": true + }, + "@esbuild/linux-mips64el": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.19.11.tgz", + "integrity": "sha512-B5x9j0OgjG+v1dF2DkH34lr+7Gmv0kzX6/V0afF41FkPMMqaQ77pH7CrhWeR22aEeHKaeZVtZ6yFwlxOKPVFyg==", + "optional": true + }, + "@esbuild/linux-ppc64": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.19.11.tgz", + "integrity": "sha512-MHrZYLeCG8vXblMetWyttkdVRjQlQUb/oMgBNurVEnhj4YWOr4G5lmBfZjHYQHHN0g6yDmCAQRR8MUHldvvRDA==", + "optional": true + }, + "@esbuild/linux-riscv64": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.19.11.tgz", + "integrity": "sha512-f3DY++t94uVg141dozDu4CCUkYW+09rWtaWfnb3bqe4w5NqmZd6nPVBm+qbz7WaHZCoqXqHz5p6CM6qv3qnSSQ==", + "optional": true + }, + "@esbuild/linux-s390x": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.19.11.tgz", + "integrity": "sha512-A5xdUoyWJHMMlcSMcPGVLzYzpcY8QP1RtYzX5/bS4dvjBGVxdhuiYyFwp7z74ocV7WDc0n1harxmpq2ePOjI0Q==", + "optional": true + }, + "@esbuild/linux-x64": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.19.11.tgz", + "integrity": "sha512-grbyMlVCvJSfxFQUndw5mCtWs5LO1gUlwP4CDi4iJBbVpZcqLVT29FxgGuBJGSzyOxotFG4LoO5X+M1350zmPA==", + "optional": true + }, + "@esbuild/netbsd-x64": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.19.11.tgz", + "integrity": "sha512-13jvrQZJc3P230OhU8xgwUnDeuC/9egsjTkXN49b3GcS5BKvJqZn86aGM8W9pd14Kd+u7HuFBMVtrNGhh6fHEQ==", + "optional": true + }, + "@esbuild/openbsd-x64": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.19.11.tgz", + "integrity": "sha512-ysyOGZuTp6SNKPE11INDUeFVVQFrhcNDVUgSQVDzqsqX38DjhPEPATpid04LCoUr2WXhQTEZ8ct/EgJCUDpyNw==", + "optional": true + }, + "@esbuild/sunos-x64": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.19.11.tgz", + "integrity": "sha512-Hf+Sad9nVwvtxy4DXCZQqLpgmRTQqyFyhT3bZ4F2XlJCjxGmRFF0Shwn9rzhOYRB61w9VMXUkxlBy56dk9JJiQ==", + "optional": true + }, + "@esbuild/win32-arm64": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.19.11.tgz", + "integrity": "sha512-0P58Sbi0LctOMOQbpEOvOL44Ne0sqbS0XWHMvvrg6NE5jQ1xguCSSw9jQeUk2lfrXYsKDdOe6K+oZiwKPilYPQ==", + "optional": true + }, + "@esbuild/win32-ia32": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.19.11.tgz", + "integrity": "sha512-6YOrWS+sDJDmshdBIQU+Uoyh7pQKrdykdefC1avn76ss5c+RN6gut3LZA4E2cH5xUEp5/cA0+YxRaVtRAb0xBg==", + "optional": true + }, + "@esbuild/win32-x64": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.19.11.tgz", + "integrity": "sha512-vfkhltrjCAb603XaFhqhAF4LGDi2M4OrCRrFusyQ+iTLQ/o60QQXxc9cZC/FFpihBI9N1Grn6SMKVJ4KP7Fuiw==", + "optional": true + }, "@eslint-community/eslint-utils": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", @@ -4731,9 +5663,9 @@ "dev": true }, "@eslint/eslintrc": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.2.tgz", - "integrity": "sha512-+wvgpDsrB1YqAMdEUCcnTlpfVBH7Vqn6A/NT3D8WVXFIaKMlErPIZT3oCIAVCOtarRpMtelZLqJeU3t7WY6X6g==", + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", "dev": true, "requires": { "ajv": "^6.12.4", @@ -4748,9 +5680,9 @@ } }, "@eslint/js": { - "version": "8.52.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.52.0.tgz", - "integrity": "sha512-mjZVbpaeMZludF2fsWLD0Z9gCref1Tk4i9+wddjRvpUNqqcndPkBD09N/Mapey0b3jaXbLm2kICwFv2E64QinA==", + "version": "8.56.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.56.0.tgz", + "integrity": "sha512-gMsVel9D7f2HLkBma9VbtzZRehRogVRfbr++f06nL2vnCGCNlzOD+/MUov/F4p8myyAHspEhVobgjpX64q5m6A==", "dev": true }, "@humanwhocodes/config-array": { @@ -4776,6 +5708,71 @@ "integrity": "sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==", "dev": true }, + "@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dev": true, + "requires": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true + }, + "ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true + }, + "emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true + }, + "string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "requires": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + } + }, + "strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "requires": { + "ansi-regex": "^6.0.1" + } + }, + "wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dev": true, + "requires": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + } + } + } + }, "@jridgewell/gen-mapping": { "version": "0.3.3", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", @@ -4822,12 +5819,12 @@ "dev": true }, "@lit/reactive-element": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/@lit/reactive-element/-/reactive-element-1.6.3.tgz", - "integrity": "sha512-QuTgnG52Poic7uM1AN5yJ09QMe0O28e10XzSvWDz02TJiiKee4stsiownEIadWm8nYzyDAyT+gKzUoZmiWQtsQ==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@lit/reactive-element/-/reactive-element-2.0.2.tgz", + "integrity": "sha512-SVOwLAWUQg3Ji1egtOt1UiFe4zdDpnWHyc5qctSceJ5XIu0Uc76YmGpIjZgx9YJ0XtdW0Jm507sDvjOu+HnB8w==", "dev": true, "requires": { - "@lit-labs/ssr-dom-shim": "^1.0.0" + "@lit-labs/ssr-dom-shim": "^1.1.2" } }, "@microsoft/fast-element": { @@ -4836,23 +5833,30 @@ "integrity": "sha512-gQutuDHPKNxUEcQ4pypZT4Wmrbapus+P9s3bR/SEOLsMbNqNoXigGImITygI5zhb+aA5rzflM6O8YWkmRbGkPA==" }, "@microsoft/fast-foundation": { - "version": "2.49.2", - "resolved": "https://registry.npmjs.org/@microsoft/fast-foundation/-/fast-foundation-2.49.2.tgz", - "integrity": "sha512-xA7WP/Td33SW0zkpHRH5LUDxyLOPnPQQXieRxc080uLWxoGXhVxo6Rz7b6qwiL+e2IadNCm7X7KcrgsUhJwvBg==", + "version": "2.49.4", + "resolved": "https://registry.npmjs.org/@microsoft/fast-foundation/-/fast-foundation-2.49.4.tgz", + "integrity": "sha512-5I2tSPo6bnOfVAIX7XzX+LhilahwvD7h+yzl3jW0t5IYmMX9Lci9VUVyx5f8hHdb1O9a8Y9Atb7Asw7yFO/u+w==", "requires": { "@microsoft/fast-element": "^1.12.0", "@microsoft/fast-web-utilities": "^5.4.1", "tabbable": "^5.2.0", "tslib": "^1.13.0" + }, + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + } } }, "@microsoft/fast-react-wrapper": { - "version": "0.1.48", - "resolved": "https://registry.npmjs.org/@microsoft/fast-react-wrapper/-/fast-react-wrapper-0.1.48.tgz", - "integrity": "sha512-9NvEjru9Kn5ZKjomAMX6v+eF0DR+eDkxKDwDfi+Wb73kTbrNzcnmlwd4diN15ygH97kldgj2+lpvI4CKLQQWLg==", + "version": "0.3.22", + "resolved": "https://registry.npmjs.org/@microsoft/fast-react-wrapper/-/fast-react-wrapper-0.3.22.tgz", + "integrity": "sha512-XhlX4m6znh7XW92oPvlKoG9USUn9JtF9rP1qtUoIbkaDaFtUS+H8o1Jn6/oK/rS44LbBLJXrvRkInmSWlDiGFw==", "requires": { - "@microsoft/fast-element": "^1.9.0", - "@microsoft/fast-foundation": "^2.41.1" + "@microsoft/fast-element": "^1.12.0", + "@microsoft/fast-foundation": "^2.49.4" } }, "@microsoft/fast-web-utilities": { @@ -4886,6 +5890,13 @@ "fastq": "^1.6.0" } }, + "@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "dev": true, + "optional": true + }, "@sinonjs/commons": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.0.tgz", @@ -4939,9 +5950,9 @@ "dev": true }, "@types/antlr4": { - "version": "4.11.5", - "resolved": "https://registry.npmjs.org/@types/antlr4/-/antlr4-4.11.5.tgz", - "integrity": "sha512-fMe+kM+6ccLkUbCYQ7tNHlWNX4dVmTdRykib5S8sdWGHBxFFKN9/srtpXpILBY08RJYld5bOe3+tB2Qz6WmHZw==" + "version": "4.11.6", + "resolved": "https://registry.npmjs.org/@types/antlr4/-/antlr4-4.11.6.tgz", + "integrity": "sha512-YtxtT6vYfLK6jC55zC4Pb2YwV6Z8exn4DbDlQgoSEc6VqlFZloi6bgm0AqZns/7U4XQCAVMhv/+vnGcfyCkPfg==" }, "@types/extract-zip": { "version": "2.0.1", @@ -4953,11 +5964,12 @@ } }, "@types/fs-extra": { - "version": "9.0.13", - "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-9.0.13.tgz", - "integrity": "sha512-nEnwB++1u5lVDM2UI4c1+5R+FYaKfaAzS4OococimjVm3nQw3TuzH5UNsocrcTBbhnerblyHj4A49qXbIiZdpA==", + "version": "11.0.4", + "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-11.0.4.tgz", + "integrity": "sha512-yTbItCNreRooED33qjunPthRcSjERP1r4MqCZc7wv0u2sUkzTFp45tgUfS5+r7FrZPdmCCNflLhVSP/o+SemsQ==", "dev": true, "requires": { + "@types/jsonfile": "*", "@types/node": "*" } }, @@ -4972,18 +5984,18 @@ } }, "@types/graceful-fs": { - "version": "4.1.8", - "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.8.tgz", - "integrity": "sha512-NhRH7YzWq8WiNKVavKPBmtLYZHxNY19Hh+az28O/phfp68CF45pMFud+ZzJ8ewnxnC5smIdF3dqFeiSUQ5I+pw==", + "version": "4.1.9", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz", + "integrity": "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==", "dev": true, "requires": { "@types/node": "*" } }, "@types/istanbul-lib-coverage": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz", - "integrity": "sha512-zONci81DZYCZjiLe0r6equvZut0b+dBRPBN5kBDjsONnutYNtJMoWQ9uR2RkL1gLG9NMTzvf+29e5RFfPbeKhQ==", + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", + "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", "dev": true }, "@types/istanbul-lib-report": { @@ -4996,20 +6008,29 @@ } }, "@types/istanbul-reports": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.3.tgz", - "integrity": "sha512-1nESsePMBlf0RPRffLZi5ujYh7IH1BWL4y9pr+Bn3cJBdxz+RTP8bUFljLz9HvzhhOSWKdyBZ4DIivdL6rvgZg==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", + "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", "dev": true, "requires": { "@types/istanbul-lib-report": "*" } }, "@types/json-schema": { - "version": "7.0.14", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.14.tgz", - "integrity": "sha512-U3PUjAudAdJBeC2pgN8uTIKgxrb4nlDF3SF0++EldXQvQBGkpFZMSnwQiIoDU77tv45VgNkl/L4ouD+rEomujw==", + "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/jsonfile": { + "version": "6.1.4", + "resolved": "https://registry.npmjs.org/@types/jsonfile/-/jsonfile-6.1.4.tgz", + "integrity": "sha512-D5qGUYwjvnNNextdU59/+fI+spnwtTFmyQP0h+PfIOSkNfpU6AOICUOkm4i0OnSk+NyjdPJrxCDro0sJsWlRpQ==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, "@types/jwt-decode": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/@types/jwt-decode/-/jwt-decode-3.1.0.tgz", @@ -5020,9 +6041,9 @@ } }, "@types/klaw": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@types/klaw/-/klaw-3.0.5.tgz", - "integrity": "sha512-sX8M64GwQbEhPA4GrOUYEl/0Cc9oz5Effoaj43B4o3bsVwskxEipparp8tI1E6lhs2s1R1u/0KeNvf/9OR1cAA==", + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@types/klaw/-/klaw-3.0.6.tgz", + "integrity": "sha512-BErW5TrTz4nzt/c3VRGf0Bug4JyQJ1o807F4mAfXfvOzFZ8SKgFeHJ0T28Y1KtqlMEB+cUgN7S7CsyQDQ/qxqg==", "dev": true, "requires": { "@types/node": "*" @@ -5035,9 +6056,9 @@ "dev": true }, "@types/mocha": { - "version": "10.0.3", - "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-10.0.3.tgz", - "integrity": "sha512-RsOPImTriV/OE4A9qKjMtk2MnXiuLLbcO3nCXK+kvq4nr0iMfFgpjaX3MPLb6f7+EL1FGSelYvuJMV6REH+ZPQ==", + "version": "10.0.6", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-10.0.6.tgz", + "integrity": "sha512-dJvrYWxP/UcXm36Qn36fxhUKu8A/xMRXVT2cliFF1Z7UA9liG5Psj3ezNSZw+5puH2czDXRLcXQxf8JbJt0ejg==", "dev": true }, "@types/node": { @@ -5050,9 +6071,9 @@ } }, "@types/node-fetch": { - "version": "2.6.7", - "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.7.tgz", - "integrity": "sha512-lX17GZVpJ/fuCjguZ5b3TjEbSENxmEk1B2z02yoXSK9WMEWRivhdSY73wWMn6bpcCDAOh6qAdktpKHIlkDk2lg==", + "version": "2.6.10", + "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.10.tgz", + "integrity": "sha512-PPpPK6F9ALFTn59Ka3BaL+qGuipRfxNE8qVgkp0bVixeiR2c2/L+IVOiBdu9JhhT22sWnQEp6YyHGI2b2+CMcA==", "dev": true, "requires": { "@types/node": "*", @@ -5073,21 +6094,21 @@ } }, "@types/picomatch": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/@types/picomatch/-/picomatch-2.3.2.tgz", - "integrity": "sha512-I+BytjxOlNYA285zP/3dVCRcE+OAvgHQZQt26MP7T7JbZ9DM/3W2WfViU1XuLypCzAx8PTC+MlYO3WLqjTyZ3g==", + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/@types/picomatch/-/picomatch-2.3.3.tgz", + "integrity": "sha512-Yll76ZHikRFCyz/pffKGjrCwe/le2CDwOP5F210KQo27kpRE46U2rDnzikNlVn6/ezH3Mhn46bJMTfeVTtcYMg==", "dev": true }, "@types/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-MMzuxN3GdFwskAnb6fz0orFvhfqi752yjaXylr0Rp4oDg5H0Zn1IuyRhDVvYOwAXoJirx2xuS16I3WjxnAIHiQ==", + "version": "7.5.6", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.6.tgz", + "integrity": "sha512-dn1l8LaMea/IjDoHNd9J52uBbInB796CDffS6VdIxvqYCPSG0V0DzHp76GpaWnlhg88uYyPbXCDIowa86ybd5A==", "dev": true }, "@types/sinon": { - "version": "10.0.20", - "resolved": "https://registry.npmjs.org/@types/sinon/-/sinon-10.0.20.tgz", - "integrity": "sha512-2APKKruFNCAZgx3daAyACGzWuJ028VVCUDk6o2rw/Z4PXT0ogwdV4KUegW0MwVs0Zu59auPXbbuBJHF12Sx1Eg==", + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/@types/sinon/-/sinon-17.0.2.tgz", + "integrity": "sha512-Zt6heIGsdqERkxctIpvN5Pv3edgBrhoeb3yHyxffd4InN0AX2SVNKSrhdDZKGQICVOxWP/q4DyhpfPNMSrpIiA==", "dev": true, "requires": { "@types/sinonjs__fake-timers": "*" @@ -5100,21 +6121,21 @@ "dev": true }, "@types/trusted-types": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.5.tgz", - "integrity": "sha512-I3pkr8j/6tmQtKV/ZzHtuaqYSQvyjGRKH4go60Rr0IDLlFxuRT5V32uvB1mecM5G1EVAUyF/4r4QZ1GHgz+mxA==", + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz", + "integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==", "dev": true }, "@types/vscode": { - "version": "1.83.1", - "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.83.1.tgz", - "integrity": "sha512-BHu51NaNKOtDf3BOonY3sKFFmZKEpRkzqkZVpSYxowLbs5JqjOQemYFob7Gs5rpxE5tiGhfpnMpcdF/oKrLg4w==", + "version": "1.85.0", + "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.85.0.tgz", + "integrity": "sha512-CF/RBon/GXwdfmnjZj0WTUMZN5H6YITOfBCP4iEZlOtVQXuzw6t7Le7+cR+7JzdMrnlm7Mfp49Oj2TuSXIWo3g==", "dev": true }, "@types/vscode-webview": { - "version": "1.57.3", - "resolved": "https://registry.npmjs.org/@types/vscode-webview/-/vscode-webview-1.57.3.tgz", - "integrity": "sha512-8at2UVGjA/6gcLOay+J8wOars6VsDqAqPxRHYihH0XFUaXt+2AZ+Hd9hSoUbnhjicb6V1xe7rfjb7j4Ri2n1fg==", + "version": "1.57.4", + "resolved": "https://registry.npmjs.org/@types/vscode-webview/-/vscode-webview-1.57.4.tgz", + "integrity": "sha512-RrVw9s6gBJuY1IkUHMNznWgj/ktjwLpATyOTcKxUDIbbp7AQeK7S0E1+P/8Z75OgAW13OMqSAmaiuWw25dh59Q==", "dev": true }, "@types/yauzl": { @@ -5127,102 +6148,124 @@ } }, "@typescript-eslint/eslint-plugin": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.62.0.tgz", - "integrity": "sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag==", + "version": "6.18.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.18.1.tgz", + "integrity": "sha512-nISDRYnnIpk7VCFrGcu1rnZfM1Dh9LRHnfgdkjcbi/l7g16VYRri3TjXi9Ir4lOZSw5N/gnV/3H7jIPQ8Q4daA==", "dev": true, "requires": { - "@eslint-community/regexpp": "^4.4.0", - "@typescript-eslint/scope-manager": "5.62.0", - "@typescript-eslint/type-utils": "5.62.0", - "@typescript-eslint/utils": "5.62.0", + "@eslint-community/regexpp": "^4.5.1", + "@typescript-eslint/scope-manager": "6.18.1", + "@typescript-eslint/type-utils": "6.18.1", + "@typescript-eslint/utils": "6.18.1", + "@typescript-eslint/visitor-keys": "6.18.1", "debug": "^4.3.4", "graphemer": "^1.4.0", - "ignore": "^5.2.0", - "natural-compare-lite": "^1.4.0", - "semver": "^7.3.7", - "tsutils": "^3.21.0" + "ignore": "^5.2.4", + "natural-compare": "^1.4.0", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" } }, "@typescript-eslint/parser": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.62.0.tgz", - "integrity": "sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==", + "version": "6.18.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.18.1.tgz", + "integrity": "sha512-zct/MdJnVaRRNy9e84XnVtRv9Vf91/qqe+hZJtKanjojud4wAVy/7lXxJmMyX6X6J+xc6c//YEWvpeif8cAhWA==", "dev": true, "requires": { - "@typescript-eslint/scope-manager": "5.62.0", - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/typescript-estree": "5.62.0", + "@typescript-eslint/scope-manager": "6.18.1", + "@typescript-eslint/types": "6.18.1", + "@typescript-eslint/typescript-estree": "6.18.1", + "@typescript-eslint/visitor-keys": "6.18.1", "debug": "^4.3.4" } }, "@typescript-eslint/scope-manager": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz", - "integrity": "sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==", + "version": "6.18.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.18.1.tgz", + "integrity": "sha512-BgdBwXPFmZzaZUuw6wKiHKIovms97a7eTImjkXCZE04TGHysG+0hDQPmygyvgtkoB/aOQwSM/nWv3LzrOIQOBw==", "dev": true, "requires": { - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/visitor-keys": "5.62.0" + "@typescript-eslint/types": "6.18.1", + "@typescript-eslint/visitor-keys": "6.18.1" } }, "@typescript-eslint/type-utils": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.62.0.tgz", - "integrity": "sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew==", + "version": "6.18.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.18.1.tgz", + "integrity": "sha512-wyOSKhuzHeU/5pcRDP2G2Ndci+4g653V43gXTpt4nbyoIOAASkGDA9JIAgbQCdCkcr1MvpSYWzxTz0olCn8+/Q==", "dev": true, "requires": { - "@typescript-eslint/typescript-estree": "5.62.0", - "@typescript-eslint/utils": "5.62.0", + "@typescript-eslint/typescript-estree": "6.18.1", + "@typescript-eslint/utils": "6.18.1", "debug": "^4.3.4", - "tsutils": "^3.21.0" + "ts-api-utils": "^1.0.1" } }, "@typescript-eslint/types": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz", - "integrity": "sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==", + "version": "6.18.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.18.1.tgz", + "integrity": "sha512-4TuMAe+tc5oA7wwfqMtB0Y5OrREPF1GeJBAjqwgZh1lEMH5PJQgWgHGfYufVB51LtjD+peZylmeyxUXPfENLCw==", "dev": true }, "@typescript-eslint/typescript-estree": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz", - "integrity": "sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==", + "version": "6.18.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.18.1.tgz", + "integrity": "sha512-fv9B94UAhywPRhUeeV/v+3SBDvcPiLxRZJw/xZeeGgRLQZ6rLMG+8krrJUyIf6s1ecWTzlsbp0rlw7n9sjufHA==", "dev": true, "requires": { - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/visitor-keys": "5.62.0", + "@typescript-eslint/types": "6.18.1", + "@typescript-eslint/visitor-keys": "6.18.1", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" + "minimatch": "9.0.3", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" + }, + "dependencies": { + "brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0" + } + }, + "minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "dev": true, + "requires": { + "brace-expansion": "^2.0.1" + } + } } }, "@typescript-eslint/utils": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.62.0.tgz", - "integrity": "sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==", + "version": "6.18.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.18.1.tgz", + "integrity": "sha512-zZmTuVZvD1wpoceHvoQpOiewmWu3uP9FuTWo8vqpy2ffsmfCE8mklRPi+vmnIYAIk9t/4kOThri2QCDgor+OpQ==", "dev": true, "requires": { - "@eslint-community/eslint-utils": "^4.2.0", - "@types/json-schema": "^7.0.9", - "@types/semver": "^7.3.12", - "@typescript-eslint/scope-manager": "5.62.0", - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/typescript-estree": "5.62.0", - "eslint-scope": "^5.1.1", - "semver": "^7.3.7" + "@eslint-community/eslint-utils": "^4.4.0", + "@types/json-schema": "^7.0.12", + "@types/semver": "^7.5.0", + "@typescript-eslint/scope-manager": "6.18.1", + "@typescript-eslint/types": "6.18.1", + "@typescript-eslint/typescript-estree": "6.18.1", + "semver": "^7.5.4" } }, "@typescript-eslint/visitor-keys": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz", - "integrity": "sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==", + "version": "6.18.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.18.1.tgz", + "integrity": "sha512-/kvt0C5lRqGoCfsbmm7/CwMqoSkY3zzHLIjdhHZQW3VFrnz7ATecOHR7nb7V+xn4286MBxfnQfQhAmCI0u+bJA==", "dev": true, "requires": { - "@typescript-eslint/types": "5.62.0", - "eslint-visitor-keys": "^3.3.0" + "@typescript-eslint/types": "6.18.1", + "eslint-visitor-keys": "^3.4.1" } }, "@ungap/structured-clone": { @@ -5232,9 +6275,9 @@ "dev": true }, "@vscode/test-electron": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/@vscode/test-electron/-/test-electron-2.3.6.tgz", - "integrity": "sha512-M31xGH0RgqNU6CZ4/9g39oUMJ99nLzfjA+4UbtIQ6TcXQ6+2qkjOOxedmPBDDCg26/3Al5ubjY80hIoaMwKYSw==", + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/@vscode/test-electron/-/test-electron-2.3.8.tgz", + "integrity": "sha512-b4aZZsBKtMGdDljAsOPObnAi7+VWIaYl3ylCz1jTs+oV6BZ4TNHcVNC3xUn0azPeszBmwSBDQYfFESIaUQnrOg==", "dev": true, "requires": { "http-proxy-agent": "^4.0.1", @@ -5244,13 +6287,14 @@ } }, "@vscode/webview-ui-toolkit": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@vscode/webview-ui-toolkit/-/webview-ui-toolkit-1.2.2.tgz", - "integrity": "sha512-xIQoF4FC3Xh6d7KNKIoIezSiFWYFuf6gQMdDyKueKBFGeKwaHWEn+dY2g3makvvEsNMEDji/woEwvg9QSbuUsw==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@vscode/webview-ui-toolkit/-/webview-ui-toolkit-1.4.0.tgz", + "integrity": "sha512-modXVHQkZLsxgmd5yoP3ptRC/G8NBDD+ob+ngPiWNQdlrH6H1xR/qgOBD85bfU3BhOB5sZzFWBwwhp9/SfoHww==", "requires": { - "@microsoft/fast-element": "^1.6.2", - "@microsoft/fast-foundation": "^2.38.0", - "@microsoft/fast-react-wrapper": "^0.1.18" + "@microsoft/fast-element": "^1.12.0", + "@microsoft/fast-foundation": "^2.49.4", + "@microsoft/fast-react-wrapper": "^0.3.22", + "tslib": "^2.6.2" } }, "@windozer/node-q": { @@ -5264,9 +6308,9 @@ } }, "acorn": { - "version": "8.11.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.2.tgz", - "integrity": "sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==", + "version": "8.11.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", + "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", "dev": true }, "acorn-jsx": { @@ -5277,9 +6321,9 @@ "requires": {} }, "ag-grid-community": { - "version": "30.2.0", - "resolved": "https://registry.npmjs.org/ag-grid-community/-/ag-grid-community-30.2.0.tgz", - "integrity": "sha512-Gd6GXmtzEQSCDloBdRxxCDqnjTBRAOf/zzlaxxyyVBJgc+cePuNgGdplRUhT/rwIiDwvyuoynvxelVE/iYdXsA==" + "version": "31.0.1", + "resolved": "https://registry.npmjs.org/ag-grid-community/-/ag-grid-community-31.0.1.tgz", + "integrity": "sha512-RZQlW1DTOJHsUR/tnbnTJQKgAnDlHi05YYyTe5AgNor/1TlX1hoYdcqrGsJjvcHQgTjeEgzWOL0yf+KcqXZzxg==" }, "agent-base": { "version": "6.0.2", @@ -5346,6 +6390,13 @@ "requires": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" + }, + "dependencies": { + "picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==" + } } }, "argparse": { @@ -5365,11 +6416,11 @@ "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" }, "axios": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.0.tgz", - "integrity": "sha512-EZ1DYihju9pwVB+jg67ogm+Tmqc6JmhamRN6I4Zt8DfZu5lbcQGw3ozH9lFejSJgs/ibaef3A9PMXPLeefFGJg==", + "version": "1.6.5", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.5.tgz", + "integrity": "sha512-Ii012v05KEVuUoFWmMW/UQv9aRIc3ZwkWDcM+h5Il8izZCtRVpDUfwpoFf7eOtajT3QiGR4yDUx7lPqHJULgbg==", "requires": { - "follow-redirects": "^1.15.0", + "follow-redirects": "^1.15.4", "form-data": "^4.0.0", "proxy-from-env": "^1.1.0" }, @@ -5483,14 +6534,6 @@ "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", "supports-color": "^5.3.0" - }, - "dependencies": { - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true - } } }, "charenc": { @@ -5655,6 +6698,12 @@ "readable-stream": "^2.0.2" } }, + "eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true + }, "emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", @@ -5670,39 +6719,34 @@ } }, "esbuild": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.15.18.tgz", - "integrity": "sha512-x/R72SmW3sSFRm5zrrIjAhCeQSAWoni3CmHEqfQrZIQTM3lVCdehdwuIqaOtfC2slvpdlLa62GYoN8SxT23m6Q==", - "requires": { - "@esbuild/android-arm": "0.15.18", - "@esbuild/linux-loong64": "0.15.18", - "esbuild-android-64": "0.15.18", - "esbuild-android-arm64": "0.15.18", - "esbuild-darwin-64": "0.15.18", - "esbuild-darwin-arm64": "0.15.18", - "esbuild-freebsd-64": "0.15.18", - "esbuild-freebsd-arm64": "0.15.18", - "esbuild-linux-32": "0.15.18", - "esbuild-linux-64": "0.15.18", - "esbuild-linux-arm": "0.15.18", - "esbuild-linux-arm64": "0.15.18", - "esbuild-linux-mips64le": "0.15.18", - "esbuild-linux-ppc64le": "0.15.18", - "esbuild-linux-riscv64": "0.15.18", - "esbuild-linux-s390x": "0.15.18", - "esbuild-netbsd-64": "0.15.18", - "esbuild-openbsd-64": "0.15.18", - "esbuild-sunos-64": "0.15.18", - "esbuild-windows-32": "0.15.18", - "esbuild-windows-64": "0.15.18", - "esbuild-windows-arm64": "0.15.18" - } - }, - "esbuild-darwin-arm64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.15.18.tgz", - "integrity": "sha512-tKPSxcTJ5OmNb1btVikATJ8NftlyNlc8BVNtyT/UAr62JFOhwHlnoPrhYWz09akBLHI9nElFVfWSTSRsrZiDUA==", - "optional": true + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.19.11.tgz", + "integrity": "sha512-HJ96Hev2hX/6i5cDVwcqiJBBtuo9+FeIJOtZ9W1kA5M6AMJRHUZlpYZ1/SbEwtO0ioNAW8rUooVpC/WehY2SfA==", + "requires": { + "@esbuild/aix-ppc64": "0.19.11", + "@esbuild/android-arm": "0.19.11", + "@esbuild/android-arm64": "0.19.11", + "@esbuild/android-x64": "0.19.11", + "@esbuild/darwin-arm64": "0.19.11", + "@esbuild/darwin-x64": "0.19.11", + "@esbuild/freebsd-arm64": "0.19.11", + "@esbuild/freebsd-x64": "0.19.11", + "@esbuild/linux-arm": "0.19.11", + "@esbuild/linux-arm64": "0.19.11", + "@esbuild/linux-ia32": "0.19.11", + "@esbuild/linux-loong64": "0.19.11", + "@esbuild/linux-mips64el": "0.19.11", + "@esbuild/linux-ppc64": "0.19.11", + "@esbuild/linux-riscv64": "0.19.11", + "@esbuild/linux-s390x": "0.19.11", + "@esbuild/linux-x64": "0.19.11", + "@esbuild/netbsd-x64": "0.19.11", + "@esbuild/openbsd-x64": "0.19.11", + "@esbuild/sunos-x64": "0.19.11", + "@esbuild/win32-arm64": "0.19.11", + "@esbuild/win32-ia32": "0.19.11", + "@esbuild/win32-x64": "0.19.11" + } }, "esbuild-plugin-copy": { "version": "2.1.1", @@ -5745,6 +6789,16 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, + "fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + } + }, "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -5766,16 +6820,22 @@ "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", "dev": true }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true + }, "eslint": { - "version": "8.52.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.52.0.tgz", - "integrity": "sha512-zh/JHnaixqHZsolRB/w9/02akBk9EPrOs9JwcTP2ek7yL5bVvXuRariiaAjjoJ5DvuwQ1WAE/HsMz+w17YgBCg==", + "version": "8.56.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.56.0.tgz", + "integrity": "sha512-Go19xM6T9puCOWntie1/P997aXxFsOi37JIHRWI514Hc6ZnaHGKY9xFhrU65RT6CcBEzZoGG1e6Nq+DT04ZtZQ==", "dev": true, "requires": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", - "@eslint/eslintrc": "^2.1.2", - "@eslint/js": "8.52.0", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.56.0", "@humanwhocodes/config-array": "^0.11.13", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", @@ -5910,16 +6970,6 @@ "requireindex": "^1.2.0" } }, - "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": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - } - }, "eslint-visitor-keys": { "version": "3.4.3", "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", @@ -5971,12 +7021,6 @@ } } }, - "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.3", "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", @@ -6087,6 +7131,31 @@ "flatted": "^3.2.9", "keyv": "^4.5.3", "rimraf": "^3.0.2" + }, + "dependencies": { + "glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "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" + } + } } }, "flatted": { @@ -6096,14 +7165,24 @@ "dev": true }, "follow-redirects": { - "version": "1.15.3", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.3.tgz", - "integrity": "sha512-1VzOtuEM8pC9SFU1E+8KfTjZyMztRsgEfwQl44z8A25uy13jSzTj6dyK2Df52iV0vgHCfBwLhDWevLn95w5v6Q==" + "version": "1.15.4", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.4.tgz", + "integrity": "sha512-Cr4D/5wlrb0z9dgERpUL3LrmPKVDsETIJhaCMeDfuFYcqa5bldGV6wBsAN6X/vxlXQtFBMrXdXxdL8CbDTGniw==" + }, + "foreground-child": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz", + "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" + } }, "fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", + "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", "requires": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", @@ -6169,9 +7248,9 @@ } }, "fuse.js": { - "version": "6.6.2", - "resolved": "https://registry.npmjs.org/fuse.js/-/fuse.js-6.6.2.tgz", - "integrity": "sha512-cJaJkxCCxC8qIIcPBF9yGxY0W/tVZS3uEISDxhYIdtk8OL93pe+6Zj7LjCqVV4dzbqcriOZ+kQ/NE4RXZHsIGA==" + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/fuse.js/-/fuse.js-7.0.0.tgz", + "integrity": "sha512-14F4hBIxqKvD4Zz/XjDc3y94mNZN6pRv3U13Udo0lNLCWRBUsrMv2xwcF/y/Z5sV6+FQW+/ow68cHpm4sunt8Q==" }, "get-caller-file": { "version": "2.0.5", @@ -6229,9 +7308,9 @@ } }, "globals": { - "version": "13.23.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.23.0.tgz", - "integrity": "sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==", + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", "dev": true, "requires": { "type-fest": "^0.20.2" @@ -6399,11 +7478,6 @@ "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", "dev": true }, - "is-wsl": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", - "integrity": "sha512-gfygJYZ2gLTDlmbWMI0CE2MwnFzSN/2SZfkMlItC4K/JBlsWVDB0bO6XhqcY13YXE7iMcAJnzTCJjPiTeJJ0Mw==" - }, "isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", @@ -6417,9 +7491,9 @@ "dev": true }, "istanbul-lib-coverage": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", - "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", + "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", "dev": true }, "istanbul-lib-instrument": { @@ -6570,6 +7644,16 @@ } } }, + "jackspeak": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz", + "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==", + "dev": true, + "requires": { + "@isaacs/cliui": "^8.0.2", + "@pkgjs/parseargs": "^0.11.0" + } + }, "js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -6636,9 +7720,9 @@ "dev": true }, "jwt-decode": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/jwt-decode/-/jwt-decode-3.1.2.tgz", - "integrity": "sha512-UfpWE/VZn0iP50d8cz9NrZLM9lSWhcJ+0Gt/nm4by88UL+J1SiKN8/5dkjMmbEzwL2CAe+67GsegCbIKtbp75A==" + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jwt-decode/-/jwt-decode-4.0.0.tgz", + "integrity": "sha512-+KJGIyHgkGuIq3IEBNftfhW/LfWhXUIY6OmyVWjliu5KH1y0fw7VQ8YndE2O4qZdMSd9SqbnC8GOcZEy0Om7sA==" }, "keyv": { "version": "4.5.4", @@ -6686,31 +7770,31 @@ "dev": true }, "lit": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/lit/-/lit-2.8.0.tgz", - "integrity": "sha512-4Sc3OFX9QHOJaHbmTMk28SYgVxLN3ePDjg7hofEft2zWlehFL3LiAuapWc4U/kYwMYJSh2hTCPZ6/LIC7ii0MA==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/lit/-/lit-3.1.0.tgz", + "integrity": "sha512-rzo/hmUqX8zmOdamDAeydfjsGXbbdtAFqMhmocnh2j9aDYqbu0fjXygjCa0T99Od9VQ/2itwaGrjZz/ZELVl7w==", "dev": true, "requires": { - "@lit/reactive-element": "^1.6.0", - "lit-element": "^3.3.0", - "lit-html": "^2.8.0" + "@lit/reactive-element": "^2.0.0", + "lit-element": "^4.0.0", + "lit-html": "^3.1.0" } }, "lit-element": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/lit-element/-/lit-element-3.3.3.tgz", - "integrity": "sha512-XbeRxmTHubXENkV4h8RIPyr8lXc+Ff28rkcQzw3G6up2xg5E8Zu1IgOWIwBLEQsu3cOVFqdYwiVi0hv0SlpqUA==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/lit-element/-/lit-element-4.0.2.tgz", + "integrity": "sha512-/W6WQZUa5VEXwC7H9tbtDMdSs9aWil3Ou8hU6z2cOKWbsm/tXPAcsoaHVEtrDo0zcOIE5GF6QgU55tlGL2Nihg==", "dev": true, "requires": { - "@lit-labs/ssr-dom-shim": "^1.1.0", - "@lit/reactive-element": "^1.3.0", - "lit-html": "^2.8.0" + "@lit-labs/ssr-dom-shim": "^1.1.2", + "@lit/reactive-element": "^2.0.0", + "lit-html": "^3.1.0" } }, "lit-html": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/lit-html/-/lit-html-2.8.0.tgz", - "integrity": "sha512-o9t+MQM3P4y7M7yNzqAyjp7z+mQGa4NS4CxiyLqFPyFWyc4O+nodLrkrxSaCTrla6M5YOLaT3RpbbqjszB5g3Q==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/lit-html/-/lit-html-3.1.0.tgz", + "integrity": "sha512-FwAjq3iNsaO6SOZXEIpeROlJLUlrbyMkn4iuv4f4u1H40Jw8wkeR/OUXZUHUoiYabGk8Y4Y0F/rgq+R4MrOLmA==", "dev": true, "requires": { "@types/trusted-types": "^2.0.2" @@ -6866,6 +7950,13 @@ "requires": { "braces": "^3.0.2", "picomatch": "^2.3.1" + }, + "dependencies": { + "picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==" + } } }, "mime-db": { @@ -6895,6 +7986,12 @@ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==" }, + "minipass": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", + "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", + "dev": true + }, "mkdirp": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-3.0.1.tgz", @@ -7034,9 +8131,9 @@ "dev": true }, "moment": { - "version": "2.29.4", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.4.tgz", - "integrity": "sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==" + "version": "2.30.1", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.30.1.tgz", + "integrity": "sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==" }, "moment-duration-format": { "version": "2.3.2", @@ -7044,9 +8141,9 @@ "integrity": "sha512-cBMXjSW+fjOb4tyaVHuaVE/A5TqkukDWiOfxxAjY+PEqmmBQlLwn+8OzwPiG3brouXKY5Un4pBjAeB6UToXHaQ==" }, "moment-timezone": { - "version": "0.5.43", - "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.43.tgz", - "integrity": "sha512-72j3aNyuIsDxdF1i7CEgV2FfxM1r6aaqJyLB2vwb33mXYyoyLly+F1zbWqhA3/bVIoJ4szlUoMbUnVdid32NUQ==", + "version": "0.5.44", + "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.44.tgz", + "integrity": "sha512-nv3YpzI/8lkQn0U6RkLd+f0W/zy/JnoR5/EyPz/dNkPTBjA2jNLCVxaiQ8QpeLymhSZvX0wCL5s27NQWdOPwAw==", "requires": { "moment": "^2.29.4" } @@ -7068,12 +8165,6 @@ "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", "dev": true }, - "natural-compare-lite": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz", - "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==", - "dev": true - }, "nise": { "version": "5.1.5", "resolved": "https://registry.npmjs.org/nise/-/nise-5.1.5.tgz", @@ -7134,14 +8225,6 @@ "wrappy": "1" } }, - "open": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/open/-/open-6.4.0.tgz", - "integrity": "sha512-IFenVPgF70fSm1keSd2iDBIDIBZkroLeuffXq+wKTzTJlBpesFWojV9lb8mzOfaAzM1sr7HQHuO0vtV0zYekGg==", - "requires": { - "is-wsl": "^1.1.0" - } - }, "optionator": { "version": "0.9.3", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", @@ -7207,6 +8290,24 @@ "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", "dev": true }, + "path-scurry": { + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.1.tgz", + "integrity": "sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==", + "dev": true, + "requires": { + "lru-cache": "^9.1.1 || ^10.0.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "dependencies": { + "lru-cache": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.1.0.tgz", + "integrity": "sha512-/1clY/ui8CzjKFyjdvwPWJUYKiFVXG2I2cY0ssG7h4+hwk+XOIX7ZSG9Q7TW8TW3Kp3BUSqgFWBLgL4PJ+Blag==", + "dev": true + } + } + }, "path-to-regexp": { "version": "1.8.0", "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz", @@ -7234,10 +8335,18 @@ "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==" }, + "pick-port": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pick-port/-/pick-port-2.0.1.tgz", + "integrity": "sha512-8GSFuOCelctwcW0CkNGFahrGJyKxx2hMOmzDxVaHTknsikh4Zi+edCFUMgfAcBLRkV0GYQT64QivSi4SxDeKdA==", + "requires": { + "debug": "^4.3.4" + } + }, "picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==" + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-3.0.1.tgz", + "integrity": "sha512-I3EurrIQMlRc9IaAZnqRR044Phh2DXY+55o7uJ0V+hYZAcQYSuFWsc9q5PvyDHUSCe1Qxn/iBz+78s86zWnGag==" }, "pify": { "version": "4.0.1", @@ -7252,9 +8361,9 @@ "dev": true }, "prettier": { - "version": "2.8.8", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", - "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.1.1.tgz", + "integrity": "sha512-22UbSzg8luF4UuZtzgiUOfcGM8s4tjBv6dJRT7j275NXsy2jb4aJa4NNveul5x4eqlF1wuhuR2RElK71RvmVaw==", "dev": true }, "process-nextick-args": { @@ -7288,9 +8397,9 @@ } }, "punycode": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", - "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", "dev": true }, "queue-microtask": { @@ -7345,6 +8454,13 @@ "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", "requires": { "picomatch": "^2.2.1" + }, + "dependencies": { + "picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==" + } } }, "regexp-to-ast": { @@ -7376,26 +8492,43 @@ "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==" }, "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-5.0.5.tgz", + "integrity": "sha512-CqDakW+hMe/Bz202FPEymy68P+G50RfMQK+Qo5YUqc9SPipvbGjCGKd0RSKEelbsfQuw3g5NZDSrlZZAJurH1A==", "dev": true, "requires": { - "glob": "^7.1.3" + "glob": "^10.3.7" }, "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==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0" + } + }, "glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "version": "10.3.10", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", + "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", "dev": true, "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "foreground-child": "^3.1.0", + "jackspeak": "^2.3.5", + "minimatch": "^9.0.1", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", + "path-scurry": "^1.10.1" + } + }, + "minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "dev": true, + "requires": { + "brace-expansion": "^2.0.1" } } } @@ -7452,20 +8585,35 @@ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true }, + "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 + }, "sinon": { - "version": "15.2.0", - "resolved": "https://registry.npmjs.org/sinon/-/sinon-15.2.0.tgz", - "integrity": "sha512-nPS85arNqwBXaIsFCkolHjGIkFo+Oxu9vbgmBJizLAhqe6P2o3Qmj3KCUoRkfhHtvgDhZdWD3risLHAUJ8npjw==", + "version": "17.0.1", + "resolved": "https://registry.npmjs.org/sinon/-/sinon-17.0.1.tgz", + "integrity": "sha512-wmwE19Lie0MLT+ZYNpDymasPHUKTaZHUH/pKEubRXIzySv9Atnlw+BUMGCzWgV7b7wO+Hw6f1TEOr0IUnmU8/g==", "dev": true, "requires": { "@sinonjs/commons": "^3.0.0", - "@sinonjs/fake-timers": "^10.3.0", + "@sinonjs/fake-timers": "^11.2.2", "@sinonjs/samsam": "^8.0.0", "diff": "^5.1.0", - "nise": "^5.1.4", + "nise": "^5.1.5", "supports-color": "^7.2.0" }, "dependencies": { + "@sinonjs/fake-timers": { + "version": "11.2.2", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-11.2.2.tgz", + "integrity": "sha512-G2piCSxQ7oWOxwGSAyFHfPIsyeJGXYtc6mFbnFA+kRXkiEnTl8c/8jul2S329iFBnDI9HGoeWWAZvuvOkZccgw==", + "dev": true, + "requires": { + "@sinonjs/commons": "^3.0.0" + } + }, "diff": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/diff/-/diff-5.1.0.tgz", @@ -7534,6 +8682,17 @@ "strip-ansi": "^6.0.1" } }, + "string-width-cjs": { + "version": "npm:string-width@4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, "strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", @@ -7543,6 +8702,15 @@ "ansi-regex": "^5.0.1" } }, + "strip-ansi-cjs": { + "version": "npm:strip-ansi@6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.1" + } + }, "strip-json-comments": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", @@ -7594,19 +8762,17 @@ "integrity": "sha512-iawgk0hLP3SxGKDfnDJf8wTz4p2qImnyihM5Hh/sGvQ3K37dPi/w8sRhdNIxYA1TwFwc5mDhIJq+O0RsvXBKdQ==", "dev": true }, - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" - }, - "tsutils": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", - "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", + "ts-api-utils": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.0.3.tgz", + "integrity": "sha512-wNMeqtMz5NtwpT/UZGY5alT+VoKdSsOOP/kqHFcUW1P/VRhH2wJ48+DN2WwUliNbQ976ETwDL0Ifd2VVvgonvg==", "dev": true, - "requires": { - "tslib": "^1.8.1" - } + "requires": {} + }, + "tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" }, "type-check": { "version": "0.4.0", @@ -7630,9 +8796,9 @@ "dev": true }, "typescript": { - "version": "4.9.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", - "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.3.3.tgz", + "integrity": "sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==", "dev": true }, "undici-types": { @@ -7696,6 +8862,31 @@ "minimist": "^1.2.0", "prompts": "^2.1.0", "rimraf": "^3.0.0" + }, + "dependencies": { + "glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "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" + } + } } }, "vscode-extension-telemetry": { @@ -7704,20 +8895,20 @@ "integrity": "sha512-YhPiPcelqM5xyYWmD46jIcsxLYWkPZhAxlBkzqmpa218fMtTT17ERdOZVCXcs1S5AjvDHlq43yCgi8TaVQjjEg==" }, "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==", + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-8.2.0.tgz", + "integrity": "sha512-C+r0eKJUIfiDIfwJhria30+TYWPtuHJXHtI7J0YlOmKAo7ogxP20T0zxB7HZQIFhIyvoBPwWskjxrvAtfjyZfA==", "dev": true }, "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==", + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/vscode-languageclient/-/vscode-languageclient-9.0.1.tgz", + "integrity": "sha512-JZiimVdvimEuHh5olxhxkht09m3JzUGwggb5eRUkzzJhZ2KjCN0nh55VfiED9oez9DyF8/fz1g1iBV3h+0Z2EA==", "dev": true, "requires": { "minimatch": "^5.1.0", "semver": "^7.3.7", - "vscode-languageserver-protocol": "3.17.3" + "vscode-languageserver-protocol": "3.17.5" }, "dependencies": { "brace-expansion": { @@ -7741,22 +8932,22 @@ } }, "vscode-languageserver": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/vscode-languageserver/-/vscode-languageserver-8.1.0.tgz", - "integrity": "sha512-eUt8f1z2N2IEUDBsKaNapkz7jl5QpskN2Y0G01T/ItMxBxw1fJwvtySGB9QMecatne8jFIWJGWI61dWjyTLQsw==", + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/vscode-languageserver/-/vscode-languageserver-9.0.1.tgz", + "integrity": "sha512-woByF3PDpkHFUreUa7Hos7+pUWdeWMXRd26+ZX2A8cFx6v/JPTtd4/uN0/jB6XQHYaOlHbio03NTHCqrgG5n7g==", "dev": true, "requires": { - "vscode-languageserver-protocol": "3.17.3" + "vscode-languageserver-protocol": "3.17.5" } }, "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==", + "version": "3.17.5", + "resolved": "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.17.5.tgz", + "integrity": "sha512-mb1bvRJN8SVznADSGWM9u/b07H7Ecg0I3OgXDuLdn307rl/J3A9YD6/eYOssqhecL27hK1IPZAsaqh00i/Jljg==", "dev": true, "requires": { - "vscode-jsonrpc": "8.1.0", - "vscode-languageserver-types": "3.17.3" + "vscode-jsonrpc": "8.2.0", + "vscode-languageserver-types": "3.17.5" } }, "vscode-languageserver-textdocument": { @@ -7766,9 +8957,9 @@ "dev": true }, "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==", + "version": "3.17.5", + "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.17.5.tgz", + "integrity": "sha512-Ld1VelNuX9pdF39h2Hgaeb5hEZM2Z3jUrrMgWQAu82jMtZp7p3vJT3BzToKtZI7NgQssZje5o0zryOrhQvzQAg==", "dev": true }, "vscode-test": { @@ -7781,6 +8972,31 @@ "https-proxy-agent": "^5.0.0", "rimraf": "^3.0.2", "unzipper": "^0.10.11" + }, + "dependencies": { + "glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "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" + } + } } }, "vscode-uri": { @@ -7854,6 +9070,43 @@ } } }, + "wrap-ansi-cjs": { + "version": "npm:wrap-ansi@7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "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" + } + }, + "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 + } + } + }, "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", diff --git a/package.json b/package.json index fdfc53df..c0031f72 100644 --- a/package.json +++ b/package.json @@ -3,9 +3,9 @@ "displayName": "kdb", "description": "IDE support for kdb product suite", "publisher": "KX", - "version": "1.2.1", + "version": "1.3.0", "engines": { - "vscode": "^1.66.0" + "vscode": "^1.75.0" }, "icon": "resources/images/kx-logo-vs.png", "repository": { @@ -179,6 +179,11 @@ "type": "boolean", "description": "Hide subscribe for registration notification", "default": false + }, + "kdb.linting": { + "type": "boolean", + "description": "Enable linting for q files", + "default": true } } }, @@ -308,6 +313,10 @@ "command": "kdb.execute.pythonFileScratchpadQuery", "title": "Execute Entire File in Insights Scratchpad", "when": "kdb.connected" + }, + { + "command": "kdb.execute.entireFile", + "title": "Execute Entire File" } ], "keybindings": [ @@ -589,7 +598,7 @@ }, { "command": "kdb.execute.fileQuery", - "when": "resourceLangId == q && kdb.connected", + "when": "resourceLangId == q && kdb.connected && editorFocus", "group": "navigation" }, { @@ -624,6 +633,13 @@ "group": "q", "when": "editorLangId == python && kdb.insightsConnected" } + ], + "explorer/context": [ + { + "command": "kdb.execute.entireFile", + "group": "q", + "when": "(resourceExtname == .q && (kdb.connected || kdb.insightsConnected)) || (resourceExtname == .py && kdb.insightsConnected)" + } ] } }, @@ -641,7 +657,8 @@ "test": "tsc -p ./test && node ./out/test/runTest.js", "coverage": "tsc -p ./test && node ./out/test/runTest.js --coverage", "package": "npx vsce package", - "format": "prettier --ignore-path .gitignore --write \"**/*.+(js|ts|json)\"" + "format": "prettier --ignore-path .gitignore --write \"**/*.+(js|ts|json)\"", + "publish": "npx vsce publish" }, "prettier": { "printWidth": 80, @@ -649,80 +666,78 @@ }, "devDependencies": { "@types/extract-zip": "^2.0.1", - "@types/fs-extra": "^9.0.13", + "@types/fs-extra": "^11.0.4", "@types/glob": "^8.0.1", - "@types/graceful-fs": "^4.1.6", - "@types/istanbul-lib-coverage": "^2.0.4", - "@types/istanbul-reports": "^3.0.1", + "@types/graceful-fs": "^4.1.9", + "@types/istanbul-lib-coverage": "^2.0.6", + "@types/istanbul-reports": "^3.0.4", "@types/jwt-decode": "^3.1.0", - "@types/klaw": "^3.0.3", - "@types/mocha": "^10.0.1", + "@types/klaw": "^3.0.6", + "@types/mocha": "^10.0.6", "@types/node": "^18.15.11", - "@types/node-fetch": "^2.6.2", - "@types/picomatch": "^2.3.0", - "@types/semver": "^7.5.0", - "@types/sinon": "^10.0.13", - "@types/vscode": "^1.66.0", - "@types/vscode-webview": "^1.57.2", - "@typescript-eslint/eslint-plugin": "^5.36.2", - "@typescript-eslint/parser": "^5.36.2", - "@vscode/test-electron": "^2.2.3", + "@types/node-fetch": "^2.6.10", + "@types/picomatch": "^2.3.3", + "@types/semver": "^7.5.6", + "@types/sinon": "^17.0.2", + "@types/vscode": "^1.75.0", + "@types/vscode-webview": "^1.57.4", + "@typescript-eslint/eslint-plugin": "^6.18.1", + "@typescript-eslint/parser": "^6.18.1", + "@vscode/test-electron": "^2.3.8", "antlr4": "^4.13.0", - "esbuild": "^0.15.7", - "eslint": "^8.23.0", + "esbuild": "^0.19.11", + "eslint": "^8.56.0", "eslint-plugin-header": "^3.1.1", "eslint-plugin-license-header": "^0.6.0", "glob": "^8.1.0", - "istanbul-lib-coverage": "^3.2.0", + "istanbul-lib-coverage": "^3.2.2", "istanbul-lib-instrument": "^3.3.0", "istanbul-lib-report": "^2.0.8", "istanbul-lib-source-maps": "^3.0.6", "istanbul-reports": "^3.1.6", - "lit": "^2.8.0", + "lit": "^3.1.0", "mocha": "^10.2.0", "mocha-junit-reporter": "^2.2.0", "mocha-multi-reporters": "^1.5.1", "mock-fs": "^5.2.0", - "prettier": "^2.7.1", - "rimraf": "^3.0.2", - "sinon": "^15.0.1", - "typescript": "^4.8.2", + "prettier": "^3.1.1", + "rimraf": "^5.0.5", + "sinon": "^17.0.1", + "typescript": "^5.3.3", "vscode-dts": "^0.3.3", - "vscode-languageclient": "^8.0.2", - "vscode-languageserver": "^8.1.0", + "vscode-languageclient": "^9.0.1", + "vscode-languageserver": "^9.0.1", "vscode-languageserver-textdocument": "^1.0.7", "vscode-test": "^1.6.1" }, "dependencies": { - "@types/antlr4": "^4.11.2", + "@types/antlr4": "^4.11.6", "@types/graceful-fs": "^4.1.6", "@types/klaw": "^3.0.3", "@types/picomatch": "^2.3.0", - "@vscode/webview-ui-toolkit": "^1.2.2", + "@vscode/webview-ui-toolkit": "^1.4.0", "@windozer/node-q": "^2.6.0", - "ag-grid-community": "^30.2.0", + "ag-grid-community": "^31.0.1", "antlr4-runtime": "^4.13.0", "antlr4ts": "^0.5.0-alpha.4", - "axios": "^1.6.0", + "axios": "^1.6.5", "chevrotain": "^10.5.0", "csv-parser": "^3.0.0", "esbuild-plugin-copy": "^2.1.1", "extract-zip": "^2.0.1", - "fs-extra": "^10.1.0", - "fuse.js": "^6.6.2", - "jwt-decode": "^3.1.2", + "fs-extra": "^11.2.0", + "fuse.js": "^7.0.0", + "jwt-decode": "^4.0.0", "klaw": "^4.1.0", - "moment": "^2.29.4", + "moment": "^2.30.1", "moment-duration-format": "^2.3.2", - "moment-timezone": "^0.5.43", + "moment-timezone": "^0.5.44", "node-fetch": "^2.6.6", "node-q": "^2.6.1", - "open": "^6.4.0", - "picomatch": "^2.3.1", + "pick-port": "^2.0.1", + "picomatch": "^3.0.1", "semver": "^7.5.3", "vscode-extension-telemetry": "^0.4.5", - "vscode-languageclient": "^8.0.2", - "vscode-languageserver": "^8.1.0", "vscode-languageserver-textdocument": "^1.0.7", "vscode-uri": "^3.0.7" } diff --git a/server/src/linter/assign.ts b/server/src/linter/assign.ts index 4480219f..8ae883b1 100644 --- a/server/src/linter/assign.ts +++ b/server/src/linter/assign.ts @@ -11,67 +11,91 @@ * specific language governing permissions and limitations under the License. */ -import { Entity, EntityType, QAst, getNameScope, isLiteral } from "../parser"; +import { Token, TokenType, QAst, scope } from "../parser"; -export function assignReservedWord({ assign }: QAst): Entity[] { - return assign.filter((entity) => entity.type === EntityType.KEYWORD); +export function assignReservedWord({ assign }: QAst): Token[] { + return assign.filter((entity) => entity.type === TokenType.KEYWORD); } -export function invalidAssign({ assign }: QAst): Entity[] { - return assign.filter((entity) => isLiteral(entity)); +export function invalidAssign({ assign }: QAst): Token[] { + return assign.filter((entity) => entity.type === TokenType.LITERAL); } -export function declaredAfterUse({ script, assign }: QAst): Entity[] { - return script.filter((entity, index) => { - if (entity.type === EntityType.IDENTIFIER) { - const declared = assign.find( +export function unusedParam({ script, assign }: QAst): Token[] { + assign = assign.filter( + (token) => token.type === TokenType.IDENTIFIER && token.tag === "ARGUMENT" + ); + + script = script.filter( + (token) => + token.tag !== "ASSIGNED" && + token.tag !== "ARGUMENT" && + token.type === TokenType.IDENTIFIER && + assign.find((symbol) => symbol.image === token.image) + ); + + assign = assign.filter( + (token) => + !script.find( (symbol) => - getNameScope(symbol) === getNameScope(entity) && - symbol.image === entity.image - ); - return declared && script.indexOf(declared) > index; - } - return false; - }); -} + symbol.image === token.image && scope(symbol) === scope(token) + ) + ); -export function unusedParam({ script, assign }: QAst): Entity[] { - return assign - .filter( - (entity) => - entity.type === EntityType.IDENTIFIER && - entity.scope?.type === EntityType.LBRACKET - ) - .filter( - (entity) => - !script.find( - (symbol) => - symbol !== entity && - symbol.image === entity.image && - symbol.type === EntityType.IDENTIFIER && - getNameScope(symbol) === getNameScope(entity) - ) - ); + return assign; } -export function unusedVar({ script, assign }: QAst): Entity[] { - const locals = assign.filter((entity) => getNameScope(entity)); +export function unusedVar({ script, assign }: QAst): Token[] { + const locals = assign.filter( + (token) => token.type === TokenType.IDENTIFIER && scope(token) + ); + + assign = assign.filter( + (token) => token.type === TokenType.IDENTIFIER && token.tag === "ASSIGNED" + ); + + script = script.filter( + (token) => + token.tag !== "ASSIGNED" && + token.tag !== "ARGUMENT" && + token.type === TokenType.IDENTIFIER && + assign.find((symbol) => symbol.image === token.image) + ); + assign = assign.filter( + (token) => + !script.find( + (symbol) => + symbol.image === token.image && + (scope(symbol) === scope(token) || + (!scope(token) && + !locals.find( + (local) => + local.image === token.image && scope(local) === scope(symbol) + ))) + ) + ); + + return assign; +} + +export function declaredAfterUse({ script, assign }: QAst): Token[] { return assign - .filter( - (entity) => - entity.type === EntityType.IDENTIFIER && - entity.scope?.type !== EntityType.LBRACKET - ) - .filter( - (entity) => - !script.find( - (symbol) => - symbol !== entity && - symbol.image === entity.image && - symbol.type === EntityType.IDENTIFIER && - (getNameScope(symbol) === getNameScope(entity) || - !locals.find((local) => local.image === symbol.image)) - ) - ); + .filter((token) => token.tag === "ASSIGNED" && !scope(token)) + .filter((token) => { + const found = script.find( + (entity) => + entity.type === TokenType.IDENTIFIER && + entity.tag !== "ASSIGNED" && + entity.image === token.image && + !scope(entity) + ); + const reverse = !!scope(token, [TokenType.GROUP]); + return ( + found && + (reverse + ? found.statement > token.statement + : found.statement < token.statement) + ); + }); } diff --git a/server/src/linter/index.ts b/server/src/linter/index.ts index 0cf88026..38f3ec72 100644 --- a/server/src/linter/index.ts +++ b/server/src/linter/index.ts @@ -11,27 +11,29 @@ * specific language governing permissions and limitations under the License. */ -import { Entity, QAst } from "../parser"; +import { Token, QAst } from "../parser"; import { RuleSeverity, Rules } from "./rules"; const enabled = [ "ASSIGN_RESERVED_WORD", + "DECLARED_AFTER_USE", + "DEPRECATED_DATETIME", + "FIXED_SEED", "INVALID_ASSIGN", - //"DECLARED_AFTER_USE", - "UNUSED_PARAM", - "UNUSED_VAR", - "LINE_LENGTH", + "INVALID_ESCAPE", + "TOO_MANY_ARGUMENTS", "TOO_MANY_CONSTANTS", "TOO_MANY_GLOBALS", "TOO_MANY_LOCALS", - "DEPRECATED_DATETIME", + "UNUSED_PARAM", + "UNUSED_VAR", ]; export interface LintResult { name: string; message: string; severity: RuleSeverity; - problems: Entity[]; + problems: Token[]; } export function lint(ast: QAst) { diff --git a/server/src/linter/limit.ts b/server/src/linter/limit.ts index 349a18d8..774cfce4 100644 --- a/server/src/linter/limit.ts +++ b/server/src/linter/limit.ts @@ -11,51 +11,33 @@ * specific language governing permissions and limitations under the License. */ -import { Entity, EntityType, QAst, getNameScope } from "../parser"; +import { Token, TokenType, QAst, scope } from "../parser"; -const DEFAULT_MAX_LINE_LENGTH = 200; const DEFAULT_MAX_LOCALS = 110; const DEFAULT_MAX_GLOBALS = 110; const DEFAULT_MAX_CONSTANTS = 239; +const DEFAULT_MAX_ARGUMENTS = 8; -export function lineLength({ script }: QAst): Entity[] { - const problems: Entity[] = []; - - const symbols = script.filter( - (entity) => entity.type === EntityType.ENDOFLINE - ); - - for (let i = 0; i < symbols.length; i++) { - const start = i === 0 ? 0 : symbols[i - 1].endOffset; - - if (symbols[i].endOffset - start > DEFAULT_MAX_LINE_LENGTH + 1) { - problems.push(symbols[i]); - } - } - - return problems; -} - -export function tooManyConstants({ script }: QAst): Entity[] { - const counts = new Map(); +export function tooManyConstants({ script }: QAst): Token[] { + const counts = new Map(); script - .filter((entity) => getNameScope(entity)) + .filter((entity) => scope(entity)) .forEach((entity) => { - if (entity.type === EntityType.IDENTIFIER) { - const scope = getNameScope(entity); - if (scope) { - let count = counts.get(scope); + if (entity.type === TokenType.IDENTIFIER) { + const scoped = scope(entity); + if (scoped) { + let count = counts.get(scoped); if (!count) { count = 0; } count++; - counts.set(scope, count); + counts.set(scoped, count); } } }); - const problems: Entity[] = []; + const problems: Token[] = []; for (const entry of counts.entries()) { if (entry[1] > DEFAULT_MAX_CONSTANTS) { @@ -66,28 +48,28 @@ export function tooManyConstants({ script }: QAst): Entity[] { return problems; } -export function tooManyGlobals({ script, assign }: QAst): Entity[] { - const counts = new Map(); +export function tooManyGlobals({ script, assign }: QAst): Token[] { + const counts = new Map(); - const globals = assign.filter((entity) => !getNameScope(entity)); + const globals = assign.filter((entity) => !scope(entity)); script - .filter((entity) => getNameScope(entity)) + .filter((entity) => scope(entity)) .forEach((entity) => { - const scope = getNameScope(entity); - if (scope) { - let count = counts.get(scope); + const scoped = scope(entity); + if (scoped) { + let count = counts.get(scoped); if (!count) { count = 0; } if (globals.find((symbol) => symbol.image === entity.image)) { count++; } - counts.set(scope, count); + counts.set(scoped, count); } }); - const problems: Entity[] = []; + const problems: Token[] = []; for (const entry of counts.entries()) { if (entry[1] > DEFAULT_MAX_GLOBALS) { @@ -98,31 +80,31 @@ export function tooManyGlobals({ script, assign }: QAst): Entity[] { return problems; } -export function tooManyLocals({ assign }: QAst): Entity[] { - const counts = new Map(); +export function tooManyLocals({ assign }: QAst): Token[] { + const counts = new Map(); assign - .filter((entity) => getNameScope(entity)) + .filter((entity) => scope(entity)) .forEach((entity) => { - const scope = getNameScope(entity); - if (scope) { - let count = counts.get(scope); + const scoped = scope(entity); + if (scoped) { + let count = counts.get(scoped); if (!count) { count = 0; } if ( assign.find( (symbol) => - getNameScope(symbol) === scope && entity.image === symbol.image + scope(symbol) === scoped && entity.image === symbol.image ) ) { count++; } - counts.set(scope, count); + counts.set(scoped, count); } }); - const problems: Entity[] = []; + const problems: Token[] = []; for (const entry of counts.entries()) { if (entry[1] > DEFAULT_MAX_LOCALS) { @@ -132,3 +114,33 @@ export function tooManyLocals({ assign }: QAst): Entity[] { return problems; } + +export function tooManyArguments({ assign }: QAst): Token[] { + const counts = new Map(); + + assign + .filter( + (token) => token.type === TokenType.IDENTIFIER && token.tag === "ARGUMENT" + ) + .forEach((token) => { + const scoped = scope(token); + if (scoped) { + let count = counts.get(scoped); + if (!count) { + count = 0; + } + count++; + counts.set(scoped, count); + } + }); + + const problems: Token[] = []; + + for (const entry of counts.entries()) { + if (entry[1] > DEFAULT_MAX_ARGUMENTS) { + problems.push(entry[0]); + } + } + + return problems; +} diff --git a/server/src/linter/other.ts b/server/src/linter/other.ts index 0540b7e2..1a9b7c34 100644 --- a/server/src/linter/other.ts +++ b/server/src/linter/other.ts @@ -11,8 +11,47 @@ * specific language governing permissions and limitations under the License. */ -import { Entity, EntityType, QAst } from "../parser"; +import { Token, QAst, TokenType } from "../parser"; -export function deprecatedDatetime({ script }: QAst): Entity[] { - return script.filter((entity) => entity.type === EntityType.DATETIME_LITERAL); +export function deprecatedDatetime({ script }: QAst): Token[] { + return script.filter((entity) => entity.name === "DateTimeLiteral"); +} + +export function invalidEscape({ script }: QAst): Token[] { + return script + .filter((entity) => entity.name === "CharLiteral") + .filter((entity) => { + const image = entity.image; + let match = image.match(/(?:\\\\|\\)/g); + const count = match ? match.length : 0; + if (count > 0) { + match = image.match(/\\(?:\d{3}|[\\"rnt/])/g); + if (count !== (match ? match.length : 0)) { + return true; + } + } + return false; + }); +} + +export function fixedSeed({ script }: QAst): Token[] { + const problems: Token[] = []; + + for (let i = 0; i < script.length; i++) { + const token = script[i]; + if (token.type === TokenType.OPERATOR && token.image === "?") { + let next = script[i + 1]; + if (next && next.image === "0Ng") { + next = script[i - 1]; + if (next && next.name === "NumberLiteral") { + const val = parseInt(next.image); + if (val > 0) { + problems.push(next); + } + } + } + } + } + + return problems; } diff --git a/server/src/linter/rules.ts b/server/src/linter/rules.ts index 7880b2e5..448ccf74 100644 --- a/server/src/linter/rules.ts +++ b/server/src/linter/rules.ts @@ -11,7 +11,7 @@ * specific language governing permissions and limitations under the License. */ -import { Entity, QAst } from "../parser"; +import { Token, QAst } from "../parser"; import { assignReservedWord, declaredAfterUse, @@ -20,24 +20,25 @@ import { unusedVar, } from "./assign"; import { - lineLength, + tooManyArguments, tooManyConstants, tooManyGlobals, tooManyLocals, } from "./limit"; -import { deprecatedDatetime } from "./other"; +import { deprecatedDatetime, fixedSeed, invalidEscape } from "./other"; export enum RuleSeverity { ERROR = "ERROR", WARNING = "WARNING", INFO = "INFO", + HINT = "HINT", } export interface LinterRule { name: string; message: string; severity: RuleSeverity; - check: (ast: QAst) => Entity[]; + check: (ast: QAst) => Token[]; } const check = () => []; @@ -56,7 +57,7 @@ const CondEvenArgsRule: LinterRule = { check, }; -const DeclaredAfterUserRule: LinterRule = { +const DeclaredAfterUseRule: LinterRule = { name: "DECLARED_AFTER_USE", message: "The variable was declared after being used", severity: RuleSeverity.ERROR, @@ -87,9 +88,9 @@ const InvalidAssignRule: LinterRule = { const InvalidEscapeRule: LinterRule = { name: "INVALID_ESCAPE", message: - "Invalid Escape Sequence: Valid escape sequences are: \\n,\\r,\\t,/,,/ and three digit octal sequences \\377 or smaller", - severity: RuleSeverity.ERROR, - check, + 'Invalid Escape Sequence: Valid escape sequences are: \\n,\\r,\\t,\\\\,\\/,\\" and three digit octal sequences \\377 or smaller', + severity: RuleSeverity.HINT, + check: invalidEscape, }; const InvalidQukeRule: LinterRule = { @@ -149,6 +150,13 @@ const TooManyLocalsRule: LinterRule = { check: tooManyLocals, }; +const TooManyArgumentsRule: LinterRule = { + name: "TOO_MANY_ARGUMENTS", + message: "Too many arguments in a function", + severity: RuleSeverity.ERROR, + check: tooManyArguments, +}; + const BackwardCompatibilityRule: LinterRule = { name: "BACKWARD_COMPATIBILITY", message: @@ -206,7 +214,7 @@ const FixedSeedRule: LinterRule = { message: "Inputting a positive number into ?0Ng will result in the same sequence every run", severity: RuleSeverity.WARNING, - check, + check: fixedSeed, }; const FunctionStartRule: LinterRule = { @@ -293,14 +301,14 @@ const UnusedInternalRule: LinterRule = { const UnusedParamRule: LinterRule = { name: "UNUSED_PARAM", message: "This param was declared then never used", - severity: RuleSeverity.WARNING, + severity: RuleSeverity.HINT, check: unusedParam, }; const UnusedVarRule: LinterRule = { name: "UNUSED_VAR", message: "This variable was declared then never used", - severity: RuleSeverity.WARNING, + severity: RuleSeverity.HINT, check: unusedVar, }; @@ -368,7 +376,7 @@ const LineLengthRule: LinterRule = { name: "LINE_LENGTH", message: "Maximum line length exceeded", severity: RuleSeverity.WARNING, - check: lineLength, + check, }; const DefaultQdocRule: LinterRule = { @@ -473,7 +481,7 @@ const UnusedDependencyRule: LinterRule = { export const Rules: LinterRule[] = [ AssignReservedWordRule, CondEvenArgsRule, - DeclaredAfterUserRule, + DeclaredAfterUseRule, GlobalPeachRule, InvalidAdverbRule, InvalidAssignRule, @@ -485,6 +493,7 @@ export const Rules: LinterRule[] = [ TooManyConstantsRule, TooManyGlobalsRule, TooManyLocalsRule, + TooManyArgumentsRule, UnindentedCodeRule, BackwardCompatibilityRule, CastTypeNumericalRule, diff --git a/server/src/parser/index.ts b/server/src/parser/index.ts index b20a538e..309bff9b 100644 --- a/server/src/parser/index.ts +++ b/server/src/parser/index.ts @@ -11,6 +11,8 @@ * specific language governing permissions and limitations under the License. */ +export * from "./keywords"; +export * from "./language"; export * from "./lexer"; export * from "./literals"; export * from "./parser"; diff --git a/server/src/parser/keywords.ts b/server/src/parser/keywords.ts index a1cc4ef2..c4d0ae7d 100644 --- a/server/src/parser/keywords.ts +++ b/server/src/parser/keywords.ts @@ -12,13 +12,41 @@ */ import { createToken } from "chevrotain"; -import { Identifier } from "./tokens"; + +export const IdentifierPattern = + /(?:(?:\.[a-zA-Z_0-9]+)+|[a-zA-Z][a-zA-Z_0-9]*)/; + +export const Identifier = createToken({ + name: "Identifier", + pattern: IdentifierPattern, +}); + +export const LSql = createToken({ + name: "LSql", + pattern: /(?:select|exec|update|delete)/, + longer_alt: Identifier, +}); + +export const RSql = createToken({ + name: "RSql", + pattern: /from/, + longer_alt: Identifier, +}); export const KeywordPattern = - /(?:\.h\.(?:iso8601|code|edsn|fram|HOME|htac|html|http|logo|text|hta|htc|hug|nbr|pre|val|xmp|br|c0|c1|cd|ed|ha|hb|hc|he|hn|hp|hr|ht|hu|hy|jx|sa|sb|sc|td|tx|ty|uh|xd|xs|xt|d)|\.j\.(?:jd|[jk])|\.m\.(?:addmonths|dpfts|dsftg|addr|btoa|dpft|hdpf|host|view|chk|def|ens|fmt|fpn|fps|fsn|ind|j10|j12|MAP|opt|par|res|sbt|trp|x10|x12|b6|bt|bv|Cf|cn|dd|en|ff|fk|fs|ft|fu|gc|gz|hg|hp|id|nA|pd|PD|pf|pn|pt|pv|PV|qp|qt|s1|ts|ty|vp|Xf|[aADfklMPsuvVwx])|\.[Qq]\.(?:addmonths|dpfts|dsftg|addr|btoa|dpft|hdpf|host|sha1|view|chk|def|ens|fmt|fpn|fps|fsn|ind|j10|j12|MAP|opt|par|res|sbt|trp|x10|x12|b6|bt|bv|Cf|cn|dd|en|fc|ff|fk|fs|ft|fu|gc|gz|hg|hp|id|nA|pd|PD|pf|pn|pt|pv|PV|qp|qt|s1|ts|ty|vp|Xf|[aADfklMPsSuvVwx])|\.z\.(?:exit|ac|bm|ex|ey|pc|pd|pg|ph|pi|pm|po|pp|pq|ps|pw|ts|vs|wc|wo|ws|zd|[abcdDefhikKlnNopPqstTuwWxXzZ])|(?:reciprocal|distinct|ceiling|reverse|sublist|ungroup|delete|deltas|differ|enlist|except|getenv|hclose|hcount|insert|mcount|ratios|rotate|select|setenv|signum|string|system|tables|update|upsert|within|xgroup|count|cross|dsave|fills|first|fkeys|floor|group|gtime|hopen|idesc|inter|lower|ltime|ltrim|parse|peach|prior|read0|read1|reval|rload|rsave|rtrim|union|upper|value|views|where|while|xcols|xdesc|xprev|xrank|acos|ajf0|asin|asof|atan|attr|avgs|binr|cols|desc|each|eval|exec|exit|flip|from|hdel|hsym|iasc|keys|last|like|load|mavg|maxs|mdev|meta|mins|mmax|mmin|msum|next|null|over|prds|prev|rand|rank|raze|save|scan|scov|sdev|show|sqrt|sums|svar|trim|type|view|wavg|wsum|xasc|xbar|xcol|xexp|xkey|xlog|abs|aj0|ajf|all|and|any|asc|avg|bin|cor|cos|cov|csv|cut|dev|div|ema|exp|fby|get|ijf|inv|key|ljf|log|lsq|max|md5|med|min|mmu|mod|neg|not|prd|set|sin|ssr|sum|tan|til|ujf|var|wj1|aj|do|ej|if|ij|in|lj|or|pj|ss|sv|uj|vs|wj))/; + /(?:reciprocal|distinct|ceiling|reverse|sublist|ungroup|delete|deltas|differ|enlist|except|getenv|hclose|hcount|insert|mcount|ratios|rotate|select|setenv|signum|string|system|tables|update|upsert|within|xgroup|count|cross|dsave|fills|first|fkeys|floor|group|gtime|hopen|idesc|inter|lower|ltime|ltrim|parse|peach|prior|read0|read1|reval|rload|rsave|rtrim|union|upper|value|views|where|while|xcols|xdesc|xprev|xrank|acos|ajf0|asin|asof|atan|attr|avgs|binr|cols|desc|each|eval|exec|exit|flip|from|hdel|hsym|iasc|keys|last|like|load|mavg|maxs|mdev|meta|mins|mmax|mmin|msum|next|null|over|prds|prev|rand|rank|raze|save|scan|scov|sdev|show|sqrt|sums|svar|trim|type|view|wavg|wsum|xasc|xbar|xcol|xexp|xkey|xlog|abs|aj0|ajf|all|and|any|asc|avg|bin|cor|cos|cov|csv|cut|dev|div|ema|exp|fby|get|ijf|inv|key|ljf|log|lsq|max|md5|med|min|mmu|mod|neg|not|prd|set|sin|ssr|sum|tan|til|ujf|var|wj1|aj|do|ej|if|ij|in|lj|or|pj|ss|sv|uj|vs|wj)/; export const Keyword = createToken({ name: "Keyword", pattern: KeywordPattern, longer_alt: Identifier, }); + +export const ReservedPattern = + /(?:\.h\.(?:iso8601|code|edsn|fram|HOME|htac|html|http|logo|text|hta|htc|hug|nbr|pre|val|xmp|br|c0|c1|cd|ed|ha|hb|hc|he|hn|hp|hr|ht|hu|hy|jx|sa|sb|sc|td|tx|ty|uh|xd|xs|xt|d)|\.j\.(?:jd|[jk])|\.m\.(?:addmonths|dpfts|dsftg|addr|btoa|dpft|hdpf|host|view|chk|def|ens|fmt|fpn|fps|fsn|ind|j10|j12|MAP|opt|par|res|sbt|trp|x10|x12|b6|bt|bv|Cf|cn|dd|en|ff|fk|fs|ft|fu|gc|gz|hg|hp|id|nA|pd|PD|pf|pn|pt|pv|PV|qp|qt|s1|ts|ty|vp|Xf|[aADfklMPsuvVwx])|\.[Qq]\.(?:addmonths|dpfts|dsftg|addr|btoa|dpft|hdpf|host|sha1|view|chk|def|ens|fmt|fpn|fps|fsn|ind|j10|j12|MAP|opt|par|res|sbt|trp|x10|x12|b6|bt|bv|Cf|cn|dd|en|fc|ff|fk|fs|ft|fu|gc|gz|hg|hp|id|nA|pd|PD|pf|pn|pt|pv|PV|qp|qt|s1|ts|ty|vp|Xf|[aADfklMPsSuvVwx])|\.z\.(?:exit|ac|bm|ex|ey|pc|pd|pg|ph|pi|pm|po|pp|pq|ps|pw|ts|vs|wc|wo|ws|zd|[abcdDefhikKlnNopPqstTuwWxXzZ]))/; + +export const Reserved = createToken({ + name: "Reserved", + pattern: ReservedPattern, + longer_alt: Identifier, +}); diff --git a/server/src/parser/language.ts b/server/src/parser/language.ts new file mode 100644 index 00000000..a95c1102 --- /dev/null +++ b/server/src/parser/language.ts @@ -0,0 +1,279 @@ +/* + * Copyright (c) 1998-2023 Kx Systems Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the + * specific language governing permissions and limitations under the License. + */ + +import { + BinaryLiteral, + ByteLiteral, + DateLiteral, + DateTimeLiteral, + FileLiteral, + InfinityLiteral, + MonthLiteral, + NumberLiteral, + SymbolLiteral, + TimeLiteral, + TimeStampLiteral, +} from "./literals"; +import { Identifier, Keyword, Reserved } from "./keywords"; +import { Command, Iterator, LineComment, Operator } from "./tokens"; +import { TokenType } from "chevrotain"; + +function _(token: TokenType | RegExp) { + return ("PATTERN" in token ? `${token.PATTERN}` : `${token}`).slice(1, -1); +} + +const qdoc = { + patterns: [ + { + name: "comment.qdoc", + begin: "(?:(?<=\\r?\\n|[ \\t])|(? { - this.MANY(() => this.SUBRULE(this.entity)); + this.MANY(() => this.SUBRULE(this.expression)); }); - private entity = this.RULE("entity", () => { + private expression = this.RULE("expression", () => { this.OR([ - { ALT: () => this.SUBRULE(this.dynamicLoad) }, - { ALT: () => this.SUBRULE(this.doubleColon) }, + { ALT: () => this.SUBRULE(this.iterator) }, + { ALT: () => this.SUBRULE(this.assignment) }, + { ALT: () => this.SUBRULE(this.group) }, + { ALT: () => this.SUBRULE(this.lambda) }, + { ALT: () => this.SUBRULE(this.bracket) }, + { ALT: () => this.SUBRULE(this.sql) }, + { ALT: () => this.SUBRULE(this.symbol) }, { ALT: () => this.SUBRULE(this.command) }, - { ALT: () => this.SUBRULE(this.endOfLine) }, + { ALT: () => this.SUBRULE(this.operator) }, + { ALT: () => this.SUBRULE(this.semiColon) }, + ]); + }); + + private iterator = this.RULE("iterator", () => { + this.CONSUME(Iterator); + }); + + private assignment = this.RULE("assignment", () => { + this.OPTION(() => this.SUBRULE(this.operator)); + this.AT_LEAST_ONE(() => this.CONSUME(Colon)); + this.OPTION1(() => this.SUBRULE(this.expression)); + }); + + private group = this.RULE("group", () => { + this.CONSUME(LParen); + this.OPTION(() => this.SUBRULE(this.bracket)); + this.MANY(() => this.SUBRULE(this.expression)); + this.CONSUME(RParen); + }); + + private lambda = this.RULE("lambda", () => { + this.CONSUME(LCurly); + this.OPTION(() => this.SUBRULE(this.bracket)); + this.MANY(() => this.SUBRULE(this.expression)); + this.CONSUME(RCurly); + }); + + private bracket = this.RULE("bracket", () => { + this.CONSUME(LBracket); + this.MANY(() => this.SUBRULE(this.expression)); + this.CONSUME(RBracket); + }); + + private sql = this.RULE("sql", () => { + this.CONSUME(LSql); + this.MANY(() => this.SUBRULE(this.expression)); + this.CONSUME(RSql); + }); + + private symbol = this.RULE("symbol", () => { + this.OR([ + { ALT: () => this.SUBRULE(this.literal) }, + { ALT: () => this.SUBRULE(this.reserved) }, + { ALT: () => this.SUBRULE(this.keyword) }, + { ALT: () => this.SUBRULE(this.identifier) }, + ]); + }); + + private literal = this.RULE("literal", () => { + this.OR([ { ALT: () => this.SUBRULE(this.charLiteral) }, { ALT: () => this.SUBRULE(this.symbolLiteral) }, - { ALT: () => this.SUBRULE(this.timeStampLiteral) }, { ALT: () => this.SUBRULE(this.dateTimeLiteral) }, - { ALT: () => this.SUBRULE(this.miliTimeLiteral) }, - { ALT: () => this.SUBRULE(this.nanoTimeLiteral) }, + { ALT: () => this.SUBRULE(this.timeStampLiteral) }, { ALT: () => this.SUBRULE(this.dateLiteral) }, { ALT: () => this.SUBRULE(this.monthLiteral) }, - { ALT: () => this.SUBRULE(this.secondLiteral) }, - { ALT: () => this.SUBRULE(this.minuteLiteral) }, + { ALT: () => this.SUBRULE(this.timeLiteral) }, + { ALT: () => this.SUBRULE(this.fileLiteral) }, + { ALT: () => this.SUBRULE(this.infinityLiteral) }, { ALT: () => this.SUBRULE(this.binaryLiteral) }, { ALT: () => this.SUBRULE(this.byteLiteral) }, { ALT: () => this.SUBRULE(this.numberLiteral) }, - { ALT: () => this.SUBRULE(this.keyword) }, - { ALT: () => this.SUBRULE(this.identifier) }, - { ALT: () => this.SUBRULE(this.operator) }, - { ALT: () => this.SUBRULE(this.semiColon) }, - { ALT: () => this.SUBRULE(this.colon) }, - { ALT: () => this.SUBRULE(this.lparen) }, - { ALT: () => this.SUBRULE(this.rparen) }, - { ALT: () => this.SUBRULE(this.lbracket) }, - { ALT: () => this.SUBRULE(this.rbracket) }, - { ALT: () => this.SUBRULE(this.lcurly) }, - { ALT: () => this.SUBRULE(this.rcurly) }, ]); }); - private dynamicLoad = this.RULE("dynamicLoad", () => { - this.CONSUME(DynamicLoad); - }); - - private command = this.RULE("command", () => { - this.CONSUME(Command); - }); - private charLiteral = this.RULE("charLiteral", () => { this.CONSUME(CharLiteral); }); @@ -105,20 +137,12 @@ class Parser extends CstParser { this.CONSUME(SymbolLiteral); }); - private timeStampLiteral = this.RULE("timeStampLiteral", () => { - this.CONSUME(TimeStampLiteral); - }); - private dateTimeLiteral = this.RULE("dateTimeLiteral", () => { this.CONSUME(DateTimeLiteral); }); - private miliTimeLiteral = this.RULE("miliTimeLiteral", () => { - this.CONSUME(MiliTimeLiteral); - }); - - private nanoTimeLiteral = this.RULE("nanoTimeLiteral", () => { - this.CONSUME(NanoTimeLiteral); + private timeStampLiteral = this.RULE("timeStampLiteral", () => { + this.CONSUME(TimeStampLiteral); }); private dateLiteral = this.RULE("dateLiteral", () => { @@ -129,12 +153,16 @@ class Parser extends CstParser { this.CONSUME(MonthLiteral); }); - private secondLiteral = this.RULE("secondLiteral", () => { - this.CONSUME(SecondLiteral); + private timeLiteral = this.RULE("timeLiteral", () => { + this.CONSUME(TimeLiteral); + }); + + private fileLiteral = this.RULE("fileLiteral", () => { + this.CONSUME(FileLiteral); }); - private minuteLiteral = this.RULE("minuteLiteral", () => { - this.CONSUME(MinuteLiteral); + private infinityLiteral = this.RULE("infinityLiteral", () => { + this.CONSUME(InfinityLiteral); }); private binaryLiteral = this.RULE("binaryLiteral", () => { @@ -149,6 +177,10 @@ class Parser extends CstParser { this.CONSUME(NumberLiteral); }); + private reserved = this.RULE("reserved", () => { + this.CONSUME(Reserved); + }); + private keyword = this.RULE("keyword", () => { this.CONSUME(Keyword); }); @@ -157,12 +189,8 @@ class Parser extends CstParser { this.CONSUME(Identifier); }); - private endOfLine = this.RULE("endOfLine", () => { - this.CONSUME(EndOfLine); - }); - - private doubleColon = this.RULE("doubleColon", () => { - this.CONSUME(DoubleColon); + private command = this.RULE("command", () => { + this.CONSUME(Command); }); private operator = this.RULE("operator", () => { @@ -173,34 +201,6 @@ class Parser extends CstParser { this.CONSUME(SemiColon); }); - private colon = this.RULE("colon", () => { - this.CONSUME(Colon); - }); - - private lparen = this.RULE("lparen", () => { - this.CONSUME(LParen); - }); - - private rparen = this.RULE("rparen", () => { - this.CONSUME(RParen); - }); - - private lcurly = this.RULE("lcurly", () => { - this.CONSUME(LCurly); - }); - - private rcurly = this.RULE("rcurly", () => { - this.CONSUME(RCurly); - }); - - private lbracket = this.RULE("lbracket", () => { - this.CONSUME(LBracket); - }); - - private rbracket = this.RULE("rbracket", () => { - this.CONSUME(RBracket); - }); - public parse(script: string) { const lexed = QLexer.tokenize(script); this.input = lexed.tokens; diff --git a/server/src/parser/tokens.ts b/server/src/parser/tokens.ts index c2f4552c..cadd09b1 100644 --- a/server/src/parser/tokens.ts +++ b/server/src/parser/tokens.ts @@ -12,74 +12,48 @@ */ import { Lexer, createToken } from "chevrotain"; -import { - DateTimeLiteral, - MiliTimeLiteral, - MinuteLiteral, - NanoTimeLiteral, - SecondLiteral, - TimeStampLiteral, -} from "./literals"; export const BlockComment = createToken({ name: "BlockComment", - pattern: /(?<=(\r?\n|[ \t]*))\/(?:[ \t]*\r?\n)[^\\]*\\?/, + pattern: /(??!#@$&~|%*+-]/, }); -export const SemiColon = createToken({ - name: "SemiColon", - pattern: /;/, +export const Colon = createToken({ + name: "Colon", + pattern: /:/, }); export const LParen = createToken({ diff --git a/server/src/parser/types.d.ts b/server/src/parser/types.d.ts new file mode 100644 index 00000000..6b50715c --- /dev/null +++ b/server/src/parser/types.d.ts @@ -0,0 +1,319 @@ +import type { CstNode, ICstVisitor, IToken } from "chevrotain"; + +export interface ScriptCstNode extends CstNode { + name: "script"; + children: ScriptCstChildren; +} + +export type ScriptCstChildren = { + expression?: ExpressionCstNode[]; +}; + +export interface ExpressionCstNode extends CstNode { + name: "expression"; + children: ExpressionCstChildren; +} + +export type ExpressionCstChildren = { + iterator?: IteratorCstNode[]; + assignment?: AssignmentCstNode[]; + group?: GroupCstNode[]; + lambda?: LambdaCstNode[]; + bracket?: BracketCstNode[]; + sql?: SqlCstNode[]; + symbol?: SymbolCstNode[]; + command?: CommandCstNode[]; + operator?: OperatorCstNode[]; + semiColon?: SemiColonCstNode[]; +}; + +export interface IteratorCstNode extends CstNode { + name: "iterator"; + children: IteratorCstChildren; +} + +export type IteratorCstChildren = { + Iterator: IToken[]; +}; + +export interface AssignmentCstNode extends CstNode { + name: "assignment"; + children: AssignmentCstChildren; +} + +export type AssignmentCstChildren = { + operator?: OperatorCstNode[]; + Colon: IToken[]; + expression?: ExpressionCstNode[]; +}; + +export interface GroupCstNode extends CstNode { + name: "group"; + children: GroupCstChildren; +} + +export type GroupCstChildren = { + LParen: IToken[]; + bracket?: BracketCstNode[]; + expression?: ExpressionCstNode[]; + RParen: IToken[]; +}; + +export interface LambdaCstNode extends CstNode { + name: "lambda"; + children: LambdaCstChildren; +} + +export type LambdaCstChildren = { + LCurly: IToken[]; + bracket?: BracketCstNode[]; + expression?: ExpressionCstNode[]; + RCurly: IToken[]; +}; + +export interface BracketCstNode extends CstNode { + name: "bracket"; + children: BracketCstChildren; +} + +export type BracketCstChildren = { + LBracket: IToken[]; + expression?: ExpressionCstNode[]; + RBracket: IToken[]; +}; + +export interface SqlCstNode extends CstNode { + name: "sql"; + children: SqlCstChildren; +} + +export type SqlCstChildren = { + LSql: IToken[]; + expression?: ExpressionCstNode[]; + RSql: IToken[]; +}; + +export interface SymbolCstNode extends CstNode { + name: "symbol"; + children: SymbolCstChildren; +} + +export type SymbolCstChildren = { + literal?: LiteralCstNode[]; + reserved?: ReservedCstNode[]; + keyword?: KeywordCstNode[]; + identifier?: IdentifierCstNode[]; +}; + +export interface LiteralCstNode extends CstNode { + name: "literal"; + children: LiteralCstChildren; +} + +export type LiteralCstChildren = { + charLiteral?: CharLiteralCstNode[]; + symbolLiteral?: SymbolLiteralCstNode[]; + dateTimeLiteral?: DateTimeLiteralCstNode[]; + timeStampLiteral?: TimeStampLiteralCstNode[]; + dateLiteral?: DateLiteralCstNode[]; + monthLiteral?: MonthLiteralCstNode[]; + timeLiteral?: TimeLiteralCstNode[]; + fileLiteral?: FileLiteralCstNode[]; + infinityLiteral?: InfinityLiteralCstNode[]; + binaryLiteral?: BinaryLiteralCstNode[]; + byteLiteral?: ByteLiteralCstNode[]; + numberLiteral?: NumberLiteralCstNode[]; +}; + +export interface CharLiteralCstNode extends CstNode { + name: "charLiteral"; + children: CharLiteralCstChildren; +} + +export type CharLiteralCstChildren = { + CharLiteral: IToken[]; +}; + +export interface SymbolLiteralCstNode extends CstNode { + name: "symbolLiteral"; + children: SymbolLiteralCstChildren; +} + +export type SymbolLiteralCstChildren = { + SymbolLiteral: IToken[]; +}; + +export interface DateTimeLiteralCstNode extends CstNode { + name: "dateTimeLiteral"; + children: DateTimeLiteralCstChildren; +} + +export type DateTimeLiteralCstChildren = { + DateTimeLiteral: IToken[]; +}; + +export interface TimeStampLiteralCstNode extends CstNode { + name: "timeStampLiteral"; + children: TimeStampLiteralCstChildren; +} + +export type TimeStampLiteralCstChildren = { + TimeStampLiteral: IToken[]; +}; + +export interface DateLiteralCstNode extends CstNode { + name: "dateLiteral"; + children: DateLiteralCstChildren; +} + +export type DateLiteralCstChildren = { + DateLiteral: IToken[]; +}; + +export interface MonthLiteralCstNode extends CstNode { + name: "monthLiteral"; + children: MonthLiteralCstChildren; +} + +export type MonthLiteralCstChildren = { + MonthLiteral: IToken[]; +}; + +export interface TimeLiteralCstNode extends CstNode { + name: "timeLiteral"; + children: TimeLiteralCstChildren; +} + +export type TimeLiteralCstChildren = { + TimeLiteral: IToken[]; +}; + +export interface FileLiteralCstNode extends CstNode { + name: "fileLiteral"; + children: FileLiteralCstChildren; +} + +export type FileLiteralCstChildren = { + FileLiteral: IToken[]; +}; + +export interface InfinityLiteralCstNode extends CstNode { + name: "infinityLiteral"; + children: InfinityLiteralCstChildren; +} + +export type InfinityLiteralCstChildren = { + InfinityLiteral: IToken[]; +}; + +export interface BinaryLiteralCstNode extends CstNode { + name: "binaryLiteral"; + children: BinaryLiteralCstChildren; +} + +export type BinaryLiteralCstChildren = { + BinaryLiteral: IToken[]; +}; + +export interface ByteLiteralCstNode extends CstNode { + name: "byteLiteral"; + children: ByteLiteralCstChildren; +} + +export type ByteLiteralCstChildren = { + ByteLiteral: IToken[]; +}; + +export interface NumberLiteralCstNode extends CstNode { + name: "numberLiteral"; + children: NumberLiteralCstChildren; +} + +export type NumberLiteralCstChildren = { + NumberLiteral: IToken[]; +}; + +export interface ReservedCstNode extends CstNode { + name: "reserved"; + children: ReservedCstChildren; +} + +export type ReservedCstChildren = { + Reserved: IToken[]; +}; + +export interface KeywordCstNode extends CstNode { + name: "keyword"; + children: KeywordCstChildren; +} + +export type KeywordCstChildren = { + Keyword: IToken[]; +}; + +export interface IdentifierCstNode extends CstNode { + name: "identifier"; + children: IdentifierCstChildren; +} + +export type IdentifierCstChildren = { + Identifier: IToken[]; +}; + +export interface CommandCstNode extends CstNode { + name: "command"; + children: CommandCstChildren; +} + +export type CommandCstChildren = { + Command: IToken[]; +}; + +export interface OperatorCstNode extends CstNode { + name: "operator"; + children: OperatorCstChildren; +} + +export type OperatorCstChildren = { + Operator: IToken[]; +}; + +export interface SemiColonCstNode extends CstNode { + name: "semiColon"; + children: SemiColonCstChildren; +} + +export type SemiColonCstChildren = { + SemiColon: IToken[]; +}; + +export interface ICstNodeVisitor extends ICstVisitor { + script(children: ScriptCstChildren, param?: IN): OUT; + expression(children: ExpressionCstChildren, param?: IN): OUT; + iterator(children: IteratorCstChildren, param?: IN): OUT; + assignment(children: AssignmentCstChildren, param?: IN): OUT; + group(children: GroupCstChildren, param?: IN): OUT; + lambda(children: LambdaCstChildren, param?: IN): OUT; + bracket(children: BracketCstChildren, param?: IN): OUT; + sql(children: SqlCstChildren, param?: IN): OUT; + symbol(children: SymbolCstChildren, param?: IN): OUT; + literal(children: LiteralCstChildren, param?: IN): OUT; + charLiteral(children: CharLiteralCstChildren, param?: IN): OUT; + symbolLiteral(children: SymbolLiteralCstChildren, param?: IN): OUT; + dateTimeLiteral(children: DateTimeLiteralCstChildren, param?: IN): OUT; + timeStampLiteral(children: TimeStampLiteralCstChildren, param?: IN): OUT; + dateLiteral(children: DateLiteralCstChildren, param?: IN): OUT; + monthLiteral(children: MonthLiteralCstChildren, param?: IN): OUT; + timeLiteral(children: TimeLiteralCstChildren, param?: IN): OUT; + fileLiteral(children: FileLiteralCstChildren, param?: IN): OUT; + infinityLiteral(children: InfinityLiteralCstChildren, param?: IN): OUT; + binaryLiteral(children: BinaryLiteralCstChildren, param?: IN): OUT; + byteLiteral(children: ByteLiteralCstChildren, param?: IN): OUT; + numberLiteral(children: NumberLiteralCstChildren, param?: IN): OUT; + reserved(children: ReservedCstChildren, param?: IN): OUT; + keyword(children: KeywordCstChildren, param?: IN): OUT; + identifier(children: IdentifierCstChildren, param?: IN): OUT; + command(children: CommandCstChildren, param?: IN): OUT; + operator(children: OperatorCstChildren, param?: IN): OUT; + semiColon(children: SemiColonCstChildren, param?: IN): OUT; +} diff --git a/server/src/parser/visitor.ts b/server/src/parser/visitor.ts index 47b72531..3e90b453 100644 --- a/server/src/parser/visitor.ts +++ b/server/src/parser/visitor.ts @@ -11,453 +11,376 @@ * specific language governing permissions and limitations under the License. */ -/* eslint @typescript-eslint/no-explicit-any: 0 */ - -import { CstNode } from "chevrotain"; +import type { + AssignmentCstChildren, + BinaryLiteralCstChildren, + BracketCstChildren, + ByteLiteralCstChildren, + CharLiteralCstChildren, + CommandCstChildren, + DateLiteralCstChildren, + DateTimeLiteralCstChildren, + ExpressionCstChildren, + FileLiteralCstChildren, + GroupCstChildren, + ICstNodeVisitor, + IdentifierCstChildren, + InfinityLiteralCstChildren, + IteratorCstChildren, + KeywordCstChildren, + LambdaCstChildren, + LiteralCstChildren, + MonthLiteralCstChildren, + NumberLiteralCstChildren, + OperatorCstChildren, + ReservedCstChildren, + ScriptCstChildren, + SemiColonCstChildren, + SqlCstChildren, + SymbolCstChildren, + SymbolLiteralCstChildren, + TimeLiteralCstChildren, + TimeStampLiteralCstChildren, +} from "./types"; +import { CstNode, IToken } from "chevrotain"; import { QParser } from "./parser"; const BaseQVisitor = QParser.getBaseCstVisitorConstructorWithDefaults(); -class QVisitor extends BaseQVisitor { - readonly symbols: Entity[] = []; - private scopes: Entity[] = []; +class QVisitor extends BaseQVisitor implements ICstNodeVisitor { + private tokens: Token[] = []; + private scopes: Token[] = []; + private assigns: Token[] = []; + private statement = 0; constructor() { super(); this.validateVisitor(); } - private get scope() { - const size = this.scopes.length; - return size === 0 ? undefined : this.scopes[size - 1]; + ast(): QAst { + return { + script: this.tokens, + assign: this.assigns, + }; } - private createEntity(entity: Partial): Entity { - return { - type: entity.type || EntityType.UNKNOWN, - image: entity.image || "", - startOffset: entity.startOffset || 0, - endOffset: (entity.endOffset || 0) + 1, - scope: this.scope, + private consume(ctx: IToken & Partial) { + const token = { + type: ctx.type || TokenType.LITERAL, + name: ctx.tokenType.name, + image: ctx.image, + startOffset: ctx.startOffset, + endOffset: (ctx.endOffset || ctx.startOffset) + 1, + statement: this.statement, + scope: this.scopes[this.scopes.length - 1], }; + this.tokens.push(token); + return token; } - script(ctx: any) { - ctx.entity?.forEach((rule: any) => this.visit(rule)); - } - - entity(ctx: any) { - ctx.doubleColon?.forEach((rule: any) => this.visit(rule)); - ctx.command?.forEach((rule: any) => this.visit(rule)); - ctx.endOfLine?.forEach((rule: any) => this.visit(rule)); - ctx.charLiteral?.forEach((rule: any) => this.visit(rule)); - ctx.symbolLiteral?.forEach((rule: any) => this.visit(rule)); - ctx.timeStampLiteral?.forEach((rule: any) => this.visit(rule)); - ctx.dateTimeLiteral?.forEach((rule: any) => this.visit(rule)); - ctx.miliTimeLiteral?.forEach((rule: any) => this.visit(rule)); - ctx.nanoTimeLiteral?.forEach((rule: any) => this.visit(rule)); - ctx.dateLiteral?.forEach((rule: any) => this.visit(rule)); - ctx.monthLiteral?.forEach((rule: any) => this.visit(rule)); - ctx.secondLiteral?.forEach((rule: any) => this.visit(rule)); - ctx.minuteLiteral?.forEach((rule: any) => this.visit(rule)); - ctx.binaryLiteral?.forEach((rule: any) => this.visit(rule)); - ctx.byteLiteral?.forEach((rule: any) => this.visit(rule)); - ctx.numberLiteral?.forEach((rule: any) => this.visit(rule)); - ctx.keyword?.forEach((rule: any) => this.visit(rule)); - ctx.identifier?.forEach((rule: any) => this.visit(rule)); - ctx.operator?.forEach((rule: any) => this.visit(rule)); - ctx.semiColon?.forEach((rule: any) => this.visit(rule)); - ctx.colon?.forEach((rule: any) => this.visit(rule)); - ctx.lparen?.forEach((rule: any) => this.visit(rule)); - ctx.rparen?.forEach((rule: any) => this.visit(rule)); - ctx.lbracket?.forEach((rule: any) => this.visit(rule)); - ctx.rbracket?.forEach((rule: any) => this.visit(rule)); - ctx.lcurly?.forEach((rule: any) => this.visit(rule)); - ctx.rcurly?.forEach((rule: any) => this.visit(rule)); - } - - doubleColon(ctx: any) { - const entity = this.createEntity({ - ...ctx.DoubleColon[0], - type: EntityType.DOUBLE_COLON, - }); - this.symbols.push(entity); + private push(ctx: IToken & Partial) { + const token = this.consume(ctx); + this.scopes.push(token); + return token; } - command(ctx: any) { - const entity = this.createEntity({ - ...ctx.Command[0], - type: EntityType.COMMAND, - }); - this.symbols.push(entity); + private pop() { + return this.scopes.pop(); } - endOfLine(ctx: any) { - const entity = this.createEntity({ - ...ctx.EndOfLine[0], - type: EntityType.ENDOFLINE, - }); - this.symbols.push(entity); + private scoped(delta = 0) { + let c = this.tokens.length - 1; + const anchor = this.tokens[c].scope; + while (anchor && c > 0) { + c--; + if (this.tokens[c] === anchor) { + break; + } + } + return c + delta; + } + + private peek( + type: TokenType[], + skip: TokenType[] = [], + count = 1, + scope = true, + ) { + let c = this.tokens.length - 1; + const anchor = this.tokens[c]; + let current: Token; + while (count > 0 && c > 0) { + c--; + current = this.tokens[c]; + if (current.statement !== anchor.statement) { + break; + } + if (scope && current.scope !== anchor.scope) { + continue; + } + if (skip.indexOf(current.type) >= 0) { + continue; + } + if (type.indexOf(current.type) >= 0) { + return current; + } + count--; + } + return undefined; } - charLiteral(ctx: any) { - const entity = this.createEntity({ - ...ctx.CharLiteral[0], - type: EntityType.CHAR_LITERAL, - }); - this.symbols.push(entity); + private assign(token: Token, tag?: string) { + token.tag = tag; + this.assigns.push(token); } - symbolLiteral(ctx: any) { - const entity = this.createEntity({ - ...ctx.SymbolLiteral[0], - type: EntityType.SYMBOL_LITERAL, - }); - this.symbols.push(entity); + script(ctx: ScriptCstChildren) { + ctx.expression?.forEach((rule) => this.visit(rule)); } - timeStampLiteral(ctx: any) { - const entity = this.createEntity({ - ...ctx.TimeStampLiteral[0], - type: EntityType.TIMESTAMP_LITERAL, - }); - this.symbols.push(entity); + expression(ctx: ExpressionCstChildren) { + ctx.assignment?.forEach((rule) => this.visit(rule)); + ctx.bracket?.forEach((rule) => this.visit(rule)); + ctx.command?.forEach((rule) => this.visit(rule)); + ctx.group?.forEach((rule) => this.visit(rule)); + ctx.iterator?.forEach((rule) => this.visit(rule)); + ctx.lambda?.forEach((rule) => this.visit(rule)); + ctx.operator?.forEach((rule) => this.visit(rule)); + ctx.semiColon?.forEach((rule) => this.visit(rule)); + ctx.sql?.forEach((rule) => this.visit(rule)); + ctx.symbol?.forEach((rule) => this.visit(rule)); } - dateTimeLiteral(ctx: any) { - const entity = this.createEntity({ - ...ctx.DateTimeLiteral[0], - type: EntityType.DATETIME_LITERAL, - }); - this.symbols.push(entity); + semiColon(ctx: SemiColonCstChildren) { + this.consume({ ...ctx.SemiColon[0], type: TokenType.SEMICOLON }); + this.statement++; } - miliTimeLiteral(ctx: any) { - const entity = this.createEntity({ - ...ctx.MiliTimeLiteral[0], - type: EntityType.MILITIME_LITERAL, - }); - this.symbols.push(entity); + sql(ctx: SqlCstChildren) { + this.push({ ...ctx.LSql[0], type: TokenType.SQL }); + ctx.expression?.forEach((rule) => this.visit(rule)); + this.pop(); } - nanoTimeLiteral(ctx: any) { - const entity = this.createEntity({ - ...ctx.NanoTimeLiteral[0], - type: EntityType.NANOTIME_LITERAL, - }); - this.symbols.push(entity); + bracket(ctx: BracketCstChildren) { + this.push({ ...ctx.LBracket[0], type: TokenType.BRACKET }); + ctx.expression?.forEach((rule) => this.visit(rule)); + this.pop(); } - dateLiteral(ctx: any) { - const entity = this.createEntity({ - ...ctx.DateLiteral[0], - type: EntityType.DATE_LITERAL, - }); - this.symbols.push(entity); + group(ctx: GroupCstChildren) { + const type = ctx.bracket ? TokenType.TABLE : TokenType.GROUP; + this.push({ ...ctx.LParen[0], type }); + ctx.bracket?.forEach((rule) => this.visit(rule)); + ctx.expression?.forEach((rule) => this.visit(rule)); + this.pop(); } - monthLiteral(ctx: any) { - const entity = this.createEntity({ - ...ctx.MonthLiteral[0], - type: EntityType.MONTH_LITERAL, - }); - this.symbols.push(entity); + lambda(ctx: LambdaCstChildren) { + this.push({ ...ctx.LCurly[0], type: TokenType.LAMBDA }); + if (ctx.bracket) { + this.visit(ctx.bracket); + for (let i = this.scoped(); i < this.tokens.length; i++) { + const token = this.tokens[i]; + if (token.type === TokenType.IDENTIFIER) { + this.assign(token, "ARGUMENT"); + } + } + } + ctx.expression?.forEach((rule) => this.visit(rule)); + this.pop(); } - secondLiteral(ctx: any) { - const entity = this.createEntity({ - ...ctx.SecondLiteral[0], - type: EntityType.SECOND_LITERAL, + assignment(ctx: AssignmentCstChildren) { + ctx.operator?.forEach((rule) => this.visit(rule)); + const assignment = this.consume({ + ...ctx.Colon[0], + type: TokenType.ASSIGN, }); - this.symbols.push(entity); + let symbol = this.peek(SymbolTypes, [ + TokenType.OPERATOR, + TokenType.BRACKET, + ]); + if (ctx.expression) { + this.visit(ctx.expression); + if (ctx.operator && ctx.expression[0].children.bracket) { + symbol = this.tokens[this.scoped(1)]; + } else { + if (ctx.expression[0].children.semiColon) { + symbol = undefined; + } + } + } else { + symbol = undefined; + } + if (symbol) { + if (!scope(assignment, NoAssignTypes)) { + if (ctx.Colon.length > 1) { + const local = this.assigns.find( + (token) => + token.type === TokenType.IDENTIFIER && + token.image === symbol?.image && + scope(token) === scope(assignment), + ); + if (!local) { + symbol.scope = undefined; + } + } + this.assign(symbol, "ASSIGNED"); + } + } } - minuteLiteral(ctx: any) { - const entity = this.createEntity({ - ...ctx.MinuteLiteral[0], - type: EntityType.MINUTE_LITERAL, - }); - this.symbols.push(entity); + symbol(ctx: SymbolCstChildren) { + ctx.literal?.forEach((rule) => this.visit(rule)); + ctx.reserved?.forEach((rule) => this.visit(rule)); + ctx.keyword?.forEach((rule) => this.visit(rule)); + ctx.identifier?.forEach((rule) => this.visit(rule)); } - binaryLiteral(ctx: any) { - const entity = this.createEntity({ - ...ctx.BinaryLiteral[0], - type: EntityType.BINARY_LITERAL, - }); - this.symbols.push(entity); + literal(ctx: LiteralCstChildren) { + ctx.binaryLiteral?.forEach((rule) => this.visit(rule)); + ctx.byteLiteral?.forEach((rule) => this.visit(rule)); + ctx.charLiteral?.forEach((rule) => this.visit(rule)); + ctx.dateLiteral?.forEach((rule) => this.visit(rule)); + ctx.dateTimeLiteral?.forEach((rule) => this.visit(rule)); + ctx.fileLiteral?.forEach((rule) => this.visit(rule)); + ctx.infinityLiteral?.forEach((rule) => this.visit(rule)); + ctx.monthLiteral?.forEach((rule) => this.visit(rule)); + ctx.numberLiteral?.forEach((rule) => this.visit(rule)); + ctx.symbolLiteral?.forEach((rule) => this.visit(rule)); + ctx.timeStampLiteral?.forEach((rule) => this.visit(rule)); } - byteLiteral(ctx: any) { - const entity = this.createEntity({ - ...ctx.ByteLiteral[0], - type: EntityType.BYTE_LITERAL, - }); - this.symbols.push(entity); + binaryLiteral(ctx: BinaryLiteralCstChildren) { + this.consume({ ...ctx.BinaryLiteral[0], type: TokenType.LITERAL }); } - numberLiteral(ctx: any) { - const entity = this.createEntity({ - ...ctx.NumberLiteral[0], - type: EntityType.NUMBER_LITERAL, - }); - this.symbols.push(entity); + byteLiteral(ctx: ByteLiteralCstChildren) { + this.consume({ ...ctx.ByteLiteral[0], type: TokenType.LITERAL }); } - keyword(ctx: any) { - const entity = this.createEntity({ - ...ctx.Keyword[0], - type: EntityType.KEYWORD, - }); - this.symbols.push(entity); + charLiteral(ctx: CharLiteralCstChildren) { + this.consume({ ...ctx.CharLiteral[0], type: TokenType.LITERAL }); + } - switch (entity.image) { - case "select": - this.scopes.push(entity); - break; - case "from": - this.scopes.pop(); - break; - } + dateLiteral(ctx: DateLiteralCstChildren) { + this.consume({ ...ctx.DateLiteral[0], type: TokenType.LITERAL }); } - identifier(ctx: any) { - const entity = this.createEntity({ - ...ctx.Identifier[0], - type: EntityType.IDENTIFIER, - }); - this.symbols.push(entity); + dateTimeLiteral(ctx: DateTimeLiteralCstChildren) { + this.consume({ ...ctx.DateTimeLiteral[0], type: TokenType.LITERAL }); } - operator(ctx: any) { - const entity = this.createEntity({ - ...ctx.Operator[0], - type: EntityType.OPERATOR, - }); - this.symbols.push(entity); + fileLiteral(ctx: FileLiteralCstChildren) { + this.consume({ ...ctx.FileLiteral[0], type: TokenType.LITERAL }); } - semiColon(ctx: any) { - const entity = this.createEntity({ - ...ctx.SemiColon[0], - type: EntityType.SEMICOLON, - }); - this.symbols.push(entity); + infinityLiteral(ctx: InfinityLiteralCstChildren) { + this.consume({ ...ctx.InfinityLiteral[0], type: TokenType.LITERAL }); } - colon(ctx: any) { - const entity = this.createEntity({ - ...ctx.Colon[0], - type: EntityType.COLON, - }); - this.symbols.push(entity); + monthLiteral(ctx: MonthLiteralCstChildren) { + this.consume({ ...ctx.MonthLiteral[0], type: TokenType.LITERAL }); } - lparen(ctx: any) { - const entity = this.createEntity({ - ...ctx.LParen[0], - type: EntityType.LPAREN, - }); - this.symbols.push(entity); - this.scopes.push(entity); + timeLiteral(ctx: TimeLiteralCstChildren) { + this.consume({ ...ctx.TimeLiteral[0], type: TokenType.LITERAL }); } - rparen(ctx: any) { - const entity = this.createEntity({ - ...ctx.RParen[0], - type: EntityType.RPAREN, - }); - this.scopes.pop(); - this.symbols.push(entity); + numberLiteral(ctx: NumberLiteralCstChildren) { + this.consume({ ...ctx.NumberLiteral[0], type: TokenType.LITERAL }); } - lbracket(ctx: any) { - const entity = this.createEntity({ - ...ctx.LBracket[0], - type: EntityType.LBRACKET, - }); - this.symbols.push(entity); - this.scopes.push(entity); + symbolLiteral(ctx: SymbolLiteralCstChildren) { + this.consume({ ...ctx.SymbolLiteral[0], type: TokenType.LITERAL }); } - rbracket(ctx: any) { - const entity = this.createEntity({ - ...ctx.RBracket[0], - type: EntityType.RBRACKET, - }); - this.scopes.pop(); - this.symbols.push(entity); + timeStampLiteral(ctx: TimeStampLiteralCstChildren) { + this.consume({ ...ctx.TimeStampLiteral[0], type: TokenType.LITERAL }); } - lcurly(ctx: any) { - const entity = this.createEntity({ - ...ctx.LCurly[0], - type: EntityType.LCURLY, - }); - this.symbols.push(entity); - this.scopes.push(entity); + reserved(ctx: ReservedCstChildren) { + this.consume({ ...ctx.Reserved[0], type: TokenType.RESERVED }); } - rcurly(ctx: any) { - const entity = this.createEntity({ - ...ctx.RCurly[0], - type: EntityType.RCURLY, - }); - this.scopes.pop(); - this.symbols.push(entity); + keyword(ctx: KeywordCstChildren) { + this.consume({ ...ctx.Keyword[0], type: TokenType.KEYWORD }); + } + + identifier(ctx: IdentifierCstChildren) { + this.consume({ ...ctx.Identifier[0], type: TokenType.IDENTIFIER }); + } + + iterator(ctx: IteratorCstChildren) { + this.consume({ ...ctx.Iterator[0], type: TokenType.ITERATOR }); + } + + command(ctx: CommandCstChildren) { + this.consume({ ...ctx.Command[0], type: TokenType.COMMAND }); } -} -export enum EntityType { - UNKNOWN = "UNKNOWN", - DOUBLE_COLON = "DOUBLE_COLON", - COMMAND = "COMMAND", - ENDOFLINE = "ENDOFLINE", - CHAR_LITERAL = "CHAR_LITERAL", - SYMBOL_LITERAL = "SYMBOL_LITERAL", - TIMESTAMP_LITERAL = "TIMESTAMP_LITERAL", - DATETIME_LITERAL = "DATETIME_LITERAL", - MILITIME_LITERAL = "MILITIME_LITERAL", - NANOTIME_LITERAL = "NANOTIME_LITERAL", - DATE_LITERAL = "DATE_LITERAL", - MONTH_LITERAL = "MONTH_LITERAL", - SECOND_LITERAL = "SECOND_LITERAL", - MINUTE_LITERAL = "MINUTE_LITERAL", - BINARY_LITERAL = "BINARY_LITERAL", - BYTE_LITERAL = "BYTE_LITERAL", - NUMBER_LITERAL = "NUMBER_LITERAL", - KEYWORD = "KEYWORD", - IDENTIFIER = "IDENTIFIER", - OPERATOR = "OPERATOR", - SEMICOLON = "SEMICOLON", - COLON = "COLON", - LPAREN = "LPAREN", - RPAREN = "RPAREN", - LBRACKET = "LBRACKET", - RBRACKET = "RBRACKET", - LCURLY = "LCURLY", - RCURLY = "RCURLY", + operator(ctx: OperatorCstChildren) { + this.consume({ ...ctx.Operator[0], type: TokenType.OPERATOR }); + } } -export interface Entity { - type: EntityType; +export interface Token { + type: TokenType; + name: string; + scope?: Token; + tag?: string; + statement: number; image: string; startOffset: number; endOffset: number; - scope?: Entity; } export interface QAst { - script: Entity[]; - assign: Entity[]; + script: Token[]; + assign: Token[]; +} + +export const enum TokenType { + LITERAL, + RESERVED, + KEYWORD, + IDENTIFIER, + SQL, + GROUP, + LAMBDA, + BRACKET, + TABLE, + ITERATOR, + OPERATOR, + COMMAND, + ASSIGN, + SEMICOLON, } -export function getNameScope(entity: Entity): Entity | undefined { +export const SymbolTypes = [ + TokenType.LITERAL, + TokenType.RESERVED, + TokenType.KEYWORD, + TokenType.IDENTIFIER, +]; + +export const NoAssignTypes = [TokenType.TABLE, TokenType.SQL]; + +export function scope(token: Token, types = [TokenType.LAMBDA]) { let scope; - while ((scope = entity.scope)) { - if (scope.type === EntityType.LCURLY) { + while ((scope = token.scope)) { + if (types.indexOf(scope.type) >= 0) { break; } - entity = scope; + token = scope; } return scope; } -export function isLiteral(entity: Entity) { - switch (entity.type) { - case EntityType.CHAR_LITERAL: - case EntityType.SYMBOL_LITERAL: - case EntityType.TIMESTAMP_LITERAL: - case EntityType.DATETIME_LITERAL: - case EntityType.MILITIME_LITERAL: - case EntityType.NANOTIME_LITERAL: - case EntityType.DATE_LITERAL: - case EntityType.MONTH_LITERAL: - case EntityType.SECOND_LITERAL: - case EntityType.MINUTE_LITERAL: - case EntityType.BINARY_LITERAL: - case EntityType.BYTE_LITERAL: - case EntityType.NUMBER_LITERAL: - return true; - default: - return false; - } -} - -export function analyze(cstNode: CstNode | CstNode[]): QAst { +export function analyze(cstNode: CstNode | CstNode[]) { const visitor = new QVisitor(); visitor.visit(cstNode); - - const script = visitor.symbols; - const ast: QAst = { - script, - assign: [], - }; - - for (let i = 0; i < script.length; i++) { - switch (script[i].type) { - case EntityType.COLON: - case EntityType.DOUBLE_COLON: - if (script[i].scope?.type === EntityType.LPAREN) { - const start = script.find( - (entity) => entity.scope === script[i].scope - ); - if (start?.type === EntityType.LBRACKET) { - break; - } - } - if (script[i].scope?.image === "select") { - break; - } - let entity; - if ( - script[i + 1]?.type === EntityType.LBRACKET && - script[i - 1]?.type === EntityType.OPERATOR - ) { - entity = script[i + 2]; - } else { - let c = i - 1; - c >= 0 && script[c].type === EntityType.OPERATOR && c--; - while (c >= 0 && script[c].scope !== script[i].scope) { - c--; - } - c >= 0 && script[c].type === EntityType.LBRACKET && c--; - entity = script[c]; - } - if (entity) { - if ( - entity.type === EntityType.KEYWORD || - entity.type === EntityType.IDENTIFIER || - isLiteral(entity) - ) { - if ( - script[i + 1]?.type !== EntityType.SEMICOLON && - script[i + 1]?.type !== EntityType.ENDOFLINE - ) { - if (script[i].type === EntityType.DOUBLE_COLON) { - entity.scope = undefined; - } - ast.assign.push(entity); - } - } - } - break; - case EntityType.LBRACKET: - let c = i - 1; - while (c >= 0 && script[c].type === EntityType.ENDOFLINE) { - c--; - } - if (script[c]?.type === EntityType.LCURLY) { - let c = i + 1; - const anchor = script[c]?.scope; - while (c < script.length && anchor === script[c].scope) { - ast.assign.push(script[c]); - c++; - } - } - break; - } - } - - return ast; + return visitor.ast(); } diff --git a/server/src/qLangServer.ts b/server/src/qLangServer.ts index 6d45bc59..ed5f3f13 100644 --- a/server/src/qLangServer.ts +++ b/server/src/qLangServer.ts @@ -23,10 +23,12 @@ import { Connection, Diagnostic, DiagnosticSeverity, + DidChangeConfigurationParams, DocumentHighlight, DocumentSymbolParams, Hover, InitializeParams, + LSPAny, Location, Position, Range, @@ -47,12 +49,20 @@ import { } from "vscode-languageserver/node"; import { lint } from "./linter"; import { RuleSeverity } from "./linter/rules"; -import { EntityType, IdentifierPattern, analyze, getNameScope } from "./parser"; +import { TokenType, IdentifierPattern, scope, analyze } from "./parser"; import { KeywordPattern } from "./parser/keywords"; import { QParser } from "./parser/parser"; import { AnalyzerContent, GlobalSettings, Keyword } from "./utils/analyzer"; +import { IToken } from "chevrotain"; + +interface Settings { + linting: boolean; +} + +const defaultSettings: Settings = { linting: true }; export default class QLangServer { + private settings: Settings = defaultSettings; public connection: Connection; public documents: TextDocuments = new TextDocuments( TextDocument @@ -70,6 +80,7 @@ export default class QLangServer { this.analyzer.analyzeWorkspace(); }); this.documents.onDidClose((e) => { + this.connection.sendDiagnostics({ uri: e.document.uri, diagnostics: [] }); this.documentSettings.delete(e.document.uri); }); this.documents.onDidChangeContent(async (change) => { @@ -100,6 +111,9 @@ export default class QLangServer { this.connection.languages.callHierarchy.onOutgoingCalls( this.onOutgoingCallsCallHierarchy.bind(this) ); + this.connection.onDidChangeConfiguration( + this.onDidChangeConfiguration.bind(this) + ); } public static async initialize( @@ -186,6 +200,15 @@ export default class QLangServer { } } + public setSettings(settings: LSPAny) { + this.settings = settings; + this.documents.all().forEach((doc) => this.validateTextDocument(doc)); + } + + private onDidChangeConfiguration(change: DidChangeConfigurationParams) { + this.setSettings(change.settings?.kdb || defaultSettings); + } + private onCompletion(params: TextDocumentPositionParams): CompletionItem[] { const keyword = this.getKeyword(params); if (!keyword) { @@ -363,7 +386,7 @@ export default class QLangServer { const { script, assign } = analyze(cst); const symbol = script.find( (entity) => - entity.type === EntityType.IDENTIFIER && + entity.type === TokenType.IDENTIFIER && offset >= entity.startOffset && offset <= entity.endOffset ); @@ -371,17 +394,16 @@ export default class QLangServer { return null; } let targets; - const symbolScope = getNameScope(symbol); + const symbolScope = scope(symbol); const local = assign.find( (entity) => symbol.image === entity.image && symbolScope && - symbolScope === getNameScope(entity) + symbolScope === scope(entity) ); if (local) { const exists = assign.find( - (entity) => - entity.image === newName && symbolScope === getNameScope(entity) + (entity) => entity.image === newName && symbolScope === scope(entity) ); if (exists) { return null; @@ -390,35 +412,33 @@ export default class QLangServer { (entity) => symbol.image === entity.image && symbolScope && - symbolScope === getNameScope(entity) && - entity.type === EntityType.IDENTIFIER + symbolScope === scope(entity) && + entity.type === TokenType.IDENTIFIER ); } else { const global = assign.find( - (entity) => !getNameScope(entity) && symbol.image === entity.image + (entity) => !scope(entity) && symbol.image === entity.image ); if (!global) { return null; } const exists = assign.find( - (entity) => !getNameScope(entity) && entity.image === newName + (entity) => !scope(entity) && entity.image === newName ); if (exists) { return null; } targets = script.filter((entity) => { if ( - entity.type !== EntityType.IDENTIFIER || + entity.type !== TokenType.IDENTIFIER || entity.image !== symbol.image ) { return false; } - const scope = getNameScope(entity); + const scoped = scope(entity); const local = assign.find( (ident) => - ident.image === entity.image && - scope && - getNameScope(ident) === scope + ident.image === entity.image && scoped && scope(ident) === scoped ); return !local; }); @@ -478,25 +498,31 @@ export default class QLangServer { const cst = QParser.parse(text); const diagnostics: Diagnostic[] = []; let problems = QParser.errors.length; - if (problems > 1000) { - problems = 1000; + if (problems > 99) { + problems = 99; } for (let i = 0; i < problems; i++) { const error = QParser.errors[i]; + let offset = -1; + if ("previousToken" in error) { + const token = error.previousToken as IToken; + offset = token.startOffset || -1; + } + if (offset < 0) { + offset = error.token.startOffset || 0; + } const diagnostic: Diagnostic = { severity: DiagnosticSeverity.Error, range: { - start: textDocument.positionAt(error.token.startOffset), - end: textDocument.positionAt( - error.token.endOffset || error.token.startOffset - ), + start: textDocument.positionAt(offset), + end: textDocument.positionAt(offset), }, message: (error.message || error.name).replace(/\s+/g, " "), source: "kdb.QParser", }; diagnostics.push(diagnostic); } - if (problems === 0) { + if (this.settings.linting && problems === 0) { const ast = analyze(cst); const results = lint(ast); for (const result of results) { @@ -505,7 +531,9 @@ export default class QLangServer { ? DiagnosticSeverity.Error : result.severity === RuleSeverity.WARNING ? DiagnosticSeverity.Warning - : DiagnosticSeverity.Information; + : result.severity === RuleSeverity.INFO + ? DiagnosticSeverity.Information + : DiagnosticSeverity.Hint; for (const problem of result.problems) { const diagnostic: Diagnostic = { severity, diff --git a/server/src/server.ts b/server/src/server.ts index f5a206a0..bbfe0936 100644 --- a/server/src/server.ts +++ b/server/src/server.ts @@ -13,6 +13,7 @@ import { Connection, + DidChangeConfigurationNotification, InitializeParams, InitializeResult, ProposedFeatures, @@ -21,14 +22,29 @@ import { createConnection } from "vscode-languageserver/node"; import QLangServer from "./qLangServer"; const connection: Connection = createConnection(ProposedFeatures.all); +let server: QLangServer; connection.onInitialize( async (params: InitializeParams): Promise => { - const server = await QLangServer.initialize(connection, params); + server = await QLangServer.initialize(connection, params); return { capabilities: server.capabilities(), }; } ); +connection.onInitialized(() => { + connection.client.register(DidChangeConfigurationNotification.type, { + section: "kdb", + }); + + if (connection.workspace) { + connection.workspace.getConfiguration("kdb").then((settings) => { + if (server) { + server.setSettings(settings); + } + }); + } +}); + connection.listen(); diff --git a/src/commands/dataSourceCommand.ts b/src/commands/dataSourceCommand.ts index e25488d8..c2c50458 100644 --- a/src/commands/dataSourceCommand.ts +++ b/src/commands/dataSourceCommand.ts @@ -64,13 +64,13 @@ export async function addDataSource(): Promise { fs.writeFileSync(filePath, JSON.stringify(defaultDataSourceContent)); window.showInformationMessage( - `Created ${fileName} in ${kdbDataSourcesFolderPath}.` + `Created ${fileName} in ${kdbDataSourcesFolderPath}.`, ); } export async function renameDataSource( oldName: string, - newName: string + newName: string, ): Promise { const kdbDataSourcesFolderPath = createKdbDataSourcesFolder(); if (!kdbDataSourcesFolderPath) { @@ -79,11 +79,11 @@ export async function renameDataSource( const oldFilePath = path.join( kdbDataSourcesFolderPath, - `${oldName}${ext.kdbDataSourceFileExtension}` + `${oldName}${ext.kdbDataSourceFileExtension}`, ); const newFilePath = path.join( kdbDataSourcesFolderPath, - `${newName}${ext.kdbDataSourceFileExtension}` + `${newName}${ext.kdbDataSourceFileExtension}`, ); const dataSourceContent = fs.readFileSync(oldFilePath, "utf8"); @@ -101,7 +101,7 @@ export async function renameDataSource( } export async function deleteDataSource( - dataSource: KdbDataSourceTreeItem + dataSource: KdbDataSourceTreeItem, ): Promise { const kdbDataSourcesFolderPath = createKdbDataSourcesFolder(); if (!kdbDataSourcesFolderPath) { @@ -110,28 +110,28 @@ export async function deleteDataSource( const dataSourceFilePath = path.join( kdbDataSourcesFolderPath, - `${dataSource.label}${ext.kdbDataSourceFileExtension}` + `${dataSource.label}${ext.kdbDataSourceFileExtension}`, ); if (fs.existsSync(dataSourceFilePath)) { fs.unlinkSync(dataSourceFilePath); window.showInformationMessage( - `Deleted ${dataSource.label} from ${kdbDataSourcesFolderPath}.` + `Deleted ${dataSource.label} from ${kdbDataSourcesFolderPath}.`, ); } } export async function openDataSource( dataSource: KdbDataSourceTreeItem, - uri: Uri + uri: Uri, ): Promise { const kdbDataSourcesFolderPath = createKdbDataSourcesFolder(); Object.assign(ext.insightsMeta, await getMeta()); if (!ext.insightsMeta.assembly) { ext.outputChannel.appendLine( - `To edit or run a datasource you need to be connected to an Insights server` + `To edit or run a datasource you need to be connected to an Insights server`, ); window.showErrorMessage( - "To edit or run a datasource you need to be connected to an Insights server" + "To edit or run a datasource you need to be connected to an Insights server", ); } if (!kdbDataSourcesFolderPath) { @@ -140,12 +140,12 @@ export async function openDataSource( fs.readFile( path.join( kdbDataSourcesFolderPath, - `${dataSource.label}${ext.kdbDataSourceFileExtension}` + `${dataSource.label}${ext.kdbDataSourceFileExtension}`, ), (err, data) => { if (err) { ext.outputChannel.appendLine( - `Error reading the file ${dataSource.label}${ext.kdbDataSourceFileExtension}, this file maybe doesn't exist` + `Error reading the file ${dataSource.label}${ext.kdbDataSourceFileExtension}, this file maybe doesn't exist`, ); window.showErrorMessage("Error reading file"); return; @@ -154,12 +154,12 @@ export async function openDataSource( const datasourceContent: DataSourceFiles = JSON.parse(data.toString()); DataSourcesPanel.render(uri, datasourceContent); } - } + }, ); } export async function saveDataSource( - dataSourceForm: DataSourceFiles + dataSourceForm: DataSourceFiles, ): Promise { const kdbDataSourcesFolderPath = createKdbDataSourcesFolder(); if (!kdbDataSourcesFolderPath) { @@ -180,7 +180,7 @@ export async function saveDataSource( const dataSourceFilePath = path.join( kdbDataSourcesFolderPath, - `${dataSourceForm.name}${ext.kdbDataSourceFileExtension}` + `${dataSourceForm.name}${ext.kdbDataSourceFileExtension}`, ); if (fs.existsSync(dataSourceFilePath)) { @@ -190,7 +190,7 @@ export async function saveDataSource( } export async function populateScratchpad( - dataSourceForm: DataSourceFiles + dataSourceForm: DataSourceFiles, ): Promise { const scratchpadVariable: InputBoxOptions = { prompt: scratchpadVariableInput.prompt, @@ -204,60 +204,69 @@ export async function populateScratchpad( await importScratchpad(outputVariable!, dataSourceForm!); } else { ext.outputChannel.appendLine( - `Invalid scratchpad output variable name: ${outputVariable}` + `Invalid scratchpad output variable name: ${outputVariable}`, ); } }); } export async function runDataSource( - dataSourceForm: DataSourceFiles + dataSourceForm: DataSourceFiles, ): Promise { - Object.assign(ext.insightsMeta, await getMeta()); - if (!ext.insightsMeta.assembly) { - ext.outputChannel.appendLine( - `To run a datasource you need to be connected to an Insights server` - ); - window.showErrorMessage( - "To run a datasource you need to be connected to an Insights server" - ); + if (DataSourcesPanel.running) { return; } + DataSourcesPanel.running = true; - dataSourceForm.insightsNode = getConnectedInsightsNode(); - const fileContent = dataSourceForm; - commands.executeCommand("kdb-results.focus"); - - let res: any; - const selectedType = getSelectedType(fileContent); + try { + Object.assign(ext.insightsMeta, await getMeta()); + if (!ext.insightsMeta.assembly) { + ext.outputChannel.appendLine( + `To run a datasource you need to be connected to an Insights server`, + ); + window.showErrorMessage( + "To run a datasource you need to be connected to an Insights server", + ); + return; + } - switch (selectedType) { - case "API": - res = await runApiDataSource(fileContent); - break; - case "QSQL": - res = await runQsqlDataSource(fileContent); - break; - case "SQL": - default: - res = await runSqlDataSource(fileContent); - break; - } + dataSourceForm.insightsNode = getConnectedInsightsNode(); + const fileContent = dataSourceForm; + + let res: any; + const selectedType = getSelectedType(fileContent); + ext.isDatasourceExecution = true; + switch (selectedType) { + case "API": + res = await runApiDataSource(fileContent); + break; + case "QSQL": + res = await runQsqlDataSource(fileContent); + break; + case "SQL": + default: + res = await runSqlDataSource(fileContent); + break; + } - if (res.error) { - window.showErrorMessage(res.error); - } else if (ext.resultsViewProvider.isVisible()) { - writeQueryResultsToView( - res, - getQuery(fileContent, selectedType), - selectedType - ); - } else { - writeQueryResultsToConsole( - res, - getQuery(fileContent, selectedType), - selectedType - ); + ext.isDatasourceExecution = false; + if (res.error) { + window.showErrorMessage(res.error); + } else if (ext.resultsViewProvider.isVisible()) { + writeQueryResultsToView( + res, + getQuery(fileContent, selectedType), + selectedType, + ); + } else { + writeQueryResultsToConsole( + res, + getQuery(fileContent, selectedType), + selectedType, + ); + } + } finally { + DataSourcesPanel.running = false; } } @@ -276,22 +285,22 @@ export function getSelectedType(fileContent: DataSourceFiles): string { } export async function runApiDataSource( - fileContent: DataSourceFiles + fileContent: DataSourceFiles, ): Promise { const isTimeCorrect = checkIfTimeParamIsCorrect( fileContent.dataSource.api.startTS, - fileContent.dataSource.api.endTS + fileContent.dataSource.api.endTS, ); if (!isTimeCorrect) { window.showErrorMessage( - "The time parameters(startTS and endTS) are not correct, please check the format or if the startTS is before the endTS" + "The time parameters(startTS and endTS) are not correct, please check the format or if the startTS is before the endTS", ); return; } const apiBody = getApiBody(fileContent); const apiCall = await getDataInsights( ext.insightsServiceGatewayUrls.data, - JSON.stringify(apiBody) + JSON.stringify(apiBody), ); if (apiCall?.error) { @@ -305,7 +314,7 @@ export async function runApiDataSource( } export function getApiBody( - fileContent: DataSourceFiles + fileContent: DataSourceFiles, ): Partial { const api = fileContent.dataSource.api; @@ -342,7 +351,7 @@ export function getApiBody( if (labels.length > 0) { apiBody.labels = Object.assign( {}, - ...labels.map((label) => ({ [label.key]: label.value })) + ...labels.map((label) => ({ [label.key]: label.value })), ); } @@ -393,7 +402,7 @@ export function getApiBody( } export async function runQsqlDataSource( - fileContent: DataSourceFiles + fileContent: DataSourceFiles, ): Promise { const assembly = fileContent.dataSource.qsql.selectedTarget.slice(0, -4); const target = fileContent.dataSource.qsql.selectedTarget.slice(-3); @@ -404,7 +413,7 @@ export async function runQsqlDataSource( }; const qsqlCall = await getDataInsights( ext.insightsServiceGatewayUrls.qsql, - JSON.stringify(qsqlBody) + JSON.stringify(qsqlBody), ); if (qsqlCall?.error) { @@ -418,14 +427,14 @@ export async function runQsqlDataSource( } export async function runSqlDataSource( - fileContent: DataSourceFiles + fileContent: DataSourceFiles, ): Promise { const sqlBody = { query: fileContent.dataSource.sql.query, }; const sqlCall = await getDataInsights( ext.insightsServiceGatewayUrls.sql, - JSON.stringify(sqlBody) + JSON.stringify(sqlBody), ); if (sqlCall?.error) { @@ -440,7 +449,7 @@ export async function runSqlDataSource( export function getQuery( fileContent: DataSourceFiles, - selectedType: string + selectedType: string, ): string { switch (selectedType) { case "API": diff --git a/src/commands/serverCommand.ts b/src/commands/serverCommand.ts index 95becbdc..e7cdac2a 100644 --- a/src/commands/serverCommand.ts +++ b/src/commands/serverCommand.ts @@ -13,7 +13,7 @@ import axios, { AxiosRequestConfig } from "axios"; import { readFileSync } from "fs-extra"; -import jwt_decode from "jwt-decode"; +import { jwtDecode } from "jwt-decode"; import { join } from "path"; import * as url from "url"; import { @@ -341,16 +341,8 @@ export async function removeConnection(viewItem: KdbNode): Promise { } export async function connectInsights(viewItem: InsightsNode): Promise { - if (env.remoteName === "ssh-remote") { - window.showErrorMessage( - "Connecting to a kdb Insights Enterprise server with a remote connection is not supported.", - "" - ); - return; - } - commands.executeCommand("kdb-results.focus"); - + ext.context.secrets.delete(viewItem.details.alias); await getCurrentToken(viewItem.details.server, viewItem.details.alias); ext.outputChannel.appendLine( @@ -533,7 +525,7 @@ export async function importScratchpad( return undefined; } - const username = jwt_decode(token.accessToken); + const username = jwtDecode(token.accessToken); if (username === undefined || username.preferred_username === "") { ext.outputChannel.appendLine( "JWT did not contain a valid preferred username" @@ -604,7 +596,7 @@ export async function getScratchpadQuery( window.showErrorMessage("Failed to retrieve access token for insights"); return undefined; } - const username = jwt_decode(token.accessToken); + const username = jwtDecode(token.accessToken); if (username === undefined || username.preferred_username === "") { ext.outputChannel.appendLine( "JWT did not contain a valid preferred username" @@ -812,7 +804,7 @@ export async function executeQuery( query = sanitizeQuery(query); if (ext.resultsViewProvider.isVisible()) { - const queryRes = await ext.connection.executeQuery(query, context, false); + const queryRes = await ext.connection.executeQuery(query, context, true); writeQueryResultsToView(queryRes, query); } else { const queryRes = await ext.connection.executeQuery(query, context, true); diff --git a/src/extension.ts b/src/extension.ts index 58e12e2b..fd257d1b 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -56,6 +56,7 @@ import { connectInsights, disconnect, enableTLS, + executeQuery, removeConnection, removeInsightsConnection, runQuery, @@ -132,8 +133,12 @@ export async function activate(context: ExtensionContext) { ext.outputChannel.appendLine("kdb extension is now active!"); - // check for installed q runtime - await checkLocalInstall(); + try { + // check for installed q runtime + await checkLocalInstall(); + } catch (err) { + window.showErrorMessage(`${err}`); + } context.subscriptions.push( window.registerWebviewViewProvider( @@ -299,7 +304,18 @@ export async function activate(context: ExtensionContext) { runQuery(ExecutionTypes.PythonQueryFile); ext.connection?.update(); } - ) + ), + commands.registerCommand("kdb.execute.entireFile", async (uri: Uri) => { + if (!uri) { + return; + } + const isPython = uri.fsPath.endsWith(".py"); + if (uri.fsPath.endsWith(".q") || isPython) { + const content = await workspace.fs.readFile(uri); + const query = content.toString(); + await executeQuery(query, undefined, isPython); + } + }) ); const lastResult: QueryResult | undefined = undefined; diff --git a/src/extensionVariables.ts b/src/extensionVariables.ts index f7783353..9d08c7fa 100644 --- a/src/extensionVariables.ts +++ b/src/extensionVariables.ts @@ -40,6 +40,7 @@ export namespace ext { export let serverObjects: ServerObject; export let openSslVersion: string | null; export let resultPanelCSV: string; + export let isDatasourceExecution: boolean; export const rowLimit = 150000000; export let connection: Connection | undefined; @@ -102,7 +103,6 @@ export namespace ext { export const insightsAuthUrls = { authURL: "auth/realms/insights/protocol/openid-connect/auth ", - callbackURL: "http://localhost:9010/redirect", revoke: "auth/realms/insights/protocol/openid-connect/revoke", tokenURL: "auth/realms/insights/protocol/openid-connect/token", scratchpadURL: "servicebroker/scratchpad/display", diff --git a/src/ipc/cClasses.ts b/src/ipc/cClasses.ts index c95ee4b2..bf2a63c5 100644 --- a/src/ipc/cClasses.ts +++ b/src/ipc/cClasses.ts @@ -16,7 +16,7 @@ import Tools from "./tools"; function stringifyTemporal( temporal: DDateClass | DDateTimeClass | DMonthClass, - stringify: () => string + stringify: () => string, ): string { const i = temporal.i; @@ -48,7 +48,9 @@ export class DTimestampClass { } toString(): string { - return this.toDate().formatNano("YYYY-MM-DD HH:mm:ss.SSSSSSSSS"); + return this.toDate() + .formatNano("YYYY-MM-DD HH:mm:ss.SSSSSSSSS") + .replace(" ", "D"); } } export class DMonthClass { @@ -84,7 +86,7 @@ export class DDateClass { toString(): string { return stringifyTemporal(this, () => - moment(new Date(this.i)).utcOffset(0).format("YYYY-MM-DD") + moment(new Date(this.i)).utcOffset(0).format("YYYY-MM-DD"), ); } } @@ -103,7 +105,7 @@ export class DDateTimeClass { toString(): string { return stringifyTemporal(this, () => - this.toDate().format("YYYY-MM-DD HH:mm:ss.SSS") + this.toDate().format("YYYY-MM-DD HH:mm:ss.SSS").replace(" ", "T"), ); } } diff --git a/src/models/connection.ts b/src/models/connection.ts index 6766cb60..d8f859cb 100644 --- a/src/models/connection.ts +++ b/src/models/connection.ts @@ -15,10 +15,7 @@ import * as nodeq from "node-q"; import { commands, window } from "vscode"; import { ext } from "../extensionVariables"; import { delay } from "../utils/core"; -import { - convertArrayOfArraysToObjects, - handleQueryResults, -} from "../utils/execution"; +import { convertStringToArray, handleQueryResults } from "../utils/execution"; import { queryWrapper } from "../utils/queryUtils"; import { QueryResult, QueryResultType } from "./queryResult"; @@ -26,6 +23,8 @@ export class Connection { private options: nodeq.ConnectionParameters; private connection?: nodeq.Connection; public connected: boolean; + private isError: boolean = false; + private result?: string; constructor(connectionString: string, creds?: string[], tls?: boolean) { const params = connectionString.split(":"); @@ -69,7 +68,7 @@ export class Connection { public async execute(command: string): Promise { let result; - + let error; // try 5 times, then fail let retryCount = 0; while (this.connection === undefined) { @@ -81,7 +80,11 @@ export class Connection { } this.connection.k(command, function (err: Error, res: string) { - if (err) throw err; + if (err) { + error = err; + result = ""; + return; + } result = res; }); @@ -90,24 +93,23 @@ export class Connection { await delay(500); } + if (error) { + throw error; + } + return result; } public async executeQuery( command: string, context?: string, - stringify?: boolean + stringify?: boolean, ): Promise { - let result; - let retryCount = 0; - while (this.connection === undefined) { - if (retryCount > ext.maxRetryCount) { - return "timeout"; - } - await delay(500); - retryCount++; - } + await this.waitForConnection(); + if (!this.connection) { + return "timeout"; + } const wrapper = queryWrapper(); this.connection.k( wrapper, @@ -116,34 +118,67 @@ export class Connection { !!stringify, (err: Error, res: QueryResult) => { if (err) { - result = handleQueryResults(err.toString(), QueryResultType.Error); - } else if (res) { - if (res.errored) { - result = handleQueryResults( - res.error + (res.backtrace ? "\n" + res.backtrace : ""), - QueryResultType.Error - ); - } else { - result = res.result; - } + this.isError = true; + this.result = handleQueryResults( + err.toString(), + QueryResultType.Error, + ); } - } + if (res) { + this.handleQueryResult(res); + } + }, ); - while (result === undefined || result === null) { + const result = await this.waitForResult(); + + if (ext.resultsViewProvider.isVisible() && stringify) { + if (this.isError) { + this.isError = false; + return result; + } + return convertStringToArray(result); + } + + return result; + } + + private async waitForConnection(): Promise { + let retryCount = 0; + while (this.connection === undefined) { + if (retryCount > ext.maxRetryCount) { + throw new Error("timeout"); + } await delay(500); + retryCount++; } + } - if (!stringify) { - result = convertArrayOfArraysToObjects(result); + private handleQueryResult = (res: QueryResult): void => { + if (res.errored) { + this.isError = true; + this.result = handleQueryResults( + res.error + (res.backtrace ? "\n" + res.backtrace : ""), + QueryResultType.Error, + ); + } else { + this.result = res.result; } + }; + private async waitForResult(): Promise { + while (this.result === undefined || this.result === null) { + await delay(500); + } + const result = this.result; + this.result = undefined; return result; } public async executeQueryRaw(command: string): Promise { let result; let retryCount = 0; + let error; while (this.connection === undefined) { if (retryCount > ext.maxRetryCount) { return "timeout"; @@ -152,7 +187,11 @@ export class Connection { retryCount++; } this.connection.k(command, (err: Error, res: string) => { - if (err) throw err; + if (err) { + error = err; + result = ""; + return; + } result = res; }); @@ -160,6 +199,10 @@ export class Connection { await delay(500); } + if (error) { + throw error; + } + return result; } @@ -171,17 +214,17 @@ export class Connection { ext.serverProvider.reload(); window.showErrorMessage( - `Connection to server ${this.options.host}:${this.options.port} failed! Details: ${err?.message}` + `Connection to server ${this.options.host}:${this.options.port} failed! Details: ${err?.message}`, ); ext.outputChannel.appendLine( - `Connection to server ${this.options.host}:${this.options.port} failed! Details: ${err?.message}` + `Connection to server ${this.options.host}:${this.options.port} failed! Details: ${err?.message}`, ); return; } conn.addListener("close", () => { ext.outputChannel.appendLine( - `Connection stopped from ${this.options.host}:${this.options.port}` + `Connection stopped from ${this.options.host}:${this.options.port}`, ); this.connected = false; }); @@ -207,7 +250,7 @@ export class Connection { this.connection?.k(globalQuery, (err, result) => { if (err) { window.showErrorMessage( - `Failed to retrieve kdb+ global variables: '${err.message}` + `Failed to retrieve kdb+ global variables: '${err.message}`, ); return; } @@ -259,7 +302,7 @@ export class Connection { this.connection?.k(reservedQuery, (err, result) => { if (err) { window.showErrorMessage( - `Failed to retrieve kdb+ reserved keywords: '${err.message}` + `Failed to retrieve kdb+ reserved keywords: '${err.message}`, ); return; } @@ -271,7 +314,7 @@ export class Connection { private onConnect( err: Error | undefined, conn: nodeq.Connection, - callback: nodeq.AsyncValueCallback + callback: nodeq.AsyncValueCallback, ): void { this.connected = true; this.connection = conn; diff --git a/src/models/messages.ts b/src/models/messages.ts index 69f8fc93..95c34afc 100644 --- a/src/models/messages.ts +++ b/src/models/messages.ts @@ -19,4 +19,5 @@ export type DataSourceMessage = { insightsMeta: MetaObjectPayload; dataSourceName: string; dataSourceFile: DataSourceFiles; + running?: boolean; }; diff --git a/src/models/serverObject.ts b/src/models/serverObject.ts index 926f6d65..190fa6ad 100644 --- a/src/models/serverObject.ts +++ b/src/models/serverObject.ts @@ -85,7 +85,7 @@ export async function loadVariables(ns: string): Promise { if (serverObjects !== undefined) { const vars = serverObjects.filter((value) => { return views.indexOf(value.name) === -1 && - value.typeNum === -7 && + value.typeNum < 98 && !value.isNs && value.namespace === ns ? value @@ -97,12 +97,11 @@ export async function loadVariables(ns: string): Promise { } export async function loadViews(): Promise { - const rawViews = await ext.connection?.executeQuery("views`"); - const rawViewArray = rawViews?.replace("\r\n", "").split("`"); - const views = rawViewArray?.filter((item) => { + const rawViewArray = await ext.connection?.executeQuery("views`"); + const views = rawViewArray?.filter((item: any) => { return item !== "s#" && item !== "" && item !== ","; }); - const sorted = views?.sort((object1, object2) => { + const sorted = views?.sort((object1: any, object2: any) => { if (object1 < object2) { return -1; } else if (object1 > object2) { diff --git a/src/panels/datasource.ts b/src/panels/datasource.ts index 166e1f5d..5b08eae9 100644 --- a/src/panels/datasource.ts +++ b/src/panels/datasource.ts @@ -19,6 +19,8 @@ import { InsightsNode } from "../services/kdbTreeProvider"; import { getNonce } from "../utils/getNonce"; import { getUri } from "../utils/getUri"; +let running = false; + export class DataSourcesPanel { public static currentPanel: DataSourcesPanel | undefined; private uri; @@ -96,6 +98,22 @@ export class DataSourcesPanel { } } + public static set running(flag: boolean) { + running = flag; + const panel = DataSourcesPanel.currentPanel; + if (panel) { + panel.status(); + } + } + + public static get running() { + return running; + } + + public status() { + this._panel.webview.postMessage({ running }); + } + public refresh() { DataSourcesPanel.render(this.uri, this.dataSourceFile); } diff --git a/src/services/kdbInsights/codeFlowLogin.ts b/src/services/kdbInsights/codeFlowLogin.ts index 1cde7811..1ddb8d4b 100644 --- a/src/services/kdbInsights/codeFlowLogin.ts +++ b/src/services/kdbInsights/codeFlowLogin.ts @@ -15,11 +15,12 @@ import axios from "axios"; import * as crypto from "crypto"; import * as fs from "fs-extra"; import * as http from "http"; -import open from "open"; import { join } from "path"; import * as querystring from "querystring"; import * as url from "url"; import { ext } from "../../extensionVariables"; +import { Uri, env } from "vscode"; +import { pickPort } from "pick-port"; interface IDeferred { resolve: (result: T | Promise) => void; @@ -33,48 +34,51 @@ export interface IToken { refreshToken: string; } -const defaultTimeout = 5 * 60 * 1000; // 5 min +const defaultTimeout = 3 * 60 * 1000; // 3 min const closeTimeout = 10 * 1000; // 10 sec const commonRequestParams = { client_id: "insights-app", - redirect_uri: ext.insightsAuthUrls.callbackURL, }; export async function signIn(insightsUrl: string) { const { server, codePromise } = createServer(); try { - await startServer(server); + const port = await startServer(server); const authParams = { response_type: "code", scope: "profile", + redirect_uri: `http://localhost:${port}/redirect`, state: crypto.randomBytes(20).toString("hex"), }; const authorizationUrl = new url.URL( ext.insightsAuthUrls.authURL, - insightsUrl + insightsUrl, ); authorizationUrl.search = queryString(authParams); - await open(authorizationUrl.toString()); + const opened = await env.openExternal( + Uri.parse(authorizationUrl.toString()), + ); - const code = await codePromise; + if (opened) { + const code = await codePromise; + return await getToken(insightsUrl, code); + } - return await getToken(insightsUrl, code); - } catch (error) { - throw error; + throw new Error("Error opening url"); } finally { - setTimeout(() => server.close(), closeTimeout); + setImmediate(() => server.close()); } } export async function signOut( insightsUrl: string, - token: string + token: string, ): Promise { const queryParams = queryString({ grant_type: ext.insightsGrantType.authorizationCode, @@ -95,7 +99,7 @@ export async function signOut( export async function refreshToken( insightsUrl: string, - token: string + token: string, ): Promise { return await tokenRequest(insightsUrl, { grant_type: ext.insightsGrantType.refreshToken, @@ -105,7 +109,7 @@ export async function refreshToken( export async function getCurrentToken( serverName: string, - serverAlias: string + serverAlias: string, ): Promise { if (serverName === "" || serverAlias === "") { return undefined; @@ -136,7 +140,7 @@ export async function getCurrentToken( async function getToken( insightsUrl: string, - code: string + code: string, ): Promise { return await tokenRequest(insightsUrl, { code, @@ -146,11 +150,15 @@ async function getToken( async function tokenRequest( insightsUrl: string, - params: any + params: any, ): Promise { const queryParams = queryString(params); const headers = { - headers: { "Content-Type": "application/x-www-form-urlencoded" }, + headers: { + "Content-Type": "application/x-www-form-urlencoded", + }, + timeout: closeTimeout, + signal: AbortSignal.timeout(closeTimeout), }; const requestUrl = new url.URL(ext.insightsAuthUrls.tokenURL, insightsUrl); @@ -190,18 +198,18 @@ function queryString(options: any): string { function createServer() { let deferredCode: IDeferred; const codePromise = new Promise( - (resolve, reject) => (deferredCode = { resolve, reject }) + (resolve, reject) => (deferredCode = { resolve, reject }), ); const codeTimer = setTimeout( () => deferredCode.reject(new Error("Timeout waiting for code.")), - defaultTimeout + defaultTimeout, ); const cancelCodeTimer = () => clearTimeout(codeTimer); const server = http.createServer((req, res) => { const reqUrl = new url.URL( req.url!, - `${ext.networkProtocols.http}${ext.localhost}` + `${ext.networkProtocols.http}${ext.localhost}`, ); switch (reqUrl.pathname) { case "/": @@ -210,9 +218,9 @@ function createServer() { join( ext.context.asAbsolutePath("resources"), "codeFlowResult", - "index.html" + "index.html", ), - "text/html; charset=utf-8" + "text/html; charset=utf-8", ); break; case "/redirect": @@ -240,9 +248,9 @@ function createServer() { join( ext.context.asAbsolutePath("resources"), "codeFlowResult", - "main.css" + "main.css", ), - "text/css; charset=utf-8" + "text/css; charset=utf-8", ); break; default: @@ -261,30 +269,41 @@ function createServer() { } function startServer(server: http.Server): Promise { - let deferredCode: IDeferred; - const portPromise = new Promise( - (resolve, reject) => (deferredCode = { resolve, reject }) - ); - const portTimer = setTimeout( - () => deferredCode.reject(new Error("Timeout waiting for port")), - closeTimeout - ); - const cancelPortTimer = () => clearTimeout(portTimer); - - server.on("listening", () => deferredCode.resolve(9010)); - server.on("error", (error) => deferredCode.reject(error)); - server.on("close", () => deferredCode.reject(new Error("Closed"))); - - server.listen(9010, ext.localhost); - - portPromise.then(cancelPortTimer, cancelPortTimer); - return portPromise; + return new Promise((resolve, reject) => { + let deferredCode: IDeferred; + const portPromise = new Promise( + (resolve, reject) => (deferredCode = { resolve, reject }), + ); + const portTimer = setTimeout( + () => deferredCode.reject(new Error("Timeout waiting for port")), + closeTimeout, + ); + const cancelPortTimer = () => clearTimeout(portTimer); + + pickPort({ + ip: "127.0.0.1", + type: "tcp", + minPort: 9000, + maxPort: 9999, + }) + .then((port) => { + server.on("listening", () => deferredCode.resolve(port)); + server.on("error", (error) => deferredCode.reject(error)); + server.on("close", () => deferredCode.reject(new Error("Closed"))); + server.listen(port, ext.localhost); + portPromise.then(cancelPortTimer, cancelPortTimer); + env + .asExternalUri(Uri.parse(`http://localhost:${port}`)) + .then(() => resolve(portPromise)); + }) + .catch(reject); + }); } function sendFile( res: http.ServerResponse, filePath: string, - contentType: string + contentType: string, ) { fs.readFile(filePath, (_err: any, _body: any) => { if (!_err) { diff --git a/src/services/resultsPanelProvider.ts b/src/services/resultsPanelProvider.ts index 87da5fe8..022fd991 100644 --- a/src/services/resultsPanelProvider.ts +++ b/src/services/resultsPanelProvider.ts @@ -23,6 +23,7 @@ import { ext } from "../extensionVariables"; import * as utils from "../utils/execution"; import { getNonce } from "../utils/getNonce"; import { getUri } from "../utils/getUri"; +import { InsightsNode } from "./kdbTreeProvider"; export class KdbResultsViewProvider implements WebviewViewProvider { public static readonly viewType = "kdb-results"; @@ -60,7 +61,7 @@ export class KdbResultsViewProvider implements WebviewViewProvider { this._view.webview.postMessage(queryResults); this._view.webview.html = this._getWebviewContent( queryResults, - dataSourceType + dataSourceType, ); } } @@ -101,23 +102,92 @@ export class KdbResultsViewProvider implements WebviewViewProvider { utils.exportToCsv(workspaceUri); } - convertToGrid(queryResult: any[]): string { - const columnDefs = Object.keys(queryResult[0]).map((key: string) => { - const sanitizedKey = this.sanitizeString(key); - return { field: sanitizedKey, headerName: sanitizedKey }; - }); - const rowData = queryResult.map((row: any) => { - for (const key in row) { - if (Object.prototype.hasOwnProperty.call(row, key)) { - row[key] = - row[key] !== undefined && row[key] !== null - ? this.sanitizeString(row[key]) - : ""; - } + defineDataType(type: string): string { + const typeMapping: { [key: string]: string } = { + short: "number", + int: "number", + long: "number", + float: "number", + real: "number", + boolean: "boolean", + }; + + return typeMapping[type] || "text"; + } + + generateCoumnDefs(results: any, isInsights: boolean): any { + if (isInsights) { + if (results.rows.length === 0) { + return Object.keys(results.meta).map((key: string) => { + const sanitizedKey = this.sanitizeString(key); + const type = results.meta[key]; + const headerTooltip = type; + const cellDataType = this.defineDataType(type); + return { + field: sanitizedKey, + headerName: sanitizedKey, + headerTooltip, + cellDataType, + }; + }); + } else { + return Object.keys(results.rows[0]).map((key: string) => { + const sanitizedKey = this.sanitizeString(key); + const type = results.meta[key]; + const headerTooltip = type; + const cellDataType = this.defineDataType(type); + return { + field: sanitizedKey, + headerName: sanitizedKey, + headerTooltip, + cellDataType, + }; + }); } - return row; - }); - ext.resultPanelCSV = this.convertToCsv(rowData).join("\n"); + } else { + if (typeof results[0] === "string") { + return results.map((key: string) => { + const sanitizedKey = this.sanitizeString(key); + const cellDataType = "text"; + return { + field: sanitizedKey, + headerName: sanitizedKey, + cellDataType, + }; + }); + } + return Object.keys(results[0]).map((key: string) => { + const sanitizedKey = this.sanitizeString(key); + const cellDataType = "text"; + return { field: sanitizedKey, headerName: sanitizedKey, cellDataType }; + }); + } + } + + convertToGrid(results: any): string { + const isInsights = ext.connectionNode instanceof InsightsNode; + const queryResult = isInsights ? results.rows : results; + + const columnDefs = this.generateCoumnDefs(results, isInsights); + let rowData = []; + if (!isInsights && typeof results[0] === "string") { + rowData = []; + } else { + rowData = queryResult.map((row: any) => { + for (const key in row) { + if (Object.prototype.hasOwnProperty.call(row, key)) { + row[key] = + row[key] !== undefined && row[key] !== null + ? this.sanitizeString(row[key]) + : ""; + } + } + return row; + }); + } + if (rowData.length > 0) { + ext.resultPanelCSV = this.convertToCsv(rowData).join("\n"); + } return JSON.stringify({ defaultColDef: { sortable: true, @@ -131,11 +201,11 @@ export class KdbResultsViewProvider implements WebviewViewProvider { domLayout: "autoHeight", pagination: true, paginationPageSize: 100, - cacheBlockSize: 100, enableCellTextSelection: true, ensureDomOrder: true, suppressContextMenu: true, suppressDragLeaveHidesColumns: true, + tooltipShowDelay: 200, }); } @@ -187,13 +257,11 @@ export class KdbResultsViewProvider implements WebviewViewProvider { if (typeof queryResult === "string" || typeof queryResult === "number") { result = queryResult !== "" - ? `

${queryResult}

` + ? `

${queryResult + .toString() + .replace(/\n/g, "
")}

` : "

No results to show

"; - } else if ( - typeof queryResult === "object" && - queryResult !== null && - queryResult instanceof Array - ) { + } else if (queryResult) { isGrid = true; gridOptionsString = this.convertToGrid(queryResult); } @@ -215,12 +283,12 @@ export class KdbResultsViewProvider implements WebviewViewProvider { Q Results + "ag-grid-community.min.js", + )}">
@@ -235,7 +303,7 @@ export class KdbResultsViewProvider implements WebviewViewProvider { if(${isGrid}){ const gridDiv = document.getElementById('grid'); const obj = JSON.parse('${gridOptionsString}'); - const gridApi = new agGrid.Grid(gridDiv, obj); + const gridApi = agGrid.createGrid(gridDiv, obj); document.getElementById("results").scrollIntoView(); } }); diff --git a/src/utils/execution.ts b/src/utils/execution.ts index 5ff22de7..a3670073 100644 --- a/src/utils/execution.ts +++ b/src/utils/execution.ts @@ -42,7 +42,7 @@ export function runQFileTerminal(filename?: string): void { export function handleQueryResults( results: any, - type: QueryResultType + type: QueryResultType, ): string { let handledResult: string; switch (type) { @@ -156,3 +156,74 @@ export function convertArrayOfArraysToObjects(arr: any): any[] { return result; } + +function processLineWithSeparator(line: string, index: number): object { + const parts = line.split("|").map((part) => part.trim()); + return { Index: index + 1, Key: parts[0], Value: parts[1] }; +} + +function processLineWithoutSeparator(line: string, index: number): object[] { + if (!line.startsWith('"') && line.includes(" ")) { + // Split the line into parts by spaces and map each part to an object + return line.split(" ").map((part, i) => { + return { Index: index + i + 1, Value: part }; + }); + } else { + return [{ Index: index + 1, Value: line.trim() }]; + } +} + +function processLine( + line: string, + index: number, + fieldLengths: number[], + fieldNames: string[], +): object { + let start = 0; + const obj: { [key: string]: any } = { Index: index + 1 }; + fieldLengths.forEach((length, i) => { + obj[fieldNames[i]] = line.substring(start, start + length).trim(); + start += length; + }); + return obj; +} + +export function convertStringToArray(str: string): any[] { + const lines = str.split("\n").filter((line) => line.trim() !== ""); + if (lines.length > 2 && lines[1].startsWith("---")) { + const fieldNames = lines[0].split(" ").filter((part) => part !== ""); + lines.splice(1, 1); + let total = 0; + const fieldLengths = fieldNames.map((name, i) => { + if (i === fieldNames.length - 1) { + return lines[0].length - total; + } + const elementLength = + lines[0].indexOf(fieldNames[i + 1] ?? "") - lines[0].indexOf(name); + total += elementLength; + return elementLength; + }); + lines.shift(); + return lines.flatMap((line, index) => + fieldLengths.length > 0 + ? processLine(line, index, fieldLengths, fieldNames) + : [], + ); + } + + if (lines.length === 2 && lines[1].startsWith("---")) { + lines.splice(1, 1); + return lines[0].split(" ").filter((part) => part !== ""); + } + + return lines + .flatMap((line, index) => { + const parts = line.split("|").map((part) => part.trim()); + return parts.length === 2 + ? processLineWithSeparator(line, index) + : processLineWithoutSeparator(line, index); + }) + .filter( + (obj) => !("Value" in obj && (obj.Value as string).startsWith("-")), + ); +} diff --git a/src/utils/queryUtils.ts b/src/utils/queryUtils.ts index 35ea0272..6eaef2c4 100644 --- a/src/utils/queryUtils.ts +++ b/src/utils/queryUtils.ts @@ -14,9 +14,11 @@ import { readFileSync } from "fs"; import { join } from "path"; import { ext } from "../extensionVariables"; -import { deserialize, isCompressed, uncompress } from "../ipc/c"; +import { DCDS, deserialize, isCompressed, uncompress } from "../ipc/c"; import { Parse } from "../ipc/parse.qlist"; import { ServerType } from "../models/server"; +import { DDateClass, DDateTimeClass, DTimestampClass } from "../ipc/cClasses"; +import { TypeBase } from "../ipc/typeBase"; export function sanitizeQuery(query: string): string { if (query[0] === "`") { @@ -29,7 +31,7 @@ export function sanitizeQuery(query: string): string { export function queryWrapper(): string { return readFileSync( - ext.context.asAbsolutePath(join("resources", "evaluate.q")) + ext.context.asAbsolutePath(join("resources", "evaluate.q")), ).toString(); } @@ -65,7 +67,7 @@ export function handleWSError(ab: ArrayBuffer): any { // eslint-disable-next-line prefer-spread ipc: String.fromCharCode.apply( String, - raw.subarray(9, raw.byteLength - 1) as unknown as number[] + raw.subarray(9, raw.byteLength - 1) as unknown as number[], ), }; } else { @@ -87,11 +89,11 @@ export function handleWSResults(ab: ArrayBuffer): any { des = des.values[1]; } res = Parse.reshape(des, ab).toLegacy(); - if (res.rows.length === 0) { + if (res.rows.length === 0 && res.columns.length === 0) { return "No results found."; } if (ext.resultsViewProvider.isVisible()) { - return getValueFromArray(res.rows); + return getValueFromArray(res); } return convertRows(res.rows); } catch (error) { @@ -100,22 +102,31 @@ export function handleWSResults(ab: ArrayBuffer): any { } } -export function handleScratchpadTableRes(scratchpadResponse: any): any { +export function handleScratchpadTableRes(results: DCDS | string): any { + if (typeof results === "string" || results?.rows === undefined) { + return results; + } + let scratchpadResponse = results.rows; if (!Array.isArray(scratchpadResponse)) { - return scratchpadResponse; + return results; + } + if (scratchpadResponse?.length !== 0) { + scratchpadResponse = addIndexKey(scratchpadResponse); } const result = []; for (const row of scratchpadResponse) { const newObj = {}; for (const key in row) { - if ( - typeof row[key] === "object" && + row[key] = checkIfIsQDateTypes(row[key]); + if (typeof row[key] === "bigint") { + Object.assign(newObj, { [key]: Number(row[key]) }); + } else if ( row[key] !== null && - "i" in row[key] + typeof row[key] === "number" && + (row[key].toString() === "Infinity" || + row[key].toString() === "-Infinity") ) { Object.assign(newObj, { [key]: row[key].toString() }); - } else if (typeof row[key] === "bigint" && row[key] !== null) { - Object.assign(newObj, { [key]: Number(row[key]) }); } else { Object.assign(newObj, { [key]: row[key] }); } @@ -123,27 +134,81 @@ export function handleScratchpadTableRes(scratchpadResponse: any): any { result.push(newObj); } + results.rows = result; + return results; +} - return result; +export function addIndexKey(input: any) { + let arr: any[]; + + if (Array.isArray(input)) { + arr = input; + } else { + arr = [input]; + } + + if (arr.length === 0) { + return arr; + } + + if (!arr[0].hasOwnProperty("Index")) { + arr = arr.map((obj, index) => { + const newObj = { Index: index + 1 }; + + if (typeof obj === "string") { + newObj["Value"] = obj; + } else { + for (const prop in obj) { + newObj[prop] = obj[prop]; + } + } + + return newObj; + }); + } + + return arr; } -export function getValueFromArray(arr: any[]): string | any[] { - if (arr.length === 1 && typeof arr[0] === "object" && arr[0] !== null) { - const obj = arr[0]; - const keys = Object.keys(obj); - if (keys.length === 1 && keys[0] === "Value") { - return String(obj.Value); +export function getValueFromArray(results: DCDS): any { + const arr = results.rows; + if (arr !== undefined) { + if (arr.length === 1 && typeof arr[0] === "object" && arr[0] !== null) { + results.rows = [checkIfIsQDateTypes(arr[0])]; } } - return arr; + results.meta = generateQTypes(results.meta); + return results; +} + +export function generateQTypes(meta: { [key: string]: number }): any { + const newMeta: { [key: string]: string } = {}; + for (const key in meta) { + const value = meta[key]; + newMeta[key] = TypeBase.typeNames[value] ?? `Unknown type: ${value}`; + } + return newMeta; +} + +export function checkIfIsQDateTypes(obj: any): any { + if ( + obj?.Value instanceof DTimestampClass || + obj?.Value instanceof DDateTimeClass || + obj?.Value instanceof DDateClass + ) { + return obj.Value.toString(); + } + return obj; } -export function convertRows(rows: any[]): any[] { +export function convertRows(rows: any[]): any { if (rows.length === 0) { return []; } const keys = Object.keys(rows[0]); - const result = [keys.join("#$#;#$#")]; + const isObj = typeof rows[0] === "object"; + const isPropVal = isObj ? checkIfIsPropVal(keys) : false; + const result = isPropVal ? [] : [keys.join("#$#;header;#$#")]; for (const row of rows) { const values = keys.map((key) => { if (Array.isArray(row[key])) { @@ -153,20 +218,28 @@ export function convertRows(rows: any[]): any[] { }); result.push(values.join("#$#;#$#")); } - return result; + return convertRowsToConsole(result).join("\n") + "\n\n"; } export function convertRowsToConsole(rows: string[]): string[] { if (rows.length === 0) { return []; } - + const haveHeader = rows[0].includes("#$#;header;#$#"); + let header; + if (haveHeader) { + header = rows[0].split("#$#;header;#$#"); + rows.shift(); + } const vector = rows.map((row) => row.split("#$#;#$#")); + if (header) { + vector.unshift(header); + } const columnCounters = vector[0].reduce((counters: number[], _, j) => { const maxLength = vector.reduce( (max, row) => Math.max(max, row[j].length), - 0 + 0, ); counters.push(maxLength + 2); return counters; @@ -177,7 +250,11 @@ export function convertRowsToConsole(rows: string[]): string[] { const counter = columnCounters[j]; const diff = counter - value.length; if (diff > 0) { - row[j] = value + " ".repeat(diff); + if (!haveHeader && j !== columnCounters.length - 1) { + row[j] = value + "|" + " ".repeat(diff > 1 ? diff - 1 : diff); + } else { + row[j] = value + " ".repeat(diff); + } } }); }); @@ -186,11 +263,21 @@ export function convertRowsToConsole(rows: string[]): string[] { const totalCount = columnCounters.reduce((sum, count) => sum + count, 0); const totalCounter = "-".repeat(totalCount); - result.splice(1, 0, totalCounter); + if (haveHeader) { + result.splice(1, 0, totalCounter); + } return result; } +export function checkIfIsPropVal(columns: string[]): boolean { + return ( + columns.length === 2 && + columns.includes("Property") && + columns.includes("Value") + ); +} + export function getConnectionType(type: ServerType): string { switch (type) { case ServerType.KDB: diff --git a/src/webview/components/kdbDataSourceView.ts b/src/webview/components/kdbDataSourceView.ts index e3d24fac..a0a613b8 100644 --- a/src/webview/components/kdbDataSourceView.ts +++ b/src/webview/components/kdbDataSourceView.ts @@ -64,6 +64,7 @@ export class KdbDataSourceView extends LitElement { @state() declare qsqlTarget: string; @state() declare qsql: string; @state() declare sql: string; + @state() declare running: boolean; constructor() { super(); @@ -91,6 +92,7 @@ export class KdbDataSourceView extends LitElement { this.qsqlTarget = ""; this.qsql = ""; this.sql = ""; + this.running = false; } connectedCallback() { @@ -105,6 +107,10 @@ export class KdbDataSourceView extends LitElement { private message = (event: MessageEvent) => { const params = event.data; + if (params.running !== undefined) { + this.running = params.running; + return; + } const ds = params.dataSourceFile; this.isInsights = params.isInsights; this.isMetaLoaded = !!params.insightsMeta.dap; @@ -217,7 +223,7 @@ export class KdbDataSourceView extends LitElement { if (this.isInsights && this.isMetaLoaded) { return this.insightsMeta.api .filter( - (api) => api.api === ".kxi.getData" || !api.api.startsWith(".kxi.") + (api) => api.api === ".kxi.getData" //|| !api.api.startsWith(".kxi.") ) .map((api) => { const value = @@ -930,6 +936,7 @@ export class KdbDataSourceView extends LitElement { appearance="secondary" class="grow" @click="${this.run}" + ?disabled="${this.running}" >Run
diff --git a/src/webview/styles/resultsPanel.css b/src/webview/styles/resultsPanel.css index 1ac18633..f4c9a235 100644 --- a/src/webview/styles/resultsPanel.css +++ b/src/webview/styles/resultsPanel.css @@ -23,3 +23,7 @@ body { .results-header-datagrid { background: #00000050; } + +.results-txt { + white-space: pre; +} diff --git a/syntaxes/q.tmLanguage.json b/syntaxes/q.tmLanguage.json index 50e43095..6281c9e7 100644 --- a/syntaxes/q.tmLanguage.json +++ b/syntaxes/q.tmLanguage.json @@ -9,22 +9,22 @@ "include": "#strings" }, { - "include": "#qcumber" + "include": "#qtest" }, { - "include": "#operators" + "include": "#literals" }, { - "include": "#commands" + "include": "#keywords" }, { - "include": "#literals" + "include": "#identifiers" }, { - "include": "#keywords" + "include": "#commands" }, { - "include": "#identifiers" + "include": "#operators" } ], "repository": { @@ -35,12 +35,16 @@ "begin": "^\\/\\s*$", "end": "^\\\\\\s*$" }, + { + "name": "comment.last.q", + "begin": "^\\\\\\s*$" + }, { "include": "#qdoc" }, { "name": "comment.line.q", - "match": "(?:(?<=\\r?\\n|[ \\t])|(?~|&]" - }, - { - "name": "keyword.other.control.q", - "match": "[\\/\\\\':]:" - }, - { - "name": "keyword.other.control.q", - "match": "[$!?#@'^]" - }, - { - "name": "punctuation.assignment.q", - "match": ":" - }, - { - "name": "punctuation.terminator.statement.q", - "match": ";" - } - ] - }, - "commands": { - "patterns": [ - { - "name": "constant.character.q", - "match": "\\\\(ts|cd|[arsbBSctCTdueEvfwgWlxzo12p_P\\\\])" - } - ] - }, "literals": { "patterns": [ { @@ -166,12 +134,12 @@ "match": "`[.:\\w]*" }, { - "name": "constant.numeric.timestamp.q", - "match": "\\d{4}\\.\\d{2}\\.\\d{2}D\\d{2}:\\d{2}:\\d{2}\\.\\d{9}" + "name": "constant.numeric.datetime.q", + "match": "\\d{4}\\.\\d{2}\\.\\d{2}T(?:\\d{2}:){1,2}\\d{2}\\.?\\d*" }, { - "name": "constant.numeric.datetime.q", - "match": "\\d{4}\\.\\d{2}\\.\\d{2}T\\d{2}:\\d{2}:\\d{2}\\.\\d{3}" + "name": "constant.numeric.timestamp.q", + "match": "\\d{4}\\.\\d{2}\\.\\d{2}D(?:\\d{2}:){1,2}\\d{2}\\.?\\d*" }, { "name": "constant.numeric.date.q", @@ -182,20 +150,16 @@ "match": "\\d{4}\\.\\d{2}m" }, { - "name": "constant.numeric.nanotime.q", - "match": "(?:0D)?\\d{2}:\\d{2}:\\d{2}\\.\\d{9}" + "name": "constant.numeric.time.q", + "match": "(?:0D)?(?:\\d{2}:){1,2}\\d{2}\\.?\\d*" }, { - "name": "constant.numeric.militime.q", - "match": "\\d{2}:\\d{2}:\\d{2}\\.\\d{3}" + "name": "constant.numeric.file.q", + "match": "[012]:" }, { - "name": "constant.numeric.second.q", - "match": "\\d{2}:\\d{2}:\\d{2}" - }, - { - "name": "constant.numeric.minute.q", - "match": "\\d{2}:\\d{2}" + "name": "constant.language.infinity.q", + "match": "(?:0N[deghjmnptuvz]?|-?0[wW]|0n)" }, { "name": "constant.numeric.binary.q", @@ -205,10 +169,6 @@ "name": "constant.numeric.byte.q", "match": "0x(?:[0-9a-fA-F]{2})+" }, - { - "name": "constant.language.null.q", - "match": "(?:0N[ghjepmdznuvt]|-?0[wW]|0[nNwW])" - }, { "name": "constant.numeric.number.q", "match": "-?(?:\\d+\\.\\d+|\\.\\d+|\\d+\\.|\\d+)(?:e[+-]?\\d?\\d)?[jhife]?" @@ -218,28 +178,8 @@ "keywords": { "patterns": [ { - "name": "keyword.other.namespace.h.q", - "match": "\\.h\\.(?:iso8601|code|edsn|fram|HOME|htac|html|http|logo|text|hta|htc|hug|nbr|pre|val|xmp|br|c0|c1|cd|ed|ha|hb|hc|he|hn|hp|hr|ht|hu|hy|jx|sa|sb|sc|td|tx|ty|uh|xd|xs|xt|d)\\b" - }, - { - "name": "keyword.other.namespace.j.q", - "match": "\\.j\\.(?:jd|[jk])\\b" - }, - { - "name": "keyword.other.namespace.m.q", - "match": "\\.m\\.(?:addmonths|dpfts|dsftg|addr|btoa|dpft|hdpf|host|view|chk|def|ens|fmt|fpn|fps|fsn|ind|j10|j12|MAP|opt|par|res|sbt|trp|x10|x12|b6|bt|bv|Cf|cn|dd|en|ff|fk|fs|ft|fu|gc|gz|hg|hp|id|nA|pd|PD|pf|pn|pt|pv|PV|qp|qt|s1|ts|ty|vp|Xf|[aADfklMPsuvVwx])\\b" - }, - { - "name": "keyword.other.namespace.Q.q", - "match": "\\.[Qq]\\.(?:addmonths|dpfts|dsftg|addr|btoa|dpft|hdpf|host|sha1|view|chk|def|ens|fmt|fpn|fps|fsn|ind|j10|j12|MAP|opt|par|res|sbt|trp|x10|x12|b6|bt|bv|Cf|cn|dd|en|fc|ff|fk|fs|ft|fu|gc|gz|hg|hp|id|nA|pd|PD|pf|pn|pt|pv|PV|qp|qt|s1|ts|ty|vp|Xf|[aADfklMPsSuvVwx])\\b" - }, - { - "name": "keyword.other.namespace.z.q", - "match": "\\.z\\.(?:exit|ac|bm|ex|ey|pc|pd|pg|ph|pi|pm|po|pp|pq|ps|pw|ts|vs|wc|wo|ws|zd|[abcdDefhikKlnNopPqstTuwWxXzZ])\\b" - }, - { - "name": "keyword.other.namespace.q", - "match": "\\.[hjmqQz]\\b" + "name": "keyword.other.reserved.q", + "match": "(?:\\.h\\.(?:iso8601|code|edsn|fram|HOME|htac|html|http|logo|text|hta|htc|hug|nbr|pre|val|xmp|br|c0|c1|cd|ed|ha|hb|hc|he|hn|hp|hr|ht|hu|hy|jx|sa|sb|sc|td|tx|ty|uh|xd|xs|xt|d)|\\.j\\.(?:jd|[jk])|\\.m\\.(?:addmonths|dpfts|dsftg|addr|btoa|dpft|hdpf|host|view|chk|def|ens|fmt|fpn|fps|fsn|ind|j10|j12|MAP|opt|par|res|sbt|trp|x10|x12|b6|bt|bv|Cf|cn|dd|en|ff|fk|fs|ft|fu|gc|gz|hg|hp|id|nA|pd|PD|pf|pn|pt|pv|PV|qp|qt|s1|ts|ty|vp|Xf|[aADfklMPsuvVwx])|\\.[Qq]\\.(?:addmonths|dpfts|dsftg|addr|btoa|dpft|hdpf|host|sha1|view|chk|def|ens|fmt|fpn|fps|fsn|ind|j10|j12|MAP|opt|par|res|sbt|trp|x10|x12|b6|bt|bv|Cf|cn|dd|en|fc|ff|fk|fs|ft|fu|gc|gz|hg|hp|id|nA|pd|PD|pf|pn|pt|pv|PV|qp|qt|s1|ts|ty|vp|Xf|[aADfklMPsSuvVwx])|\\.z\\.(?:exit|ac|bm|ex|ey|pc|pd|pg|ph|pi|pm|po|pp|pq|ps|pw|ts|vs|wc|wo|ws|zd|[abcdDefhikKlnNopPqstTuwWxXzZ]))\\b" }, { "name": "keyword.other.q", @@ -251,7 +191,39 @@ "patterns": [ { "name": "variable.other.q", - "match": "(\\.[A-Za-z][A-Za-z_0-9.]*(??!#@$&~|%*+-]" + }, + { + "name": "punctuation.assignment.q", + "match": ":" + }, + { + "name": "punctuation.terminator.statement.q", + "match": ";" } ] } diff --git a/test/runTest.ts b/test/runTest.ts index 9e03bf4e..90256bef 100644 --- a/test/runTest.ts +++ b/test/runTest.ts @@ -27,7 +27,7 @@ async function main() { // load the instrumented files extensionTestsPath = path.join( __dirname, - "../../out-cov/test/suite/index" + "../../out-cov/test/suite/index", ); // signal that the coverage data should be gathered @@ -36,6 +36,7 @@ async function main() { await runTests({ extensionDevelopmentPath, extensionTestsPath }); } catch (err) { + console.log(err); console.error("Failed to run tests."); process.exit(1); } diff --git a/test/suite/commands.test.ts b/test/suite/commands.test.ts index ff83fea6..c4613b0d 100644 --- a/test/suite/commands.test.ts +++ b/test/suite/commands.test.ts @@ -96,7 +96,7 @@ describe("dataSourceCommand", () => { }); await assert.doesNotReject( - dataSourceCommand.renameDataSource("datasource-0", "datasource-1") + dataSourceCommand.renameDataSource("datasource-0", "datasource-1"), ); }); @@ -164,7 +164,7 @@ describe("dataSourceCommand", () => { const item = new KdbDataSourceTreeItem( "datasource-0", vscode.TreeItemCollapsibleState.Collapsed, - [] + [], ); await assert.doesNotReject(dataSourceCommand.deleteDataSource(item)); @@ -189,7 +189,7 @@ describe("dataSourceCommand", () => { const item = new KdbDataSourceTreeItem( "datasource-0", vscode.TreeItemCollapsibleState.Collapsed, - [] + [], ); const uri = vscode.Uri.file("/temp/.kdb-datasources/datasource-0.ds"); @@ -449,15 +449,20 @@ describe("dataSourceCommand2", () => { let checkIfTimeParamIsCorrectStub: sinon.SinonStub; let getDataInsightsStub: sinon.SinonStub; let handleWSResultsStub: sinon.SinonStub; + let handleScratchpadTableRes: sinon.SinonStub; beforeEach(() => { getApiBodyStub = sinon.stub(dataSourceCommand, "getApiBody"); checkIfTimeParamIsCorrectStub = sinon.stub( dataSourceUtils, - "checkIfTimeParamIsCorrect" + "checkIfTimeParamIsCorrect", ); getDataInsightsStub = sinon.stub(srvCommand, "getDataInsights"); handleWSResultsStub = sinon.stub(queryUtils, "handleWSResults"); + handleScratchpadTableRes = sinon.stub( + queryUtils, + "handleScratchpadTableRes", + ); }); afterEach(() => { @@ -473,7 +478,7 @@ describe("dataSourceCommand2", () => { .expects("showErrorMessage") .once() .withArgs( - "The time parameters(startTS and endTS) are not correct, please check the format or if the startTS is before the endTS" + "The time parameters(startTS and endTS) are not correct, please check the format or if the startTS is before the endTS", ); sinon.assert.notCalled(getApiBodyStub); sinon.assert.notCalled(getDataInsightsStub); @@ -489,10 +494,14 @@ describe("dataSourceCommand2", () => { { a: "4", b: "6" }, { a: "6", b: "9" }, ]); + handleScratchpadTableRes.resolves([ + { a: "2", b: "3" }, + { a: "4", b: "6" }, + { a: "6", b: "9" }, + ]); - const result = await dataSourceCommand.runApiDataSource( - dummyDataSourceFiles - ); + const result = + await dataSourceCommand.runApiDataSource(dummyDataSourceFiles); sinon.assert.calledOnce(getDataInsightsStub); sinon.assert.calledOnce(handleWSResultsStub); @@ -507,10 +516,15 @@ describe("dataSourceCommand2", () => { describe("runQsqlDataSource", () => { let getDataInsightsStub: sinon.SinonStub; let handleWSResultsStub: sinon.SinonStub; + let handleScratchpadTableRes: sinon.SinonStub; beforeEach(() => { getDataInsightsStub = sinon.stub(srvCommand, "getDataInsights"); handleWSResultsStub = sinon.stub(queryUtils, "handleWSResults"); + handleScratchpadTableRes = sinon.stub( + queryUtils, + "handleScratchpadTableRes", + ); }); afterEach(() => { @@ -524,10 +538,14 @@ describe("dataSourceCommand2", () => { { a: "4", b: "6" }, { a: "6", b: "9" }, ]); + handleScratchpadTableRes.resolves([ + { a: "2", b: "3" }, + { a: "4", b: "6" }, + { a: "6", b: "9" }, + ]); - const result = await dataSourceCommand.runQsqlDataSource( - dummyDataSourceFiles - ); + const result = + await dataSourceCommand.runQsqlDataSource(dummyDataSourceFiles); sinon.assert.calledOnce(getDataInsightsStub); sinon.assert.calledOnce(handleWSResultsStub); @@ -542,10 +560,15 @@ describe("dataSourceCommand2", () => { describe("runSqlDataSource", () => { let getDataInsightsStub: sinon.SinonStub; let handleWSResultsStub: sinon.SinonStub; + let handleScratchpadTableRes: sinon.SinonStub; beforeEach(() => { getDataInsightsStub = sinon.stub(srvCommand, "getDataInsights"); handleWSResultsStub = sinon.stub(queryUtils, "handleWSResults"); + handleScratchpadTableRes = sinon.stub( + queryUtils, + "handleScratchpadTableRes", + ); }); afterEach(() => { @@ -559,10 +582,14 @@ describe("dataSourceCommand2", () => { { a: "4", b: "6" }, { a: "6", b: "9" }, ]); + handleScratchpadTableRes.resolves([ + { a: "2", b: "3" }, + { a: "4", b: "6" }, + { a: "6", b: "9" }, + ]); - const result = await dataSourceCommand.runSqlDataSource( - dummyDataSourceFiles - ); + const result = + await dataSourceCommand.runSqlDataSource(dummyDataSourceFiles); sinon.assert.calledOnce(getDataInsightsStub); sinon.assert.calledOnce(handleWSResultsStub); @@ -710,9 +737,11 @@ describe("dataSourceCommand2", () => { let isVisibleStub, getMetaStub, handleWSResultsStub, + handleScratchpadTableRes, getDataInsightsStub, writeQueryResultsToViewStub, writeQueryResultsToConsoleStub: sinon.SinonStub; + ext.outputChannel = vscode.window.createOutputChannel("kdb"); beforeEach(() => { @@ -721,14 +750,17 @@ describe("dataSourceCommand2", () => { handleWSResultsStub = sinon .stub(queryUtils, "handleWSResults") .returns("dummy results"); + handleScratchpadTableRes = sinon + .stub(queryUtils, "handleScratchpadTableRes") + .returns("dummy results"); getDataInsightsStub = sinon.stub(srvCommand, "getDataInsights"); writeQueryResultsToViewStub = sinon.stub( srvCommand, - "writeQueryResultsToView" + "writeQueryResultsToView", ); writeQueryResultsToConsoleStub = sinon.stub( srvCommand, - "writeQueryResultsToConsole" + "writeQueryResultsToConsole", ); }); @@ -747,7 +779,7 @@ describe("dataSourceCommand2", () => { getDataInsightsStub.resolves({ arrayBuffer: ab, error: "" }); isVisibleStub.returns(true); await dataSourceCommand.runDataSource( - dummyFileContent as DataSourceFiles + dummyFileContent as DataSourceFiles, ); sinon.assert.neverCalledWith(writeQueryResultsToConsoleStub); sinon.assert.calledOnce(writeQueryResultsToViewStub); @@ -759,7 +791,7 @@ describe("dataSourceCommand2", () => { getDataInsightsStub.resolves({ arrayBuffer: ab, error: "" }); isVisibleStub.returns(false); await dataSourceCommand.runDataSource( - dummyFileContent as DataSourceFiles + dummyFileContent as DataSourceFiles, ); sinon.assert.neverCalledWith(writeQueryResultsToViewStub); sinon.assert.calledOnce(writeQueryResultsToConsoleStub); @@ -771,7 +803,7 @@ describe("dataSourceCommand2", () => { getDataInsightsStub.resolves({ arrayBuffer: ab, error: "" }); isVisibleStub.returns(false); await dataSourceCommand.runDataSource( - dummyFileContent as DataSourceFiles + dummyFileContent as DataSourceFiles, ); sinon.assert.neverCalledWith(writeQueryResultsToViewStub); sinon.assert.calledOnce(writeQueryResultsToConsoleStub); @@ -783,7 +815,7 @@ describe("dataSourceCommand2", () => { getDataInsightsStub.resolves({ arrayBuffer: ab, error: "error" }); isVisibleStub.returns(false); await dataSourceCommand.runDataSource( - dummyFileContent as DataSourceFiles + dummyFileContent as DataSourceFiles, ); sinon.assert.neverCalledWith(writeQueryResultsToViewStub); sinon.assert.neverCalledWith(writeQueryResultsToConsoleStub); @@ -795,7 +827,7 @@ describe("dataSourceCommand2", () => { getDataInsightsStub.resolves({ arrayBuffer: ab, error: "error" }); isVisibleStub.returns(false); await dataSourceCommand.runDataSource( - dummyFileContent as DataSourceFiles + dummyFileContent as DataSourceFiles, ); sinon.assert.neverCalledWith(writeQueryResultsToViewStub); sinon.assert.neverCalledWith(writeQueryResultsToConsoleStub); @@ -807,7 +839,7 @@ describe("dataSourceCommand2", () => { getDataInsightsStub.resolves({ arrayBuffer: ab, error: "error" }); isVisibleStub.returns(false); await dataSourceCommand.runDataSource( - dummyFileContent as DataSourceFiles + dummyFileContent as DataSourceFiles, ); sinon.assert.neverCalledWith(writeQueryResultsToViewStub); sinon.assert.neverCalledWith(writeQueryResultsToConsoleStub); @@ -819,7 +851,7 @@ describe("dataSourceCommand2", () => { getDataInsightsStub.resolves(undefined); isVisibleStub.returns(false); await dataSourceCommand.runDataSource( - dummyFileContent as DataSourceFiles + dummyFileContent as DataSourceFiles, ); sinon.assert.neverCalledWith(writeQueryResultsToViewStub); sinon.assert.neverCalledWith(writeQueryResultsToConsoleStub); @@ -831,7 +863,7 @@ describe("dataSourceCommand2", () => { getDataInsightsStub.resolves(undefined); isVisibleStub.returns(false); await dataSourceCommand.runDataSource( - dummyFileContent as DataSourceFiles + dummyFileContent as DataSourceFiles, ); sinon.assert.neverCalledWith(writeQueryResultsToViewStub); sinon.assert.neverCalledWith(writeQueryResultsToConsoleStub); @@ -843,7 +875,7 @@ describe("dataSourceCommand2", () => { getDataInsightsStub.resolves(undefined); isVisibleStub.returns(false); await dataSourceCommand.runDataSource( - dummyFileContent as DataSourceFiles + dummyFileContent as DataSourceFiles, ); sinon.assert.neverCalledWith(writeQueryResultsToViewStub); sinon.assert.neverCalledWith(writeQueryResultsToConsoleStub); @@ -1098,7 +1130,7 @@ describe("serverCommand", () => { executeCommandStub.firstCall, "kdb.resultsPanel.update", result, - undefined + undefined, ); executeCommandStub.restore(); @@ -1132,7 +1164,7 @@ describe("serverCommand", () => { showErrorMessageStub, "OpenSSL not found, please ensure this is installed", "More Info", - "Cancel" + "Cancel", ); sinon.assert.notCalled(updateServersStub); }); @@ -1147,7 +1179,7 @@ describe("serverCommand", () => { sinon.assert.calledWith( showErrorMessageStub, "Server not found, please ensure this is a correct server", - "Cancel" + "Cancel", ); sinon.assert.calledOnce(getServersStub); sinon.assert.notCalled(updateServersStub); @@ -1212,15 +1244,15 @@ describe("serverCommand", () => { }; queryConsoleErrorStub = sinon.stub( ExecutionConsole.prototype, - "appendQueryError" + "appendQueryError", ); writeQueryResultsToViewStub = sinon.stub( srvCommand, - "writeQueryResultsToView" + "writeQueryResultsToView", ); writeQueryResultsToConsoleStub = sinon.stub( srvCommand, - "writeQueryResultsToConsole" + "writeQueryResultsToConsole", ); isVisibleStub = sinon.stub(ext.resultsViewProvider, "isVisible"); }); @@ -1263,7 +1295,7 @@ describe("serverCommand", () => { alias: "insightsserveralias", auth: true, }, - TreeItemCollapsibleState.None + TreeItemCollapsibleState.None, ); const token: codeFlowLogin.IToken = { @@ -1414,7 +1446,7 @@ describe("serverCommand", () => { alias: "insightsserveralias", auth: true, }, - TreeItemCollapsibleState.None + TreeItemCollapsibleState.None, ); const token: codeFlowLogin.IToken = { accessToken: @@ -1432,7 +1464,7 @@ describe("serverCommand", () => { handleWSResultsStub = sinon.stub(queryUtils, "handleWSResults"); handleScratchpadTableResStub = sinon.stub( queryUtils, - "handleScratchpadTableRes" + "handleScratchpadTableRes", ); }); @@ -1498,7 +1530,7 @@ describe("serverCommand", () => { alias: "insightsserveralias", auth: true, }, - TreeItemCollapsibleState.None + TreeItemCollapsibleState.None, ); let getQueryContextStub, @@ -1540,7 +1572,7 @@ describe("serverCommand", () => { it("runQuery with PythonQueryFile not connected to inisghts node", () => { ext.connectionNode = undefined; const result = serverCommand.runQuery( - ExecutionTypes.PythonQuerySelection + ExecutionTypes.PythonQuerySelection, ); assert.equal(result, undefined); }); @@ -1548,7 +1580,7 @@ describe("serverCommand", () => { it("runQuery with PythonQueryFile connected to inisghts node", () => { ext.connectionNode = insightsNode; const result = serverCommand.runQuery( - ExecutionTypes.PythonQuerySelection + ExecutionTypes.PythonQuerySelection, ); assert.equal(result, undefined); }); @@ -1563,7 +1595,7 @@ describe("serverCommand", () => { ext.connectionNode = undefined; const result = serverCommand.runQuery( ExecutionTypes.ReRunQuery, - "rerun query" + "rerun query", ); assert.equal(result, undefined); }); diff --git a/test/suite/linter.test.ts b/test/suite/linter.test.ts index daf922a4..58d52e62 100644 --- a/test/suite/linter.test.ts +++ b/test/suite/linter.test.ts @@ -24,6 +24,7 @@ describe("linter", () => { describe("ASSIGN_RESERVED_WORD", () => { it("should lint assign reseved word", () => { const cst = QParser.parse("til:1"); + assert.deepEqual(QParser.errors, []); const ast = analyze(cst); const results = lint(ast); assert.strictEqual(results.length, 1); @@ -34,6 +35,7 @@ describe("linter", () => { describe("INVALID_ASSIGN", () => { it("should lint invalid assign", () => { const cst = QParser.parse("123:1"); + assert.deepEqual(QParser.errors, []); const ast = analyze(cst); const results = lint(ast); assert.strictEqual(results.length, 1); @@ -41,52 +43,52 @@ describe("linter", () => { }); }); - describe("DECLARED_AFTER_USE", () => { - it("should lint invalid assign", () => { - const cst = QParser.parse("a;a:1;"); - const ast = analyze(cst); - const results = lint(ast); - // TODO - assert.strictEqual(results.length, 0); - //assert.strictEqual(results[0].name, "DECLARED_AFTER_USE"); - }); - }); - describe("UNUSED_PARAM", () => { it("should lint unused param", () => { const cst = QParser.parse("{[a]}"); + assert.deepEqual(QParser.errors, []); const ast = analyze(cst); const results = lint(ast); assert.strictEqual(results.length, 1); assert.strictEqual(results[0].name, "UNUSED_PARAM"); }); + + it("should not lint unused param outside lambda scope", () => { + const cst = QParser.parse("[a:1];a"); + assert.deepEqual(QParser.errors, []); + const ast = analyze(cst); + assert.strictEqual(ast.assign[0].image, "a"); + const results = lint(ast); + assert.strictEqual(results.length, 0); + }); }); describe("UNUSED_VAR", () => { it("should lint unused var", () => { const cst = QParser.parse("a:1"); + assert.deepEqual(QParser.errors, []); const ast = analyze(cst); const results = lint(ast); assert.strictEqual(results.length, 1); assert.strictEqual(results[0].name, "UNUSED_VAR"); }); - }); - describe("LINE_LENGTH", () => { - it("should lint invalid line length", () => { - const cst = QParser.parse( - "123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901\n" - ); + it("should lint unused var in assign through", () => { + const cst = QParser.parse("+:[a;1]"); + assert.deepEqual(QParser.errors, []); const ast = analyze(cst); const results = lint(ast); assert.strictEqual(results.length, 1); - assert.strictEqual(results[0].name, "LINE_LENGTH"); + assert.strictEqual(results[0].name, "UNUSED_VAR"); }); + }); + describe("LINE_LENGTH", () => { it("should not lint valid line length", () => { const cst = QParser.parse( "12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890\n" ); + assert.deepEqual(QParser.errors, []); const ast = analyze(cst); const results = lint(ast); assert.strictEqual(results.length, 0); @@ -100,6 +102,7 @@ describe("linter", () => { usage += `i${i}:${i};i${i}*${i};`; } const cst = QParser.parse(`{${usage}}`); + assert.deepEqual(QParser.errors, []); const ast = analyze(cst); const results = lint(ast); assert.strictEqual(results.length, 1); @@ -118,6 +121,7 @@ describe("linter", () => { usage += `i${i}*${i};`; } const cst = QParser.parse(`${globals}{${usage}}`); + assert.deepEqual(QParser.errors, []); const ast = analyze(cst); const results = lint(ast); assert.strictEqual(results.length, 1); @@ -132,6 +136,7 @@ describe("linter", () => { text += `i${i};`; } const cst = QParser.parse(`{${text}}`); + assert.deepEqual(QParser.errors, []); const ast = analyze(cst); const results = lint(ast); assert.strictEqual(results.length, 1); @@ -142,10 +147,73 @@ describe("linter", () => { describe("DEPRECATED_DATETIME", () => { it("should lint datetime", () => { const cst = QParser.parse("2000.01.01T12:00:00.000"); + assert.deepEqual(QParser.errors, []); const ast = analyze(cst); const results = lint(ast); assert.strictEqual(results.length, 1); assert.strictEqual(results[0].name, "DEPRECATED_DATETIME"); }); }); + + describe("TOO_MANY_ARGUMENTS", () => { + it("should not lint too many arguments", () => { + const cst = QParser.parse( + "{[a, b, c, d, e, f, g, h, i] a*b*c*d*e*f*g*h*i}" + ); + assert.deepEqual(QParser.errors, []); + const ast = analyze(cst); + const results = lint(ast); + assert.strictEqual(results.length, 1); + assert.strictEqual(results[0].name, "TOO_MANY_ARGUMENTS"); + }); + }); + + describe("INVALID_ESCAPE", () => { + it("should lint invalid escape", () => { + const cst = QParser.parse('"\\a"'); + assert.deepEqual(QParser.errors, []); + const ast = analyze(cst); + const results = lint(ast); + assert.strictEqual(results.length, 1); + assert.strictEqual(results[0].name, "INVALID_ESCAPE"); + }); + }); + + describe("FIXED_SEED", () => { + it("should lint fixed seed", () => { + const cst = QParser.parse("1?0Ng"); + assert.deepEqual(QParser.errors, []); + const ast = analyze(cst); + const results = lint(ast); + assert.strictEqual(results.length, 1); + assert.strictEqual(results[0].name, "FIXED_SEED"); + }); + + it("should not lint fixed seed", () => { + const cst = QParser.parse("-1?0Ng"); + assert.deepEqual(QParser.errors, []); + const ast = analyze(cst); + const results = lint(ast); + assert.strictEqual(results.length, 0); + }); + }); + + describe("DECLARED_AFTER_USE", () => { + it("should lint declared after use", () => { + const cst = QParser.parse("a;a:1"); + assert.deepEqual(QParser.errors, []); + const ast = analyze(cst); + const results = lint(ast); + assert.strictEqual(results.length, 1); + assert.strictEqual(results[0].name, "DECLARED_AFTER_USE"); + }); + + it("should respect right to left", () => { + const cst = QParser.parse("(a;a:1)"); + assert.deepEqual(QParser.errors, []); + const ast = analyze(cst); + const results = lint(ast); + assert.strictEqual(results.length, 0); + }); + }); }); diff --git a/test/suite/models.test.ts b/test/suite/models.test.ts index 8e541cc3..d8a83fa5 100644 --- a/test/suite/models.test.ts +++ b/test/suite/models.test.ts @@ -268,7 +268,7 @@ describe("Models", () => { it("Should return sorted views", async () => { ext.connection = new Connection("localhost:5001"); - sinon.stub(ext.connection, "executeQuery").resolves("`vw1`vw2"); + sinon.stub(ext.connection, "executeQuery").resolves(["vw1", "vw2"]); const result = await loadViews(); assert.strictEqual(result[0], "vw1", "Should return the first view"); sinon.restore(); @@ -276,7 +276,7 @@ describe("Models", () => { it("Should return sorted views (reverse order)", async () => { ext.connection = new Connection("localhost:5001"); - sinon.stub(ext.connection, "executeQuery").resolves("`vw2`vw1"); + sinon.stub(ext.connection, "executeQuery").resolves(["vw1", "vw2"]); const result = await loadViews(); assert.strictEqual(result[0], "vw1", "Should return the first view"); sinon.restore(); diff --git a/test/suite/panels.test.ts b/test/suite/panels.test.ts index 71fd5fd7..f3508dbf 100644 --- a/test/suite/panels.test.ts +++ b/test/suite/panels.test.ts @@ -19,6 +19,8 @@ import { createDefaultDataSourceFile } from "../../src/models/dataSource"; import { DataSourcesPanel } from "../../src/panels/datasource"; import { KdbResultsViewProvider } from "../../src/services/resultsPanelProvider"; import * as utils from "../../src/utils/execution"; +import { InsightsNode, KdbNode } from "../../src/services/kdbTreeProvider"; +import { TreeItemCollapsibleState } from "vscode"; describe("WebPanels", () => { describe("DataSourcesPanel", () => { @@ -36,7 +38,7 @@ describe("WebPanels", () => { it("should create a new panel", () => { assert.ok( DataSourcesPanel.currentPanel, - "DataSourcesPanel.currentPanel should be truthy" + "DataSourcesPanel.currentPanel should be truthy", ); }); @@ -45,7 +47,7 @@ describe("WebPanels", () => { assert.strictEqual( DataSourcesPanel.currentPanel, undefined, - "DataSourcesPanel.currentPanel should be undefined" + "DataSourcesPanel.currentPanel should be undefined", ); }); @@ -54,7 +56,7 @@ describe("WebPanels", () => { const actualHtml = DataSourcesPanel.currentPanel._panel.webview.html; assert.ok( actualHtml.indexOf(expectedHtml) !== -1, - "Panel HTML should include expected web component" + "Panel HTML should include expected web component", ); }); }); @@ -63,6 +65,17 @@ describe("WebPanels", () => { const uriTest: vscode.Uri = vscode.Uri.parse("test"); let resultsPanel: KdbResultsViewProvider; + const insightsNode = new InsightsNode( + [], + "insightsnode1", + { + server: "insightsservername", + alias: "insightsserveralias", + auth: true, + }, + TreeItemCollapsibleState.None, + ); + beforeEach(() => { resultsPanel = new KdbResultsViewProvider(uriTest); }); @@ -158,12 +171,151 @@ describe("WebPanels", () => { }); describe("convertToGrid()", () => { - it("should return 'gridOptions' if queryResult is an empty string", () => { - const inputQueryResult = [{ a: "1" }, { a: "2" }, { a: "3" }]; - const expectedOutput = - '{"defaultColDef":{"sortable":true,"resizable":true,"filter":true,"flex":1,"minWidth":100},"rowData":[{"a":"1"},{"a":"2"},{"a":"3"}],"columnDefs":[{"field":"a","headerName":"a"}],"domLayout":"autoHeight","pagination":true,"paginationPageSize":100,"cacheBlockSize":100,"enableCellTextSelection":true,"ensureDomOrder":true,"suppressContextMenu":true,"suppressDragLeaveHidesColumns":true}'; - const actualOutput = resultsPanel.convertToGrid(inputQueryResult); - assert.strictEqual(actualOutput, expectedOutput); + it("should convert results to grid format for inisights", () => { + const results = { + rows: [ + { prop1: "value1", prop2: "value2" }, + { prop1: "value3", prop2: "value4" }, + ], + meta: { prop1: "type1", prop2: "type2" }, + }; + + const expectedOutput = JSON.stringify({ + defaultColDef: { + sortable: true, + resizable: true, + filter: true, + flex: 1, + minWidth: 100, + }, + rowData: [ + { prop1: "value1", prop2: "value2" }, + { prop1: "value3", prop2: "value4" }, + ], + columnDefs: [ + { + field: "prop1", + headerName: "prop1", + headerTooltip: "type1", + cellDataType: "text", + }, + { + field: "prop2", + headerName: "prop2", + headerTooltip: "type2", + cellDataType: "text", + }, + ], + domLayout: "autoHeight", + pagination: true, + paginationPageSize: 100, + enableCellTextSelection: true, + ensureDomOrder: true, + suppressContextMenu: true, + suppressDragLeaveHidesColumns: true, + tooltipShowDelay: 200, + }); + + // Mock ext.connectionNode + const stub = sinon.stub(ext, "connectionNode"); + stub.get(() => insightsNode); + + const output = resultsPanel.convertToGrid(results); + assert.equal(output, expectedOutput); + + // Restore the stub + stub.restore(); + }); + + it("should convert results to grid format with empty rows ", () => { + const results = { + rows: [], + meta: { prop1: "type1", prop2: "type2" }, + }; + + const expectedOutput = JSON.stringify({ + defaultColDef: { + sortable: true, + resizable: true, + filter: true, + flex: 1, + minWidth: 100, + }, + rowData: [], + columnDefs: [ + { + field: "prop1", + headerName: "prop1", + headerTooltip: "type1", + cellDataType: "text", + }, + { + field: "prop2", + headerName: "prop2", + headerTooltip: "type2", + cellDataType: "text", + }, + ], + domLayout: "autoHeight", + pagination: true, + paginationPageSize: 100, + enableCellTextSelection: true, + ensureDomOrder: true, + suppressContextMenu: true, + suppressDragLeaveHidesColumns: true, + tooltipShowDelay: 200, + }); + + // Mock ext.connectionNode + const stub = sinon.stub(ext, "connectionNode"); + stub.get(() => insightsNode); + + const output = resultsPanel.convertToGrid(results); + assert.equal(output, expectedOutput); + + // Restore the stub + stub.restore(); + }); + }); + + describe("generateColumnDefs", () => { + it("should return an array of column definitions if the results are not empty", () => { + const input = [ + { prop1: "value1", prop2: "value2" }, + { prop1: "value3", prop2: "value4" }, + ]; + const expectedOutput = [ + { + field: "prop1", + headerName: "prop1", + cellDataType: "text", + }, + { + field: "prop2", + headerName: "prop2", + cellDataType: "text", + }, + ]; + const actualOutput = resultsPanel.generateCoumnDefs(input, false); + assert.deepStrictEqual(actualOutput, expectedOutput); + }); + + it("should return the results if the results are array of strings", () => { + const input = ["value1", "value2"]; + const expectedOutput = [ + { + field: "value1", + headerName: "value1", + cellDataType: "text", + }, + { + field: "value2", + headerName: "value2", + cellDataType: "text", + }, + ]; + const actualOutput = resultsPanel.generateCoumnDefs(input, false); + assert.deepStrictEqual(actualOutput, expectedOutput); }); }); @@ -227,6 +379,7 @@ describe("WebPanels", () => { describe("_getWebviewContent", () => { const uriTest: vscode.Uri = vscode.Uri.parse("test"); + let resultsPanel: KdbResultsViewProvider; const view: vscode.WebviewView = { visible: true, @@ -258,14 +411,18 @@ describe("WebPanels", () => { { id: 2, test: "test2" }, ]; const expectedOutput = `"rowData":[{"id":1,"test":"test1"},{"id":2,"test":"test2"}],"columnDefs":[{"field":"id","headerName":"id"},{"field":"test","headerName":"test"}]`; + const stub = sinon + .stub(resultsPanel, "convertToGrid") + .returns(expectedOutput); const actualOutput = resultsPanel["_getWebviewContent"](input); assert.strictEqual(typeof actualOutput, "string"); assert.ok(actualOutput.includes(expectedOutput)); + stub.restore(); }); - it("returns no results", () => { + it("returns string results", () => { const input = "Test"; - const expectedOutput = `

Test

`; + const expectedOutput = `

Test

`; const actualOutput = resultsPanel["_getWebviewContent"](input); assert.strictEqual(typeof actualOutput, "string"); assert.ok(actualOutput.includes(expectedOutput)); diff --git a/test/suite/parser.test.ts b/test/suite/parser.test.ts index 6d23a4cd..5f59852d 100644 --- a/test/suite/parser.test.ts +++ b/test/suite/parser.test.ts @@ -12,13 +12,7 @@ */ import * as assert from "assert"; -import { - CharLiteral, - EntityType, - QLexer, - QParser, - analyze, -} from "../../server/src/parser"; +import { CharLiteral, QLexer, QParser } from "../../server/src/parser"; describe("QLexer", () => { describe("CharLiteral", () => { @@ -109,12 +103,3 @@ describe("QParser", () => { }); }); }); - -describe("QVisitor", () => { - it("should analyze identifier", () => { - const text = "a"; - const cst = QParser.parse(text); - const { script } = analyze(cst); - assert.strictEqual(script[0].type, EntityType.IDENTIFIER); - }); -}); diff --git a/test/suite/qLangServer.test.ts b/test/suite/qLangServer.test.ts index f3624cd9..448d426c 100644 --- a/test/suite/qLangServer.test.ts +++ b/test/suite/qLangServer.test.ts @@ -56,6 +56,7 @@ describe("qLangServer", () => { onDocumentSymbol() {}, onReferences() {}, onRenameRequest() {}, + onDidChangeConfiguration() {}, sendDiagnostics() {}, languages: { semanticTokens: { diff --git a/test/suite/services.test.ts b/test/suite/services.test.ts index e86a6d82..a84d5c1e 100644 --- a/test/suite/services.test.ts +++ b/test/suite/services.test.ts @@ -14,7 +14,7 @@ import axios from "axios"; import assert from "node:assert"; import sinon from "sinon"; -import { TreeItemCollapsibleState } from "vscode"; +import { TreeItemCollapsibleState, env } from "vscode"; import { ext } from "../../src/extensionVariables"; import { Insights } from "../../src/models/insights"; import { QueryHistory } from "../../src/models/queryHistory"; @@ -69,13 +69,13 @@ describe("kdbTreeProvider", () => { ["child1"], "testElement", servers["testServer"], - TreeItemCollapsibleState.None + TreeItemCollapsibleState.None, ); insightNode = new InsightsNode( ["child1"], "testElement", insights["testInsight"], - TreeItemCollapsibleState.None + TreeItemCollapsibleState.None, ); }); @@ -84,7 +84,7 @@ describe("kdbTreeProvider", () => { assert.notStrictEqual( kdbProvider, undefined, - "KdbTreeProvider should be created." + "KdbTreeProvider should be created.", ); }); @@ -94,7 +94,7 @@ describe("kdbTreeProvider", () => { assert.notStrictEqual( kdbProvider, undefined, - "KdbTreeProvider should be created." + "KdbTreeProvider should be created.", ); }); @@ -112,7 +112,7 @@ describe("kdbTreeProvider", () => { assert.notStrictEqual( kdbProvider, undefined, - "KdbTreeProvider should be created." + "KdbTreeProvider should be created.", ); }); @@ -127,7 +127,7 @@ describe("kdbTreeProvider", () => { assert.notStrictEqual( kdbProvider, undefined, - "KdbTreeProvider should be created." + "KdbTreeProvider should be created.", ); }); @@ -137,7 +137,7 @@ describe("kdbTreeProvider", () => { assert.strictEqual( element.label, kdbNode.label, - "Get kdb node element is incorrect" + "Get kdb node element is incorrect", ); }); @@ -147,7 +147,7 @@ describe("kdbTreeProvider", () => { assert.strictEqual( element.label, insightNode.label, - "Get insights node element is incorrect" + "Get insights node element is incorrect", ); }); @@ -176,7 +176,7 @@ describe("kdbTreeProvider", () => { auth: false, tls: false, }, - TreeItemCollapsibleState.None + TreeItemCollapsibleState.None, ); kdbNode.contextValue = "testServerAlias"; kdbProvider.getChildren(kdbNode); @@ -197,7 +197,7 @@ describe("kdbTreeProvider", () => { auth: false, tls: false, }, - TreeItemCollapsibleState.None + TreeItemCollapsibleState.None, ); kdbProvider.getChildren(kdbNode); const result = await kdbProvider.getChildren(kdbNode); @@ -217,7 +217,7 @@ describe("kdbTreeProvider", () => { auth: false, tls: false, }, - TreeItemCollapsibleState.None + TreeItemCollapsibleState.None, ); kdbNode.contextValue = "ns"; kdbProvider.getChildren(kdbNode); @@ -237,12 +237,12 @@ describe("kdbTreeProvider", () => { auth: false, tls: false, }, - TreeItemCollapsibleState.None + TreeItemCollapsibleState.None, ); assert.strictEqual( kdbNode.label, "kdbnode1 [kdbserveralias]", - "KdbNode node creation failed" + "KdbNode node creation failed", ); }); @@ -258,12 +258,12 @@ describe("kdbTreeProvider", () => { auth: false, tls: false, }, - TreeItemCollapsibleState.None + TreeItemCollapsibleState.None, ); assert.strictEqual( kdbNode.label, "kdbnode1", - "KdbNode node creation failed" + "KdbNode node creation failed", ); }); @@ -279,12 +279,12 @@ describe("kdbTreeProvider", () => { auth: false, tls: false, }, - TreeItemCollapsibleState.None + TreeItemCollapsibleState.None, ); assert.strictEqual( kdbNode.label, "kdbnode1 [kdbserveralias]", - "KdbNode node creation failed" + "KdbNode node creation failed", ); }); @@ -300,7 +300,7 @@ describe("kdbTreeProvider", () => { auth: false, tls: false, }, - TreeItemCollapsibleState.None + TreeItemCollapsibleState.None, ); ext.connectionNode = kdbNode; @@ -316,13 +316,13 @@ describe("kdbTreeProvider", () => { auth: false, tls: false, }, - TreeItemCollapsibleState.None + TreeItemCollapsibleState.None, ); assert.strictEqual( kdbNode1.label, "kdbnode1 [kdbserveralias] (connected)", - "KdbNode node creation failed" + "KdbNode node creation failed", ); }); @@ -340,7 +340,7 @@ describe("kdbTreeProvider", () => { auth: false, tls: false, }, - TreeItemCollapsibleState.None + TreeItemCollapsibleState.None, ); assert.equal(ext.kdbNodesWithoutTls.length, 1); }); @@ -359,7 +359,7 @@ describe("kdbTreeProvider", () => { auth: false, tls: true, }, - TreeItemCollapsibleState.None + TreeItemCollapsibleState.None, ); assert.equal(ext.kdbNodesWithoutTls, 0); }); @@ -378,7 +378,7 @@ describe("kdbTreeProvider", () => { auth: false, tls: false, }, - TreeItemCollapsibleState.None + TreeItemCollapsibleState.None, ); assert.equal(ext.kdbNodesWithoutAuth.length, 1); }); @@ -397,7 +397,7 @@ describe("kdbTreeProvider", () => { auth: true, tls: false, }, - TreeItemCollapsibleState.None + TreeItemCollapsibleState.None, ); assert.equal(ext.kdbNodesWithoutAuth, 0); }); @@ -410,7 +410,7 @@ describe("kdbTreeProvider", () => { alias: "insightsserveralias", auth: true, }, - TreeItemCollapsibleState.None + TreeItemCollapsibleState.None, ); ext.kdbinsightsNodes.pop(); @@ -418,7 +418,7 @@ describe("kdbTreeProvider", () => { assert.strictEqual( insightsNode.label, "insightsnode1", - "InsightsNode node creation failed" + "InsightsNode node creation failed", ); }); @@ -431,7 +431,7 @@ describe("kdbTreeProvider", () => { alias: "insightsserveralias", auth: true, }, - TreeItemCollapsibleState.None + TreeItemCollapsibleState.None, ); ext.kdbinsightsNodes.pop(); @@ -439,7 +439,7 @@ describe("kdbTreeProvider", () => { assert.strictEqual( insightsNode.label, "insightsnode1", - "InsightsNode node creation failed" + "InsightsNode node creation failed", ); }); @@ -452,7 +452,7 @@ describe("kdbTreeProvider", () => { alias: "insightsserveralias", auth: true, }, - TreeItemCollapsibleState.None + TreeItemCollapsibleState.None, ); ext.connectionNode = insightsNode; @@ -465,7 +465,7 @@ describe("kdbTreeProvider", () => { alias: "insightsserveralias", auth: true, }, - TreeItemCollapsibleState.None + TreeItemCollapsibleState.None, ); ext.kdbinsightsNodes.pop(); @@ -473,7 +473,7 @@ describe("kdbTreeProvider", () => { assert.strictEqual( insightsNode1.label, "insightsnode1 (connected)", - "InsightsNode node creation failed" + "InsightsNode node creation failed", ); }); @@ -483,12 +483,12 @@ describe("kdbTreeProvider", () => { "nsnode1", "nsnodedetails1", TreeItemCollapsibleState.None, - "nsfullname" + "nsfullname", ); assert.strictEqual( qNsNode.label, "nsnode1", - "QNamespaceNode node creation failed" + "QNamespaceNode node creation failed", ); }); @@ -498,12 +498,12 @@ describe("kdbTreeProvider", () => { "categorynode1", "categorynodedetails1", "categoryns", - TreeItemCollapsibleState.None + TreeItemCollapsibleState.None, ); assert.strictEqual( qCategoryNode.label, "categorynode1", - "QCategoryNode node creation failed" + "QCategoryNode node creation failed", ); }); @@ -513,12 +513,12 @@ describe("kdbTreeProvider", () => { "servernode1", "servernodedetails1", TreeItemCollapsibleState.None, - "" + "", ); assert.strictEqual( qServerNode.label, "servernode1", - "QServer node creation failed" + "QServer node creation failed", ); }); }); @@ -551,12 +551,12 @@ describe("Code flow login service tests", () => { sinon.stub(axios, "post").resolves(Promise.resolve({ data: token })); const result = await refreshToken( "http://localhost", - JSON.stringify(token) + JSON.stringify(token), ); assert.strictEqual( result.accessToken, token.access_token, - "Token has not refreshed correctly" + "Token has not refreshed correctly", ); }); @@ -565,7 +565,7 @@ describe("Code flow login service tests", () => { assert.strictEqual( result, undefined, - "Should return undefined when server name is empty." + "Should return undefined when server name is empty.", ); }); @@ -574,9 +574,14 @@ describe("Code flow login service tests", () => { assert.strictEqual( result, undefined, - "Should return undefined when server alias is empty." + "Should return undefined when server alias is empty.", ); }); + + it("Should not sign in if link is not opened", async () => { + sinon.stub(env, "openExternal").value(async () => false); + await assert.rejects(() => signIn("http://127.0.0.1")); + }); }); describe("queryHistoryProvider", () => { @@ -613,7 +618,7 @@ describe("queryHistoryProvider", () => { assert.notStrictEqual( queryHistoryProvider, undefined, - "queryHistoryProvider should be created." + "queryHistoryProvider should be created.", ); }); it("Should refresh the provider", () => { @@ -622,7 +627,7 @@ describe("queryHistoryProvider", () => { assert.notStrictEqual( queryHistoryProvider, undefined, - "queryHistoryProvider should be created." + "queryHistoryProvider should be created.", ); }); @@ -630,14 +635,14 @@ describe("queryHistoryProvider", () => { const queryHistoryTreeItem = new QueryHistoryTreeItem( "testLabel", dummyQueryHistory[0], - TreeItemCollapsibleState.None + TreeItemCollapsibleState.None, ); const queryHistoryProvider = new QueryHistoryProvider(); const element = queryHistoryProvider.getTreeItem(queryHistoryTreeItem); assert.strictEqual( element.label, queryHistoryTreeItem.label, - "Get query history item is incorrect" + "Get query history item is incorrect", ); }); @@ -661,25 +666,25 @@ describe("queryHistoryProvider", () => { const queryHistoryTreeItem = new QueryHistoryTreeItem( "testLabel", dummyQueryHistory[0], - TreeItemCollapsibleState.None + TreeItemCollapsibleState.None, ); assert.strictEqual( queryHistoryTreeItem.label, "testLabel", - "QueryHistoryTreeItem node creation failed" + "QueryHistoryTreeItem node creation failed", ); }); it("Should return a new QueryHistoryTreeItem with sucess icom", () => { const queryHistoryTreeItem = new QueryHistoryTreeItem( "testLabel", dummyQueryHistory[0], - TreeItemCollapsibleState.None + TreeItemCollapsibleState.None, ); const result = queryHistoryTreeItem.defineQueryIcon(true); assert.strictEqual( result, sucessIcon, - "QueryHistoryTreeItem defineQueryIcon failed" + "QueryHistoryTreeItem defineQueryIcon failed", ); }); @@ -687,13 +692,13 @@ describe("queryHistoryProvider", () => { const queryHistoryTreeItem = new QueryHistoryTreeItem( "testLabel", dummyQueryHistory[0], - TreeItemCollapsibleState.None + TreeItemCollapsibleState.None, ); const result = queryHistoryTreeItem.defineQueryIcon(false); assert.strictEqual( result, failIcon, - "QueryHistoryTreeItem defineQueryIcon failed" + "QueryHistoryTreeItem defineQueryIcon failed", ); }); }); diff --git a/test/suite/utils.test.ts b/test/suite/utils.test.ts index 7ed343ef..f2485fd2 100644 --- a/test/suite/utils.test.ts +++ b/test/suite/utils.test.ts @@ -40,6 +40,12 @@ import { showQuickPick, } from "../../src/utils/userInteraction"; import { validateUtils } from "../../src/utils/validateUtils"; +import { DCDS } from "../../src/ipc/c"; +import { + DDateClass, + DDateTimeClass, + DTimestampClass, +} from "../../src/ipc/cClasses"; interface ITestItem extends vscode.QuickPickItem { id: number; @@ -91,7 +97,7 @@ describe("Utils", () => { beforeEach(() => { getConfigurationStub = sinon.stub( vscode.workspace, - "getConfiguration" + "getConfiguration", ) as sinon.SinonStub; }); @@ -154,12 +160,12 @@ describe("Utils", () => { it("checkIfTimeParamIsCorrect", () => { const result = dataSourceUtils.checkIfTimeParamIsCorrect( "2021-01-01", - "2021-01-02" + "2021-01-02", ); assert.strictEqual(result, true); const result2 = dataSourceUtils.checkIfTimeParamIsCorrect( "2021-01-02", - "2021-01-01" + "2021-01-01", ); assert.strictEqual(result2, false); }); @@ -316,6 +322,69 @@ describe("Utils", () => { assert.deepStrictEqual(result, expectedOutput); }); }); + + describe("convertArrayOfObjectsToArrays", () => { + it("convertStringToArray handles string with separator", () => { + const input = "key1 | value1\nkey2 | value2"; + const expectedOutput = [ + { Index: 1, Key: "key1", Value: "value1" }, + { Index: 2, Key: "key2", Value: "value2" }, + ]; + const output = executionUtils.convertStringToArray(input); + assert.deepStrictEqual(output, expectedOutput); + }); + + it("convertStringToArray handles string without separator", () => { + const input = "value1\nvalue2"; + const expectedOutput = [ + { Index: 1, Value: "value1" }, + { Index: 2, Value: "value2" }, + ]; + const output = executionUtils.convertStringToArray(input); + assert.deepStrictEqual(output, expectedOutput); + }); + + it("convertStringToArray handles string with field names and lengths", () => { + const input = "name age\n---\nJohn 25\nDoe 30"; + const expectedOutput = [ + { Index: 1, name: "John", age: "25" }, + { Index: 2, name: "Doe", age: "30" }, + ]; + const output = executionUtils.convertStringToArray(input); + assert.deepStrictEqual(output, expectedOutput); + }); + + it("convertStringToArray filters out lines starting with '-'", () => { + const input = "key1 | value1\nkey2 | value2\nkey3 | value3"; + const expectedOutput = [ + { Index: 1, Key: "key1", Value: "value1" }, + { Index: 2, Key: "key2", Value: "value2" }, + { Index: 3, Key: "key3", Value: "value3" }, + ]; + const output = executionUtils.convertStringToArray(input); + assert.deepStrictEqual(output, expectedOutput); + }); + + it("convertStringToArray handles single value results", () => { + const input = "2001.01.01D12:00:00.000000000\n"; + const expectedOutput = [ + { Index: 1, Value: "2001.01.01D12:00:00.000000000" }, + ]; + const output = executionUtils.convertStringToArray(input); + assert.deepStrictEqual(output, expectedOutput); + }); + + it("convertStringToArray handles single line with multiple value results", () => { + const input = + "2001.01.01D12:00:00.000000000 2001.01.01D12:00:00.000000001\n"; + const expectedOutput = [ + { Index: 1, Value: "2001.01.01D12:00:00.000000000" }, + { Index: 2, Value: "2001.01.01D12:00:00.000000001" }, + ]; + const output = executionUtils.convertStringToArray(input); + assert.deepStrictEqual(output, expectedOutput); + }); + }); }); describe("executionConsole", () => { @@ -335,7 +404,7 @@ describe("Utils", () => { auth: false, tls: false, }, - TreeItemCollapsibleState.None + TreeItemCollapsibleState.None, ); const insightsNode = new InsightsNode( @@ -346,7 +415,7 @@ describe("Utils", () => { alias: "insightsserveralias", auth: true, }, - TreeItemCollapsibleState.None + TreeItemCollapsibleState.None, ); beforeEach(() => { @@ -372,7 +441,7 @@ describe("Utils", () => { assert.strictEqual(ext.kdbQueryHistoryList[0].success, true); assert.strictEqual( ext.kdbQueryHistoryList[0].connectionType, - ServerType.KDB + ServerType.KDB, ); getConfigurationStub.restore(); @@ -395,7 +464,7 @@ describe("Utils", () => { assert.strictEqual(ext.kdbQueryHistoryList[0].success, true); assert.strictEqual( ext.kdbQueryHistoryList[0].connectionType, - ServerType.KDB + ServerType.KDB, ); getConfigurationStub.restore(); }); @@ -412,7 +481,7 @@ describe("Utils", () => { assert.strictEqual(ext.kdbQueryHistoryList[0].success, true); assert.strictEqual( ext.kdbQueryHistoryList[0].connectionType, - ServerType.INSIGHTS + ServerType.INSIGHTS, ); }); @@ -428,7 +497,7 @@ describe("Utils", () => { assert.strictEqual(ext.kdbQueryHistoryList[0].success, false); assert.strictEqual( ext.kdbQueryHistoryList[0].connectionType, - ServerType.KDB + ServerType.KDB, ); }); @@ -444,7 +513,7 @@ describe("Utils", () => { assert.strictEqual(ext.kdbQueryHistoryList[0].success, false); assert.strictEqual( ext.kdbQueryHistoryList[0].connectionType, - ServerType.INSIGHTS + ServerType.INSIGHTS, ); }); @@ -460,7 +529,7 @@ describe("Utils", () => { assert.strictEqual(ext.kdbQueryHistoryList[0].success, false); assert.strictEqual( ext.kdbQueryHistoryList[0].connectionType, - ServerType.undefined + ServerType.undefined, ); }); }); @@ -476,7 +545,7 @@ describe("Utils", () => { query, connectionName, connectionType, - true + true, ); assert.strictEqual(ext.kdbQueryHistoryList.length, 1); }); @@ -501,7 +570,7 @@ describe("Utils", () => { "testPanel", "Test Panel", vscode.ViewColumn.One, - {} + {}, ); const webview = panel.webview; const extensionUri = vscode.Uri.parse("file:///path/to/extension"); @@ -515,7 +584,7 @@ describe("Utils", () => { "testPanel", "Test Panel", vscode.ViewColumn.One, - {} + {}, ); const webview = panel.webview; const extensionUri = vscode.Uri.parse("file:///path/to/extension"); @@ -543,89 +612,6 @@ describe("Utils", () => { }); }); - // describe("Output", () => { - // let windowCreateOutputChannelStub: sinon.SinonStub; - // let outputChannelAppendStub: sinon.SinonStub; - // let outputChannelAppendLineStub: sinon.SinonStub; - // let outputChannelShowStub: sinon.SinonStub; - // let outputChannelHideStub: sinon.SinonStub; - // let outputChannelDisposeStub: sinon.SinonStub; - // Output._outputChannel = { - // name: "", - // append: sinon.stub(), - // appendLine: sinon.stub(), - // show: sinon.stub(), - // hide: sinon.stub(), - // dispose: sinon.stub(), - // } as unknown as vscode.OutputChannel; - - // beforeEach(() => { - // windowCreateOutputChannelStub = sinon.stub( - // vscode.window, - // "createOutputChannel" - // ); - // outputChannelAppendStub = sinon.stub(Output._outputChannel, "append"); - // outputChannelAppendLineStub = sinon.stub( - // Output._outputChannel, - // "appendLine" - // ); - // outputChannelShowStub = sinon.stub(Output._outputChannel, "show"); - // outputChannelHideStub = sinon.stub(Output._outputChannel, "hide"); - // outputChannelDisposeStub = sinon.stub(Output._outputChannel, "dispose"); - // }); - - // afterEach(() => { - // windowCreateOutputChannelStub.restore(); - // outputChannelAppendStub.restore(); - // outputChannelAppendLineStub.restore(); - // outputChannelShowStub.restore(); - // outputChannelHideStub.restore(); - // outputChannelDisposeStub.restore(); - // }); - - // it("should create an output channel with the correct name", () => { - // Output._outputChannel = undefined as unknown as vscode.OutputChannel; - // windowCreateOutputChannelStub.returns(Output._outputChannel); - // Output._outputChannel = - // Output._outputChannel || - // vscode.window.createOutputChannel("kdb-telemetry"); - // assert.ok(windowCreateOutputChannelStub.calledOnceWith("kdb-telemetry")); - // }); - - // it("should append a message to the output channel", () => { - // const label = "label"; - // const message = "message"; - // Output.output(label, message); - // assert.ok( - // outputChannelAppendStub.calledOnceWith(`[${label}] ${message}`) - // ); - // }); - - // it("should append a message with a newline to the output channel", () => { - // const label = "label"; - // const message = "message"; - // Output.outputLine(label, message); - // assert.ok( - // outputChannelAppendLineStub.calledOnceWith(`[${label}] ${message}`) - // ); - // }); - - // it("should show the output channel", () => { - // Output.show(); - // assert.ok(outputChannelShowStub.calledOnce); - // }); - - // it("should hide the output channel", () => { - // Output.hide(); - // assert.ok(outputChannelHideStub.calledOnce); - // }); - - // it("should dispose the output channel", () => { - // Output.dispose(); - // assert.ok(outputChannelDisposeStub.calledOnce); - // }); - // }); - describe("queryUtils", () => { it("sanitizeQuery", () => { const query1 = "`select from t"; @@ -637,25 +623,35 @@ describe("Utils", () => { }); describe("getValueFromArray", () => { + let inputSample: DCDS = undefined; + beforeEach(() => { + inputSample = { + class: "203", + columns: ["Value"], + meta: { Value: 7 }, + rows: [], + }; + }); + it("should return the value of the 'Value' property if the input is an array with a single object with a 'Value' property", () => { - const input = [{ Value: "hello" }]; - const expectedOutput = "hello"; - const actualOutput = queryUtils.getValueFromArray(input); - assert.strictEqual(actualOutput, expectedOutput); + inputSample.rows = [{ Value: "hello" }]; + const expectedOutput = [{ Value: "hello" }]; + const actualOutput = queryUtils.getValueFromArray(inputSample); + console.log(JSON.stringify(actualOutput.rows)); + assert.deepEqual(actualOutput.rows, expectedOutput); }); it("should return the input array if it is not an array with a single object with a 'Value' property", () => { - const input = ["hello", "world"]; - const expectedOutput = ["hello", "world"]; - const actualOutput = queryUtils.getValueFromArray(input); - assert.deepStrictEqual(actualOutput, expectedOutput); + inputSample.rows = [{ Value: "hello" }, { Value: "world" }]; + const expectedOutput = [{ Value: "hello" }, { Value: "world" }]; + const actualOutput = queryUtils.getValueFromArray(inputSample); + assert.deepStrictEqual(actualOutput.rows, expectedOutput); }); it("should return the input array if it is an empty array", () => { - const input: any[] = []; const expectedOutput: any[] = []; - const actualOutput = queryUtils.getValueFromArray(input); - assert.deepStrictEqual(actualOutput, expectedOutput); + const actualOutput = queryUtils.getValueFromArray(inputSample); + assert.deepStrictEqual(actualOutput.rows, expectedOutput); }); }); @@ -668,15 +664,17 @@ describe("Utils", () => { it("should return the result of getValueFromArray if the results are an array with a single object with a 'Value' property", () => { const ab = new ArrayBuffer(128); - const expectedOutput = "10"; - const uriTest: vscode.Uri = vscode.Uri.parse("test"); - ext.resultsViewProvider = new KdbResultsViewProvider(uriTest); - const qtableStub = sinon.stub(QTable.default, "toLegacy").returns({ + const expectedOutput = { class: "203", columns: ["Value"], meta: { Value: 7 }, rows: [{ Value: "10" }], - }); + }; + const uriTest: vscode.Uri = vscode.Uri.parse("test"); + ext.resultsViewProvider = new KdbResultsViewProvider(uriTest); + const qtableStub = sinon + .stub(QTable.default, "toLegacy") + .returns(expectedOutput); const isVisibleStub = sinon .stub(ext.resultsViewProvider, "isVisible") .returns(true); @@ -684,49 +682,146 @@ describe("Utils", () => { const result = queryUtils.handleWSResults(ab); sinon.assert.notCalled(convertRowsSpy); assert.strictEqual(result, expectedOutput); + sinon.restore(); }); }); describe("handleScratchpadTableRes", () => { - it("should return the input if it is not an array", () => { - const input = "not an array"; - const result = queryUtils.handleScratchpadTableRes(input); - assert.strictEqual(result, input); - }); - - it("should convert object values with 'i' property to string", () => { - const input = [ - { key1: { i: 123 }, key2: "value2" }, - { key3: { i: 456 }, key4: "value4" }, - ]; - const expected = [ - { key1: "[object Object]", key2: "value2" }, - { key3: "[object Object]", key4: "value4" }, - ]; - const result = queryUtils.handleScratchpadTableRes(input); - assert.deepStrictEqual(result, expected); + let inputSample: DCDS = undefined; + beforeEach(() => { + inputSample = { + class: "203", + columns: ["Value"], + meta: { Value: 7 }, + rows: [], + }; }); it("should convert bigint values to number", () => { - const input = [ + inputSample.rows = [ { key1: BigInt(123), key2: "value2" }, { key3: BigInt(456), key4: "value4" }, ]; const expected = [ - { key1: 123, key2: "value2" }, - { key3: 456, key4: "value4" }, + { Index: 1, key1: 123, key2: "value2" }, + { Index: 2, key3: 456, key4: "value4" }, ]; - const result = queryUtils.handleScratchpadTableRes(input); - assert.deepStrictEqual(result, expected); + const result = queryUtils.handleScratchpadTableRes(inputSample); + assert.deepStrictEqual(result.rows, expected); }); it("should not modify other values", () => { - const input = [ + inputSample.rows = [ { key1: "value1", key2: "value2" }, { key3: "value3", key4: "value4" }, ]; - const result = queryUtils.handleScratchpadTableRes(input); - assert.deepStrictEqual(result, input); + const result = queryUtils.handleScratchpadTableRes(inputSample); + assert.deepStrictEqual(result.rows, inputSample.rows); + }); + + it("should return case results is string type", () => { + const result = queryUtils.handleScratchpadTableRes("test"); + assert.strictEqual(result, "test"); + }); + + it("should return same results case results.rows is undefined", () => { + inputSample.rows = undefined; + const result = queryUtils.handleScratchpadTableRes(inputSample); + assert.strictEqual(result, inputSample); + }); + + it("should return same results case results.rows is an empty array", () => { + const result = queryUtils.handleScratchpadTableRes(inputSample); + assert.strictEqual(result, inputSample); + }); + }); + + describe("checkIfIsQDateTypes", () => { + it("should return string representation of DTimestampClass instance", () => { + const input = { Value: new DTimestampClass(978350400000, 0) }; + const expectedOutput = input.Value.toString(); + + const output = queryUtils.checkIfIsQDateTypes(input); + assert.strictEqual(output, expectedOutput); + }); + + it("should return string representation of DDateTimeClass instance", () => { + const input = { Value: new DDateTimeClass(978350400000) }; + const expectedOutput = input.Value.toString(); + + const output = queryUtils.checkIfIsQDateTypes(input); + assert.strictEqual(output, expectedOutput); + }); + + it("should return string representation of DDateClass instance", () => { + const input = { Value: new DDateClass(978350400000) }; + const expectedOutput = input.Value.toString(); + + const output = queryUtils.checkIfIsQDateTypes(input); + assert.strictEqual(output, expectedOutput); + }); + + it("should return input as is when Value is not an instance of DTimestampClass, DDateTimeClass, or DDateClass", () => { + const input = { + Value: + "not an instance of DTimestampClass, DDateTimeClass, or DDateClass", + }; + + const output = queryUtils.checkIfIsQDateTypes(input); + assert.deepStrictEqual(output, input); + }); + }); + + describe("addIndexKey", () => { + it("should add index key to array of objects", () => { + const input = [ + { prop1: "value1", prop2: "value2" }, + { prop1: "value3", prop2: "value4" }, + ]; + + const expectedOutput = [ + { Index: 1, prop1: "value1", prop2: "value2" }, + { Index: 2, prop1: "value3", prop2: "value4" }, + ]; + + const output = queryUtils.addIndexKey(input); + assert.deepStrictEqual(output, expectedOutput); + }); + + it("should add index key to single object", () => { + const input = { prop1: "value1", prop2: "value2" }; + + const expectedOutput = [{ Index: 1, prop1: "value1", prop2: "value2" }]; + + const output = queryUtils.addIndexKey(input); + assert.deepStrictEqual(output, expectedOutput); + }); + + it("should return empty array when input is empty array", () => { + const input = []; + + const expectedOutput = []; + + const output = queryUtils.addIndexKey(input); + assert.deepStrictEqual(output, expectedOutput); + }); + + it("should not add index key when it already exists", () => { + const input = [{ Index: 5, prop1: "value1", prop2: "value2" }]; + + const expectedOutput = [{ Index: 5, prop1: "value1", prop2: "value2" }]; + + const output = queryUtils.addIndexKey(input); + assert.deepStrictEqual(output, expectedOutput); + }); + + it("should add index key to non-array input", () => { + const input = "not an array"; + + const expectedOutput = [{ Index: 1, Value: "not an array" }]; + + const output = queryUtils.addIndexKey(input); + assert.deepStrictEqual(output, expectedOutput); }); }); @@ -741,16 +836,31 @@ describe("Utils", () => { b: 4, }, ]; - const expectedRes = ["a#$#;#$#b", "1#$#;#$#2", "3#$#;#$#4"].toString(); + const expectedRes = ["a b \n------\n1 2 \n3 4 \n\n"].toString(); const result = queryUtils.convertRows(rows); assert.equal(result, expectedRes); }); - it("convertRowsToConsole", () => { - const rows = ["a,b", "1,2", "3,4"]; - const expectedRes = ["a,b ", "-----", "1,2 ", "3,4 "].toString(); - const result = queryUtils.convertRowsToConsole(rows); - assert.equal(result, expectedRes); + describe("convertRowsToConsole", () => { + it("should work with headers", () => { + const rows = ["a#$#;header;#$#b", "1#$#;#$#2", "3#$#;#$#4"]; + const expectedRes = ["a b ", "------", "1 2 ", "3 4 "]; + const result = queryUtils.convertRowsToConsole(rows); + assert.deepEqual(result, expectedRes); + }); + it("should work without headers", () => { + const rows = ["a#$#;#$#1", "b#$#;#$#2", "c#$#;#$#3"]; + const expectedRes = ["a| 1 ", "b| 2 ", "c| 3 "]; + const result = queryUtils.convertRowsToConsole(rows); + assert.deepEqual(result, expectedRes); + }); + + it("should work with empty rows", () => { + const rows = []; + const expectedRes = []; + const result = queryUtils.convertRowsToConsole(rows); + assert.deepEqual(result, expectedRes); + }); }); it("getConnectionType", () => { @@ -809,12 +919,12 @@ describe("Utils", () => { getConfigurationStub = sinon.stub(vscode.workspace, "getConfiguration"); showInformationMessageStub = sinon.stub( vscode.window, - "showInformationMessage" + "showInformationMessage", ) as sinon.SinonStub< [ message: string, options: vscode.MessageOptions, - ...items: vscode.MessageItem[] + ...items: vscode.MessageItem[], ], Thenable >; diff --git a/test/suite/webview.test.ts b/test/suite/webview.test.ts index 8f901d9c..f0fd7e9f 100644 --- a/test/suite/webview.test.ts +++ b/test/suite/webview.test.ts @@ -98,6 +98,15 @@ describe("KdbDataSourceView", () => { }); }); + describe("message", () => { + it("should update status", () => { + view["message"](>{ + data: { running: true }, + }); + assert.strictEqual(view.running, true); + }); + }); + describe("selectTab", () => { it("should return the selected tab", () => { sinon.stub(view, "selectedType").value("DEFAULT"); @@ -169,7 +178,7 @@ describe("KdbDataSourceView", () => { assert.deepEqual(result[0].values, ["getData", true, "getData"]); }); - it("should render other api", () => { + it.skip("should render other api", () => { sinon.stub(view, "isInsights").value(true); sinon.stub(view, "isMetaLoaded").value(true); sinon.stub(view, "insightsMeta").value({ api: [{ api: "other" }] });