diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..9cb8ad9 --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,57 @@ +name: Run VSCode Extension Tests + +on: + push: + branches: + - superbol-vscode-debug + pull_request: + branches: + - superbol-vscode-debug + +jobs: + test: + strategy: + matrix: + os: + - ubuntu-latest + - macos-latest + - windows-latest + node: + - 20 + code-version: + - stable + - 1.66.0 + include: + - { os: ubuntu-latest, node: 22, code-version: stable } + - { os: ubuntu-latest, node: 24, code-version: stable } + runs-on: ${{ matrix.os }} + name: Test with Node ${{ matrix.node }} and VSCode ${{ matrix.code-version }} on ${{ matrix.os }} + steps: + - name: Checkout code + uses: actions/checkout@v2 + + - name: Setup Node.js environment + uses: actions/setup-node@v6 + with: + node-version: ${{ matrix.node }} + # node-version-file: 'package.json' + + - name: Install dependencies + run: npm install + + - name: Compile + run: npm run compile + + - name: Cache VSCode test directory + uses: actions/cache@v4 + with: + path: .vscode-test + key: ${{ runner.os }}-${{ matrix.node }}-${{ matrix.code-version }}-vscode-test-${{ hashFiles('package-lock.json') }} + + - name: Run tests + run: xvfb-run -a npm test -- --code-version ${{ matrix.code-version }} + if: runner.os == 'Linux' + + - name: Run tests + run: npm test -- --code-version ${{ matrix.code-version }} + if: runner.os != 'Linux' diff --git a/.github/workflows/nodejs.yml b/.github/workflows/nodejs.yml deleted file mode 100644 index 7be86bc..0000000 --- a/.github/workflows/nodejs.yml +++ /dev/null @@ -1,23 +0,0 @@ -# This workflow will do a clean install of node dependencies, build the source code and run tests across different versions of node -# For more information see: https://help.github.com/actions/language-and-framework-guides/using-nodejs-with-github-actions - -name: Node.js CI - -on: - push: - branches: - - '*' - -jobs: - build: - runs-on: ubuntu-latest - - steps: - - uses: actions/checkout@v2 - - name: Use Node.js - uses: actions/setup-node@v1 - with: - node-version: '14.x' - - run: npm install - - run: npm run build --if-present - - run: npm test diff --git a/.gitignore b/.gitignore index e4224ff..ea4ab8f 100644 --- a/.gitignore +++ b/.gitignore @@ -8,3 +8,5 @@ hello hello3 .idea/ .vscode-test/ +.vscode-test-workspace/* +!.vscode-test-workspace/.dummy diff --git a/.vscode-test.js b/.vscode-test.js new file mode 100644 index 0000000..4dcd102 --- /dev/null +++ b/.vscode-test.js @@ -0,0 +1,13 @@ +const { defineConfig } = require('@vscode/test-cli'); + +module.exports = defineConfig([ + { + files: 'out/test/**/*.test.js', + extensionDevelopmentPath: __dirname, + sourceMap: true, + mocha: { + ui: 'tdd', + timeout: 20000 + } + } +]); diff --git a/.vscode/launch.json b/.vscode/launch.json index 6d9d584..29f7d4f 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -7,32 +7,34 @@ "request": "launch", "runtimeExecutable": "${execPath}", "args": [ - "--extensionDevelopmentPath=${workspaceRoot}", - "--trace-deprecation" + "--profile-temp", + "--new-window", + "--transient", + // "--extensions-dir=${workspaceFolder}/.vscode-test/extensions", + // "--user-data-dir=${workspaceFolder}/.vscode-test/user-data", + "--extensionDevelopmentPath=${workspaceFolder}", + "--trace-deprecation", + "${workspaceFolder}/test/resources", ], - "stopOnEntry": false, + "autoAttachChildProcesses": true, "sourceMaps": true, "outFiles": [ - "${workspaceRoot}/out/**/*.js" + "${workspaceFolder}/**/*.(m|c|)js", + "!**/node_modules/**" ], - "preLaunchTask": "npm", - "internalConsoleOptions": "openOnSessionStart" + "preLaunchTask": "npm" }, { "name": "Tests", "type": "extensionHost", "request": "launch", - "runtimeExecutable": "${execPath}", - "args": [ - "--disable-extensions", - "--extensionDevelopmentPath=${workspaceFolder}", - "--extensionTestsPath=${workspaceFolder}/out/test/suite/index" - ], + "testConfiguration": "${workspaceFolder}/.vscode-test.js", + "sourceMaps": true, "outFiles": [ - "${workspaceRoot}/out/**/*.js" + "${workspaceFolder}/**/*.(m|c|)js", + "!**/node_modules/**" ], - "preLaunchTask": "npm", - "internalConsoleOptions": "openOnSessionStart" + "preLaunchTask": "npm" } ] -} \ No newline at end of file +} diff --git a/.vscode/tasks.json b/.vscode/tasks.json index 54059ed..e255ae1 100644 --- a/.vscode/tasks.json +++ b/.vscode/tasks.json @@ -6,8 +6,9 @@ "command": "npm", "type": "shell", "presentation": { - "reveal": "always", - "panel": "new" + "reveal": "silent", + "revealProblems": "onProblem", + "panel": "dedicated" }, "args": [ "run", @@ -15,7 +16,7 @@ "--loglevel", "silent" ], - "isBackground": true, + "isBackground": false, "problemMatcher": "$tsc-watch", "group": { "kind": "build", diff --git a/CHANGELOG.md b/CHANGELOG.md index 3a81f4e..2492377 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,25 @@ +## Next + +* Show global data items in Variables panel [PR #40](https://github.com/ocamlpro/superbol-vscode-debug/pull/40) +* Fixed a bug that made the extension hang when debugged programs displayed signed numbers [PR #39](https://github.com/ocamlpro/superbol-vscode-debug/pull/39) +* Show COBOL statements in entries of stackframe summary [PR #38](https://github.com/ocamlpro/superbol-vscode-debug/pull/38) +* Remove `gdbpath` and `libcobpath` from launch configurations (these are provided in extension settings) [PR #36](https://github.com/ocamlpro/superbol-vscode-debug/pull/36) +* Fix enforcement of a default `preLaunchTask` that is not available [PR #34](https://github.com/ocamlpro/superbol-vscode-debug/pull/34) +* Support cases where the COBOL source code and the corresponding C files are in distinct directories [PR #29](https://github.com/ocamlpro/superbol-vscode-debug/pull/29) +* Remove unneeded fields from auto-generated configurations [PR #27](https://github.com/ocamlpro/superbol-vscode-debug/pull/27) [PR #28](https://github.com/ocamlpro/superbol-vscode-debug/pull/28) +* Fix evaluation of expressions with binary-typed fields [PR #26](https://github.com/ocamlpro/superbol-vscode-debug/pull/26) +* Silence some errors due to requests that are handled while the program is running [PR #25](https://github.com/ocamlpro/superbol-vscode-debug/pull/25) +* Enable specification of directories where COBOL and C source files are to be found (option `sourceDirs`) [PR #20](https://github.com/ocamlpro/superbol-vscode-debug/pull/20) +* Enable use of `cobcrun` module loaded [PR #19](https://github.com/ocamlpro/superbol-vscode-debug/pull/19) +* Avoid forcing a prelaunch task on attach mode [PR #23](https://github.com/ocamlpro/superbol-vscode-debug/pull/23) +* Fix first line of subprograms in source mapping [PR #22](https://github.com/ocamlpro/superbol-vscode-debug/pull/22) +* Fix detection of attach target that is given as a PID [PR #21](https://github.com/ocamlpro/superbol-vscode-debug/pull/21) +* Fix handling of nested subprograms [PR #18](https://github.com/ocamlpro/superbol-vscode-debug/pull/18) +* Add support for dynamically loaded sub-modules (e.g, via CALL + literal) [PR #17](https://github.com/ocamlpro/superbol-vscode-debug/pull/17) +* Enable launching a debug session outside a workspace [PR #16](https://github.com/ocamlpro/superbol-vscode-debug/pull/16) +* Set `gdbtty` to `false` by default [PR #15](https://github.com/ocamlpro/superbol-vscode-debug/pull/15) +* Fix handling of programs with dashes `-` in their name [PR #14](https://github.com/ocamlpro/superbol-vscode-debug/pull/14) + ## 3.32.0 * Updates [Issue #138](https://github.com/OlegKunitsyn/gnucobol-debug/issues/138) by MARCOS MARTINS DUMA * Migrate from TSLint to ESLint diff --git a/README.md b/README.md index e660ef0..a930da9 100644 --- a/README.md +++ b/README.md @@ -16,7 +16,20 @@

-An extension to debug or execute GnuCOBOL code. Install from [VS Code Marketplace](https://marketplace.visualstudio.com/items?itemName=OlegKunitsyn.gnucobol-debug) or [Open VSX-Registry](https://open-vsx.org/extension/OlegKunitsyn/gnucobol-debug). +An extension to debug or execute GnuCOBOL code. Forked from [COBOL Degub](https://github.com/OlegKunitsyn/gnucobol-debug). + +- [Features](#features) +- [Requirements](#requirements) + - [Binaries](#binaries) +- [Usage](#usage) +- [Code coverage](#code-coverage) +- [Attaching to a running process](#attaching-to-a-running-process) + - [Local Process](#local-process) + - [Remote Debugger (GDBServer)](#remote-debugger-gdbserver) +- [Display application output in a separate window](#display-application-output-in-a-separate-window) +- [Documentation](#documentation) +- [Troubleshooting](#troubleshooting) +- [Development](#development) ### Features * Setting breakpoints @@ -25,23 +38,15 @@ An extension to debug or execute GnuCOBOL code. Install from [VS Code Marketplac * Watch pane with expressions * Code coverage * No mainframe required -* GnuCOBOL Docker ![Screenshot](screenshot.png) ### Requirements -A COBOL-syntax extension i.e. `bitlang.gnucobol` (recommended, note: the previously recommended `bitlang.cobol` was split and now is intended to target MicroFocus products only), or - if you target a mainframe dialect: `broadcommfd.cobol-language-support`, `rechinformatica.rech-editor-cobol` or `ibm.zopeneditor` installed. -Otherwise, the breakpoints will be unavailable. +This extension is meant to work in combination with the [SuperBOL Studio](https://github.com/OCamlPro/superbol-vscode-platform) extension for COBOL. -Now you may choose between *local* and *container* execution environment. Or try both of them :) - -#### Local -* GnuCOBOL `cobc` 2.2+ installed. -* GNU Debugger `gdb` 6.0+ installed. - -#### Container -* [GnuCOBOL Docker](https://hub.docker.com/r/olegkunitsyn/gnucobol) container up and running. -The image includes GnuCOBOL, GNU Debugger and all required dependencies needed to debug or execute your code. See an example below. +#### Binaries +* GnuCOBOL `cobc` 3.1+ installed. +* GNU Debugger `gdb` 13.0+ installed. ### Usage When your `launch.json` config is set up, you can debug or execute your COBOL program. If you debug a Compilation Group (main- and sub- programs), you need to list sub-programs inside `group` property. Here's an example: @@ -65,7 +70,7 @@ Pick `COBOL debugger` from the dropdown on the Debug pane in VS Code. Press the The debugger uses C sourcecode generated by the compiler upon each debugging session. If the sourcemap isn't accurate or you see any other issues, please make a bug-report. ### Code coverage -You can estimate an execution flow of your COBOL program. +You can estimate an execution flow of your COBOL program. ![Coverage](coverage.png) @@ -87,36 +92,6 @@ Set `coverage` property to `true` in your `launch.json` and start debugging sess The extension decodes the code-coverage files in `gcov` format generated by the compiler. -### Docker -You may debug or execute your COBOL program inside [GnuCOBOL Docker](https://hub.docker.com/r/olegkunitsyn/gnucobol) container. Start the container and share your working directory by `Ctrl+Shift+P` and command `GnuCOBOL Docker: start`, or in the terminal: -```bash -docker run -d -i --name gnucobol -w ${workspaceRoot} -v ${workspaceRoot}:${workspaceRoot} olegkunitsyn/gnucobol:3.1-dev -docker exec -i gnucobol cobc -V -docker exec -i gnucobol gdb -v -``` - -Add `docker` property to your `launch.json` and start debugging session. -Here's an example: -```json -{ - "version": "0.2.0", - "configurations": [ - { - "name": "COBOL debugger", - "type": "gdb", - "request": "launch", - "cobcargs": ["-free", "-x"], - "docker": "olegkunitsyn/gnucobol:3.1-dev" - } - ] -} -``` - -Stop the container by `Ctrl+Shift+P` and command `GnuCOBOL Docker: stop`, or in the terminal: -```bash -docker rm --force gnucobol -``` - ### Attaching to a running process You may debug your COBOL program attaching to a running process. In order to achieve that, you have two options: @@ -146,7 +121,8 @@ Here's an example: ``` #### Remote Debugger (GDBServer) -Add `remoteDebugger` property to your `launch.json`. +Add `remoteDebugger` property to your `launch.json`. + Here's an example: ```json { @@ -163,7 +139,7 @@ Here's an example: } ``` -### Displays application output in a separate window +### Display application output in a separate window Add `gdbtty` property to your `launch.json`. Here’s an example: ```json { @@ -180,13 +156,6 @@ Add `gdbtty` property to your `launch.json`. Here’s an example: ``` ![GdbTTY](gdbttydisplay.png) -* Linux Requirements: `xterm` - -How to install xterm on Ubuntu: -``` -sudo apt-get install xterm -``` - On Linux you can see the output of the application in Vs Code itself. Add `gdbtty` property with `vscode` value to your `launch.json`. Here is an example: ```json { @@ -203,11 +172,10 @@ On Linux you can see the output of the application in Vs Code itself. Add `gdbtt ``` ![GdbTTY](gdbttyvscode.png) -### Roadmap -- Mac -- Unit testing +You can also use these options with `gdbtty`: `xterm`, `gnome-terminal`, `konsole` and `xfce4-terminal`. -Your contribution is always welcome! +### Documentation +For a more in depth documentation please check the [SuperBOL Documentation](https://get-superbol.com/studio/) ### Troubleshooting Add `verbose` property to your `launch.json` and start debugging session. In `DEBUG CONSOLE` you will see complete communication log between `gdb` and VS Code. Here's an example: @@ -229,7 +197,7 @@ Add `verbose` property to your `launch.json` and start debugging session. In `DE ### Development * Fork the repository. * Clone it to your machine and open with VS Code. -* Install dependencies by `npm install` command in the terminal. +* Install dependencies by `yarn install` command in the terminal. * Pick `Extension` from the dropdown on the Debug pane and press `F5`. This will open new VS Code instance with your cloned extension in debugging mode. * Follow Requirements and Usage sections above. * In the first VS Code instance you may put breakpoints to explore the functionality. diff --git a/package-lock.json b/package-lock.json index bb2703c..ba0e4e3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,74 +1,99 @@ { - "name": "gnucobol-debug", + "name": "superbol-vscode-debug", "version": "3.32.0", "lockfileVersion": 3, "requires": true, "packages": { "": { - "name": "gnucobol-debug", + "name": "superbol-vscode-debug", "version": "3.32.0", "license": "GPL-3.0", "dependencies": { "@vscode/debugadapter": "^1.51.0", "@vscode/debugprotocol": "^1.51.0", - "gcov-parse": "^1.1.2", - "n-readlines": "^1.0.1", - "package_name": "^1.0.0" + "n-readlines": "^1.0.1" }, "devDependencies": { - "@types/mocha": "^10.0.1", + "@types/expect": "^1.20.4", + "@types/mocha": "^10.0.10", "@types/node": "^20.6.3", - "@types/vscode": "^1.44.0", + "@types/vscode": "^1.64.0", "@typescript-eslint/eslint-plugin": "^6.7.2", "@typescript-eslint/parser": "^6.7.2", "@vscode/debugadapter-testsupport": "^1.51.0", - "@vscode/test-electron": "^2.3.4", + "@vscode/test-cli": "^0.0.12", + "@vscode/test-electron": "^2.5.2", "eslint": "^8.50.0", - "mocha": "^10.2.0", + "eslint_d": "^12.2.1", + "mocha": "^10.8.2", + "ts-mocha": "^11.1.0", + "ts-node": "^10.9.2", + "tsconfig-paths": "^4.2.0", "typescript": "^5.2.2" }, "engines": { - "vscode": "^1.44.0" + "node": ">=20", + "vscode": "^1.66.0" } }, - "node_modules/@aashutoshrathi/word-wrap": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", - "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", + "node_modules/@bcoe/v8-coverage": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-1.0.2.tgz", + "integrity": "sha512-6zABk/ECA/QYSCQ1NGiVwwbQerUCZ+TQbp64Q3AgmfNvurHH0j8TtXa1qbShXA6qqkpAj4V5W8pP6mLe1mcMqA==", "dev": true, + "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": ">=18" + } + }, + "node_modules/@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "0.3.9" + }, + "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", - "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "version": "4.9.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.0.tgz", + "integrity": "sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==", "dev": true, + "license": "MIT", "dependencies": { - "eslint-visitor-keys": "^3.3.0" + "eslint-visitor-keys": "^3.4.3" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, + "funding": { + "url": "https://opencollective.com/eslint" + }, "peerDependencies": { "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, "node_modules/@eslint-community/regexpp": { - "version": "4.8.1", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.8.1.tgz", - "integrity": "sha512-PWiOzLIUAjN/w5K17PoF4n6sKBw0gqLHPhywmYHP4t1VFQQVYeb1yWsJwnMVEMl3tUHME7X/SJPZLmtG7XBDxQ==", + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", + "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", "dev": true, + "license": "MIT", "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } }, "node_modules/@eslint/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, + "license": "MIT", "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", @@ -87,34 +112,86 @@ "url": "https://opencollective.com/eslint" } }, + "node_modules/@eslint/eslintrc/node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@eslint/eslintrc/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, "node_modules/@eslint/js": { - "version": "8.50.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.50.0.tgz", - "integrity": "sha512-NCC3zz2+nvYd+Ckfh87rA47zfu2QsQpvc6k1yzTk+b9KzRj0wkGa8LSoGOXN6Zv4lRf/EIoZ80biDh9HOI+RNQ==", + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.1.tgz", + "integrity": "sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==", "dev": true, + "license": "MIT", "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, "node_modules/@humanwhocodes/config-array": { - "version": "0.11.11", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.11.tgz", - "integrity": "sha512-N2brEuAadi0CcdeMXUkhbZB84eskAc8MEX1By6qEchoVywSgXPIjou4rYsl0V3Hj0ZnuGycGCjdNgockbzeWNA==", + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.13.0.tgz", + "integrity": "sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==", + "deprecated": "Use @eslint/config-array instead", "dev": true, + "license": "Apache-2.0", "dependencies": { - "@humanwhocodes/object-schema": "^1.2.1", - "debug": "^4.1.1", + "@humanwhocodes/object-schema": "^2.0.3", + "debug": "^4.3.1", "minimatch": "^3.0.5" }, "engines": { "node": ">=10.10.0" } }, + "node_modules/@humanwhocodes/config-array/node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@humanwhocodes/config-array/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, "node_modules/@humanwhocodes/module-importer": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", "dev": true, + "license": "Apache-2.0", "engines": { "node": ">=12.22" }, @@ -124,16 +201,104 @@ } }, "node_modules/@humanwhocodes/object-schema": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", - "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", - "dev": true + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", + "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", + "deprecated": "Use @eslint/object-schema instead", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", + "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", "dev": true, + "license": "MIT", "dependencies": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" @@ -147,6 +312,7 @@ "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", "dev": true, + "license": "MIT", "engines": { "node": ">= 8" } @@ -156,6 +322,7 @@ "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", "dev": true, + "license": "MIT", "dependencies": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" @@ -164,56 +331,109 @@ "node": ">= 8" } }, - "node_modules/@tootallnate/once": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", - "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", "dev": true, + "license": "MIT", + "optional": true, "engines": { - "node": ">= 6" + "node": ">=14" } }, + "node_modules/@tsconfig/node10": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.12.tgz", + "integrity": "sha512-UCYBaeFvM11aU2y3YPZ//O5Rhj+xKyzy7mvcIoAjASbigy8mHMryP5cK7dgjlz2hWxh1g5pLw084E0a/wlUSFQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@tsconfig/node12": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", + "dev": true, + "license": "MIT" + }, + "node_modules/@tsconfig/node14": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", + "dev": true, + "license": "MIT" + }, + "node_modules/@tsconfig/node16": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", + "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/expect": { + "version": "1.20.4", + "resolved": "https://registry.npmjs.org/@types/expect/-/expect-1.20.4.tgz", + "integrity": "sha512-Q5Vn3yjTDyCMV50TB6VRIbQNxSE4OmZR86VSbGaNpfUolm0iePBB4KdEEHmxoY5sT2+2DIvXW0rvMDP2nHZ4Mg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/istanbul-lib-coverage": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", + "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", + "dev": true, + "license": "MIT" + }, "node_modules/@types/json-schema": { - "version": "7.0.13", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.13.tgz", - "integrity": "sha512-RbSSoHliUbnXj3ny0CNFOoxrIDV6SUGyStHsvDqosw6CkdPV8TtWGlfecuK4ToyMEAql6pzNxgCFKanovUzlgQ==", - "dev": true + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true, + "license": "MIT" }, "node_modules/@types/mocha": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-10.0.1.tgz", - "integrity": "sha512-/fvYntiO1GeICvqbQ3doGDIP97vWmvFt83GKguJ6prmQM2iXZfFcq6YE8KteFyRtX2/h5Hf91BYvPodJKFYv5Q==", - "dev": true + "version": "10.0.10", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-10.0.10.tgz", + "integrity": "sha512-xPyYSz1cMPnJQhl0CLMH68j3gprKZaTjG3s5Vi+fDgx+uhG9NOXwbVt52eFS8ECyXhyKcjDLCBEqBExKuiZb7Q==", + "dev": true, + "license": "MIT" }, "node_modules/@types/node": { - "version": "20.6.3", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.6.3.tgz", - "integrity": "sha512-HksnYH4Ljr4VQgEy2lTStbCKv/P590tmPe5HqOnv9Gprffgv5WXAY+Y5Gqniu0GGqeTCUdBnzC3QSrzPkBkAMA==", - "dev": true + "version": "20.19.25", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.25.tgz", + "integrity": "sha512-ZsJzA5thDQMSQO788d7IocwwQbI8B5OPzmqNvpf3NY/+MHDAS759Wo0gd2WQeXYt5AAAQjzcrTVC6SKCuYgoCQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~6.21.0" + } }, "node_modules/@types/semver": { - "version": "7.5.2", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.2.tgz", - "integrity": "sha512-7aqorHYgdNO4DM36stTiGO3DvKoex9TQRwsJU6vMaFGyqpBA1MNZkz+PG3gaNUPpTAOYhT1WR7M1JyA3fbS9Cw==", - "dev": true + "version": "7.7.1", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.7.1.tgz", + "integrity": "sha512-FmgJfu+MOcQ370SD0ev7EI8TlCAfKYU+B4m5T3yXc1CiRN94g/SZPtsCkk506aUDtlMnFZvasDwHHUcZUEaYuA==", + "dev": true, + "license": "MIT" }, "node_modules/@types/vscode": { - "version": "1.82.0", - "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.82.0.tgz", - "integrity": "sha512-VSHV+VnpF8DEm8LNrn8OJ8VuUNcBzN3tMvKrNpbhhfuVjFm82+6v44AbDhLvVFgCzn6vs94EJNTp7w8S6+Q1Rw==", - "dev": true + "version": "1.106.1", + "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.106.1.tgz", + "integrity": "sha512-R/HV8u2h8CAddSbX8cjpdd7B8/GnE4UjgjpuGuHcbp1xV6yh4OeqU4L1pKjlwujCrSFS0MOpwJAIs/NexMB1fQ==", + "dev": true, + "license": "MIT" }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "6.7.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.7.2.tgz", - "integrity": "sha512-ooaHxlmSgZTM6CHYAFRlifqh1OAr3PAQEwi7lhYhaegbnXrnh7CDcHmc3+ihhbQC7H0i4JF0psI5ehzkF6Yl6Q==", + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.21.0.tgz", + "integrity": "sha512-oy9+hTPCUFpngkEZUSzbf9MxI65wbKFoQYsgPdILTfbUldp5ovUuphZVe4i30emU9M/kP+T64Di0mxl7dSw3MA==", "dev": true, + "license": "MIT", "dependencies": { "@eslint-community/regexpp": "^4.5.1", - "@typescript-eslint/scope-manager": "6.7.2", - "@typescript-eslint/type-utils": "6.7.2", - "@typescript-eslint/utils": "6.7.2", - "@typescript-eslint/visitor-keys": "6.7.2", + "@typescript-eslint/scope-manager": "6.21.0", + "@typescript-eslint/type-utils": "6.21.0", + "@typescript-eslint/utils": "6.21.0", + "@typescript-eslint/visitor-keys": "6.21.0", "debug": "^4.3.4", "graphemer": "^1.4.0", "ignore": "^5.2.4", @@ -239,15 +459,16 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "6.7.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.7.2.tgz", - "integrity": "sha512-KA3E4ox0ws+SPyxQf9iSI25R6b4Ne78ORhNHeVKrPQnoYsb9UhieoiRoJgrzgEeKGOXhcY1i8YtOeCHHTDa6Fw==", + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.21.0.tgz", + "integrity": "sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { - "@typescript-eslint/scope-manager": "6.7.2", - "@typescript-eslint/types": "6.7.2", - "@typescript-eslint/typescript-estree": "6.7.2", - "@typescript-eslint/visitor-keys": "6.7.2", + "@typescript-eslint/scope-manager": "6.21.0", + "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/typescript-estree": "6.21.0", + "@typescript-eslint/visitor-keys": "6.21.0", "debug": "^4.3.4" }, "engines": { @@ -267,13 +488,14 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "6.7.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.7.2.tgz", - "integrity": "sha512-bgi6plgyZjEqapr7u2mhxGR6E8WCzKNUFWNh6fkpVe9+yzRZeYtDTbsIBzKbcxI+r1qVWt6VIoMSNZ4r2A+6Yw==", + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.21.0.tgz", + "integrity": "sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg==", "dev": true, + "license": "MIT", "dependencies": { - "@typescript-eslint/types": "6.7.2", - "@typescript-eslint/visitor-keys": "6.7.2" + "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/visitor-keys": "6.21.0" }, "engines": { "node": "^16.0.0 || >=18.0.0" @@ -284,13 +506,14 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "6.7.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.7.2.tgz", - "integrity": "sha512-36F4fOYIROYRl0qj95dYKx6kybddLtsbmPIYNK0OBeXv2j9L5nZ17j9jmfy+bIDHKQgn2EZX+cofsqi8NPATBQ==", + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.21.0.tgz", + "integrity": "sha512-rZQI7wHfao8qMX3Rd3xqeYSMCL3SoiSQLBATSiVKARdFGCYSRvmViieZjqc58jKgs8Y8i9YvVVhRbHSTA4VBag==", "dev": true, + "license": "MIT", "dependencies": { - "@typescript-eslint/typescript-estree": "6.7.2", - "@typescript-eslint/utils": "6.7.2", + "@typescript-eslint/typescript-estree": "6.21.0", + "@typescript-eslint/utils": "6.21.0", "debug": "^4.3.4", "ts-api-utils": "^1.0.1" }, @@ -311,10 +534,11 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "6.7.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.7.2.tgz", - "integrity": "sha512-flJYwMYgnUNDAN9/GAI3l8+wTmvTYdv64fcH8aoJK76Y+1FCZ08RtI5zDerM/FYT5DMkAc+19E4aLmd5KqdFyg==", + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.21.0.tgz", + "integrity": "sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg==", "dev": true, + "license": "MIT", "engines": { "node": "^16.0.0 || >=18.0.0" }, @@ -324,16 +548,18 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "6.7.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.7.2.tgz", - "integrity": "sha512-kiJKVMLkoSciGyFU0TOY0fRxnp9qq1AzVOHNeN1+B9erKFCJ4Z8WdjAkKQPP+b1pWStGFqezMLltxO+308dJTQ==", + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.21.0.tgz", + "integrity": "sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { - "@typescript-eslint/types": "6.7.2", - "@typescript-eslint/visitor-keys": "6.7.2", + "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/visitor-keys": "6.21.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", + "minimatch": "9.0.3", "semver": "^7.5.4", "ts-api-utils": "^1.0.1" }, @@ -351,17 +577,18 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "6.7.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.7.2.tgz", - "integrity": "sha512-ZCcBJug/TS6fXRTsoTkgnsvyWSiXwMNiPzBUani7hDidBdj1779qwM1FIAmpH4lvlOZNF3EScsxxuGifjpLSWQ==", + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.21.0.tgz", + "integrity": "sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ==", "dev": true, + "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", "@types/json-schema": "^7.0.12", "@types/semver": "^7.5.0", - "@typescript-eslint/scope-manager": "6.7.2", - "@typescript-eslint/types": "6.7.2", - "@typescript-eslint/typescript-estree": "6.7.2", + "@typescript-eslint/scope-manager": "6.21.0", + "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/typescript-estree": "6.21.0", "semver": "^7.5.4" }, "engines": { @@ -376,12 +603,13 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "6.7.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.7.2.tgz", - "integrity": "sha512-uVw9VIMFBUTz8rIeaUT3fFe8xIUx8r4ywAdlQv1ifH+6acn/XF8Y6rwJ7XNmkNMDrTW+7+vxFFPIF40nJCVsMQ==", + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.21.0.tgz", + "integrity": "sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A==", "dev": true, + "license": "MIT", "dependencies": { - "@typescript-eslint/types": "6.7.2", + "@typescript-eslint/types": "6.21.0", "eslint-visitor-keys": "^3.4.1" }, "engines": { @@ -392,54 +620,207 @@ "url": "https://opencollective.com/typescript-eslint" } }, + "node_modules/@ungap/structured-clone": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz", + "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==", + "dev": true, + "license": "ISC" + }, "node_modules/@vscode/debugadapter": { - "version": "1.63.0", - "resolved": "https://registry.npmjs.org/@vscode/debugadapter/-/debugadapter-1.63.0.tgz", - "integrity": "sha512-d2eAnYCZkKJ0C28gT93KPi5YXFav8VyagcxkJ94LZ8qqgJ27+2ct26MOHGYKB8L25ZdDs8A4YmyJO32J0afhNQ==", + "version": "1.68.0", + "resolved": "https://registry.npmjs.org/@vscode/debugadapter/-/debugadapter-1.68.0.tgz", + "integrity": "sha512-D6gk5Fw2y4FV8oYmltoXpj+VAZexxJFopN/mcZ6YcgzQE9dgq2L45Aj3GLxScJOD6GeLILcxJIaA8l3v11esGg==", + "license": "MIT", "dependencies": { - "@vscode/debugprotocol": "1.63.0" + "@vscode/debugprotocol": "1.68.0" }, "engines": { "node": ">=14" } }, "node_modules/@vscode/debugadapter-testsupport": { - "version": "1.63.0", - "resolved": "https://registry.npmjs.org/@vscode/debugadapter-testsupport/-/debugadapter-testsupport-1.63.0.tgz", - "integrity": "sha512-K17THT/GoJJNezcIh3HaXDOvsntFkLxmjZ83ihXJHKAbcOnaNOrtzcnVT1bL3CVyRkgG7WzitBeScOi7sjaqZg==", + "version": "1.68.0", + "resolved": "https://registry.npmjs.org/@vscode/debugadapter-testsupport/-/debugadapter-testsupport-1.68.0.tgz", + "integrity": "sha512-UpbaPsCGMKyjIvJFtqFKDD1MVvME50xuOtRBPrqY1WdhAOLjWQN7FcKEoHv3X85twfNL21jW2M54FYwEdEQv4Q==", "dev": true, + "license": "MIT", "dependencies": { - "@vscode/debugprotocol": "1.63.0" + "@vscode/debugprotocol": "1.68.0" }, "engines": { "node": ">=14" } }, "node_modules/@vscode/debugprotocol": { - "version": "1.63.0", - "resolved": "https://registry.npmjs.org/@vscode/debugprotocol/-/debugprotocol-1.63.0.tgz", - "integrity": "sha512-7gewwv69pA7gcJUhtJsru5YN7E1AwwnlBrF5mJY4R/NGInOUqOYOWHlqQwG+4AXn0nXWbcn26MHgaGI9Q26SqA==" + "version": "1.68.0", + "resolved": "https://registry.npmjs.org/@vscode/debugprotocol/-/debugprotocol-1.68.0.tgz", + "integrity": "sha512-2J27dysaXmvnfuhFGhfeuxfHRXunqNPxtBoR3koiTOA9rdxWNDTa1zIFLCFMSHJ9MPTPKFcBeblsyaCJCIlQxg==", + "license": "MIT" + }, + "node_modules/@vscode/test-cli": { + "version": "0.0.12", + "resolved": "https://registry.npmjs.org/@vscode/test-cli/-/test-cli-0.0.12.tgz", + "integrity": "sha512-iYN0fDg29+a2Xelle/Y56Xvv7Nc8Thzq4VwpzAF/SIE6918rDicqfsQxV6w1ttr2+SOm+10laGuY9FG2ptEKsQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/mocha": "^10.0.10", + "c8": "^10.1.3", + "chokidar": "^3.6.0", + "enhanced-resolve": "^5.18.3", + "glob": "^10.3.10", + "minimatch": "^9.0.3", + "mocha": "^11.7.4", + "supports-color": "^10.2.2", + "yargs": "^17.7.2" + }, + "bin": { + "vscode-test": "out/bin.mjs" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@vscode/test-cli/node_modules/diff": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-7.0.0.tgz", + "integrity": "sha512-PJWHUb1RFevKCwaFA9RlG5tCd+FO5iRh9A8HEtkmBH2Li03iJriB6m6JIN4rGz3K3JLawI7/veA1xzRKP6ISBw==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/@vscode/test-cli/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@vscode/test-cli/node_modules/mocha": { + "version": "11.7.5", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-11.7.5.tgz", + "integrity": "sha512-mTT6RgopEYABzXWFx+GcJ+ZQ32kp4fMf0xvpZIIfSq9Z8lC/++MtcCnQ9t5FP2veYEP95FIYSvW+U9fV4xrlig==", + "dev": true, + "license": "MIT", + "dependencies": { + "browser-stdout": "^1.3.1", + "chokidar": "^4.0.1", + "debug": "^4.3.5", + "diff": "^7.0.0", + "escape-string-regexp": "^4.0.0", + "find-up": "^5.0.0", + "glob": "^10.4.5", + "he": "^1.2.0", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", + "log-symbols": "^4.1.0", + "minimatch": "^9.0.5", + "ms": "^2.1.3", + "picocolors": "^1.1.1", + "serialize-javascript": "^6.0.2", + "strip-json-comments": "^3.1.1", + "supports-color": "^8.1.1", + "workerpool": "^9.2.0", + "yargs": "^17.7.2", + "yargs-parser": "^21.1.1", + "yargs-unparser": "^2.0.0" + }, + "bin": { + "_mocha": "bin/_mocha", + "mocha": "bin/mocha.js" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@vscode/test-cli/node_modules/mocha/node_modules/chokidar": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", + "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", + "dev": true, + "license": "MIT", + "dependencies": { + "readdirp": "^4.0.1" + }, + "engines": { + "node": ">= 14.16.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@vscode/test-cli/node_modules/mocha/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/@vscode/test-cli/node_modules/readdirp": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", + "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14.18.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@vscode/test-cli/node_modules/workerpool": { + "version": "9.3.4", + "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-9.3.4.tgz", + "integrity": "sha512-TmPRQYYSAnnDiEB0P/Ytip7bFGvqnSU6I2BcuSw7Hx+JSg/DsUi5ebYfc8GYaSdpuvOcEs6dXxPurOYpe9QFwg==", + "dev": true, + "license": "Apache-2.0" }, "node_modules/@vscode/test-electron": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/@vscode/test-electron/-/test-electron-2.3.4.tgz", - "integrity": "sha512-eWzIqXMhvlcoXfEFNWrVu/yYT5w6De+WZXR/bafUQhAp8+8GkQo95Oe14phwiRUPv8L+geAKl/QM2+PoT3YW3g==", + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/@vscode/test-electron/-/test-electron-2.5.2.tgz", + "integrity": "sha512-8ukpxv4wYe0iWMRQU18jhzJOHkeGKbnw7xWRX3Zw1WJA4cEKbHcmmLPdPrPtL6rhDcrlCZN+xKRpv09n4gRHYg==", "dev": true, + "license": "MIT", "dependencies": { - "http-proxy-agent": "^4.0.1", - "https-proxy-agent": "^5.0.0", + "http-proxy-agent": "^7.0.2", + "https-proxy-agent": "^7.0.5", "jszip": "^3.10.1", - "semver": "^7.5.2" + "ora": "^8.1.0", + "semver": "^7.6.2" }, "engines": { "node": ">=16" } }, "node_modules/acorn": { - "version": "8.10.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", - "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", + "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", "dev": true, + "license": "MIT", "bin": { "acorn": "bin/acorn" }, @@ -452,20 +833,32 @@ "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", "dev": true, + "license": "MIT", "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, - "node_modules/agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "node_modules/acorn-walk": { + "version": "8.3.4", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz", + "integrity": "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==", "dev": true, + "license": "MIT", "dependencies": { - "debug": "4" + "acorn": "^8.11.0" }, "engines": { - "node": ">= 6.0.0" + "node": ">=0.4.0" + } + }, + "node_modules/agent-base": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", + "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14" } }, "node_modules/ajv": { @@ -473,6 +866,7 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "dev": true, + "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -485,10 +879,11 @@ } }, "node_modules/ansi-colors": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", - "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", + "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } @@ -498,6 +893,7 @@ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -507,6 +903,7 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, + "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -522,6 +919,7 @@ "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", "dev": true, + "license": "ISC", "dependencies": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" @@ -530,17 +928,26 @@ "node": ">= 8" } }, + "node_modules/arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "dev": true, + "license": "MIT" + }, "node_modules/argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true + "dev": true, + "license": "Python-2.0" }, "node_modules/array-union": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -549,34 +956,40 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", "dev": true, + "license": "MIT", "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "balanced-match": "^1.0.0" } }, "node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", "dev": true, + "license": "MIT", "dependencies": { - "fill-range": "^7.0.1" + "fill-range": "^7.1.1" }, "engines": { "node": ">=8" @@ -586,13 +999,49 @@ "version": "1.3.1", "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", - "dev": true + "dev": true, + "license": "ISC" + }, + "node_modules/c8": { + "version": "10.1.3", + "resolved": "https://registry.npmjs.org/c8/-/c8-10.1.3.tgz", + "integrity": "sha512-LvcyrOAaOnrrlMpW22n690PUvxiq4Uf9WMhQwNJ9vgagkL/ph1+D4uvjvDA5XCbykrc0sx+ay6pVi9YZ1GnhyA==", + "dev": true, + "license": "ISC", + "dependencies": { + "@bcoe/v8-coverage": "^1.0.1", + "@istanbuljs/schema": "^0.1.3", + "find-up": "^5.0.0", + "foreground-child": "^3.1.1", + "istanbul-lib-coverage": "^3.2.0", + "istanbul-lib-report": "^3.0.1", + "istanbul-reports": "^3.1.6", + "test-exclude": "^7.0.1", + "v8-to-istanbul": "^9.0.0", + "yargs": "^17.7.2", + "yargs-parser": "^21.1.1" + }, + "bin": { + "c8": "bin/c8.js" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "monocart-coverage-reports": "^2" + }, + "peerDependenciesMeta": { + "monocart-coverage-reports": { + "optional": true + } + } }, "node_modules/callsites": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } @@ -602,6 +1051,7 @@ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" }, @@ -614,6 +1064,7 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -625,17 +1076,25 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, + "node_modules/chalk/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ], + "license": "MIT", "dependencies": { "anymatch": "~3.1.2", "braces": "~3.0.2", @@ -648,38 +1107,103 @@ "engines": { "node": ">= 8.10.0" }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, "optionalDependencies": { "fsevents": "~2.3.2" } }, - "node_modules/chokidar/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "node_modules/cli-cursor": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-5.0.0.tgz", + "integrity": "sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==", "dev": true, + "license": "MIT", "dependencies": { - "is-glob": "^4.0.1" + "restore-cursor": "^5.0.0" }, "engines": { - "node": ">= 6" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "node_modules/cli-spinners": { + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", + "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", "dev": true, - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/cliui/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/cliui/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, "node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, + "license": "MIT", "dependencies": { "color-name": "~1.1.4" }, @@ -691,25 +1215,69 @@ "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 + "dev": true, + "license": "MIT" }, "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true + "dev": true, + "license": "MIT" + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true, + "license": "MIT" + }, + "node_modules/core_d": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/core_d/-/core_d-5.0.1.tgz", + "integrity": "sha512-37lZyhJY1hzgFbfU4LzY4zL09QPwPfV2W/3YBOtN7mkdvVaeP1OVnDZI6zxggtlPwG/BuE5wIr0xptlVJk5EPA==", + "dev": true, + "license": "MIT", + "dependencies": { + "supports-color": "^8.1.0" + } + }, + "node_modules/core_d/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } }, "node_modules/core-util-is": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", - "dev": true + "dev": true, + "license": "MIT" + }, + "node_modules/create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "dev": true, + "license": "MIT" }, "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", "dev": true, + "license": "MIT", "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", @@ -720,12 +1288,13 @@ } }, "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", "dev": true, + "license": "MIT", "dependencies": { - "ms": "2.1.2" + "ms": "^2.1.3" }, "engines": { "node": ">=6.0" @@ -741,6 +1310,7 @@ "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" }, @@ -752,13 +1322,15 @@ "version": "0.1.4", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/diff": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", - "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.2.0.tgz", + "integrity": "sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==", "dev": true, + "license": "BSD-3-Clause", "engines": { "node": ">=0.3.1" } @@ -768,6 +1340,7 @@ "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", "dev": true, + "license": "MIT", "dependencies": { "path-type": "^4.0.0" }, @@ -780,6 +1353,7 @@ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", "dev": true, + "license": "Apache-2.0", "dependencies": { "esutils": "^2.0.2" }, @@ -787,17 +1361,40 @@ "node": ">=6.0.0" } }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true, + "license": "MIT" + }, "node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true, + "license": "MIT" + }, + "node_modules/enhanced-resolve": { + "version": "5.18.3", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.3.tgz", + "integrity": "sha512-d4lC8xfavMeBjzGr2vECC3fsGXziXZQyJxD868h2M/mBI3PwAuODxAkLkq5HYuvrPYcUtiLzsTo8U3PgX3Ocww==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + }, + "engines": { + "node": ">=10.13.0" + } }, "node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } @@ -807,6 +1404,7 @@ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" }, @@ -815,18 +1413,21 @@ } }, "node_modules/eslint": { - "version": "8.50.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.50.0.tgz", - "integrity": "sha512-FOnOGSuFuFLv/Sa+FDVRZl4GGVAAFFi8LecRsI5a1tMO5HIE8nCm4ivAlzt4dT3ol/PaaGC0rJEEXQmHJBGoOg==", + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.1.tgz", + "integrity": "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==", + "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.", "dev": true, + "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", - "@eslint/eslintrc": "^2.1.2", - "@eslint/js": "8.50.0", - "@humanwhocodes/config-array": "^0.11.11", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.57.1", + "@humanwhocodes/config-array": "^0.13.0", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", + "@ungap/structured-clone": "^1.2.0", "ajv": "^6.12.4", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", @@ -868,11 +1469,28 @@ "url": "https://opencollective.com/eslint" } }, + "node_modules/eslint_d": { + "version": "12.2.1", + "resolved": "https://registry.npmjs.org/eslint_d/-/eslint_d-12.2.1.tgz", + "integrity": "sha512-qOJ9cTi5AaH5bOgEoCkv41DJ637mHgzffbOLojwU4wadwC6qbR+OxVJRvVzH0v2XYmQOvw4eiJK7ivrr5SvzsA==", + "dev": true, + "license": "MIT", + "dependencies": { + "core_d": "^5.0.1", + "eslint": "^8.12.0", + "nanolru": "^1.0.0", + "optionator": "^0.9.1" + }, + "bin": { + "eslint_d": "bin/eslint_d.js" + } + }, "node_modules/eslint-scope": { "version": "7.2.2", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" @@ -889,6 +1507,7 @@ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", "dev": true, + "license": "Apache-2.0", "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, @@ -896,11 +1515,49 @@ "url": "https://opencollective.com/eslint" } }, + "node_modules/eslint/node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/eslint/node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/eslint/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, "node_modules/espree": { "version": "9.6.1", "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "acorn": "^8.9.0", "acorn-jsx": "^5.3.2", @@ -914,10 +1571,11 @@ } }, "node_modules/esquery": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", - "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", + "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "estraverse": "^5.1.0" }, @@ -930,6 +1588,7 @@ "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "estraverse": "^5.2.0" }, @@ -942,6 +1601,7 @@ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true, + "license": "BSD-2-Clause", "engines": { "node": ">=4.0" } @@ -951,6 +1611,7 @@ "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", "dev": true, + "license": "BSD-2-Clause", "engines": { "node": ">=0.10.0" } @@ -959,53 +1620,46 @@ "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/fast-glob": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz", - "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==", + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", "dev": true, + "license": "MIT", "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", "glob-parent": "^5.1.2", "merge2": "^1.3.0", - "micromatch": "^4.0.4" + "micromatch": "^4.0.8" }, "engines": { "node": ">=8.6.0" } }, - "node_modules/fast-glob/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/fast-json-stable-stringify": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/fast-levenshtein": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/fastq": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", - "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", + "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", "dev": true, + "license": "ISC", "dependencies": { "reusify": "^1.0.4" } @@ -1015,6 +1669,7 @@ "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", "dev": true, + "license": "MIT", "dependencies": { "flat-cache": "^3.0.4" }, @@ -1023,10 +1678,11 @@ } }, "node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", "dev": true, + "license": "MIT", "dependencies": { "to-regex-range": "^5.0.1" }, @@ -1039,6 +1695,7 @@ "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", "dev": true, + "license": "MIT", "dependencies": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" @@ -1055,42 +1712,70 @@ "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", "dev": true, + "license": "BSD-3-Clause", "bin": { "flat": "cli.js" } }, "node_modules/flat-cache": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.1.0.tgz", - "integrity": "sha512-OHx4Qwrrt0E4jEIcI5/Xb+f+QmJYNj2rrK8wiIdQOIrB9WrrJL8cjZvXdXuBTkkEwEqLycb5BeZDV1o2i9bTew==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", + "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", "dev": true, + "license": "MIT", "dependencies": { - "flatted": "^3.2.7", + "flatted": "^3.2.9", "keyv": "^4.5.3", "rimraf": "^3.0.2" }, "engines": { - "node": ">=12.0.0" + "node": "^10.12.0 || >=12.0.0" } }, "node_modules/flatted": { - "version": "3.2.9", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.9.tgz", - "integrity": "sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==", - "dev": true + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", + "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", + "dev": true, + "license": "ISC" + }, + "node_modules/foreground-child": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", + "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", + "dev": true, + "license": "ISC", + "dependencies": { + "cross-spawn": "^7.0.6", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } }, "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true + "dev": true, + "license": "ISC" }, - "node_modules/gcov-parse": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/gcov-parse/-/gcov-parse-1.1.2.tgz", - "integrity": "sha512-Qg737lue7Ojs4EOXJz6tfHhRS6dhWmsQjoiY2Hxh9Gzi03kYEDM63fqlwxDdegKW2yBKgzw3Hukma2RwqYK4YQ==", + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": ">= 8.0.0" + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } }, "node_modules/get-caller-file": { @@ -1098,47 +1783,80 @@ "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", "dev": true, + "license": "ISC", "engines": { "node": "6.* || 8.* || >= 10.*" } }, + "node_modules/get-east-asian-width": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.4.0.tgz", + "integrity": "sha512-QZjmEOC+IT1uk6Rx0sX22V6uHWVwbdbxf1faPqJ1QhLdGgsRGCZoyaQBm/piRdJy/D2um6hM1UP7ZEeQ4EkP+Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz", + "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==", "dev": true, + "license": "ISC", "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" }, - "engines": { - "node": "*" + "bin": { + "glob": "dist/esm/bin.mjs" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, "node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "dev": true, + "license": "ISC", "dependencies": { - "is-glob": "^4.0.3" + "is-glob": "^4.0.1" }, "engines": { - "node": ">=10.13.0" + "node": ">= 6" + } + }, + "node_modules/glob/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, "node_modules/globals": { - "version": "13.22.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.22.0.tgz", - "integrity": "sha512-H1Ddc/PbZHTDVJSnj8kWptIRSD6AM3pK+mKytuIVF4uoBV7rshFlhhvA58ceJ5wp3Er58w6zj7bykMpYXt3ETw==", + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", "dev": true, + "license": "MIT", "dependencies": { "type-fest": "^0.20.2" }, @@ -1154,6 +1872,7 @@ "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", "dev": true, + "license": "MIT", "dependencies": { "array-union": "^2.1.0", "dir-glob": "^3.0.1", @@ -1169,17 +1888,26 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true, + "license": "ISC" + }, "node_modules/graphemer": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -1189,42 +1917,52 @@ "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", "dev": true, + "license": "MIT", "bin": { "he": "bin/he" } }, + "node_modules/html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true, + "license": "MIT" + }, "node_modules/http-proxy-agent": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", - "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", + "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", "dev": true, + "license": "MIT", "dependencies": { - "@tootallnate/once": "1", - "agent-base": "6", - "debug": "4" + "agent-base": "^7.1.0", + "debug": "^4.3.4" }, "engines": { - "node": ">= 6" + "node": ">= 14" } }, "node_modules/https-proxy-agent": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", + "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", "dev": true, + "license": "MIT", "dependencies": { - "agent-base": "6", + "agent-base": "^7.1.2", "debug": "4" }, "engines": { - "node": ">= 6" + "node": ">= 14" } }, "node_modules/ignore": { - "version": "5.2.4", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", - "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", "dev": true, + "license": "MIT", "engines": { "node": ">= 4" } @@ -1233,13 +1971,15 @@ "version": "3.0.6", "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", "dev": true, + "license": "MIT", "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" @@ -1256,6 +1996,7 @@ "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.8.19" } @@ -1264,7 +2005,9 @@ "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", "dev": true, + "license": "ISC", "dependencies": { "once": "^1.3.0", "wrappy": "1" @@ -1274,13 +2017,15 @@ "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/is-binary-path": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", "dev": true, + "license": "MIT", "dependencies": { "binary-extensions": "^2.0.0" }, @@ -1293,6 +2038,7 @@ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -1302,6 +2048,7 @@ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -1311,6 +2058,7 @@ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "dev": true, + "license": "MIT", "dependencies": { "is-extglob": "^2.1.1" }, @@ -1318,11 +2066,25 @@ "node": ">=0.10.0" } }, + "node_modules/is-interactive": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-2.0.0.tgz", + "integrity": "sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.12.0" } @@ -1332,6 +2094,7 @@ "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -1341,6 +2104,7 @@ "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -1350,6 +2114,7 @@ "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" }, @@ -1361,61 +2126,150 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true + "dev": true, + "license": "ISC" }, - "node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "node_modules/istanbul-lib-coverage": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", + "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", "dev": true, - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" + "license": "BSD-3-Clause", + "engines": { + "node": ">=8" } }, - "node_modules/json-buffer": { + "node_modules/istanbul-lib-report": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", - "dev": true - }, - "node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "node_modules/json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "dev": true - }, - "node_modules/jszip": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.10.1.tgz", - "integrity": "sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", + "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { - "lie": "~3.3.0", + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^4.0.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-report/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-reports": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.2.0.tgz", + "integrity": "sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jackspeak": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/js-yaml": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", + "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jszip": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.10.1.tgz", + "integrity": "sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==", + "dev": true, + "license": "(MIT OR GPL-3.0-or-later)", + "dependencies": { + "lie": "~3.3.0", "pako": "~1.0.2", "readable-stream": "~2.3.6", "setimmediate": "^1.0.5" } }, "node_modules/keyv": { - "version": "4.5.3", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.3.tgz", - "integrity": "sha512-QCiSav9WaX1PgETJ+SpNnx2PRRapJ/oRSXM4VO5OGYGSjrxbKPVFVhB3l2OCbLCk329N8qyAtsJjSjvVBWzEug==", + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", "dev": true, + "license": "MIT", "dependencies": { "json-buffer": "3.0.1" } @@ -1425,6 +2279,7 @@ "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", "dev": true, + "license": "MIT", "dependencies": { "prelude-ls": "^1.2.1", "type-check": "~0.4.0" @@ -1438,6 +2293,7 @@ "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", "dev": true, + "license": "MIT", "dependencies": { "immediate": "~3.0.5" } @@ -1447,6 +2303,7 @@ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", "dev": true, + "license": "MIT", "dependencies": { "p-locate": "^5.0.0" }, @@ -1461,13 +2318,15 @@ "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/log-symbols": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", "dev": true, + "license": "MIT", "dependencies": { "chalk": "^4.1.0", "is-unicode-supported": "^0.1.0" @@ -1480,78 +2339,135 @@ } }, "node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/make-dir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", + "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", "dev": true, + "license": "MIT", "dependencies": { - "yallist": "^4.0.0" + "semver": "^7.5.3" }, "engines": { "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true, + "license": "ISC" + }, "node_modules/merge2": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 8" } }, "node_modules/micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", "dev": true, + "license": "MIT", "dependencies": { - "braces": "^3.0.2", + "braces": "^3.0.3", "picomatch": "^2.3.1" }, "engines": { "node": ">=8.6" } }, + "node_modules/mimic-function": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/mimic-function/-/mimic-function-5.0.1.tgz", + "integrity": "sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", "dev": true, + "license": "ISC", "dependencies": { - "brace-expansion": "^1.1.7" + "brace-expansion": "^2.0.1" }, "engines": { - "node": "*" + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" } }, "node_modules/mocha": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.2.0.tgz", - "integrity": "sha512-IDY7fl/BecMwFHzoqF2sg/SHHANeBoMMXFlS9r0OXKDssYE1M5O43wUY/9BVPeIvfH2zmEbBfseqN9gBQZzXkg==", - "dev": true, - "dependencies": { - "ansi-colors": "4.1.1", - "browser-stdout": "1.3.1", - "chokidar": "3.5.3", - "debug": "4.3.4", - "diff": "5.0.0", - "escape-string-regexp": "4.0.0", - "find-up": "5.0.0", - "glob": "7.2.0", - "he": "1.2.0", - "js-yaml": "4.1.0", - "log-symbols": "4.1.0", - "minimatch": "5.0.1", - "ms": "2.1.3", - "nanoid": "3.3.3", - "serialize-javascript": "6.0.0", - "strip-json-comments": "3.1.1", - "supports-color": "8.1.1", - "workerpool": "6.2.1", - "yargs": "16.2.0", - "yargs-parser": "20.2.4", - "yargs-unparser": "2.0.0" + "version": "10.8.2", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.8.2.tgz", + "integrity": "sha512-VZlYo/WE8t1tstuRmqgeyBgCbJc/lEdopaa+axcKzTBJ+UIdlAB9XnmvTCAH4pwR4ElNInaedhEBmZD8iCSVEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-colors": "^4.1.3", + "browser-stdout": "^1.3.1", + "chokidar": "^3.5.3", + "debug": "^4.3.5", + "diff": "^5.2.0", + "escape-string-regexp": "^4.0.0", + "find-up": "^5.0.0", + "glob": "^8.1.0", + "he": "^1.2.0", + "js-yaml": "^4.1.0", + "log-symbols": "^4.1.0", + "minimatch": "^5.1.6", + "ms": "^2.1.3", + "serialize-javascript": "^6.0.2", + "strip-json-comments": "^3.1.1", + "supports-color": "^8.1.1", + "workerpool": "^6.5.1", + "yargs": "^16.2.0", + "yargs-parser": "^20.2.9", + "yargs-unparser": "^2.0.0" }, "bin": { "_mocha": "bin/_mocha", @@ -1559,26 +2475,54 @@ }, "engines": { "node": ">= 14.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mochajs" } }, - "node_modules/mocha/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==", + "node_modules/mocha/node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", "dev": true, + "license": "ISC", "dependencies": { - "balanced-match": "^1.0.0" + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/mocha/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/mocha/node_modules/glob": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", + "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, "node_modules/mocha/node_modules/minimatch": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.0.1.tgz", - "integrity": "sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==", + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", "dev": true, + "license": "ISC", "dependencies": { "brace-expansion": "^2.0.1" }, @@ -1586,17 +2530,27 @@ "node": ">=10" } }, - "node_modules/mocha/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true + "node_modules/mocha/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } }, "node_modules/mocha/node_modules/supports-color": { "version": "8.1.1", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", "dev": true, + "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -1607,43 +2561,92 @@ "url": "https://github.com/chalk/supports-color?sponsor=1" } }, + "node_modules/mocha/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/mocha/node_modules/yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dev": true, + "license": "MIT", + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/mocha/node_modules/yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" }, "node_modules/n-readlines": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/n-readlines/-/n-readlines-1.0.1.tgz", "integrity": "sha512-z4SyAIVgMy7CkgsoNw7YVz40v0g4+WWvvqy8+ZdHrCtgevcEO758WQyrYcw3XPxcLxF+//RszTz/rO48nzD0wQ==", + "license": "MIT", "engines": { "node": ">=6.x.x" } }, - "node_modules/nanoid": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.3.tgz", - "integrity": "sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w==", + "node_modules/nanolru": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/nanolru/-/nanolru-1.0.0.tgz", + "integrity": "sha512-GyQkE8M32pULhQk7Sko5raoIbPalAk90ICG+An4fq6fCsFHsP6fB2K46WGXVdoJpy4SGMnZ/EKbo123fZJomWg==", "dev": true, - "bin": { - "nanoid": "bin/nanoid.cjs" - }, + "license": "MIT", "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + "node": ">= 0.4.0" } }, "node_modules/natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -1653,32 +2656,185 @@ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", "dev": true, + "license": "ISC", "dependencies": { "wrappy": "1" } }, + "node_modules/onetime": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-7.0.0.tgz", + "integrity": "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-function": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/optionator": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", - "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", "dev": true, + "license": "MIT", "dependencies": { - "@aashutoshrathi/word-wrap": "^1.2.3", "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", "levn": "^0.4.1", "prelude-ls": "^1.2.1", - "type-check": "^0.4.0" + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" }, "engines": { "node": ">= 0.8.0" } }, + "node_modules/ora": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/ora/-/ora-8.2.0.tgz", + "integrity": "sha512-weP+BZ8MVNnlCm8c0Qdc1WSWq4Qn7I+9CJGm7Qali6g44e/PUzbjNqJX5NJ9ljlNMosfJvg1fKEGILklK9cwnw==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^5.3.0", + "cli-cursor": "^5.0.0", + "cli-spinners": "^2.9.2", + "is-interactive": "^2.0.0", + "is-unicode-supported": "^2.0.0", + "log-symbols": "^6.0.0", + "stdin-discarder": "^0.2.2", + "string-width": "^7.2.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ora/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/ora/node_modules/chalk": { + "version": "5.6.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", + "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/ora/node_modules/emoji-regex": { + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz", + "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==", + "dev": true, + "license": "MIT" + }, + "node_modules/ora/node_modules/is-unicode-supported": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-2.1.0.tgz", + "integrity": "sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ora/node_modules/log-symbols": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-6.0.0.tgz", + "integrity": "sha512-i24m8rpwhmPIS4zscNzK6MSEhk0DUWa/8iYQWxhffV8jkI4Phvs3F+quL5xvS0gdQR0FyTCMMH33Y78dDTzzIw==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^5.3.0", + "is-unicode-supported": "^1.3.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ora/node_modules/log-symbols/node_modules/is-unicode-supported": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-1.3.0.tgz", + "integrity": "sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ora/node_modules/string-width": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ora/node_modules/strip-ansi": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", + "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, "node_modules/p-limit": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "dev": true, + "license": "MIT", "dependencies": { "yocto-queue": "^0.1.0" }, @@ -1694,6 +2850,7 @@ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", "dev": true, + "license": "MIT", "dependencies": { "p-limit": "^3.0.2" }, @@ -1704,22 +2861,26 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/package_name": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/package_name/-/package_name-1.0.0.tgz", - "integrity": "sha512-ZaCLuuLgYe6EmhJ7fhrAMbWCksWoviESjbL31J+xGBIIkQM5BbNdLVREqnbIm5PDXhLyj8kfkvCO1OYBHbXrGg==" + "node_modules/package-json-from-dist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", + "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", + "dev": true, + "license": "BlueOak-1.0.0" }, "node_modules/pako": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", - "dev": true + "dev": true, + "license": "(MIT AND Zlib)" }, "node_modules/parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", "dev": true, + "license": "MIT", "dependencies": { "callsites": "^3.0.0" }, @@ -1732,6 +2893,7 @@ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -1741,6 +2903,7 @@ "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -1750,24 +2913,51 @@ "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, + "node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/path-type": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, "node_modules/picomatch": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "dev": true, + "license": "MIT", "engines": { "node": ">=8.6" }, @@ -1780,6 +2970,7 @@ "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.8.0" } @@ -1788,13 +2979,15 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "dev": true + "dev": true, + "license": "MIT" }, "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, + "license": "MIT", "engines": { "node": ">=6" } @@ -1817,13 +3010,15 @@ "type": "consulting", "url": "https://feross.org/support" } - ] + ], + "license": "MIT" }, "node_modules/randombytes": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", "dev": true, + "license": "MIT", "dependencies": { "safe-buffer": "^5.1.0" } @@ -1833,6 +3028,7 @@ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", "dev": true, + "license": "MIT", "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -1848,6 +3044,7 @@ "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", "dev": true, + "license": "MIT", "dependencies": { "picomatch": "^2.2.1" }, @@ -1860,6 +3057,7 @@ "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -1869,15 +3067,34 @@ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", "dev": true, + "license": "MIT", "engines": { "node": ">=4" } }, + "node_modules/restore-cursor": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-5.1.0.tgz", + "integrity": "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==", + "dev": true, + "license": "MIT", + "dependencies": { + "onetime": "^7.0.0", + "signal-exit": "^4.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", "dev": true, + "license": "MIT", "engines": { "iojs": ">=1.0.0", "node": ">=0.10.0" @@ -1887,15 +3104,63 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "dev": true, + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rimraf/node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/rimraf/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rimraf/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, + "license": "ISC", "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" + "brace-expansion": "^1.1.7" }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "engines": { + "node": "*" } }, "node_modules/run-parallel": { @@ -1917,6 +3182,7 @@ "url": "https://feross.org/support" } ], + "license": "MIT", "dependencies": { "queue-microtask": "^1.2.2" } @@ -1925,16 +3191,15 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, + "license": "ISC", "bin": { "semver": "bin/semver.js" }, @@ -1943,10 +3208,11 @@ } }, "node_modules/serialize-javascript": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", - "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", + "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "randombytes": "^2.1.0" } @@ -1955,13 +3221,15 @@ "version": "1.0.5", "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "dev": true, + "license": "MIT", "dependencies": { "shebang-regex": "^3.0.0" }, @@ -1974,33 +3242,82 @@ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true, + "license": "MIT", "engines": { "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, + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/slash": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, + "node_modules/stdin-discarder": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/stdin-discarder/-/stdin-discarder-0.2.2.tgz", + "integrity": "sha512-UhDfHmA92YAlNnCfhmq0VeNL5bDbiZGg7sZ2IvPsXubGkiNa9EC+tUTsjBRsYUAz87btI6/1wf4XoVvQ3uRnmQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dev": true, + "license": "MIT", "dependencies": { "safe-buffer": "~5.1.0" } }, "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, + "license": "MIT", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/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, + "license": "MIT", "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -2010,11 +3327,62 @@ "node": ">=8" } }, + "node_modules/string-width-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/string-width/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/string-width/node_modules/strip-ansi": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", + "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, "node_modules/strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", "dependencies": { "ansi-regex": "^5.0.1" }, @@ -2022,11 +3390,22 @@ "node": ">=8" } }, + "node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, "node_modules/strip-json-comments": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" }, @@ -2035,28 +3414,76 @@ } }, "node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "version": "10.2.2", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-10.2.2.tgz", + "integrity": "sha512-SS+jx45GF1QjgEXQx4NJZV9ImqmO2NPz5FNsIHrsDjh2YsHnawpan7SNQ1o8NuhrbHZy9AZhIoCUiCeaW/C80g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/tapable": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.0.tgz", + "integrity": "sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/test-exclude": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-7.0.1.tgz", + "integrity": "sha512-pFYqmTw68LXVjeWJMST4+borgQP2AyMNbg1BpZh9LbyhUeNkeaPF9gzfPGUAnSMV3qPYdWUwDIjjCLiSDOl7vg==", "dev": true, + "license": "ISC", "dependencies": { - "has-flag": "^4.0.0" + "@istanbuljs/schema": "^0.1.2", + "glob": "^10.4.1", + "minimatch": "^9.0.4" }, "engines": { - "node": ">=8" + "node": ">=18" + } + }, + "node_modules/test-exclude/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, "node_modules/text-table": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", "dev": true, + "license": "MIT", "dependencies": { "is-number": "^7.0.0" }, @@ -2065,22 +3492,116 @@ } }, "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==", + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.4.3.tgz", + "integrity": "sha512-i3eMG77UTMD0hZhgRS562pv83RC6ukSAC2GMNWc+9dieh/+jDM5u5YG+NHX6VNDRHQcHwmsTHctP9LhbC3WxVw==", "dev": true, + "license": "MIT", "engines": { - "node": ">=16.13.0" + "node": ">=16" }, "peerDependencies": { "typescript": ">=4.2.0" } }, + "node_modules/ts-mocha": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/ts-mocha/-/ts-mocha-11.1.0.tgz", + "integrity": "sha512-yT7FfzNRCu8ZKkYvAOiH01xNma/vLq6Vit7yINKYFNVP8e5UyrYXSOMIipERTpzVKJQ4Qcos5bQo1tNERNZevQ==", + "dev": true, + "license": "MIT", + "bin": { + "ts-mocha": "bin/ts-mocha" + }, + "engines": { + "node": ">= 6.X.X" + }, + "peerDependencies": { + "mocha": "^3.X.X || ^4.X.X || ^5.X.X || ^6.X.X || ^7.X.X || ^8.X.X || ^9.X.X || ^10.X.X || ^11.X.X", + "ts-node": "^7.X.X || ^8.X.X || ^9.X.X || ^10.X.X", + "tsconfig-paths": "^4.X.X" + }, + "peerDependenciesMeta": { + "tsconfig-paths": { + "optional": true + } + } + }, + "node_modules/ts-node": { + "version": "10.9.2", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", + "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@cspotcode/source-map-support": "^0.8.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "v8-compile-cache-lib": "^3.0.1", + "yn": "3.1.1" + }, + "bin": { + "ts-node": "dist/bin.js", + "ts-node-cwd": "dist/bin-cwd.js", + "ts-node-esm": "dist/bin-esm.js", + "ts-node-script": "dist/bin-script.js", + "ts-node-transpile-only": "dist/bin-transpile.js", + "ts-script": "dist/bin-script-deprecated.js" + }, + "peerDependencies": { + "@swc/core": ">=1.2.50", + "@swc/wasm": ">=1.2.50", + "@types/node": "*", + "typescript": ">=2.7" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "@swc/wasm": { + "optional": true + } + } + }, + "node_modules/ts-node/node_modules/diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/tsconfig-paths": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-4.2.0.tgz", + "integrity": "sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==", + "dev": true, + "license": "MIT", + "dependencies": { + "json5": "^2.2.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", "dev": true, + "license": "MIT", "dependencies": { "prelude-ls": "^1.2.1" }, @@ -2093,6 +3614,7 @@ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", "dev": true, + "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=10" }, @@ -2101,10 +3623,11 @@ } }, "node_modules/typescript": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.2.2.tgz", - "integrity": "sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==", + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", "dev": true, + "license": "Apache-2.0", "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -2113,11 +3636,19 @@ "node": ">=14.17" } }, + "node_modules/undici-types": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", + "dev": true, + "license": "MIT" + }, "node_modules/uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "punycode": "^2.1.0" } @@ -2126,13 +3657,48 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "dev": true + "dev": true, + "license": "MIT" + }, + "node_modules/v8-compile-cache-lib": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", + "dev": true, + "license": "MIT" + }, + "node_modules/v8-to-istanbul": { + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.3.0.tgz", + "integrity": "sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==", + "dev": true, + "license": "ISC", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.12", + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^2.0.0" + }, + "engines": { + "node": ">=10.12.0" + } + }, + "node_modules/v8-to-istanbul/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dev": true, + "license": "ISC", "dependencies": { "isexe": "^2.0.0" }, @@ -2143,17 +3709,48 @@ "node": ">= 8" } }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/workerpool": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.1.tgz", - "integrity": "sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw==", - "dev": true + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.5.1.tgz", + "integrity": "sha512-Fs4dNYcsdpYSAfVxhnl1L5zTksjvOJxtC5hzMNl+1t9B8hTJTdKDyZ5ju7ztgPy+ft9tBFXoOlDNiOT9WUXZlA==", + "dev": true, + "license": "Apache-2.0" }, "node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", @@ -2166,52 +3763,114 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, + "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/wrap-ansi-cjs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/strip-ansi": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", + "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/y18n": { "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", "dev": true, + "license": "ISC", "engines": { "node": ">=10" } }, - "node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, "node_modules/yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", "dev": true, + "license": "MIT", "dependencies": { - "cliui": "^7.0.2", + "cliui": "^8.0.1", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", - "string-width": "^4.2.0", + "string-width": "^4.2.3", "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" + "yargs-parser": "^21.1.1" }, "engines": { - "node": ">=10" + "node": ">=12" } }, "node_modules/yargs-parser": { - "version": "20.2.4", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", - "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", "dev": true, + "license": "ISC", "engines": { - "node": ">=10" + "node": ">=12" } }, "node_modules/yargs-unparser": { @@ -2219,6 +3878,7 @@ "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", "dev": true, + "license": "MIT", "dependencies": { "camelcase": "^6.0.0", "decamelize": "^4.0.0", @@ -2229,11 +3889,44 @@ "node": ">=10" } }, + "node_modules/yargs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/yargs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" }, diff --git a/package.json b/package.json index 52e6542..ddb5cd1 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { - "name": "gnucobol-debug", - "displayName": "COBOL debugger", + "name": "superbol-vscode-debug", + "displayName": "SuperBOL Debugger for GnuCOBOL", "description": "Debug or execute COBOL code. No mainframe required.", "keywords": [ "cobol", @@ -10,24 +10,34 @@ "code coverage" ], "version": "3.32.0", - "publisher": "OlegKunitsyn", + "publisher": "OCamlPro SAS", + "contributors": [ + { + "name": "Emilien Lemaire", + "email": "emilien.lemaire@ocamlpro.com" + }, + { + "name": "Olegs Kunicins", + "email": "olegs.kunicins@gmail.com" + } + ], "license": "GPL-3.0", "icon": "icon.png", "engines": { - "vscode": "^1.44.0" + "vscode": "^1.66.0", + "node": ">=20" }, "main": "./out/src/extension", "activationEvents": [ "onDebugResolve", - "onCommand:gnucobol-debug.dockerStart", - "onCommand:gnucobol-debug.dockerStop" + "onDebugInitialConfigurations" ], "categories": [ "Debuggers" ], "repository": { "type": "git", - "url": "https://github.com/OlegKunitsyn/gnucobol-debug.git" + "url": "https://github.com/OCamlPro/superbol-vscode-debug.git" }, "capabilities": { "untrustedWorkspaces": { @@ -35,49 +45,39 @@ } }, "contributes": { - "commands": [ - { - "command": "gnucobol-debug.dockerStart", - "title": "GnuCOBOL Docker: start" - }, - { - "command": "gnucobol-debug.dockerStop", - "title": "GnuCOBOL Docker: stop" - } - ], "breakpoints": [ { "language": "cobol" - }, - { - "language": "COBOL" - }, - { - "language": "ACUCOBOL" - }, - { - "language": "OpenCOBOL" - }, - { - "language": "GnuCOBOL" - }, + } + ], + "languages": [ { - "language": "entcobol" + "id": "cobol", + "aliases": [ + "COBOL" + ], + "filenamePatterns": [ + "*.[cC]{ob,OB,bl,BL,py,PY,bx,BX,bsql}" + ] } ], "debuggers": [ { - "type": "gdb", + "type": "superbol-gdb", + "languages": [ + "cobol", + "COBOL" + ], "program": "./out/src/gdb.js", "runtime": "node", - "label": "COBOL debugger", + "label": "SuperBOL Debugger for GnuCOBOL", "configurationAttributes": { "launch": { "required": [], "properties": { "target": { "type": "string", - "description": "Path to executable", + "description": "Path to the executable, or name of the module to launch", "default": "${file}" }, "arguments": { @@ -88,30 +88,7 @@ "cwd": { "type": "string", "description": "Path to project", - "default": "${workspaceRoot}" - }, - "gdbpath": { - "type": "string", - "description": "Path to gdb", - "default": "gdb" - }, - "docker": { - "type": "string", - "description": "Docker image", - "default": "olegkunitsyn/gnucobol:3.1-dev" - }, - "cobcpath": { - "type": "string", - "description": "Path to cobc", - "default": "cobc" - }, - "cobcargs": { - "type": "array", - "description": "Extra arguments for cobc", - "default": [ - "-free", - "-x" - ] + "default": "${workspaceFolder}" }, "group": { "type": "array", @@ -126,11 +103,11 @@ "coverage": { "type": "boolean", "description": "Enable code coverage", - "default": true + "default": false }, "verbose": { "type": "boolean", - "description": "Debug GDB", + "description": "Debug interactions with gdb", "default": false }, "gdbtty": { @@ -144,8 +121,22 @@ true, false, "vscode", + "xterm", + "gnome-terminal", + "xfce4-terminal", + "konsole", "external" ] + }, + "useCobcrun": { + "type": "boolean", + "markdownDescription": "Debug the target as a module of `cobcrun`", + "default": false + }, + "sourceDirs": { + "type": "array", + "markdownDescription": "Where to find the source code, in addition to the current directory.\n\nExample: `[ \"/usr/share/cobol/sources\" ]`", + "default": [] } } }, @@ -159,31 +150,13 @@ }, "arguments": { "type": "string", - "description": "Extra arguments for executable", + "description": "Extra arguments (only used when the program is restarted)", "default": null }, "cwd": { "type": "string", "description": "Path to project", - "default": "${workspaceRoot}" - }, - "gdbpath": { - "type": "string", - "description": "Path to gdb", - "default": "gdb" - }, - "cobcpath": { - "type": "string", - "description": "Path to cobc", - "default": "cobc" - }, - "cobcargs": { - "type": "array", - "description": "Extra arguments for cobc", - "default": [ - "-free", - "-x" - ] + "default": "${workspaceFolder}" }, "group": { "type": "array", @@ -197,7 +170,7 @@ }, "verbose": { "type": "boolean", - "description": "Debug GDB", + "description": "Debug interactions with gdb", "default": false }, "pid": { @@ -209,78 +182,87 @@ "type": "string", "description": "GDB Server host:port", "default": null + }, + "sourceDirs": { + "type": "array", + "markdownDescription": "Where to find the source code, in addition to the current directory.\n\nExample: `[ \"/usr/share/cobol/sources\" ]`", + "default": [] } } } }, - "initialConfigurations": [ + "configurationSnippets": [ { - "name": "COBOL debugger", - "type": "gdb", - "request": "launch", - "cobcargs": [ - "-free", - "-x" - ], - "coverage": true, - "gdbtty": true + "label": "SuperBOL: debug launch", + "description": "New SuperBOL launch request", + "body": { + "name": "${2:SuperBOL: debug launch}", + "type": "superbol-gdb", + "request": "launch", + "target": "$${_:{file}}", + "arguments": "", + "cwd": "$${_:{workspaceRoot}}", + "gdbtty": true + } }, { - "name": "COBOL debugger attach local", - "type": "gdb", - "request": "attach", - "cobcargs": [ - "-free", - "-x" - ], - "pid": "${input:pid}" + "label": "SuperBOL: debug attach local", + "description": "New SuperBOL attach local request", + "body": { + "name": "${2:SuperBOL: debug attach local}", + "type": "superbol-gdb", + "request": "attach", + "pid": "${3:0}", + "target": "$${_:{file}}", + "cwd": "$${_:{workspaceRoot}}" + } }, { - "name": "COBOL debugger attach remote", - "type": "gdb", - "request": "attach", - "cobcargs": [ - "-free", - "-x" - ], - "remoteDebugger": "${input:remoteDebugger}" + "label": "SuperBOL: debug attach remote", + "description": "New SuperBOL attach remote request", + "body": { + "name": "${2:SuperBOL: debug attach remote}", + "type": "superbol-gdb", + "request": "attach", + "remoteDebugger": "${3:host:port}", + "target": "$${_:{file}}", + "cwd": "$${_:{workspaceRoot}}" + } } ] } ], "configuration": { - "type": "object", - "title": "COBOL Debugger", + "title": "SuperBOL Debugger", "properties": { - "Cobol_Debugger.display_variable_attributes": { + "superbol-vscode-debug.displayVariableAttributes": { "type": "boolean", "default": false, - "description": "Displaying Data Storages and Fields attributes(e.g. size of Alphanumerics or digits and scale of numerics).", + "description": "Displaying Data Storages and Fields attributes (e.g. size of Alphanumerics or digits and scale of numerics).", "scope": "resource" }, - "Cobol_Debugger.cwd": { + "superbol-vscode-debug.gdbPath": { "type": "string", - "default": "${workspaceRoot}", - "description": "Path to project", - "scope": "application" - }, - "Cobol_Debugger.target": { - "type": "string", - "description": "Path to source code", - "default": "${file}", - "scope": "application" - }, - "Cobol_Debugger.gdbpath": { + "title": "GNU Debugger Executable", + "markdownDescription": "Path to the GNU debugger executable.\n", + "default": "gdb", + "scope": "machine-overridable" + }, + "superbol-vscode-debug.cobcrunPath": { + "title": "GnuCOBOL module loader", + "markdownDescription": "Path to `cobcrun`, the GnuCOBOL module loader.\n", "type": "string", - "description": "Path to gdb", - "default": "gdb", - "scope": "application" + "default": "cobcrun", + "scope": "machine-overridable" }, - "Cobol_Debugger.cobcpath": { - "type": "string", - "description": "Path to cobc", - "default": "cobc", - "scope": "application" + "superbol-vscode-debug.libcobPath": { + "title": "GnuCOBOL Runtime Library", + "type": [ + "string", + "null" + ], + "description": "Path to the GnuCOBOL runtime library file.", + "scope": "machine-overridable" } } } @@ -289,26 +271,36 @@ "prepare": "tsc -p ./", "compile": "tsc -p ./", "watch": "tsc -w -p ./", - "test": "mocha -u tdd ./out/test/", + "test": "npm run compile && vscode-test", "lint": "eslint -c .eslintrc.js --ext .ts ./" }, "devDependencies": { - "@types/mocha": "^10.0.1", + "@types/expect": "^1.20.4", + "@types/mocha": "^10.0.10", "@types/node": "^20.6.3", - "@types/vscode": "^1.44.0", + "@types/vscode": "^1.64.0", "@typescript-eslint/eslint-plugin": "^6.7.2", "@typescript-eslint/parser": "^6.7.2", - "@vscode/test-electron": "^2.3.4", + "@vscode/debugadapter-testsupport": "^1.51.0", + "@vscode/test-cli": "^0.0.12", + "@vscode/test-electron": "^2.5.2", "eslint": "^8.50.0", - "mocha": "^10.2.0", - "typescript": "^5.2.2", - "@vscode/debugadapter-testsupport": "^1.51.0" + "eslint_d": "^12.2.1", + "mocha": "^10.8.2", + "ts-mocha": "^11.1.0", + "ts-node": "^10.9.2", + "tsconfig-paths": "^4.2.0", + "typescript": "^5.2.2" }, "dependencies": { - "gcov-parse": "^1.1.2", - "n-readlines": "^1.0.1", - "package_name": "^1.0.0", + "@vscode/debugadapter": "^1.51.0", "@vscode/debugprotocol": "^1.51.0", - "@vscode/debugadapter": "^1.51.0" + "n-readlines": "^1.0.1" + }, + "devEngines": { + "packageManager": { + "name": "npm", + "onFail": "error" + } } } diff --git a/src/coverage.ts b/src/coverage.ts index 62330d2..251c05f 100644 --- a/src/coverage.ts +++ b/src/coverage.ts @@ -15,10 +15,10 @@ import * as os from "os"; import * as nativePath from "path"; import * as ChildProcess from "child_process"; import {SourceMap} from "./parser.c"; -import * as gcov from "gcov-parse"; +import {GcovData, loadGcovData} from "./gcov"; export class CoverageStatus implements Disposable { - private coverages: gcov.Coverage[] = []; + private coverages: GcovData[] = []; private sourceMap: SourceMap; private statusBar: StatusBarItem = window.createStatusBarItem(StatusBarAlignment.Right, 100); readonly RED: TextEditorDecorationType = window.createTextEditorDecorationType({ @@ -55,17 +55,9 @@ export class CoverageStatus implements Disposable { this.statusBar.command = this.COMMAND; } - public show(gcovFiles: string[], sourceMap: SourceMap, docker: string = undefined) { - if (docker !== undefined) { - for (let i = 0; i < gcovFiles.length; i++) { - const localPath = nativePath.resolve(os.tmpdir(), nativePath.basename(gcovFiles[i])); - ChildProcess.spawnSync('docker', ['cp', `gnucobol:${gcovFiles[i]}.gcda`, `${localPath}.gcda`]); - ChildProcess.spawnSync('docker', ['cp', `gnucobol:${gcovFiles[i]}.gcno`, `${localPath}.gcno`]); - gcovFiles[i] = localPath; - } - } - - this.coverages = gcov.parse(gcovFiles); + public async show(cFiles: string[], sourceMap: SourceMap) { + this.highlight = true; + this.coverages = await loadGcovData(cFiles); this.sourceMap = sourceMap; this.updateStatus(); } @@ -74,6 +66,15 @@ export class CoverageStatus implements Disposable { this.statusBar.dispose(); } + public setHighlight(highlighted: boolean) { + this.highlight = highlighted; + } + + public hide() { + this.highlight = false; + this.updateStatus(); + } + private updateStatus() { const editor = window.activeTextEditor; if (editor === undefined) { @@ -83,17 +84,19 @@ export class CoverageStatus implements Disposable { const red: Range[] = []; const green: Range[] = []; for (const coverage of this.coverages) { - for (const line of coverage.lines) { - if (this.sourceMap.hasLineCobol(coverage.file, line.line)) { - const map = this.sourceMap.getLineCobol(coverage.file, line.line); - if (editor.document.uri.fsPath !== map.fileCobol) { - continue; - } - const range = new Range(map.lineCobol - 1, 0, map.lineCobol - 1, Number.MAX_VALUE); - if (line.executed) { - green.push(range); - } else { - red.push(range); + for (const file of coverage.files) { + for (const line of file.lines) { + if (this.sourceMap.hasLineCobol(file.file, line.line_number)) { + const map = this.sourceMap.getLineCobol(file.file, line.line_number); + if (editor.document.uri.fsPath !== map.fileCobol) { + continue; + } + const range = new Range(map.lineCobol - 1, 0, map.lineCobol - 1, Number.MAX_VALUE); + if (line.count > 0) { + green.push(range); + } else { + red.push(range); + } } } } diff --git a/src/debugger.ts b/src/debugger.ts index fd7b79d..7223b77 100644 --- a/src/debugger.ts +++ b/src/debugger.ts @@ -1,7 +1,7 @@ import {MINode} from "./parser.mi2"; import {DebugProtocol} from "@vscode/debugprotocol/lib/debugProtocol"; import {removeLeadingZeroes} from "./functions"; -import {SourceMap} from "./parser.c"; +import {SourceMap, Line} from "./parser.c"; export interface Breakpoint { file?: string; @@ -19,11 +19,32 @@ export interface Thread { export interface Stack { level: number; - address: string; function: string; - fileName: string; - file: string; + line: Line; +} + +export interface FileSymbols { + filename: string; + fullname: string; + symbols: Symbol[]; +} + +export interface Symbol { line: number; + name: string; + type: string; + description: string; +} + +export interface LocalizedSymbol { + symbol: Symbol; + filename: string; +} + +export function localizeSymbols(fileSymbols: FileSymbols): LocalizedSymbol[] { + return fileSymbols.symbols.map(s => { + return { symbol: s, filename: fileSymbols.filename } + }); } const repeatTimeRegex = /(\"\,\s|^)\'(\s|0)\'\s\/i; @@ -398,18 +419,20 @@ export class Attribute { export class DebuggerVariable { - public displayableType: string; - public details: VariableDetail[]; + public readonly displayableType: string; + public readonly details: VariableDetail[]; public constructor( - public cobolName: string, - public cName: string, - public functionName: string, - public attribute: Attribute = null, - public size: number = null, + public readonly cobolName: string, + public readonly cName: string, + public readonly functionName: string, + public readonly rootFileC: string, + public readonly isField: boolean, + public readonly attribute: Attribute = null, + public readonly size: number = null, public value: string = null, public parent: DebuggerVariable = null, - public children: Map = new Map()) { + public readonly children: Map = new Map()) { [this.displayableType, this.details] = this.attribute.getDetails(this.size); } @@ -501,13 +524,16 @@ export interface IDebugger { getStackVariables(thread: number, frame: number): Thenable; - evalExpression(name: string, thread: number, frame: number): Thenable; + globalStorageSymbols(): Thenable; + + evalSymbol(s: LocalizedSymbol): Promise; - evalCobField(name: string, thread: number, frame: number): Promise; + evalExpression(name: string, thread: number, frame: number): Promise; isReady(): boolean; - changeVariable(name: string, rawValue: string): Promise; + changeVariable(name: string, rawValue: string): Promise>; + changeGlobalCVariable(cName: string, rawValue: string): Promise>; examineMemory(from: number, to: number): Thenable; @@ -515,7 +541,7 @@ export interface IDebugger { sendUserInput(command: string, threadId: number, frameLevel: number): Thenable; - getSourceMap(): SourceMap; + sourceMap(): SourceMap; } export class VariableObject { diff --git a/src/extension.ts b/src/extension.ts index a4cc4bb..49b4815 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -4,101 +4,122 @@ import {CoverageStatus} from './coverage'; import {DebuggerSettings} from "./settings"; import { EvaluatableExpressionProvider, TextDocument, Position, EvaluatableExpression, ProviderResult, window, Range } from "vscode"; -const dockerTerminal = vscode.window.createTerminal("GnuCOBOL Docker"); -const dockerMessage = "Property 'docker' is not defined in launch.json"; /** Max column index to retrieve line content */ const MAX_COLUMN_INDEX = 300; /** Array of COBOL Reserved words */ const COBOL_RESERVED_WORDS = ["perform", "move", "to", "set", "add", "subtract", "call", "inquire", "modify", "invoke", "if", "not", "end-if", "until", "varying", "evaluate", "true", "when", "false", "go", "thru", "zeros", "spaces", "zero", "space", "inspect", "tallying", "exit", "paragraph", "method", "cycle", "from", "by", "and", "or", "of", "length", "function", "program", "synchronized", "end-synchronized", "string", "end-string", "on", "reference", "value", "returning", "giving", "replacing", "goback", "all", "open", "i-o", "input", "output", "close", "compute", "unstring", "using", "delete", "start", "read", "write", "rewrite", "with", "lock", "else", "upper-case", "lower-case", "display", "accept", "at", "clear-screen", "initialize", "line", "col", "key", "is", "self", "null", "stop", "run", "upon", "environment-name", "environment-value"] -export function activate(context: vscode.ExtensionContext) { - const dockerStart = vscode.commands.registerCommand('gnucobol-debug.dockerStart', function () { - let config: vscode.DebugConfiguration; - let workspaceRoot: string = vscode.workspace.workspaceFolders[0].uri.fsPath; - for (config of vscode.workspace.getConfiguration('launch', vscode.workspace.workspaceFolders[0].uri).get('configurations') as []) { - if (config.type !== 'gdb') { - continue; - } - if (config.docker === undefined) { - vscode.window.showInformationMessage(dockerMessage); - break; - } - if (process.platform === "win32") { - workspaceRoot = workspaceRoot - .replace(/.*:/, s => "/" + s.toLowerCase().replace(":", "")) - .replace(/\\/g, "/"); - } - vscode.workspace.workspaceFolders[0].uri.fsPath - .replace(/.*:/, s => "/" + s.toLowerCase().replace(":", "")).replace(/\\/g, "/"); - dockerTerminal.show(true); - dockerTerminal.sendText(`docker run -d -i --name gnucobol -w ${workspaceRoot} -v ${workspaceRoot}:${workspaceRoot} ${config.docker}`); - break; - } - }); +const superbolConsts = { + taskType: "superbol", + taskSource: "SuperBOL", + debugBuildTaskName: "build (debug)", +} +const defaultDebugBuildTask = `${superbolConsts.taskSource}: ${superbolConsts.debugBuildTaskName}`; - const dockerStop = vscode.commands.registerCommand('gnucobol-debug.dockerStop', function () { - let config: vscode.DebugConfiguration; - for (config of vscode.workspace.getConfiguration('launch', vscode.workspace.workspaceFolders[0].uri).get('configurations') as []) { - if (config.type !== 'gdb') { - continue; - } - if (config.docker === undefined) { - vscode.window.showInformationMessage(dockerMessage); - break; - } - dockerTerminal.show(true); - dockerTerminal.sendText(`docker rm --force gnucobol`); - break; - } - }); +async function checkForSuperBOLBuildTask () { + return vscode.tasks.fetchTasks({ type: superbolConsts.taskType }).then((tasks) => + tasks.find(task => task.source == superbolConsts.taskSource && + task.name == superbolConsts.debugBuildTaskName) != undefined + ); +} +export function activate(context: vscode.ExtensionContext) { + const provider = new GdbConfigurationProvider(); + const factory = new GdbAdapterDescriptorFactory(new CoverageStatus(), new GDBDebugSession()); context.subscriptions.push( - dockerStart, - dockerStop, - vscode.debug.registerDebugConfigurationProvider('gdb', new GdbConfigurationProvider()), - vscode.debug.registerDebugAdapterDescriptorFactory('gdb', new GdbAdapterDescriptorFactory(new CoverageStatus(), new GDBDebugSession())), + vscode.debug.registerDebugConfigurationProvider('superbol-gdb', provider), + vscode.debug.registerDebugAdapterDescriptorFactory('superbol-gdb', factory), vscode.languages.registerEvaluatableExpressionProvider('GnuCOBOL', new GnuCOBOLEvalExpressionFactory()), vscode.languages.registerEvaluatableExpressionProvider('GnuCOBOL31', new GnuCOBOLEvalExpressionFactory()), vscode.languages.registerEvaluatableExpressionProvider('GnuCOBOL3.1', new GnuCOBOLEvalExpressionFactory()), vscode.languages.registerEvaluatableExpressionProvider('GnuCOBOL32', new GnuCOBOLEvalExpressionFactory()), vscode.languages.registerEvaluatableExpressionProvider('GnuCOBOL3.2', new GnuCOBOLEvalExpressionFactory()), - vscode.languages.registerEvaluatableExpressionProvider('COBOL', new GnuCOBOLEvalExpressionFactory()), - ); + vscode.languages.registerEvaluatableExpressionProvider('COBOL', new GnuCOBOLEvalExpressionFactory())); } export function deactivate() { - dockerTerminal.dispose(); } class GdbConfigurationProvider implements vscode.DebugConfigurationProvider { - resolveDebugConfiguration(folder: vscode.WorkspaceFolder | undefined, config: vscode.DebugConfiguration, token?: vscode.CancellationToken): vscode.ProviderResult { + public resolveDebugConfiguration(workspaceFolder: vscode.WorkspaceFolder | undefined, config: vscode.DebugConfiguration, _token?: vscode.CancellationToken): vscode.ProviderResult { config.gdbargs = ["-q", "--interpreter=mi2"]; - if (config.docker !== undefined) { - config.cobcpath = 'docker'; - config.gdbpath = 'docker'; - config.cobcargs = ['exec', '-i', 'gnucobol', 'cobc'].concat(config.cobcargs); - config.gdbargs = ['exec', '-i', 'gnucobol', 'gdb'].concat(config.gdbargs); - } - const settings = new DebuggerSettings(); - if (config.cwd === undefined) { - config.cwd = settings.cwd; - } - if (config.target === undefined) { - config.target = settings.target; - } - if (config.group === undefined) { - config.group = []; - } - if (config.arguments === undefined) { - config.arguments = ""; - } - if (config.gdbpath === undefined) { - config.gdbpath = settings.gdbpath; - } - if (config.cobcpath === undefined) { - config.cobcpath = settings.cobcpath; - } - return config; + return checkForSuperBOLBuildTask().then(haveSuperBOLBuildTask => { + if (config.name === undefined && haveSuperBOLBuildTask) { + config.name = "SuperBOL: default debug"; + } + if (config.type === undefined) { + config.type = "superbol-gdb"; + } + if (config.request === undefined) { + config.request = "launch"; + } + if (haveSuperBOLBuildTask && + workspaceFolder != undefined && + config.request != "attach" && + config.preLaunchTask === undefined) { + config.preLaunchTask = defaultDebugBuildTask; + } else if (config.preLaunchTask === "") { + delete config.preLaunchTask; + } + if (config.target === undefined) { + config.target = "${file}"; + } + if (config.arguments === undefined) { + config.arguments = ""; + } + if (config.group === undefined) { + config.group = []; + } + if (config.env === undefined) { + config.env = { ["LD_LIBRARY_PATH"]: config.libcobpath }; + } else { + config.env.LD_LIBRARY_PATH = config.libcobpath + ";" + config.env.LD_LIBRARY_PATH; + } + if (config.coverage === undefined) { + config.coverage = false; + } + if (config.gdbtty === undefined) { + config.gdbtty = false; + } + config.sourceDirs = config.sourceDirs ?? []; + return config; + }); + } + + public provideDebugConfigurations(_folder: vscode.WorkspaceFolder, _token?: vscode.CancellationToken) + : vscode.ProviderResult { + return checkForSuperBOLBuildTask().then(haveSuperBOLBuildTask => { + const launchConfigDefault: vscode.DebugConfiguration = { + name: "SuperBOL: debug (launch)", + type: "superbol-gdb", + request: "launch", + preLaunchTask: haveSuperBOLBuildTask ? defaultDebugBuildTask : undefined, + target: "${file}", + arguments: "" + }; + + const attachLocalConfiguration: vscode.DebugConfiguration = { + name: "SuperBOL: debug (attach local)", + type: "superbol-gdb", + request: "attach", + pid: "${input:pid}", + target: "${file}" + }; + + const attachRemoteConfiguration: vscode.DebugConfiguration = { + name: "SuperBOL: debug (attach remote)", + type: "superbol-gdb", + request: "attach", + remoteDebugger: "${input:remoteDebugger}", + target: "${file}" + } + + return [ + launchConfigDefault, + attachLocalConfiguration, + attachRemoteConfiguration + ]; + }); } } @@ -106,7 +127,7 @@ class GdbAdapterDescriptorFactory implements vscode.DebugAdapterDescriptorFactor constructor(public coverageBar: CoverageStatus, public debugSession: GDBDebugSession) { } - createDebugAdapterDescriptor(session: vscode.DebugSession): vscode.ProviderResult { + createDebugAdapterDescriptor(_session: vscode.DebugSession): vscode.ProviderResult { this.debugSession.coverageStatus = this.coverageBar; return new vscode.DebugAdapterInlineImplementation(this.debugSession); } @@ -134,10 +155,11 @@ class GnuCOBOLEvalExpressionFactory implements EvaluatableExpressionProvider { return undefined; } // TODO: Do not use a global variable - const variableName = globalThis.varGlobal.filter(it => it.children.toLowerCase() === txtToEval.toLowerCase()); - if(variableName && variableName.length>0){ - return new EvaluatableExpression(wordRange, variableName[0].father); - } + // Disabled for now... + // const variableName = globalThis.varGlobal.filter(it => it.children.toLowerCase() === txtToEval.toLowerCase()); + // if(variableName && variableName.length>0){ + // return new EvaluatableExpression(wordRange, variableName[0].father); + // } return wordRange ? new EvaluatableExpression(wordRange) : undefined; } diff --git a/src/gcov.ts b/src/gcov.ts new file mode 100644 index 0000000..8a374b3 --- /dev/null +++ b/src/gcov.ts @@ -0,0 +1,98 @@ +import * as vscode from "vscode"; +import * as child_process from "child_process"; + +export interface GcovLineData { + count: number; + function_name: string; + line_number: number; + unexecuted_block: boolean; +} + +export interface GcovFunctionData { + blocks: number; + blocks_executed: number; + demangled_name: string; + start_column: number; + start_line: number; + end_column: number; + end_line: number; + execution_count: number; + name: string; +} + +export interface GcovFileData { + file: string; + lines: GcovLineData[]; + functions: GcovFunctionData[]; +} + +export interface GcovData { + files: GcovFileData[]; + current_working_directory: string; + data_file: string; +} + +function getGcovBinary() { + return "gcov"; +} + +export async function isGcovCompatible() { + const gcovBinary = getGcovBinary(); + const command = `${gcovBinary} --help`; + return new Promise((resolve, _reject) => { + child_process.exec(command, (err, stdout, _stderr) => { + if (err) { + void vscode.window.showErrorMessage( + `Error while trying to run gcov, try to change the "Gcov Binary" setting. ${err.message}` + ); + resolve(false); + return; + } + const gcovOutput = stdout.toString(); + const supportsRequiredArgs = + gcovOutput.includes("--json-format") && gcovOutput.includes("--stdout"); + if (!supportsRequiredArgs) { + void vscode.window.showErrorMessage( + `The gcov version is not compatible. Please use at least version 9.` + ); + } + resolve(supportsRequiredArgs); + }); + }); +} + +export async function loadGcovData(paths: string[]): Promise { + if (paths.length === 0) { + return []; + } + + const gcovBinary = getGcovBinary(); + + let command = `${gcovBinary} --stdout --json-format`; + for (const path of paths) { + command += ` "${path}"`; + } + return new Promise((resolve, reject) => { + child_process.exec( + command, + { maxBuffer: 256 * 1024 * 1024 }, + (err, stdout, _stderr) => { + if (err) { + console.error(`exec error: ${err.message}`); + reject(); + return; + } + const gcovOutput = stdout.toString(); + const output = []; + const parts = gcovOutput.split("\n"); + for (const part of parts) { + if (part.length === 0) { + continue; + } + output.push(JSON.parse(part)); + } + resolve(output); + } + ); + }); +} diff --git a/src/gdb.ts b/src/gdb.ts index f8aeecd..c8b778e 100644 --- a/src/gdb.ts +++ b/src/gdb.ts @@ -13,55 +13,68 @@ import { ThreadEvent } from '@vscode/debugadapter'; import {DebugProtocol} from '@vscode/debugprotocol'; -import {VariableObject} from './debugger'; +import {Breakpoint, DebuggerVariable, localizeSymbols} from './debugger'; import {MINode} from './parser.mi2'; +import * as path from "path"; import {MI2} from './mi2'; import {CoverageStatus} from './coverage'; import {DebuggerSettings} from './settings'; +import * as log from './log'; const STACK_HANDLES_START = 1000; const VAR_HANDLES_START = 512 * 256 + 1000; class ExtendedVariable { - constructor(public name, public options) { + constructor(public _name: string, public _options: unknown) { } } +function stripPathExtensions(p1: string) { + const p2 = path.basename(p1, path.extname(p1)); + return (p2 === p1) ? p1 : stripPathExtensions(p2); +} + export interface LaunchRequestArguments extends DebugProtocol.LaunchRequestArguments { - cwd: string; + cwd: string | null; target: string; arguments: string; - gdbpath: string; gdbargs: string[]; - cobcpath: string; - cobcargs: string[]; - env: any; + env: NodeJS.ProcessEnv; group: string[]; verbose: boolean; coverage: boolean; - docker: string; gdbtty: boolean; + useCobcrun: boolean; + sourceDirs: string[]; } -export interface AttachRequestArguments extends DebugProtocol.LaunchRequestArguments { - cwd: string; +export interface AttachRequestArguments extends DebugProtocol.AttachRequestArguments { + cwd: string | null; target: string; arguments: string; - gdbpath: string; gdbargs: string[]; - cobcpath: string; - cobcargs: string[]; - env: any; + env: NodeJS.ProcessEnv; group: string[]; verbose: boolean; pid: string; remoteDebugger: string; + sourceDirs: string[]; +} + +const settings = new DebuggerSettings(); + +function initLogLevel(verbose: boolean) { + if (verbose) { + log.setLevel(log.Level.Debug); + } else { + log.setLevel(log.Level.Info); + } } +enum VarCat { Local, Global }; + export class GDBDebugSession extends DebugSession { - protected variableHandles = new Handles(VAR_HANDLES_START); - protected variableHandlesReverse: { [id: string]: number } = {}; - protected useVarObjects: boolean; + protected variableHandles = new Handles<[string, VarCat]>(VAR_HANDLES_START); protected quit: boolean; protected needContinue: boolean; protected started: boolean; @@ -70,43 +83,43 @@ export class GDBDebugSession extends DebugSession { protected debugReady: boolean; protected miDebugger: MI2; coverageStatus: CoverageStatus; - private docker: string; - private showVariableDetails: boolean; - private settings = new DebuggerSettings(); + private showCoverage: boolean = true; + private readonly showDetails = settings.displayVariableAttributes; - protected initializeRequest(response: DebugProtocol.InitializeResponse, args: DebugProtocol.InitializeRequestArguments): void { + protected initializeRequest(response: DebugProtocol.InitializeResponse, _args: DebugProtocol.InitializeRequestArguments): void { response.body.supportsSetVariable = true; this.sendResponse(response); } protected launchRequest(response: DebugProtocol.LaunchResponse, args: LaunchRequestArguments): void { - if (!args.coverage) { - this.coverageStatus = undefined; - } - this.docker = args.docker; + initLogLevel(args.verbose); + + this.showCoverage = args.coverage; this.started = false; this.attached = false; - this.miDebugger = new MI2(args.gdbpath, args.gdbargs, args.cobcpath, args.cobcargs, args.env, args.verbose, args.noDebug, args.gdbtty); - this.miDebugger.on("launcherror", this.launchError.bind(this)); - this.miDebugger.on("quit", this.quitEvent.bind(this)); - this.miDebugger.on("exited-normally", this.quitEvent.bind(this)); - this.miDebugger.on("stopped", this.stopEvent.bind(this)); - this.miDebugger.on("msg", this.handleMsg.bind(this)); - this.miDebugger.on("breakpoint", this.handleBreakpoint.bind(this)); - this.miDebugger.on("step-end", this.handleBreak.bind(this)); - this.miDebugger.on("step-out-end", this.handleBreak.bind(this)); - this.miDebugger.on("step-other", this.handleBreak.bind(this)); - this.miDebugger.on("signal-stop", this.handlePause.bind(this)); - this.miDebugger.on("thread-created", this.threadCreatedEvent.bind(this)); - this.miDebugger.on("thread-exited", this.threadExitedEvent.bind(this)); + this.miDebugger = new MI2(settings.gdbPath, args.gdbargs, args.env, args.noDebug, args.gdbtty, settings.cobcrunPath, args.useCobcrun, args.sourceDirs); + this.miDebugger.on("launcherror", (err: Error) => this.launchError(err)); + this.miDebugger.on("quit", () => this.quitEvent()); + this.miDebugger.on("exited-normally", () => this.quitEvent()); + this.miDebugger.on("stopped", (info: MINode) => this.stopEvent(info)); + this.miDebugger.on("msg", (type: string, message: string) => this.handleMsg(type, message)); + this.miDebugger.on("breakpoint", (info: MINode) => this.handleBreakpoint(info)); + this.miDebugger.on("step-end", (info?: MINode) => this.handleBreak(info)); + this.miDebugger.on("step-out-end", (info?: MINode) => this.handleBreak(info)); + this.miDebugger.on("step-other", (info?: MINode) => this.handleBreak(info)); + this.miDebugger.on("signal-stop", (info: MINode) => this.handlePause(info)); + this.miDebugger.on("thread-created", (info: MINode) => this.threadCreatedEvent(info)); + this.miDebugger.on("thread-exited", (info: MINode) => this.threadExitedEvent(info)); this.sendEvent(new InitializedEvent()); this.quit = false; this.needContinue = false; this.crashed = false; this.debugReady = false; - this.useVarObjects = false; - this.miDebugger.load(args.cwd, args.target, args.arguments, args.group, args.gdbtty).then(() => { + // Run in the target executables' directory, unless specified; becomes '.' if target is a module name. + let cwd = args.cwd ?? path.dirname (args.target); + this.miDebugger.load(cwd, args.target, args.arguments, args.group, args.gdbtty).then( + /*onfulfilled:*/ () => { setTimeout(() => { this.miDebugger.emit("ui-break-done"); }, 50); @@ -115,44 +128,52 @@ export class GDBDebugSession extends DebugSession { this.started = true; if (this.crashed) this.handlePause(undefined); - }, err => { + }, (err: Error) => { this.sendErrorResponse(response, 100, `Failed to start MI Debugger: ${err.toString()}`); }); - }, err => { + }, + /*onrejected:*/ (err: Error) => { this.sendErrorResponse(response, 103, `Failed to load MI Debugger: ${err.toString()}`); }); } protected attachRequest(response: DebugProtocol.AttachResponse, args: AttachRequestArguments): void { + initLogLevel(args.verbose); + if (!args.pid && !args.remoteDebugger) { - this.sendErrorResponse(response, 100, `Failed to start MI Debugger: pid or remoteDebugger is mandatory`); + this.sendErrorResponse( + response, + 100, + `Failed to start MI Debugger: PID or remote-debugger argument required` + ); return; } - this.coverageStatus = undefined; + this.showCoverage = false; this.attached = true; this.started = false; - this.miDebugger = new MI2(args.gdbpath, args.gdbargs, args.cobcpath, args.cobcargs, args.env, args.verbose, false, false); - this.miDebugger.on("launcherror", this.launchError.bind(this)); - this.miDebugger.on("quit", this.quitEvent.bind(this)); - this.miDebugger.on("exited-normally", this.quitEvent.bind(this)); - this.miDebugger.on("stopped", this.stopEvent.bind(this)); - this.miDebugger.on("msg", this.handleMsg.bind(this)); - this.miDebugger.on("breakpoint", this.handleBreakpoint.bind(this)); - this.miDebugger.on("step-end", this.handleBreak.bind(this)); - this.miDebugger.on("step-out-end", this.handleBreak.bind(this)); - this.miDebugger.on("step-other", this.handleBreak.bind(this)); - this.miDebugger.on("signal-stop", this.handlePause.bind(this)); - this.miDebugger.on("thread-created", this.threadCreatedEvent.bind(this)); - this.miDebugger.on("thread-exited", this.threadExitedEvent.bind(this)); + this.miDebugger = new MI2(settings.gdbPath, args.gdbargs, args.env, false, false, "", false, args.sourceDirs); + this.miDebugger.on("launcherror", (err: Error) => this.launchError(err)); + this.miDebugger.on("quit", () => this.quitEvent()); + this.miDebugger.on("exited-normally", () => this.quitEvent()); + this.miDebugger.on("stopped", (info: MINode) => this.stopEvent(info)); + this.miDebugger.on("msg", (type: string, message: string) => this.handleMsg(type, message)); + this.miDebugger.on("breakpoint", (info: MINode) => this.handleBreakpoint(info)); + this.miDebugger.on("step-end", (info?: MINode) => this.handleBreak(info)); + this.miDebugger.on("step-out-end", (info?: MINode) => this.handleBreak(info)); + this.miDebugger.on("step-other", (info?: MINode) => this.handleBreak(info)); + this.miDebugger.on("signal-stop", (info: MINode) => this.handlePause(info)); + this.miDebugger.on("thread-created", (info: MINode) => this.threadCreatedEvent(info)); + this.miDebugger.on("thread-exited", (info: MINode) => this.threadExitedEvent(info)); this.sendEvent(new InitializedEvent()); this.quit = false; this.needContinue = true; this.crashed = false; this.debugReady = false; - this.useVarObjects = false; - this.miDebugger.attach(args.cwd, args.target, args.arguments, args.group).then(() => { + // Run in the target executables' directory, unless specificed. + let cwd = args.cwd ?? path.dirname (args.target); + this.miDebugger.attach(cwd, args.target, args.arguments, args.group).then(() => { setTimeout(() => { this.miDebugger.emit("ui-break-done"); }, 50); @@ -161,10 +182,10 @@ export class GDBDebugSession extends DebugSession { this.attached = true; if (this.crashed) this.handlePause(undefined); - }, err => { + }, (err: Error) => { this.sendErrorResponse(response, 100, `Failed to start MI Debugger: ${err.toString()}`); }); - }, err => { + }, (err: Error) => { this.sendErrorResponse(response, 103, `Failed to load MI Debugger: ${err.toString()}`); }); } @@ -178,20 +199,20 @@ export class GDBDebugSession extends DebugSession { } protected handleBreakpoint(info: MINode) { - const event = new StoppedEvent("breakpoint", parseInt(info.record("thread-id"))); - (event as DebugProtocol.StoppedEvent).body.allThreadsStopped = info.record("stopped-threads") == "all"; + const event = new StoppedEvent("breakpoint", parseInt(info.record("thread-id"))); + (event).body.allThreadsStopped = info.record("stopped-threads") == "all"; this.sendEvent(event); } protected handleBreak(info?: MINode) { - const event = new StoppedEvent("step", info ? parseInt(info.record("thread-id")) : 1); - (event as DebugProtocol.StoppedEvent).body.allThreadsStopped = info ? info.record("stopped-threads") == "all" : true; + const event = new StoppedEvent("step", info ? parseInt(info.record("thread-id")) : 1); + (event).body.allThreadsStopped = info ? info.record("stopped-threads") == "all" : true; this.sendEvent(event); } protected handlePause(info: MINode) { - const event = new StoppedEvent("user request", parseInt(info.record("thread-id"))); - (event as DebugProtocol.StoppedEvent).body.allThreadsStopped = info.record("stopped-threads") == "all"; + const event = new StoppedEvent("user request", parseInt(info.record("thread-id"))); + (event).body.allThreadsStopped = info.record("stopped-threads") == "all"; this.sendEvent(event); } @@ -199,39 +220,41 @@ export class GDBDebugSession extends DebugSession { if (!this.started) this.crashed = true; if (!this.quit) { - const event = new StoppedEvent("exception", parseInt(info.record("thread-id"))); - (event as DebugProtocol.StoppedEvent).body.allThreadsStopped = info.record("stopped-threads") == "all"; + const event = new StoppedEvent("exception", parseInt(info.record("thread-id"))); + (event).body.allThreadsStopped = info.record("stopped-threads") == "all"; this.sendEvent(event); } } protected threadCreatedEvent(info: MINode) { - this.sendEvent(new ThreadEvent("started", info.record("id"))); + this.sendEvent(new ThreadEvent("started", info.record("id"))); } protected threadExitedEvent(info: MINode) { - this.sendEvent(new ThreadEvent("exited", info.record("id"))); + this.sendEvent(new ThreadEvent("exited", info.record("id"))); } protected quitEvent() { if (this.quit) return; - if (this.coverageStatus !== undefined) { - this.coverageStatus.show(this.miDebugger.getGcovFiles(), this.miDebugger.getSourceMap(), this.docker); + if (this.showCoverage) { + this.coverageStatus.show(this.miDebugger.getGcovFiles(), this.miDebugger.sourceMap()).catch((err: Error) => console.log(err)); + } else { + this.coverageStatus.hide(); } this.quit = true; this.sendEvent(new TerminatedEvent()); } - protected launchError(err: any) { + protected launchError(err: Error) { this.handleMsg("stderr", "Could not start debugger process\n"); - this.handleMsg("stderr", err.toString() + "\n"); + this.handleMsg("stderr", err.toString() + "\n" + err.stack + "\n"); this.quitEvent(); } - protected disconnectRequest(response: DebugProtocol.DisconnectResponse, args: DebugProtocol.DisconnectArguments): void { + protected disconnectRequest(response: DebugProtocol.DisconnectResponse, _args: DebugProtocol.DisconnectArguments): void { if (this.attached) this.miDebugger.detach(); else @@ -239,38 +262,10 @@ export class GDBDebugSession extends DebugSession { this.sendResponse(response); } - protected async setVariableRequest(response: DebugProtocol.SetVariableResponse, args: DebugProtocol.SetVariableArguments): Promise { - try { - let id: number | string | VariableObject | ExtendedVariable; - if (args.variablesReference < VAR_HANDLES_START) { - id = args.variablesReference - STACK_HANDLES_START; - } else { - id = this.variableHandles.get(args.variablesReference); - } - - let name = args.name; - if (typeof id == "string") { - name = `${id}.${args.name}`; - if (this.showVariableDetails && args.name === "value") { - name = id; - } - } - if (!this.showVariableDetails || args.name === "value") { - await this.miDebugger.changeVariable(name, args.value); - response.body = { - value: args.value - }; - } - this.sendResponse(response); - } catch (err) { - this.sendErrorResponse(response, 11, `Could not continue: ${err}`); - } - } - protected setFunctionBreakPointsRequest(response: DebugProtocol.SetFunctionBreakpointsResponse, args: DebugProtocol.SetFunctionBreakpointsArguments): void { - const cb = (() => { + const cb = () => { this.debugReady = true; - const all = []; + const all: Thenable<[boolean, Breakpoint]>[] = []; args.breakpoints.forEach(brk => { all.push(this.miDebugger.addBreakPoint({ raw: brk.name, @@ -279,19 +274,19 @@ export class GDBDebugSession extends DebugSession { })); }); Promise.all(all).then(brkpoints => { - const finalBrks = []; + const finalBrks: DebugProtocol.Breakpoint[] = []; brkpoints.forEach(brkp => { if (brkp[0]) - finalBrks.push({line: brkp[1].line}); + finalBrks.push({line: brkp[1].line, verified: brkp[0]}); }); response.body = { breakpoints: finalBrks }; this.sendResponse(response); - }, msg => { + }, (msg: Error) => { this.sendErrorResponse(response, 10, msg.toString()); }); - }).bind(this); + }; if (this.debugReady) cb(); else @@ -299,7 +294,7 @@ export class GDBDebugSession extends DebugSession { } protected setBreakPointsRequest(response: DebugProtocol.SetBreakpointsResponse, args: DebugProtocol.SetBreakpointsArguments): void { - const cb = (() => { + const cb = () => { this.debugReady = true; this.miDebugger.clearBreakPoints().then(() => { const path = args.source.path; @@ -312,7 +307,7 @@ export class GDBDebugSession extends DebugSession { }); }); Promise.all(all).then(brkpoints => { - const finalBrks = []; + const finalBrks: DebugAdapter.Breakpoint[] = []; brkpoints.forEach(brkp => { if (brkp[0]) finalBrks.push(new DebugAdapter.Breakpoint(true, brkp[1].line)); @@ -321,13 +316,13 @@ export class GDBDebugSession extends DebugSession { breakpoints: finalBrks }; this.sendResponse(response); - }, msg => { + }, (msg: Error) => { this.sendErrorResponse(response, 9, msg.toString()); }); - }, msg => { + }, (msg: Error) => { this.sendErrorResponse(response, 9, msg.toString()); }); - }).bind(this); + }; if (this.debugReady) cb(); else @@ -352,9 +347,11 @@ export class GDBDebugSession extends DebugSession { if (threadName === undefined) { threadName = ""; } - response.body.threads.push(new Thread(thread.id, thread.id + ":" + threadName)); + response.body.threads.push(new Thread(thread.id, thread.id.toString() + ":" + threadName)); } this.sendResponse(response); + }, (err: Error) => { + this.sendErrorResponse(response, 13, `Could not get threads: ${err.toString()}`) }); } @@ -369,126 +366,151 @@ export class GDBDebugSession extends DebugSession { protected stackTraceRequest(response: DebugProtocol.StackTraceResponse, args: DebugProtocol.StackTraceArguments): void { this.miDebugger.getStack(args.levels, args.threadId).then(stack => { - const ret: StackFrame[] = []; - stack.forEach(element => { - let source = undefined; - const file = element.file; - if (file) { - source = new Source(element.fileName, file); - } - - ret.push(new StackFrame( + const ret = stack.map(element => { + const file = element.line.fileCobol; + const fileBasename = path.basename(file); + const cobolLine = element.line.cobolLine?.trim(); + const frameDescr = cobolLine + ? `${element.function} (${cobolLine})` + : `${element.function}`; + return new StackFrame( this.threadAndLevelToFrameId(args.threadId, element.level), - element.function + "@" + element.address, - source, - element.line, - 0)); + frameDescr, // + "@" + element.address, + file ? new Source(fileBasename, file) : undefined, + element.line.lineCobol, 0); }); response.body = { - stackFrames: ret + stackFrames: Array.from(ret) }; this.sendResponse(response); - }, err => { + }, (err: Error) => { this.sendErrorResponse(response, 12, `Failed to get Stack Trace: ${err.toString()}`); }); } - protected configurationDoneRequest(response: DebugProtocol.ConfigurationDoneResponse, args: DebugProtocol.ConfigurationDoneArguments): void { + protected configurationDoneRequest(response: DebugProtocol.ConfigurationDoneResponse, _args: DebugProtocol.ConfigurationDoneArguments): void { if (this.needContinue) { - this.miDebugger.continue().then(done => { + this.miDebugger.continue().then(_done => { this.sendResponse(response); - }, msg => { - this.sendErrorResponse(response, 2, `Could not continue: ${msg}`); + }, (msg: Error) => { + this.sendErrorResponse(response, 2, `Could not continue: ${msg.toString()}`); }); } else this.sendResponse(response); } - protected scopesRequest(response: DebugProtocol.ScopesResponse, args: DebugProtocol.ScopesArguments): void { - const scopes = new Array(); - scopes.push(new Scope("Local", STACK_HANDLES_START + (parseInt(args.frameId as any) || 0), false)); + // TODO: invalidate on some operations? + private globalVariables: Map> = new Map(); + + protected async scopesRequest(response: DebugProtocol.ScopesResponse, args: DebugProtocol.ScopesArguments) { + const scopes = [ + new Scope("Local", STACK_HANDLES_START + args.frameId, false) + ]; + const filesSymbols = await this.miDebugger.globalStorageSymbols(); + this.globalVariables.clear(); + await Promise.all(filesSymbols.flatMap(fileSymbols => { + if (fileSymbols.symbols.length > 0) { + const base = stripPathExtensions(fileSymbols.filename); + const scopeId = scopes.length; + const scopeVariables = localizeSymbols(fileSymbols).map(s => this.miDebugger.evalSymbol(s)); + this.globalVariables.set(scopeId, Promise.all(scopeVariables)); + scopes.push(new Scope(`Globals (${base})`, scopeId, false)); + return scopeVariables; + } else { + return []; + } + })); + response.body = { scopes: scopes }; + this.sendResponse(response); + } + + private debugProtocolVariable(dv: DebuggerVariable, varCat: VarCat) : DebugProtocol.Variable { + const reference = (this.showDetails || !!dv.children.size) + ? this.variableHandles.create([dv.cName, varCat]) + : 0; + const value = this.showDetails + ? `${dv.value || "null"} (${dv.displayableType})` + : dv.value || "null"; + return { + name: dv.cobolName, + evaluateName: dv.cobolName, + value: value, + type: dv.displayableType, + variablesReference: reference + }; + } + private async globalVariableRequest(response: DebugProtocol.VariablesResponse, scopeId: number): Promise { + const scopeVariables = await this.globalVariables.get(scopeId); response.body = { - scopes: scopes + variables: scopeVariables.map(v => this.debugProtocolVariable(v, VarCat.Global)) }; this.sendResponse(response); } - protected async variablesRequest(response: DebugProtocol.VariablesResponse, args: DebugProtocol.VariablesArguments): Promise { - this.showVariableDetails = this.settings.displayVariableAttributes; + private async stackVariableRequest(response: DebugProtocol.VariablesResponse, id: number) : Promise { + const [threadId, level] = this.frameIdToThreadAndLevel(id); + const stackVariables = await this.miDebugger.getStackVariables(threadId, level); + response.body = { + variables: (stackVariables ?? []).map(v => this.debugProtocolVariable(v, VarCat.Local)) + }; + this.sendResponse(response); + } - let id: number | string | VariableObject | ExtendedVariable; - if (args.variablesReference < VAR_HANDLES_START) { - id = args.variablesReference - STACK_HANDLES_START; + private lookupVariable (ref: number) : [string | number, VarCat] { + let id: number | string; + let cat: VarCat = VarCat.Local; + if (ref < VAR_HANDLES_START) { + if (ref >= STACK_HANDLES_START) { + cat = VarCat.Local; + id = ref - STACK_HANDLES_START; + } else { + cat = VarCat.Global; + id = ref; + } } else { - id = this.variableHandles.get(args.variablesReference); + [id, cat] = this.variableHandles.get(ref); } + return [id, cat]; + } - if (typeof id == "number") { - try { - const variables: DebugProtocol.Variable[] = []; - const [threadId, level] = this.frameIdToThreadAndLevel(id); - const stackVariables = await this.miDebugger.getStackVariables(threadId, level); - globalThis.varGlobal = []; - for (const stackVariable of stackVariables) { - let reference = 0; - if (this.showVariableDetails || !!stackVariable.children.size) { - reference = this.variableHandles.create(stackVariable.cobolName); - } - - let value = stackVariable.value || "null"; - if (this.showVariableDetails) { - value = stackVariable.displayableType; - } - - variables.push({ - name: stackVariable.cobolName, - evaluateName: stackVariable.cobolName, - value: value, - type: stackVariable.displayableType, - variablesReference: reference - }); - if(stackVariable.hasChildren){ - const child= stackVariable.children; - for (var childs of stackVariable.children.entries()) { - var key = childs[0]; - globalThis.varGlobal.push({ - "children": key, - "father": stackVariable.cobolName - }) - } - } + protected async variablesRequest(response: DebugProtocol.VariablesResponse, args: DebugProtocol.VariablesArguments): Promise { + const [id, cat] = this.lookupVariable(args.variablesReference); + response.body = { variables: [] }; + try { + if (typeof id == "number") { + if (cat == VarCat.Local) { + this.stackVariableRequest(response, id); + } else { + this.globalVariableRequest(response, id); } - - response.body = { - variables: variables - }; - this.sendResponse(response); - } catch (err) { - this.sendErrorResponse(response, 1, `Could not expand variable: ${err}`); - } - } else if (typeof id == "string") { - try { + } else if (typeof id == "string") { // TODO: this evals on an (effectively) unknown thread for multithreaded programs. - const stackVariable = await this.miDebugger.evalCobField(id, 0, 0); + const v = (cat == VarCat.Local) + ? await this.miDebugger.evalCVariable(id) + : await this.miDebugger.evalCGlobal(id); + if (v === undefined) { + this.sendResponse(response); // fail early and silently + } let variables: DebugProtocol.Variable[] = []; - if (this.showVariableDetails) { - variables = stackVariable.toDebugProtocolVariable(this.showVariableDetails); + if (this.showDetails) { + variables = v.toDebugProtocolVariable(this.showDetails); } - for (const child of stackVariable.children.values()) { - const childId = `${id}.${child.cobolName}`; + for (const child of v.children.values()) { let reference = 0; - if (this.showVariableDetails || !!child.children.size) { - reference = this.variableHandles.create(childId); + if (this.showDetails || !!child.children.size) { + reference = this.variableHandles.create([`${child.cName}`, cat]); } let value = child.displayableType; - if (!this.showVariableDetails) { - const evaluatedChild = await this.miDebugger.evalCobField(childId, 0, 0); - value = evaluatedChild.value || "null"; + if (!this.showDetails) { + const evaluatedChild = (cat == VarCat.Local) + ? await this.miDebugger.evalCVariable(child.cName) + : await this.miDebugger.evalCGlobal(child.cName); + value = evaluatedChild !== undefined ? (evaluatedChild.value || "null") : "?"; } variables.push({ @@ -503,54 +525,92 @@ export class GDBDebugSession extends DebugSession { variables: variables }; this.sendResponse(response); - } catch (err) { - this.sendErrorResponse(response, 1, `Could not expand variable: ${err}`); + } else { + this.sendResponse(response); + } + } catch (err) { + this.sendErrorResponse(response, 1, `Could not expand variable: ${(err).toString()}`); + } + } + + protected async setVariableRequest(response: DebugProtocol.SetVariableResponse, args: DebugProtocol.SetVariableArguments): Promise { + const [id, cat] = this.lookupVariable(args.variablesReference); + let invalidatedAreas = []; + if (this.showDetails && args.name !== "value") { + this.sendErrorResponse(response, 14, `${args.name} cannot be changed`); + return; + } + const editDetails = this.showDetails && args.name === "value"; + // log.debug("setVartiableRequest", args.name, args.value, args.variablesReference.toString(), id.toString()); + try { + if (cat == VarCat.Local) { + invalidatedAreas = editDetails && typeof id == "string" + ? await this.miDebugger.changeCVariable(id.toString(), args.value) + : await this.miDebugger.changeVariable(args.name, args.value); + response.body = { value: args.value }; + } else if (cat == VarCat.Global) { + let cName: string = null; + if (typeof id == "number") { + // TODO: can we be editing "value" details (ie. can showDetails hold here)? + const vars = await this.globalVariables.get(id); + cName = vars.find(v => v.cobolName == args.name)?.cName; // TODO: check ambiguous item names? + } else if (typeof id == "string" && !editDetails) { + cName = this.miDebugger.lookupGlobalCobolByCName(args.name, id)?.cName; + } else if (typeof id == "string") { + cName = id; + } + if (cName !== null) { + invalidatedAreas = await this.miDebugger.changeGlobalCVariable(cName, args.value); + response.body = { value: args.value }; + } + } + if (invalidatedAreas.length > 0) { + // Trigger an update of invalidated areas. + this.sendEvent(new DebugAdapter.InvalidatedEvent(invalidatedAreas)); } - } else { - response.body = { - variables: [] - }; this.sendResponse(response); + } catch (err) { + this.sendErrorResponse(response, 11, `Could not set ${args.name}: ${err}`); } } - protected pauseRequest(response: DebugProtocol.ContinueResponse, args: DebugProtocol.ContinueArguments): void { - this.miDebugger.interrupt().then(done => { + protected pauseRequest(response: DebugProtocol.ContinueResponse, _args: DebugProtocol.ContinueArguments): void { + this.miDebugger.interrupt().then(_done => { this.sendResponse(response); - }, msg => { - this.sendErrorResponse(response, 3, `Could not pause: ${msg}`); + }, (msg: Error) => { + this.sendErrorResponse(response, 3, `Could not pause: ${msg.toString()}`); }); } - protected continueRequest(response: DebugProtocol.ContinueResponse, args: DebugProtocol.ContinueArguments): void { - this.miDebugger.continue().then(done => { + protected continueRequest(response: DebugProtocol.ContinueResponse, _args: DebugProtocol.ContinueArguments): void { + this.miDebugger.continue().then(_done => { this.sendResponse(response); - }, msg => { - this.sendErrorResponse(response, 2, `Could not continue: ${msg}`); + }, (msg: Error) => { + this.sendErrorResponse(response, 2, `Could not continue: ${msg.toString()}`); }); } - protected stepInRequest(response: DebugProtocol.NextResponse, args: DebugProtocol.NextArguments): void { - this.miDebugger.stepInto().then(done => { + protected stepInRequest(response: DebugProtocol.NextResponse, _args: DebugProtocol.NextArguments): void { + this.miDebugger.stepInto().then(_done => { this.sendResponse(response); - }, msg => { - this.sendErrorResponse(response, 4, `Could not step in: ${msg}`); + }, (msg: Error) => { + this.sendErrorResponse(response, 4, `Could not step in: ${msg.toString()}`); }); } - protected stepOutRequest(response: DebugProtocol.NextResponse, args: DebugProtocol.NextArguments): void { - this.miDebugger.stepOut().then(done => { + protected stepOutRequest(response: DebugProtocol.NextResponse, _args: DebugProtocol.NextArguments): void { + this.miDebugger.stepOut().then(_done => { this.sendResponse(response); - }, msg => { - this.sendErrorResponse(response, 5, `Could not step out: ${msg}`); + }, (msg: Error) => { + this.sendErrorResponse(response, 5, `Could not step out: ${msg.toString()}`); }); } - protected nextRequest(response: DebugProtocol.NextResponse, args: DebugProtocol.NextArguments): void { - this.miDebugger.stepOver().then(done => { + protected nextRequest(response: DebugProtocol.NextResponse, _args: DebugProtocol.NextArguments): void { + this.miDebugger.stepOver().then(_done => { this.sendResponse(response); - }, msg => { - this.sendErrorResponse(response, 6, `Could not step over: ${msg}`); + }, (msg: Error) => { + this.sendErrorResponse(response, 6, `Could not step over: ${msg.toString()}`); }); } @@ -560,10 +620,11 @@ export class GDBDebugSession extends DebugSession { this.miDebugger.evalExpression(args.expression, threadId, level).then((res) => { response.body = { variablesReference: 0, - result: !!res ? res : "not available" + presentationHint: { kind: 'data' }, + result: res ?? "not available" }; this.sendResponse(response); - }, msg => { + }, (msg: Error) => { this.sendErrorResponse(response, 7, msg.toString()); }); } else { @@ -576,17 +637,18 @@ export class GDBDebugSession extends DebugSession { else response.body = { result: JSON.stringify(output), + // presentationHint: { kind: 'data' }, variablesReference: 0 }; this.sendResponse(response); - }, msg => { + }, (msg: Error) => { this.sendErrorResponse(response, 8, msg.toString()); }); } } protected gotoTargetsRequest(response: DebugProtocol.GotoTargetsResponse, args: DebugProtocol.GotoTargetsArguments): void { - this.miDebugger.goto(args.source.path, args.line).then(done => { + this.miDebugger.goto(args.source.path, args.line).then(_done => { response.body = { targets: [{ id: 1, @@ -596,12 +658,12 @@ export class GDBDebugSession extends DebugSession { }] }; this.sendResponse(response); - }, msg => { - this.sendErrorResponse(response, 16, `Could not jump: ${msg}`); + }, (msg: Error) => { + this.sendErrorResponse(response, 16, `Could not jump: ${msg.toString()}`); }); } - protected gotoRequest(response: DebugProtocol.GotoResponse, args: DebugProtocol.GotoArguments): void { + protected gotoRequest(response: DebugProtocol.GotoResponse, _args: DebugProtocol.GotoArguments): void { this.sendResponse(response); } } diff --git a/src/log.ts b/src/log.ts new file mode 100644 index 0000000..d5ba1e8 --- /dev/null +++ b/src/log.ts @@ -0,0 +1,33 @@ +import * as vscode from "vscode"; + +export enum Level { Debug, Info }; +export let level = Level.Info; +export function setLevel (l: Level): void { + level = l; +} + +const channel = vscode.window.createOutputChannel("SuperBOL Debugger"); + +export function emit(...msg: (string | (() => (string | string[])))[]) { + channel.appendLine(msg.flatMap(f => { + if (typeof (f) == "string") { + return [f]; + } else { + const r = f(); + return (typeof (r) == "string") ? [r] : r; + } + }).join(' ')); +} + +export const info = emit; + +export function debug(...msg: (string | (() => (string | string[])))[]) { + if (level == Level.Debug) { + emit(...msg); + } +} + +export function error(...msg) { + emit(...msg); + channel.show(); +} diff --git a/src/mi2-decoder.ts b/src/mi2-decoder.ts new file mode 100644 index 0000000..aa764a2 --- /dev/null +++ b/src/mi2-decoder.ts @@ -0,0 +1,19 @@ +import * as Debugger from './debugger'; +import {MINode} from './parser.mi2'; + +export function decodeFileSymbols(node: MINode): Debugger.FileSymbols { + return { + filename: MINode.valueOf(node, "filename"), + fullname: MINode.valueOf(node, "fullname"), + symbols: MINode.valueOf(node, "symbols").map(decodeSymbol), + } +} + +export function decodeSymbol(node: MINode): Debugger.Symbol { + return { + line: parseInt(MINode.valueOf(node, "line")), + name: MINode.valueOf(node, "name"), + type: MINode.valueOf(node, "type"), + description: MINode.valueOf(node, "description"), + } +} \ No newline at end of file diff --git a/src/mi2.ts b/src/mi2.ts index a932f0b..b15d043 100644 --- a/src/mi2.ts +++ b/src/mi2.ts @@ -1,46 +1,20 @@ -import { Breakpoint, IDebugger, MIError, Stack, Thread, DebuggerVariable } from "./debugger"; +import { Breakpoint, IDebugger, MIError, Stack, Thread, DebuggerVariable, FileSymbols, LocalizedSymbol } from "./debugger"; import * as ChildProcess from "child_process"; import { EventEmitter } from "events"; import { MINode, parseMI } from './parser.mi2'; -import * as nativePathFromPath from "path"; +import * as MI2Decoder from './mi2-decoder'; +import * as path from "path"; import * as fs from "fs"; import { SourceMap } from "./parser.c"; import { parseExpression, cleanRawValue } from "./functions"; import * as vscode from 'vscode'; +import {DebugProtocol} from '@vscode/debugprotocol'; +import * as log from './log'; -const nativePath = { - resolve: function (...args: string[]): string { - const nat = nativePathFromPath.resolve(...args); - if (process.platform === "win32" && this.cobcpath === "docker" && this.gdbpath === "docker") { - return nat.replace(/.*:/, s => "/" + s.toLowerCase().replace(":", "")).replace(/\\/g, "/"); - } - return nat; - }, - dirname: function (path: string): string { - const nat = nativePathFromPath.dirname(path); - if (process.platform === "win32" && this.cobcpath === "docker" && this.gdbpath === "docker") { - return nat.replace(/.*:/, s => "/" + s.toLowerCase().replace(":", "")).replace(/\\/g, "/"); - } - return nat; - }, - basename: function (path: string): string { - return nativePathFromPath.basename(path); - }, - isAbsolute: function (path: string): boolean { - return nativePathFromPath.isAbsolute(path); - }, - join: function (...args: string[]) { - return nativePathFromPath.join(...args); - }, - normalize: function (path: string) { - return nativePathFromPath.normalize(path); - } -}; - -const nonOutput = /(^(?:\d*|undefined)[\*\+\-\=\~\@\&\^])([^\*\+\-\=\~\@\&\^]{1,})/; +const nonOutput = /(^(?:\d*|undefined)[*+\-=~@&^])([^*+\-=~@&]+[a-zA-Z]+)/; const gdbRegex = /(?:\d*|undefined)\(gdb\)/; const numRegex = /\d+/; -const gcovRegex = /\"([0-9a-z_\-\/\s\\:]+\.o)\"/gi; +const gcovRegex = /"([0-9a-z_\-/\s\\:]+\.o)"/gi; let NEXT_TERM_ID = 1; // 002 - stepOver in routines with "perform" let subroutine = -1; @@ -54,123 +28,54 @@ export function couldBeOutput(line: string) { return !nonOutput.exec(line); } +enum failure_handling { Report_n_reject, Suppress, Silence } + export class MI2 extends EventEmitter implements IDebugger { private map: SourceMap; private gcovFiles: Set = new Set(); - public procEnv: any; - private currentToken: number = 1; - private handlers: { [index: number]: (info: MINode) => any } = {}; - private breakpoints: Map = new Map(); + public procEnv: NodeJS.ProcessEnv; + private currentToken = 1; + private handlers: { [index: number]: (_: MINode) => unknown } = {}; + private breakpoints: Map = new Map(); + private ignoredBreakpoints: Set = new Set(); private buffer: string; private errbuf: string; private process: ChildProcess.ChildProcess; - private lastStepCommand: Function; - private hasCobGetFieldStringFunction: boolean = true; - private hasCobPutFieldStringFunction: boolean = true; + private lastStepCommand: () => Thenable; + private hasCobGetFieldStringFunction = true; + private hasCobPutFieldStringFunction = true; - constructor(public gdbpath: string, public gdbArgs: string[], public cobcpath: string, public cobcArgs: string[], procEnv: any, public verbose: boolean, public noDebug: boolean, public gdbtty: boolean) { + constructor(public gdbpath: string, public gdbArgs: string[], procEnv: NodeJS.ProcessEnv, public noDebug: boolean, public gdbtty: boolean, public cobcrunPath: string, public useCobcrun: boolean, public sourceDirs: string[]) { super(); if (procEnv) { - const env = {}; - // Duplicate process.env so we don't override it - for (const key in process.env) - if (process.env.hasOwnProperty(key)) { - env[key] = process.env[key]; - } - // Overwrite with user specified variables - for (const key in procEnv) { - if (procEnv.hasOwnProperty(key)) { - if (procEnv === null) { - delete env[key]; - } else { - env[key] = procEnv[key]; - } - } - } - this.procEnv = env; + this.procEnv = {...process.env, ...procEnv}; } } - load(cwd: string, target: string, targetargs: string, group: string[], gdbtty: boolean): Thenable { - if (!nativePath.isAbsolute(target) || (this.cobcpath === "docker" && this.gdbpath === "docker")) { - target = nativePath.resolve(cwd, target); - } - group.forEach(e => { - e = nativePath.join(cwd, e); - }); - - return new Promise((resolve, reject) => { + load(cwd: string, target: string, targetargs: string, group: string[], gdbtty: boolean): Thenable { + return new Promise(async (resolve, reject) => { if (!fs.existsSync(cwd)) { reject(new Error("cwd does not exist.")); } - if (!!this.noDebug && !gdbtty) { - const args = this.cobcArgs - .concat([target]) - .concat(group) - .concat(['-job=' + targetargs]); - this.process = ChildProcess.spawn(this.cobcpath, args, { cwd: cwd, env: this.procEnv }); - this.process.stderr.on("data", ((data) => { - this.log("stderr", data); - }).bind(this)); - this.process.stdout.on("data", ((data) => { - this.log("stdout", data); - }).bind(this)); - this.process.on("exit", (() => { - this.emit("quit"); - }).bind(this)); - return; - } - - const args = this.cobcArgs.concat([ - '-g', - '-fsource-location', - '-ftraceall', - '-Q', - '--coverage', - '-A', - '--coverage', - '-v', - target - ]).concat(group); - const buildProcess = ChildProcess.spawn(this.cobcpath, args, { cwd: cwd, env: this.procEnv }); - buildProcess.stderr.on('data', (data) => { - if (this.verbose) - this.log("stderr", data); - let match; - do { - match = gcovRegex.exec(data); - if (match) { - this.gcovFiles.add(match[1].split('.').slice(0, -1).join('.')); - } - } while (match); - }); - buildProcess.on('exit', async (code) => { - if (code !== 0) { - this.emit("quit"); - return; - } - - if (this.verbose) { - this.log("stderr", `COBOL file ${target} compiled with exit code: ${code}`); - } - + let target_no_ext = target.split('.').slice(0, -1).join('.'); + this.gcovFiles.add(target_no_ext); try { - this.map = new SourceMap(cwd, [target].concat(group)); + this.map = new SourceMap(cwd, [target].concat(group), this.sourceDirs); } catch (e) { - this.log('stderr', e); + log.error((e).toString()); } - if (this.verbose) { - this.log("stderr", this.map.toString()); - } + log.debug(() => this.map.toString("created")); - target = nativePath.resolve(cwd, nativePath.basename(target)); - target = target.split('.').slice(0, -1).join('.'); - // FIXME: the following should prefix "cobcrun.exe" if in "module mode", see #13 - // FIXME: if we need this code twice then add a comment why, otherwise move to a new function - if (process.platform === "win32" && this.cobcpath !== "docker" && this.gdbpath !== "docker") { - target = target + '.exe'; + if (!this.useCobcrun) { + target = path.resolve(cwd, path.basename(target)); + target = target.split('.').slice(0, -1).join('.'); + // FIXME: the following should prefix "cobcrun.exe" if in "module mode", see #13 + // FIXME: if we need this code twice then add a comment why, otherwise move to a new function + if (process.platform === "win32") { + target = target + '.exe'; + } } // 001-gdbtty - Extension for debugging on a separate tty using xterm - start @@ -181,75 +86,42 @@ export class MI2 extends EventEmitter implements IDebugger { // 001-gdbtty-End this.process = ChildProcess.spawn(this.gdbpath, this.gdbArgs, { cwd: cwd, env: this.procEnv }); - this.process.stdout.on("data", this.stdout.bind(this)); - this.process.stderr.on("data", ((data) => { - this.log("stderr", data); - }).bind(this)); - this.process.on("exit", (() => { - this.emit("quit"); - }).bind(this)); - this.process.on("error", ((err) => { - this.emit("launcherror", err); - }).bind(this)); - const promises = this.initCommands(target, targetargs, cwd); + this.process.stdout.on("data", (data: string) => this.stdout(data)); + this.process.stderr.on("data", (data: string) => this.stderr(data)); + this.process.on("exit", (() => { this.emit("quit"); })); + this.process.on("error", (err) => { this.emit("launcherror", err); }); + const promises = this.initCommands(target, targetargs, cwd, this.useCobcrun); // 001-gdbtty - additional parameters for gdb for (let item of gdbttyParameters) - promises.push(this.sendCommand("gdb-set " + item, false)); + promises.push(this.sendCommand("gdb-set " + item)); //001 Promise.all(promises).then(() => { this.emit("debug-ready"); resolve(true); }, reject); - }); + }); } - attach(cwd: string, target: string, targetargs: string, group: string[]): Thenable { - if (!nativePath.isAbsolute(target)) { - target = nativePath.join(cwd, target); + attach(cwd: string, target: string, targetargs: string, group: string[]): Thenable { + if (!path.isAbsolute(target)) { + target = path.join(cwd, target); } - group.forEach(e => { - e = nativePath.join(cwd, e); - }); return new Promise((resolve, reject) => { if (!fs.existsSync(cwd)) { reject(new Error("cwd does not exist.")); } - const args = this.cobcArgs.concat([ - '-g', - '-fsource-location', - '-ftraceall', - '-v', - target - ]).concat(group); - const buildProcess = ChildProcess.spawn(this.cobcpath, args, { cwd: cwd, env: this.procEnv }); - buildProcess.stderr.on('data', (data) => { - if (this.verbose) - this.log("stderr", data); - }); - buildProcess.on('exit', (code) => { - if (code !== 0) { - this.emit("quit"); - return; - } - - if (this.verbose) { - this.log("stderr", `COBOL file ${target} compiled with exit code: ${code}`); - } - try { - this.map = new SourceMap(cwd, [target].concat(group)); + this.map = new SourceMap(cwd, [target].concat(group), this.sourceDirs); } catch (e) { - this.log('stderr', e); + log.error((e).toString()); } - if (this.verbose) { - this.log("stderr", this.map.toString()); - } + log.debug(() => this.map.toString("created")); - target = nativePath.resolve(cwd, nativePath.basename(target)); + target = path.resolve(cwd, path.basename(target)); target = target.split('.').slice(0, -1).join('.'); // FIXME: the following should prefix "cobcrun.exe" if in "module mode", see #13 if (process.platform === "win32") { @@ -257,57 +129,54 @@ export class MI2 extends EventEmitter implements IDebugger { } this.process = ChildProcess.spawn(this.gdbpath, this.gdbArgs, { cwd: cwd, env: this.procEnv }); - this.process.stdout.on("data", this.stdout.bind(this)); - this.process.stderr.on("data", ((data) => { - this.log("stderr", data); - }).bind(this)); - this.process.on("exit", (() => { - this.emit("quit"); - }).bind(this)); - this.process.on("error", ((err) => { - this.emit("launcherror", err); - }).bind(this)); - const promises = this.initCommands(target, targetargs, cwd); + this.process.stdout.on("data", (data: string) => this.stdout(data)); + this.process.stderr.on("data", (data: string) => this.stderr(data)); + this.process.on("exit", () => { this.emit("quit"); }); + this.process.on("error", (err) => { this.emit("launcherror", err); }); + const promises = this.initCommands(target, targetargs, cwd, false); Promise.all(promises).then(() => { this.emit("debug-ready"); resolve(true); }, reject); - }); + }); } - protected initCommands(target: string, targetargs: string, cwd: string) { - if (!nativePath.isAbsolute(target)) { - target = nativePath.join(cwd, target); + protected initCommands(target: string, targetargs: string, cwd: string, useCobcrun: boolean) { + if (!path.isAbsolute(target)) { + target = path.join(cwd, target); } if (process.platform === "win32") { - cwd = nativePath.dirname(target); + cwd = path.dirname(target); + } + + let targetExec = escape(target); + if (useCobcrun) { + targetargs = `-m ${targetExec} ${targetargs}` + targetExec = this.cobcrunPath; } const cmds = [ - this.sendCommand("gdb-set target-async on", false), - this.sendCommand("gdb-set print repeats 1000", false), - this.sendCommand("gdb-set args " + targetargs, false), - this.sendCommand("gdb-set charset UTF-8", false), - this.sendCommand("environment-directory \"" + escape(cwd) + "\"", false), - this.sendCommand("file-exec-and-symbols \"" + escape(target) + "\"", false), + this.sendCommand("gdb-set mi-async on"), + this.sendCommand("gdb-set print repeats 1000"), + this.sendCommand("gdb-set args " + targetargs), + this.sendCommand("gdb-set charset UTF-8"), + this.sendCommand("environment-directory \"" + escape(cwd) + "\""), + this.sendCommand("file-exec-and-symbols \"" + targetExec + "\""), + this.sendCommand("gdb-set stop-on-solib-events 1"), + this.sendCommand("gdb-set directories \"" + this.map.sourceDirs.join('" "') + "\"") ]; + return cmds; } - stdout(data) { - if (this.verbose) { - this.log("stderr", "stdout: " + data); - } - if (typeof data == "string") { - this.buffer += data; - } else { - this.buffer += data.toString("utf8"); - } + stdout(data: string) { + log.debug("stdout: " + data); + this.buffer += data; const end = this.buffer.lastIndexOf('\n'); if (end != -1) { - this.onOutput(this.buffer.substr(0, end)); - this.buffer = this.buffer.substr(end + 1); + this.onOutput(this.buffer.substring(0, end)); + this.buffer = this.buffer.substring(end + 1); } if (this.buffer.length) { if (this.onOutputPartial(this.buffer)) { @@ -316,19 +185,13 @@ export class MI2 extends EventEmitter implements IDebugger { } } - stderr(data) { - if (this.verbose) { - this.log("stderr", "stderr: " + data); - } - if (typeof data == "string") { - this.errbuf += data; - } else { - this.errbuf += data.toString("utf8"); - } + stderr(data: string) { + log.debug("stderr: " + data); + this.errbuf += data; const end = this.errbuf.lastIndexOf('\n'); if (end != -1) { - this.onOutputStderr(this.errbuf.substr(0, end)); - this.errbuf = this.errbuf.substr(end + 1); + this.onOutputStderr(this.errbuf.substring(0, end)); + this.errbuf = this.errbuf.substring(end + 1); } if (this.errbuf.length) { this.logNoNewLine("stderr", this.errbuf); @@ -336,23 +199,21 @@ export class MI2 extends EventEmitter implements IDebugger { } } - stdin(data: string, cb?: any) { + stdin(data: string, cb?: (_err: Error) => void) { if (this.isReady()) { - if (this.verbose) { - this.log("stderr", "stdin: " + data); - } + log.debug("stdin: " + data); this.process.stdin.write(data + "\n", cb); } } - onOutputStderr(lines) { - lines = lines.split('\n'); - lines.forEach(line => { + onOutputStderr(lines: string) { + const linesArr = lines.split('\n'); + linesArr.forEach(line => { this.log("stderr", line); }); } - onOutputPartial(line) { + onOutputPartial(line: string) { if (couldBeOutput(line)) { this.logNoNewLine("stdout", line); return true; @@ -360,118 +221,147 @@ export class MI2 extends EventEmitter implements IDebugger { return false; } - onOutput(linesStr: string) { - const lines = linesStr.split('\n'); + private onOutput(linesStr: string) { + const lines = linesStr.split('\n'); lines.forEach(line => { if (couldBeOutput(line)) { if (!gdbRegex.exec(line)) { this.log("stdout", line); } } else { - const parsed = parseMI(line); - if (this.verbose) { - this.log("stderr", "GDB -> App: " + JSON.stringify(parsed)); - } - let handled = false; - if (parsed.token !== undefined) { - if (this.handlers[parsed.token]) { - this.handlers[parsed.token](parsed); - delete this.handlers[parsed.token]; - handled = true; - } - } - if (!handled && parsed.resultRecords && parsed.resultRecords.resultClass == "error") { - this.log("stderr", parsed.result("msg") || line); - } - if (parsed.outOfBandRecord) { - parsed.outOfBandRecord.forEach(async record => { - if (record.isStream) { - this.log(record.type, record.content); - } else { - if (record.type == "exec") { - this.emit("exec-async-output", parsed); - // 002 - stepOver in routines with "perform" - subroutine = this.map.hasLineSubroutine(parsed.record('frame.fullname'), parseInt(parsed.record('frame.line'))); - // 002 - if (record.asyncClass == "running") { - this.emit("running", parsed); - } else if (record.asyncClass == "stopped") { - const reason = parsed.record("reason"); - if (this.verbose) { - this.log("stderr", "stop: " + reason); - } - if (reason == "breakpoint-hit") { - if (!this.map.hasLineCobol(parsed.record('frame.fullname'), parseInt(parsed.record('frame.line')))) { - if(this.lastStepCommand==this.continue && parsed.record("disp")=="del") - this.lastStepCommand(); - else - this.stepOver(); // 002 - stepInto/stepOut in routines with "perform" - } else { - this.emit("step-end", parsed); - } - } else if (reason == "location-reached") { // 002 - stepOver in routines with "perform" - if (!this.map.hasLineCobol(parsed.record('frame.fullname'), parseInt(parsed.record('frame.line')))) { - this.stepOver(); - } else { - this.emit("step-end", parsed); - } - } else if (reason == "end-stepping-range") { - if (!this.map.hasLineCobol(parsed.record('frame.fullname'), parseInt(parsed.record('frame.line')))) { - this.lastStepCommand(); - } else { - this.emit("step-end", parsed); - } - } else if (reason == "function-finished") { - if (!this.map.hasLineCobol(parsed.record('frame.fullname'), parseInt(parsed.record('frame.line')))) { - this.lastStepCommand(); - } else { - this.emit("step-out-end", parsed); - } - } else if (reason == "signal-received") { - this.emit("signal-stop", parsed); - } else if (reason == "exited-normally") { - this.emit("exited-normally", parsed); - } else if (reason == "exited") { // exit with error code != 0 - if (this.verbose) { - this.log("stderr", "Program exited with code " + parsed.record("exit-code")); - } - this.emit("quit", parsed); - } else { - if (!this.map.hasLineCobol(parsed.record('frame.fullname'), parseInt(parsed.record('frame.line')))) { - this.continue(); - } else { - if (this.verbose) { - this.log("stderr", "Not implemented stop reason (assuming exception): " + reason); - } - this.emit("stopped", parsed); - } - } + this.onMINode(parseMI(line)); + } + }); + } + + private onMINode(parsed: MINode) { + let handled = false; + if (parsed && parsed.token !== undefined) { + if (this.handlers[parsed.token]) { + this.handlers[parsed.token](parsed); + delete this.handlers[parsed.token]; + handled = true; + } + } + if (!handled && parsed.resultRecords && parsed.resultRecords.resultClass == "error") { + this.log("stderr", parsed.result("msg")); + } + if (parsed.outOfBandRecord) { + parsed.outOfBandRecord.forEach(async record => { + if (record.isStream) { + this.log(record.type, record.content); + } else { + if (record.type == "exec") { + this.emit("exec-async-output", parsed); + // 002 - stepOver in routines with "perform" + subroutine = this.map.hasLineSubroutine(parsed.record('frame.fullname'), parseInt(parsed.record('frame.line'))); + // 002 + if (record.asyncClass == "running") { + this.emit("running", parsed); + } else if (record.asyncClass == "stopped") { + const reason = parsed.record("reason"); + log.debug("stop:", reason); + if (reason == "breakpoint-hit") { + if (!this.map.hasLineCobol(parsed.record('frame.fullname'), parseInt(parsed.record('frame.line')))) { + if (this.lastStepCommand == this.continue && parsed.record("disp") == "del") + void this.lastStepCommand(); + else + this.stepOver(); // 002 - stepInto/stepOut in routines with "perform" + } else { + this.emit("step-end", parsed); + } + } else if (reason == "location-reached") { // 002 - stepOver in routines with "perform" + if (!this.map.hasLineCobol(parsed.record('frame.fullname'), parseInt(parsed.record('frame.line')))) { + this.stepOver(); + } else { + this.emit("step-end", parsed); + } + } else if (reason == "end-stepping-range") { + if (!this.map.hasLineCobol(parsed.record('frame.fullname'), parseInt(parsed.record('frame.line')))) { + void this.lastStepCommand().then(); + } else { + this.emit("step-end", parsed); + } + } else if (reason == "function-finished") { + if (!this.map.hasLineCobol(parsed.record('frame.fullname'), parseInt(parsed.record('frame.line')))) { + void this.lastStepCommand(); } else { - if (this.verbose) { - this.log("stderr", JSON.stringify(parsed)); - } + this.emit("step-out-end", parsed); } - } else if (record.type == "notify") { - if (record.asyncClass == "thread-created") { - this.emit("thread-created", parsed); - } else if (record.asyncClass == "thread-exited") { - this.emit("thread-exited", parsed); + } else if (reason == "signal-received") { + this.emit("signal-stop", parsed); + } else if (reason == "exited-normally") { + this.emit("exited-normally", parsed); + } else if (reason == "exited") { // exit with error code != 0 + log.info("Program exited with code " + parsed.record("exit-code")); + this.emit("quit", parsed); + } else if (reason == "solib-event") { + this.onSolibEvent(parsed); + this.resume(); + } else { + if (!this.map.hasLineCobol(parsed.record('frame.fullname'), parseInt(parsed.record('frame.line')))) { + void this.continue(); + } else { + log.error("Not implemented stop reason (assuming exception):", reason); + this.emit("stopped", parsed); } } + } else { + log.debug(() => JSON.stringify(parsed)); + } + } else if (record.type == "notify") { + if (record.asyncClass == "thread-created") { + this.emit("thread-created", parsed); + } else if (record.asyncClass == "thread-exited") { + this.emit("thread-exited", parsed); + } else if (record.asyncClass == "library-loaded") { + // Possibly unreachable if `stop-on-solib-events` is on; still handle in case. + let libname = record.output.find((e) => e[0] == "target-name")?.[1]; + if (this.map.addLib(libname)) { + log.debug(() => `Added library to map: ${libname}`); + log.debug(() => this.map.toString("updated")); + this.reloadBreakPoints(); + } + } else if (record.asyncClass == "library-unloaded") { + // Ditto: possibly unreachable if `stop-on-solib-events` is on; still handle in case. + let libname = record.output.find((e) => e[0] == "target-name")?.[1]; + if (this.map.remLib(libname)) { + log.debug(() => this.map.toString("updated")); + this.reloadBreakPoints(); + } + } else { + log.debug(() => JSON.stringify(parsed)); } - }); - handled = true; - } - if (parsed.token == undefined && parsed.resultRecords == undefined && parsed.outOfBandRecord.length == 0) { - handled = true; - } - if (!handled) { - if (this.verbose) { - this.log("stderr", "Unhandled: " + JSON.stringify(parsed)); } } - } - }); + }); + handled = true; + } + if (parsed.token == undefined && parsed.resultRecords == undefined && parsed.outOfBandRecord.length == 0) { + handled = true; + } + if (!handled) { + log.error("Unhandled: " + JSON.stringify(parsed)); + } + } + + private onSolibEvent(node: MINode): void { + const added: [string, any][] = node.record("added") ?? []; + const removed: [string, any][] = node.record("removed") ?? []; + const isLib = (lib: [string, any]) => lib[0] == "library"; + let libsChanged = false; + libsChanged = added.filter(isLib).reduce((libsChanged, lib) => { + log.debug("loaded library:", lib[1]); + return this.map.addLib(lib[1]) || libsChanged; + }, libsChanged); + libsChanged = removed.filter(isLib).reduce((libsChanged, lib) => { + log.debug("unloaded library:", lib[1]); + return this.map.remLib(lib[1]) || libsChanged; + }, libsChanged); + if (libsChanged) { + log.debug (() => this.map.toString ("updated")); + this.reloadBreakPoints (); + } } start(attachTarget?: string): Thenable { @@ -490,7 +380,7 @@ export class MI2 extends EventEmitter implements IDebugger { } this.once("ui-break-done", () => { if (!!attachTarget) { - if (/^d+$/.test(attachTarget)) { + if (/^\d+$/.test(attachTarget)) { command = `target-attach ${attachTarget}`; expectingResultClass = "done"; } else { @@ -498,6 +388,7 @@ export class MI2 extends EventEmitter implements IDebugger { expectingResultClass = "connected"; } } + this.sendCommand(command).then((info) => { if (info.resultRecords.resultClass == expectingResultClass) { resolve(false); @@ -511,30 +402,32 @@ export class MI2 extends EventEmitter implements IDebugger { stop() { const proc = this.process; - const to = setTimeout(() => { - process.kill(-proc.pid); - }, 1000); - this.process.on("exit", function (code) { - clearTimeout(to); - }); - this.sendCommand("gdb-exit"); + if (proc) { + const to = setTimeout(() => { + process.kill(-proc.pid); + }, 1000); + this.process.on("exit", function (_code) { + clearTimeout(to); + }); + } + void this.sendCommand("gdb-exit"); } detach() { const proc = this.process; - const to = setTimeout(() => { - process.kill(-proc.pid); - }, 1000); - this.process.on("exit", function (code) { - clearTimeout(to); - }); - this.sendCommand("target-detach"); + if (proc) { + const to = setTimeout(() => { + process.kill(-proc.pid); + }, 1000); + this.process.on("exit", function (_code) { + clearTimeout(to); + }); + } + void this.sendCommand("target-detach"); } interrupt(): Thenable { - if (this.verbose) { - this.log("stderr", "interrupt"); - } + log.debug("interrupt"); return new Promise((resolve, reject) => { this.sendCommand("exec-interrupt").then((info) => { resolve(info.resultRecords.resultClass == "done"); @@ -543,10 +436,8 @@ export class MI2 extends EventEmitter implements IDebugger { } continue(): Thenable { - this.lastStepCommand = this.continue; - if (this.verbose) { - this.log("stderr", "continue"); - } + this.lastStepCommand = () => this.continue(); + log.debug("continue"); return new Promise((resolve, reject) => { this.sendCommand("exec-continue").then((info) => { resolve(info.resultRecords.resultClass == "running"); @@ -554,6 +445,14 @@ export class MI2 extends EventEmitter implements IDebugger { }); } + private resume () { + if (this.lastStepCommand != undefined) { + void this.lastStepCommand (); + } else { + void this.continue (); + } + } + /** * The command executes the line, then pauses at the next line. * The underlying function executes entirely. @@ -561,10 +460,8 @@ export class MI2 extends EventEmitter implements IDebugger { */ // 002 - stepOver in routines with "perform" stepOver(): Thenable { - this.lastStepCommand = this.stepOver; - if (this.verbose) { - this.log("stderr", "stepOver"); - } + this.lastStepCommand = () => this.stepOver(); + log.debug("stepOver"); if (subroutine >= 0) { return new Promise((resolve, reject) => { this.sendCommand("exec-until " + subroutine).then((info) => { @@ -586,10 +483,8 @@ export class MI2 extends EventEmitter implements IDebugger { * The command goes into the underlying function, then pauses at the first line. */ stepInto(): Thenable { - this.lastStepCommand = this.stepInto; - if (this.verbose) { - this.log("stderr", "stepInto"); - } + this.lastStepCommand = () => this.stepInto() ; + log.debug("stepInto"); // 002 - stepInto/setpOut in routines with "perform" if (subroutine >= 0) { return new Promise((resolve, reject) => { @@ -613,10 +508,8 @@ export class MI2 extends EventEmitter implements IDebugger { * The comand executes the function, then pauses at the next line outside. */ stepOut(): Thenable { - this.lastStepCommand = this.stepOut; - if (this.verbose) { - this.log("stderr", "stepOut"); - } + this.lastStepCommand = () => this.stepOut() ; + log.debug("stepOut"); return new Promise((resolve, reject) => { this.sendCommand("exec-finish").then((info) => { resolve(info.resultRecords.resultClass == "running"); @@ -624,12 +517,10 @@ export class MI2 extends EventEmitter implements IDebugger { }); } - goto(filename: string, line: number): Thenable { - if (this.verbose) { - this.log("stderr", "goto"); - } + goto(filename: string, line: number): Thenable { + log.debug("goto"); return new Promise((resolve, reject) => { - const target: string = '"' + (filename ? escape(filename) + ":" : "") + line + '"'; + const target: string = '"' + (filename ? escape(filename) + ":" : "") + line.toString() + '"'; this.sendCommand("break-insert -t " + target).then(() => { this.sendCommand("exec-jump " + target).then((info) => { resolve(info.resultRecords.resultClass == "running"); @@ -638,45 +529,72 @@ export class MI2 extends EventEmitter implements IDebugger { }); } - async changeVariable(name: string, rawValue: string): Promise { - if (this.verbose) { - this.log("stderr", "changeVariable"); + async changeVariable(name: string, rawValue: string): Promise> { + log.debug("changeVariable"); + const functionName = await this.getCurrentFunctionName(); + try { + const v = this.map.findVariableByCobol(functionName, name); + return this.setDebuggerVariable(v, rawValue); + } catch (e) { + this.log("stderr", `Failed to set cob field value on ${functionName}.${name}`); + this.log("stderr", (e).message); + throw e; } + } + async changeCVariable(cName: string, rawValue: string): Promise> { + log.debug("changeCVariable"); const functionName = await this.getCurrentFunctionName(); + try { + const v = this.map.findVariableByC(functionName, cName); + return this.setDebuggerVariable(v, rawValue); + } catch (e) { + this.log("stderr", `Failed to set cob field value on ${functionName}.${cName}`); + this.log("stderr", (e).message); + throw e; + } + } - const cleanedRawValue = cleanRawValue(rawValue); - + async changeGlobalCVariable(cName: string, rawValue: string): Promise> { + log.debug("changeGobalVariable"); try { - const variable = this.map.getVariableByCobol(`${functionName}.${name.toUpperCase()}`); + const v = this.map.findGlobalByC(cName); + return this.setDebuggerVariable(v, rawValue); + } catch (e) { + this.log("stderr", `Failed to set cob field value on ${cName} (global)`); + this.log("stderr", (e).message); + throw e; + } + } - if (variable.attribute.type === "integer") { - await this.sendCommand(`gdb-set var ${variable.cName}=${cleanedRawValue}`); - } else if (this.hasCobPutFieldStringFunction && variable.cName.startsWith("f_")) { - await this.sendCommand(`data-evaluate-expression "(int)cob_put_field_str(&${variable.cName}, \\"${cleanedRawValue}\\")"`); + private async setDebuggerVariable(v: DebuggerVariable, rawValue: string) : Promise> { + const cleanedRawValue = cleanRawValue(rawValue); + try { + if (v.attribute.type === "integer") { + await this.sendCommand(`gdb-set var ${v.cName}=${cleanedRawValue}`); + } else if (this.hasCobPutFieldStringFunction && v.isField) { + await this.sendCommand(`data-evaluate-expression "(int)cob_put_field_str(&${v.cName}, \\"${cleanedRawValue}\\")"`); } else { - const finalValue = variable.formatValue(cleanedRawValue); - let cName = variable.cName; - if (variable.cName.startsWith("f_")) { + const finalValue = v.formatValue(cleanedRawValue); + let cName = v.cName; + if (v.isField) { cName += ".data"; } - await this.sendCommand(`data-evaluate-expression "(void)strncpy(${cName}, \\"${finalValue}\\", ${variable.size})"`); + await this.sendCommand(`data-evaluate-expression "(void)strncpy(${cName}, \\"${finalValue}\\", ${v.size})"`); } } catch (e) { - if (e.message.includes("No symbol \"cob_put_field_str\"")) { + if ((e).message.includes("No symbol \"cob_put_field_str\"")) { this.hasCobPutFieldStringFunction = false; - return this.changeVariable(name, rawValue); + return this.setDebuggerVariable(v, rawValue); } - this.log("stderr", `Failed to set cob field value on ${functionName}.${name}`); - this.log("stderr", e.message); + this.log("stderr", `Failed to set cob field value on ${v.cName}`); throw e; } + return v.parent != null || v.hasChildren() ? ['variables'] : []; } loadBreakPoints(breakpoints: Breakpoint[]): Thenable<[boolean, Breakpoint][]> { - if (this.verbose) { - this.log("stderr", "loadBreakPoints"); - } + log.debug("loadBreakPoints"); const promisses = []; breakpoints.forEach(breakpoint => { promisses.push(this.addBreakPoint(breakpoint)); @@ -684,17 +602,22 @@ export class MI2 extends EventEmitter implements IDebugger { return Promise.all(promisses); } - setBreakPointCondition(bkptNum, condition): Thenable { - if (this.verbose) { - this.log("stderr", "setBreakPointCondition"); - } - return this.sendCommand("break-condition " + bkptNum + " " + condition); + private reloadBreakPoints(): Thenable<[boolean, Breakpoint][]> { + // TODO: ignore previously set breakpoints after library unloading? + // Library unloading should mostly happen at the end of executions, + // so we can probaly let gdb deal with those (and live with the warnings). + let breakpoints = Array.from (this.ignoredBreakpoints); + this.ignoredBreakpoints.clear (); + return this.loadBreakPoints (breakpoints); + } + + setBreakPointCondition(bkptNum: number, condition: string): Thenable { + log.debug("setBreakPointCondition"); + return this.sendCommand("break-condition " + bkptNum.toString() + " " + condition); } addBreakPoint(breakpoint: Breakpoint): Thenable<[boolean, Breakpoint]> { - if (this.verbose) { - this.log("stderr", "addBreakPoint "); - } + log.debug("addBreakPoint"); return new Promise((resolve, reject) => { if (this.breakpoints.has(breakpoint)) { @@ -703,40 +626,46 @@ export class MI2 extends EventEmitter implements IDebugger { let location = ""; if (breakpoint.countCondition) { if (breakpoint.countCondition[0] == ">") { - location += "-i " + numRegex.exec(breakpoint.countCondition.substr(1))[0] + " "; + location += "-i " + numRegex.exec(breakpoint.countCondition.substring(1))[0] + " "; } else { const match = numRegex.exec(breakpoint.countCondition)[0]; if (match.length != breakpoint.countCondition.length) { this.log("stderr", "Unsupported break count expression: '" + breakpoint.countCondition + "'. Only supports 'X' for breaking once after X times or '>X' for ignoring the first X breaks"); location += "-t "; } else if (parseInt(match) != 0) { - location += "-t -i " + parseInt(match) + " "; + location += "-t -i " + parseInt(match).toString() + " "; } } } const map = this.map.getLineC(breakpoint.file, breakpoint.line); if (map.fileC === '' && map.lineC === 0) { + log.debug (() => [ + "addBreakPoint: ignoring breakpoint for unknown source file:", + JSON.stringify(breakpoint) + ]); + this.ignoredBreakpoints.add(breakpoint); return; } if (breakpoint.raw) { location += '"' + escape(breakpoint.raw) + '"'; } else { - location += '"' + escape(map.fileC) + ":" + map.lineC + '"'; + location += '"' + escape(map.fileC) + ":" + map.lineC.toString() + '"'; } this.sendCommand("break-insert -f " + location).then((result) => { if (result.resultRecords.resultClass == "done") { - const bkptNum = parseInt(result.result("bkpt.number")); - const map = this.map.getLineCobol(result.result("bkpt.file"), parseInt(result.result("bkpt.line"))); + const bkptNum = parseInt(result.result("bkpt.number")); + const bkptlocation = (result.result("bkpt.original-location")).split(':'); + const map = this.map.getLineCobol(bkptlocation[0], parseInt(bkptlocation[1])); const newBrk = { file: map.fileCobol, line: map.lineCobol, condition: breakpoint.condition }; if (breakpoint.condition) { - this.setBreakPointCondition(bkptNum, breakpoint.condition).then((result) => { + this.setBreakPointCondition(bkptNum, breakpoint.condition).then((result: MINode) => { if (result.resultRecords.resultClass == "done") { this.breakpoints.set(newBrk, bkptNum); resolve([true, newBrk]); @@ -756,32 +685,36 @@ export class MI2 extends EventEmitter implements IDebugger { } removeBreakPoint(breakpoint: Breakpoint): Thenable { - if (this.verbose) { - this.log("stderr", "removeBreakPoint"); - } - return new Promise((resolve, reject) => { + log.debug("removeBreakPoint"); + return new Promise((resolve, _reject) => { if (!this.breakpoints.has(breakpoint)) { - return resolve(false); + if (this.ignoredBreakpoints.has(breakpoint)) { + this.ignoredBreakpoints.delete(breakpoint); + return resolve(true); + } else { + return resolve(false); + } } - this.sendCommand("break-delete " + this.breakpoints.get(breakpoint)).then((result) => { + this.sendCommand("break-delete " + this.breakpoints.get(breakpoint).toString()).then((result: MINode) => { if (result.resultRecords.resultClass == "done") { this.breakpoints.delete(breakpoint); resolve(true); } else resolve(false); - }); + }, (err: Error) => console.log(err)); }); } - clearBreakPoints(): Thenable { - if (this.verbose) { - this.log("stderr", "clearBreakPoints"); - } - return new Promise((resolve, reject) => { + clearBreakPoints(): Thenable { + log.debug("clearBreakPoints"); + return new Promise((resolve, _reject) => { this.sendCommand("break-delete").then((result) => { if (result.resultRecords.resultClass == "done") { + this.ignoredBreakpoints.clear (); this.breakpoints.clear(); resolve(true); - } else resolve(false); + } else { + resolve(false); + } }, () => { resolve(false); }); @@ -789,20 +722,18 @@ export class MI2 extends EventEmitter implements IDebugger { } async getThreads(): Promise { - if (this.verbose) { - this.log("stderr", "getThreads"); - } + log.debug("getThreads"); return new Promise((resolve, reject) => { if (!!this.noDebug) { return; } this.sendCommand("thread-info").then((result) => { - resolve(result.result("threads").map(element => { + resolve((result.result("threads")).map(element => { const ret: Thread = { - id: parseInt(MINode.valueOf(element, "id")), - targetId: MINode.valueOf(element, "target-id") + id: parseInt(MINode.valueOf(element, "id")), + targetId: MINode.valueOf(element, "target-id") }; - const name = MINode.valueOf(element, "name"); + const name = MINode.valueOf(element, "name"); if (name) { ret.name = name; } @@ -813,27 +744,24 @@ export class MI2 extends EventEmitter implements IDebugger { } async getStack(maxLevels: number, thread: number): Promise { - if (this.verbose) { - this.log("stderr", "getStack"); - } + log.debug("getStack"); let command = "stack-list-frames"; if (thread != 0) { command += ` --thread ${thread}`; } if (maxLevels) { - command += " 0 " + maxLevels; + command += " 0 " + maxLevels.toString(); } - const result = await this.sendCommand(command); - const stack = result.result("stack"); - const ret: Stack[] = []; + const result = await this.sendCommand(command, failure_handling.Silence); + if (result === undefined) + return; + const stack = result.result("stack"); return stack.map(element => { const level = MINode.valueOf(element, "@frame.level"); - const addr = MINode.valueOf(element, "@frame.addr"); const func = MINode.valueOf(element, "@frame.func"); - const filename = MINode.valueOf(element, "@frame.file"); let file: string = MINode.valueOf(element, "@frame.fullname"); if (file) { - file = nativePath.normalize(file); + file = path.normalize(file); } const from = parseInt(MINode.valueOf(element, "@frame.from")); @@ -843,44 +771,61 @@ export class MI2 extends EventEmitter implements IDebugger { line = parseInt(lnstr); } - const map = this.map.getLineCobol(file, line); return { - address: addr, - fileName: nativePath.basename(map.fileCobol), - file: map.fileCobol, function: func || from, level: level, - line: map.lineCobol + line: this.map.getLineCobol(file, line) }; }); } + async globalStorageSymbols(): Promise { + const resp = await this.sendCommand(`symbol-info-variables --name "^b_[0-9]*$"`, + failure_handling.Silence); + if (resp?.resultRecords.resultClass !== "done") + return []; + return (resp.result("symbols.debug")).map(MI2Decoder.decodeFileSymbols); + } + + async evalSymbol(s: LocalizedSymbol): Promise { + const v = this.map.getGlobalByC(s.filename, s.symbol.name); + await this.updateVariable(v); + return v; + } + + public lookupGlobalCobolByCName(cobolName: string, cName: string): DebuggerVariable { + const cFileMatch = /^'([^']+)'::.*$/.exec(cName); + let cFile = cFileMatch ? cFileMatch[1] : undefined; + return this.map.findGlobalByCobol(cobolName, cFile); + } + async getCurrentFunctionName(): Promise { - if (this.verbose) { - this.log("stderr", "getCurrentFunctionName"); - } - const response = await this.sendCommand("stack-info-frame"); - return response.result("frame.func").toLowerCase(); + log.debug("getCurrentFunctionName"); + const response = await this.sendCommand("stack-info-frame", failure_handling.Silence); + if (response === undefined) + return; + return response.result("frame.func")?.toLowerCase(); } async getStackVariables(thread: number, frame: number): Promise { - if (this.verbose) { - this.log("stderr", "getStackVariables"); - } + log.debug("getStackVariables"); const functionName = await this.getCurrentFunctionName(); + if (functionName === undefined) + return; + + const variablesResponse = await this.sendCommand(`stack-list-variables --thread ${thread} --frame ${frame} --all-values`, failure_handling.Silence); + if (variablesResponse === undefined) + return; - const variablesResponse = await this.sendCommand(`stack-list-variables --thread ${thread} --frame ${frame} --all-values`); const variables = variablesResponse.result("variables"); const currentFrameVariables = new Set(); for (const element of variables) { const key = MINode.valueOf(element, "name"); const value = MINode.valueOf(element, "value"); - //console.log("Key="+key); - //console.log("Value="+value); - if (key.startsWith("b_")) { + if (key.startsWith("b_")) { // ok for stack variables const cobolVariable = this.map.getVariableByC(`${functionName}.${key}`); if (cobolVariable) { @@ -899,9 +844,7 @@ export class MI2 extends EventEmitter implements IDebugger { } examineMemory(from: number, length: number): Thenable { - if (this.verbose) { - this.log("stderr", "examineMemory"); - } + log.debug("examineMemory"); return new Promise((resolve, reject) => { this.sendCommand("data-read-memory-bytes 0x" + from.toString(16) + " " + length).then((result) => { resolve(result.result("memory[0].contents")); @@ -910,45 +853,44 @@ export class MI2 extends EventEmitter implements IDebugger { } async evalExpression(expression: string, thread: number, frame: number): Promise { - const functionName = await this.getCurrentFunctionName(); + log.debug("evalExpression", expression); - if (this.verbose) { - this.log("stderr", "evalExpression"); - } + const functionName = await this.getCurrentFunctionName(); + if (functionName === undefined) + return; let [finalExpression, variableNames] = parseExpression(expression, functionName, this.map); + finalExpression = `return ${finalExpression};`; for (const variableName of variableNames) { const variable = this.map.getVariableByC(`${functionName}.${variableName}`); if (variable) { - await this.evalVariable(variable, thread, frame); + await this.updateVariable(variable, thread, frame); const value = variable.value; finalExpression = `const ${variableName}=${value};` + finalExpression; } } try { - const result = `${eval(finalExpression)}`; - if (/[^0-9.\-+]/g.test(result)) { - return `"${result}"`; - } - return result; + const result = Function(`"use strict"; ${finalExpression}`)(); + return JSON.stringify(result); // deals with escapes. } catch (e) { - this.log("stderr", e.message); + log.debug(e.message); return `Failed to evaluate ${expression}`; } } - async evalCobField(name: string, thread: number, frame: number): Promise { - const functionName = await this.getCurrentFunctionName(); + async evalCVariable(cName: string, thread: number = 0, frame: number = 0): Promise { + log.debug("evalCVariable", cName); - if (this.verbose) { - this.log("stderr", "evalCobField"); - } + const functionName = await this.getCurrentFunctionName(); + if (functionName === undefined) + return; try { - const variable = this.map.getVariableByCobol(`${functionName}.${name.toUpperCase()}`); - return await this.evalVariable(variable, thread, frame); + const variable = this.map.findVariableByC(functionName, cName); + await this.updateVariable(variable, thread, frame); + return variable; } catch (e) { this.log("stderr", `Failed to eval cob field value on ${functionName}.${name}`); this.log("stderr", e.message); @@ -956,36 +898,50 @@ export class MI2 extends EventEmitter implements IDebugger { } } - private async evalVariable(variable: DebuggerVariable, thread: number, frame: number): Promise { - if (this.verbose) { - this.log("stderr", "evalVariable"); + async evalCGlobal(cName: string): Promise { + log.debug("evalCGlobal", cName); + + try { + const variable = this.map.findGlobalByC(cName); + await this.updateVariable(variable); + return variable; + } catch (e) { + this.log("stderr", `Failed to eval cob field value on ${cName}`); + this.log("stderr", e.message); + throw e; } + } + + private async updateVariable(variable: DebuggerVariable, thread: number = 0, frame: number = 0): Promise { + log.debug("updateVariable", (() => `${variable.cName} (${variable.cobolName})`)); let command = "data-evaluate-expression "; if (thread != 0) { command += `--thread ${thread} --frame ${frame} `; } - if (this.hasCobGetFieldStringFunction && variable.cName.startsWith("f_")) { + if (this.hasCobGetFieldStringFunction && variable.isField) { command += `"(char *)cob_get_field_str_buffered(&${variable.cName})"`; - } else if (variable.cName.startsWith("f_")) { + } else if (variable.isField) { command += `${variable.cName}.data`; } else { command += variable.cName; } - let dataResponse; let value = null; try { - dataResponse = await this.sendCommand(command); - value = dataResponse.result("value"); - if (value === "0x0") { - value = null; + let dataResponse = await this.sendCommand(command, failure_handling.Silence); + if (dataResponse !== undefined) { + value = dataResponse.result("value"); + if (value === "0x0") { + value = null; + } } } catch (error) { if (error.message.includes("No symbol \"cob_get_field_str_buffered\"")) { this.hasCobGetFieldStringFunction = false; - return this.evalVariable(variable, thread, frame); + this.updateVariable(variable, thread, frame); + return; } this.log("stderr", error.message); } @@ -995,8 +951,6 @@ export class MI2 extends EventEmitter implements IDebugger { } else { variable.setValue(value); } - - return variable; } private logNoNewLine(type: string, msg: string): void { @@ -1013,16 +967,24 @@ export class MI2 extends EventEmitter implements IDebugger { }); } - private sendCommand(command: string, suppressFailure: boolean = false): Thenable { + private sendCommand(command: string, on_failure: failure_handling = undefined): Thenable { return new Promise((resolve, reject) => { const sel = this.currentToken++; this.handlers[sel] = (node: MINode) => { if (node && node.resultRecords && node.resultRecords.resultClass === "error") { - if (suppressFailure) { - this.log("stderr", `WARNING: Error executing command '${command}'`); - resolve(node); - } else - reject(new MIError(node.result("msg") || "Internal error", command)); + switch (on_failure) { + case failure_handling.Suppress: + this.log("stderr", `WARNING: Error executing command '${command}'`); + resolve(node); + break; + case failure_handling.Silence: + resolve(undefined); + break; + default: + case failure_handling.Report_n_reject: + reject(new MIError(node.result("msg") || "Internal error", command)); + break; + } } else resolve(node); }; @@ -1038,7 +1000,7 @@ export class MI2 extends EventEmitter implements IDebugger { return Array.from(this.gcovFiles); } - getSourceMap(): SourceMap { + sourceMap(): SourceMap { return this.map; } @@ -1051,7 +1013,7 @@ export class MI2 extends EventEmitter implements IDebugger { if (xterm_device === "") { let sleepVal = this.hashCode(target); this.log('stdio', 'TTY: sleep ' + sleepVal + ';'); - // wls - const wsl_process = ChildProcess.exec("cmd.exe /c start bash -c 'sleep "+sleepVal+"'"); + // wls - const wsl_process = ChildProcess.exec("cmd.exe /c start bash -c 'sleep "+sleepVal+"'"); if (isWslSsh) { this.createTerminal("vscode", sleepVal, target); } else @@ -1066,7 +1028,7 @@ export class MI2 extends EventEmitter implements IDebugger { try_find++; if (xterm_device != "") break; } - if (xterm_device === "") this.log("stderr", "tty: Install 'xterm' to use gdb's tty option\n"); + if (xterm_device === "") this.log("stderr", "tty: Install a terminal to use gdb's tty option\n"); } if (xterm_device.includes("pts")) { this.gdbArgs.push("--tty=" + xterm_device); @@ -1114,24 +1076,113 @@ export class MI2 extends EventEmitter implements IDebugger { return strCode; } + isTerminalInstalled(terminalCommand: string): boolean { + try { + ChildProcess.execSync(`command -v ${terminalCommand}`); + return true; + } catch (error) { + return false; + } + } + + createXFCETerminal(sleepVal, target) { + let dispTarget = (target.length > 50) ? "..." + target.substr(target.length - 50, target.length) : target; + let param = "bash -c 'echo \"GnuCOBOL DEBUG\"; sleep " + sleepVal + ";'"; + const xfce4_terminal_args = [ + "--title", "GnuCOBOL Debug - " + dispTarget, + "--font=DejaVu Sans Mono 14", + "--command", param + ] + const xfce_process = ChildProcess.spawn("xfce4-terminal", xfce4_terminal_args, { + detached: true, + stdio: 'ignore' + }); + xfce_process.unref(); + } + + createKDETerminal(sleepVal, target) { + let dispTarget = (target.length > 50) ? "..." + target.substr(target.length - 50, target.length) : target; + let param = "bash -c 'echo \"GnuCOBOL DEBUG\"; sleep " + sleepVal + ";'"; + const konsole_args = [ + "--title", "GnuCOBOL Debug - " + dispTarget, + "--separate", + "--nofork", + "--hold", + "-e", + param + ] + const kde_process = ChildProcess.spawn("konsole", konsole_args, { + detached: true, + stdio: 'ignore' + }); + kde_process.unref(); + } + + createGNOMETerminal(sleepVal, target) { + let dispTarget = (target.length > 50) ? "..." + target.substr(target.length - 50, target.length) : target; + const gnome_terminal_args = [ + "--title", "GnuCOBOL Debug - " + dispTarget, + "--", + "bash", "-c","echo 'GnuCOBOL DEBUG';" + "sleep " + sleepVal + ";" + ] + const gnome_process = ChildProcess.spawn("gnome-terminal", gnome_terminal_args, { + detached: true, + stdio: 'ignore', + }); + gnome_process.unref(); + } + + createXtermTerminal(sleepVal, target) { + let dispTarget = (target.length > 50) ? "..." + target.substr(target.length - 50, target.length) : target; + const xterm_args = [ + "-title", "GnuCOBOL Debug - " + dispTarget, + "-fa", "DejaVu Sans Mono", + "-fs", "14", + "-e", "/usr/bin/tty;" + + "echo 'GnuCOBOL DEBUG';" + + "sleep " + sleepVal + ";" + ] + const xterm_process = ChildProcess.spawn("xterm", xterm_args, { + detached: true, + stdio: 'ignore', + }); + xterm_process.unref(); + } + // Opens a terminal to show the application screen - gdbtty createTerminal(gdbtty, sleepVal, target) { + let findTerminal = true; if (gdbtty != "vscode") { - let dispTarget = (target.length > 50) ? "..." + target.substr(target.length - 50, target.length) : target; - const xterm_args = [ - "-title", "GnuCOBOL Debug - " + dispTarget, - "-fa", "DejaVu Sans Mono", - "-fs", "14", - "-e", "/usr/bin/tty;" + - "echo 'GnuCOBOL DEBUG';" + - "sleep " + sleepVal + ";" - ] - - const xterm_process = ChildProcess.spawn("xterm", xterm_args, { - detached: true, - stdio: 'ignore', - }); - xterm_process.unref(); + if (typeof gdbtty === 'string' && gdbtty!="external") { + if(this.isTerminalInstalled(gdbtty)){ + findTerminal = false; + switch (gdbtty) { + case "xterm": + this.createXtermTerminal(sleepVal, target); + break; + case "gnome-terminal": + this.createGNOMETerminal(sleepVal, target); + break; + case "konsole": + this.createKDETerminal(sleepVal, target); + break; + case "xfce4-terminal": + this.createXFCETerminal(sleepVal, target); + break; + } + } + } + if(findTerminal){ + if(this.isTerminalInstalled("xterm")){ + this.createXtermTerminal(sleepVal, target); + }else if(this.isTerminalInstalled("gnome-terminal")){ + this.createGNOMETerminal(sleepVal, target); + }else if(this.isTerminalInstalled("xfce4-terminal")){ + this.createXFCETerminal(sleepVal, target); + }else if(this.isTerminalInstalled("konsole")){ + this.createKDETerminal(sleepVal, target); + } + } } else { let terminal = this.selectTerminal(); if (!terminal) { diff --git a/src/parser.c.ts b/src/parser.c.ts index 1c93e86..ffe1bef 100644 --- a/src/parser.c.ts +++ b/src/parser.c.ts @@ -1,26 +1,21 @@ -import * as readline from "n-readlines"; -import * as nativePathFromPath from "path"; +import readline from "n-readlines"; +import * as path from "path"; import * as fs from "fs"; import {DebuggerVariable, Attribute, VariableType} from "./debugger"; +import * as log from './log'; -const nativePath = { - resolve: function (...args: string[]): string { - const nat = nativePathFromPath.resolve(...args); - if (process.platform === "win32" && this.cobcpath === "docker" && this.gdbpath === "docker") { - return nat.replace(/.*:/, s => "/" + s.toLowerCase().replace(":", "")).replace(/\\/g, "/"); - } - return nat; - }, - basename: function (path: string): string { - return nativePathFromPath.basename(path); - }, - isAbsolute: function (path: string): boolean { - return nativePathFromPath.isAbsolute(path); - }, - join: function (...args: string[]) { - return nativePathFromPath.join(...args); - } -}; +function normalizeExistingFileName(f: string): string { + if (f != undefined && process.platform === "win32") { + const lc = f.toLowerCase(); + const uc = f.toUpperCase(); + return (!fs.existsSync(lc) || !fs.existsSync(uc)) ? f : lc; + } + return f; +} + +function cFile (filename: string) : string { + return path.basename(filename.split('.').slice(0, -1).join('.') + '.c'); +} const procedureRegex = /\/\*\sLine:\s([0-9]+)(\s+:\sEntry\s)?/i; const procedureFixRegex = /#line\s([0-9]+)\s".*\.c"/i; @@ -35,95 +30,222 @@ const subroutineRegex = /\sPerform\s/i; const frame_ptrFindRegex = /frame\_ptr\-\-\;/; const fixOlderFormat = /cob\_trace\_stmt/; -globalThis.varOccurs = []; +function cobEncodeInvalidChars (s: string): string { + // TODO: properly mimick `libcob:cob_encode_invalid_chars` + // Meaning: Also replace any character in /[^a-zA-Z0-9-]/ into "_XX", where + // XX is the hexadecimal ascii code of the characher being replaced + return s.replace("-","__"); +} + +// Minimalistic one-entry cache. +let currentCOBOLFileName: string = null; +let currentCOBOLFileContents: string[] = []; + +function lookupLineInCobolFile(fileCobol: string, lineCobol: number) : string | undefined { + if (fileCobol && currentCOBOLFileName != fileCobol) { + currentCOBOLFileName = fileCobol; + try { + currentCOBOLFileContents = fs.readFileSync(fileCobol).toString().split('\n'); + } catch (e) { + log.debug(e.message); + currentCOBOLFileContents = []; + } + } + if (currentCOBOLFileContents) { + return currentCOBOLFileContents[lineCobol - 1]; + } + return undefined; +} + +const globalNamespace = "" +const globalNamespacePrefix = `${globalNamespace}.` export class Line { - fileCobol: string; - fileC: string; - lineCobol: number; - lineC: number; endPerformLine: number; // 002 - stepOver in routines with "perform" - - public constructor(filePathCobol: string, lineCobol: number, filePathC: string, lineC: number) { - this.fileCobol = filePathCobol; - this.lineCobol = lineCobol; - this.fileC = filePathC; - this.lineC = lineC; + public cobolLine: string | undefined; + + public constructor + (public fileCobol: string, + public lineCobol: number, + public fileC: string, + public rootFileC: string, + public lineC: number, + public functionName: string) { this.endPerformLine = -1; // 002 - stepOver in routines with "perform" + this.cobolLine = lookupLineInCobolFile (fileCobol, lineCobol); } public toString(): string { - return `${this.fileCobol}:${this.lineCobol} > ${this.fileC}:${this.lineC}`; + return `${this.fileCobol}:${this.lineCobol} > ${this.fileC}:${this.lineC} | (${this.functionName})`; } } +const dummyLine = new Line('', 0, '', '', 0, ''); + export class SourceMap { private cwd: string; + public sourceDirs: string[] = []; private lines: Line[] = new Array(); private variablesByCobol = new Map(); private variablesByC = new Map(); private attributes = new Map(); private dataStorages = new Map(); + private loadedLibs = new Set(); private version: string; - private lineBefore: string = ""; - private performLine: number = -1; // 002 - stepOver in routines with "perform" + private performLine: number = -1; // 002 - stepOver in routines with "perform" private isVersion2_2_or_3_1_1: boolean = false; - constructor(cwd: string, filesCobol: string[]) { - this.cwd = fs.realpathSync(nativePathFromPath.resolve(cwd)); + constructor(cwd: string, filesCobol: string[], sourceDirs: string[] = []) { + this.cwd = fs.realpathSync(path.resolve(cwd)); + log.debug(`Source dirs: ${sourceDirs}`); + for (const cSourceDir of sourceDirs) { + log.debug(`Trying to resolve ${cSourceDir}`); + let resolved_path = path.resolve(this.cwd, cSourceDir); + log.debug(`Checking for ${resolved_path}`); + if (fs.existsSync(resolved_path)) { + this.sourceDirs.push(normalizeExistingFileName(fs.realpathSync(resolved_path))); + } + } + + this.sourceDirs.push(this.cwd); + filesCobol.forEach(e => { - this.parse(nativePath.basename(e.split('.').slice(0, -1).join('.') + '.c')); + let c_file = this.lookupSourceFile (cFile (e)); + if (c_file) { + this.register (c_file); + } }); + + log.info(`Resolved source dirs: ${this.sourceDirs}`); + } + + private lookupSourceFile (file: string) : string | undefined { + for (const dir of this.sourceDirs) { + const filePath = path.join (dir, file); + if (fs.existsSync (filePath)) { + return normalizeExistingFileName (filePath); + } + } + return; + } + + public addLib (libFile: string) : boolean { + if (this.loadedLibs.has (libFile)) { + return false; + } + this.loadedLibs.add (libFile); + log.info(`Loading ${libFile}`); + const c = this.lookupSourceFile (cFile (libFile)); + if (c) { + this.register (c); + return true; + } + return false; } - private parse(fileC: string): void { + public remLib (libFile: string) : boolean { + if (!this.loadedLibs.has (libFile)) { + return false; + } + this.loadedLibs.delete (libFile); + log.info(`Unloading ${libFile}`); + // Note: assumes there was no FS changes in the meantime. + // Cleaner way would be to record a mapping between libs and source files. + const c = this.lookupSourceFile (cFile (libFile)); + if (c) { + this.unregister (c); + return true; + } + return false; + } + + private unregister (givenFileC: string) : void { + const [fileC, cleanedFile] = this.ensureAbsolute (givenFileC); + this.lines = this.lines.filter (line => line.rootFileC != fileC) ?? []; + for (const [k, v] of this.variablesByC) { + if (v.rootFileC == fileC) this.variablesByC.delete(k); + } + for (const [k, v] of this.variablesByCobol) { + if (v.rootFileC == fileC) this.variablesByCobol.delete(k); + } + } + + private ensureAbsolute (fileC: string) : [string, string] { let nat = fileC; - if (!nativePath.isAbsolute(fileC)) { - nat = nativePathFromPath.resolve(this.cwd, fileC); - fileC = nativePath.resolve(this.cwd, fileC); + if (!path.isAbsolute(fileC)) { + fileC = path.resolve(this.cwd, fileC); } - const basename = nativePath.basename(fileC); + const basename = path.basename(fileC); const cleanedFile = basename.substring(0, basename.lastIndexOf(".c")); - let lineNumber = 0; + return [normalizeExistingFileName(fileC), cleanedFile]; + } + + private register (givenFileC: string) : void { + void this.parse (givenFileC); // just parse the file. + } + + private parse (givenFileC: string, + prevLine: string | undefined = undefined, + rootFileC: string | undefined = undefined, + functionName: string | undefined = undefined) : string { + log.debug(`Parsing ${givenFileC}`); + + const [fileC, cleanedFile] = this.ensureAbsolute (givenFileC); + rootFileC = rootFileC ?? fileC; - const reader = new readline(process.platform === "win32" ? nat : fileC); + let lineNumber = 0; let row: false | Buffer; let fileCobol: string; - let functionName: string; + + const reader = new readline(fileC); while (row = reader.next()) { const line = row.toString(); let match = fileCobolRegex.exec(line); if (match) { - if (!nativePath.isAbsolute(match[1])) { - fileCobol = nativePath.resolve(this.cwd, match[1]); + const filename = match[1]; + const filebase = path.basename (filename); + if (!path.isAbsolute(filename)) { + fileCobol = path.resolve(path.dirname (fileC), filename); + if (!fs.existsSync(fileCobol)) { + fileCobol = path.resolve(path.dirname (fileC), filebase); + } + if (!fs.existsSync(fileCobol)) { + fileCobol = this.lookupSourceFile (filename); + } } else { - fileCobol = match[1]; + fileCobol = filename; } + if (!fs.existsSync(fileCobol)) { + fileCobol = this.lookupSourceFile (filebase); + } + fileCobol = normalizeExistingFileName (fileCobol); } match = functionRegex.exec(line); if (match) { - functionName = match[1].toLowerCase() + "_"; + functionName = cobEncodeInvalidChars(match[1]).toLowerCase() + "_"; } match = procedureRegex.exec(line); if (match && !match[2]) { - if (this.lines.length > 0 && fileNameCompare(this.lines[this.lines.length - 1].fileCobol, fileCobol) && this.lines[this.lines.length - 1].lineCobol === parseInt(match[1])) { + if (this.lines.length > 0 && this.lines[this.lines.length - 1].fileCobol === fileCobol && this.lines[this.lines.length - 1].lineCobol === parseInt(match[1])) { this.lines.pop(); } - if(subroutineRegex.exec(line)) + if(subroutineRegex.exec(line)) this.performLine=-2; // must find line of frame_ptr - else - this.performLine=-1; - this.lines.push(new Line(fileCobol, parseInt(match[1]), fileC, lineNumber + 2)); + else + this.performLine=-1; + this.lines.push(new Line(fileCobol, parseInt(match[1]), fileC, rootFileC, lineNumber + 2, functionName)); } // fix new codegen match = procedureFixRegex.exec(line); - if (match && this.lines.length > 0) { - let isOldFormat = fixOlderFormat.exec(this.lineBefore); - if(this.isVersion2_2_or_3_1_1 || !isOldFormat){ // Is it in the old format? + if (match && this.lines.length > 0 && this.lines[this.lines.length - 1].functionName == functionName) { + let isOldFormat = fixOlderFormat.exec(prevLine); + if(this.lines[this.lines.length - 1].fileCobol === fileCobol && (this.isVersion2_2_or_3_1_1 || !isOldFormat)){ // Is it in the old format? let line = this.lines.pop(); + // this.log (`Fixing line: ${line.toString ()}`); line.lineC = parseInt(match[1]); + // this.log (`New line: ${line.toString ()}`); this.lines.push(line); } } @@ -138,29 +260,44 @@ export class SourceMap { if (match[3].startsWith("[")) { size = parseInt(match[3].substring(1, match[3].length - 1)); } - const dataStorage = new DebuggerVariable(match[4], match[2], functionName, new Attribute(null, VariableType[match[1]], 0, 0), size); - this.dataStorages.set(`${functionName}.${dataStorage.cName}`, dataStorage); - this.variablesByC.set(`${functionName}.${dataStorage.cName}`, dataStorage); - this.variablesByCobol.set(`${functionName}.${dataStorage.cobolName.toUpperCase()}`, dataStorage); + const global = functionName === undefined; + const namespace = functionName ?? globalNamespace; + const cName = global ? `'${fileC}'::${match[2]}` : match[2]; + const cobolName = match[4]; + const cobolNAME = cobolName.toUpperCase(); + const dataStorage = new DebuggerVariable(cobolName, cName, namespace, rootFileC, false, new Attribute(null, VariableType[match[1]], 0, 0), size); + this.dataStorages.set(`${namespace}.${dataStorage.cName}`, dataStorage); + this.variablesByC.set(`${namespace}.${dataStorage.cName}`, dataStorage); + const fullCobolName = global ? `'${fileC}'.${cobolNAME}` : cobolNAME; + this.variablesByCobol.set(`${namespace}.${fullCobolName}`, dataStorage); } match = fieldRegex.exec(line); if (match) { + const global = functionName === undefined; + const namespace = functionName ?? globalNamespace; + const cName = global ? `'${fileC}'::${match[1]}` : match[1]; + const cRecord = global ? `'${fileC}'::${match[3]}` : match[3]; const attribute = this.attributes.get(`${cleanedFile}.${match[4]}`); - const dataStorage = this.dataStorages.get(`${functionName}.${match[3]}`); - const field = new DebuggerVariable(match[5], match[1], functionName, attribute, parseInt(match[2])); + const dataStorage = this.dataStorages.get(`${namespace}.${cRecord}`); + const cobolName = match[5]; + const field = new DebuggerVariable(cobolName, cName, namespace, rootFileC, true, attribute, parseInt(match[2])); - this.variablesByC.set(`${functionName}.${field.cName}`, field); + this.variablesByC.set(`${namespace}.${field.cName}`, field); + let storageKey = namespace; if (dataStorage) { dataStorage.addChild(field); - this.variablesByCobol.set(`${functionName}.${dataStorage.cobolName.toUpperCase()}.${field.cobolName.toUpperCase()}`, field); - } else { - this.variablesByCobol.set(`${functionName}.${field.cobolName.toUpperCase()}`, field); + const cobolNAME = dataStorage.cobolName.toUpperCase(); + const fullCobolStorage = global ? `'${fileC}'.${cobolNAME}` : cobolNAME; + storageKey = `${namespace}.${fullCobolStorage}`; } + this.variablesByCobol.set(`${storageKey}.${field.cobolName.toUpperCase()}`, field); } match = fileIncludeRegex.exec(line); if (match) { - this.parse(match[1]); + // Note: we assume the included file is in the same dir as the current file. + const filename = path.resolve (path.dirname (rootFileC), match[1]); + functionName = this.parse(filename, prevLine, rootFileC, functionName); } match = versionRegex.exec(line); if (match) { @@ -174,10 +311,12 @@ export class SourceMap { line.endPerformLine = lineNumber+1; this.lines.push(line); } - } - this.lineBefore = line; + } lineNumber++; + prevLine = line; } + + return functionName; } public getVariablesByC(): IterableIterator { @@ -196,6 +335,34 @@ export class SourceMap { return this.variablesByC.size; } + public findVariableByC(functionName: string, cName: string): DebuggerVariable { + for (const key of this.variablesByC.keys()) { + if (key.startsWith(`${functionName}.`) && key.endsWith(`.${cName}`)) { + return this.variablesByC.get(key); + } + } + return null; + } + + public findGlobalByC(cName: string): DebuggerVariable { + for (const key of this.variablesByC.keys()) { + if (key.startsWith(globalNamespacePrefix) && key.endsWith(`.${cName}`)) { + return this.variablesByC.get(key); + } + } + return null; + } + + public globalCVariables() { + return Array.from(this.variablesByC.entries()) + .filter(([k,_]) => k.startsWith(globalNamespacePrefix)) + .map(([_,v]) => v); + } + + public getGlobalByC(fileC: string, varC: string): DebuggerVariable { + return this.getVariableByC(`${globalNamespacePrefix}'${fileC}'::${varC}`); + } + public getVariableByC(varC: string): DebuggerVariable { if (this.variablesByC.has(varC)) { return this.variablesByC.get(varC); @@ -205,7 +372,19 @@ export class SourceMap { public findVariableByCobol(functionName: string, name: string): DebuggerVariable { for (const key of this.variablesByCobol.keys()) { - if (key.startsWith(functionName) && key.endsWith(`.${name.toUpperCase()}`)) { + if (key.startsWith(`${functionName}.`) && key.endsWith(`.${name.toUpperCase()}`)) { + return this.variablesByCobol.get(key); + } + } + return null; + } + + public findGlobalByCobol(name: string, cFile: string = undefined): DebuggerVariable { + const prefix = cFile === undefined + ? globalNamespacePrefix + : `${globalNamespacePrefix}'${cFile}'.`; + for (const key of this.variablesByCobol.keys()) { + if (key.startsWith(prefix) && key.endsWith(`.${name.toUpperCase()}`)) { return this.variablesByCobol.get(key); } } @@ -218,8 +397,8 @@ export class SourceMap { public hasLineCobol(fileC: string, lineC: number): boolean { if(!fileC || !lineC) return false; - if (!nativePath.isAbsolute(fileC)) { - fileC = nativePath.join(this.cwd, fileC); + if (!path.isAbsolute(fileC)) { + fileC = path.join(this.cwd, fileC); } return this.lines.some(e => e.fileC === fileC && e.lineC === lineC); } @@ -227,41 +406,43 @@ export class SourceMap { // 002 - stepOver in routines with "perform" public hasLineSubroutine(fileC: string, lineC: number): number { if(!fileC || !lineC) return -1; - if (!nativePath.isAbsolute(fileC)) { - fileC = nativePath.join(this.cwd, fileC); + if (!path.isAbsolute(fileC)) { + fileC = path.join(this.cwd, fileC); } - let line = this.lines.find(e => e.fileC === fileC && e.lineC === lineC) ?? new Line('', 0, '', 0); - return line.endPerformLine; + return this.lines.find(e => e.fileC === fileC && e.lineC === lineC)?.endPerformLine ?? -1; } // 002 public hasLineC(fileCobol: string, lineCobol: number): boolean { - if (!nativePath.isAbsolute(fileCobol)) { - fileCobol = nativePath.join(this.cwd, fileCobol); + if (!path.isAbsolute(fileCobol)) { + fileCobol = path.join(this.cwd, fileCobol); } - return this.lines.some(e => fileNameCompare(e.fileCobol, fileCobol) && e.lineCobol === lineCobol); + return this.lines.some(e => e.fileCobol === fileCobol && e.lineCobol === lineCobol); } public getLineC(fileCobol: string, lineCobol: number): Line { - if (!nativePath.isAbsolute(fileCobol)) { - fileCobol = nativePath.join(this.cwd, fileCobol); + if (!path.isAbsolute(fileCobol)) { + fileCobol = path.join(this.cwd, fileCobol); } - return this.lines.find(e => fileNameCompare(e.fileCobol, fileCobol) && e.lineCobol === lineCobol) ?? new Line('', 0, '', 0); + return this.lines.find(e => e.fileCobol === fileCobol && e.lineCobol === lineCobol) ?? dummyLine; } public getLineCobol(fileC: string, lineC: number): Line { - if (!nativePath.isAbsolute(fileC)) { - fileC = nativePath.join(this.cwd, fileC); + if (!fileC) { + return dummyLine; } - return this.lines.find(e => e.fileC === fileC && e.lineC === lineC) ?? new Line('', 0, '', 0); + if (!path.isAbsolute(fileC)) { + fileC = path.join(this.cwd, fileC); + } + return this.lines.find(e => e.fileC === fileC && e.lineC === lineC) ?? dummyLine; } public getVersion(): string { return this.version; } - public toString(): string { - let out = `SourceMap created: lines ${this.lines.length}, vars ${this.variablesByC.size}\n`; + public toString(event = "created"): string { + let out = `SourceMap ${event}: lines ${this.lines.length}, vars ${this.variablesByC.size}\n`; this.lines.forEach(e => { out += e.toString() + "\n"; @@ -279,10 +460,3 @@ export class SourceMap { } } - -function fileNameCompare(fileNameOne: string, fileNameTwo: string): boolean { - if(process.platform === "win32") - return fileNameOne.toUpperCase() === fileNameTwo.toUpperCase(); - else - return fileNameOne === fileNameTwo; -} diff --git a/src/parser.mi2.ts b/src/parser.mi2.ts index 876005c..fbf7ddc 100644 --- a/src/parser.mi2.ts +++ b/src/parser.mi2.ts @@ -42,7 +42,7 @@ function parseString(str: string): string { bufIndex += ret.write('\v', bufIndex); else if (str[i] == '0') bufIndex += ret.write('\0', bufIndex); - else if (m = octalMatch.exec(str.substr(i))) { + else if (m = octalMatch.exec(str.substring(i))) { ret.writeUInt8(parseInt(m[0], 8), bufIndex++); i += 2; } else @@ -60,10 +60,15 @@ function parseString(str: string): string { return ret.slice(0, bufIndex).toString("utf8"); } +export type ResultRecords = { + resultClass: string; + results: [string, unknown][] +} + export class MINode implements MIInfo { token: number; outOfBandRecord: { isStream: boolean, type: string, asyncClass: string, output: [string, any][], content: string }[]; - resultRecords: { resultClass: string, results: [string, any][] }; + resultRecords: ResultRecords; constructor(token: number, info: { isStream: boolean, type: string, asyncClass: string, output: [string, any][], content: string }[], result: { resultClass: string, results: [string, any][] }) { this.token = token; @@ -95,7 +100,7 @@ export class MINode implements MIInfo { do { let target = pathRegex.exec(path); if (target) { - path = path.substr(target[0].length); + path = path.substring(target[0].length); if (current.length && typeof current != "string") { const found = []; for (const element of current) { @@ -111,11 +116,11 @@ export class MINode implements MIInfo { } else return undefined; } else if (path[0] == '@') { current = [current]; - path = path.substr(1); + path = path.substring(1); } else { target = indexRegex.exec(path); if (target) { - path = path.substr(target[0].length); + path = path.substring(target[0].length); const i = parseInt(target[1]); if (current.length && typeof current != "string" && i >= 0 && i < current.length) { current = current[i]; @@ -166,7 +171,7 @@ export function parseMI(output: string): MINode { return ""; let stringEnd = 1; let inString = true; - let remaining = output.substr(1); + let remaining = output.substring(1); let escaped = false; while (inString) { if (escaped) @@ -176,16 +181,16 @@ export function parseMI(output: string): MINode { else if (remaining[0] == '"') inString = false; - remaining = remaining.substr(1); + remaining = remaining.substring(1); stringEnd++; } let str; try { - str = parseString(output.substr(0, stringEnd)); + str = parseString(output.substring(0, stringEnd)); } catch (e) { - str = output.substr(0, stringEnd); + str = output.substring(0, stringEnd); } - output = output.substr(stringEnd); + output = output.substring(stringEnd); return str; }; @@ -196,9 +201,9 @@ export function parseMI(output: string): MINode { return undefined; const oldContent = output; const canBeValueList = output[0] == '['; - output = output.substr(1); + output = output.substring(1); if (output[0] == '}' || output[0] == ']') { - output = output.substr(1); // ] or } + output = output.substring(1); // ] or } return []; } if (canBeValueList) { @@ -209,7 +214,7 @@ export function parseMI(output: string): MINode { const remaining = output; while ((value = parseCommaValue()) !== undefined) values.push(value); - output = output.substr(1); // ] + output = output.substring(1); // ] return values; } } @@ -219,7 +224,7 @@ export function parseMI(output: string): MINode { results.push(result); while (result = parseCommaResult()) results.push(result); - output = output.substr(1); // } + output = output.substring(1); // } return results; } output = (canBeValueList ? '[' : '{') + output; @@ -239,7 +244,7 @@ export function parseMI(output: string): MINode { const variableMatch = variableRegex.exec(output); if (!variableMatch) return undefined; - output = output.substr(variableMatch[0].length + 1); + output = output.substring(variableMatch[0].length + 1); const variable = variableMatch[1]; return [variable, parseValue()]; }; @@ -247,28 +252,28 @@ export function parseMI(output: string): MINode { parseCommaValue = () => { if (output[0] != ',') return undefined; - output = output.substr(1); + output = output.substring(1); return parseValue(); }; parseCommaResult = () => { if (output[0] != ',') return undefined; - output = output.substr(1); + output = output.substring(1); return parseResult(); }; let match = undefined; while (match = outOfBandRecordRegex.exec(output)) { - output = output.substr(match[0].length); + output = output.substring(match[0].length); if (match[1] && token === undefined && match[1] !== "undefined") { token = parseInt(match[1]); } if (match[2]) { const classMatch = asyncClassRegex.exec(output); - output = output.substr(classMatch[1].length); + output = output.substring(classMatch[1].length); const asyncRecord = { isStream: false, type: asyncRecordType[match[2]], @@ -292,7 +297,7 @@ export function parseMI(output: string): MINode { } if (match = resultRecordRegex.exec(output)) { - output = output.substr(match[0].length); + output = output.substring(match[0].length); if (match[1] && token === undefined) { token = parseInt(match[1]); } diff --git a/src/settings.ts b/src/settings.ts index 39e9099..55b66bd 100644 --- a/src/settings.ts +++ b/src/settings.ts @@ -1,46 +1,29 @@ import * as vscode from 'vscode'; export class DebuggerSettings { - private readonly extensionSettings: vscode.WorkspaceConfiguration; + private readonly debugSettings: vscode.WorkspaceConfiguration; constructor() { - this.extensionSettings = vscode.workspace.getConfiguration("Cobol_Debugger"); - } - - private getWithFallback(settings: vscode.WorkspaceConfiguration, section: string): T { - const info: any = settings.inspect(section); - if (info.workspaceFolderValue !== undefined) { - return info.workspaceFolderValue; - } else if (info.workspaceValue !== undefined) { - return info.workspaceValue; - } else if (info.globalValue !== undefined) { - return info.globalValue; + this.debugSettings = vscode.workspace.getConfiguration("superbol.debugger"); + if (!this.debugSettings.has("gdbPath")) { + this.debugSettings = vscode.workspace.getConfiguration("superbol-vscode-debug"); } - return info.defaultValue; } public get displayVariableAttributes(): boolean { - return this.getWithFallback(this.extensionSettings, "display_variable_attributes"); - } - - public get cwd(): string { - return this.getWithFallback(this.extensionSettings, "cwd"); - } - - public get target(): string { - return this.getWithFallback(this.extensionSettings, "target"); + return this.debugSettings.get("displayVariableAttributes"); } - public get gdbpath(): string { - return this.getWithFallback(this.extensionSettings, "gdbpath"); + public get gdbPath(): string { + return this.debugSettings.get("gdbPath"); } - public get cobcpath(): string { - return this.getWithFallback(this.extensionSettings, "cobcpath"); + public get libcobPath(): string { + return this.debugSettings.get("libcobPath"); } - public get gdbtty(): string { - return this.getWithFallback(this.extensionSettings, "gdbtty"); + public get cobcrunPath(): string { + return this.debugSettings.get("cobcrunPath"); } } diff --git a/test/resources/distinct-sources/c/subsubsample.c b/test/resources/distinct-sources/c/subsubsample.c new file mode 100644 index 0000000..6356571 --- /dev/null +++ b/test/resources/distinct-sources/c/subsubsample.c @@ -0,0 +1,232 @@ +/* Generated by cobc 3.2.0 */ +/* Generated from distinct-sources/cbl/subsubsample.cbl */ +/* Generated at Nov 27 2025 11:03:15 */ +/* GnuCOBOL build date Sep 23 2025 17:57:37 */ +/* GnuCOBOL package date Jul 28 2023 17:02:56 UTC */ +/* Compile command cobc -x -g -save-temps=distinct-sources/c distinct-sources/cbl/subsubsample.cbl */ + +#include /* for memcpy, memcmp and friends */ +#define COB_KEYWORD_INLINE __inline +#include + +#define COB_SOURCE_FILE "distinct-sources/cbl/subsubsample.cbl" +#define COB_PACKAGE_VERSION "3.2" +#define COB_PATCH_LEVEL 0 +#define COB_MODULE_FORMATTED_DATE "Nov 27 2025 11:03:15" +#define COB_MODULE_DATE 20251127 +#define COB_MODULE_TIME 110315 + +/* Global variables */ +#include "subsubsample.c.h" + +/* Function prototypes */ + +static int subsubsample (); +static int subsubsample_ (const int); +static void subsubsample_module_init (cob_module *module); + +/* Main function */ +int +main (int argc, char **argv) +{ + cob_init (argc, argv); + cob_stop_run (subsubsample ()); +} + +/* Functions */ + +static void gc_module_so_init () __attribute__ ((constructor)); +static void gc_module_so_init () +{ + cob_check_version (COB_SOURCE_FILE, COB_PACKAGE_VERSION, COB_PATCH_LEVEL); +} + +/* PROGRAM-ID 'subsubsample' */ + +/* ENTRY 'subsubsample' */ + +static int +subsubsample () +{ + return subsubsample_ (0); +} + +static int +subsubsample_ (const int entry) +{ + /* Program local variables */ + #include "subsubsample.c.l.h" + + /* Start of function code */ + + /* CANCEL callback */ + if (unlikely(entry < 0)) { + if (entry == -10) + goto P_dump; + if (entry == -20) + goto P_clear_decimal; + goto P_cancel; + } + + /* Check initialized, check module allocated, */ + /* set global pointer, */ + /* push module stack, save call parameter count */ + if (cob_module_global_enter (&module, &cob_glob_ptr, 0, entry, 0)) + return -1; + + /* Set address of module parameter list */ + module->cob_procedure_params = cob_procedure_params; + + /* Set frame stack pointer */ + frame_ptr = frame_stack; + frame_ptr->perform_through = 0; + frame_ptr->return_address_ptr = &&P_cgerror; + frame_overflow = frame_ptr + 255 - 1; + + /* Initialize rest of program */ + if (unlikely(initialized == 0)) { + goto P_initialize; + } + P_ret_initialize: + + /* Increment module active */ + module->module_active++; + + /* Entry dispatch */ + goto l_2; + + /* PROCEDURE DIVISION */ + + /* Line: 13 : Entry subsubsample : distinct-sources/cbl/subsubsample.cbl */ + l_2:; +#line 13 "distinct-sources/cbl/subsubsample.cbl" + ENTRY_SUBSUBSAMPLE: cob_nop (); +#line 105 "subsubsample.c" + + /* Line: 13 : DISPLAY : distinct-sources/cbl/subsubsample.cbl */ +#line 13 "distinct-sources/cbl/subsubsample.cbl" + cob_nop (); +#line 110 "subsubsample.c" + cob_display (0, 1, 1, &f_22); + + /* Program exit */ + + exit_program: + + /* Decrement module active count */ + if (module->module_active) { + module->module_active--; + } + + /* Pop module stack */ + cob_module_leave (module); + + /* Program return */ + return b_2; + P_cgerror: + cob_fatal_error (COB_FERROR_CODEGEN); + + + /* Program initialization */ + P_initialize: + + cob_module_path = cob_glob_ptr->cob_main_argv0; + + subsubsample_module_init (module); + + module->collating_sequence = NULL; + module->crt_status = NULL; + module->cursor_pos = NULL; + module->xml_code = NULL; + module->xml_event = NULL; + module->xml_information = NULL; + module->xml_namespace = NULL; + module->xml_namespace_prefix = NULL; + module->xml_nnamespace = NULL; + module->xml_nnamespace_prefix = NULL; + module->xml_ntext = NULL; + module->xml_text = NULL; + module->json_code = NULL; + module->json_status = NULL; + + /* Initialize cancel callback */ + cob_set_cancel (module); + + /* Initialize WORKING-STORAGE */ + /* initialize field RETURN-CODE */ + b_2 = 0; + + /* initialize field WS-GROUP-NUMERIC */ +#line 7 "distinct-sources/cbl/subsubsample.cbl" + cob_nop (); +#line 163 "subsubsample.c" + memset (b_17, (unsigned char)'0', 12); + /* initialize field WS-GROUP-ALPHABETIC */ +#line 10 "distinct-sources/cbl/subsubsample.cbl" + cob_nop (); +#line 168 "subsubsample.c" + memset (b_17 + 12, (unsigned char)' ', 11); + + + if (0 == 1) goto P_cgerror; + initialized = 1; + goto P_ret_initialize; + + P_dump: + return 0; + + + /* CANCEL callback handling */ + P_cancel: + + if (!initialized) + return 0; + if (module && module->module_active) + cob_fatal_error (COB_FERROR_CANCEL); + + initialized = 0; + + P_clear_decimal: + return 0; + +} + +/* End PROGRAM-ID 'subsubsample' */ + +/* Initialize module structure for subsubsample */ +static void subsubsample_module_init (cob_module *module) +{ + module->module_name = "subsubsample"; + module->module_formatted_date = COB_MODULE_FORMATTED_DATE; + module->module_source = COB_SOURCE_FILE; + module->gc_version = COB_PACKAGE_VERSION; + module->module_entry.funcptr = (void *(*)())subsubsample; + module->module_cancel.funcptr = (void *(*)())subsubsample_; + module->module_ref_count = NULL; + module->module_path = &cob_module_path; + module->module_active = 0; + module->module_date = COB_MODULE_DATE; + module->module_time = COB_MODULE_TIME; + module->module_type = 0; + module->module_param_cnt = 0; + module->ebcdic_sign = 0; + module->decimal_point = '.'; + module->currency_symbol = '$'; + module->numeric_separator = ','; + module->flag_filename_mapping = 1; + module->flag_binary_truncate = 1; + module->flag_pretty_display = 1; + module->flag_host_sign = 0; + module->flag_no_phys_canc = 1; + module->flag_main = 1; + module->flag_fold_call = 0; + module->flag_exit_program = 0; + module->flag_debug_trace = 0; + module->flag_dump_ready = 0; + module->xml_mode = 1; + module->module_stmt = 0; + module->module_sources = NULL; +} + +/* End functions */ + diff --git a/test/resources/distinct-sources/c/subsubsample.c.h b/test/resources/distinct-sources/c/subsubsample.c.h new file mode 100644 index 0000000..53680ba --- /dev/null +++ b/test/resources/distinct-sources/c/subsubsample.c.h @@ -0,0 +1,21 @@ +/* Generated by cobc 3.2.0 */ +/* Generated from distinct-sources/cbl/subsubsample.cbl */ +/* Generated at Nov 27 2025 11:03:15 */ +/* GnuCOBOL build date Sep 23 2025 17:57:37 */ +/* GnuCOBOL package date Jul 28 2023 17:02:56 UTC */ +/* Compile command cobc -x -g -save-temps=distinct-sources/c distinct-sources/cbl/subsubsample.cbl */ + + +/* Module path */ +static const char *cob_module_path = NULL; + +/* Number of call parameters */ +static int cob_call_params = 0; + +/* Attributes */ + +static const cob_field_attr a_1 = {0x21, 0, 0, 0x0000, NULL}; + + +#define cob_nop if (!module) cob_nop + diff --git a/test/resources/distinct-sources/c/subsubsample.c.l.h b/test/resources/distinct-sources/c/subsubsample.c.l.h new file mode 100644 index 0000000..6564b87 --- /dev/null +++ b/test/resources/distinct-sources/c/subsubsample.c.l.h @@ -0,0 +1,49 @@ +/* Generated by cobc 3.2.0 */ +/* Generated from distinct-sources/cbl/subsubsample.cbl */ +/* Generated at Nov 27 2025 11:03:15 */ +/* GnuCOBOL build date Sep 23 2025 17:57:37 */ +/* GnuCOBOL package date Jul 28 2023 17:02:56 UTC */ +/* Compile command cobc -x -g -save-temps=distinct-sources/c distinct-sources/cbl/subsubsample.cbl */ + +/* Program local variables for 'subsubsample' */ + +/* Module initialization indicator */ +static unsigned int initialized = 0; + +/* Module structure pointer */ +static cob_module *module = NULL; + +/* Global variable pointer */ +cob_global *cob_glob_ptr; + + +/* LINKAGE SECTION (Items not referenced by USING clause) */ +static unsigned char *b_9 = NULL; /* XML-NAMESPACE */ +static unsigned char *b_10 = NULL; /* XML-NAMESPACE-PREFIX */ +static unsigned char *b_11 = NULL; /* XML-NNAMESPACE */ +static unsigned char *b_12 = NULL; /* XML-NNAMESPACE-PREFIX */ +static unsigned char *b_13 = NULL; /* XML-NTEXT */ +static unsigned char *b_14 = NULL; /* XML-TEXT */ + + +/* Call parameters */ +cob_field *cob_procedure_params[1]; + +/* Perform frame stack */ +struct cob_frame *frame_overflow; +struct cob_frame *frame_ptr; +struct cob_frame frame_stack[255]; + + +/* Data storage */ +static int b_2; /* RETURN-CODE */ +static cob_u8_t b_17[23] __attribute__((aligned)); /* WS-GROUP */ + +/* End of local data storage */ + + +/* Fields (local) */ +static cob_field f_22 = {5, b_17 + 18, &a_1}; /* WS-GROUP-ALPHANUMERIC */ + +/* End of fields */ + diff --git a/test/resources/distinct-sources/c/subsubsample.i b/test/resources/distinct-sources/c/subsubsample.i new file mode 100644 index 0000000..c8277bf --- /dev/null +++ b/test/resources/distinct-sources/c/subsubsample.i @@ -0,0 +1,15 @@ +#line 1 "distinct-sources/cbl/subsubsample.cbl" + IDENTIFICATION DIVISION. + PROGRAM-ID. subsubsample. + ENVIRONMENT DIVISION. + DATA DIVISION. + WORKING-STORAGE SECTION. + 01 WS-GROUP. + 05 WS-GROUP-NUMERIC PIC 9(2). + 05 WS-GROUP-SIGNED-DECIMAL PIC S9(3)V9(2). + 05 WS-GROUP-UNSIGNED-DECIMAL PIC 9(3)V9(2). + 05 WS-GROUP-ALPHABETIC PIC A(6). + 05 WS-GROUP-ALPHANUMERIC PIC X(5). + PROCEDURE DIVISION. + DISPLAY WS-GROUP-ALPHANUMERIC. + END PROGRAM subsubsample. diff --git a/test/resources/distinct-sources/c/subsubsample.o b/test/resources/distinct-sources/c/subsubsample.o new file mode 100644 index 0000000..01687d8 Binary files /dev/null and b/test/resources/distinct-sources/c/subsubsample.o differ diff --git a/test/resources/distinct-sources/cbl/subsubsample.cbl b/test/resources/distinct-sources/cbl/subsubsample.cbl new file mode 100644 index 0000000..b831948 --- /dev/null +++ b/test/resources/distinct-sources/cbl/subsubsample.cbl @@ -0,0 +1,14 @@ + IDENTIFICATION DIVISION. + PROGRAM-ID. subsubsample. + ENVIRONMENT DIVISION. + DATA DIVISION. + WORKING-STORAGE SECTION. + 01 WS-GROUP. + 05 WS-GROUP-NUMERIC PIC 9(2). + 05 WS-GROUP-SIGNED-DECIMAL PIC S9(3)V9(2). + 05 WS-GROUP-UNSIGNED-DECIMAL PIC 9(3)V9(2). + 05 WS-GROUP-ALPHABETIC PIC A(6). + 05 WS-GROUP-ALPHANUMERIC PIC X(5). + PROCEDURE DIVISION. + DISPLAY WS-GROUP-ALPHANUMERIC. + END PROGRAM subsubsample. diff --git a/test/resources/globals.c b/test/resources/globals.c new file mode 100644 index 0000000..c3bfcd0 --- /dev/null +++ b/test/resources/globals.c @@ -0,0 +1,310 @@ +/* Generated by cobc 3.2.0 */ +/* Generated from globals.cbl */ +/* Generated at Dec 09 2025 15:02:41 */ +/* GnuCOBOL build date Sep 23 2025 17:57:37 */ +/* GnuCOBOL package date Jul 28 2023 17:02:56 UTC */ +/* Compile command cobc -x -g globals.cbl */ + +#include /* for memcpy, memcmp and friends */ +#define COB_KEYWORD_INLINE __inline +#include + +#define COB_SOURCE_FILE "globals.cbl" +#define COB_PACKAGE_VERSION "3.2" +#define COB_PATCH_LEVEL 0 +#define COB_MODULE_FORMATTED_DATE "Dec 09 2025 15:02:41" +#define COB_MODULE_DATE 20251209 +#define COB_MODULE_TIME 150241 + +/* Global variables */ +#include "globals.c.h" + +/* Function prototypes */ + +static int globals (); +static int globals_ (const int); +static void globals_module_init (cob_module *module); + +/* Main function */ +int +main (int argc, char **argv) +{ + cob_init (argc, argv); + cob_stop_run (globals ()); +} + +/* Functions */ + +static void gc_module_so_init () __attribute__ ((constructor)); +static void gc_module_so_init () +{ + cob_check_version (COB_SOURCE_FILE, COB_PACKAGE_VERSION, COB_PATCH_LEVEL); +} + +/* PROGRAM-ID 'globals' */ + +/* ENTRY 'globals' */ + +static int +globals () +{ + return globals_ (0); +} + +static int +globals_ (const int entry) +{ + /* Program local variables */ + #include "globals.c.l.h" + + /* Start of function code */ + + /* CANCEL callback */ + if (unlikely(entry < 0)) { + if (entry == -10) + goto P_dump; + if (entry == -20) + goto P_clear_decimal; + goto P_cancel; + } + + /* Check initialized, check module allocated, */ + /* set global pointer, */ + /* push module stack, save call parameter count */ + if (cob_module_global_enter (&module, &cob_glob_ptr, 0, entry, 0)) + return -1; + + /* Set address of module parameter list */ + module->cob_procedure_params = cob_procedure_params; + + /* Set frame stack pointer */ + frame_ptr = frame_stack; + frame_ptr->perform_through = 0; + frame_ptr->return_address_ptr = &&P_cgerror; + frame_overflow = frame_ptr + 255 - 1; + + /* Initialize rest of program */ + if (unlikely(initialized == 0)) { + goto P_initialize; + } + P_ret_initialize: + + /* Increment module active */ + module->module_active++; + + /* Entry dispatch */ + goto l_2; + + /* PROCEDURE DIVISION */ + + /* Line: 14 : Entry globals : globals.cbl */ + l_2:; +#line 14 "globals.cbl" + ENTRY_GLOBALS: cob_nop (); +#line 105 "globals.c" + + /* Line: 14 : MOVE : globals.cbl */ +#line 14 "globals.cbl" + cob_nop (); +#line 110 "globals.c" + *(b_18) = 51; + + /* Line: 15 : DISPLAY : globals.cbl */ +#line 15 "globals.cbl" + cob_nop (); +#line 116 "globals.c" + cob_display (0, 1, 1, &f_17); + + /* Line: 16 : DISPLAY : globals.cbl */ +#line 16 "globals.cbl" + cob_nop (); +#line 122 "globals.c" + cob_display (0, 1, 1, &f_23); + + /* Line: 17 : DISPLAY : globals.cbl */ +#line 17 "globals.cbl" + cob_nop (); +#line 128 "globals.c" + cob_display (0, 1, 1, &f_19); + + /* Line: 18 : DISPLAY : globals.cbl */ +#line 18 "globals.cbl" + cob_nop (); +#line 134 "globals.c" + cob_display (0, 1, 1, &f_20); + + /* Line: 19 : DISPLAY : globals.cbl */ +#line 19 "globals.cbl" + cob_nop (); +#line 140 "globals.c" + cob_display (0, 1, 1, &f_22); + + /* Line: 20 : DISPLAY : globals.cbl */ +#line 20 "globals.cbl" + cob_nop (); +#line 146 "globals.c" + cob_display (0, 1, 1, &f_24); + + /* Line: 21 : CALL : globals.cbl */ +#line 21 "globals.cbl" + cob_nop (); +#line 152 "globals.c" + cob_glob_ptr->cob_call_params = 0; + cob_glob_ptr->cob_stmt_exception = 0; + if (unlikely((cob_glob_ptr->cob_exception_code & 0x0b00) == 0x0b00)) cob_glob_ptr->cob_exception_code = 0; + if (unlikely(call_globals2.funcvoid == NULL || cob_glob_ptr->cob_physical_cancel == 1)) + { + call_globals2.funcvoid = cob_resolve_cobol ("globals2", 0, 1); + } + b_2 = ((int (*)(void))call_globals2.funcint) (); + + /* Line: 22 : GOBACK : globals.cbl */ +#line 22 "globals.cbl" + cob_nop (); +#line 165 "globals.c" + goto exit_program; + + /* Program exit */ + + exit_program: + + /* Decrement module active count */ + if (module->module_active) { + module->module_active--; + } + + /* Pop module stack */ + cob_module_leave (module); + + /* Program return */ + return b_2; + P_cgerror: + cob_fatal_error (COB_FERROR_CODEGEN); + + + /* Program initialization */ + P_initialize: + + cob_module_path = cob_glob_ptr->cob_main_argv0; + + globals_module_init (module); + + module->collating_sequence = NULL; + module->crt_status = NULL; + module->cursor_pos = NULL; + module->xml_code = NULL; + module->xml_event = NULL; + module->xml_information = NULL; + module->xml_namespace = NULL; + module->xml_namespace_prefix = NULL; + module->xml_nnamespace = NULL; + module->xml_nnamespace_prefix = NULL; + module->xml_ntext = NULL; + module->xml_text = NULL; + module->json_code = NULL; + module->json_status = NULL; + + /* Initialize cancel callback */ + cob_set_cancel (module); + + /* Initialize WORKING-STORAGE */ + /* initialize field RETURN-CODE */ + b_2 = 0; + + /* initialize field FOO */ +#line 5 "globals.cbl" + cob_nop (); +#line 218 "globals.c" + memset (b_17, (unsigned char)'0', 3); + + /* initialize field BAR-1 */ +#line 7 "globals.cbl" + cob_nop (); +#line 224 "globals.c" + *(cob_u8_ptr)(b_18) = (unsigned char)'0'; + /* initialize field BAR-2 */ +#line 8 "globals.cbl" + cob_nop (); +#line 229 "globals.c" + memset (b_18 + 1, (unsigned char)' ', 3); + + /* initialize field BAZ-1 */ +#line 10 "globals.cbl" + cob_nop (); +#line 235 "globals.c" + *(cob_u8_ptr)(b_21) = (unsigned char)' '; + /* initialize field BAZ-2 */ +#line 11 "globals.cbl" + cob_nop (); +#line 240 "globals.c" + memset (b_21 + 1, 0x0, 2); + + /* initialize field FXX */ +#line 12 "globals.cbl" + cob_nop (); +#line 246 "globals.c" + memset (b_24, (unsigned char)'0', 3); + + + if (0 == 1) goto P_cgerror; + initialized = 1; + goto P_ret_initialize; + + P_dump: + return 0; + + + /* CANCEL callback handling */ + P_cancel: + + if (!initialized) + return 0; + if (module && module->module_active) + cob_fatal_error (COB_FERROR_CANCEL); + + initialized = 0; + + P_clear_decimal: + return 0; + +} + +/* End PROGRAM-ID 'globals' */ + +/* Initialize module structure for globals */ +static void globals_module_init (cob_module *module) +{ + module->module_name = "globals"; + module->module_formatted_date = COB_MODULE_FORMATTED_DATE; + module->module_source = COB_SOURCE_FILE; + module->gc_version = COB_PACKAGE_VERSION; + module->module_entry.funcptr = (void *(*)())globals; + module->module_cancel.funcptr = (void *(*)())globals_; + module->module_ref_count = NULL; + module->module_path = &cob_module_path; + module->module_active = 0; + module->module_date = COB_MODULE_DATE; + module->module_time = COB_MODULE_TIME; + module->module_type = 0; + module->module_param_cnt = 0; + module->ebcdic_sign = 0; + module->decimal_point = '.'; + module->currency_symbol = '$'; + module->numeric_separator = ','; + module->flag_filename_mapping = 1; + module->flag_binary_truncate = 1; + module->flag_pretty_display = 1; + module->flag_host_sign = 0; + module->flag_no_phys_canc = 1; + module->flag_main = 1; + module->flag_fold_call = 0; + module->flag_exit_program = 0; + module->flag_debug_trace = 0; + module->flag_dump_ready = 0; + module->xml_mode = 1; + module->module_stmt = 0; + module->module_sources = NULL; +} + +/* End functions */ + diff --git a/test/resources/globals.c.h b/test/resources/globals.c.h new file mode 100644 index 0000000..b970dee --- /dev/null +++ b/test/resources/globals.c.h @@ -0,0 +1,43 @@ +/* Generated by cobc 3.2.0 */ +/* Generated from globals.cbl */ +/* Generated at Dec 09 2025 15:02:41 */ +/* GnuCOBOL build date Sep 23 2025 17:57:37 */ +/* GnuCOBOL package date Jul 28 2023 17:02:56 UTC */ +/* Compile command cobc -x -g globals.cbl */ + + +/* Module path */ +static const char *cob_module_path = NULL; + +/* Number of call parameters */ +static int cob_call_params = 0; + +/* Data storage */ + +/* PROGRAM-ID : globals */ +static cob_u8_t b_17[3] __attribute__((aligned)); /* FOO */ +static cob_u8_t b_18[4] __attribute__((aligned)); /* BAR */ + +/* End of data storage */ + + +/* Attributes */ + +static const cob_field_attr a_1 = {0x10, 3, 0, 0x0000, NULL}; +static const cob_field_attr a_2 = {0x11, 4, 0, 0x0041, NULL}; +static const cob_field_attr a_3 = {0x10, 1, 0, 0x0000, NULL}; +static const cob_field_attr a_4 = {0x21, 0, 0, 0x0000, NULL}; + + +/* Fields */ + +/* PROGRAM-ID : globals */ +static cob_field f_17 = {3, b_17, &a_1}; /* FOO */ +static cob_field f_19 = {1, b_18, &a_3}; /* BAR-1 */ +static cob_field f_20 = {3, b_18 + 1, &a_4}; /* BAR-2 */ + +/* End of fields */ + + +#define cob_nop if (!module) cob_nop + diff --git a/test/resources/globals.c.l.h b/test/resources/globals.c.l.h new file mode 100644 index 0000000..aa2b927 --- /dev/null +++ b/test/resources/globals.c.l.h @@ -0,0 +1,55 @@ +/* Generated by cobc 3.2.0 */ +/* Generated from globals.cbl */ +/* Generated at Dec 09 2025 15:02:41 */ +/* GnuCOBOL build date Sep 23 2025 17:57:37 */ +/* GnuCOBOL package date Jul 28 2023 17:02:56 UTC */ +/* Compile command cobc -x -g globals.cbl */ + +/* Program local variables for 'globals' */ + +/* Module initialization indicator */ +static unsigned int initialized = 0; + +/* Module structure pointer */ +static cob_module *module = NULL; + +/* Global variable pointer */ +cob_global *cob_glob_ptr; + + +/* LINKAGE SECTION (Items not referenced by USING clause) */ +static unsigned char *b_9 = NULL; /* XML-NAMESPACE */ +static unsigned char *b_10 = NULL; /* XML-NAMESPACE-PREFIX */ +static unsigned char *b_11 = NULL; /* XML-NNAMESPACE */ +static unsigned char *b_12 = NULL; /* XML-NNAMESPACE-PREFIX */ +static unsigned char *b_13 = NULL; /* XML-NTEXT */ +static unsigned char *b_14 = NULL; /* XML-TEXT */ + + +/* Call pointers */ +static cob_call_union call_globals2; + +/* Call parameters */ +cob_field *cob_procedure_params[1]; + +/* Perform frame stack */ +struct cob_frame *frame_overflow; +struct cob_frame *frame_ptr; +struct cob_frame frame_stack[255]; + + +/* Data storage */ +static int b_2; /* RETURN-CODE */ +static cob_u8_t b_21[3] __attribute__((aligned)); /* BAZ */ +static cob_u8_t b_24[3] __attribute__((aligned)); /* FXX */ + +/* End of local data storage */ + + +/* Fields (local) */ +static cob_field f_22 = {1, b_21, &a_4}; /* BAZ-1 */ +static cob_field f_23 = {2, b_21 + 1, &a_2}; /* BAZ-2 */ +static cob_field f_24 = {3, b_24, &a_1}; /* FXX */ + +/* End of fields */ + diff --git a/test/resources/globals.cbl b/test/resources/globals.cbl new file mode 100644 index 0000000..1369f6b --- /dev/null +++ b/test/resources/globals.cbl @@ -0,0 +1,22 @@ + IDENTIFICATION DIVISION. + PROGRAM-ID. globals. + DATA DIVISION. + WORKING-STORAGE SECTION. + 77 FOO PIC 999 GLOBAL. + 01 BAR GLOBAL. + 02 BAR-1 PIC 9. + 02 BAR-2 PIC XXX. + 01 BAZ. + 02 BAZ-1 PIC X. + 02 BAZ-2 BINARY-SHORT. + 77 FXX PIC 999. + PROCEDURE DIVISION. + MOVE 3 TO BAR-1 + DISPLAY FOO + DISPLAY BAZ-2 + DISPLAY BAR-1 + DISPLAY BAR-2 + DISPLAY BAZ-1 + DISPLAY FXX + CALL "globals2" + GOBACK. diff --git a/test/resources/globals.i b/test/resources/globals.i new file mode 100644 index 0000000..4fae0f7 --- /dev/null +++ b/test/resources/globals.i @@ -0,0 +1,23 @@ +#line 1 "globals.cbl" + IDENTIFICATION DIVISION. + PROGRAM-ID. globals. + DATA DIVISION. + WORKING-STORAGE SECTION. + 77 FOO PIC 999 GLOBAL. + 01 BAR GLOBAL. + 02 BAR-1 PIC 9. + 02 BAR-2 PIC XXX. + 01 BAZ. + 02 BAZ-1 PIC X. + 02 BAZ-2 BINARY-SHORT. + 77 FXX PIC 999. + PROCEDURE DIVISION. + MOVE 3 TO BAR-1 + DISPLAY FOO + DISPLAY BAZ-2 + DISPLAY BAR-1 + DISPLAY BAR-2 + DISPLAY BAZ-1 + DISPLAY FXX + CALL "globals2" + GOBACK. diff --git a/test/resources/globals2.c b/test/resources/globals2.c new file mode 100644 index 0000000..c48567d --- /dev/null +++ b/test/resources/globals2.c @@ -0,0 +1,232 @@ +/* Generated by cobc 3.2.0 */ +/* Generated from globals2.cbl */ +/* Generated at Dec 09 2025 15:02:39 */ +/* GnuCOBOL build date Sep 23 2025 17:57:37 */ +/* GnuCOBOL package date Jul 28 2023 17:02:56 UTC */ +/* Compile command cobc -m -g globals2.cbl */ + +#include /* for memcpy, memcmp and friends */ +#define COB_KEYWORD_INLINE __inline +#include + +#define COB_SOURCE_FILE "globals2.cbl" +#define COB_PACKAGE_VERSION "3.2" +#define COB_PATCH_LEVEL 0 +#define COB_MODULE_FORMATTED_DATE "Dec 09 2025 15:02:39" +#define COB_MODULE_DATE 20251209 +#define COB_MODULE_TIME 150239 + +/* Global variables */ +#include "globals2.c.h" + +/* Function prototypes */ + +COB_EXT_EXPORT int globals2 (void); +static int globals2_ (const int); +static void globals2_module_init (cob_module *module); + +/* Functions */ + +static void gc_module_so_init () __attribute__ ((constructor)); +static void gc_module_so_init () +{ + cob_check_version (COB_SOURCE_FILE, COB_PACKAGE_VERSION, COB_PATCH_LEVEL); +} + +/* PROGRAM-ID 'globals2' */ + +/* ENTRY 'globals2' */ + +int +globals2 () +{ + return globals2_ (0); +} + +static int +globals2_ (const int entry) +{ + /* Program local variables */ + #include "globals2.c.l.h" + + /* Start of function code */ + + /* CANCEL callback */ + if (unlikely(entry < 0)) { + if (entry == -10) + goto P_dump; + if (entry == -20) + goto P_clear_decimal; + goto P_cancel; + } + + /* Check initialized, check module allocated, */ + /* set global pointer, */ + /* push module stack, save call parameter count */ + if (cob_module_global_enter (&module, &cob_glob_ptr, 0, entry, 0)) + return -1; + + /* Set address of module parameter list */ + module->cob_procedure_params = cob_procedure_params; + + /* Set frame stack pointer */ + frame_ptr = frame_stack; + frame_ptr->perform_through = 0; + frame_ptr->return_address_ptr = &&P_cgerror; + frame_overflow = frame_ptr + 255 - 1; + + /* Initialize rest of program */ + if (unlikely(initialized == 0)) { + goto P_initialize; + } + P_ret_initialize: + + /* Increment module active */ + module->module_active++; + + /* Entry dispatch */ + goto l_2; + + /* PROCEDURE DIVISION */ + + /* Line: 7 : Entry globals2 : globals2.cbl */ + l_2:; +#line 7 "globals2.cbl" + ENTRY_GLOBALS2: cob_nop (); +#line 97 "globals2.c" + + /* Line: 7 : MOVE : globals2.cbl */ +#line 7 "globals2.cbl" + cob_nop (); +#line 102 "globals2.c" + memcpy (b_17, "042", 3); + + /* Line: 8 : DISPLAY : globals2.cbl */ +#line 8 "globals2.cbl" + cob_nop (); +#line 108 "globals2.c" + cob_display (0, 1, 1, &f_17); + + /* Line: 9 : GOBACK : globals2.cbl */ +#line 9 "globals2.cbl" + cob_nop (); +#line 114 "globals2.c" + goto exit_program; + + /* Program exit */ + + exit_program: + + /* Decrement module active count */ + if (module->module_active) { + module->module_active--; + } + + /* Pop module stack */ + cob_module_leave (module); + + /* Program return */ + return b_2; + P_cgerror: + cob_fatal_error (COB_FERROR_CODEGEN); + + + /* Program initialization */ + P_initialize: + + globals2_module_init (module); + + module->collating_sequence = NULL; + module->crt_status = NULL; + module->cursor_pos = NULL; + module->xml_code = NULL; + module->xml_event = NULL; + module->xml_information = NULL; + module->xml_namespace = NULL; + module->xml_namespace_prefix = NULL; + module->xml_nnamespace = NULL; + module->xml_nnamespace_prefix = NULL; + module->xml_ntext = NULL; + module->xml_text = NULL; + module->json_code = NULL; + module->json_status = NULL; + + /* Initialize cancel callback */ + cob_set_cancel (module); + + /* Initialize WORKING-STORAGE */ + /* initialize field RETURN-CODE */ + b_2 = 0; + + /* initialize field FOO */ +#line 5 "globals2.cbl" + cob_nop (); +#line 165 "globals2.c" + memset (b_17, (unsigned char)'0', 3); + + + if (0 == 1) goto P_cgerror; + initialized = 1; + goto P_ret_initialize; + + P_dump: + return 0; + + + /* CANCEL callback handling */ + P_cancel: + + if (!initialized) + return 0; + if (module && module->module_active) + cob_fatal_error (COB_FERROR_CANCEL); + + b_2 = 0; + cob_module_free (&module); + + initialized = 0; + + P_clear_decimal: + return 0; + +} + +/* End PROGRAM-ID 'globals2' */ + +/* Initialize module structure for globals2 */ +static void globals2_module_init (cob_module *module) +{ + module->module_name = "globals2"; + module->module_formatted_date = COB_MODULE_FORMATTED_DATE; + module->module_source = COB_SOURCE_FILE; + module->gc_version = COB_PACKAGE_VERSION; + module->module_entry.funcptr = (void *(*)())globals2; + module->module_cancel.funcptr = (void *(*)())globals2_; + module->module_ref_count = NULL; + module->module_path = &cob_module_path; + module->module_active = 0; + module->module_date = COB_MODULE_DATE; + module->module_time = COB_MODULE_TIME; + module->module_type = 0; + module->module_param_cnt = 0; + module->ebcdic_sign = 0; + module->decimal_point = '.'; + module->currency_symbol = '$'; + module->numeric_separator = ','; + module->flag_filename_mapping = 1; + module->flag_binary_truncate = 1; + module->flag_pretty_display = 1; + module->flag_host_sign = 0; + module->flag_no_phys_canc = 0; + module->flag_main = 0; + module->flag_fold_call = 0; + module->flag_exit_program = 0; + module->flag_debug_trace = 0; + module->flag_dump_ready = 0; + module->xml_mode = 1; + module->module_stmt = 0; + module->module_sources = NULL; +} + +/* End functions */ + diff --git a/test/resources/globals2.c.h b/test/resources/globals2.c.h new file mode 100644 index 0000000..af71219 --- /dev/null +++ b/test/resources/globals2.c.h @@ -0,0 +1,37 @@ +/* Generated by cobc 3.2.0 */ +/* Generated from globals2.cbl */ +/* Generated at Dec 09 2025 15:02:39 */ +/* GnuCOBOL build date Sep 23 2025 17:57:37 */ +/* GnuCOBOL package date Jul 28 2023 17:02:56 UTC */ +/* Compile command cobc -m -g globals2.cbl */ + + +/* Module path */ +static const char *cob_module_path = NULL; + +/* Number of call parameters */ +static int cob_call_params = 0; + +/* Data storage */ + +/* PROGRAM-ID : globals2 */ +static cob_u8_t b_17[3] __attribute__((aligned)); /* FOO */ + +/* End of data storage */ + + +/* Attributes */ + +static const cob_field_attr a_1 = {0x10, 3, 0, 0x0000, NULL}; + + +/* Fields */ + +/* PROGRAM-ID : globals2 */ +static cob_field f_17 = {3, b_17, &a_1}; /* FOO */ + +/* End of fields */ + + +#define cob_nop if (!module) cob_nop + diff --git a/test/resources/globals2.c.l.h b/test/resources/globals2.c.l.h new file mode 100644 index 0000000..4c4c6b5 --- /dev/null +++ b/test/resources/globals2.c.l.h @@ -0,0 +1,42 @@ +/* Generated by cobc 3.2.0 */ +/* Generated from globals2.cbl */ +/* Generated at Dec 09 2025 15:02:39 */ +/* GnuCOBOL build date Sep 23 2025 17:57:37 */ +/* GnuCOBOL package date Jul 28 2023 17:02:56 UTC */ +/* Compile command cobc -m -g globals2.cbl */ + +/* Program local variables for 'globals2' */ + +/* Module initialization indicator */ +static unsigned int initialized = 0; + +/* Module structure pointer */ +static cob_module *module = NULL; + +/* Global variable pointer */ +cob_global *cob_glob_ptr; + + +/* LINKAGE SECTION (Items not referenced by USING clause) */ +static unsigned char *b_9 = NULL; /* XML-NAMESPACE */ +static unsigned char *b_10 = NULL; /* XML-NAMESPACE-PREFIX */ +static unsigned char *b_11 = NULL; /* XML-NNAMESPACE */ +static unsigned char *b_12 = NULL; /* XML-NNAMESPACE-PREFIX */ +static unsigned char *b_13 = NULL; /* XML-NTEXT */ +static unsigned char *b_14 = NULL; /* XML-TEXT */ + + +/* Call parameters */ +cob_field *cob_procedure_params[1]; + +/* Perform frame stack */ +struct cob_frame *frame_overflow; +struct cob_frame *frame_ptr; +struct cob_frame frame_stack[255]; + + +/* Data storage */ +static int b_2; /* RETURN-CODE */ + +/* End of local data storage */ + diff --git a/test/resources/globals2.cbl b/test/resources/globals2.cbl new file mode 100644 index 0000000..725ea41 --- /dev/null +++ b/test/resources/globals2.cbl @@ -0,0 +1,9 @@ + IDENTIFICATION DIVISION. + PROGRAM-ID. globals2. + DATA DIVISION. + WORKING-STORAGE SECTION. + 77 FOO PIC 999 GLOBAL. + PROCEDURE DIVISION. + MOVE 42 TO FOO + DISPLAY FOO + GOBACK. diff --git a/test/resources/globals2.i b/test/resources/globals2.i new file mode 100644 index 0000000..22b7613 --- /dev/null +++ b/test/resources/globals2.i @@ -0,0 +1,10 @@ +#line 1 "globals2.cbl" + IDENTIFICATION DIVISION. + PROGRAM-ID. globals2. + DATA DIVISION. + WORKING-STORAGE SECTION. + 77 FOO PIC 999 GLOBAL. + PROCEDURE DIVISION. + MOVE 42 TO FOO + DISPLAY FOO + GOBACK. diff --git a/test/suite/functions.test.ts b/test/suite/functions.test.ts index 4805c71..a87999f 100644 --- a/test/suite/functions.test.ts +++ b/test/suite/functions.test.ts @@ -6,8 +6,8 @@ import { parseExpression, cleanRawValue } from '../../src/functions'; suite("Useful functions", () => { const cwd = nativePath.resolve(__dirname, '../../../test/resources'); const c = nativePath.resolve(cwd, 'petstore.c'); - const parsed = new SourceMap(cwd, [c]); - console.log(parsed.toString()); + const parsed = new SourceMap(cwd, [c], [cwd]); + //console.log(parsed.toString()); const functionName = "petstore_"; test("it can parse expressions", () => { diff --git a/test/suite/index.ts b/test/suite/index.ts deleted file mode 100644 index b1df30c..0000000 --- a/test/suite/index.ts +++ /dev/null @@ -1,37 +0,0 @@ -import * as path from 'path'; -import * as Mocha from 'mocha'; -import * as glob from 'glob'; - -export function run(): Promise { - // Create the mocha test - const mocha = new Mocha({ - ui: 'tdd' - }); - - const testsRoot = path.resolve(__dirname, '..'); - - return new Promise((c, e) => { - glob('**/**.test.js', { cwd: testsRoot }, (err, files) => { - if (err) { - return e(err); - } - - // Add files to the test suite - files.forEach(f => mocha.addFile(path.resolve(testsRoot, f))); - - try { - // Run the mocha test - mocha.run(failures => { - if (failures > 0) { - e(new Error(`${failures} tests failed.`)); - } else { - c(); - } - }); - } catch (err) { - console.error(err); - e(err); - } - }); - }); -} diff --git a/test/suite/mi2.test.ts b/test/suite/mi2.test.ts index 51bbc24..bfc66d9 100644 --- a/test/suite/mi2.test.ts +++ b/test/suite/mi2.test.ts @@ -26,6 +26,9 @@ suite("GDB output", () => { test("++", () => { assert.equal(true, couldBeOutput('++')); }); + test("+0000", () => { + assert.equal(true, couldBeOutput('+0000')); + }); test("GDB done", () => { assert.equal(false, couldBeOutput('2^done')); }); diff --git a/test/suite/parser.c.test.ts b/test/suite/parser.c.test.ts index 3f5a621..7124caf 100644 --- a/test/suite/parser.c.test.ts +++ b/test/suite/parser.c.test.ts @@ -6,13 +6,14 @@ suite("C code parse", () => { const cwd = nativePath.resolve(__dirname, '../../../test/resources'); test("Minimal", () => { const c = nativePath.resolve(cwd, 'hello.c'); - const cobol = '/home/olegs/projects/gnucobol-debug/test/resources/hello.cbl'; - const parsed = new SourceMap(cwd, [c]); + const cobol = nativePath.resolve(cwd, 'hello.cbl'); + const parsed = new SourceMap(cwd, [cobol]); assert.equal(3, parsed.getLinesCount()); assert.equal(3, parsed.getVariablesCount()); assert.equal('b_6', parsed.getVariableByCobol('hello_.MYVAR').cName); assert.equal('f_6', parsed.getVariableByCobol('hello_.MYVAR.MYVAR').cName); + assert.equal('hello_', parsed.getVariableByCobol('hello_.MYVAR').functionName); assert.equal('MYVAR', parsed.getVariableByC('hello_.b_6').cobolName); assert.equal('MYVAR', parsed.getVariableByC('hello_.f_6').cobolName); assert.equal(105, parsed.getLineC(cobol, 8).lineC); @@ -24,8 +25,8 @@ suite("C code parse", () => { }); test("GnuCOBOL 3.1.1", () => { const c = nativePath.resolve(cwd, 'hello3.c'); - const cobol = '/home/olegs/projects/gnucobol-debug/test/resources/hello3.cbl'; - const parsed = new SourceMap(cwd, [c]); + const cobol = nativePath.resolve(cwd, 'hello3.cbl'); + const parsed = new SourceMap(cwd, [cobol]); assert.equal(3, parsed.getLinesCount()); assert.equal(3, parsed.getVariablesCount()); @@ -44,10 +45,7 @@ suite("C code parse", () => { assert.equal('3.1.1.0', parsed.getVersion()); }); test("Compilation Group", () => { - const cSample = nativePath.resolve(cwd, 'sample.c'); - const cSubSample = nativePath.resolve(cwd, 'subsample.c'); - const cSubSubSample = nativePath.resolve(cwd, 'subsubsample.c'); - const parsed = new SourceMap(cwd, [cSample, cSubSample, cSubSubSample]); + const parsed = new SourceMap(cwd, ['sample.cbl', 'subsample.cbl', 'subsubsample.cbl']); assert.equal(7, parsed.getLinesCount()); assert.equal(14, parsed.getVariablesCount()); @@ -64,8 +62,7 @@ suite("C code parse", () => { assert.equal('2.2.0', parsed.getVersion()); }); test("Variables Hierarchy", () => { - const c = nativePath.resolve(cwd, 'petstore.c'); - const parsed = new SourceMap(cwd, [c]); + const parsed = new SourceMap(cwd, ['petstore.cbl']); assert.equal('b_14', parsed.getVariableByCobol('petstore_.WS-BILL').cName); assert.equal('f_15', parsed.getVariableByCobol('petstore_.WS-BILL.TOTAL-QUANTITY').cName); @@ -73,8 +70,7 @@ suite("C code parse", () => { assert.equal('TOTAL-QUANTITY', parsed.getVariableByC('petstore_.f_15').cobolName); }); test("Find variables by function and COBOL name", () => { - const c = nativePath.resolve(cwd, 'petstore.c'); - const parsed = new SourceMap(cwd, [c]); + const parsed = new SourceMap(cwd, ['petstore.cbl']); assert.equal('f_15', parsed.findVariableByCobol('petstore_', 'TOTAL-QUANTITY').cName); assert.equal('f_15', parsed.findVariableByCobol('petstore_', 'WS-BILL.TOTAL-QUANTITY').cName); @@ -84,8 +80,7 @@ suite("C code parse", () => { assert.equal('3.1-dev.0', parsed.getVersion()); }); test("Attributes", () => { - const c = nativePath.resolve(cwd, 'datatypes.c'); - const parsed = new SourceMap(cwd, [c]); + const parsed = new SourceMap(cwd, ['datatypes.cbl']); for (let variable of parsed.getVariablesByCobol()) { assert.notEqual(variable.attribute, null); @@ -107,8 +102,7 @@ suite("C code parse", () => { assert.equal('3.1-dev.0', parsed.getVersion()); }); test("Multiple Functions", () => { - const c = nativePath.resolve(cwd, 'func.c'); - const parsed = new SourceMap(cwd, [c]); + const parsed = new SourceMap(cwd, ['func.cbl']); const f_6 = parsed.getVariableByC('func_.f_6'); assert.equal('argA', f_6.cobolName); @@ -133,4 +127,47 @@ suite("C code parse", () => { assert.equal('2.2.0', parsed.getVersion()); }); + test("Split Sources", () => { + const srcDirs = nativePath.resolve(cwd, 'distinct-sources'); + const cDirs = nativePath.resolve(srcDirs, 'c'); + const cblDirs = nativePath.resolve(srcDirs, 'cbl'); + const parsed = new SourceMap(cwd, ['subsubsample.cbl'], [cDirs, cblDirs]); + + assert.equal(1, parsed.getLinesCount()); + assert.equal(3, parsed.getVariablesCount()); + + const alnumGroup = parsed.findVariableByCobol('subsubsample_', 'WS-GROUP-ALPHANUMERIC'); + assert.equal('WS-GROUP-ALPHANUMERIC', alnumGroup.cobolName); + + const alnumGroup_ = parsed.findVariableByC('subsubsample_', alnumGroup.cName); + assert.equal(alnumGroup_.cobolName, alnumGroup.cobolName); + assert.equal(alnumGroup_.rootFileC, alnumGroup.rootFileC); + }); + test("Globals", () => { + const parsed = new SourceMap(cwd, ['globals.cbl']); + assert.equal(9, parsed.getLinesCount()); + assert.equal(11, parsed.getVariablesCount()); + console.log(parsed.toString()); + + const fooVar = parsed.findGlobalByCobol('FOO'); + assert.ok(fooVar.cobolName.endsWith('FOO')); + assert.ok(parsed.findGlobalByC(fooVar.cName).cobolName.endsWith('FOO')); + const barVar = parsed.findGlobalByCobol('BAR'); + assert.equal(4, barVar.size); + const bar1Var = parsed.findGlobalByCobol('BAR.BAR-2'); + assert.equal(3, bar1Var.size); + assert.equal('alphanumeric', bar1Var.displayableType); + + parsed.addLib('globals2.so'); + assert.equal(12, parsed.getLinesCount()); + assert.equal(14, parsed.getVariablesCount()); + + const fooVar_ = parsed.findGlobalByCobol('FOO'); + assert.ok(parsed.findGlobalByC(fooVar_.cName).cobolName.endsWith('FOO')); + assert.notEqual(parsed.findGlobalByCobol('FOO', nativePath.join(cwd, 'globals.c.h')), + parsed.findGlobalByCobol('FOO', nativePath.join(cwd, 'globals2.c.h'))); + assert.equal(parsed.findGlobalByCobol('FOO', nativePath.join(cwd, 'globals2.c.h')), + parsed.findGlobalByCobol('foo', nativePath.join(cwd, 'globals2.c.h'))); + assert.ok(parsed.findGlobalByCobol('BAR-2', nativePath.join(cwd, 'globals.c.h'))); + }); }); diff --git a/tsconfig.json b/tsconfig.json index eaf29ab..d8793b8 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,21 +1,15 @@ { "compilerOptions": { "module": "commonjs", - "target": "es6", + "target": "es2020", "outDir": "out", - "lib": [ - "es6" - ], "sourceMap": true, "rootDir": ".", - "plugins": [ - { - "name": "tslint-language-service" - } - ] + "esModuleInterop": true, }, + "include": ["src", "test"], "exclude": [ "node_modules", ".vscode-test" ] -} \ No newline at end of file +} diff --git a/yarn.lock b/yarn.lock new file mode 100644 index 0000000..7452e69 --- /dev/null +++ b/yarn.lock @@ -0,0 +1,1963 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@bcoe/v8-coverage@^1.0.1": + version "1.0.2" + resolved "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-1.0.2.tgz" + integrity sha512-6zABk/ECA/QYSCQ1NGiVwwbQerUCZ+TQbp64Q3AgmfNvurHH0j8TtXa1qbShXA6qqkpAj4V5W8pP6mLe1mcMqA== + +"@cspotcode/source-map-support@^0.8.0": + version "0.8.1" + resolved "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz" + integrity sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw== + dependencies: + "@jridgewell/trace-mapping" "0.3.9" + +"@eslint-community/eslint-utils@^4.2.0", "@eslint-community/eslint-utils@^4.4.0": + version "4.9.0" + resolved "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.0.tgz" + integrity sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g== + dependencies: + eslint-visitor-keys "^3.4.3" + +"@eslint-community/regexpp@^4.5.1", "@eslint-community/regexpp@^4.6.1": + version "4.12.2" + resolved "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz" + integrity sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew== + +"@eslint/eslintrc@^2.1.4": + version "2.1.4" + resolved "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz" + integrity sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ== + dependencies: + ajv "^6.12.4" + debug "^4.3.2" + espree "^9.6.0" + globals "^13.19.0" + ignore "^5.2.0" + import-fresh "^3.2.1" + js-yaml "^4.1.0" + minimatch "^3.1.2" + strip-json-comments "^3.1.1" + +"@eslint/js@8.57.1": + version "8.57.1" + resolved "https://registry.npmjs.org/@eslint/js/-/js-8.57.1.tgz" + integrity sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q== + +"@humanwhocodes/config-array@^0.13.0": + version "0.13.0" + resolved "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.13.0.tgz" + integrity sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw== + dependencies: + "@humanwhocodes/object-schema" "^2.0.3" + debug "^4.3.1" + minimatch "^3.0.5" + +"@humanwhocodes/module-importer@^1.0.1": + version "1.0.1" + resolved "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz" + integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== + +"@humanwhocodes/object-schema@^2.0.3": + version "2.0.3" + resolved "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz" + integrity sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA== + +"@isaacs/cliui@^8.0.2": + version "8.0.2" + resolved "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz" + integrity sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA== + 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" + +"@istanbuljs/schema@^0.1.2", "@istanbuljs/schema@^0.1.3": + version "0.1.3" + resolved "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz" + integrity sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA== + +"@jridgewell/resolve-uri@^3.0.3", "@jridgewell/resolve-uri@^3.1.0": + version "3.1.2" + resolved "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz" + integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw== + +"@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14": + version "1.5.5" + resolved "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz" + integrity sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og== + +"@jridgewell/trace-mapping@^0.3.12": + version "0.3.31" + resolved "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz" + integrity sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw== + dependencies: + "@jridgewell/resolve-uri" "^3.1.0" + "@jridgewell/sourcemap-codec" "^1.4.14" + +"@jridgewell/trace-mapping@0.3.9": + version "0.3.9" + resolved "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz" + integrity sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ== + dependencies: + "@jridgewell/resolve-uri" "^3.0.3" + "@jridgewell/sourcemap-codec" "^1.4.10" + +"@nodelib/fs.scandir@2.1.5": + version "2.1.5" + resolved "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz" + integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== + dependencies: + "@nodelib/fs.stat" "2.0.5" + run-parallel "^1.1.9" + +"@nodelib/fs.stat@^2.0.2", "@nodelib/fs.stat@2.0.5": + version "2.0.5" + resolved "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz" + integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== + +"@nodelib/fs.walk@^1.2.3", "@nodelib/fs.walk@^1.2.8": + version "1.2.8" + resolved "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz" + integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== + dependencies: + "@nodelib/fs.scandir" "2.1.5" + fastq "^1.6.0" + +"@pkgjs/parseargs@^0.11.0": + version "0.11.0" + resolved "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz" + integrity sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg== + +"@tsconfig/node10@^1.0.7": + version "1.0.12" + resolved "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.12.tgz" + integrity sha512-UCYBaeFvM11aU2y3YPZ//O5Rhj+xKyzy7mvcIoAjASbigy8mHMryP5cK7dgjlz2hWxh1g5pLw084E0a/wlUSFQ== + +"@tsconfig/node12@^1.0.7": + version "1.0.11" + resolved "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz" + integrity sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag== + +"@tsconfig/node14@^1.0.0": + version "1.0.3" + resolved "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz" + integrity sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow== + +"@tsconfig/node16@^1.0.2": + version "1.0.4" + resolved "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz" + integrity sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA== + +"@types/expect@^1.20.4": + version "1.20.4" + resolved "https://registry.npmjs.org/@types/expect/-/expect-1.20.4.tgz" + integrity sha512-Q5Vn3yjTDyCMV50TB6VRIbQNxSE4OmZR86VSbGaNpfUolm0iePBB4KdEEHmxoY5sT2+2DIvXW0rvMDP2nHZ4Mg== + +"@types/istanbul-lib-coverage@^2.0.1": + 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== + +"@types/json-schema@^7.0.12": + version "7.0.15" + resolved "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz" + integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA== + +"@types/mocha@^10.0.10": + version "10.0.10" + resolved "https://registry.npmjs.org/@types/mocha/-/mocha-10.0.10.tgz" + integrity sha512-xPyYSz1cMPnJQhl0CLMH68j3gprKZaTjG3s5Vi+fDgx+uhG9NOXwbVt52eFS8ECyXhyKcjDLCBEqBExKuiZb7Q== + +"@types/node@*", "@types/node@^20.6.3": + version "20.19.25" + resolved "https://registry.npmjs.org/@types/node/-/node-20.19.25.tgz" + integrity sha512-ZsJzA5thDQMSQO788d7IocwwQbI8B5OPzmqNvpf3NY/+MHDAS759Wo0gd2WQeXYt5AAAQjzcrTVC6SKCuYgoCQ== + dependencies: + undici-types "~6.21.0" + +"@types/semver@^7.5.0": + version "7.7.1" + resolved "https://registry.npmjs.org/@types/semver/-/semver-7.7.1.tgz" + integrity sha512-FmgJfu+MOcQ370SD0ev7EI8TlCAfKYU+B4m5T3yXc1CiRN94g/SZPtsCkk506aUDtlMnFZvasDwHHUcZUEaYuA== + +"@types/vscode@^1.64.0": + version "1.106.1" + resolved "https://registry.npmjs.org/@types/vscode/-/vscode-1.106.1.tgz" + integrity sha512-R/HV8u2h8CAddSbX8cjpdd7B8/GnE4UjgjpuGuHcbp1xV6yh4OeqU4L1pKjlwujCrSFS0MOpwJAIs/NexMB1fQ== + +"@typescript-eslint/eslint-plugin@^6.7.2": + version "6.21.0" + resolved "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.21.0.tgz" + integrity sha512-oy9+hTPCUFpngkEZUSzbf9MxI65wbKFoQYsgPdILTfbUldp5ovUuphZVe4i30emU9M/kP+T64Di0mxl7dSw3MA== + dependencies: + "@eslint-community/regexpp" "^4.5.1" + "@typescript-eslint/scope-manager" "6.21.0" + "@typescript-eslint/type-utils" "6.21.0" + "@typescript-eslint/utils" "6.21.0" + "@typescript-eslint/visitor-keys" "6.21.0" + debug "^4.3.4" + graphemer "^1.4.0" + ignore "^5.2.4" + natural-compare "^1.4.0" + semver "^7.5.4" + ts-api-utils "^1.0.1" + +"@typescript-eslint/parser@^6.0.0 || ^6.0.0-alpha", "@typescript-eslint/parser@^6.7.2": + version "6.21.0" + resolved "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.21.0.tgz" + integrity sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ== + dependencies: + "@typescript-eslint/scope-manager" "6.21.0" + "@typescript-eslint/types" "6.21.0" + "@typescript-eslint/typescript-estree" "6.21.0" + "@typescript-eslint/visitor-keys" "6.21.0" + debug "^4.3.4" + +"@typescript-eslint/scope-manager@6.21.0": + version "6.21.0" + resolved "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.21.0.tgz" + integrity sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg== + dependencies: + "@typescript-eslint/types" "6.21.0" + "@typescript-eslint/visitor-keys" "6.21.0" + +"@typescript-eslint/type-utils@6.21.0": + version "6.21.0" + resolved "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.21.0.tgz" + integrity sha512-rZQI7wHfao8qMX3Rd3xqeYSMCL3SoiSQLBATSiVKARdFGCYSRvmViieZjqc58jKgs8Y8i9YvVVhRbHSTA4VBag== + dependencies: + "@typescript-eslint/typescript-estree" "6.21.0" + "@typescript-eslint/utils" "6.21.0" + debug "^4.3.4" + ts-api-utils "^1.0.1" + +"@typescript-eslint/types@6.21.0": + version "6.21.0" + resolved "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.21.0.tgz" + integrity sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg== + +"@typescript-eslint/typescript-estree@6.21.0": + version "6.21.0" + resolved "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.21.0.tgz" + integrity sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ== + dependencies: + "@typescript-eslint/types" "6.21.0" + "@typescript-eslint/visitor-keys" "6.21.0" + debug "^4.3.4" + globby "^11.1.0" + is-glob "^4.0.3" + minimatch "9.0.3" + semver "^7.5.4" + ts-api-utils "^1.0.1" + +"@typescript-eslint/utils@6.21.0": + version "6.21.0" + resolved "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.21.0.tgz" + integrity sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ== + dependencies: + "@eslint-community/eslint-utils" "^4.4.0" + "@types/json-schema" "^7.0.12" + "@types/semver" "^7.5.0" + "@typescript-eslint/scope-manager" "6.21.0" + "@typescript-eslint/types" "6.21.0" + "@typescript-eslint/typescript-estree" "6.21.0" + semver "^7.5.4" + +"@typescript-eslint/visitor-keys@6.21.0": + version "6.21.0" + resolved "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.21.0.tgz" + integrity sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A== + dependencies: + "@typescript-eslint/types" "6.21.0" + eslint-visitor-keys "^3.4.1" + +"@ungap/structured-clone@^1.2.0": + version "1.3.0" + resolved "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz" + integrity sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g== + +"@vscode/debugadapter-testsupport@^1.51.0": + version "1.68.0" + resolved "https://registry.npmjs.org/@vscode/debugadapter-testsupport/-/debugadapter-testsupport-1.68.0.tgz" + integrity sha512-UpbaPsCGMKyjIvJFtqFKDD1MVvME50xuOtRBPrqY1WdhAOLjWQN7FcKEoHv3X85twfNL21jW2M54FYwEdEQv4Q== + dependencies: + "@vscode/debugprotocol" "1.68.0" + +"@vscode/debugadapter@^1.51.0": + version "1.68.0" + resolved "https://registry.npmjs.org/@vscode/debugadapter/-/debugadapter-1.68.0.tgz" + integrity sha512-D6gk5Fw2y4FV8oYmltoXpj+VAZexxJFopN/mcZ6YcgzQE9dgq2L45Aj3GLxScJOD6GeLILcxJIaA8l3v11esGg== + dependencies: + "@vscode/debugprotocol" "1.68.0" + +"@vscode/debugprotocol@^1.51.0", "@vscode/debugprotocol@1.68.0": + version "1.68.0" + resolved "https://registry.npmjs.org/@vscode/debugprotocol/-/debugprotocol-1.68.0.tgz" + integrity sha512-2J27dysaXmvnfuhFGhfeuxfHRXunqNPxtBoR3koiTOA9rdxWNDTa1zIFLCFMSHJ9MPTPKFcBeblsyaCJCIlQxg== + +"@vscode/test-cli@^0.0.12": + version "0.0.12" + resolved "https://registry.npmjs.org/@vscode/test-cli/-/test-cli-0.0.12.tgz" + integrity sha512-iYN0fDg29+a2Xelle/Y56Xvv7Nc8Thzq4VwpzAF/SIE6918rDicqfsQxV6w1ttr2+SOm+10laGuY9FG2ptEKsQ== + dependencies: + "@types/mocha" "^10.0.10" + c8 "^10.1.3" + chokidar "^3.6.0" + enhanced-resolve "^5.18.3" + glob "^10.3.10" + minimatch "^9.0.3" + mocha "^11.7.4" + supports-color "^10.2.2" + yargs "^17.7.2" + +"@vscode/test-electron@^2.5.2": + version "2.5.2" + resolved "https://registry.npmjs.org/@vscode/test-electron/-/test-electron-2.5.2.tgz" + integrity sha512-8ukpxv4wYe0iWMRQU18jhzJOHkeGKbnw7xWRX3Zw1WJA4cEKbHcmmLPdPrPtL6rhDcrlCZN+xKRpv09n4gRHYg== + dependencies: + http-proxy-agent "^7.0.2" + https-proxy-agent "^7.0.5" + jszip "^3.10.1" + ora "^8.1.0" + semver "^7.6.2" + +acorn-jsx@^5.3.2: + version "5.3.2" + resolved "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz" + integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== + +acorn-walk@^8.1.1: + version "8.3.4" + resolved "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz" + integrity sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g== + dependencies: + acorn "^8.11.0" + +"acorn@^6.0.0 || ^7.0.0 || ^8.0.0", acorn@^8.11.0, acorn@^8.4.1, acorn@^8.9.0: + version "8.15.0" + resolved "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz" + integrity sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg== + +agent-base@^7.1.0, agent-base@^7.1.2: + version "7.1.4" + resolved "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz" + integrity sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ== + +ajv@^6.12.4: + version "6.12.6" + resolved "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz" + integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== + dependencies: + fast-deep-equal "^3.1.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" + +ansi-colors@^4.1.3: + version "4.1.3" + resolved "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz" + integrity sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw== + +ansi-regex@^5.0.1: + version "5.0.1" + resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz" + integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== + +ansi-regex@^6.0.1: + version "6.2.2" + resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz" + integrity sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg== + +ansi-styles@^4.0.0, ansi-styles@^4.1.0: + version "4.3.0" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== + dependencies: + color-convert "^2.0.1" + +ansi-styles@^6.1.0: + version "6.2.3" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz" + integrity sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg== + +anymatch@~3.1.2: + version "3.1.3" + resolved "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz" + integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== + dependencies: + normalize-path "^3.0.0" + picomatch "^2.0.4" + +arg@^4.1.0: + version "4.1.3" + resolved "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz" + integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA== + +argparse@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz" + integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== + +array-union@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz" + integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== + +balanced-match@^1.0.0: + version "1.0.2" + resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz" + integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== + +binary-extensions@^2.0.0: + version "2.3.0" + resolved "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz" + integrity sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw== + +brace-expansion@^1.1.7: + version "1.1.12" + resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz" + integrity sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg== + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +brace-expansion@^2.0.1: + version "2.0.2" + resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz" + integrity sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ== + dependencies: + balanced-match "^1.0.0" + +braces@^3.0.3, braces@~3.0.2: + version "3.0.3" + resolved "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz" + integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA== + dependencies: + fill-range "^7.1.1" + +browser-stdout@^1.3.1: + version "1.3.1" + resolved "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz" + integrity sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw== + +c8@^10.1.3: + version "10.1.3" + resolved "https://registry.npmjs.org/c8/-/c8-10.1.3.tgz" + integrity sha512-LvcyrOAaOnrrlMpW22n690PUvxiq4Uf9WMhQwNJ9vgagkL/ph1+D4uvjvDA5XCbykrc0sx+ay6pVi9YZ1GnhyA== + dependencies: + "@bcoe/v8-coverage" "^1.0.1" + "@istanbuljs/schema" "^0.1.3" + find-up "^5.0.0" + foreground-child "^3.1.1" + istanbul-lib-coverage "^3.2.0" + istanbul-lib-report "^3.0.1" + istanbul-reports "^3.1.6" + test-exclude "^7.0.1" + v8-to-istanbul "^9.0.0" + yargs "^17.7.2" + yargs-parser "^21.1.1" + +callsites@^3.0.0: + version "3.1.0" + resolved "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz" + integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== + +camelcase@^6.0.0: + version "6.3.0" + resolved "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz" + integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== + +chalk@^4.0.0, chalk@^4.1.0: + version "4.1.2" + resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +chalk@^5.3.0: + version "5.6.2" + resolved "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz" + integrity sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA== + +chokidar@^3.5.3, chokidar@^3.6.0: + version "3.6.0" + resolved "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz" + integrity sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw== + dependencies: + anymatch "~3.1.2" + braces "~3.0.2" + glob-parent "~5.1.2" + is-binary-path "~2.1.0" + is-glob "~4.0.1" + normalize-path "~3.0.0" + readdirp "~3.6.0" + optionalDependencies: + fsevents "~2.3.2" + +chokidar@^4.0.1: + version "4.0.3" + resolved "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz" + integrity sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA== + dependencies: + readdirp "^4.0.1" + +cli-cursor@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/cli-cursor/-/cli-cursor-5.0.0.tgz" + integrity sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw== + dependencies: + restore-cursor "^5.0.0" + +cli-spinners@^2.9.2: + version "2.9.2" + resolved "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz" + integrity sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg== + +cliui@^7.0.2: + version "7.0.4" + resolved "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz" + integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.0" + wrap-ansi "^7.0.0" + +cliui@^8.0.1: + version "8.0.1" + resolved "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz" + integrity sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.1" + wrap-ansi "^7.0.0" + +color-convert@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz" + integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== + dependencies: + color-name "~1.1.4" + +color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" + integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== + +convert-source-map@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz" + integrity sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg== + +core_d@^5.0.1: + version "5.0.1" + resolved "https://registry.npmjs.org/core_d/-/core_d-5.0.1.tgz" + integrity sha512-37lZyhJY1hzgFbfU4LzY4zL09QPwPfV2W/3YBOtN7mkdvVaeP1OVnDZI6zxggtlPwG/BuE5wIr0xptlVJk5EPA== + dependencies: + supports-color "^8.1.0" + +core-util-is@~1.0.0: + version "1.0.3" + resolved "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz" + integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== + +create-require@^1.1.0: + version "1.1.1" + resolved "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz" + integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== + +cross-spawn@^7.0.2, cross-spawn@^7.0.6: + version "7.0.6" + resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz" + integrity sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA== + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" + +debug@^4.3.1, debug@^4.3.2, debug@^4.3.4, debug@^4.3.5, debug@4: + version "4.4.3" + resolved "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz" + integrity sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA== + dependencies: + ms "^2.1.3" + +decamelize@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz" + integrity sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ== + +deep-is@^0.1.3: + version "0.1.4" + resolved "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz" + integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== + +diff@^4.0.1: + version "4.0.2" + resolved "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz" + integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== + +diff@^5.2.0: + version "5.2.0" + resolved "https://registry.npmjs.org/diff/-/diff-5.2.0.tgz" + integrity sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A== + +diff@^7.0.0: + version "7.0.0" + resolved "https://registry.npmjs.org/diff/-/diff-7.0.0.tgz" + integrity sha512-PJWHUb1RFevKCwaFA9RlG5tCd+FO5iRh9A8HEtkmBH2Li03iJriB6m6JIN4rGz3K3JLawI7/veA1xzRKP6ISBw== + +dir-glob@^3.0.1: + version "3.0.1" + resolved "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz" + integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== + dependencies: + path-type "^4.0.0" + +doctrine@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz" + integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== + dependencies: + esutils "^2.0.2" + +eastasianwidth@^0.2.0: + version "0.2.0" + resolved "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz" + integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA== + +emoji-regex@^10.3.0: + version "10.6.0" + resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz" + integrity sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A== + +emoji-regex@^8.0.0: + version "8.0.0" + resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz" + integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== + +emoji-regex@^9.2.2: + version "9.2.2" + resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz" + integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== + +enhanced-resolve@^5.18.3: + version "5.18.3" + resolved "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.3.tgz" + integrity sha512-d4lC8xfavMeBjzGr2vECC3fsGXziXZQyJxD868h2M/mBI3PwAuODxAkLkq5HYuvrPYcUtiLzsTo8U3PgX3Ocww== + dependencies: + graceful-fs "^4.2.4" + tapable "^2.2.0" + +escalade@^3.1.1: + version "3.2.0" + resolved "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz" + integrity sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA== + +escape-string-regexp@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz" + integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== + +eslint_d@^12.2.1: + version "12.2.1" + resolved "https://registry.npmjs.org/eslint_d/-/eslint_d-12.2.1.tgz" + integrity sha512-qOJ9cTi5AaH5bOgEoCkv41DJ637mHgzffbOLojwU4wadwC6qbR+OxVJRvVzH0v2XYmQOvw4eiJK7ivrr5SvzsA== + dependencies: + core_d "^5.0.1" + eslint "^8.12.0" + nanolru "^1.0.0" + optionator "^0.9.1" + +eslint-scope@^7.2.2: + version "7.2.2" + resolved "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz" + integrity sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg== + dependencies: + esrecurse "^4.3.0" + estraverse "^5.2.0" + +eslint-visitor-keys@^3.4.1, eslint-visitor-keys@^3.4.3: + version "3.4.3" + resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz" + integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== + +"eslint@^6.0.0 || ^7.0.0 || >=8.0.0", "eslint@^7.0.0 || ^8.0.0", eslint@^8.12.0, eslint@^8.50.0: + version "8.57.1" + resolved "https://registry.npmjs.org/eslint/-/eslint-8.57.1.tgz" + integrity sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA== + dependencies: + "@eslint-community/eslint-utils" "^4.2.0" + "@eslint-community/regexpp" "^4.6.1" + "@eslint/eslintrc" "^2.1.4" + "@eslint/js" "8.57.1" + "@humanwhocodes/config-array" "^0.13.0" + "@humanwhocodes/module-importer" "^1.0.1" + "@nodelib/fs.walk" "^1.2.8" + "@ungap/structured-clone" "^1.2.0" + ajv "^6.12.4" + chalk "^4.0.0" + cross-spawn "^7.0.2" + debug "^4.3.2" + doctrine "^3.0.0" + escape-string-regexp "^4.0.0" + eslint-scope "^7.2.2" + eslint-visitor-keys "^3.4.3" + espree "^9.6.1" + esquery "^1.4.2" + esutils "^2.0.2" + fast-deep-equal "^3.1.3" + file-entry-cache "^6.0.1" + find-up "^5.0.0" + glob-parent "^6.0.2" + globals "^13.19.0" + graphemer "^1.4.0" + ignore "^5.2.0" + imurmurhash "^0.1.4" + is-glob "^4.0.0" + is-path-inside "^3.0.3" + js-yaml "^4.1.0" + json-stable-stringify-without-jsonify "^1.0.1" + levn "^0.4.1" + lodash.merge "^4.6.2" + minimatch "^3.1.2" + natural-compare "^1.4.0" + optionator "^0.9.3" + strip-ansi "^6.0.1" + text-table "^0.2.0" + +espree@^9.6.0, espree@^9.6.1: + version "9.6.1" + resolved "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz" + integrity sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ== + dependencies: + acorn "^8.9.0" + acorn-jsx "^5.3.2" + eslint-visitor-keys "^3.4.1" + +esquery@^1.4.2: + version "1.6.0" + resolved "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz" + integrity sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg== + dependencies: + estraverse "^5.1.0" + +esrecurse@^4.3.0: + version "4.3.0" + resolved "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz" + integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== + dependencies: + estraverse "^5.2.0" + +estraverse@^5.1.0, estraverse@^5.2.0: + version "5.3.0" + resolved "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz" + integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== + +esutils@^2.0.2: + version "2.0.3" + resolved "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz" + integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== + +fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: + version "3.1.3" + resolved "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz" + integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== + +fast-glob@^3.2.9: + version "3.3.3" + resolved "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz" + integrity sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg== + dependencies: + "@nodelib/fs.stat" "^2.0.2" + "@nodelib/fs.walk" "^1.2.3" + glob-parent "^5.1.2" + merge2 "^1.3.0" + micromatch "^4.0.8" + +fast-json-stable-stringify@^2.0.0: + version "2.1.0" + resolved "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz" + integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== + +fast-levenshtein@^2.0.6: + version "2.0.6" + resolved "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz" + integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== + +fastq@^1.6.0: + version "1.19.1" + resolved "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz" + integrity sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ== + dependencies: + reusify "^1.0.4" + +file-entry-cache@^6.0.1: + version "6.0.1" + resolved "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz" + integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== + dependencies: + flat-cache "^3.0.4" + +fill-range@^7.1.1: + version "7.1.1" + resolved "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz" + integrity sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg== + dependencies: + to-regex-range "^5.0.1" + +find-up@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz" + integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== + dependencies: + locate-path "^6.0.0" + path-exists "^4.0.0" + +flat-cache@^3.0.4: + version "3.2.0" + resolved "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz" + integrity sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw== + dependencies: + flatted "^3.2.9" + keyv "^4.5.3" + rimraf "^3.0.2" + +flat@^5.0.2: + version "5.0.2" + resolved "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz" + integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== + +flatted@^3.2.9: + version "3.3.3" + resolved "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz" + integrity sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg== + +foreground-child@^3.1.0, foreground-child@^3.1.1: + version "3.3.1" + resolved "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz" + integrity sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw== + dependencies: + cross-spawn "^7.0.6" + signal-exit "^4.0.1" + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz" + integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== + +get-caller-file@^2.0.5: + version "2.0.5" + resolved "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz" + integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== + +get-east-asian-width@^1.0.0: + version "1.4.0" + resolved "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.4.0.tgz" + integrity sha512-QZjmEOC+IT1uk6Rx0sX22V6uHWVwbdbxf1faPqJ1QhLdGgsRGCZoyaQBm/piRdJy/D2um6hM1UP7ZEeQ4EkP+Q== + +glob-parent@^5.1.2, glob-parent@~5.1.2: + version "5.1.2" + resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz" + integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== + dependencies: + is-glob "^4.0.1" + +glob-parent@^6.0.2: + version "6.0.2" + resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz" + integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== + dependencies: + is-glob "^4.0.3" + +glob@^10.3.10, glob@^10.4.1, glob@^10.4.5: + version "10.5.0" + resolved "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz" + integrity sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg== + dependencies: + foreground-child "^3.1.0" + jackspeak "^3.1.2" + minimatch "^9.0.4" + minipass "^7.1.2" + package-json-from-dist "^1.0.0" + path-scurry "^1.11.1" + +glob@^7.1.3: + version "7.2.3" + resolved "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz" + integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== + 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" + +glob@^8.1.0: + version "8.1.0" + resolved "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz" + integrity sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^5.0.1" + once "^1.3.0" + +globals@^13.19.0: + version "13.24.0" + resolved "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz" + integrity sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ== + dependencies: + type-fest "^0.20.2" + +globby@^11.1.0: + version "11.1.0" + resolved "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz" + integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== + dependencies: + array-union "^2.1.0" + dir-glob "^3.0.1" + fast-glob "^3.2.9" + ignore "^5.2.0" + merge2 "^1.4.1" + slash "^3.0.0" + +graceful-fs@^4.2.4: + version "4.2.11" + resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz" + integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== + +graphemer@^1.4.0: + version "1.4.0" + resolved "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz" + integrity sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag== + +has-flag@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz" + integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== + +he@^1.2.0: + version "1.2.0" + resolved "https://registry.npmjs.org/he/-/he-1.2.0.tgz" + integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== + +html-escaper@^2.0.0: + version "2.0.2" + resolved "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz" + integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg== + +http-proxy-agent@^7.0.2: + version "7.0.2" + resolved "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz" + integrity sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig== + dependencies: + agent-base "^7.1.0" + debug "^4.3.4" + +https-proxy-agent@^7.0.5: + version "7.0.6" + resolved "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz" + integrity sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw== + dependencies: + agent-base "^7.1.2" + debug "4" + +ignore@^5.2.0, ignore@^5.2.4: + version "5.3.2" + resolved "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz" + integrity sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g== + +immediate@~3.0.5: + version "3.0.6" + resolved "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz" + integrity sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ== + +import-fresh@^3.2.1: + version "3.3.1" + resolved "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz" + integrity sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ== + dependencies: + parent-module "^1.0.0" + resolve-from "^4.0.0" + +imurmurhash@^0.1.4: + version "0.1.4" + resolved "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz" + integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz" + integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@~2.0.3, inherits@2: + version "2.0.4" + resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +is-binary-path@~2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz" + integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== + dependencies: + binary-extensions "^2.0.0" + +is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz" + integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== + +is-fullwidth-code-point@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz" + integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== + +is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: + version "4.0.3" + resolved "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz" + integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== + dependencies: + is-extglob "^2.1.1" + +is-interactive@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/is-interactive/-/is-interactive-2.0.0.tgz" + integrity sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ== + +is-number@^7.0.0: + version "7.0.0" + resolved "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz" + integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== + +is-path-inside@^3.0.3: + version "3.0.3" + resolved "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz" + integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== + +is-plain-obj@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz" + integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA== + +is-unicode-supported@^0.1.0: + version "0.1.0" + resolved "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz" + integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== + +is-unicode-supported@^1.3.0: + version "1.3.0" + resolved "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-1.3.0.tgz" + integrity sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ== + +is-unicode-supported@^2.0.0: + version "2.1.0" + resolved "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-2.1.0.tgz" + integrity sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ== + +isarray@~1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz" + integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz" + integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== + +istanbul-lib-coverage@^3.0.0, istanbul-lib-coverage@^3.2.0: + 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== + +istanbul-lib-report@^3.0.0, istanbul-lib-report@^3.0.1: + version "3.0.1" + resolved "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz" + integrity sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw== + dependencies: + istanbul-lib-coverage "^3.0.0" + make-dir "^4.0.0" + supports-color "^7.1.0" + +istanbul-reports@^3.1.6: + version "3.2.0" + resolved "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.2.0.tgz" + integrity sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA== + dependencies: + html-escaper "^2.0.0" + istanbul-lib-report "^3.0.0" + +jackspeak@^3.1.2: + version "3.4.3" + resolved "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz" + integrity sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw== + dependencies: + "@isaacs/cliui" "^8.0.2" + optionalDependencies: + "@pkgjs/parseargs" "^0.11.0" + +js-yaml@^4.1.0: + version "4.1.1" + resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz" + integrity sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA== + dependencies: + argparse "^2.0.1" + +json-buffer@3.0.1: + version "3.0.1" + resolved "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz" + integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ== + +json-schema-traverse@^0.4.1: + version "0.4.1" + resolved "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz" + integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== + +json-stable-stringify-without-jsonify@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz" + integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== + +json5@^2.2.2: + version "2.2.3" + resolved "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz" + integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== + +jszip@^3.10.1: + version "3.10.1" + resolved "https://registry.npmjs.org/jszip/-/jszip-3.10.1.tgz" + integrity sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g== + dependencies: + lie "~3.3.0" + pako "~1.0.2" + readable-stream "~2.3.6" + setimmediate "^1.0.5" + +keyv@^4.5.3: + version "4.5.4" + resolved "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz" + integrity sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw== + dependencies: + json-buffer "3.0.1" + +levn@^0.4.1: + version "0.4.1" + resolved "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz" + integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== + dependencies: + prelude-ls "^1.2.1" + type-check "~0.4.0" + +lie@~3.3.0: + version "3.3.0" + resolved "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz" + integrity sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ== + dependencies: + immediate "~3.0.5" + +locate-path@^6.0.0: + version "6.0.0" + resolved "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz" + integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== + dependencies: + p-locate "^5.0.0" + +lodash.merge@^4.6.2: + version "4.6.2" + resolved "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz" + integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== + +log-symbols@^4.1.0: + version "4.1.0" + resolved "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz" + integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg== + dependencies: + chalk "^4.1.0" + is-unicode-supported "^0.1.0" + +log-symbols@^6.0.0: + version "6.0.0" + resolved "https://registry.npmjs.org/log-symbols/-/log-symbols-6.0.0.tgz" + integrity sha512-i24m8rpwhmPIS4zscNzK6MSEhk0DUWa/8iYQWxhffV8jkI4Phvs3F+quL5xvS0gdQR0FyTCMMH33Y78dDTzzIw== + dependencies: + chalk "^5.3.0" + is-unicode-supported "^1.3.0" + +lru-cache@^10.2.0: + version "10.4.3" + resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz" + integrity sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ== + +make-dir@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz" + integrity sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw== + dependencies: + semver "^7.5.3" + +make-error@^1.1.1: + version "1.3.6" + resolved "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz" + integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== + +merge2@^1.3.0, merge2@^1.4.1: + version "1.4.1" + resolved "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz" + integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== + +micromatch@^4.0.8: + version "4.0.8" + resolved "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz" + integrity sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA== + dependencies: + braces "^3.0.3" + picomatch "^2.3.1" + +mimic-function@^5.0.0: + version "5.0.1" + resolved "https://registry.npmjs.org/mimic-function/-/mimic-function-5.0.1.tgz" + integrity sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA== + +minimatch@^3.0.5: + version "3.1.2" + resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz" + integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== + dependencies: + brace-expansion "^1.1.7" + +minimatch@^3.1.1: + version "3.1.2" + resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz" + integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== + dependencies: + brace-expansion "^1.1.7" + +minimatch@^3.1.2: + version "3.1.2" + resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz" + integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== + dependencies: + brace-expansion "^1.1.7" + +minimatch@^5.0.1, minimatch@^5.1.6: + version "5.1.6" + resolved "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz" + integrity sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g== + dependencies: + brace-expansion "^2.0.1" + +minimatch@^9.0.3, minimatch@^9.0.5: + version "9.0.5" + resolved "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz" + integrity sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow== + dependencies: + brace-expansion "^2.0.1" + +minimatch@^9.0.4: + version "9.0.5" + resolved "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz" + integrity sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow== + dependencies: + brace-expansion "^2.0.1" + +minimatch@9.0.3: + version "9.0.3" + resolved "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz" + integrity sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg== + dependencies: + brace-expansion "^2.0.1" + +minimist@^1.2.6: + version "1.2.8" + resolved "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz" + integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== + +"minipass@^5.0.0 || ^6.0.2 || ^7.0.0", minipass@^7.1.2: + version "7.1.2" + resolved "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz" + integrity sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw== + +mocha@^10.8.2, "mocha@^3.X.X || ^4.X.X || ^5.X.X || ^6.X.X || ^7.X.X || ^8.X.X || ^9.X.X || ^10.X.X || ^11.X.X": + version "10.8.2" + resolved "https://registry.npmjs.org/mocha/-/mocha-10.8.2.tgz" + integrity sha512-VZlYo/WE8t1tstuRmqgeyBgCbJc/lEdopaa+axcKzTBJ+UIdlAB9XnmvTCAH4pwR4ElNInaedhEBmZD8iCSVEg== + dependencies: + ansi-colors "^4.1.3" + browser-stdout "^1.3.1" + chokidar "^3.5.3" + debug "^4.3.5" + diff "^5.2.0" + escape-string-regexp "^4.0.0" + find-up "^5.0.0" + glob "^8.1.0" + he "^1.2.0" + js-yaml "^4.1.0" + log-symbols "^4.1.0" + minimatch "^5.1.6" + ms "^2.1.3" + serialize-javascript "^6.0.2" + strip-json-comments "^3.1.1" + supports-color "^8.1.1" + workerpool "^6.5.1" + yargs "^16.2.0" + yargs-parser "^20.2.9" + yargs-unparser "^2.0.0" + +mocha@^11.7.4: + version "11.7.5" + resolved "https://registry.npmjs.org/mocha/-/mocha-11.7.5.tgz" + integrity sha512-mTT6RgopEYABzXWFx+GcJ+ZQ32kp4fMf0xvpZIIfSq9Z8lC/++MtcCnQ9t5FP2veYEP95FIYSvW+U9fV4xrlig== + dependencies: + browser-stdout "^1.3.1" + chokidar "^4.0.1" + debug "^4.3.5" + diff "^7.0.0" + escape-string-regexp "^4.0.0" + find-up "^5.0.0" + glob "^10.4.5" + he "^1.2.0" + is-path-inside "^3.0.3" + js-yaml "^4.1.0" + log-symbols "^4.1.0" + minimatch "^9.0.5" + ms "^2.1.3" + picocolors "^1.1.1" + serialize-javascript "^6.0.2" + strip-json-comments "^3.1.1" + supports-color "^8.1.1" + workerpool "^9.2.0" + yargs "^17.7.2" + yargs-parser "^21.1.1" + yargs-unparser "^2.0.0" + +ms@^2.1.3: + version "2.1.3" + resolved "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + +n-readlines@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/n-readlines/-/n-readlines-1.0.1.tgz" + integrity sha512-z4SyAIVgMy7CkgsoNw7YVz40v0g4+WWvvqy8+ZdHrCtgevcEO758WQyrYcw3XPxcLxF+//RszTz/rO48nzD0wQ== + +nanolru@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/nanolru/-/nanolru-1.0.0.tgz" + integrity sha512-GyQkE8M32pULhQk7Sko5raoIbPalAk90ICG+An4fq6fCsFHsP6fB2K46WGXVdoJpy4SGMnZ/EKbo123fZJomWg== + +natural-compare@^1.4.0: + version "1.4.0" + resolved "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz" + integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== + +normalize-path@^3.0.0, normalize-path@~3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz" + integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== + +once@^1.3.0: + version "1.4.0" + resolved "https://registry.npmjs.org/once/-/once-1.4.0.tgz" + integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== + dependencies: + wrappy "1" + +onetime@^7.0.0: + version "7.0.0" + resolved "https://registry.npmjs.org/onetime/-/onetime-7.0.0.tgz" + integrity sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ== + dependencies: + mimic-function "^5.0.0" + +optionator@^0.9.1, optionator@^0.9.3: + version "0.9.4" + resolved "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz" + integrity sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g== + dependencies: + deep-is "^0.1.3" + fast-levenshtein "^2.0.6" + levn "^0.4.1" + prelude-ls "^1.2.1" + type-check "^0.4.0" + word-wrap "^1.2.5" + +ora@^8.1.0: + version "8.2.0" + resolved "https://registry.npmjs.org/ora/-/ora-8.2.0.tgz" + integrity sha512-weP+BZ8MVNnlCm8c0Qdc1WSWq4Qn7I+9CJGm7Qali6g44e/PUzbjNqJX5NJ9ljlNMosfJvg1fKEGILklK9cwnw== + dependencies: + chalk "^5.3.0" + cli-cursor "^5.0.0" + cli-spinners "^2.9.2" + is-interactive "^2.0.0" + is-unicode-supported "^2.0.0" + log-symbols "^6.0.0" + stdin-discarder "^0.2.2" + string-width "^7.2.0" + strip-ansi "^7.1.0" + +p-limit@^3.0.2: + version "3.1.0" + resolved "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz" + integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== + dependencies: + yocto-queue "^0.1.0" + +p-locate@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz" + integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== + dependencies: + p-limit "^3.0.2" + +package-json-from-dist@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz" + integrity sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw== + +pako@~1.0.2: + version "1.0.11" + resolved "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz" + integrity sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw== + +parent-module@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz" + integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== + dependencies: + callsites "^3.0.0" + +path-exists@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz" + integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== + +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz" + integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== + +path-key@^3.1.0: + version "3.1.1" + resolved "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz" + integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== + +path-scurry@^1.11.1: + version "1.11.1" + resolved "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz" + integrity sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA== + dependencies: + lru-cache "^10.2.0" + minipass "^5.0.0 || ^6.0.2 || ^7.0.0" + +path-type@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz" + integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== + +picocolors@^1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz" + integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA== + +picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.1: + version "2.3.1" + resolved "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz" + integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== + +prelude-ls@^1.2.1: + version "1.2.1" + resolved "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz" + integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== + +process-nextick-args@~2.0.0: + version "2.0.1" + resolved "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz" + integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== + +punycode@^2.1.0: + version "2.3.1" + resolved "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz" + integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== + +queue-microtask@^1.2.2: + version "1.2.3" + resolved "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz" + integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== + +randombytes@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz" + integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== + dependencies: + safe-buffer "^5.1.0" + +readable-stream@~2.3.6: + version "2.3.8" + resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz" + integrity sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA== + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.3" + isarray "~1.0.0" + process-nextick-args "~2.0.0" + safe-buffer "~5.1.1" + string_decoder "~1.1.1" + util-deprecate "~1.0.1" + +readdirp@^4.0.1: + version "4.1.2" + resolved "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz" + integrity sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg== + +readdirp@~3.6.0: + version "3.6.0" + resolved "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz" + integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== + dependencies: + picomatch "^2.2.1" + +require-directory@^2.1.1: + version "2.1.1" + resolved "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz" + integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== + +resolve-from@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz" + integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== + +restore-cursor@^5.0.0: + version "5.1.0" + resolved "https://registry.npmjs.org/restore-cursor/-/restore-cursor-5.1.0.tgz" + integrity sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA== + dependencies: + onetime "^7.0.0" + signal-exit "^4.1.0" + +reusify@^1.0.4: + version "1.1.0" + resolved "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz" + integrity sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw== + +rimraf@^3.0.2: + version "3.0.2" + resolved "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz" + integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== + dependencies: + glob "^7.1.3" + +run-parallel@^1.1.9: + version "1.2.0" + resolved "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz" + integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== + dependencies: + queue-microtask "^1.2.2" + +safe-buffer@^5.1.0, safe-buffer@~5.1.0, safe-buffer@~5.1.1: + version "5.1.2" + resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz" + integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== + +semver@^7.5.3, semver@^7.5.4, semver@^7.6.2: + version "7.7.3" + resolved "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz" + integrity sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q== + +serialize-javascript@^6.0.2: + version "6.0.2" + resolved "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz" + integrity sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g== + dependencies: + randombytes "^2.1.0" + +setimmediate@^1.0.5: + version "1.0.5" + resolved "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz" + integrity sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA== + +shebang-command@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz" + integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== + dependencies: + shebang-regex "^3.0.0" + +shebang-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz" + integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== + +signal-exit@^4.0.1, signal-exit@^4.1.0: + version "4.1.0" + resolved "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz" + integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw== + +slash@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz" + integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== + +stdin-discarder@^0.2.2: + version "0.2.2" + resolved "https://registry.npmjs.org/stdin-discarder/-/stdin-discarder-0.2.2.tgz" + integrity sha512-UhDfHmA92YAlNnCfhmq0VeNL5bDbiZGg7sZ2IvPsXubGkiNa9EC+tUTsjBRsYUAz87btI6/1wf4XoVvQ3uRnmQ== + +string_decoder@~1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz" + integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== + dependencies: + safe-buffer "~5.1.0" + +"string-width-cjs@npm:string-width@^4.2.0": + version "4.2.3" + resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + +string-width@^4.1.0, string-width@^4.2.0: + version "4.2.3" + resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + +string-width@^4.2.3: + version "4.2.3" + resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + +string-width@^5.0.1, string-width@^5.1.2: + version "5.1.2" + resolved "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz" + integrity sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA== + dependencies: + eastasianwidth "^0.2.0" + emoji-regex "^9.2.2" + strip-ansi "^7.0.1" + +string-width@^7.2.0: + version "7.2.0" + resolved "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz" + integrity sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ== + dependencies: + emoji-regex "^10.3.0" + get-east-asian-width "^1.0.0" + strip-ansi "^7.1.0" + +"strip-ansi-cjs@npm:strip-ansi@^6.0.1": + version "6.0.1" + resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + +strip-ansi@^6.0.0, strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + +strip-ansi@^7.0.1: + version "7.1.2" + resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz" + integrity sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA== + dependencies: + ansi-regex "^6.0.1" + +strip-ansi@^7.1.0: + version "7.1.2" + resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz" + integrity sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA== + dependencies: + ansi-regex "^6.0.1" + +strip-bom@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz" + integrity sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA== + +strip-json-comments@^3.1.1: + version "3.1.1" + resolved "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz" + integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== + +supports-color@^10.2.2: + version "10.2.2" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-10.2.2.tgz" + integrity sha512-SS+jx45GF1QjgEXQx4NJZV9ImqmO2NPz5FNsIHrsDjh2YsHnawpan7SNQ1o8NuhrbHZy9AZhIoCUiCeaW/C80g== + +supports-color@^7.1.0: + version "7.2.0" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz" + integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== + dependencies: + has-flag "^4.0.0" + +supports-color@^8.1.0: + version "8.1.1" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz" + integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== + dependencies: + has-flag "^4.0.0" + +supports-color@^8.1.1: + version "8.1.1" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz" + integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== + dependencies: + has-flag "^4.0.0" + +tapable@^2.2.0: + version "2.3.0" + resolved "https://registry.npmjs.org/tapable/-/tapable-2.3.0.tgz" + integrity sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg== + +test-exclude@^7.0.1: + version "7.0.1" + resolved "https://registry.npmjs.org/test-exclude/-/test-exclude-7.0.1.tgz" + integrity sha512-pFYqmTw68LXVjeWJMST4+borgQP2AyMNbg1BpZh9LbyhUeNkeaPF9gzfPGUAnSMV3qPYdWUwDIjjCLiSDOl7vg== + dependencies: + "@istanbuljs/schema" "^0.1.2" + glob "^10.4.1" + minimatch "^9.0.4" + +text-table@^0.2.0: + version "0.2.0" + resolved "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz" + integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== + +to-regex-range@^5.0.1: + version "5.0.1" + resolved "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz" + integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== + dependencies: + is-number "^7.0.0" + +ts-api-utils@^1.0.1: + version "1.4.3" + resolved "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.4.3.tgz" + integrity sha512-i3eMG77UTMD0hZhgRS562pv83RC6ukSAC2GMNWc+9dieh/+jDM5u5YG+NHX6VNDRHQcHwmsTHctP9LhbC3WxVw== + +ts-mocha@^11.1.0: + version "11.1.0" + resolved "https://registry.npmjs.org/ts-mocha/-/ts-mocha-11.1.0.tgz" + integrity sha512-yT7FfzNRCu8ZKkYvAOiH01xNma/vLq6Vit7yINKYFNVP8e5UyrYXSOMIipERTpzVKJQ4Qcos5bQo1tNERNZevQ== + +ts-node@^10.9.2, "ts-node@^7.X.X || ^8.X.X || ^9.X.X || ^10.X.X": + version "10.9.2" + resolved "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz" + integrity sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ== + dependencies: + "@cspotcode/source-map-support" "^0.8.0" + "@tsconfig/node10" "^1.0.7" + "@tsconfig/node12" "^1.0.7" + "@tsconfig/node14" "^1.0.0" + "@tsconfig/node16" "^1.0.2" + acorn "^8.4.1" + acorn-walk "^8.1.1" + arg "^4.1.0" + create-require "^1.1.0" + diff "^4.0.1" + make-error "^1.1.1" + v8-compile-cache-lib "^3.0.1" + yn "3.1.1" + +tsconfig-paths@^4.2.0, tsconfig-paths@^4.X.X: + version "4.2.0" + resolved "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-4.2.0.tgz" + integrity sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg== + dependencies: + json5 "^2.2.2" + minimist "^1.2.6" + strip-bom "^3.0.0" + +type-check@^0.4.0, type-check@~0.4.0: + version "0.4.0" + resolved "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz" + integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== + dependencies: + prelude-ls "^1.2.1" + +type-fest@^0.20.2: + version "0.20.2" + resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz" + integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== + +typescript@^5.2.2, typescript@>=2.7, typescript@>=4.2.0: + version "5.9.3" + resolved "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz" + integrity sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw== + +undici-types@~6.21.0: + version "6.21.0" + resolved "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz" + integrity sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ== + +uri-js@^4.2.2: + version "4.4.1" + resolved "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz" + integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== + dependencies: + punycode "^2.1.0" + +util-deprecate@~1.0.1: + version "1.0.2" + resolved "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" + integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== + +v8-compile-cache-lib@^3.0.1: + version "3.0.1" + resolved "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz" + integrity sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg== + +v8-to-istanbul@^9.0.0: + version "9.3.0" + resolved "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.3.0.tgz" + integrity sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA== + dependencies: + "@jridgewell/trace-mapping" "^0.3.12" + "@types/istanbul-lib-coverage" "^2.0.1" + convert-source-map "^2.0.0" + +which@^2.0.1: + version "2.0.2" + resolved "https://registry.npmjs.org/which/-/which-2.0.2.tgz" + integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== + dependencies: + isexe "^2.0.0" + +word-wrap@^1.2.5: + version "1.2.5" + resolved "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz" + integrity sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA== + +workerpool@^6.5.1: + version "6.5.1" + resolved "https://registry.npmjs.org/workerpool/-/workerpool-6.5.1.tgz" + integrity sha512-Fs4dNYcsdpYSAfVxhnl1L5zTksjvOJxtC5hzMNl+1t9B8hTJTdKDyZ5ju7ztgPy+ft9tBFXoOlDNiOT9WUXZlA== + +workerpool@^9.2.0: + version "9.3.4" + resolved "https://registry.npmjs.org/workerpool/-/workerpool-9.3.4.tgz" + integrity sha512-TmPRQYYSAnnDiEB0P/Ytip7bFGvqnSU6I2BcuSw7Hx+JSg/DsUi5ebYfc8GYaSdpuvOcEs6dXxPurOYpe9QFwg== + +"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": + version "7.0.0" + resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + +wrap-ansi@^7.0.0: + version "7.0.0" + resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + +wrap-ansi@^8.1.0: + version "8.1.0" + resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz" + integrity sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ== + dependencies: + ansi-styles "^6.1.0" + string-width "^5.0.1" + strip-ansi "^7.0.1" + +wrappy@1: + version "1.0.2" + resolved "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" + integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== + +y18n@^5.0.5: + version "5.0.8" + resolved "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz" + integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== + +yargs-parser@^20.2.2, yargs-parser@^20.2.9: + version "20.2.9" + resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz" + integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== + +yargs-parser@^21.1.1: + version "21.1.1" + resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz" + integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== + +yargs-unparser@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz" + integrity sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA== + dependencies: + camelcase "^6.0.0" + decamelize "^4.0.0" + flat "^5.0.2" + is-plain-obj "^2.1.0" + +yargs@^16.2.0: + version "16.2.0" + resolved "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz" + integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== + dependencies: + cliui "^7.0.2" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.0" + y18n "^5.0.5" + yargs-parser "^20.2.2" + +yargs@^17.7.2: + version "17.7.2" + resolved "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz" + integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w== + dependencies: + cliui "^8.0.1" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.3" + y18n "^5.0.5" + yargs-parser "^21.1.1" + +yn@3.1.1: + version "3.1.1" + resolved "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz" + integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q== + +yocto-queue@^0.1.0: + version "0.1.0" + resolved "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz" + integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==