diff --git a/.github/dependabot.yml b/.github/dependabot.yml index ffc038229..04181a81d 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -3,5 +3,10 @@ updates: - package-ecosystem: "npm" directory: "/" schedule: - interval: "daily" + interval: "weekly" versioning-strategy: increase + groups: + minor-dependencies: + update-types: + - "minor" + - "patch" diff --git a/.github/workflows/datadog.yaml b/.github/workflows/datadog.yaml deleted file mode 100644 index aabc9f2ab..000000000 --- a/.github/workflows/datadog.yaml +++ /dev/null @@ -1,25 +0,0 @@ -name: Datadog Event - -on: - release: - types: [published] - -jobs: - send-release-event: - runs-on: ubuntu-latest - steps: - - name: Send Release Event - run: | - curl -sX POST "https://api.datadoghq.eu/api/v1/events" \ - -H "Accept: application/json" \ - -H "Content-Type: application/json" \ - -H "DD-API-KEY: ${{ secrets.DATADOG_API_KEY }}" \ - --data-raw '{ - "title": "Jazzer.js has been released", - "text": "%%% \nJazzer.js has been released with version **${{ github.event.release.tag_name }}**\n %%%", - "tags": [ - "repo:${{ github.repository }}", - "project:Jazzer.js", - "version:${{ github.event.release.tag_name }}" - ] - }' diff --git a/.github/workflows/prerelease.yaml b/.github/workflows/prerelease.yaml deleted file mode 100644 index f174501c8..000000000 --- a/.github/workflows/prerelease.yaml +++ /dev/null @@ -1,60 +0,0 @@ -name: "🏗️ Prerelease" - -on: - push: - tags: - - "v*.*.*" - -jobs: - create_release: - name: create release - runs-on: ubuntu-20.04 - permissions: - contents: write # for creating releases - - steps: - - name: checkout - uses: actions/checkout@v3 - - name: read version - id: read-version - run: | - echo ::set-output name=version::\ - $(cat ./package.json | jq '.version' | tr -d '"') - shell: bash - - name: create release - uses: softprops/action-gh-release@v1 - with: - name: Release ${{ steps.read-version.outputs.version }} - body_path: ./.github/release_template.md - generate_release_notes: true - draft: false # creating drafts conflicts with prebuild - prerelease: true # using a prerelease instead - - prebuilds: - name: create prebuilds - needs: [create_release] - strategy: - matrix: - os: [ubuntu-20.04, macos-11, windows-2019] - opts: [""] - include: - - os: macos-11 - opts: "--arch arm64" - runs-on: ${{ matrix.os }} - steps: - - name: checkout - uses: actions/checkout@v3 - - name: node - uses: actions/setup-node@v3 - with: - node-version: 16 - cache: "npm" - - name: MSVC (windows) - uses: ilammy/msvc-dev-cmd@v1 - if: contains(matrix.os, 'windows') - - name: install dependencies - run: npm ci --ws=@jazzer.js/fuzzer - - name: build and upload prebuilds - run: > - npm run prebuild --workspace=@jazzer.js/fuzzer -- ${{ matrix.opts }} - --upload ${{secrets.GITHUB_TOKEN}} diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index b67414b26..48e943485 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -1,25 +1,85 @@ name: "🚀 Release" on: - release: - types: [released] + workflow_dispatch: + push: + tags: + - "v*.*.*" jobs: + prebuilds: + name: create prebuilds + strategy: + matrix: + os: [ubuntu-latest, macos-latest, windows-latest] + opts: [""] + include: + - os: macos-latest + opts: "--arch arm64" + runs-on: ${{ matrix.os }} + steps: + - name: checkout + uses: actions/checkout@v3 + - name: node + uses: actions/setup-node@v3 + with: + node-version: 22 + cache: "npm" + - name: MSVC (windows) + uses: ilammy/msvc-dev-cmd@v1 + if: contains(matrix.os, 'windows') + - name: install dependencies + run: npm ci + - name: build + run: | + npm run prebuild --workspace=@jazzer.js/fuzzer -- ${{ matrix.opts }} + npm run build --workspace=@jazzer.js/fuzzer -- ${{ matrix.opts }} + - name: upload + uses: actions/upload-artifact@v3 + with: + name: native-addon + path: packages/fuzzer/prebuilds + if-no-files-found: error + release: name: release - runs-on: ubuntu-20.04 + needs: [prebuilds] + runs-on: ubuntu-latest + permissions: + contents: write # for creating releases steps: - name: checkout uses: actions/checkout@v3 - name: node uses: actions/setup-node@v3 with: - node-version: 16 + node-version: 22 cache: "npm" registry-url: https://registry.npmjs.org - - name: install & build - run: npm ci && npm run build - - name: publish to npm + - name: install + run: npm ci + - name: build + run: npm run build + - name: download prebuilds + uses: actions/download-artifact@v3 + with: + name: native-addon + path: packages/fuzzer/prebuilds + if-no-files-found: error + - name: publish run: npm publish --workspaces --access public env: NODE_AUTH_TOKEN: ${{secrets.NPM_ACCESS_TOKEN}} + # create GitHub release + - name: read version + id: read-version + run: | + echo ::set-output name=version::\ + $(cat ./package.json | jq '.version' | tr -d '"') + shell: bash + - name: create release + uses: softprops/action-gh-release@v1 + with: + name: Release ${{ steps.read-version.outputs.version }} + body_path: ./.github/release_template.md + generate_release_notes: true diff --git a/.github/workflows/run-all-tests-main.yaml b/.github/workflows/run-all-tests-main.yaml new file mode 100644 index 000000000..c074676f7 --- /dev/null +++ b/.github/workflows/run-all-tests-main.yaml @@ -0,0 +1,38 @@ +name: "🔍 Fuzz Tests" +on: + push: + branches: [main] + workflow_dispatch: +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true +jobs: + fuzz_tests: + name: fuzz tests + runs-on: ubuntu-latest + steps: + - name: checkout + uses: actions/checkout@v3 + - uses: actions/cache@v3 + id: cache-fuzzer + with: + path: | + packages/fuzzer/prebuilds + key: + fuzzer-cache-${{ runner.os }}-${{ + hashFiles('packages/fuzzer/CMakeLists.txt', + 'packages/fuzzer/**/*.h', 'packages/fuzzer/**/*.cpp') }} + - name: node + uses: actions/setup-node@v3 + with: + node-version: 22 + cache: "npm" + - name: install dependencies + run: npm ci + - name: build project + run: npm run build + - name: build fuzzer + if: ${{ steps.cache-fuzzer.outputs.cache-hit != 'true' }} + run: npm run build --workspace=@jazzer.js/fuzzer + - name: run all fuzz tests + run: node fuzztests/runFuzzTests.js diff --git a/.github/workflows/run-all-tests.yaml b/.github/workflows/run-all-tests-pr.yaml similarity index 54% rename from .github/workflows/run-all-tests.yaml rename to .github/workflows/run-all-tests-pr.yaml index e49d4cc96..df480ee2f 100644 --- a/.github/workflows/run-all-tests.yaml +++ b/.github/workflows/run-all-tests-pr.yaml @@ -1,55 +1,63 @@ -name: "🔍 Tests" +name: "🔍 Tests PR" on: pull_request: branches: [main] merge_group: workflow_dispatch: +concurrency: + group: + ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} + cancel-in-progress: true jobs: linting: name: lint - runs-on: ubuntu-20.04 + runs-on: ubuntu-latest steps: - name: checkout uses: actions/checkout@v3 - name: node uses: actions/setup-node@v3 with: - node-version: 16 + node-version: 22 cache: "npm" - name: install dependencies run: npm ci - - name: install dependencies with apt - run: | - wget -O - https://apt.llvm.org/llvm-snapshot.gpg.key | sudo apt-key add - - sudo apt-get install software-properties-common - sudo add-apt-repository 'deb http://apt.llvm.org/focal/ llvm-toolchain-focal-16 main' - sudo apt-get install clang-tidy-16 - sudo rm -f /usr/bin/clang-tidy - sudo ln -s /usr/bin/clang-tidy-16 /usr/bin/clang-tidy + - name: install clang-tidy + run: sudo apt-get install -y clang-tidy - name: build project # Build project so that imports can be checked during linting run: npm run build - name: build fuzzer - # Build the native addon so that CMake generates compile_commands.json that is needed by clang-tidy + # Build the native addon so that CMake downloads libFuzzer and + # generates compile_commands.json, which are needed by clang-tidy run: npm run build --workspace=@jazzer.js/fuzzer - name: check formatting and linting run: npm run check - unit_tests: + tests: name: unit tests runs-on: ${{ matrix.os }} strategy: matrix: - os: [windows-2019, macos-11, ubuntu-20.04] - node: [16] + os: [windows-latest, ubuntu-latest, macos-latest] + node: [20] include: - # Test all LTS versions on Linux - - os: ubuntu-20.04 - node: 18 - - os: ubuntu-20.04 - node: 20 + # Node 14 runtime compatibility is covered by end-to-end tests. + # Unit tests require npm 7+ (workspaces) which Node 14 doesn't ship. + # Ceiling: current LTS + - os: ubuntu-latest + node: 24 steps: - name: checkout uses: actions/checkout@v3 + - uses: actions/cache@v3 + id: cache-fuzzer + with: + path: | + packages/fuzzer/prebuilds + key: + fuzzer-cache-${{ matrix.os }}-${{ + hashFiles('packages/fuzzer/CMakeLists.txt', + 'packages/fuzzer/**/*.h', 'packages/fuzzer/**/*.cpp') }} - name: node uses: actions/setup-node@v3 with: @@ -63,122 +71,72 @@ jobs: - name: build project run: npm run build - name: build fuzzer + if: ${{ steps.cache-fuzzer.outputs.cache-hit != 'true' }} run: npm run build --workspace=@jazzer.js/fuzzer - name: run all tests run: npm run test - examples: - name: examples + end-to-end: + name: end-to-end (${{ matrix.os }}) runs-on: ${{ matrix.os }} strategy: + fail-fast: true matrix: - os: [windows-2019, macos-11, ubuntu-20.04] - node: [16] - include: - # Test all LTS versions on Linux - - os: ubuntu-20.04 - node: 18 - - os: ubuntu-20.04 - node: 20 + os: [ubuntu-latest, macos-latest, windows-latest] steps: - name: checkout uses: actions/checkout@v3 + # Build with node.js 22 - name: node uses: actions/setup-node@v3 with: - node-version: ${{ matrix.node }} + node-version: 22 cache: "npm" - name: MSVC (windows) uses: ilammy/msvc-dev-cmd@v1 if: contains(matrix.os, 'windows') - - name: install dependencies - run: npm ci - - name: build project - run: npm run build - - name: build fuzzer - run: npm run build --workspace=@jazzer.js/fuzzer - - name: run all examples - run: npm run example - fuzz_tests: - name: fuzz tests - runs-on: ubuntu-20.04 - steps: - - name: checkout - uses: actions/checkout@v3 - - name: node - uses: actions/setup-node@v3 - with: - node-version: 16 - cache: "npm" - - name: install dependencies - run: npm ci - - name: build project - run: npm run build - - name: build fuzzer - run: npm run build --workspace=@jazzer.js/fuzzer - - name: run all fuzz tests - run: node fuzztests/runFuzzTests.js - end-to-end: - name: end-to-end - runs-on: ubuntu-20.04 - steps: - - name: checkout - uses: actions/checkout@v3 - # Build with node.js 16 - - name: node - uses: actions/setup-node@v3 - with: - node-version: 16 - cache: "npm" - name: pack jazzer.js run: cd end-to-end && ./package-jazzer-js.sh + shell: bash - name: build example run: cd end-to-end && npm install --save-dev *.tgz && npm run build + shell: bash # Run with different node.js versions # all in one job to avoid rebuilding - name: "node 14" + if: matrix.os != 'macos-latest' uses: actions/setup-node@v3 with: node-version: 14 - cache: "npm" - - name: run tests - run: cd end-to-end && npx jest - - - name: "node 16" - uses: actions/setup-node@v3 - with: - node-version: 16 - cache: "npm" - - name: run tests + - name: run tests (node 14) + if: matrix.os != 'macos-latest' run: cd end-to-end && npx jest + shell: bash - - name: "node 18" + - name: "node 20" uses: actions/setup-node@v3 with: - node-version: 18 - cache: "npm" - - name: run tests + node-version: 20 + - name: run tests (node 20) run: cd end-to-end && npx jest + shell: bash - - name: "node 20" + - name: "node 24" uses: actions/setup-node@v3 with: - node-version: 20 - cache: "npm" - - name: run tests + node-version: 24 + - name: run tests (node 24) run: cd end-to-end && npx jest - + shell: bash auto-merge: needs: - linting - - unit_tests - - examples - - fuzz_tests + - tests - end-to-end permissions: pull-requests: write contents: write - runs-on: ubuntu-20.04 + runs-on: ubuntu-latest if: ${{ github.actor == 'dependabot[bot]' }} steps: - name: Dependabot metadata diff --git a/.gitignore b/.gitignore index 1678109a5..4581b9689 100644 --- a/.gitignore +++ b/.gitignore @@ -35,6 +35,8 @@ coverage build cmake-build-* +packages/fuzzer/prebuilds + # Dependency directories node_modules/ diff --git a/.header.js b/.header.js index 9e56edef6..c5acda1b2 100644 --- a/.header.js +++ b/.header.js @@ -1,5 +1,5 @@ /* - * Copyright 2023 Code Intelligence GmbH + * Copyright 2026 Code Intelligence GmbH * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/.npmignore b/.npmignore index f8830c54b..dd3a92ca5 100644 --- a/.npmignore +++ b/.npmignore @@ -1,4 +1,5 @@ # Ignore build files similar to .gitignore +.vscode .idea .github .husky @@ -10,6 +11,8 @@ build cmake-build-* coverage node_modules +tests +shared # Exclude docs, those can be accessed online docs @@ -25,3 +28,9 @@ example *.ts !*.d.ts *test*.d.ts + + +# Exclude native fuzzer sources +**/CMakeLists.txt +**/*.cpp +**/*.h diff --git a/README.md b/README.md index 663d1c1d5..47879108d 100644 --- a/README.md +++ b/README.md @@ -8,43 +8,13 @@ />
- - - - - - - - - - - PRs welcome - -
- + Website | Blog | Twitter -> [!IMPORTANT] -> -> Hello Jazzer/Jazzer.js users! -> -> We stopped maintaining Jazzer/Jazzer.js as open source. But we'd be happy to -> try and understand what you're trying to achieve with it, and help you if we -> can! -> -> We already added significant new value to our CI Fuzz solution, which includes -> Jazzer and Jazzer.js. You can see more here at -> [code-intelligence.com](https://code-intelligence.com), or get in contact with -> us via [sales@code-intelligence.com](mailto:sales@code-intelligence.com) -> -> Thanks, -> -> The Code Intelligence team - Jazzer.js is a coverage-guided, in-process fuzzer for the [Node.js](https://nodejs.org) platform developed by [Code Intelligence](https://www.code-intelligence.com). It is based on diff --git a/docs/bug-detectors.md b/docs/bug-detectors.md new file mode 100644 index 000000000..9d0b270e3 --- /dev/null +++ b/docs/bug-detectors.md @@ -0,0 +1,148 @@ +# Bug Detectors + +Bug detectors (sometimes also called sanitizers) are one of the key features +when fuzzing memory-safe languages. In Jazzer.js, they can detect some of the +most common vulnerabilities in JavaScript code. Built-in bug detectors are +enabled by default, but can be disabled by adding the +`--disableBugDetectors=` flag to the project configuration. To disable +all built-in bug detectors, add `--disableBugDetectors='.*'` to the project +configuration. + +## Command Injection + +Hooks all functions of the built-in module `child_process` and reports a finding +if the fuzzer was able to pass a command to any of the functions. + +_Disable with:_ `--disableBugDetectors=command-injection` in CLI mode; or when +using Jest in `.jazzerjsrc.json`: + +```json +{ "disableBugDetectors": ["command-injection"] } +``` + +## Path Traversal + +Hooks all relevant functions of the built-in modules `fs` and `path` and reports +a finding if the fuzzer could pass a special path to any of the functions. + +_Disable with:_ `--disableBugDetectors=path-traversal` in CLI mode; or when +using Jest in `.jazzerjsrc.json`: + +```json +{ "disableBugDetectors": ["path-traversal"] } +``` + +## Prototype Pollution + +Detects Prototype Pollution. Prototype Pollution is a vulnerability that allows +attackers to modify the prototype of a JavaScript object, which can lead to +validation bypass, denial of service and arbitrary code execution. + +The Prototype Pollution bug detector can be configured in the +[custom hooks](./fuzz-settings.md#customhooks--arraystring) file. + +- `instrumentAssignmentsAndVariableDeclarations` - if called, the bug detector + will instrument assignment expressions and variable declarations and report a + finding if `__proto__` of the declared or assigned variable contains any + properties or methods. When called in dry run mode, this option will trigger + an error. +- `addExcludedExactMatch` - if the stringified `__proto__` equals the given + string, the bug detector will not report a finding. This is useful to exclude + false positives. + +Here is an example configuration in the +[custom hooks](./fuzz-settings.md#customhooks--arraystring) file: + +```javascript +const { getBugDetectorConfiguration } = require("@jazzer.js/bug-detectors"); + +getBugDetectorConfiguration("prototype-pollution") + ?.instrumentAssignmentsAndVariableDeclarations() + ?.addExcludedExactMatch('{"methods":{}}'); +``` + +Adding instrumentation to variable declarations and assignment expressions +drastically reduces the fuzzer's performance because the fuzzer will check for +non-empty `__proto__` on every variable declaration and assignment expression. +In addition, this might cause false positives because some libraries (e.g. +`lodash`) use `__proto__` to store methods. Therefore, in the default +configuration these options are disabled. + +_Shortcoming:_ The instrumentation of variable declarations and assignment +expressions will not detect if the prototype of the object in question has new, +deleted, or modified functions. But it will detect if a function of a prototype +of an object has become a non-function. The following example illustrates this +issue: + +```javascript +class A {} +class B extends A {} +const b = new B(); +b.__proto__.polluted = true; // will be detected +b.__proto__.test = [1, 2, 3]; // will be detected +b.__proto__.toString = 10; // will be detected +b.__proto__.toString = () => "polluted"; // will not be detected +delete b.__proto__.toString; // will not be detected +b.__proto__.hello = () => "world"; // will not be detected +``` + +However, our assumption is that if the fuzzer is able to modify the methods in a +prototype, it will be able also find a way to modify other properties of the +prototype that are not functions. If you find a use case where this assumption +does not hold, feel free to open an issue. + +_Disable with:_ `--disableBugDetectors=prototype-pollution`in CLI mode; or when +using Jest in `.jazzerjsrc.json`: + +```json +{ "disableBugDetectors": ["prototype-pollution"] } +``` + +## Remote Code Execution + +Hooks the `eval` and `Function` functions and reports a finding if the fuzzer +was able to pass a special string to `eval` and to the function body of +`Function`. + +_Disable with:_ `--disable_bug_detectors=remote-code-execution`in CLI mode; or +when using Jest in `.jazzerjsrc.json`: + +```json +{ "disableBugDetectors": ["remote-code-execution"] } +``` + +## Server-Side Request Forgery (SSRF) + +Reports a finding upon detection of outgoing communication that originates from +the built-in libraries `net`, `tls`, `http`, `http/2`, `https`, and `dgram`. + +_Configuration:_ Permitted TCP and UDP connections can be configured in the +[custom hooks](./fuzz-settings.md#customhooks--arraystring) file. + +```javascript +const { getBugDetectorConfiguration } = require("@jazzer.js/bug-detectors"); + +getBugDetectorConfiguration("ssrf") + ?.addPermittedTCPConnection("localhost", 8080) + .addPermittedUDPConnection("localhost", 9090); +``` + +_Disable with:_ `--disable_bug_detectors=ssrf` in CLI mode; or when using Jest +in `.jazzerjsrc.json`: + +```json +{ "disableBugDetectors": ["ssrf"] } +``` + +For implementation details see +[../packages/bug-detectors/internal](../packages/bug-detectors/internal). + +## Writing Custom Bug Detectors + +Users can write their own bug detectors using the +[custom hooks feature](./fuzz-settings.md#customhooks--arraystring). Use the +function `reportFinding` to report a finding from your bug detector---it makes +sure that the finding escapes all try/catch blocks along the way and is +definitely reported. Beware that `reportFinding` will only report the first +finding from any of the bug detectors and all subsequent findings will be +ignored. diff --git a/docs/custom-hooks.md b/docs/custom-hooks.md new file mode 100644 index 000000000..213980377 --- /dev/null +++ b/docs/custom-hooks.md @@ -0,0 +1,83 @@ +# Custom Hooks + +Custom hooks allow users to hook functions in built-in libraries, libraries +loaded at runtime, or functions in global scope. Custom hooks are useful for +writing bug detectors, removing fuzzing blockers, and improving the fuzzing +process by providing additional feedback to the fuzzer. + +## Defining Custom Hooks + +Import the functions `registerBeforeHook`, `registerReplaceHook`, +`registerAfterHook` from Jazzer.js: + +```javascript +const { + registerBeforeHook, + registerReplaceHook, + registerAfterHook, +} = require("@jazzer.js/hooking"); +``` + +All three functions have the same interface and can be used to register a custom +hook function: + +```typescript +function registerHook( + target: string, // target function name that we want to hook + pkg: string, // the name of the target library + async: boolean, // the hook function will be run in async (true) or sync (false) mode? + hookFn: HookFn // custom hook function +); +``` + +Nested functions can be hooked by concatenating all parent functions and classes +with a dot. Consider the following example: + +```javascript +function a(arg1, arg2) { + function foo() { + return arg1 + arg2; + } + return foo(); +} +``` + +To hook function `foo` defined inside function `a`, the `target` string of the +hook registering function should be `"a.foo"`. Here is an example: +`registerReplaceHook("a.foo", "target-lib-js", false, () => {})`. + +The custom hook function `hookFn` will be called either before, after, or +replace the original target function. Its interface depends on the hook +registering function: + +- for `registerBeforeHook`, the custom hook function will be called before the + original function like this: `hookFn(thisPtr, params, hookId)` +- for `registerReplaceHook`, the custom hook function will replace the original + function and will be called like this: + `hookFn(thisPtr, params, hookId, originalFn)` +- for `registerAfterHook`, the custom hook function will be called after the + original function like this: + `hookFn(thisPtr, params, hookId, originalFnResult)` + +The parameters of the `hookFn` are as follows: + +- `thisPtr` - points to the object in which the original function was defined, +- `params` - the parameters of the original function, +- `hookId` - a (probabilistically) unique identifier for this particular compare + hint; this value can be passed to the functions `guideTowardsEquality`, + `guideTowardsContainment`, `exploreState` to help guide the fuzzer, +- `originalFn` - the original function can be called inside the `hookFn` when + registering a hook with `registerReplaceHook`, +- `originalFnResult` - the results of calling the original function can be used + inside the `hookFn` when registering a hook with `registerAfterHook`. + +## Examples + +Several examples showcasing the custom hooks can be found in +[../examples/custom-hooks/custom-hooks.js](../examples/custom-hooks/custom-hooks.js). + +## Debugging Custom Hooks + +Enable the [`verbose`](./fuzz-settings.md#verbose--boolean) option and Jazzer.js +will print (among other things) which hooks were applied, which hook functions +are available in general, and which hooks could not be applied. diff --git a/docs/fuzz-settings.md b/docs/fuzz-settings.md index 99624dfde..b36bca69f 100644 --- a/docs/fuzz-settings.md +++ b/docs/fuzz-settings.md @@ -1,326 +1,1009 @@ -# Advanced Fuzzing Settings - -This page describes advanced fuzzing settings. +# Fuzzing Settings ## Configuration options Jazzer.js can be configured in multiple ways depending on the concrete use case. - -The `Options` interface in the [options.ts](../packages/core/options.ts) file -describes all available settings. These can be set via CLI argument, environment -variable or in integration specific ways, e.g. Jest configuration files. - -In general the following preference applies with increasing priority: +There are three ways to configure Jazzer.js: + +1. **CLI** - when a fuzz function is executed directly from the command line + using `npx jazzer ...`, Jazzer.js can be configured by providing arguments + directly on the command line, +2. **Jest** - when Jazzer.js is used to run Jest tests, it can be + [configured](./jest-integration.md#setting-up-the-jazzerjs-jest-integration) + using `.jazzerjsrc.json`, +3. **ENV** - when Jazzer.js runs in either CLI or Jest mode, most options can be + specified by an environment variable. +4. **Jest fuzz test** - some options can be set directly in Jest fuzz test. + These options are: ([`timeout`](#timeout--number), + [`dictionaryEntries`](#dictionaryentries--arraystring--uint8array--int8array), + [`fuzzerOptions`](#fuzzeroptions--arraystring), and + [`sync`](#sync--boolean)). + +The following preferences apply with increasing priority: - Default values from the [`defaultOptions`](../packages/core/options.ts) object - (names in camel case format, e.g. `fuzzTarget`) -- Configuration file values (e.g. `jazzerjsrc` or Jest configuration files) +- Configuration file values (e.g. `.jazzerjsrc.json` or Jest + [configuration files](./jest-integration.md#setting-up-the-jazzerjs-jest-integration)) - Environment variables (names in upper snake case format with `JAZZER_` prefix, - e.g. `JAZZER_FUZZ_TARGET=Foo`) -- CLI arguments (names in lower snake case format, e.g. `--fuzz_target=Foo`) + e.g. `JAZZER_INCLUDES=foo`) +- CLI arguments +- Per Jest fuzz test arguments + +All options configurable in Jazzer.js are described below. To see the current +values of every option in use, it might be helpful to run Jazzer.js in +[verbose mode](#verbose--boolean). + +_Note:_ The CLI provides abbreviations for common arguments, e.g. `--includes` +can be abbreviated to `-i`. Run with `--help` to show all possible +abbreviations: -**Note**: The CLI provides abbreviations for common arguments, e.g. `--includes` -can be abbreviated to `-i`. Only the main argument name is supported in other -configuration approaches, though. +```shell +npx jazzer --help +``` + +### `corpus` : [array\] -## Corpus +Default: depends on the fuzz test runner (CLI/Jest) -Jazzer.js generates meaningful inputs to a fuzz target based on coverage and -comparison feedback. If a new input can reach new code paths, it is saved in a -dedicated directory, called corpus, and used for further mutations to the guide -the fuzzer during the following iterations. +Set the corpus directories or the selected fuzz test inputs to be used by +Jazzer.js (mixing directories and fuzz test inputs is not allowed). -Also, existing inputs in the corpus directory, called seeds, are executed on -startup, so that new fuzzing runs can start off where previous ones stopped. +There are two types of corpus directories in Jazzer.js: -One or more corpus directories can be specified as the last entry/entries in the -CLI parameter list, as described in the `--help` command. The first corpus -directory will be used to save interesting new inputs, whereas seeds from all -directories are executed during startup. +- _generated corpus directories_ where inputs that generate new coverage during + fuzzing runs are saved, +- _regression corpus directory_ that contains all inputs that ever resulted in a + crash. -**Example invocation:** +**CLI:** Default: `[]` In CLI, `corpus` is a positional argument that should be +specified without a flag as the last argument. It is possible to specify several +corpus directories, however only the first directory will be used as generated +corpus directory, whereas the other directories will be used only on fuzzer +startup. Here is an example how to specify two corpus directories +`generated_corpus_dir` and `only_on_startup_corpus` in the current working +directory: ```shell -npx jazzer target corpus_dir other_corpus +npx jazzer fuzz-file ./generated_corpus_dir ./only_on_startup_corpus ``` -## Reproducing errors +If no corpus directory is provided, Jazzer.js will start fuzzing from scratch +and will not save any inputs other than crashes on exit. -Once Jazzer.js finds a problematic input, it stores it in the current working -directory using a problem prefix like `crash-`, `mem-`, `timeout-` or the like. - -This input can then be used to reproduce the issue by specifying it as last -parameter in the CLI call: +It is also possible to provide inputs directly. In that case, Jazzer.js will run +them once and exit. To run the fuzz target with inputs `crash-abcdef0123456789` +and `my-test.txt` in CLI from the current directory can be done as follows: ```shell -npx jazzer target crash-abcdef0123456789 +npx jazzer fuzz-file ./crash-abcdef0123456789 ./my-test.txt ``` -## Value profile +**Jest:** Default: In Jest runner mode, Jazzer.js automatically chooses the +corpus directories based on the name of the fuzz test and the +[mode](#mode--fuzzingregression) ("fuzzing" or "regression"). -Jazzer.js provides coverage and comparison feedback to the internally used -libFuzzer instance. By setting the libFuzzer flag `-use_value_profile=1` via the -CLI, new values in intercepted compares are treated as new coverage. This has -the potential to discover many additional inputs, which would not be detected -otherwise, but may reduce runtime performance significantly. +_It is not possible to change or modify the corpus directories._ -An example of using value profiling can be found at -[tests/value_profiling/fuzz.js](../tests/value_profiling/fuzz.js). +In _regression mode_, each fuzz test has its dedicated regression corpus +directory derived from the name of the file containing the tests, the names of +the enclosing describe-blocks, and the actual test name. -**Example invocation:** +For example, suppose that we have a project with following structure: -```shell -npx jazzer target -- -use_value_profile=1 +```text +. +├── package.json +├── package-lock.json +├── src +│ └── ... +└── tests + └── tests.fuzz.js +``` + +and two fuzz tests in `./tests/tests.fuzz.js`: + +```javascript +describe("Target", () => { + test.fuzz("fuzz test 1", (data) => {}); + test.fuzz("fuzz test 2", (data) => {}); +}); ``` -## Timeout +The first time when our example fuzz tests are executed by Jazzer.js by e.g. +running `npx jest tests/tests.fuzz.js` from the command line, Jazzer.js will +create the regression corpus directories `./tests/tests.fuzz/Target/fuzz_test_1` +and `./tests/tests.fuzz/Target/fuzz_test_2` that the two fuzz tests will +respectively use in regression mode. -Invocations of fuzz targets, which take longer than the configured timeout, will -cause fuzzing to stop and a timeout finding to be reported. A default timeout of -5000 milliseconds is preconfigured, but can be changed using the `--timeout` -fuzzer flag. +In _fuzzing mode_, each fuzz test has its dedicated generated corpus +subdirectory in `.cifuzz-corpus/` derived from its path within the project, its +name, the names of the describe-blocks, and the actual test name. The regression +corpus directory is also used in fuzzing mode for two reasons: -Timeouts work in the sync- and asynchronous fuzzing mode. +1. on startup to load all contained inputs; and 2) to save all crashing inputs + the fuzzer finds while fuzzing. -**Example invocation:** +In the example above, the folder structure after running Jazzer.js in fuzzing +mode will look as follows: ```shell -npx jazzer target --timeout=10000 +. +├── .cifuzz-corpus +│ └── tests +│ └── tests.fuzz +│ └── Target +│ ├── fuzz_test_1 # generated corpus directory containing inputs for "fuzz test 1" test +│ └── fuzz_test_2 +├── package.json +├── package-lock.json +├── src +│ └── ... +└── tests + └── tests.fuzz.js + └── tests.fuzz # main regression corpus directory for tests.fuzz.js + └── Target + ├── fuzz_test_1 # regression corpus directory for "fuzz test 1" test + │ └── regression_test_1 # a regression input + │ └── regression_test_2 # another regression input + └── fuzz_test_2 # regression corpus directory for "fuzz test 2" test + └── ... # regression inputs for "fuzz test 2" test ``` -**Example output:** +**ENV:** It is not possible to set corpus directories via an environmental +variable. -```text -ALARM: working on the last Unit for 10 seconds - and the timeout value is 10 (use -timeout=N to change) -MS: 2 ShuffleBytes-InsertRepeatedBytes-; base unit: adc83b19e793491b1c6ea0fd8b46cd9f32e592fc -0xe3,0xe3,0xe3,0xe3,0xe3,0xe3,0xe3,0xe3,0xe3,0xe3,0xa, -\343\343\343\343\343\343\343\343\343\343\012 -artifact_prefix='./'; Test unit written to ./timeout-d593b924e138abd8ec4c97afe40c408136ecabd4 -Base64: 4+Pj4+Pj4+Pj4wo= -==96284== ERROR: libFuzzer: timeout after 10 seconds -SUMMARY: libFuzzer: timeout +### `coverage` : [boolean] + +Default: false + +Generate a code coverage report upon exit. + +The report is generated in the directory specified by the +[`coverageDirectory`](#coveragedirectory--string) option using the reporters +specified by the [`coverageReporters`](#coveragereporters--arraystring) option. + +If the fuzzer does not finish, no report will be generated. Pressing CTRL-C to +manually stop the fuzzer might result in incomplete coverage reports. To +reliably generate coverage reports, it makes sense to run the fuzzer on each +input in the corpus only once. This can be accomplished by adding the following +to the option [fuzzerOptions](#fuzzeroptions--arraystring): `-runs=1` (run each +input once and quit); or `-max_total_time=N` (fuzz for N seconds and quit); or +by running the fuzzer in [regression mode](#mode--fuzzingregression) using the +option `--mode=regression`. While it's possible to generate coverage reports by +running Jazzer.js in fuzzing mode, instrumentation for code coverage makes +fuzzing less efficient. + +**CLI:** To run the fuzz function `buzz` in file `my-fuzz-file.js` for 10 +seconds from the command line and generate a code coverage report, add the +`--coverage` option without arguments: + +```bash +npx jazzer my-fuzz-file --fuzzEntryPoint=buzz --coverage -- -max_total_time=10 +``` + +**Jest:** Call Jest with `--coverage` flag: + +```bash +npx jest --coverage +``` + +Or add the following to the +[Jest configuration file](https://jestjs.io/docs/configuration) (e.g. +`jest.config.js`): + +```javascript +module.exports = { + coverage: true, +}; +``` + +_Note:_ This option **cannot** be set in `.jazzerjsrc.json`. + +**ENV:** Prepend the environment variable `JAZZER_COVERAGE=true` to the CLI +command in order to generate a code coverage report of the fuzz function `fuzz` +(default) in file `./my-fuzz-file.js` running each input from the corpus +directory `./corpus` once: + +```bash +JAZZER_COVERAGE=true npx jazzer my-fuzz-file ./corpus -- -runs=1 +``` + +In Jest mode it is not possible to set this option using an environment +variable. Use the method described in the "Jest" section above instead. + +### `coverageDirectory` : [string] + +Default: "coverage" + +Set the output directory for the coverage reports. + +**CLI:** This example sets the output directory for the coverage reports to +`./my_coverage_directory`: + +```example +npx jazzer my-fuzz-file --mode=regression --coverage --coverageDirectory=./my_coverage_directory +``` + +**Jest:** This example sets the output directory for the coverage reports to +`./my_coverage_directory`: + +```bash +npx jest --coverageDirectory=./my_coverage_directory --coverage +``` + +Alternatively, use a +[Jest configuration file](https://jestjs.io/docs/configuration). For example +`jest.config.js`: + +```javascript +module.exports = { + coverageDirectory: "./my_coverage_directory", +}; +``` + +_Note:_ This option **cannot** be set in `.jazzerjsrc.json` and has to be +provided to Jest directly. + +**ENV:** To set the output directory to `./my_coverage_directory` when fuzzing +on the command line, prepend the environment variable to the command as follows: + +```bash +JAZZER_COVERAGE_DIRECTORY=./my_coverage_directory npx jazzer my-fuzz-file --coverage +``` + +_Note:_ In Jest mode it is not possible to set this option using an environment +variable. + +### `coverageReporters` : [array\] + +Default: ["json", "lcov", "text", "clover"] + +Select the format of the coverage reports. + +A comprehensive list of supported coverage reporters can be found in the +[istanbul documentation](https://github.com/istanbuljs/istanbuljs/tree/master/packages/istanbul-reports/lib). + +_Note:_ The [`coverage`](#coverage--boolean) option must be set, otherwise no +coverage reports will be generated. + +**CLI:** To generate code coverage reports in only `json` and `lcov` formats in +CLI mode: + +```bash +npx jazzer my-fuzz-file --coverage --coverageReporters=json --coverageReporters=lcov +``` + +**Jest:** To generate code coverage reports in only `json` and `text` format in +Jest mode, add the following option to the call to Jest: + +```bash +npx jest --coverageReporters=json --coverageReporters=text --coverage ``` -## Custom Hooks +The coverage reporters can also be set in the Jest configuration file +`jest.config.js`: + +```javascript +module.exports = { + coverageReporters: ["json", "text"], + coverage: true, +}; +``` + +_Note:_ This option **cannot** be set in `.jazzerjsrc.json` and has to be +configured for Jest. + +**ENV:** To only get coverage reports in `json` and `lcov` formats in CLI mode, +add the following environment variable to the command: + +```bash +JAZZER_COVERAGE='["json","lcov"]' npx jazzer my-fuzz-file --coverage +``` + +_Note:_ Setting this environmental variable in Jest mode has no effect. +Configure Jest using the methods described above. + +### `customHooks` : [array\] -Custom hooks are useful for writing bug detectors, removing fuzzing blockers, -and improving the fuzzing process by providing feedback to the fuzzer. At low -level, custom hooks in Jazzer.js allow the user to +Default: [] -- replace named functions with their own (hooking nameless functions is not - supported), -- call the original function when needed, -- read from and write to the original function's arguments, -- replace the return value of the original function. +Add file(s) containing custom hooks. -### Enabling Custom Hooks +For a guide on how to write custom hooks in Jazzer.js, see +[custom-hooks.md](custom-hooks.md#defining-custom-hooks). -To enable custom hooks in Jazzer.js, add either -`-h .js` or -`--custom_hooks .js` to the project -configuration in `package.json`: +**CLI:** To add a custom hooks file `./my_custom_hooks.js` in command line mode, +use the flag `--customHooks=./my_custom_hooks.js` (or +`-h ./my_custom_hooks.js`): + +```bash +npx jazzer my-fuzz-file --customHooks=./my_custom_hooks.js +``` + +Or in the `package.json` file: ```json "scripts": { - "fuzz": "jazzer fuzz ... -h .js" + "fuzz": "jazzer my-fuzz-file --customHooks=./my_custom_hooks.js" } ``` Several files with custom hooks can be added like this: -`-h file1.js -h file2.js`. Each of these files can contain multiple hook -definitions. +`--customHooks=file1.js --customHooks=file2.js`. Each of these files can contain +multiple hook definitions. + +**Jest:** To add the custom hooks files `./myCustomHooks-1.js` and +`./myCustomHooks-2.js` in Jest mode, add the following to the Jazzer.js +configuration file `.jazzerjsrc.json`: + +```json +{ + "customHooks": ["./myCustomHooks-1.js", "./myCustomHooks-2.js"] +} +``` -### Defining Custom Hooks +**ENV:** To add a custom hooks files `./myCustomHooks-1.js` and +`./myCustomHooks-2.js` to fuzz tests in CLI or Jest mode, add the following +environment variable to the command: + +```bash +JAZZER_CUSTOM_HOOKS='["./myCustomHooks-1.js","./myCustomHooks-2.js"]' npm run fuzz +``` -Import the functions `registerBeforeHook`, `registerReplaceHook`, -`registerAfterHook` from Jazzer.js: +### `dictionaryEntries` : [array\] + +Default: undefined + +Set dictionary entries for a Jest fuzz test. + +The advantage of using this option is that dictionaries are treated as part of +the fuzz test and can be saved and versioned together with the test. + +_Note:_ this option can only be set directly in the Jest fuzz test. + +**Jest fuzz test:** To set dictionary entries for any individual Jest fuzz test, +provide them as an array of strings, `Uint8Arrays`, or `Int8Arrays` to the +`dictionaryEntries` option of the `it.fuzz` function: ```javascript -const { - registerBeforeHook, - registerReplaceHook, - registerAfterHook, -} = require("@jazzer.js/hooking"); +const xmlDictionary = ["IDREF"," {...}, + {dictionaryEntries: xmlDictionary} ``` -All three functions have the same interface and can be used to register a custom -hook function: +### `disableBugDetectors` : [array\] + +Default: [] + +Disable bug detectors (aka sanitizers) that match the provided regular +expressions. + +For example, to disable all bug detectors use `".*"`. See +[the list of all bug detectors](bug-detectors.md) available in Jazzer.js. -```typescript -function registerHook( - target: string, // target function name that we want to hook - pkg: string, // the name of the target library - async: boolean, // the hook function will be run in async (true) or sync (false) mode? - hookFn: HookFn // custom hook function -); +**CLI:** To disable the _prototype pollution_ and _path traversal_ bug detectors +on the command line use: + +```bash +npx jazzer my-fuzz-file --disableBugDetectors=prototype-pollution --disableBugDetectors=path-traversal ``` -Nested functions can be hooked by concatenating all parent functions and classes -with a dot. Consider the following example: +**Jest:** To disable the _prototype pollution_ and _path traversal_ bug +detectors in Jest mode, add the following option to the Jazzer.js configuration +file `.jazzerjsrc.json`: -```javascript -function a(arg1, arg2) { - function foo() { - return arg1 + arg2; - } - return foo(); +```json +{ + "disableBugDetectors": ["prototype-pollution", "path-traversal"] } ``` -To hook function `foo` defined inside function `a`, the `target` string of the -hook registering function should be `"a.foo"`. Here is an example: -`registerReplaceHook("a.foo", "target-lib-js", false, () => {})`. +**ENV:** To disable the _prototype pollution_ and _path traversal_ bug detectors +in CLI run mode, add the following environment variable to the command: + +```bash +JAZZER_DISABLE_BUG_DETECTORS='["prototype-pollution", "path-traversal"]' npx jazzer my-fuzz-file +``` + +And identically in Jest mode: -The custom hook function `hookFn` will be called either before, after, or -replace the original target function. Its interface depends on the hook -registering function: +```bash +JAZZER_DISABLE_BUG_DETECTORS='["prototype-pollution", "path-traversal"]' npx jest +``` -- for `registerBeforeHook`, the custom hook function will be called before the - original function like this: `hookFn(thisPtr, params, hookId)` -- for `registerReplaceHook`, the custom hook function will replace the original - function and will be called like this: - `hookFn(thisPtr, params, hookId, originalFn)` -- for `registerAfterHook`, the custom hook function will be called after the - original function like this: - `hookFn(thisPtr, params, hookId, originalFnResult)` +### `dryRun` : [boolean] -The parameters of the `hookFn` are as follows: +Default: false -- `thisPtr` - points to the object in which the original function was defined, -- `params` - the parameters of the original function, -- `hookId` - a (probabilistically) unique identifier for this particular compare - hint; this value can be passed to the functions `guideTowardsEquality`, - `guideTowardsContainment`, `exploreState` to help guide the fuzzer, -- `originalFn` - the original function can be called inside the `hookFn` when - registering a hook with `registerReplaceHook`, -- `originalFnResult` - the results of calling the original function can be used - inside the `hookFn` when registering a hook with `registerAfterHook`. +Disable code instrumentation for fuzzing. -### Examples +The option might be useful in several cases: -Several examples showcasing the custom hooks can be found -[here](../examples/custom-hooks/custom-hooks.js). +1. When debugging the fuzz target and making sure that the instrumentation does + not interfere with target code; +2. When running the fuzzer in [regression mode](#mode--fuzzingregression) where + instrumentation is not required, the tests run faster if not instrumented. -### Debugging hooks +**CLI:** To enable dry run mode on the command line, use: -Debugging custom hooks can be tedious, hence the verbose logging option in -Jazzer.js allows an insight into which hooks were applied, which hooking options -are available in general, and which hooks could not be applied (e.g. due to the -hooking point not being available). Check the section -[Verbose logging](#verbose-logging) for information on how to enable this -option. +```bash +npx jazzer my-fuzz-file --dryRun +``` + +**Jest:** To enable dry run mode in Jest mode, add the following option to the +Jazzer.js configuration file `.jazzerjsrc.json`: + +```json +{ + "dryRun": true +} +``` + +**ENV:** To enable dry run mode in CLI or Jest mode, add the following +environment variable to the command: + +```bash +JAZZER_DRY_RUN=true npx jazzer my-fuzz-file +``` + +### `excludes` : [array\] + +Default: ["node_modules"] + +Exclude files from code instrumentation for fuzzing. + +If any of the provided strings matches the file path, the file will not be +instrumented. This option supports only one pattern: `*` that matches all files. +Should the [`includes`](#includes--arraystring) option be set to a non-default +value, the default value of `excludes` will be automatically changed to `[]` to +enable fuzzing of libraries in the `node_modules` directory. + +**CLI:** To exclude all files from instrumentation, use: + +```bash +npx jazzer my-fuzz-file --excludes="*" +``` + +To exclude the files whose paths contain "unrelated" and "foo" from +instrumentation, use: + +```bash +npx jazzer fuzz --excludes="unrelated" --excludes="foo" +``` + +**Jest:** To exclude files whose paths contain "unrelated" and "foo" from +instrumentation in Jest mode, add the following option to the Jazzer.js +configuration file `.jazzerjsrc.json`: + +```json +{ + "excludes": ["unrelated", "foo"] +} +``` + +**ENV:** To exclude files whose paths contain "unrelated" and "foo" from +instrumentation in CLI or Jest mode, add the following environment variable to +the command: + +```bash +JAZZER_EXCLUDES='["unrelated", "foo"]' npx jazzer fuzz +``` + +Or in Jest mode: + +```bash +JAZZER_EXCLUDES='["unrelated", "foo"]' npx jest +``` + +### `expectedErrors` : [array\] + +Default: [] + +Set the list of expected errors. + +If Jazzer.js stops because an error was encountered, the error name will be +compared to the list of expected errors provided with this option. If the error +name matches any of them, the fuzzer will return exit code 0, and a non-zero +exit code otherwise. Upon error, the fuzzer will **not** keep on fuzzing. + +Possible values for expected errors are: + +- `"Error"` - any Error object. E.g. `throw new Error("my finding")`, or + `throw new TypeError("hello")`. +- value of a primitive type - e.g. 1, "foo", true, etc. +- "unknown" - any other type + +_Note: This option is intended for internal use only, to test if the fuzzer is +working as expected._ + +**CLI:** To expect any thrown value of type Error and/or a thrown "1" on the +command line, use: + +```bash +npx jazzer my-fuzz-file --expectedErrors=Error --expectedErrors=1 +``` + +**Jest:** This option does not work Jest mode. + +**ENV:** To expect any value of type Error and/or a thrown "1" in CLI mode, add +the following environment variable to the command: + +```bash +JAZZER_EXPECTED_ERRORS='["Error","1"]' npx jazzer my-fuzz-file +``` + +### `fuzzEntryPoint` : [string] + +Default: "fuzz" + +Name of the function to fuzz. + +**CLI:** The function must be exported from the file specified by the +non-optional argument [fuzzTarget](#fuzztarget--string). To fuzz the function +`buzz` in the file `my-fuzz-file.js` on the command line, use: -## Bug Detectors +```bash +npx jazzer my-fuzz-file --fuzzEntryPoint=buzz +``` + +Where the file `my-fuzz-file.js` contains: + +```js +module.exports.buzz = function (data) { + // fuzz this function +}; +``` + +**Jest:** This flag is ignored in Jest mode. Instead use the native Jest flag +`--testNamePattern` to specify the Jest fuzz tests to run. For example, to fuzz +the Jest test `"buzz"` in the test file `tests.fuzz.js`, use: + +```bash +npx jest tests.fuzz.js --testNamePattern=buzz +``` + +With `tests.fuzz.js` containing: + +```js +test("fuzz", () => { + // this function will not be fuzzed +}); + +test("buzz", () => { + // this function will be fuzzed +}); +``` + +See the Jest guide for more information about +[`--testNamePattern`](https://jestjs.io/docs/cli#--testnamepatternregex). + +**ENV:** To fuzz the function `buzz` in the file `my-fuzz-file.js` in CLI mode, +add the environment variable to the command as follows: + +```bash +JAZZER_FUZZ_ENTRY_POINT=buzz npx jazzer my-fuzz-file +``` + +_Note:_ In Jest mode, this option cannot be set via environment variable. +Instead use the native Jest flag `--testNamePattern` as described above. + +### `fuzzerOptions` : [array\] + +Default: [] + +Pass options to native fuzzing engine (Jazzer.js uses libFuzzer). -Bug detectors are one of the key features when fuzzing memory-safe languages. In -Jazzer.js, they can detect some of the most common vulnerabilities in JavaScript -code. Built-in bug detectors are enabled by default, but can be disabled by -adding the `--disable_bug_detectors=` flag to the project -configuration. To disable all built-in bug detectors, add -`--disable_bug_detectors='.*'` to the project configuration. +For a list of available options, see the +[libFuzzer documentation](https://llvm.org/docs/LibFuzzer.html#options). To get +a quick overview of all available options, call Jazzer.js with the libFuzzer +argument `-help`. Here is an example for the CLI mode: -### Command Injection +```bash +npx jazzer my-fuzz-file -- -help=1 +``` + +_Note:_ the libFuzzer option `-timeout` (notice the single dash) is natively +supported in Jazzer.js with the option [`timeout`](#timeout--number) and will be +ignored if passed via `fuzzerOptions`. -Hooks all functions of the built-in module `child_process` and reports a finding -if the fuzzer was able to pass a command to any of the functions. +**CLI:** It is not possible to use this flag directly on the command line. +Instead, the options can be passed to libFuzzer after a double-dash `--`. For +example, libFuzzer's flags `-use_value_profile=1` and `-dict=xml.txt` can be set +as follows: -_Disable with:_ `--disable_bug_detectors=command-injection`, or when using Jest: +```bash +npx jazzer my-fuzz-file -- -use_value_profile=1 -dict=xml.txt +``` + +**Jest:** To pass the options `-use_value_profile=1` and `-dict=xml.txt` to +libFuzzer in Jest mode, add the following to the `.jazzerjsrc.json` file: ```json -{ "disableBugDetectors": ["command-injection"] } +{ + "fuzzerOptions": ["-use_value_profile=1", "-dict=xml.txt"] +} +``` + +**Jest fuzz test:** The `fuzzerOptions` can be set directly in the fuzz test in +_fuzzing_ mode by providing it as part of an object with options as the third +argument to the fuzz test. _Note:_ this overrides any prior settings (e.g. +settings loaded from `.jazzerjsrc.json`). Here is an example how make the fuzzer +use the dictionary "xml.txt" for fuzz test "My test 1": + +```javascript +it.fuzz("My test 1", + (data) => {...}, + {fuzzerOptions: ["-dict=xml.txt"]}); +``` + +**ENV:** For example, to pass the options `-use_value_profile=1` and +`-dict=xml.txt` to libFuzzer in Jest mode using environmental variable can be +done as follows: + +```bash +JAZZER_FUZZER_OPTIONS='["-use_value_profile=1", "-dict=xml.txt"]' npx jest tests.fuzz.js +``` + +_Note:_ It is not possible to set this flag in CLI mode via an environment +variable. + +#### Value profile + +Jazzer.js provides coverage and comparison feedback to the internally used +libFuzzer instance. By setting the libFuzzer flag `-use_value_profile=1`, new +values in intercepted compares are treated as new coverage. This has the +potential to discover many additional inputs, which would not be detected +otherwise, but may reduce runtime performance significantly. + +An example of using value profiling can be found at +[tests/value_profiling/fuzz.js](../tests/value_profiling/fuzz.js). + +### `fuzzTarget` : [string] + +Default: "" + +Specify the file to fuzz. + +**CLI:** In command line mode, this option is expected as the first argument to +the `jazzer` command and cannot be specified via flag. To fuzz the function +`fuzz` (default value of the [`fuzzEntryPoint`](#fuzzentrypoint--string) option) +in file `my-fuzz-file.js` on the command line, use: + +```bash +npx jazzer my-fuzz-file +``` + +**Jest:** This option is ignored in Jest mode, where you can either specify the +file with Jest fuzz tests directly as the +[first argument](https://jestjs.io/docs/cli#jest-regexfortestfiles) to Jest, or +via the Jest flag +[`--testPathPattern`](https://jestjs.io/docs/cli#--testpathpatternregex). For +example, to run all fuzz tests in regression mode (default mode for the Jest +runner) in file `tests.fuzz.js`, use: + +```bash +npx jest tests.fuzz.js ``` -### Path Traversal +**ENV:** The fuzz target cannot be specified via an environment variable. + +### `idSyncFile` : [string] + +Default: "" + +Specify a file to synchronize edge IDs used during fuzzing by multiple processes +(e.g. in fork mode by adding `-fork=1` to the option +[`fuzzerOption`](#fuzzeroptions--arraystring)). + +_Note: This option is intended for internal use only when fuzzing in +multi-process mode. It is not possible to set this option on command-line or +otherwise, because it will be overwritten internally._ + +### `includes` : [array\] + +Default: ["*"] + +Include files that should be instrumented for fuzzing. + +This option supports one pattern: `"*"` that includes all files. Otherwise, only +the files whose paths match the provided string(s) will be instrumented, unless +the path matches one of the strings in the [`excludes`](#excludes--arraystring) +option. + +As soon as `--includes` is set to a non-default value, the default value of the +`--excludes` is changed from `["node_modules"]` to `[]`, to enable fuzzing of +projects in the `node_modules` directory. + +**CLI:** To instrument all files that have "foo" and "boo" in their path, use: -Hooks all relevant functions of the built-in modules `fs` and `path` and reports -a finding if the fuzzer could pass a special path to any of the functions. +```bash +npx jazzer my-fuzz-file --includes="foo" --includes="boo" +``` -_Disable with:_ `--disable_bug_detectors=path-traversal`, or when using Jest: +**Jest:** To instrument all files that have "foo" and "boo" in their path, add +the following to the `.jazzerjsrc.json` file: ```json -{ "disableBugDetectors": ["path-traversal"] } +{ + "includes": ["foo", "boo"] +} +``` + +**ENV:** To instrument all files that have "foo" and "boo" in their path in CLI +mode, use: + +```bash +JAZZER_INCLUDES='["foo","boo"]' npx jazzer my-fuzz-file +``` + +Or in Jest mode: + +```bash +JAZZER_INCLUDES='["foo","boo"]' npx jest ``` -### Prototype Pollution +### `JAZZER_FUZZ` : [boolean] -Detects Prototype Pollution. Prototype Pollution is a vulnerability that allows -attackers to modify the prototype of a JavaScript object, which can lead to -validation bypass, denial of service and arbitrary code execution. +Default: false -The Prototype Pollution bug detector can be configured in the -[custom hooks](#custom-hooks) file. +Run Jest fuzz tests in fuzzing mode. -- `instrumentAssignmentsAndVariableDeclarations` - if called, the bug detector - will instrument assignment expressions and variable declarations and report a - finding if `__proto__` of the declared or assigned variable contains any - properties or methods. When called in dry run mode, this option will trigger - an error. -- `addExcludedExactMatch` - if the stringified `__proto__` equals the given - string, the bug detector will not report a finding. This is useful to exclude - false positives. +This option is similar to the [`mode`](#mode--fuzzingregression) option. -Here is an example configuration in the [custom hooks](#custom-hooks) file: +**ENV:** This option can only be set via an environment variable. To run Jest in +fuzzing mode: + +```bash +JAZZER_FUZZ=1 npx jest tests.fuzz.js +``` + +### `JAZZER_LIST_FUZZTEST_NAMES` : [boolean] + +Default: false + +Print the fuzz test names on the command line. + +_Note:_ this option can only be set using an environment variable. + +The fuzz test names are derived from the describe blocks and the test names by +concatenating them with a space to each other. Internally, Jazzer.js uses these +names to derive the corpus directories for each test. + +**ENV:** Set the environment variable `JAZZER_LIST_FUZZTEST_NAMES` to print the +names of the fuzz tests in Jest mode: + +```bash +JAZZER_LIST_FUZZTEST_NAMES=1 npx jest tests.fuzz.js +... +My test fuzz +My test buzz +... +``` + +where `tests.fuzz.js` contains the following: ```javascript -const { getBugDetectorConfiguration } = require("@jazzer.js/bug-detectors"); +describe("My test", () => { + test("fuzz", () => {...}); + test("buzz", () => {...}); +}); +``` + +### `mode` : ["fuzzing"|"regression"] + +Default: depends on the fuzz test runner (CLI/Jest) + +In [_fuzzing_](./jest-integration.md#fuzzing-mode) mode, Jazzer.js will run +indefinitely, trying out new inputs until it either finds a crash, reaches a +user-defined stop condition, or is interrupted by the user. + +In [_regression_](./jest-integration.md#regression-mode) mode, Jazzer.js only +runs the fuzz tests with inputs in their corresponding regression directories +once. + +**CLI:** Default: `"fuzzing"`. + +In _fuzzing_ mode on command line, Jazzer.js uses both the main seed corpus and +regression corpus directories to initialize the fuzzer. Inputs that reach new +coverage will be stored in the seed directory. Inputs that trigger a crash will +be stored in the regression directory. + +In _regression_ mode on command line, Jazzer.js runs each input from the seed +and regression corpus directories on the fuzz target once, and then stops. Under +the hood, this option adds `-runs=0` to the option +[`fuzzerOptions`](#fuzzeroptions--arraystring). Setting the fuzzer option to +`-runs=0` (run each input only once) or `-runs=-1` (run each input indefinitely) +can be used to achieve the same behavior. -getBugDetectorConfiguration("prototype-pollution") - ?.instrumentAssignmentsAndVariableDeclarations() - ?.addExcludedExactMatch('{"methods":{}}'); +**Jest:** Default: `"regression"`. + +In _regression_ mode, each Jest fuzz test will be run with inputs from the +corresponding regression corpus directories. + +In _fuzzing_ mode, only one fuzz test can be run. Jazzer.js will use both the +seed and regression corpus directories to initialize the fuzzer. Inputs that +reach new coverage will be stored in the seed directory. Inputs that cause a +crash or timeout will be saved in the regression directory. + +To run Jest fuzz tests in _fuzzing_ mode, add the following to the +`.jazzerjsrc.json` file: + +```json +{ + "mode": "fuzzing" +} ``` -Adding instrumentation to variable declarations and assignment expressions -drastically reduces the fuzzer's performance because the fuzzer will check for -non-empty `__proto__` on every variable declaration and assignment expression. -In addition, this might cause false positives because some libraries (e.g. -`lodash`) use `__proto__` to store methods. Therefore, in the default -configuration these options are disabled. +Choosing which fuzz test will be run can be done by passing the flag +`--testNamePattern` with a fitting value directly to Jest. Alternatively, since +Jazzer.js will run the first test it finds, it is possible to choose which fuzz +test to run in fuzzing mode directly in the test file either using `skip` or +`only`. For example, in the following example, the second test named +`"this test will be fuzzed"` will be fuzzed because we `skip` the first test: + +```javascript +it.skip.fuzz("skipped test", (data) => {...}); +it.fuzz("this test will be fuzzed", (data) => {...}); +``` -_Shortcoming:_ The instrumentation of variable declarations and assignment -expressions will not detect if the prototype of the object in question has new, -deleted, or modified functions. But it will detect if a function of a prototype -of an object has become a non-function. The following example illustrates this -issue: +In this example, the third test named `"fuzzed test"` will be fuzzed because we +use `only`: ```javascript -class A {} -class B extends A {} -const b = new B(); -b.__proto__.polluted = true; // will be detected -b.__proto__.test = [1, 2, 3]; // will be detected -b.__proto__.toString = 10; // will be detected -b.__proto__.toString = () => "polluted"; // will not be detected -delete b.__proto__.toString; // will not be detected -b.__proto__.hello = () => "world"; // will not be detected +it.fuzz("skipped test 1", (data) => {...}); +it.fuzz("skipped test 2", (data) => {...}); +it.only.fuzz("fuzzed test", (data) => {...}); ``` -However, our assumption is that if the fuzzer is able to modify the methods in a -prototype, it will be able also find a way to modify other properties of the -prototype that are not functions. If you find a use case where this assumption -does not hold, feel free to open an issue. +**ENV:** To run in the mode other than the default mode in CLI or Jest, set the +environment variable `JAZZER_MODE`. For example, to select the `regression` mode +in CLI: -_Disable with:_ `--disable_bug_detectors=prototype-pollution`, or when using -Jest: +```bash +JAZZER_MODE=regression npx jazzer my-fuzz-file +``` + +To select the `fuzzing` mode in Jest: + +```bash +JAZZER_MODE=fuzzing npx jest tests.fuzz.js +``` + +_Note:_ In Jest mode, setting `JAZZER_MODE=fuzzing` is the same as setting +[`JAZZER_FUZZ=1`](#jazzer_fuzz--boolean). + +### `sync` : [boolean] + +Default: false + +Run in synchronous mode. + +If the code under test is fully synchronous, fuzzing will be faster in +synchronous mode. + +_Note:_ don't use this option if the code under test contains asynchronous +parts. + +**CLI:** To run in synchronous mode on command line, append the `--sync` flag to +the command: + +```bash +npx jazzer my-fuzz-file --sync +``` + +**Jest:** To run in synchronous mode in Jest mode, add the following to the +`.jazzerjsrc.json` file: ```json -{ "disableBugDetectors": ["prototype-pollution"] } +{ + "sync": true +} ``` -For implementation details see -[../packages/bug-detectors/internal](../packages/bug-detectors/internal). +**Jest fuzz test:** The `sync` can be set directly in the fuzz test in _fuzzing_ +and _regression_ mode by providing it as part of an object with options as the +third argument to the fuzz test. _Note:_ this overrides any prior settings (e.g. +settings loaded from `.jazzerjsrc.json`). Here is an example how make the run +"My test 1" in syncronous mode: -### Writing Custom Bug Detectors +```javascript +it.fuzz("My test 1", + (data) => {...}, + {sync: true}); +``` -Users can write their own bug detectors using the -[custom hooks feature](#custom-hooks). Use the function `reportFinding` to -report a finding from your bug detector---it makes sure that the finding escapes -all try/catch blocks along the way and is definitely reported. Beware that -`reportFinding` will only report the first finding from any of the bug detectors -and all subsequent findings will be ignored. +**ENV:** To run in synchronous mode in CLI or Jest mode, set the environment +variable `JAZZER_SYNC` to `true`. Here is an example for Jest: + +```bash +JAZZER_SYNC=true npx jest tests.fuzz.js +``` -## Verbose logging +### `timeout` : [number] -To enable verbose logging in Jazzer.js, add either `-v`, or `--verbose` to the -project configuration in the respective `package.json`. Currently, this only -prints extra debug information on custom hooks (if provided). +Default: 5000 (milliseconds) + +Set fuzz test timeout in milliseconds. + +If a fuzz test takes longer than `timeout` to execute an input, Jazzer.js will +save this input in a crash file. + +**CLI:** To set the timeout to 10000 milliseconds on command line, use: + +```bash +npx jazzer my-fuzz-file --timeout=10000 +``` + +**Jest:** To set the timeout to 10000 milliseconds in Jest mode, add the +following to the `.jazzerjsrc.json` file: + +```json +{ + "timeout": 10000 +} +``` + +**Jest fuzz test:** The timeout can be set directly in the fuzz test in +_regression_ and in _fuzzing_ modes in two ways: + +_One:_ by providing it as the third argument to the fuzz test. Here is an +example how a timeout of 1 second can be set for the test "My test 1": + +```javascript +it.fuzz("My test 1", + (data) => {...}, + 1000 +``` + +_Two:_ by providing it as part of an object with options as the third argument +to the fuzz test. Here is an example how a timeout of 1 second can be set for +the test "My test 2": + +```javascript +it.fuzz("My test 2", + (data) => {...}, + {timeout: 1000}); +``` + +**ENV:** To set the timeout to 10000 milliseconds in CLI or Jest mode, set the +environment variable `JAZZER_TIMEOUT`. Here is an example for Jest: + +```bash +JAZZER_TIMEOUT=10000 npx jest tests.fuzz.js +``` + +### `verbose` : [boolean] + +Default: false + +Print debugging logs including: + +- current values for all configuration options set by CLI/Jest flags and + environment variables +- hooked functions +- functions that could not be hooked +- functions available to hooking + +**CLI:** Add `--verbose` flag to the command: + +```bash +npx jazzer my-fuzz-file --verbose +``` + +**Jest:** Add the `verbose` option to the Jazzer.js configuration file +`.jazzerjsrc.json`: + +```json +{ + "verbose": true +} +``` + +**ENV:** To set the flag for CLI and Jest mod, use the environment variable +`JAZZER_VERBOSE`. Here is an example for CLI: + +```bash +JAZZER_VERBOSE=1 npx jazzer my-fuzz-file +``` diff --git a/docs/fuzz-targets.md b/docs/fuzz-targets.md index 50836c62b..8c89218e3 100644 --- a/docs/fuzz-targets.md +++ b/docs/fuzz-targets.md @@ -49,7 +49,7 @@ module.exports.fuzz = function (fuzzerInputData) { ``` For more information on how to use the `FuzzedDataProvider` class, please refer -to the [example](../tests/FuzzedDataProvider/fuzz.js), the +to the [example](../examples/FuzzedDataProvider/fuzz.js), the [tests](../packages/core/FuzzedDataProvider.test.ts), and the [implementation](../packages/core/FuzzedDataProvider.ts) of the `FuzzedDataProvider` class. @@ -156,7 +156,7 @@ Or add a new script to your `package.json`: ```json "scripts": { -"fuzz": "jazzer " + "fuzz": "jazzer " } ``` @@ -169,17 +169,20 @@ The general command format is: jazzer [corpus...] [-- ] ``` -Detailed documentation and some example calls are available using the `--help` -flag, so that only the most important parameters are discussed here. +Detailed documentation and some example calls are available on the command line +using the `--help` flag. In addition, every argument is described in +[fuzz-settings.md](./fuzz-settings.md) in more detail. + +Here we list some of the most important parameters: | Parameter | Description | | --------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `` | Import path to the fuzz target module. | | `[corpus...]` | Paths to the corpus directories. If not given, no initial seeds are used nor interesting inputs saved. | -| `-f`, `--fuzz_function` | Name of the fuzz test entry point. It must be an exported function with a single [Buffer](https://nodejs.org/api/buffer.html) parameter. Default is `fuzz`. | +| `-f`, `--fuzzFunction` | Name of the fuzz test entry point. It must be an exported function with a single [Buffer](https://nodejs.org/api/buffer.html) parameter. Default is `fuzz`. | | `-i`, `--includes` / `-e`, `--excludes` | Part of filepath names to include/exclude in the instrumentation. A tailing `/` should be used to include directories and prevent confusion with filenames. `*` can be used to include all files. Can be specified multiple times. Default will include everything outside the `node_modules` directory. If either of these flags are set the default value for the other is ignored. | | `--sync` | Enables synchronous fuzzing. **May only be used for entirely synchronous code**. | -| `-h`, `--custom_hooks` | Filenames with custom hooks. Several hooks per file are possible. See further details in [docs/fuzz-settings.md](fuzz-settings.md). | +| `-h`, `--customHooks` | Filenames with custom hooks. Several hooks per file are possible. See further details in [docs/fuzz-settings.md](fuzz-settings.md#customhooks--arraystring). | | `--help` | Detailed help message containing all flags. | | `-- ` | Parameters after `--` are forwarded to the internal fuzzing engine (`libFuzzer`). Available settings can be found in its [options documentation](https://www.llvm.org/docs/LibFuzzer.html#options). | @@ -187,22 +190,22 @@ flag, so that only the most important parameters are discussed here. To generate a coverage report, add the `--coverage` flag to the Jazzer.js CLI. In the following example, the `--coverage` flag is combined with the mode flag -`-m=regression` that only uses existing corpus entries without performing any -fuzzing. +`--mode=regression` that only uses existing corpus entries without performing +any fuzzing. ```shell -npx jazzer -m=regression --corpus --cov -- +npx jazzer --mode=regression --corpus --coverage -- ``` Alternatively, you can add a new script to your `package.json`: ```json "scripts": { - "coverage": "jazzer -m regression -i target -i another_target --corpus --cov -- " + "coverage": "jazzer --mode=regression --includes=fileToInstrument --includes=anotherFileToInstrument --corpus --coverage -- " } ``` -Files matched by the flags `--includes` or `--custom_hooks`, and not matched by +Files matched by the flags `--includes` or `--customHooks`, and not matched by the flag `--excludes` will be included in the coverage report. It is recommended to disable coverage report generation during fuzzing, because of the substantial overhead that it adds. @@ -211,13 +214,11 @@ overhead that it adds. By default, the coverage reports can be found in the `./coverage` directory. This default directory can be changed by setting the flag -`--cov_dir=`. A longer flag of the form -`--coverage_directory` also exists. +`--coverageDirectory=`. ### Coverage reporters -The desired report format can be set by the flags -`--cov_reporters`/`--coverage_reporters`, which by default is set to -`--coverage_reporters clover json lcov text`. See +The desired report format can be set by the flag `--coverageReporters`, which by +default is set to `--coverageReporters clover json lcov text`. See [here](https://github.com/istanbuljs/istanbuljs/tree/master/packages/istanbul-reports/lib) for a list of supported coverage reporters. diff --git a/docs/jest-integration.md b/docs/jest-integration.md index 0a5fa7fba..52044c075 100644 --- a/docs/jest-integration.md +++ b/docs/jest-integration.md @@ -120,7 +120,7 @@ actually include test files with the `.fuzz.ts` extension. }, preset: "ts-jest", testEnvironment: "node", - testMatch: ["/*.fuzz.[jt]s"], + testMatch: ["/**/*.fuzz.[jt]s"], testRunner: "@jazzer.js/jest-runner", }, ``` @@ -198,7 +198,7 @@ describe("My describe", () => { ``` For more information on how to use the `FuzzedDataProvider` class, please refer -to the [example](../tests/FuzzedDataProvider/fuzz.js), the +to the [example](../examples/FuzzedDataProvider/fuzz.js), the [tests](../packages/core/FuzzedDataProvider.test.ts), and the [implementation](../packages/core/FuzzedDataProvider.ts) of the `FuzzedDataProvider` class. @@ -368,17 +368,47 @@ To generate a coverage report, run jest with the `--coverage` flag: npx jest --coverage ``` -**Note**: Unlike the Jazzer.js CLI, Jest only accepts the long flag of -`--coverage`! - Additional options for coverage report generation are described in the [fuzz targets documentation](./fuzz-targets.md#coverage-report-generation). -The desired report format can be set by the flag `--coverage_reporters`, which -by default is set to `--coverage_reporters clover json lcov text`. See +The desired report format can be set by the flag `--coverageReporters`, which by +default is set to `--coverageReporters clover json lcov text`. See [here](https://github.com/istanbuljs/istanbuljs/tree/master/packages/istanbul-reports/lib) for a list of supported coverage reporters. +### Manually adding regression tests + +Suppose that we have a project with following structure: + +```text +. +├── package.json +├── package-lock.json +├── src +│ └── ... +└── tests + └── tests.fuzz.js +``` + +and two fuzz tests in `./tests/tests.fuzz.js`: + +```javascript +describe("Target", () => { + test.fuzz("fuzz test 1", (data) => { + /* ... */ + }); + test.fuzz("fuzz test 2", (data) => { + /* ... */ + }); +}); +``` + +The first time when our example fuzz tests are executed with jest by e.g. +running `npx jest tests/tests.fuzz.js` from the command line, Jazzer.js will +create the directories `./tests/tests.fuzz/Target/fuzz_test_1` and +`./tests/tests.fuzz/Target/fuzz_test_2` that the two fuzz tests will use in +regression mode. + ## IDE Integration As the Jest test framework foundations are used by the Jazzer.js fuzz test diff --git a/docs/release.md b/docs/release.md index a3a9f8180..03e4ef34b 100644 --- a/docs/release.md +++ b/docs/release.md @@ -13,20 +13,19 @@ To release a new version of Jazzer.js follow the described process: 5. For minor and major releases, approve and merge the release PR 6. Create and push a version tag on the latest commit of the release - Tag format `v`, e.g. `v1.0.0` + - **Experimental**: Feel free to use the script `scripts/set-version.js` to + automatically set the version. E.g.: `node scripts/set-version.js v3.0.0` 7. Wait until the `Prerelease` GitHub action workflow has finished successfully - The workflow creates a GitHub prerelease based on the created tag - It adds prebuild artifacts of all supported platforms - An automatic changelog, based on the included merge requests, is added to the prerelease description - The prerelease is listed on the - [release page](https://github.com/CodeIntelligenceTesting/jazzer.js/releases) + [release page](https://github.com/CodeIntelligenceTesting/jazzer.js-commercial/releases) 8. Release the prerelease in GitHub - Adjust the prerelease description to include the highlights of the release - If you find some problems with the prerelease and want to start over: - Delete the tag (should be done first) - Remove the prerelease through the GitHub UI - Start this process anew -9. Wait until the `Release` GitHub action workflow has finished successfully - - The workflow will build and publish the - [NPM packages](https://www.npmjs.com/package/@jazzer.js/core). -10. Enjoy the rest of your day 🎂 +9. Enjoy the rest of your day 🎂 diff --git a/end-to-end/integration.fuzz.ts b/end-to-end/integration.fuzz.ts index a85e866ad..accd67d64 100644 --- a/end-to-end/integration.fuzz.ts +++ b/end-to-end/integration.fuzz.ts @@ -1,5 +1,5 @@ /* - * Copyright 2023 Code Intelligence GmbH + * Copyright 2026 Code Intelligence GmbH * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/end-to-end/integration.test.ts b/end-to-end/integration.test.ts index 05172efa0..41b516c0a 100644 --- a/end-to-end/integration.test.ts +++ b/end-to-end/integration.test.ts @@ -1,5 +1,5 @@ /* - * Copyright 2023 Code Intelligence GmbH + * Copyright 2026 Code Intelligence GmbH * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/end-to-end/jest.config.ts b/end-to-end/jest.config.ts index 861b211ae..a63252235 100644 --- a/end-to-end/jest.config.ts +++ b/end-to-end/jest.config.ts @@ -1,5 +1,5 @@ /* - * Copyright 2023 Code Intelligence GmbH + * Copyright 2026 Code Intelligence GmbH * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/end-to-end/package-jazzer-js.sh b/end-to-end/package-jazzer-js.sh index 3994b9bce..9ba0a0449 100755 --- a/end-to-end/package-jazzer-js.sh +++ b/end-to-end/package-jazzer-js.sh @@ -7,7 +7,7 @@ npm run build --workspace='@jazzer.js/fuzzer' sed_version_and_mv() { while read data; do - local no_version=$(echo $data | sed -r -f end-to-end/remove-version.sed) + local no_version=$(echo $data | sed -E -f end-to-end/remove-version.sed) echo "mv $data end-to-end/$no_version" mv $data end-to-end/$no_version done diff --git a/end-to-end/target.ts b/end-to-end/target.ts index 662e2c269..a3dd04bff 100644 --- a/end-to-end/target.ts +++ b/end-to-end/target.ts @@ -1,5 +1,5 @@ /* - * Copyright 2023 Code Intelligence GmbH + * Copyright 2026 Code Intelligence GmbH * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/tests/FuzzedDataProvider/fuzz.js b/examples/FuzzedDataProvider/fuzz.js similarity index 94% rename from tests/FuzzedDataProvider/fuzz.js rename to examples/FuzzedDataProvider/fuzz.js index 4ac177960..3fa42bb50 100644 --- a/tests/FuzzedDataProvider/fuzz.js +++ b/examples/FuzzedDataProvider/fuzz.js @@ -1,5 +1,5 @@ /* - * Copyright 2023 Code Intelligence GmbH + * Copyright 2026 Code Intelligence GmbH * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -21,7 +21,7 @@ const { FuzzedDataProvider } = require("@jazzer.js/core"); */ module.exports.fuzz = function (fuzzerInputData) { const data = new FuzzedDataProvider(fuzzerInputData); - const s1 = data.consumeString(data.consumeIntegralInRange(10, 15), "utf-8"); + const s1 = data.consumeString(data.consumeIntegralInRange(10, 15)); const i1 = data.consumeIntegral(1); if (s1 === "Hello World!") { if (i1 === 3) { diff --git a/tests/FuzzedDataProvider/package.json b/examples/FuzzedDataProvider/package.json similarity index 100% rename from tests/FuzzedDataProvider/package.json rename to examples/FuzzedDataProvider/package.json diff --git a/examples/bug-detectors/command-injection/custom-hooks.js b/examples/bug-detectors/command-injection/custom-hooks.js index 37a032dd5..ce5c32ff2 100644 --- a/examples/bug-detectors/command-injection/custom-hooks.js +++ b/examples/bug-detectors/command-injection/custom-hooks.js @@ -1,5 +1,5 @@ /* - * Copyright 2023 Code Intelligence GmbH + * Copyright 2026 Code Intelligence GmbH * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/examples/bug-detectors/command-injection/fuzz.js b/examples/bug-detectors/command-injection/fuzz.js index 8d6879f3b..fca1b5414 100644 --- a/examples/bug-detectors/command-injection/fuzz.js +++ b/examples/bug-detectors/command-injection/fuzz.js @@ -1,5 +1,5 @@ /* - * Copyright 2023 Code Intelligence GmbH + * Copyright 2026 Code Intelligence GmbH * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/examples/bug-detectors/path-traversal/fuzz.js b/examples/bug-detectors/path-traversal/fuzz.js index 669c22972..35e1f3ba5 100644 --- a/examples/bug-detectors/path-traversal/fuzz.js +++ b/examples/bug-detectors/path-traversal/fuzz.js @@ -1,5 +1,5 @@ /* - * Copyright 2023 Code Intelligence GmbH + * Copyright 2026 Code Intelligence GmbH * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/examples/bug-detectors/prototype-pollution/config.js b/examples/bug-detectors/prototype-pollution/config.js index 5fd55c057..6f966b964 100644 --- a/examples/bug-detectors/prototype-pollution/config.js +++ b/examples/bug-detectors/prototype-pollution/config.js @@ -1,5 +1,5 @@ /* - * Copyright 2023 Code Intelligence GmbH + * Copyright 2026 Code Intelligence GmbH * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/examples/bug-detectors/prototype-pollution/fuzz.js b/examples/bug-detectors/prototype-pollution/fuzz.js index 7828ea77f..b03676658 100644 --- a/examples/bug-detectors/prototype-pollution/fuzz.js +++ b/examples/bug-detectors/prototype-pollution/fuzz.js @@ -1,5 +1,5 @@ /* - * Copyright 2023 Code Intelligence GmbH + * Copyright 2026 Code Intelligence GmbH * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -14,7 +14,6 @@ * limitations under the License. */ -// eslint-disable-next-line @typescript-eslint/no-var-requires const protobuf = require("protobufjs"); module.exports.fuzz = async function (data) { diff --git a/examples/bug-detectors/prototype-pollution/package.json b/examples/bug-detectors/prototype-pollution/package.json index ca069a7d9..78afc717d 100644 --- a/examples/bug-detectors/prototype-pollution/package.json +++ b/examples/bug-detectors/prototype-pollution/package.json @@ -4,7 +4,7 @@ "main": "fuzz.js", "license": "ISC", "dependencies": { - "protobufjs": "7.2.3" + "protobufjs": "7.2.5" }, "scripts": { "fuzz": "jazzer fuzz -i protobufjs -i fuzz -e nothing --timeout=60000 -x Error -- -runs=1000000 -print_final_stats=1 -use_value_profile=1 -rss_limit_mb=10000 -dict=userDict.txt", diff --git a/tests/switch/fuzz.js b/examples/bug-detectors/ssrf/config.js similarity index 54% rename from tests/switch/fuzz.js rename to examples/bug-detectors/ssrf/config.js index 91ccf5e08..81e4f606b 100644 --- a/tests/switch/fuzz.js +++ b/examples/bug-detectors/ssrf/config.js @@ -1,5 +1,5 @@ /* - * Copyright 2023 Code Intelligence GmbH + * Copyright 2026 Code Intelligence GmbH * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -14,27 +14,11 @@ * limitations under the License. */ -/** - * @param { Buffer } data - */ -module.exports.fuzz = function (data) { - const s = data.toString(); - if (s.length < 8) { - return; - } +const { + getBugDetectorConfiguration, +} = require("../../../packages/bug-detectors"); - const s1 = s.slice(0, 8); - const s2 = s.slice(8, 16); - switch (s1) { - case "Awesome ": - if (s2 === "Fuzzing!") { - throw Error("Welcome to Awesome Fuzzing"); - } - break; - case "Powerful": - if (s2 === " Testing") { - throw Error("Welcome to Powerful Testing"); - } - break; - } -}; +getBugDetectorConfiguration("ssrf")?.addPermittedTCPConnection( + "localhost", + 8080, +); diff --git a/examples/bug-detectors/ssrf/fuzz.js b/examples/bug-detectors/ssrf/fuzz.js new file mode 100644 index 000000000..c841af16d --- /dev/null +++ b/examples/bug-detectors/ssrf/fuzz.js @@ -0,0 +1,69 @@ +/* + * Copyright 2026 Code Intelligence GmbH + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +const http = require("http"); + +const server = http.createServer(function (req, res) { + try { + // Extract the target URL from the request. + const target = new URL( + req.url, + "http://code-intelligence.com", + ).searchParams.get("target"); + if (!target) return; + // Connecting to user-controlled target: + http + .get(target, (res) => { + console.log(`statusCode: ${res.statusCode}`); + }) + .on("error", (error) => {}); + } catch (e) { + // ignore errors + } +}); + +server.on("connection", function (socket) { + socket.setTimeout(3000); + socket.on("timeout", function () { + process.exit(0); + }); +}); + +server.on("error", (err) => { + console.log(err); +}); + +server.listen(8080, "localhost"); + +const baseRequest = "?target=http://invalid.com"; + +module.exports.fuzz = async function (data) { + try { + // TODO: remove after the fuzzer supports string comparison of the case where both are variables. + // A hack to make the fuzzer pick up string comparison between two variables. + // Comparing two variables will not be instrumented and thus not picked up by value profiler! + if ( + data.toString().substring(0, baseRequest.length) !== + "?target=http://invalid.com" + ) { + return; + } + + // Send a raw request to the server. + http.get("http://localhost:8080/" + data.toString(), (res) => {}); + } catch (e) { + // ignore + } +}; diff --git a/examples/bug-detectors/ssrf/package.json b/examples/bug-detectors/ssrf/package.json new file mode 100644 index 000000000..830cb41a9 --- /dev/null +++ b/examples/bug-detectors/ssrf/package.json @@ -0,0 +1,12 @@ +{ + "name": "ssrf-example", + "version": "1.0.0", + "scripts": { + "fuzz": "jazzer fuzz -h config.js --timeout=60000 -x Error -- -runs=1000000 -print_final_stats=1 -use_value_profile=1 -rss_limit_mb=10000", + "fuzzShowError": "jazzer fuzz -h config.js --timeout=60000 -- -runs=1000000 -print_final_stats=1 -use_value_profile=1 -rss_limit_mb=10000", + "dryRun": "jazzer fuzz -- -runs=100000000 -seed=123456789" + }, + "devDependencies": { + "@jazzer.js/core": "file:../../../packages/core" + } +} diff --git a/examples/custom-hooks/custom-hooks.js b/examples/custom-hooks/custom-hooks.js index df43570c6..60fed77b6 100644 --- a/examples/custom-hooks/custom-hooks.js +++ b/examples/custom-hooks/custom-hooks.js @@ -1,5 +1,5 @@ /* - * Copyright 2023 Code Intelligence GmbH + * Copyright 2026 Code Intelligence GmbH * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/examples/custom-hooks/fuzz.js b/examples/custom-hooks/fuzz.js index 8155489cb..d385b84e0 100644 --- a/examples/custom-hooks/fuzz.js +++ b/examples/custom-hooks/fuzz.js @@ -1,5 +1,5 @@ /* - * Copyright 2023 Code Intelligence GmbH + * Copyright 2026 Code Intelligence GmbH * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/examples/jest_integration/integration.fuzz.js b/examples/jest_integration/integration.fuzz.js index 97bdb45dc..e1e64aee0 100644 --- a/examples/jest_integration/integration.fuzz.js +++ b/examples/jest_integration/integration.fuzz.js @@ -1,5 +1,5 @@ /* - * Copyright 2023 Code Intelligence GmbH + * Copyright 2026 Code Intelligence GmbH * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -21,6 +21,28 @@ describe("My describe", () => { target.fuzzMe(data); }); + it.fuzz("My hashed fuzz test without dictionary", (data) => { + target.fuzzMeHashed(data); + }); + + it.fuzz( + "My hashed fuzz test with dictionary", + (data) => { + target.fuzzMeHashed(data); + }, + { dictionaryEntries: ["Amazing"] }, + ); + + const utf8Encode = new TextEncoder(); + const binaryAmazing = utf8Encode.encode("Amazing"); + it.fuzz( + "My hashed fuzz test with binary dictionary", + (data) => { + target.fuzzMeHashed(data); + }, + { dictionaryEntries: [binaryAmazing] }, + ); + it.fuzz( "My fuzz test with an explicit timeout (async)", async (data) => { diff --git a/examples/jest_integration/integration.test.js b/examples/jest_integration/integration.test.js index 2b7f5e9c2..5769c47c4 100644 --- a/examples/jest_integration/integration.test.js +++ b/examples/jest_integration/integration.test.js @@ -1,5 +1,5 @@ /* - * Copyright 2023 Code Intelligence GmbH + * Copyright 2026 Code Intelligence GmbH * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/examples/jest_integration/target.js b/examples/jest_integration/target.js index fb957f656..064da7877 100644 --- a/examples/jest_integration/target.js +++ b/examples/jest_integration/target.js @@ -1,5 +1,5 @@ /* - * Copyright 2023 Code Intelligence GmbH + * Copyright 2026 Code Intelligence GmbH * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -14,6 +14,8 @@ * limitations under the License. */ +var crypto = require("crypto"); + /** * @param { Buffer } data */ @@ -22,11 +24,30 @@ const fuzzMe = function (data) { if (s.length !== 7) { return; } - if (s.slice(0, 7) === "Awesome") { + + if (s === "Awesome") { throw Error("Welcome to Awesome Fuzzing!"); } }; +const fuzzMeHashed = function (data) { + const s = data.toString(); + if (s.length !== 7) { + return; + } + + const sha = crypto.createHash("sha512").update(s); + const result = sha.digest("hex"); + + // Hash of "Amazing" + if ( + result === + "79328e1e1272ff2890ff0c6e8181a52ce5960ae7703b00f9f094edd7dbd198210129b2bb307e8cd34d689d101e4d685f1259e42af7ce252944ca46aecca60752" + ) { + throw Error("Welcome to Amazing Fuzzing!"); + } +}; + /** * @param { Buffer } data * @param { Function } done @@ -50,5 +71,6 @@ const asyncFuzzMe = function (data) { }; module.exports.fuzzMe = fuzzMe; +module.exports.fuzzMeHashed = fuzzMeHashed; module.exports.callbackFuzzMe = callbackFuzzMe; module.exports.asyncFuzzMe = asyncFuzzMe; diff --git a/examples/jest_integration/worker.fuzz.js b/examples/jest_integration/worker.fuzz.js index db5b7f532..539f7a034 100644 --- a/examples/jest_integration/worker.fuzz.js +++ b/examples/jest_integration/worker.fuzz.js @@ -1,5 +1,5 @@ /* - * Copyright 2023 Code Intelligence GmbH + * Copyright 2026 Code Intelligence GmbH * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/examples/jest_integration/workerGoldenReference.test.js b/examples/jest_integration/workerGoldenReference.test.js index ccaa61cee..32702e7c0 100644 --- a/examples/jest_integration/workerGoldenReference.test.js +++ b/examples/jest_integration/workerGoldenReference.test.js @@ -1,5 +1,5 @@ /* - * Copyright 2023 Code Intelligence GmbH + * Copyright 2026 Code Intelligence GmbH * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/examples/jest_typescript_integration/integration.fuzz.ts b/examples/jest_typescript_integration/integration.fuzz.ts index a85e866ad..accd67d64 100644 --- a/examples/jest_typescript_integration/integration.fuzz.ts +++ b/examples/jest_typescript_integration/integration.fuzz.ts @@ -1,5 +1,5 @@ /* - * Copyright 2023 Code Intelligence GmbH + * Copyright 2026 Code Intelligence GmbH * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/examples/jest_typescript_integration/integration.test.ts b/examples/jest_typescript_integration/integration.test.ts index 05172efa0..41b516c0a 100644 --- a/examples/jest_typescript_integration/integration.test.ts +++ b/examples/jest_typescript_integration/integration.test.ts @@ -1,5 +1,5 @@ /* - * Copyright 2023 Code Intelligence GmbH + * Copyright 2026 Code Intelligence GmbH * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/examples/jest_typescript_integration/jest.config.ts b/examples/jest_typescript_integration/jest.config.ts index 4a49ce449..3f28fe657 100644 --- a/examples/jest_typescript_integration/jest.config.ts +++ b/examples/jest_typescript_integration/jest.config.ts @@ -1,5 +1,5 @@ /* - * Copyright 2023 Code Intelligence GmbH + * Copyright 2026 Code Intelligence GmbH * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/examples/jest_typescript_integration/target.ts b/examples/jest_typescript_integration/target.ts index 662e2c269..a3dd04bff 100644 --- a/examples/jest_typescript_integration/target.ts +++ b/examples/jest_typescript_integration/target.ts @@ -1,5 +1,5 @@ /* - * Copyright 2023 Code Intelligence GmbH + * Copyright 2026 Code Intelligence GmbH * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/examples/jpeg/fuzz.js b/examples/jpeg/fuzz.js index 6cea6bd4d..4255f824c 100644 --- a/examples/jpeg/fuzz.js +++ b/examples/jpeg/fuzz.js @@ -1,5 +1,5 @@ /* - * Copyright 2023 Code Intelligence GmbH + * Copyright 2026 Code Intelligence GmbH * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/examples/jpeg_es6/fuzz.js b/examples/jpeg_es6/fuzz.js index 896d0a8b7..0b9941401 100644 --- a/examples/jpeg_es6/fuzz.js +++ b/examples/jpeg_es6/fuzz.js @@ -1,5 +1,5 @@ /* - * Copyright 2023 Code Intelligence GmbH + * Copyright 2026 Code Intelligence GmbH * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/examples/js-yaml/fuzz.ts b/examples/js-yaml/fuzz.ts index 5c32ebbb1..9b9c11c4c 100644 --- a/examples/js-yaml/fuzz.ts +++ b/examples/js-yaml/fuzz.ts @@ -1,5 +1,5 @@ /* - * Copyright 2023 Code Intelligence GmbH + * Copyright 2026 Code Intelligence GmbH * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/examples/maze/fuzz.js b/examples/maze/fuzz.js index 603207ab3..b4ca053f3 100644 --- a/examples/maze/fuzz.js +++ b/examples/maze/fuzz.js @@ -1,5 +1,5 @@ /* - * Copyright 2023 Code Intelligence GmbH + * Copyright 2026 Code Intelligence GmbH * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/examples/protobufjs/protobufjs.fuzz.js b/examples/protobufjs/protobufjs.fuzz.js index 7500df868..c602ce8f7 100644 --- a/examples/protobufjs/protobufjs.fuzz.js +++ b/examples/protobufjs/protobufjs.fuzz.js @@ -1,5 +1,5 @@ /* - * Copyright 2023 Code Intelligence GmbH + * Copyright 2026 Code Intelligence GmbH * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/examples/spectral/spectral-example.js b/examples/spectral/spectral-example.js index e6cdb4793..75230d0df 100644 --- a/examples/spectral/spectral-example.js +++ b/examples/spectral/spectral-example.js @@ -1,5 +1,5 @@ /* - * Copyright 2023 Code Intelligence GmbH + * Copyright 2026 Code Intelligence GmbH * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/examples/xml/fuzz.js b/examples/xml/fuzz.js index 8712798a7..5e9e6f121 100644 --- a/examples/xml/fuzz.js +++ b/examples/xml/fuzz.js @@ -1,5 +1,5 @@ /* - * Copyright 2023 Code Intelligence GmbH + * Copyright 2026 Code Intelligence GmbH * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/fuzztests/FuzzedDataProvider.fuzz.js b/fuzztests/FuzzedDataProvider.fuzz.js index be1a24d76..f18a99bef 100644 --- a/fuzztests/FuzzedDataProvider.fuzz.js +++ b/fuzztests/FuzzedDataProvider.fuzz.js @@ -1,5 +1,5 @@ /* - * Copyright 2023 Code Intelligence GmbH + * Copyright 2026 Code Intelligence GmbH * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -33,7 +33,7 @@ describe("FuzzedDataProvider", () => { .filter((m) => provider[m].length === 0); let usedMethods = ""; - while (provider.remainingBytes > 0) { + while (provider.remainingBytes > 0 && methodNames.length > 0) { const methodName = provider.pickValue(methodNames); provider[methodName].call(provider); usedMethods += methodName; diff --git a/fuzztests/fuzzer.fuzz.js b/fuzztests/fuzzer.fuzz.js index f1a624e9b..d08a6d373 100644 --- a/fuzztests/fuzzer.fuzz.js +++ b/fuzztests/fuzzer.fuzz.js @@ -1,5 +1,5 @@ /* - * Copyright 2023 Code Intelligence GmbH + * Copyright 2026 Code Intelligence GmbH * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/fuzztests/instrument.fuzz.js b/fuzztests/instrument.fuzz.js index dc4084cca..64b452b66 100644 --- a/fuzztests/instrument.fuzz.js +++ b/fuzztests/instrument.fuzz.js @@ -1,5 +1,5 @@ /* - * Copyright 2023 Code Intelligence GmbH + * Copyright 2026 Code Intelligence GmbH * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/fuzztests/runFuzzTests.js b/fuzztests/runFuzzTests.js index 448066785..ed8da4fa7 100755 --- a/fuzztests/runFuzzTests.js +++ b/fuzztests/runFuzzTests.js @@ -1,6 +1,6 @@ #!/usr/bin/node /* - * Copyright 2023 Code Intelligence GmbH + * Copyright 2026 Code Intelligence GmbH * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/jest.config.js b/jest.config.js index 4d7d0b927..dbb47871e 100644 --- a/jest.config.js +++ b/jest.config.js @@ -1,5 +1,5 @@ /* - * Copyright 2023 Code Intelligence GmbH + * Copyright 2026 Code Intelligence GmbH * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/package-lock.json b/package-lock.json index 4aeced1d7..72e35409c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,37 +1,37 @@ { "name": "jazzer.js", - "version": "2.1.0", + "version": "3.1.0", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "jazzer.js", - "version": "2.1.0", + "version": "3.1.0", "license": "Apache-2.0", "workspaces": [ "packages/*" ], "devDependencies": { "@types/bindings": "^1.5.5", - "@types/jest": "^29.5.12", - "@types/node": "^20.11.17", - "@types/yargs": "^17.0.32", - "@typescript-eslint/eslint-plugin": "^6.20.0", - "eslint": "^8.56.0", + "@types/jest": "^29.5.13", + "@types/node": "^20.14.11", + "@types/yargs": "^17.0.33", + "@typescript-eslint/eslint-plugin": "^6.21.0", + "eslint": "^8.57.0", "eslint-config-prettier": "^9.1.0", "eslint-plugin-header": "^3.1.1", - "eslint-plugin-import": "^2.29.1", - "eslint-plugin-jest": "^27.6.3", - "eslint-plugin-markdownlint": "^0.5.0", - "husky": "^8.0.3", + "eslint-plugin-import": "^2.30.0", + "eslint-plugin-jest": "^27.9.0", + "eslint-plugin-markdownlint": "^0.6.0", + "husky": "^9.1.6", "istanbul-lib-coverage": "^3.2.2", "jest": "^29.7.0", - "lint-staged": "^15.2.2", - "prettier": "3.1.0", - "rimraf": "^5.0.5", + "lint-staged": "^15.2.10", + "prettier": "3.3.3", + "rimraf": "^5.0.7", "run-script-os": "^1.1.6", - "ts-jest": "^29.1.2", - "typescript": "^5.3.3" + "ts-jest": "^29.2.5", + "typescript": "^5.6.2" }, "engines": { "node": ">= 14.0.0", @@ -60,104 +60,40 @@ } }, "node_modules/@babel/code-frame": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.5.tgz", - "integrity": "sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.7.tgz", + "integrity": "sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==", "dependencies": { - "@babel/highlight": "^7.23.4", - "chalk": "^2.4.2" + "@babel/highlight": "^7.24.7", + "picocolors": "^1.0.0" }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/code-frame/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/code-frame/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/code-frame/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/@babel/code-frame/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" - }, - "node_modules/@babel/code-frame/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/@babel/code-frame/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/code-frame/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/@babel/compat-data": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.23.5.tgz", - "integrity": "sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw==", + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.25.2.tgz", + "integrity": "sha512-bYcppcpKBvX4znYaPEeFau03bp89ShqNMLs+rmdptMw+heSZh9+z84d2YG+K7cYLbWwzdjtDoW/uqZmPjulClQ==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.23.9", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.9.tgz", - "integrity": "sha512-5q0175NOjddqpvvzU+kDiSOAk4PfdO6FvwCWoQ6RO7rTzEe8vlo+4HVfcnAREhD4npMs0e9uZypjTwzZPCf/cw==", + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.25.2.tgz", + "integrity": "sha512-BBt3opiCOxUr9euZ5/ro/Xv8/V7yJ5bjYMqG/C1YAo8MIKAnumZalCN+msbci3Pigy4lIQfPUpfMM27HMGaYEA==", "dependencies": { "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.23.5", - "@babel/generator": "^7.23.6", - "@babel/helper-compilation-targets": "^7.23.6", - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helpers": "^7.23.9", - "@babel/parser": "^7.23.9", - "@babel/template": "^7.23.9", - "@babel/traverse": "^7.23.9", - "@babel/types": "^7.23.9", + "@babel/code-frame": "^7.24.7", + "@babel/generator": "^7.25.0", + "@babel/helper-compilation-targets": "^7.25.2", + "@babel/helper-module-transforms": "^7.25.2", + "@babel/helpers": "^7.25.0", + "@babel/parser": "^7.25.0", + "@babel/template": "^7.25.0", + "@babel/traverse": "^7.25.2", + "@babel/types": "^7.25.2", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -186,13 +122,13 @@ } }, "node_modules/@babel/generator": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.6.tgz", - "integrity": "sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw==", + "version": "7.25.6", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.25.6.tgz", + "integrity": "sha512-VPC82gr1seXOpkjAAKoLhP50vx4vGNlF4msF64dSFq1P8RfB+QAuJWGHPXXPc8QyfVWwwB/TNNU4+ayZmHNbZw==", "dependencies": { - "@babel/types": "^7.23.6", - "@jridgewell/gen-mapping": "^0.3.2", - "@jridgewell/trace-mapping": "^0.3.17", + "@babel/types": "^7.25.6", + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25", "jsesc": "^2.5.1" }, "engines": { @@ -200,26 +136,26 @@ } }, "node_modules/@babel/generator/node_modules/@jridgewell/gen-mapping": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", - "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", + "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", "dependencies": { - "@jridgewell/set-array": "^1.0.1", + "@jridgewell/set-array": "^1.2.1", "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" + "@jridgewell/trace-mapping": "^0.3.24" }, "engines": { "node": ">=6.0.0" } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz", - "integrity": "sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==", + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.2.tgz", + "integrity": "sha512-U2U5LsSaZ7TAt3cfaymQ8WHh0pxvdHoEk6HVpaexxixjyEquMh0L0YNJNM6CTGKMXV1iksi0iZkGw4AcFkPaaw==", "dependencies": { - "@babel/compat-data": "^7.23.5", - "@babel/helper-validator-option": "^7.23.5", - "browserslist": "^4.22.2", + "@babel/compat-data": "^7.25.2", + "@babel/helper-validator-option": "^7.24.8", + "browserslist": "^4.23.1", "lru-cache": "^5.1.1", "semver": "^6.3.1" }, @@ -248,58 +184,27 @@ "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" }, - "node_modules/@babel/helper-environment-visitor": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", - "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-function-name": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", - "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", - "dependencies": { - "@babel/template": "^7.22.15", - "@babel/types": "^7.23.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-hoist-variables": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", - "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/helper-module-imports": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz", - "integrity": "sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.7.tgz", + "integrity": "sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA==", "dependencies": { - "@babel/types": "^7.22.15" + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz", - "integrity": "sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==", + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.25.2.tgz", + "integrity": "sha512-BjyRAbix6j/wv83ftcVJmBt72QtHI56C7JXZoG2xATiLpmoC7dpd8WnkikExHDVPpi/3qCmO6WY1EaXOluiecQ==", "dependencies": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-module-imports": "^7.22.15", - "@babel/helper-simple-access": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/helper-validator-identifier": "^7.22.20" + "@babel/helper-module-imports": "^7.24.7", + "@babel/helper-simple-access": "^7.24.7", + "@babel/helper-validator-identifier": "^7.24.7", + "@babel/traverse": "^7.25.2" }, "engines": { "node": ">=6.9.0" @@ -317,72 +222,62 @@ } }, "node_modules/@babel/helper-simple-access": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", - "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-split-export-declaration": { - "version": "7.22.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", - "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.24.7.tgz", + "integrity": "sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg==", "dependencies": { - "@babel/types": "^7.22.5" + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-string-parser": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz", - "integrity": "sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==", + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.8.tgz", + "integrity": "sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", - "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz", + "integrity": "sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-option": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz", - "integrity": "sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==", + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.24.8.tgz", + "integrity": "sha512-xb8t9tD1MHLungh/AIoWYN+gVHaB9kwlu8gffXGSt3FFEIT7RjS+xWbc2vUD1UTZdIpKj/ab3rdqJ7ufngyi2Q==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helpers": { - "version": "7.23.9", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.9.tgz", - "integrity": "sha512-87ICKgU5t5SzOT7sBMfCOZQ2rHjRU+Pcb9BoILMYz600W6DkVRLFBPwQ18gwUVvggqXivaUakpnxWQGbpywbBQ==", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.25.0.tgz", + "integrity": "sha512-MjgLZ42aCm0oGjJj8CtSM3DB8NOOf8h2l7DCTePJs29u+v7yO/RBX9nShlKMgFnRks/Q4tBAe7Hxnov9VkGwLw==", "dependencies": { - "@babel/template": "^7.23.9", - "@babel/traverse": "^7.23.9", - "@babel/types": "^7.23.9" + "@babel/template": "^7.25.0", + "@babel/types": "^7.25.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/highlight": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz", - "integrity": "sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.7.tgz", + "integrity": "sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==", "dependencies": { - "@babel/helper-validator-identifier": "^7.22.20", + "@babel/helper-validator-identifier": "^7.24.7", "chalk": "^2.4.2", - "js-tokens": "^4.0.0" + "js-tokens": "^4.0.0", + "picocolors": "^1.0.0" }, "engines": { "node": ">=6.9.0" @@ -453,9 +348,12 @@ } }, "node_modules/@babel/parser": { - "version": "7.23.9", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.9.tgz", - "integrity": "sha512-9tcKgqKbs3xGJ+NtKF2ndOBBLVwPjl1SHxPQkd36r3Dlirw3xWUeGaTbqr7uGZcTaxkVNwc+03SVP7aCdWrTlA==", + "version": "7.25.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.25.3.tgz", + "integrity": "sha512-iLTJKDbJ4hMvFPgQwwsVoxtHyWpKKPBrxkANrSYewDPaPpT5py5yeVkgPIJ7XYXhndxJpaA3PyALSXQ7u8e/Dw==", + "dependencies": { + "@babel/types": "^7.25.2" + }, "bin": { "parser": "bin/babel-parser.js" }, @@ -627,31 +525,28 @@ } }, "node_modules/@babel/template": { - "version": "7.23.9", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.23.9.tgz", - "integrity": "sha512-+xrD2BWLpvHKNmX2QbpdpsBaWnRxahMwJjO+KZk2JOElj5nSmKezyS1B4u+QbHMTX69t4ukm6hh9lsYQ7GHCKA==", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.0.tgz", + "integrity": "sha512-aOOgh1/5XzKvg1jvVz7AVrx2piJ2XBi227DHmbY6y+bM9H2FlN+IfecYu4Xl0cNiiVejlsCri89LUsbj8vJD9Q==", "dependencies": { - "@babel/code-frame": "^7.23.5", - "@babel/parser": "^7.23.9", - "@babel/types": "^7.23.9" + "@babel/code-frame": "^7.24.7", + "@babel/parser": "^7.25.0", + "@babel/types": "^7.25.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.23.9", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.9.tgz", - "integrity": "sha512-I/4UJ9vs90OkBtY6iiiTORVMyIhJ4kAVmsKo9KFc8UOxMeUfi2hvtIBsET5u9GizXE6/GFSuKCTNfgCswuEjRg==", - "dependencies": { - "@babel/code-frame": "^7.23.5", - "@babel/generator": "^7.23.6", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.23.9", - "@babel/types": "^7.23.9", + "version": "7.25.3", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.3.tgz", + "integrity": "sha512-HefgyP1x754oGCsKmV5reSmtV7IXj/kpaE1XYY+D9G5PvKKoFfSbiS4M77MdjuwlZKDIKFCffq9rPU+H/s3ZdQ==", + "dependencies": { + "@babel/code-frame": "^7.24.7", + "@babel/generator": "^7.25.0", + "@babel/parser": "^7.25.3", + "@babel/template": "^7.25.0", + "@babel/types": "^7.25.2", "debug": "^4.3.1", "globals": "^11.1.0" }, @@ -668,12 +563,12 @@ } }, "node_modules/@babel/types": { - "version": "7.23.9", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.9.tgz", - "integrity": "sha512-dQjSq/7HaSjRM43FFGnv5keM2HsxpmyV1PfaSVm0nzzjwwTmjOe6J4bC8e3+pTEIgHaHj+1ZlLThRJ2auc/w1Q==", + "version": "7.25.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.6.tgz", + "integrity": "sha512-/l42B1qxpG6RdfYf343Uw1vmDjeNhneUXtzhojE7pDgfpEypmRhI6j1kr17XCVv4Cgl9HdAiQY2x0GwKm7rWCw==", "dependencies": { - "@babel/helper-string-parser": "^7.23.4", - "@babel/helper-validator-identifier": "^7.22.20", + "@babel/helper-string-parser": "^7.24.8", + "@babel/helper-validator-identifier": "^7.24.7", "to-fast-properties": "^2.0.0" }, "engines": { @@ -733,22 +628,22 @@ } }, "node_modules/@eslint/js": { - "version": "8.56.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.56.0.tgz", - "integrity": "sha512-gMsVel9D7f2HLkBma9VbtzZRehRogVRfbr++f06nL2vnCGCNlzOD+/MUov/F4p8myyAHspEhVobgjpX64q5m6A==", + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz", + "integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, "node_modules/@humanwhocodes/config-array": { - "version": "0.11.13", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.13.tgz", - "integrity": "sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ==", + "version": "0.11.14", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", + "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==", "dev": true, "dependencies": { - "@humanwhocodes/object-schema": "^2.0.1", - "debug": "^4.1.1", + "@humanwhocodes/object-schema": "^2.0.2", + "debug": "^4.3.1", "minimatch": "^3.0.5" }, "engines": { @@ -769,9 +664,9 @@ } }, "node_modules/@humanwhocodes/object-schema": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.1.tgz", - "integrity": "sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.2.tgz", + "integrity": "sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==", "dev": true }, "node_modules/@isaacs/cliui": { @@ -1260,9 +1155,9 @@ } }, "node_modules/@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", "engines": { "node": ">=6.0.0" } @@ -1273,12 +1168,12 @@ "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==" }, "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.18", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz", - "integrity": "sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==", + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", "dependencies": { - "@jridgewell/resolve-uri": "3.1.0", - "@jridgewell/sourcemap-codec": "1.4.14" + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" } }, "node_modules/@nodelib/fs.scandir": { @@ -1316,18 +1211,6 @@ "node": ">= 8" } }, - "node_modules/@npmcli/fs": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-3.1.0.tgz", - "integrity": "sha512-7kZUAaLscfgbwBQRbvdMYaZOWyMEcPTH/tJjnyAWJ/dvvs9Ef+CERx/qJb9GExJpl1qipaDGn7KqHnFGGixd0w==", - "dev": true, - "dependencies": { - "semver": "^7.3.5" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, "node_modules/@pkgjs/parseargs": { "version": "0.11.0", "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", @@ -1338,6 +1221,12 @@ "node": ">=14" } }, + "node_modules/@rtsao/scc": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz", + "integrity": "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==", + "dev": true + }, "node_modules/@sinclair/typebox": { "version": "0.27.8", "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", @@ -1359,15 +1248,6 @@ "@sinonjs/commons": "^3.0.0" } }, - "node_modules/@tootallnate/once": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", - "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", - "dev": true, - "engines": { - "node": ">= 10" - } - }, "node_modules/@types/babel__core": { "version": "7.20.5", "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", @@ -1467,9 +1347,9 @@ } }, "node_modules/@types/jest": { - "version": "29.5.12", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.12.tgz", - "integrity": "sha512-eDC8bTvT/QhYdxJAulQikueigY5AsdBRH2yDKW3yveW7svY3+DzN84/2NUgkw10RTiJbWqZrTtoGVdYlvFJdLw==", + "version": "29.5.13", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.13.tgz", + "integrity": "sha512-wd+MVEZCHt23V0/L642O5APvspWply/rGY5BcW4SUETo2UzPU3Z26qr8jC2qxpimI2jjx9h7+2cj2FwIr01bXg==", "dependencies": { "expect": "^29.0.0", "pretty-format": "^29.0.0" @@ -1488,9 +1368,9 @@ "dev": true }, "node_modules/@types/node": { - "version": "20.11.17", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.17.tgz", - "integrity": "sha512-QmgQZGWu1Yw9TDyAP9ZzpFJKynYNeOvwMJmaxABfieQoVoiVOS6MN1WSpqpRcbeA5+RW82kraAVxCCJg+780Qw==", + "version": "20.14.11", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.11.tgz", + "integrity": "sha512-kprQpL8MMeszbz6ojB5/tU8PLN4kesnN8Gjzw349rDlNgsSzg90lAVj3llK99Dh7JON+t9AuscPPFW6mPbTnSA==", "dependencies": { "undici-types": "~5.26.4" } @@ -1537,9 +1417,9 @@ "dev": true }, "node_modules/@types/yargs": { - "version": "17.0.32", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.32.tgz", - "integrity": "sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog==", + "version": "17.0.33", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.33.tgz", + "integrity": "sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==", "dependencies": { "@types/yargs-parser": "*" } @@ -1550,16 +1430,16 @@ "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==" }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "6.20.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.20.0.tgz", - "integrity": "sha512-fTwGQUnjhoYHeSF6m5pWNkzmDDdsKELYrOBxhjMrofPqCkoC2k3B2wvGHFxa1CTIqkEn88nlW1HVMztjo2K8Hg==", + "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, "dependencies": { "@eslint-community/regexpp": "^4.5.1", - "@typescript-eslint/scope-manager": "6.20.0", - "@typescript-eslint/type-utils": "6.20.0", - "@typescript-eslint/utils": "6.20.0", - "@typescript-eslint/visitor-keys": "6.20.0", + "@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", @@ -1585,13 +1465,13 @@ } }, "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/scope-manager": { - "version": "6.20.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.20.0.tgz", - "integrity": "sha512-p4rvHQRDTI1tGGMDFQm+GtxP1ZHyAh64WANVoyEcNMpaTFn3ox/3CcgtIlELnRfKzSs/DwYlDccJEtr3O6qBvA==", + "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, "dependencies": { - "@typescript-eslint/types": "6.20.0", - "@typescript-eslint/visitor-keys": "6.20.0" + "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/visitor-keys": "6.21.0" }, "engines": { "node": "^16.0.0 || >=18.0.0" @@ -1602,9 +1482,9 @@ } }, "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/types": { - "version": "6.20.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.20.0.tgz", - "integrity": "sha512-MM9mfZMAhiN4cOEcUOEx+0HmuaW3WBfukBZPCfwSqFnQy0grXYtngKCqpQN339X3RrwtzspWJrpbrupKYUSBXQ==", + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.21.0.tgz", + "integrity": "sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg==", "dev": true, "engines": { "node": "^16.0.0 || >=18.0.0" @@ -1615,13 +1495,13 @@ } }, "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/typescript-estree": { - "version": "6.20.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.20.0.tgz", - "integrity": "sha512-RnRya9q5m6YYSpBN7IzKu9FmLcYtErkDkc8/dKv81I9QiLLtVBHrjz+Ev/crAqgMNW2FCsoZF4g2QUylMnJz+g==", + "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, "dependencies": { - "@typescript-eslint/types": "6.20.0", - "@typescript-eslint/visitor-keys": "6.20.0", + "@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", @@ -1643,17 +1523,17 @@ } }, "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/utils": { - "version": "6.20.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.20.0.tgz", - "integrity": "sha512-/EKuw+kRu2vAqCoDwDCBtDRU6CTKbUmwwI7SH7AashZ+W+7o8eiyy6V2cdOqN49KsTcASWsC5QeghYuRDTyOOg==", + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.21.0.tgz", + "integrity": "sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", "@types/json-schema": "^7.0.12", "@types/semver": "^7.5.0", - "@typescript-eslint/scope-manager": "6.20.0", - "@typescript-eslint/types": "6.20.0", - "@typescript-eslint/typescript-estree": "6.20.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" }, "engines": { @@ -1668,12 +1548,12 @@ } }, "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/visitor-keys": { - "version": "6.20.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.20.0.tgz", - "integrity": "sha512-E8Cp98kRe4gKHjJD4NExXKz/zOJ1A2hhZc+IMVD6i7w4yjIvh6VyuRI0gRtxAsXtoC35uGMaQ9rjI2zJaXDEAw==", + "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, "dependencies": { - "@typescript-eslint/types": "6.20.0", + "@typescript-eslint/types": "6.21.0", "eslint-visitor-keys": "^3.4.1" }, "engines": { @@ -1833,13 +1713,13 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "6.20.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.20.0.tgz", - "integrity": "sha512-qnSobiJQb1F5JjN0YDRPHruQTrX7ICsmltXhkV536mp4idGAYrIyr47zF/JmkJtEcAVnIz4gUYJ7gOZa6SmN4g==", + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.21.0.tgz", + "integrity": "sha512-rZQI7wHfao8qMX3Rd3xqeYSMCL3SoiSQLBATSiVKARdFGCYSRvmViieZjqc58jKgs8Y8i9YvVVhRbHSTA4VBag==", "dev": true, "dependencies": { - "@typescript-eslint/typescript-estree": "6.20.0", - "@typescript-eslint/utils": "6.20.0", + "@typescript-eslint/typescript-estree": "6.21.0", + "@typescript-eslint/utils": "6.21.0", "debug": "^4.3.4", "ts-api-utils": "^1.0.1" }, @@ -1860,13 +1740,13 @@ } }, "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/scope-manager": { - "version": "6.20.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.20.0.tgz", - "integrity": "sha512-p4rvHQRDTI1tGGMDFQm+GtxP1ZHyAh64WANVoyEcNMpaTFn3ox/3CcgtIlELnRfKzSs/DwYlDccJEtr3O6qBvA==", + "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, "dependencies": { - "@typescript-eslint/types": "6.20.0", - "@typescript-eslint/visitor-keys": "6.20.0" + "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/visitor-keys": "6.21.0" }, "engines": { "node": "^16.0.0 || >=18.0.0" @@ -1877,9 +1757,9 @@ } }, "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/types": { - "version": "6.20.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.20.0.tgz", - "integrity": "sha512-MM9mfZMAhiN4cOEcUOEx+0HmuaW3WBfukBZPCfwSqFnQy0grXYtngKCqpQN339X3RrwtzspWJrpbrupKYUSBXQ==", + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.21.0.tgz", + "integrity": "sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg==", "dev": true, "engines": { "node": "^16.0.0 || >=18.0.0" @@ -1890,13 +1770,13 @@ } }, "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/typescript-estree": { - "version": "6.20.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.20.0.tgz", - "integrity": "sha512-RnRya9q5m6YYSpBN7IzKu9FmLcYtErkDkc8/dKv81I9QiLLtVBHrjz+Ev/crAqgMNW2FCsoZF4g2QUylMnJz+g==", + "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, "dependencies": { - "@typescript-eslint/types": "6.20.0", - "@typescript-eslint/visitor-keys": "6.20.0", + "@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", @@ -1918,17 +1798,17 @@ } }, "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/utils": { - "version": "6.20.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.20.0.tgz", - "integrity": "sha512-/EKuw+kRu2vAqCoDwDCBtDRU6CTKbUmwwI7SH7AashZ+W+7o8eiyy6V2cdOqN49KsTcASWsC5QeghYuRDTyOOg==", + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.21.0.tgz", + "integrity": "sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", "@types/json-schema": "^7.0.12", "@types/semver": "^7.5.0", - "@typescript-eslint/scope-manager": "6.20.0", - "@typescript-eslint/types": "6.20.0", - "@typescript-eslint/typescript-estree": "6.20.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" }, "engines": { @@ -1943,12 +1823,12 @@ } }, "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/visitor-keys": { - "version": "6.20.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.20.0.tgz", - "integrity": "sha512-E8Cp98kRe4gKHjJD4NExXKz/zOJ1A2hhZc+IMVD6i7w4yjIvh6VyuRI0gRtxAsXtoC35uGMaQ9rjI2zJaXDEAw==", + "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, "dependencies": { - "@typescript-eslint/types": "6.20.0", + "@typescript-eslint/types": "6.21.0", "eslint-visitor-keys": "^3.4.1" }, "engines": { @@ -2072,24 +1952,6 @@ "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", "dev": true }, - "node_modules/abbrev": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", - "dev": true - }, - "node_modules/abort-controller": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", - "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", - "dev": true, - "dependencies": { - "event-target-shim": "^5.0.0" - }, - "engines": { - "node": ">=6.5" - } - }, "node_modules/acorn": { "version": "8.11.2", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.2.tgz", @@ -2111,49 +1973,6 @@ "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, - "node_modules/after": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/after/-/after-0.8.2.tgz", - "integrity": "sha512-QbJ0NTQ/I9DI3uSJA4cbexiwQeRAfjPScqIbSjUDd9TOrcg6pTkdgziesOqxBMBzit8vFCTwrP27t13vFOORRA==", - "dev": true - }, - "node_modules/agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "dev": true, - "dependencies": { - "debug": "4" - }, - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/agentkeepalive": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.5.0.tgz", - "integrity": "sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew==", - "dev": true, - "dependencies": { - "humanize-ms": "^1.2.1" - }, - "engines": { - "node": ">= 8.0.0" - } - }, - "node_modules/aggregate-error": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", - "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", - "dev": true, - "dependencies": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/ajv": { "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", @@ -2170,12 +1989,6 @@ "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/ansi": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/ansi/-/ansi-0.3.1.tgz", - "integrity": "sha512-iFY7JCgHbepc0b82yLaw4IMortylNb6wG4kL+4R0C3iv6i+RHGHux/yUX5BTiRvSX/shMnngjR1YyNMnXEFh5A==", - "dev": true - }, "node_modules/ansi-escapes": { "version": "4.3.2", "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", @@ -2269,28 +2082,32 @@ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" }, "node_modules/array-buffer-byte-length": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz", - "integrity": "sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz", + "integrity": "sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "is-array-buffer": "^3.0.1" + "call-bind": "^1.0.5", + "is-array-buffer": "^3.0.4" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/array-includes": { - "version": "3.1.7", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.7.tgz", - "integrity": "sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ==", + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.8.tgz", + "integrity": "sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "get-intrinsic": "^1.2.1", + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.4", "is-string": "^1.0.7" }, "engines": { @@ -2300,34 +2117,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/array-index": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-index/-/array-index-1.0.0.tgz", - "integrity": "sha512-jesyNbBkLQgGZMSwA1FanaFjalb1mZUGxGeUEkSDidzgrbjBGhvizJkaItdhkt8eIHFOJC7nDsrXk+BaehTdRw==", - "dev": true, - "dependencies": { - "debug": "^2.2.0", - "es6-symbol": "^3.0.2" - }, - "engines": { - "node": "*" - } - }, - "node_modules/array-index/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/array-index/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - }, "node_modules/array-union": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", @@ -2338,16 +2127,17 @@ } }, "node_modules/array.prototype.findlastindex": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.3.tgz", - "integrity": "sha512-LzLoiOMAxvy+Gd3BAq3B7VeIgPdo+Q8hthvKtXybMvRV0jrXfJM/t8mw7nNlpEcVlVUnCnM2KSX4XU5HmpodOA==", + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.5.tgz", + "integrity": "sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0", - "get-intrinsic": "^1.2.1" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-shim-unscopables": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -2393,16 +2183,18 @@ } }, "node_modules/arraybuffer.prototype.slice": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.1.tgz", - "integrity": "sha512-09x0ZWFEjj4WD8PDbykUwo3t9arLn8NIzmmYEJFpYekOAQjpkGSyrQhNoRTcwwcFRu+ycWF78QZ63oWTqSjBcw==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz", + "integrity": "sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==", "dev": true, "dependencies": { - "array-buffer-byte-length": "^1.0.0", - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "get-intrinsic": "^1.2.1", - "is-array-buffer": "^3.0.2", + "array-buffer-byte-length": "^1.0.1", + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.3", + "es-errors": "^1.2.1", + "get-intrinsic": "^1.2.3", + "is-array-buffer": "^3.0.4", "is-shared-array-buffer": "^1.0.2" }, "engines": { @@ -2412,24 +2204,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/asn1": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", - "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", - "dev": true, - "dependencies": { - "safer-buffer": "~2.1.0" - } - }, - "node_modules/assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", - "dev": true, - "engines": { - "node": ">=0.8" - } - }, "node_modules/async": { "version": "3.2.4", "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", @@ -2442,10 +2216,13 @@ "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" }, "node_modules/available-typed-arrays": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", - "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", "dev": true, + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, "engines": { "node": ">= 0.4" }, @@ -2453,21 +2230,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/aws4": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.12.0.tgz", - "integrity": "sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg==", - "dev": true - }, "node_modules/axios": { "version": "1.6.5", "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.5.tgz", @@ -2478,12 +2240,6 @@ "proxy-from-env": "^1.1.0" } }, - "node_modules/b4a": { - "version": "1.6.4", - "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.6.4.tgz", - "integrity": "sha512-fpWrvyVHEKyeEvbKZTVOeZF3VSKKWtJxFIxX/jaVPf+cLbGUSitjb49pHLqPV2BUNNZ0LcoeEGfE/YCpyDYHIw==", - "dev": true - }, "node_modules/babel-jest": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", @@ -2598,34 +2354,6 @@ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" }, - "node_modules/base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/bcrypt-pbkdf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", - "dev": true, - "dependencies": { - "tweetnacl": "^0.14.3" - } - }, "node_modules/bindings": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", @@ -2634,27 +2362,6 @@ "file-uri-to-path": "1.0.0" } }, - "node_modules/bl": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/bl/-/bl-3.0.1.tgz", - "integrity": "sha512-jrCW5ZhfQ/Vt07WX1Ngs+yn9BDqPL/gw28S7s9H6QK/gupnizNzJAss5akW20ISgOrbLTlXOOCTJeNUQqruAWQ==", - "dev": true, - "dependencies": { - "readable-stream": "^3.0.1" - } - }, - "node_modules/block-stream": { - "version": "0.0.9", - "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz", - "integrity": "sha512-OorbnJVPII4DuUKbjARAe8u8EfqOmkEEaSFIyoQ7OjTHn6kafxWl0wLgoZ2rXaYd7MyLcDaU4TmhfxtwgcccMQ==", - "dev": true, - "dependencies": { - "inherits": "~2.0.0" - }, - "engines": { - "node": "0.4 || >=0.5.8" - } - }, "node_modules/brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -2665,20 +2372,20 @@ } }, "node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", "dependencies": { - "fill-range": "^7.0.1" + "fill-range": "^7.1.1" }, "engines": { "node": ">=8" } }, "node_modules/browserslist": { - "version": "4.22.2", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.2.tgz", - "integrity": "sha512-0UgcrvQmBDvZHFGdYUehrCNIazki7/lUP3kkoi/r3YB2amZbFM9J43ZRkJTXBUZK4gmx56+Sqk9+Vs9mwZx9+A==", + "version": "4.23.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.3.tgz", + "integrity": "sha512-btwCFJVjI4YWDNfau8RhZ+B1Q/VLoUITrm3RlP6y1tYGWIOa+InuYiRGXUBXo8nA1qKmHMyLB/iVQg5TT4eFoA==", "funding": [ { "type": "opencollective", @@ -2694,10 +2401,10 @@ } ], "dependencies": { - "caniuse-lite": "^1.0.30001565", - "electron-to-chromium": "^1.4.601", - "node-releases": "^2.0.14", - "update-browserslist-db": "^1.0.13" + "caniuse-lite": "^1.0.30001646", + "electron-to-chromium": "^1.5.4", + "node-releases": "^2.0.18", + "update-browserslist-db": "^1.1.0" }, "bin": { "browserslist": "cli.js" @@ -2726,141 +2433,25 @@ "node-int64": "^0.4.0" } }, - "node_modules/buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - }, "node_modules/buffer-from": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" }, - "node_modules/cacache": { - "version": "17.1.4", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-17.1.4.tgz", - "integrity": "sha512-/aJwG2l3ZMJ1xNAnqbMpA40of9dj/pIH3QfiuQSqjfPJF747VR0J/bHn+/KdNnHKc6XQcWt/AfRSBft82W1d2A==", - "dev": true, - "dependencies": { - "@npmcli/fs": "^3.1.0", - "fs-minipass": "^3.0.0", - "glob": "^10.2.2", - "lru-cache": "^7.7.1", - "minipass": "^7.0.3", - "minipass-collect": "^1.0.2", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "p-map": "^4.0.0", - "ssri": "^10.0.0", - "tar": "^6.1.11", - "unique-filename": "^3.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/cacache/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/cacache/node_modules/fs-minipass": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-3.0.3.tgz", - "integrity": "sha512-XUBA9XClHbnJWSfBzjkm6RvPsyg3sryZt06BEQoXcF7EK/xpGaQYJgQKDJSUH5SGZ76Y7pFx1QBnXz09rU5Fbw==", - "dev": true, - "dependencies": { - "minipass": "^7.0.3" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/cacache/node_modules/glob": { - "version": "10.3.10", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", - "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", - "dev": true, - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^2.3.5", - "minimatch": "^9.0.1", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", - "path-scurry": "^1.10.1" - }, - "bin": { - "glob": "dist/esm/bin.mjs" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/cacache/node_modules/lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", - "dev": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/cacache/node_modules/minimatch": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", - "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "node_modules/call-bind": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", + "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", "dev": true, "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.1" }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/cacache/node_modules/minipass": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", - "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", - "dev": true, "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -2883,9 +2474,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001568", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001568.tgz", - "integrity": "sha512-vSUkH84HontZJ88MiNrOau1EBrCqEQYgkC5gIySiDlpsm8sGVrhU7Kx4V6h0tnqaHzIHZv08HlJIwPbL4XL9+A==", + "version": "1.0.30001649", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001649.tgz", + "integrity": "sha512-fJegqZZ0ZX8HOWr6rcafGr72+xcgJKI9oWfDW5DrD7ExUtgZC7a7R7ZYmZqplh7XDocFdGeIFn7roAxhOeYrPQ==", "funding": [ { "type": "opencollective", @@ -2901,12 +2492,6 @@ } ] }, - "node_modules/caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==", - "dev": true - }, "node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", @@ -2967,25 +2552,16 @@ "git-clang-format": "bin/git-clang-format" } }, - "node_modules/clean-stack": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", - "dev": true, - "engines": { - "node": ">=6" - } - }, "node_modules/cli-cursor": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-4.0.0.tgz", - "integrity": "sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-5.0.0.tgz", + "integrity": "sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==", "dev": true, "dependencies": { - "restore-cursor": "^4.0.0" + "restore-cursor": "^5.0.0" }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -3026,9 +2602,9 @@ "dev": true }, "node_modules/cli-truncate/node_modules/string-width": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.1.0.tgz", - "integrity": "sha512-SEIJCWiX7Kg4c129n48aDRwLbFb2LJmXXFrWBG4NGaRtMQ3myKPKbwrD1BKqQn74oCoNMBVrfDEr5M9YxCsrkw==", + "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, "dependencies": { "emoji-regex": "^10.3.0", @@ -3131,15 +2707,6 @@ "node": ">= 0.12.0" } }, - "node_modules/code-point-at": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/collect-v8-coverage": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz", @@ -3187,12 +2754,12 @@ } }, "node_modules/commander": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-11.1.0.tgz", - "integrity": "sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==", + "version": "12.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz", + "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", "dev": true, "engines": { - "node": ">=16" + "node": ">=18" } }, "node_modules/concat-map": { @@ -3210,21 +2777,15 @@ "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==" }, - "node_modules/core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==", - "dev": true - }, "node_modules/cosmiconfig": { - "version": "8.3.6", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz", - "integrity": "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==", + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.0.tgz", + "integrity": "sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==", "dependencies": { + "env-paths": "^2.2.1", "import-fresh": "^3.3.0", "js-yaml": "^4.1.0", - "parse-json": "^5.2.0", - "path-type": "^4.0.0" + "parse-json": "^5.2.0" }, "engines": { "node": ">=14" @@ -3262,9 +2823,9 @@ } }, "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==", "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", @@ -3274,32 +2835,61 @@ "node": ">= 8" } }, - "node_modules/d": { + "node_modules/data-view-buffer": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", - "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", + "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.1.tgz", + "integrity": "sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==", "dev": true, "dependencies": { - "es5-ext": "^0.10.50", - "type": "^1.0.1" + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==", + "node_modules/data-view-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz", + "integrity": "sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==", "dev": true, "dependencies": { - "assert-plus": "^1.0.0" + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" }, "engines": { - "node": ">=0.10" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/data-view-byte-offset": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz", + "integrity": "sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.6.tgz", + "integrity": "sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==", "dependencies": { "ms": "2.1.2" }, @@ -3312,20 +2902,6 @@ } } }, - "node_modules/decompress-response": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", - "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", - "dependencies": { - "mimic-response": "^3.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/dedent": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.5.1.tgz", @@ -3375,12 +2951,30 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dev": true, + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/define-properties": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz", - "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", "dev": true, "dependencies": { + "define-data-property": "^1.0.1", "has-property-descriptors": "^1.0.0", "object-keys": "^1.1.1" }, @@ -3404,14 +2998,6 @@ "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==" }, - "node_modules/detect-libc": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.2.tgz", - "integrity": "sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw==", - "engines": { - "node": ">=8" - } - }, "node_modules/detect-newline": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", @@ -3452,62 +3038,31 @@ "node": ">=6.0.0" } }, - "node_modules/duplexer2": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.0.2.tgz", - "integrity": "sha512-+AWBwjGadtksxjOQSFDhPNQbed7icNXApT4+2BNpsXzcCBiInq2H9XW0O8sfHFaPmnQRs7cg/P0fAr2IWQSW0g==", - "dev": true, - "dependencies": { - "readable-stream": "~1.1.9" - } - }, - "node_modules/duplexer2/node_modules/readable-stream": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", - "integrity": "sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ==", - "dev": true, - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "node_modules/duplexer2/node_modules/string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==", - "dev": true - }, - "node_modules/each-series-async": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/each-series-async/-/each-series-async-1.0.1.tgz", - "integrity": "sha512-G4zip/Ewpwr6JQxW7+2RNgkPd09h/UNec5UlvA/xKwl4qf5blyBNK6a/zjQc3MojgsxaOb93B9v3T92QU6IMVg==", - "dev": true, - "engines": { - "node": ">=0.10.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 }, - "node_modules/ecc-jsbn": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==", + "node_modules/ejs": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz", + "integrity": "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==", "dev": true, "dependencies": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" + "jake": "^10.8.5" + }, + "bin": { + "ejs": "bin/cli.js" + }, + "engines": { + "node": ">=0.10.0" } }, "node_modules/electron-to-chromium": { - "version": "1.4.610", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.610.tgz", - "integrity": "sha512-mqi2oL1mfeHYtOdCxbPQYV/PL7YrQlxbvFEZ0Ee8GbDdShimqt2/S6z2RWqysuvlwdOrQdqvE0KZrBTipAeJzg==" + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.4.tgz", + "integrity": "sha512-orzA81VqLyIGUEA77YkVA1D+N+nNfl2isJVjjmOyrlxuooZ19ynb+dOlaDTqd/idKRS9lDCSBmtzM+kyCsMnkA==" }, "node_modules/emittery": { "version": "0.13.1", @@ -3526,28 +3081,10 @@ "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", "dev": true }, - "node_modules/encoding": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", - "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", - "dev": true, - "optional": true, - "dependencies": { - "iconv-lite": "^0.6.2" - } - }, - "node_modules/end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "dependencies": { - "once": "^1.4.0" - } - }, "node_modules/entities": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/entities/-/entities-3.0.1.tgz", - "integrity": "sha512-WiyBqoomrwMdFG1e0kqvASYfnlb0lp8M5o5Fw2OFq1hNZxxcNk8Ik0Xm7LxzBhuidnZB/UtBqVCgUz3kBOP51Q==", + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", "dev": true, "engines": { "node": ">=0.12" @@ -3560,16 +3097,21 @@ "version": "2.2.1", "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", - "dev": true, "engines": { "node": ">=6" } }, - "node_modules/err-code": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", - "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==", - "dev": true + "node_modules/environment": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/environment/-/environment-1.1.0.tgz", + "integrity": "sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==", + "dev": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, "node_modules/error-ex": { "version": "1.3.2", @@ -3580,50 +3122,57 @@ } }, "node_modules/es-abstract": { - "version": "1.22.1", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.1.tgz", - "integrity": "sha512-ioRRcXMO6OFyRpyzV3kE1IIBd4WG5/kltnzdxSCqoP8CMGs/Li+M1uF5o7lOkZVFjDs+NLesthnF66Pg/0q0Lw==", - "dev": true, - "dependencies": { - "array-buffer-byte-length": "^1.0.0", - "arraybuffer.prototype.slice": "^1.0.1", - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", - "es-set-tostringtag": "^2.0.1", + "version": "1.23.3", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.3.tgz", + "integrity": "sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==", + "dev": true, + "dependencies": { + "array-buffer-byte-length": "^1.0.1", + "arraybuffer.prototype.slice": "^1.0.3", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "data-view-buffer": "^1.0.1", + "data-view-byte-length": "^1.0.1", + "data-view-byte-offset": "^1.0.0", + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-set-tostringtag": "^2.0.3", "es-to-primitive": "^1.2.1", - "function.prototype.name": "^1.1.5", - "get-intrinsic": "^1.2.1", - "get-symbol-description": "^1.0.0", + "function.prototype.name": "^1.1.6", + "get-intrinsic": "^1.2.4", + "get-symbol-description": "^1.0.2", "globalthis": "^1.0.3", "gopd": "^1.0.1", - "has": "^1.0.3", - "has-property-descriptors": "^1.0.0", - "has-proto": "^1.0.1", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.0.3", "has-symbols": "^1.0.3", - "internal-slot": "^1.0.5", - "is-array-buffer": "^3.0.2", + "hasown": "^2.0.2", + "internal-slot": "^1.0.7", + "is-array-buffer": "^3.0.4", "is-callable": "^1.2.7", - "is-negative-zero": "^2.0.2", + "is-data-view": "^1.0.1", + "is-negative-zero": "^2.0.3", "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.2", + "is-shared-array-buffer": "^1.0.3", "is-string": "^1.0.7", - "is-typed-array": "^1.1.10", + "is-typed-array": "^1.1.13", "is-weakref": "^1.0.2", - "object-inspect": "^1.12.3", + "object-inspect": "^1.13.1", "object-keys": "^1.1.1", - "object.assign": "^4.1.4", - "regexp.prototype.flags": "^1.5.0", - "safe-array-concat": "^1.0.0", - "safe-regex-test": "^1.0.0", - "string.prototype.trim": "^1.2.7", - "string.prototype.trimend": "^1.0.6", - "string.prototype.trimstart": "^1.0.6", - "typed-array-buffer": "^1.0.0", - "typed-array-byte-length": "^1.0.0", - "typed-array-byte-offset": "^1.0.0", - "typed-array-length": "^1.0.4", + "object.assign": "^4.1.5", + "regexp.prototype.flags": "^1.5.2", + "safe-array-concat": "^1.1.2", + "safe-regex-test": "^1.0.3", + "string.prototype.trim": "^1.2.9", + "string.prototype.trimend": "^1.0.8", + "string.prototype.trimstart": "^1.0.8", + "typed-array-buffer": "^1.0.2", + "typed-array-byte-length": "^1.0.1", + "typed-array-byte-offset": "^1.0.2", + "typed-array-length": "^1.0.6", "unbox-primitive": "^1.0.2", - "which-typed-array": "^1.1.10" + "which-typed-array": "^1.1.15" }, "engines": { "node": ">= 0.4" @@ -3632,86 +3181,83 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/es-set-tostringtag": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz", - "integrity": "sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==", + "node_modules/es-define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", + "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", "dev": true, "dependencies": { - "get-intrinsic": "^1.1.3", - "has": "^1.0.3", - "has-tostringtag": "^1.0.0" + "get-intrinsic": "^1.2.4" }, "engines": { "node": ">= 0.4" } }, - "node_modules/es-shim-unscopables": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz", - "integrity": "sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==", + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", "dev": true, - "dependencies": { - "has": "^1.0.3" + "engines": { + "node": ">= 0.4" } }, - "node_modules/es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "node_modules/es-object-atoms": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz", + "integrity": "sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==", "dev": true, "dependencies": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" + "es-errors": "^1.3.0" }, "engines": { "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/es5-ext": { - "version": "0.10.62", - "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.62.tgz", - "integrity": "sha512-BHLqn0klhEpnOKSrzn/Xsz2UIW8j+cGmo9JLzr8BiUapV8hPL9+FliFqjwr9ngW7jWdnxv6eO+/LqyhJVqgrjA==", + "node_modules/es-set-tostringtag": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz", + "integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==", "dev": true, - "hasInstallScript": true, "dependencies": { - "es6-iterator": "^2.0.3", - "es6-symbol": "^3.1.3", - "next-tick": "^1.1.0" + "get-intrinsic": "^1.2.4", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.1" }, "engines": { - "node": ">=0.10" + "node": ">= 0.4" } }, - "node_modules/es6-iterator": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", - "integrity": "sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==", + "node_modules/es-shim-unscopables": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz", + "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==", "dev": true, "dependencies": { - "d": "1", - "es5-ext": "^0.10.35", - "es6-symbol": "^3.1.1" + "hasown": "^2.0.0" } }, - "node_modules/es6-symbol": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz", - "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==", + "node_modules/es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", "dev": true, "dependencies": { - "d": "^1.0.1", - "ext": "^1.1.2" + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", + "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", "engines": { "node": ">=6" } @@ -3729,16 +3275,16 @@ } }, "node_modules/eslint": { - "version": "8.56.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.56.0.tgz", - "integrity": "sha512-Go19xM6T9puCOWntie1/P997aXxFsOi37JIHRWI514Hc6ZnaHGKY9xFhrU65RT6CcBEzZoGG1e6Nq+DT04ZtZQ==", + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz", + "integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", "@eslint/eslintrc": "^2.1.4", - "@eslint/js": "8.56.0", - "@humanwhocodes/config-array": "^0.11.13", + "@eslint/js": "8.57.0", + "@humanwhocodes/config-array": "^0.11.14", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", "@ungap/structured-clone": "^1.2.0", @@ -3816,9 +3362,9 @@ } }, "node_modules/eslint-module-utils": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.0.tgz", - "integrity": "sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==", + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.11.0.tgz", + "integrity": "sha512-gbBE5Hitek/oG6MUVj6sFuzEjA/ClzNflVrLovHi/JgLdC7fiN5gLAY1WIPW1a0V5I999MnsrvVrCOGmmVqDBQ==", "dev": true, "dependencies": { "debug": "^3.2.7" @@ -3851,26 +3397,27 @@ } }, "node_modules/eslint-plugin-import": { - "version": "2.29.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.29.1.tgz", - "integrity": "sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==", + "version": "2.30.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.30.0.tgz", + "integrity": "sha512-/mHNE9jINJfiD2EKkg1BKyPyUk4zdnT54YgbOgfjSakWT5oyX/qQLVNTkehyfpcMxZXMy1zyonZ2v7hZTX43Yw==", "dev": true, "dependencies": { - "array-includes": "^3.1.7", - "array.prototype.findlastindex": "^1.2.3", + "@rtsao/scc": "^1.1.0", + "array-includes": "^3.1.8", + "array.prototype.findlastindex": "^1.2.5", "array.prototype.flat": "^1.3.2", "array.prototype.flatmap": "^1.3.2", "debug": "^3.2.7", "doctrine": "^2.1.0", "eslint-import-resolver-node": "^0.3.9", - "eslint-module-utils": "^2.8.0", - "hasown": "^2.0.0", - "is-core-module": "^2.13.1", + "eslint-module-utils": "^2.9.0", + "hasown": "^2.0.2", + "is-core-module": "^2.15.1", "is-glob": "^4.0.3", "minimatch": "^3.1.2", - "object.fromentries": "^2.0.7", - "object.groupby": "^1.0.1", - "object.values": "^1.1.7", + "object.fromentries": "^2.0.8", + "object.groupby": "^1.0.3", + "object.values": "^1.2.0", "semver": "^6.3.1", "tsconfig-paths": "^3.15.0" }, @@ -3912,9 +3459,9 @@ } }, "node_modules/eslint-plugin-jest": { - "version": "27.6.3", - "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-27.6.3.tgz", - "integrity": "sha512-+YsJFVH6R+tOiO3gCJon5oqn4KWc+mDq2leudk8mrp8RFubLOo9CVyi3cib4L7XMpxExmkmBZQTPDYVBzgpgOA==", + "version": "27.9.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-27.9.0.tgz", + "integrity": "sha512-QIT7FH7fNmd9n4se7FFKHbsLKGQiw885Ds6Y/sxKgCZ6natwCsXdgPOADnYVxN2QrRweF0FZWbJ6S7Rsn7llug==", "dev": true, "dependencies": { "@typescript-eslint/utils": "^5.10.0" @@ -3923,7 +3470,7 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" }, "peerDependencies": { - "@typescript-eslint/eslint-plugin": "^5.0.0 || ^6.0.0", + "@typescript-eslint/eslint-plugin": "^5.0.0 || ^6.0.0 || ^7.0.0", "eslint": "^7.0.0 || ^8.0.0", "jest": "*" }, @@ -3937,12 +3484,12 @@ } }, "node_modules/eslint-plugin-markdownlint": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-markdownlint/-/eslint-plugin-markdownlint-0.5.0.tgz", - "integrity": "sha512-1wkjRz9hNgdM6kLLaxnFxfWf5e/y8lFjptN9aGj3Jfa8o3dC0lYgEkHOHWDEkuMBKYlHGShJlvIsaUs0JIFg5g==", + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-markdownlint/-/eslint-plugin-markdownlint-0.6.0.tgz", + "integrity": "sha512-idYAzR2k7tQ+zL6UC17I/zzkqM0t6/k50uGgO39tabryqVkJh8Qe57fhBhe7QN+17yqIVqFB9YJFzBCAOdSXjw==", "dev": true, "dependencies": { - "markdownlint": "0.29.0" + "markdownlint": "0.34.0" }, "engines": { "node": ">=10" @@ -4090,30 +3637,12 @@ "node": ">=0.10.0" } }, - "node_modules/event-target-shim": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", - "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/eventemitter3": { + "node_modules/eventemitter3": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==", "dev": true }, - "node_modules/events": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", - "dev": true, - "engines": { - "node": ">=0.8.x" - } - }, "node_modules/execa": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", @@ -4136,15 +3665,6 @@ "url": "https://github.com/sindresorhus/execa?sponsor=1" } }, - "node_modules/execspawn": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/execspawn/-/execspawn-1.0.1.tgz", - "integrity": "sha512-s2k06Jy9i8CUkYe0+DxRlvtkZoOkwwfhB+Xxo5HGUtrISVW2m98jO2tr67DGRFxZwkjQqloA3v/tNtjhBRBieg==", - "dev": true, - "dependencies": { - "util-extend": "^1.0.1" - } - }, "node_modules/exit": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", @@ -4153,14 +3673,6 @@ "node": ">= 0.8.0" } }, - "node_modules/expand-template": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", - "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==", - "engines": { - "node": ">=6" - } - }, "node_modules/expect": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz", @@ -4176,54 +3688,12 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/exponential-backoff": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.1.tgz", - "integrity": "sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw==", - "dev": true - }, - "node_modules/ext": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/ext/-/ext-1.7.0.tgz", - "integrity": "sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==", - "dev": true, - "dependencies": { - "type": "^2.7.2" - } - }, - "node_modules/ext/node_modules/type": { - "version": "2.7.2", - "resolved": "https://registry.npmjs.org/type/-/type-2.7.2.tgz", - "integrity": "sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==", - "dev": true - }, - "node_modules/extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", - "dev": true - }, - "node_modules/extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==", - "dev": true, - "engines": [ - "node >=0.6.0" - ] - }, "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", "dev": true }, - "node_modules/fast-fifo": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz", - "integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==", - "dev": true - }, "node_modules/fast-glob": { "version": "3.2.12", "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", @@ -4297,10 +3767,40 @@ "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==" }, + "node_modules/filelist": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", + "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", + "dev": true, + "dependencies": { + "minimatch": "^5.0.1" + } + }, + "node_modules/filelist/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/filelist/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", "dependencies": { "to-regex-range": "^5.0.1" }, @@ -4359,9 +3859,9 @@ "dev": true }, "node_modules/follow-redirects": { - "version": "1.15.5", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.5.tgz", - "integrity": "sha512-vSFWUON1B+yAw1VN4xMfxgn5fTUiaOzAJCKBwIIgT/+7CuGy9+r+5gITvP62j3RmaD5Ph65UaERdOSRGUzZtgw==", + "version": "1.15.6", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", + "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==", "funding": [ { "type": "individual", @@ -4414,15 +3914,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==", - "dev": true, - "engines": { - "node": "*" - } - }, "node_modules/form-data": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", @@ -4436,11 +3927,6 @@ "node": ">= 6" } }, - "node_modules/fs-constants": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", - "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" - }, "node_modules/fs-extra": { "version": "11.2.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", @@ -4465,6 +3951,17 @@ "node": ">= 8" } }, + "node_modules/fs-minipass/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", @@ -4483,33 +3980,6 @@ "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } }, - "node_modules/fstream": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.12.tgz", - "integrity": "sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.1.2", - "inherits": "~2.0.0", - "mkdirp": ">=0.5 0", - "rimraf": "2" - }, - "engines": { - "node": ">=0.6" - } - }, - "node_modules/fstream/node_modules/rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - } - }, "node_modules/function-bind": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", @@ -4618,15 +4088,19 @@ } }, "node_modules/get-intrinsic": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", - "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", + "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", "dev": true, "dependencies": { - "function-bind": "^1.1.1", - "has": "^1.0.3", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", "has-proto": "^1.0.1", - "has-symbols": "^1.0.3" + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -4652,13 +4126,14 @@ } }, "node_modules/get-symbol-description": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", - "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz", + "integrity": "sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" + "call-bind": "^1.0.5", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4" }, "engines": { "node": ">= 0.4" @@ -4667,56 +4142,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==", - "dev": true, - "dependencies": { - "assert-plus": "^1.0.0" - } - }, - "node_modules/ghreleases": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/ghreleases/-/ghreleases-3.0.2.tgz", - "integrity": "sha512-QiR9mIYvRG7hd8JuQYoxeBNOelVuTp2DpdiByRywbCDBSJufK9Vq7VuhD8B+5uviMxZx2AEkCzye61Us9gYgnw==", - "dev": true, - "dependencies": { - "after": "~0.8.1", - "ghrepos": "~2.1.0", - "ghutils": "~3.2.0", - "lodash.uniq": "^4.5.0", - "simple-mime": "~0.1.0", - "url-template": "~2.0.6" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/ghrepos": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/ghrepos/-/ghrepos-2.1.0.tgz", - "integrity": "sha512-6GM0ohSDTAv7xD6GsKfxJiV/CajoofRyUwu0E8l29d1o6lFAUxmmyMP/FH33afA20ZrXzxxcTtN6TsYvudMoAg==", - "dev": true, - "dependencies": { - "ghutils": "~3.2.0" - } - }, - "node_modules/ghutils": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/ghutils/-/ghutils-3.2.6.tgz", - "integrity": "sha512-WpYHgLQkqU7Cv147wKUEThyj6qKHCdnAG2CL9RRsRQImVdLGdVqblJ3JUnj3ToQwgm1ALPS+FXgR0448AgGPUg==", - "dev": true, - "dependencies": { - "jsonist": "~2.1.0", - "xtend": "~4.0.1" - } - }, - "node_modules/github-from-package": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", - "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==" - }, "node_modules/glob": { "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", @@ -4821,41 +4246,6 @@ "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", "dev": true }, - "node_modules/har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/har-validator": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", - "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", - "deprecated": "this library is no longer supported", - "dev": true, - "dependencies": { - "ajv": "^6.12.3", - "har-schema": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.1" - }, - "engines": { - "node": ">= 0.4.0" - } - }, "node_modules/has-bigints": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", @@ -4874,21 +4264,21 @@ } }, "node_modules/has-property-descriptors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", - "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", "dev": true, "dependencies": { - "get-intrinsic": "^1.1.1" + "es-define-property": "^1.0.0" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/has-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", - "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", + "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", "dev": true, "engines": { "node": ">= 0.4" @@ -4910,12 +4300,12 @@ } }, "node_modules/has-tostringtag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", - "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", "dev": true, "dependencies": { - "has-symbols": "^1.0.2" + "has-symbols": "^1.0.3" }, "engines": { "node": ">= 0.4" @@ -4930,9 +4320,9 @@ "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==" }, "node_modules/hasown": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", - "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", "dependencies": { "function-bind": "^1.1.2" }, @@ -4945,54 +4335,6 @@ "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==" }, - "node_modules/http-cache-semantics": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", - "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==", - "dev": true - }, - "node_modules/http-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", - "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", - "dev": true, - "dependencies": { - "@tootallnate/once": "2", - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==", - "dev": true, - "dependencies": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" - }, - "engines": { - "node": ">=0.8", - "npm": ">=1.3.7" - } - }, - "node_modules/https-proxy-agent": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", - "dev": true, - "dependencies": { - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/human-signals": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", @@ -5001,79 +4343,21 @@ "node": ">=10.17.0" } }, - "node_modules/humanize-ms": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", - "integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==", - "dev": true, - "dependencies": { - "ms": "^2.0.0" - } - }, "node_modules/husky": { - "version": "8.0.3", - "resolved": "https://registry.npmjs.org/husky/-/husky-8.0.3.tgz", - "integrity": "sha512-+dQSyqPh4x1hlO1swXBiNb2HzTDN1I2IGLQx1GrBuiqFJfoMrnZWwVmatvSiO+Iz8fBUnf+lekwNo4c2LlXItg==", + "version": "9.1.6", + "resolved": "https://registry.npmjs.org/husky/-/husky-9.1.6.tgz", + "integrity": "sha512-sqbjZKK7kf44hfdE94EoX8MZNk0n7HeW37O4YrVGCF4wzgQjp+akPAkfUK5LZ6KuR/6sqeAVuXHji+RzQgOn5A==", "dev": true, "bin": { - "husky": "lib/bin.js" + "husky": "bin.js" }, "engines": { - "node": ">=14" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/typicode" } }, - "node_modules/hyperquest": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/hyperquest/-/hyperquest-2.1.3.tgz", - "integrity": "sha512-fUuDOrB47PqNK/BAMOS13v41UoaqIxqSLHX6CAbOD7OfT+/GCWO1/vPLfTNutOeXrv1ikuaZ3yux+33Z9vh+rw==", - "dev": true, - "dependencies": { - "buffer-from": "^0.1.1", - "duplexer2": "~0.0.2", - "through2": "~0.6.3" - } - }, - "node_modules/hyperquest/node_modules/buffer-from": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-0.1.2.tgz", - "integrity": "sha512-RiWIenusJsmI2KcvqQABB83tLxCByE3upSP8QU3rJDMVFGPWLvPQJt/O1Su9moRWeH7d+Q2HYb68f6+v+tw2vg==", - "dev": true - }, - "node_modules/iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "dev": true, - "optional": true, - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, "node_modules/ignore": { "version": "5.2.4", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", @@ -5124,15 +4408,6 @@ "node": ">=0.8.19" } }, - "node_modules/indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", @@ -5153,34 +4428,30 @@ "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" }, "node_modules/internal-slot": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz", - "integrity": "sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz", + "integrity": "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==", "dev": true, "dependencies": { - "get-intrinsic": "^1.2.0", - "has": "^1.0.3", + "es-errors": "^1.3.0", + "hasown": "^2.0.0", "side-channel": "^1.0.4" }, "engines": { "node": ">= 0.4" } }, - "node_modules/ip": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz", - "integrity": "sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==", - "dev": true - }, "node_modules/is-array-buffer": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", - "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz", + "integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.0", - "is-typed-array": "^1.1.10" + "get-intrinsic": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -5232,11 +4503,29 @@ } }, "node_modules/is-core-module": { - "version": "2.13.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", - "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", + "version": "2.15.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.1.tgz", + "integrity": "sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==", "dependencies": { - "hasown": "^2.0.0" + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-data-view": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.1.tgz", + "integrity": "sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==", + "dev": true, + "dependencies": { + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -5298,16 +4587,10 @@ "node": ">=0.10.0" } }, - "node_modules/is-lambda": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz", - "integrity": "sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==", - "dev": true - }, "node_modules/is-negative-zero": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", - "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", + "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", "dev": true, "engines": { "node": ">= 0.4" @@ -5365,12 +4648,15 @@ } }, "node_modules/is-shared-array-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", - "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz", + "integrity": "sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==", "dev": true, "dependencies": { - "call-bind": "^1.0.2" + "call-bind": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -5418,12 +4704,12 @@ } }, "node_modules/is-typed-array": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.12.tgz", - "integrity": "sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==", + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz", + "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==", "dev": true, "dependencies": { - "which-typed-array": "^1.1.11" + "which-typed-array": "^1.1.14" }, "engines": { "node": ">= 0.4" @@ -5432,12 +4718,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", - "dev": true - }, "node_modules/is-weakref": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", @@ -5451,9 +4731,9 @@ } }, "node_modules/isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", "dev": true }, "node_modules/isexe": { @@ -5461,12 +4741,6 @@ "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" }, - "node_modules/isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==", - "dev": true - }, "node_modules/istanbul-lib-coverage": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", @@ -5487,13 +4761,13 @@ } }, "node_modules/istanbul-lib-instrument": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.1.tgz", - "integrity": "sha512-EAMEJBsYuyyztxMxW3g7ugGPkrZsV57v0Hmv3mm1uQsmB+QnZuepg731CRaIgeUVSdmsTngOkSnauNF8p7FIhA==", + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.3.tgz", + "integrity": "sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==", "dependencies": { - "@babel/core": "^7.12.3", - "@babel/parser": "^7.14.7", - "@istanbuljs/schema": "^0.1.2", + "@babel/core": "^7.23.9", + "@babel/parser": "^7.23.9", + "@istanbuljs/schema": "^0.1.3", "istanbul-lib-coverage": "^3.2.0", "semver": "^7.5.4" }, @@ -5528,9 +4802,9 @@ } }, "node_modules/istanbul-reports": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.6.tgz", - "integrity": "sha512-TLgnMkKg3iTDsQ9PbPTdpfAK2DzjF9mqUG7RMgcQl8oFjad8ob4laGxv5XV5U9MAfx8D6tSJiUyuAwzLicaxlg==", + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.7.tgz", + "integrity": "sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==", "dependencies": { "html-escaper": "^2.0.0", "istanbul-lib-report": "^3.0.0" @@ -5557,6 +4831,24 @@ "@pkgjs/parseargs": "^0.11.0" } }, + "node_modules/jake": { + "version": "10.9.1", + "resolved": "https://registry.npmjs.org/jake/-/jake-10.9.1.tgz", + "integrity": "sha512-61btcOHNnLnsOdtLgA5efqQWjnSi/vow5HbI7HMdKKWqvrKR1bLK3BPlJn9gcSaP2ewuamUSMB5XEy76KUIS2w==", + "dev": true, + "dependencies": { + "async": "^3.2.3", + "chalk": "^4.0.2", + "filelist": "^1.0.4", + "minimatch": "^3.1.2" + }, + "bin": { + "jake": "bin/cli.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/jest": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest/-/jest-29.7.0.tgz", @@ -6100,12 +5392,6 @@ "js-yaml": "bin/js-yaml.js" } }, - "node_modules/jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==", - "dev": true - }, "node_modules/jsesc": { "version": "2.5.2", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", @@ -6122,12 +5408,6 @@ "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" }, - "node_modules/json-schema": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", - "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", - "dev": true - }, "node_modules/json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", @@ -6140,12 +5420,6 @@ "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", "dev": true }, - "node_modules/json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", - "dev": true - }, "node_modules/json5": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", @@ -6168,33 +5442,6 @@ "graceful-fs": "^4.1.6" } }, - "node_modules/jsonist": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/jsonist/-/jsonist-2.1.2.tgz", - "integrity": "sha512-8yqmWJAC2VaYoSKQAbsfgCpGY5o/1etWzx6ZxaZrC4iGaHrHUZEo+a2MyF8w+2uTavTlHdLWaZUoR19UfBstxQ==", - "dev": true, - "dependencies": { - "bl": "~3.0.0", - "hyperquest": "~2.1.3", - "json-stringify-safe": "~5.0.1", - "xtend": "~4.0.1" - } - }, - "node_modules/jsprim": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", - "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", - "dev": true, - "dependencies": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.4.0", - "verror": "1.10.0" - }, - "engines": { - "node": ">=0.6.0" - } - }, "node_modules/kleur": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", @@ -6225,12 +5472,15 @@ } }, "node_modules/lilconfig": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.0.0.tgz", - "integrity": "sha512-K2U4W2Ff5ibV7j7ydLr+zLAkIg5JJ4lPn1Ltsdt+Tz/IjQ8buJ55pZAxoP34lqIiwtF9iAvtLv3JGv7CAyAg+g==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.2.tgz", + "integrity": "sha512-eop+wDAvpItUys0FWkHIKeC9ybYrTGbU41U5K7+bttZZeohvnY7M9dZ5kB21GNWiFT2q1OoPTvncPCgSOVO5ow==", "dev": true, "engines": { "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antonk52" } }, "node_modules/lines-and-columns": { @@ -6239,30 +5489,30 @@ "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" }, "node_modules/linkify-it": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-4.0.1.tgz", - "integrity": "sha512-C7bfi1UZmoj8+PQx22XyeXCuBlokoyWQL5pWSP+EI6nzRylyThouddufc2c1NDIcP9k5agmN9fLpA7VNJfIiqw==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-5.0.0.tgz", + "integrity": "sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==", "dev": true, "dependencies": { - "uc.micro": "^1.0.1" + "uc.micro": "^2.0.0" } }, "node_modules/lint-staged": { - "version": "15.2.2", - "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-15.2.2.tgz", - "integrity": "sha512-TiTt93OPh1OZOsb5B7k96A/ATl2AjIZo+vnzFZ6oHK5FuTk63ByDtxGQpHm+kFETjEWqgkF95M8FRXKR/LEBcw==", - "dev": true, - "dependencies": { - "chalk": "5.3.0", - "commander": "11.1.0", - "debug": "4.3.4", - "execa": "8.0.1", - "lilconfig": "3.0.0", - "listr2": "8.0.1", - "micromatch": "4.0.5", - "pidtree": "0.6.0", - "string-argv": "0.3.2", - "yaml": "2.3.4" + "version": "15.2.10", + "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-15.2.10.tgz", + "integrity": "sha512-5dY5t743e1byO19P9I4b3x8HJwalIznL5E1FWYnU6OWw33KxNBSLAc6Cy7F2PsFEO8FKnLwjwm5hx7aMF0jzZg==", + "dev": true, + "dependencies": { + "chalk": "~5.3.0", + "commander": "~12.1.0", + "debug": "~4.3.6", + "execa": "~8.0.1", + "lilconfig": "~3.1.2", + "listr2": "~8.2.4", + "micromatch": "~4.0.8", + "pidtree": "~0.6.0", + "string-argv": "~0.3.2", + "yaml": "~2.5.0" }, "bin": { "lint-staged": "bin/lint-staged.js" @@ -6421,16 +5671,16 @@ } }, "node_modules/listr2": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/listr2/-/listr2-8.0.1.tgz", - "integrity": "sha512-ovJXBXkKGfq+CwmKTjluEqFi3p4h8xvkxGQQAQan22YCgef4KZ1mKGjzfGh6PL6AW5Csw0QiQPNuQyH+6Xk3hA==", + "version": "8.2.4", + "resolved": "https://registry.npmjs.org/listr2/-/listr2-8.2.4.tgz", + "integrity": "sha512-opevsywziHd3zHCVQGAj8zu+Z3yHNkkoYhWIGnq54RrCVwLz0MozotJEDnKsIBLvkfLGN6BLOyAeRrYI0pKA4g==", "dev": true, "dependencies": { "cli-truncate": "^4.0.0", "colorette": "^2.0.20", "eventemitter3": "^5.0.1", - "log-update": "^6.0.0", - "rfdc": "^1.3.0", + "log-update": "^6.1.0", + "rfdc": "^1.4.1", "wrap-ansi": "^9.0.0" }, "engines": { @@ -6468,9 +5718,9 @@ "dev": true }, "node_modules/listr2/node_modules/string-width": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.1.0.tgz", - "integrity": "sha512-SEIJCWiX7Kg4c129n48aDRwLbFb2LJmXXFrWBG4NGaRtMQ3myKPKbwrD1BKqQn74oCoNMBVrfDEr5M9YxCsrkw==", + "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, "dependencies": { "emoji-regex": "^10.3.0", @@ -6548,39 +5798,15 @@ "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", "dev": true }, - "node_modules/lodash.pad": { - "version": "4.5.1", - "resolved": "https://registry.npmjs.org/lodash.pad/-/lodash.pad-4.5.1.tgz", - "integrity": "sha512-mvUHifnLqM+03YNzeTBS1/Gr6JRFjd3rRx88FHWUvamVaT9k2O/kXha3yBSOwB9/DTQrSTLJNHvLBBt2FdX7Mg==", - "dev": true - }, - "node_modules/lodash.padend": { - "version": "4.6.1", - "resolved": "https://registry.npmjs.org/lodash.padend/-/lodash.padend-4.6.1.tgz", - "integrity": "sha512-sOQs2aqGpbl27tmCS1QNZA09Uqp01ZzWfDUoD+xzTii0E7dSQfRKcRetFwa+uXaxaqL+TKm7CgD2JdKP7aZBSw==", - "dev": true - }, - "node_modules/lodash.padstart": { - "version": "4.6.1", - "resolved": "https://registry.npmjs.org/lodash.padstart/-/lodash.padstart-4.6.1.tgz", - "integrity": "sha512-sW73O6S8+Tg66eY56DBk85aQzzUJDtpoXFBgELMd5P/SotAguo+1kYO6RuYgXxA4HJH3LFTFPASX6ET6bjfriw==", - "dev": true - }, - "node_modules/lodash.uniq": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", - "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==", - "dev": true - }, "node_modules/log-update": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/log-update/-/log-update-6.0.0.tgz", - "integrity": "sha512-niTvB4gqvtof056rRIrTZvjNYE4rCUzO6X/X+kYjd7WFxXeJ0NwEFnRxX6ehkvv3jTwrXnNdtAak5XYZuIyPFw==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/log-update/-/log-update-6.1.0.tgz", + "integrity": "sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w==", "dev": true, "dependencies": { - "ansi-escapes": "^6.2.0", - "cli-cursor": "^4.0.0", - "slice-ansi": "^7.0.0", + "ansi-escapes": "^7.0.0", + "cli-cursor": "^5.0.0", + "slice-ansi": "^7.1.0", "strip-ansi": "^7.1.0", "wrap-ansi": "^9.0.0" }, @@ -6592,15 +5818,15 @@ } }, "node_modules/log-update/node_modules/ansi-escapes": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-6.2.0.tgz", - "integrity": "sha512-kzRaCqXnpzWs+3z5ABPQiVke+iq0KXkHo8xiWV4RPTi5Yli0l97BEQuhXV1s7+aSU/fu1kUuxgS4MsQ0fRuygw==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-7.0.0.tgz", + "integrity": "sha512-GdYO7a61mR0fOlAsvC9/rIHf7L96sBc6dEWzeOu+KAea5bZyQRPIpojrVoI4AXGJS/ycu/fBTdLrUkA4ODrvjw==", "dev": true, "dependencies": { - "type-fest": "^3.0.0" + "environment": "^1.0.0" }, "engines": { - "node": ">=14.16" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -6668,9 +5894,9 @@ } }, "node_modules/log-update/node_modules/string-width": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.1.0.tgz", - "integrity": "sha512-SEIJCWiX7Kg4c129n48aDRwLbFb2LJmXXFrWBG4NGaRtMQ3myKPKbwrD1BKqQn74oCoNMBVrfDEr5M9YxCsrkw==", + "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, "dependencies": { "emoji-regex": "^10.3.0", @@ -6699,18 +5925,6 @@ "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, - "node_modules/log-update/node_modules/type-fest": { - "version": "3.13.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-3.13.1.tgz", - "integrity": "sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g==", - "dev": true, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/log-update/node_modules/wrap-ansi": { "version": "9.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.0.tgz", @@ -6728,17 +5942,6 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/make-dir": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", @@ -6759,50 +5962,6 @@ "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", "dev": true }, - "node_modules/make-fetch-happen": { - "version": "11.1.1", - "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-11.1.1.tgz", - "integrity": "sha512-rLWS7GCSTcEujjVBs2YqG7Y4643u8ucvCJeSRqiLYhesrDuzeuFIk37xREzAsfQaqzl8b9rNCE4m6J8tvX4Q8w==", - "dev": true, - "dependencies": { - "agentkeepalive": "^4.2.1", - "cacache": "^17.0.0", - "http-cache-semantics": "^4.1.1", - "http-proxy-agent": "^5.0.0", - "https-proxy-agent": "^5.0.0", - "is-lambda": "^1.0.1", - "lru-cache": "^7.7.1", - "minipass": "^5.0.0", - "minipass-fetch": "^3.0.0", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "negotiator": "^0.6.3", - "promise-retry": "^2.0.1", - "socks-proxy-agent": "^7.0.0", - "ssri": "^10.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/make-fetch-happen/node_modules/lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", - "dev": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/make-fetch-happen/node_modules/minipass": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", - "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/makeerror": { "version": "1.0.12", "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", @@ -6812,47 +5971,54 @@ } }, "node_modules/markdown-it": { - "version": "13.0.1", - "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-13.0.1.tgz", - "integrity": "sha512-lTlxriVoy2criHP0JKRhO2VDG9c2ypWCsT237eDiLqi09rmbKoUetyGHq2uOIRoRS//kfoJckS0eUzzkDR+k2Q==", + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-14.1.0.tgz", + "integrity": "sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==", "dev": true, "dependencies": { "argparse": "^2.0.1", - "entities": "~3.0.1", - "linkify-it": "^4.0.1", - "mdurl": "^1.0.1", - "uc.micro": "^1.0.5" + "entities": "^4.4.0", + "linkify-it": "^5.0.0", + "mdurl": "^2.0.0", + "punycode.js": "^2.3.1", + "uc.micro": "^2.1.0" }, "bin": { - "markdown-it": "bin/markdown-it.js" + "markdown-it": "bin/markdown-it.mjs" } }, "node_modules/markdownlint": { - "version": "0.29.0", - "resolved": "https://registry.npmjs.org/markdownlint/-/markdownlint-0.29.0.tgz", - "integrity": "sha512-ASAzqpODstu/Qsk0xW5BPgWnK/qjpBQ4e7IpsSvvFXcfYIjanLTdwFRJK1SIEEh0fGSMKXcJf/qhaZYHyME0wA==", + "version": "0.34.0", + "resolved": "https://registry.npmjs.org/markdownlint/-/markdownlint-0.34.0.tgz", + "integrity": "sha512-qwGyuyKwjkEMOJ10XN6OTKNOVYvOIi35RNvDLNxTof5s8UmyGHlCdpngRHoRGNvQVGuxO3BJ7uNSgdeX166WXw==", "dev": true, "dependencies": { - "markdown-it": "13.0.1", - "markdownlint-micromark": "0.1.5" + "markdown-it": "14.1.0", + "markdownlint-micromark": "0.1.9" }, "engines": { - "node": ">=16" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/DavidAnson" } }, "node_modules/markdownlint-micromark": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/markdownlint-micromark/-/markdownlint-micromark-0.1.5.tgz", - "integrity": "sha512-HvofNU4QCvfUCWnocQP1IAWaqop5wpWrB0mKB6SSh0fcpV0PdmQNS6tdUuFew1utpYlUvYYzz84oDkrD76GB9A==", + "version": "0.1.9", + "resolved": "https://registry.npmjs.org/markdownlint-micromark/-/markdownlint-micromark-0.1.9.tgz", + "integrity": "sha512-5hVs/DzAFa8XqYosbEAEg6ok6MF2smDj89ztn9pKkCtdKHVdPQuGMH7frFfYL9mLkvfFe4pTyAMffLbjf3/EyA==", "dev": true, "engines": { - "node": ">=16" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/DavidAnson" } }, "node_modules/mdurl": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", - "integrity": "sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-2.0.0.tgz", + "integrity": "sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==", "dev": true }, "node_modules/memory-stream": { @@ -6878,11 +6044,11 @@ } }, "node_modules/micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", "dependencies": { - "braces": "^3.0.2", + "braces": "^3.0.3", "picomatch": "^2.3.1" }, "engines": { @@ -6916,12 +6082,13 @@ "node": ">=6" } }, - "node_modules/mimic-response": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", - "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", + "node_modules/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, "engines": { - "node": ">=10" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -6947,86 +6114,9 @@ } }, "node_modules/minipass": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.4.tgz", - "integrity": "sha512-I9WPbWHCGu8W+6k1ZiGpPu0GkoKBeorkfKNuAFBNS1HNFJvke82sxvI5bzcCNpWPorkOO5QQ+zomzzwRxejXiw==", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/minipass-collect": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", - "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", - "dev": true, - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/minipass-fetch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-3.0.4.tgz", - "integrity": "sha512-jHAqnA728uUpIaFm7NWsCnqKT6UqZz7GcI/bDpPATuwYyKwJwW0remxSCxUlKiEty+eopHGa3oc8WxgQ1FFJqg==", - "dev": true, - "dependencies": { - "minipass": "^7.0.3", - "minipass-sized": "^1.0.3", - "minizlib": "^2.1.2" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - }, - "optionalDependencies": { - "encoding": "^0.1.13" - } - }, - "node_modules/minipass-fetch/node_modules/minipass": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", - "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", - "dev": true, - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/minipass-flush": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", - "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", - "dev": true, - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/minipass-pipeline": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", - "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", - "dev": true, - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/minipass-sized": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz", - "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==", - "dev": true, - "dependencies": { - "minipass": "^3.0.0" - }, + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", "engines": { "node": ">=8" } @@ -7043,64 +6133,38 @@ "node": ">= 8" } }, - "node_modules/mkdirp": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", - "dev": true, + "node_modules/minizlib/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", "dependencies": { - "minimist": "^1.2.6" + "yallist": "^4.0.0" }, + "engines": { + "node": ">=8" + } + }, + "node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", "bin": { "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" } }, - "node_modules/mkdirp-classic": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", - "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==" - }, "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==" }, - "node_modules/napi-build-utils": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz", - "integrity": "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==" - }, "node_modules/natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==" }, - "node_modules/negotiator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/next-tick": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz", - "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==", - "dev": true - }, - "node_modules/node-abi": { - "version": "3.47.0", - "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.47.0.tgz", - "integrity": "sha512-2s6B2CWZM//kPgwnuI0KrYwNjfdByE25zvAaEpq9IH4zcNsarH8Ihu/UuX6XMPEogDAxkuUFeZn60pXNHAqn3A==", - "dependencies": { - "semver": "^7.3.5" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/node-addon-api": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.0.tgz", @@ -7114,265 +6178,22 @@ "resolved": "https://registry.npmjs.org/node-api-headers/-/node-api-headers-1.1.0.tgz", "integrity": "sha512-ucQW+SbYCUPfprvmzBsnjT034IGRB2XK8rRc78BgjNKhTdFKgAwAmgW704bKIBmcYW48it0Gkjpkd39Azrwquw==" }, - "node_modules/node-gyp": { - "version": "9.4.0", - "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-9.4.0.tgz", - "integrity": "sha512-dMXsYP6gc9rRbejLXmTbVRYjAHw7ppswsKyMxuxJxxOHzluIO1rGp9TOQgjFJ+2MCqcOcQTOPB/8Xwhr+7s4Eg==", - "dev": true, - "dependencies": { - "env-paths": "^2.2.0", - "exponential-backoff": "^3.1.1", - "glob": "^7.1.4", - "graceful-fs": "^4.2.6", - "make-fetch-happen": "^11.0.3", - "nopt": "^6.0.0", - "npmlog": "^6.0.0", - "rimraf": "^3.0.2", - "semver": "^7.3.5", - "tar": "^6.1.2", - "which": "^2.0.2" - }, - "bin": { - "node-gyp": "bin/node-gyp.js" - }, - "engines": { - "node": "^12.13 || ^14.13 || >=16" - } - }, - "node_modules/node-gyp/node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/node-int64": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==" }, - "node_modules/node-ninja": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/node-ninja/-/node-ninja-1.0.2.tgz", - "integrity": "sha512-wMtWsG2QZI1Z5V7GciX9OI2DVT0PuDRIDQfe3L3rJsQ1qN1Gm3QQhoNtb4PMRi7gq4ByvEIYtPwHC7YbEf5yxw==", - "dev": true, - "dependencies": { - "fstream": "^1.0.0", - "glob": "3 || 4 || 5 || 6 || 7", - "graceful-fs": "^4.1.2", - "minimatch": "3", - "mkdirp": "^0.5.0", - "nopt": "2 || 3", - "npmlog": "0 || 1 || 2", - "osenv": "0", - "path-array": "^1.0.0", - "request": "2", - "rimraf": "2", - "semver": "2.x || 3.x || 4 || 5", - "tar": "^2.0.0", - "which": "1" - }, - "bin": { - "node-ninja": "bin/node-ninja.js" - }, + "node_modules/node-releases": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz", + "integrity": "sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==" + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/node-ninja/node_modules/are-we-there-yet": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.7.tgz", - "integrity": "sha512-nxwy40TuMiUGqMyRHgCSWZ9FM4VAoRP4xUYSTv5ImRog+h9yISPbVH7H8fASCIzYn9wlEv4zvFL7uKDMCFQm3g==", - "dev": true, - "dependencies": { - "delegates": "^1.0.0", - "readable-stream": "^2.0.6" - } - }, - "node_modules/node-ninja/node_modules/gauge": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-1.2.7.tgz", - "integrity": "sha512-fVbU2wRE91yDvKUnrIaQlHKAWKY5e08PmztCrwuH5YVQ+Z/p3d0ny2T48o6uvAAXHIUnfaQdHkmxYbQft1eHVA==", - "dev": true, - "dependencies": { - "ansi": "^0.3.0", - "has-unicode": "^2.0.0", - "lodash.pad": "^4.1.0", - "lodash.padend": "^4.1.0", - "lodash.padstart": "^4.1.0" - } - }, - "node_modules/node-ninja/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "dev": true - }, - "node_modules/node-ninja/node_modules/nopt": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", - "integrity": "sha512-4GUt3kSEYmk4ITxzB/b9vaIDfUVWN/Ml1Fwl11IlnIG2iaJ9O6WXZ9SrYM9NLI8OCBieN2Y8SWC2oJV0RQ7qYg==", - "dev": true, - "dependencies": { - "abbrev": "1" - }, - "bin": { - "nopt": "bin/nopt.js" - } - }, - "node_modules/node-ninja/node_modules/npmlog": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-2.0.4.tgz", - "integrity": "sha512-DaL6RTb8Qh4tMe2ttPT1qWccETy2Vi5/8p+htMpLBeXJTr2CAqnF5WQtSP2eFpvaNbhLZ5uilDb98mRm4Q+lZQ==", - "dev": true, - "dependencies": { - "ansi": "~0.3.1", - "are-we-there-yet": "~1.1.2", - "gauge": "~1.2.5" - } - }, - "node_modules/node-ninja/node_modules/readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dev": true, - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/node-ninja/node_modules/rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - } - }, - "node_modules/node-ninja/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "node_modules/node-ninja/node_modules/semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", - "dev": true, - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/node-ninja/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/node-ninja/node_modules/tar": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.2.tgz", - "integrity": "sha512-FCEhQ/4rE1zYv9rYXJw/msRqsnmlje5jHP6huWeBZ704jUTy02c5AZyWujpMR1ax6mVw9NyJMfuK2CMDWVIfgA==", - "deprecated": "This version of tar is no longer supported, and will not receive security updates. Please upgrade asap.", - "dev": true, - "dependencies": { - "block-stream": "*", - "fstream": "^1.0.12", - "inherits": "2" - } - }, - "node_modules/node-ninja/node_modules/which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "which": "bin/which" - } - }, - "node_modules/node-releases": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", - "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==" - }, - "node_modules/noop-logger": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/noop-logger/-/noop-logger-0.1.1.tgz", - "integrity": "sha512-6kM8CLXvuW5crTxsAtva2YLrRrDaiTIkIePWs9moLHqbFWT94WpNFjwS/5dfLfECg5i/lkmw3aoqVidxt23TEQ==", - "dev": true - }, - "node_modules/nopt": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-6.0.0.tgz", - "integrity": "sha512-ZwLpbTgdhuZUnZzjd7nb1ZV+4DoiC6/sfiVKok72ym/4Tlf+DFdlHYmT2JPmcNNWV6Pi3SDf1kT+A4r9RTuT9g==", - "dev": true, - "dependencies": { - "abbrev": "^1.0.0" - }, - "bin": { - "nopt": "bin/nopt.js" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/npm-path": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/npm-path/-/npm-path-2.0.4.tgz", - "integrity": "sha512-IFsj0R9C7ZdR5cP+ET342q77uSRdtWOlWpih5eC+lu29tIDbNEgDbzgVJ5UFvYHWhxDZ5TFkJafFioO0pPQjCw==", - "dev": true, - "dependencies": { - "which": "^1.2.10" - }, - "bin": { - "npm-path": "bin/npm-path" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/npm-path/node_modules/which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "which": "bin/which" + "node": ">=0.10.0" } }, "node_modules/npm-run-path": { @@ -7386,41 +6207,6 @@ "node": ">=8" } }, - "node_modules/npm-which": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/npm-which/-/npm-which-3.0.1.tgz", - "integrity": "sha512-CM8vMpeFQ7MAPin0U3wzDhSGV0hMHNwHU0wjo402IVizPDrs45jSfSuoC+wThevY88LQti8VvaAnqYAeVy3I1A==", - "dev": true, - "dependencies": { - "commander": "^2.9.0", - "npm-path": "^2.0.2", - "which": "^1.2.10" - }, - "bin": { - "npm-which": "bin/npm-which.js" - }, - "engines": { - "node": ">=4.2.0" - } - }, - "node_modules/npm-which/node_modules/commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true - }, - "node_modules/npm-which/node_modules/which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "which": "bin/which" - } - }, "node_modules/npmlog": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-6.0.2.tgz", @@ -7435,249 +6221,14 @@ "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/number-is-nan": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/nw-gyp": { - "version": "3.6.6", - "resolved": "https://registry.npmjs.org/nw-gyp/-/nw-gyp-3.6.6.tgz", - "integrity": "sha512-FeMnpFQWtEEMJ1BrSfK3T62CjuxaNl0mNHqdrxFcIF5XQdC3gaZYW4n+77lQLk8PE3Upfknkl9VRo6gDKJIHuA==", - "dev": true, - "dependencies": { - "fstream": "^1.0.0", - "glob": "^7.0.3", - "graceful-fs": "^4.1.2", - "minimatch": "^3.0.2", - "mkdirp": "^0.5.0", - "nopt": "2 || 3", - "npmlog": "0 || 1 || 2 || 3 || 4", - "osenv": "0", - "request": "2", - "rimraf": "2", - "semver": "~5.3.0", - "tar": "^2.0.0", - "which": "1" - }, - "bin": { - "nw-gyp": "bin/nw-gyp.js" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/nw-gyp/node_modules/ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/nw-gyp/node_modules/aproba": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", - "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", - "dev": true - }, - "node_modules/nw-gyp/node_modules/are-we-there-yet": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.7.tgz", - "integrity": "sha512-nxwy40TuMiUGqMyRHgCSWZ9FM4VAoRP4xUYSTv5ImRog+h9yISPbVH7H8fASCIzYn9wlEv4zvFL7uKDMCFQm3g==", - "dev": true, - "dependencies": { - "delegates": "^1.0.0", - "readable-stream": "^2.0.6" - } - }, - "node_modules/nw-gyp/node_modules/gauge": { - "version": "2.7.4", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", - "integrity": "sha512-14x4kjc6lkD3ltw589k0NrPD6cCNTD6CWoVUNpB85+DrtONoZn+Rug6xZU5RvSC4+TZPxA5AnBibQYAvZn41Hg==", - "dev": true, - "dependencies": { - "aproba": "^1.0.3", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.0", - "object-assign": "^4.1.0", - "signal-exit": "^3.0.0", - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wide-align": "^1.1.0" - } - }, - "node_modules/nw-gyp/node_modules/is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw==", - "dev": true, - "dependencies": { - "number-is-nan": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/nw-gyp/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "dev": true - }, - "node_modules/nw-gyp/node_modules/nopt": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", - "integrity": "sha512-4GUt3kSEYmk4ITxzB/b9vaIDfUVWN/Ml1Fwl11IlnIG2iaJ9O6WXZ9SrYM9NLI8OCBieN2Y8SWC2oJV0RQ7qYg==", - "dev": true, - "dependencies": { - "abbrev": "1" - }, - "bin": { - "nopt": "bin/nopt.js" - } - }, - "node_modules/nw-gyp/node_modules/npmlog": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", - "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", - "dev": true, - "dependencies": { - "are-we-there-yet": "~1.1.2", - "console-control-strings": "~1.1.0", - "gauge": "~2.7.3", - "set-blocking": "~2.0.0" - } - }, - "node_modules/nw-gyp/node_modules/readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dev": true, - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/nw-gyp/node_modules/rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - } - }, - "node_modules/nw-gyp/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "node_modules/nw-gyp/node_modules/semver": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz", - "integrity": "sha512-mfmm3/H9+67MCVix1h+IXTpDwL6710LyHuk7+cWC9T1mE0qz4iHhh6r4hU2wrIT9iTsAAC2XQRvfblL028cpLw==", - "dev": true, - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/nw-gyp/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/nw-gyp/node_modules/string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw==", - "dev": true, - "dependencies": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/nw-gyp/node_modules/strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", + "node_modules/object-inspect": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.2.tgz", + "integrity": "sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==", "dev": true, - "dependencies": { - "ansi-regex": "^2.0.0" - }, "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/nw-gyp/node_modules/tar": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.2.tgz", - "integrity": "sha512-FCEhQ/4rE1zYv9rYXJw/msRqsnmlje5jHP6huWeBZ704jUTy02c5AZyWujpMR1ax6mVw9NyJMfuK2CMDWVIfgA==", - "deprecated": "This version of tar is no longer supported, and will not receive security updates. Please upgrade asap.", - "dev": true, - "dependencies": { - "block-stream": "*", - "fstream": "^1.0.12", - "inherits": "2" - } - }, - "node_modules/nw-gyp/node_modules/which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "dependencies": { - "isexe": "^2.0.0" + "node": ">= 0.4" }, - "bin": { - "which": "bin/which" - } - }, - "node_modules/oauth-sign": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-inspect": { - "version": "1.12.3", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", - "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", - "dev": true, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -7692,13 +6243,13 @@ } }, "node_modules/object.assign": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", - "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", + "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", "has-symbols": "^1.0.3", "object-keys": "^1.1.1" }, @@ -7710,14 +6261,15 @@ } }, "node_modules/object.fromentries": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.7.tgz", - "integrity": "sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA==", + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz", + "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0" }, "engines": { "node": ">= 0.4" @@ -7727,26 +6279,28 @@ } }, "node_modules/object.groupby": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.1.tgz", - "integrity": "sha512-HqaQtqLnp/8Bn4GL16cj+CUYbnpe1bh0TtEaWvybszDG4tgxCJuRpV8VGuvNaI1fAnI4lUJzDG55MXcOH4JZcQ==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.3.tgz", + "integrity": "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "get-intrinsic": "^1.2.1" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2" + }, + "engines": { + "node": ">= 0.4" } }, "node_modules/object.values": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.7.tgz", - "integrity": "sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.0.tgz", + "integrity": "sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" }, "engines": { "node": ">= 0.4" @@ -7794,34 +6348,6 @@ "node": ">= 0.8.0" } }, - "node_modules/os-homedir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", - "integrity": "sha512-B5JU3cabzk8c67mRRd3ECmROafjYMXbuzlwtqdM8IbS8ktlTix8aFGb2bAGKrSRIlnfKwovGUUr72JUPyOb6kQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/osenv": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", - "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", - "dev": true, - "dependencies": { - "os-homedir": "^1.0.0", - "os-tmpdir": "^1.0.0" - } - }, "node_modules/p-limit": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", @@ -7851,21 +6377,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/p-map": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", - "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", - "dev": true, - "dependencies": { - "aggregate-error": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/p-try": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", @@ -7902,15 +6413,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/path-array": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-array/-/path-array-1.0.1.tgz", - "integrity": "sha512-teWG2rJTJJZi2kINKOsHcdIuHP7jy3D7pAsVgdhxMq8kaL2RnS5sg7YTlrClMVCIItcVbPTPI6eMBEoNxYahLA==", - "dev": true, - "dependencies": { - "array-index": "^1.0.0" - } - }, "node_modules/path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", @@ -7978,20 +6480,15 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, "engines": { "node": ">=8" } }, - "node_modules/performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==", - "dev": true - }, "node_modules/picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", + "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==" }, "node_modules/picomatch": { "version": "2.3.1", @@ -8055,229 +6552,41 @@ "p-locate": "^4.1.0" }, "engines": { - "node": ">=8" - } - }, - "node_modules/pkg-dir/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/pkg-dir/node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/prebuild": { - "version": "12.1.0", - "resolved": "https://registry.npmjs.org/prebuild/-/prebuild-12.1.0.tgz", - "integrity": "sha512-7VxOp28zmb68lVMAqNMYr8jyIIHdRp52MSki01jAsdgDlnQYsVNhRpC9nHoax2wVhV/fnbyUUb1u57qUjrbbEg==", - "dev": true, - "dependencies": { - "cmake-js": "^7.2.1", - "detect-libc": "^2.0.2", - "each-series-async": "^1.0.1", - "execspawn": "^1.0.1", - "ghreleases": "^3.0.2", - "github-from-package": "0.0.0", - "glob": "^7.2.3", - "minimist": "^1.2.8", - "napi-build-utils": "^1.0.2", - "node-abi": "^3.47.0", - "node-gyp": "^9.4.0", - "node-ninja": "^1.0.2", - "noop-logger": "^0.1.1", - "npm-which": "^3.0.1", - "npmlog": "^7.0.1", - "nw-gyp": "^3.6.6", - "rc": "^1.2.8", - "run-waterfall": "^1.1.7", - "tar-stream": "^3.1.6" - }, - "bin": { - "prebuild": "bin.js" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/prebuild-install": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.1.tgz", - "integrity": "sha512-jAXscXWMcCK8GgCoHOfIr0ODh5ai8mj63L2nWrjuAgXE6tDyYGnx4/8o/rCgU+B4JSyZBKbeZqzhtwtC3ovxjw==", - "dependencies": { - "detect-libc": "^2.0.0", - "expand-template": "^2.0.3", - "github-from-package": "0.0.0", - "minimist": "^1.2.3", - "mkdirp-classic": "^0.5.3", - "napi-build-utils": "^1.0.1", - "node-abi": "^3.3.0", - "pump": "^3.0.0", - "rc": "^1.2.7", - "simple-get": "^4.0.0", - "tar-fs": "^2.0.0", - "tunnel-agent": "^0.6.0" - }, - "bin": { - "prebuild-install": "bin.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/prebuild/node_modules/are-we-there-yet": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-4.0.1.tgz", - "integrity": "sha512-2zuA+jpOYBRgoBCfa+fB87Rk0oGJjDX6pxGzqH6f33NzUhG25Xur6R0u0Z9VVAq8Z5JvQpQI6j6rtonuivC8QA==", - "dev": true, - "dependencies": { - "delegates": "^1.0.0", - "readable-stream": "^4.1.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/prebuild/node_modules/buffer": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" - } - }, - "node_modules/prebuild/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "node_modules/prebuild/node_modules/gauge": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-5.0.1.tgz", - "integrity": "sha512-CmykPMJGuNan/3S4kZOpvvPYSNqSHANiWnh9XcMU2pSjtBfF0XzZ2p1bFAxTbnFxyBuPxQYHhzwaoOmUdqzvxQ==", - "dev": true, - "dependencies": { - "aproba": "^1.0.3 || ^2.0.0", - "color-support": "^1.1.3", - "console-control-strings": "^1.1.0", - "has-unicode": "^2.0.1", - "signal-exit": "^4.0.1", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1", - "wide-align": "^1.1.5" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/prebuild/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/prebuild/node_modules/npmlog": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-7.0.1.tgz", - "integrity": "sha512-uJ0YFk/mCQpLBt+bxN88AKd+gyqZvZDbtiNxk6Waqcj2aPRyfVx8ITawkyQynxUagInjdYT1+qj4NfA5KJJUxg==", - "dev": true, - "dependencies": { - "are-we-there-yet": "^4.0.0", - "console-control-strings": "^1.1.0", - "gauge": "^5.0.0", - "set-blocking": "^2.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/prebuild/node_modules/readable-stream": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.4.2.tgz", - "integrity": "sha512-Lk/fICSyIhodxy1IDK2HazkeGjSmezAWX2egdtJnYhtzKEsBPJowlI6F6LPb5tqIQILrMbx22S5o3GuJavPusA==", - "dev": true, - "dependencies": { - "abort-controller": "^3.0.0", - "buffer": "^6.0.3", - "events": "^3.3.0", - "process": "^0.11.10", - "string_decoder": "^1.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": ">=8" } }, - "node_modules/prebuild/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, + "node_modules/pkg-dir/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dependencies": { + "p-try": "^2.0.0" + }, "engines": { - "node": ">=14" + "node": ">=6" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/prebuild/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, + "node_modules/pkg-dir/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" + "p-limit": "^2.2.0" }, "engines": { "node": ">=8" } }, - "node_modules/prebuild/node_modules/tar-stream": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.6.tgz", - "integrity": "sha512-B/UyjYwPpMBv+PaFSWAmtYjwdrlEaZQEhMIBFNC5oEG8lpiW8XjcSdmEaClj28ArfKScKHs2nshz3k2le6crsg==", + "node_modules/possible-typed-array-names": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", + "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==", "dev": true, - "dependencies": { - "b4a": "^1.6.4", - "fast-fifo": "^1.2.0", - "streamx": "^2.15.0" + "engines": { + "node": ">= 0.4" } }, "node_modules/prelude-ls": { @@ -8290,9 +6599,9 @@ } }, "node_modules/prettier": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.1.0.tgz", - "integrity": "sha512-TQLvXjq5IAibjh8EpBIkNKxO749UEWABoiIZehEPiY4GNpVdhaFKqSTu+QrlU6D2dPAfubRmtJTi4K4YkQ5eXw==", + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.3.3.tgz", + "integrity": "sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==", "dev": true, "bin": { "prettier": "bin/prettier.cjs" @@ -8328,34 +6637,6 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/process": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", - "dev": true, - "engines": { - "node": ">= 0.6.0" - } - }, - "node_modules/process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "dev": true - }, - "node_modules/promise-retry": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", - "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", - "dev": true, - "dependencies": { - "err-code": "^2.0.2", - "retry": "^0.12.0" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/prompts": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", @@ -8383,25 +6664,19 @@ "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" }, - "node_modules/psl": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", - "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==", - "dev": true - }, - "node_modules/pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "engines": { + "node": ">=6" } }, - "node_modules/punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "node_modules/punycode.js": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode.js/-/punycode.js-2.3.1.tgz", + "integrity": "sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==", "dev": true, "engines": { "node": ">=6" @@ -8422,15 +6697,6 @@ } ] }, - "node_modules/qs": { - "version": "6.5.3", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", - "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==", - "dev": true, - "engines": { - "node": ">=0.6" - } - }, "node_modules/queue-microtask": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", @@ -8451,12 +6717,6 @@ } ] }, - "node_modules/queue-tick": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/queue-tick/-/queue-tick-1.0.1.tgz", - "integrity": "sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag==", - "dev": true - }, "node_modules/rc": { "version": "1.2.8", "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", @@ -8498,14 +6758,15 @@ } }, "node_modules/regexp.prototype.flags": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz", - "integrity": "sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==", + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz", + "integrity": "sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "functions-have-names": "^1.2.3" + "call-bind": "^1.0.6", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", + "set-function-name": "^2.0.1" }, "engines": { "node": ">= 0.4" @@ -8514,52 +6775,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/request": { - "version": "2.88.2", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", - "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", - "deprecated": "request has been deprecated, see https://github.com/request/request/issues/3142", - "dev": true, - "dependencies": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.3", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.5.0", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/request/node_modules/form-data": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", - "dev": true, - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 0.12" - } - }, "node_modules/require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -8620,21 +6835,48 @@ } }, "node_modules/restore-cursor": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-4.0.0.tgz", - "integrity": "sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-5.1.0.tgz", + "integrity": "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==", "dev": true, "dependencies": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" + "onetime": "^7.0.0", + "signal-exit": "^4.1.0" }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/restore-cursor/node_modules/onetime": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-7.0.0.tgz", + "integrity": "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==", + "dev": true, + "dependencies": { + "mimic-function": "^5.0.0" + }, + "engines": { + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/restore-cursor/node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/retry": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", @@ -8654,15 +6896,15 @@ } }, "node_modules/rfdc": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.1.tgz", - "integrity": "sha512-r5a3l5HzYlIC68TpmYKlxWjmOP6wiPJ1vWv2HeLhNsRZMrCkxeqxiHlQ21oXmQ4F3SiryXBHhAD7JZqvOJjFmg==", + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz", + "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==", "dev": true }, "node_modules/rimraf": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-5.0.5.tgz", - "integrity": "sha512-CqDakW+hMe/Bz202FPEymy68P+G50RfMQK+Qo5YUqc9SPipvbGjCGKd0RSKEelbsfQuw3g5NZDSrlZZAJurH1A==", + "version": "5.0.7", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-5.0.7.tgz", + "integrity": "sha512-nV6YcJo5wbLW77m+8KjH8aB/7/rxQy9SZ0HY5shnwULfS+9nmTtVXAJET5NdZmCzA4fPI/Hm1wo/Po/4mopOdg==", "dev": true, "dependencies": { "glob": "^10.3.7" @@ -8671,7 +6913,7 @@ "rimraf": "dist/esm/bin.mjs" }, "engines": { - "node": ">=14" + "node": ">=14.18" }, "funding": { "url": "https://github.com/sponsors/isaacs" @@ -8765,34 +7007,14 @@ "run-script-os": "index.js" } }, - "node_modules/run-waterfall": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/run-waterfall/-/run-waterfall-1.1.7.tgz", - "integrity": "sha512-iFPgh7SatHXOG1ClcpdwHI63geV3Hc/iL6crGSyBlH2PY7Rm/za+zoKz6FfY/Qlw5K7JwSol8pseO8fN6CMhhQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, "node_modules/safe-array-concat": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.0.0.tgz", - "integrity": "sha512-9dVEFruWIsnie89yym+xWTAYASdpw3CJV7Li/6zBewGf9z2i1j31rP6jnY0pHEO4QZh6N0K11bFjWmdR8UGdPQ==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.2.tgz", + "integrity": "sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.0", + "call-bind": "^1.0.7", + "get-intrinsic": "^1.2.4", "has-symbols": "^1.0.3", "isarray": "^2.0.5" }, @@ -8803,12 +7025,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/safe-array-concat/node_modules/isarray": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", - "dev": true - }, "node_modules/safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", @@ -8829,32 +7045,26 @@ ] }, "node_modules/safe-regex-test": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", - "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz", + "integrity": "sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.3", + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", "is-regex": "^1.1.4" }, + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true - }, "node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dependencies": { - "lru-cache": "^6.0.0" - }, + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", "bin": { "semver": "bin/semver.js" }, @@ -8867,6 +7077,38 @@ "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==" }, + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "dev": true, + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-function-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", + "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", + "dev": true, + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -8887,14 +7129,18 @@ } }, "node_modules/side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", + "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", "dev": true, "dependencies": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", + "object-inspect": "^1.13.1" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -8905,58 +7151,6 @@ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" }, - "node_modules/simple-concat": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", - "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/simple-get": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz", - "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "decompress-response": "^6.0.0", - "once": "^1.3.1", - "simple-concat": "^1.0.0" - } - }, - "node_modules/simple-mime": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/simple-mime/-/simple-mime-0.1.0.tgz", - "integrity": "sha512-2EoTElzj77w0hV4lW6nWdA+MR+81hviMBhEc/ppUi0+Q311EFCvwKrGS7dcxqvGRKnUdbAyqPJtBQbRYgmtmvQ==", - "dev": true, - "engines": [ - "node >= 0.2.0" - ] - }, "node_modules/sisteransi": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", @@ -8998,44 +7192,6 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/smart-buffer": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", - "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", - "dev": true, - "engines": { - "node": ">= 6.0.0", - "npm": ">= 3.0.0" - } - }, - "node_modules/socks": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.7.1.tgz", - "integrity": "sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==", - "dev": true, - "dependencies": { - "ip": "^2.0.0", - "smart-buffer": "^4.2.0" - }, - "engines": { - "node": ">= 10.13.0", - "npm": ">= 3.0.0" - } - }, - "node_modules/socks-proxy-agent": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-7.0.0.tgz", - "integrity": "sha512-Fgl0YPZ902wEsAyiQ+idGd1A7rSFx/ayC1CQVMw5P+EQx2V0SgpGtf6OKFhVjPflPUl9YMmEOnmfjCdMUsygww==", - "dev": true, - "dependencies": { - "agent-base": "^6.0.2", - "debug": "^4.3.3", - "socks": "^2.6.2" - }, - "engines": { - "node": ">= 10" - } - }, "node_modules/source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -9053,57 +7209,11 @@ "source-map": "^0.6.0" } }, - "node_modules/sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==" - }, - "node_modules/sshpk": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz", - "integrity": "sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==", - "dev": true, - "dependencies": { - "asn1": "~0.2.3", - "assert-plus": "^1.0.0", - "bcrypt-pbkdf": "^1.0.0", - "dashdash": "^1.12.0", - "ecc-jsbn": "~0.1.1", - "getpass": "^0.1.1", - "jsbn": "~0.1.0", - "safer-buffer": "^2.0.2", - "tweetnacl": "~0.14.0" - }, - "bin": { - "sshpk-conv": "bin/sshpk-conv", - "sshpk-sign": "bin/sshpk-sign", - "sshpk-verify": "bin/sshpk-verify" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ssri": { - "version": "10.0.5", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-10.0.5.tgz", - "integrity": "sha512-bSf16tAFkGeRlUNDjXu8FzaMQt6g2HZJrun7mtMbIPOddxt3GLMSz5VWUWcqTJUPfLEaDIepGxv+bYQW49596A==", - "dev": true, - "dependencies": { - "minipass": "^7.0.3" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/ssri/node_modules/minipass": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", - "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", - "dev": true, - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==" + }, "node_modules/stack-utils": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", @@ -9123,16 +7233,6 @@ "node": ">=8" } }, - "node_modules/streamx": { - "version": "2.15.1", - "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.15.1.tgz", - "integrity": "sha512-fQMzy2O/Q47rgwErk/eGeLu/roaFWV0jVsogDmrszM9uIw8L5OA+t+V93MgYlufNptfjmYR1tOMWhei/Eh7TQA==", - "dev": true, - "dependencies": { - "fast-fifo": "^1.1.0", - "queue-tick": "^1.0.1" - } - }, "node_modules/string_decoder": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", @@ -9237,14 +7337,15 @@ } }, "node_modules/string.prototype.trim": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz", - "integrity": "sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg==", + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz", + "integrity": "sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.0", + "es-object-atoms": "^1.0.0" }, "engines": { "node": ">= 0.4" @@ -9254,28 +7355,31 @@ } }, "node_modules/string.prototype.trimend": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz", - "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz", + "integrity": "sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/string.prototype.trimstart": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz", - "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", + "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -9355,9 +7459,9 @@ } }, "node_modules/tar": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.0.tgz", - "integrity": "sha512-/Wo7DcT0u5HUV486xg675HtjNd3BXZ6xDbzsCUZPt5iw8bTQ63bP0Raut3mvro9u+CUyq7YQd8Cx55fsZXxqLQ==", + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz", + "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==", "dependencies": { "chownr": "^2.0.0", "fs-minipass": "^2.0.0", @@ -9370,66 +7474,6 @@ "node": ">=10" } }, - "node_modules/tar-fs": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", - "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==", - "dependencies": { - "chownr": "^1.1.1", - "mkdirp-classic": "^0.5.2", - "pump": "^3.0.0", - "tar-stream": "^2.1.4" - } - }, - "node_modules/tar-fs/node_modules/chownr": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" - }, - "node_modules/tar-stream": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", - "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", - "dependencies": { - "bl": "^4.0.3", - "end-of-stream": "^1.4.1", - "fs-constants": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^3.1.1" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/tar-stream/node_modules/bl": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", - "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", - "dependencies": { - "buffer": "^5.5.0", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" - } - }, - "node_modules/tar/node_modules/minipass": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", - "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/tar/node_modules/mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "bin": { - "mkdirp": "bin/cmd.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/test-exclude": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", @@ -9449,57 +7493,12 @@ "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", "dev": true }, - "node_modules/through2": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", - "integrity": "sha512-RkK/CCESdTKQZHdmKICijdKKsCRVHs5KsLZ6pACAmF/1GPUQhonHSXWNERctxEp7RmvjdNbZTL5z9V7nSCXKcg==", - "dev": true, - "dependencies": { - "readable-stream": ">=1.0.33-1 <1.1.0-0", - "xtend": ">=4.0.0 <4.1.0-0" - } - }, - "node_modules/through2/node_modules/readable-stream": { - "version": "1.0.34", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==", - "dev": true, - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "node_modules/through2/node_modules/string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==", - "dev": true - }, "node_modules/tmp": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", - "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", - "dependencies": { - "rimraf": "^3.0.0" - }, + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.3.tgz", + "integrity": "sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w==", "engines": { - "node": ">=8.17.0" - } - }, - "node_modules/tmp/node_modules/rimraf": { - "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" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": ">=14.14" } }, "node_modules/tmpl": { @@ -9526,19 +7525,6 @@ "node": ">=8.0" } }, - "node_modules/tough-cookie": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", - "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", - "dev": true, - "dependencies": { - "psl": "^1.1.28", - "punycode": "^2.1.1" - }, - "engines": { - "node": ">=0.8" - } - }, "node_modules/ts-api-utils": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.0.1.tgz", @@ -9552,28 +7538,30 @@ } }, "node_modules/ts-jest": { - "version": "29.1.2", - "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.1.2.tgz", - "integrity": "sha512-br6GJoH/WUX4pu7FbZXuWGKGNDuU7b8Uj77g/Sp7puZV6EXzuByl6JrECvm0MzVzSTkSHWTihsXt+5XYER5b+g==", + "version": "29.2.5", + "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.2.5.tgz", + "integrity": "sha512-KD8zB2aAZrcKIdGk4OwpJggeLcH1FgrICqDSROWqlnJXGCXK4Mn6FcdK2B6670Xr73lHMG1kHw8R87A0ecZ+vA==", "dev": true, "dependencies": { - "bs-logger": "0.x", - "fast-json-stable-stringify": "2.x", + "bs-logger": "^0.2.6", + "ejs": "^3.1.10", + "fast-json-stable-stringify": "^2.1.0", "jest-util": "^29.0.0", "json5": "^2.2.3", - "lodash.memoize": "4.x", - "make-error": "1.x", - "semver": "^7.5.3", - "yargs-parser": "^21.0.1" + "lodash.memoize": "^4.1.2", + "make-error": "^1.3.6", + "semver": "^7.6.3", + "yargs-parser": "^21.1.1" }, "bin": { "ts-jest": "cli.js" }, "engines": { - "node": "^16.10.0 || ^18.0.0 || >=20.0.0" + "node": "^14.15.0 || ^16.10.0 || ^18.0.0 || >=20.0.0" }, "peerDependencies": { "@babel/core": ">=7.0.0-beta.0 <8", + "@jest/transform": "^29.0.0", "@jest/types": "^29.0.0", "babel-jest": "^29.0.0", "jest": "^29.0.0", @@ -9583,6 +7571,9 @@ "@babel/core": { "optional": true }, + "@jest/transform": { + "optional": true + }, "@jest/types": { "optional": true }, @@ -9648,29 +7639,6 @@ "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", "dev": true }, - "node_modules/tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", - "dependencies": { - "safe-buffer": "^5.0.1" - }, - "engines": { - "node": "*" - } - }, - "node_modules/tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==", - "dev": true - }, - "node_modules/type": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", - "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==", - "dev": true - }, "node_modules/type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", @@ -9704,29 +7672,30 @@ } }, "node_modules/typed-array-buffer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz", - "integrity": "sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz", + "integrity": "sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.1", - "is-typed-array": "^1.1.10" + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.13" }, "engines": { "node": ">= 0.4" } }, "node_modules/typed-array-byte-length": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz", - "integrity": "sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz", + "integrity": "sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", + "call-bind": "^1.0.7", "for-each": "^0.3.3", - "has-proto": "^1.0.1", - "is-typed-array": "^1.1.10" + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13" }, "engines": { "node": ">= 0.4" @@ -9736,16 +7705,17 @@ } }, "node_modules/typed-array-byte-offset": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz", - "integrity": "sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz", + "integrity": "sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==", "dev": true, "dependencies": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", "for-each": "^0.3.3", - "has-proto": "^1.0.1", - "is-typed-array": "^1.1.10" + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13" }, "engines": { "node": ">= 0.4" @@ -9755,23 +7725,29 @@ } }, "node_modules/typed-array-length": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", - "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.6.tgz", + "integrity": "sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", + "call-bind": "^1.0.7", "for-each": "^0.3.3", - "is-typed-array": "^1.1.9" + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13", + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/typescript": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.3.3.tgz", - "integrity": "sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==", + "version": "5.6.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.6.2.tgz", + "integrity": "sha512-NW8ByodCSNCwZeghjN3o+JX5OFH0Ojg6sadjEKY4huZ52TqbJTJnDo5+Tw98lSy63NZvi4n+ez5m2u5d4PkZyw==", "devOptional": true, "bin": { "tsc": "bin/tsc", @@ -9782,9 +7758,9 @@ } }, "node_modules/uc.micro": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz", - "integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-2.1.0.tgz", + "integrity": "sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==", "dev": true }, "node_modules/unbox-primitive": { @@ -9807,30 +7783,6 @@ "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==" }, - "node_modules/unique-filename": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-3.0.0.tgz", - "integrity": "sha512-afXhuC55wkAmZ0P18QsVE6kp8JaxrEokN2HGIoIVv2ijHQd419H0+6EigAFcIzXeMIkcIkNBpB3L/DXB3cTS/g==", - "dev": true, - "dependencies": { - "unique-slug": "^4.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/unique-slug": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-4.0.0.tgz", - "integrity": "sha512-WrcA6AyEfqDX5bWige/4NQfPZMtASNVxdmWR76WESYQVAACSgWcR6e9i0mofqqBxYFtL4oAxPIptY73/0YE1DQ==", - "dev": true, - "dependencies": { - "imurmurhash": "^0.1.4" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, "node_modules/universalify": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", @@ -9840,9 +7792,9 @@ } }, "node_modules/update-browserslist-db": { - "version": "1.0.13", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", - "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.0.tgz", + "integrity": "sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==", "funding": [ { "type": "opencollective", @@ -9858,8 +7810,8 @@ } ], "dependencies": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" + "escalade": "^3.1.2", + "picocolors": "^1.0.1" }, "bin": { "update-browserslist-db": "cli.js" @@ -9882,33 +7834,11 @@ "resolved": "https://registry.npmjs.org/url-join/-/url-join-4.0.1.tgz", "integrity": "sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA==" }, - "node_modules/url-template": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/url-template/-/url-template-2.0.8.tgz", - "integrity": "sha512-XdVKMF4SJ0nP/O7XIPB0JwAEuT9lDIYnNsK8yGVe43y0AWoKeJNdv3ZNWh7ksJ6KqQFjOO6ox/VEitLnaVNufw==", - "dev": true - }, "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" }, - "node_modules/util-extend": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/util-extend/-/util-extend-1.0.3.tgz", - "integrity": "sha512-mLs5zAK+ctllYBj+iAQvlDCwoxU/WDOUaJkcFudeiAX6OajC6BKXJUa9a+tbtkC11dz2Ufb7h0lyvIOVn4LADA==", - "dev": true - }, - "node_modules/uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", - "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", - "dev": true, - "bin": { - "uuid": "bin/uuid" - } - }, "node_modules/v8-to-istanbul": { "version": "9.1.1", "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.1.1.tgz", @@ -9922,20 +7852,6 @@ "node": ">=10.12.0" } }, - "node_modules/verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==", - "dev": true, - "engines": [ - "node >=0.6.0" - ], - "dependencies": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" - } - }, "node_modules/walker": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", @@ -9975,16 +7891,16 @@ } }, "node_modules/which-typed-array": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.11.tgz", - "integrity": "sha512-qe9UWWpkeG5yzZ0tNYxDmd7vo58HDBc39mZ0xWWpolAGADdFOzkfamWLDxkOWcvHQKVmdTyQdLD4NOfjLWTKew==", + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.15.tgz", + "integrity": "sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==", "dev": true, "dependencies": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", "for-each": "^0.3.3", "gopd": "^1.0.1", - "has-tostringtag": "^1.0.0" + "has-tostringtag": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -10133,15 +8049,6 @@ "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", - "dev": true, - "engines": { - "node": ">=0.4" - } - }, "node_modules/y18n": { "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", @@ -10156,10 +8063,13 @@ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" }, "node_modules/yaml": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.4.tgz", - "integrity": "sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA==", + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.5.0.tgz", + "integrity": "sha512-2wWLbGbYDiSqqIKoPjar3MPgB94ErzCtrNE1FdqGuaO0pi2JGjmE8aW8TDZwzU7vuxcGRdL/4gPQwQ7hD5AMSw==", "dev": true, + "bin": { + "yaml": "bin.mjs" + }, "engines": { "node": ">= 14" } @@ -10228,11 +8138,11 @@ }, "packages/bug-detectors": { "name": "@jazzer.js/bug-detectors", - "version": "2.1.0", + "version": "3.1.0", "license": "Apache-2.0", "dependencies": { - "@jazzer.js/core": "2.1.0", - "@jazzer.js/hooking": "2.1.0" + "@jazzer.js/core": "3.1.0", + "@jazzer.js/hooking": "3.1.0" }, "devDependencies": {}, "engines": { @@ -10242,24 +8152,24 @@ }, "packages/core": { "name": "@jazzer.js/core", - "version": "2.1.0", + "version": "3.1.0", "license": "Apache-2.0", "dependencies": { - "@jazzer.js/bug-detectors": "2.1.0", - "@jazzer.js/fuzzer": "2.1.0", - "@jazzer.js/hooking": "2.1.0", - "@jazzer.js/instrumentor": "2.1.0", + "@jazzer.js/bug-detectors": "3.1.0", + "@jazzer.js/fuzzer": "3.1.0", + "@jazzer.js/hooking": "3.1.0", + "@jazzer.js/instrumentor": "3.1.0", "istanbul-lib-coverage": "^3.2.2", "istanbul-lib-report": "^3.0.1", - "istanbul-reports": "^3.1.6", - "tmp": "^0.2.1", + "istanbul-reports": "^3.1.7", + "tmp": "^0.2.3", "yargs": "^17.7.2" }, "bin": { "jazzer": "dist/cli.js" }, "devDependencies": { - "@types/yargs": "^17.0.32" + "@types/yargs": "^17.0.33" }, "engines": { "node": ">= 14.0.0", @@ -10268,20 +8178,17 @@ }, "packages/fuzzer": { "name": "@jazzer.js/fuzzer", - "version": "2.1.0", - "hasInstallScript": true, + "version": "3.1.0", "license": "Apache-2.0", "dependencies": { "bindings": "^1.5.0", "cmake-js": "^7.3.0", - "node-addon-api": "^7.1.0", - "prebuild-install": "^7.1.1" + "node-addon-api": "^7.1.0" }, "devDependencies": { "@types/bindings": "^1.5.5", - "@types/node": "^20.11.17", - "clang-format": "^1.8.0", - "prebuild": "^12.1.0" + "@types/node": "^20.14.11", + "clang-format": "^1.8.0" }, "engines": { "node": ">= 14.0.0", @@ -10290,14 +8197,8 @@ }, "packages/hooking": { "name": "@jazzer.js/hooking", - "version": "2.1.0", + "version": "3.1.0", "license": "Apache-2.0", - "dependencies": { - "@babel/core": "^7.23.9" - }, - "devDependencies": { - "@types/babel__core": "^7.20.5" - }, "engines": { "node": ">= 14.0.0", "npm": ">= 7.0.0" @@ -10305,15 +8206,15 @@ }, "packages/instrumentor": { "name": "@jazzer.js/instrumentor", - "version": "2.1.0", + "version": "3.1.0", "license": "Apache-2.0", "dependencies": { - "@babel/core": "^7.23.9", - "@babel/generator": "^7.23.5", - "@jazzer.js/fuzzer": "2.1.0", - "@jazzer.js/hooking": "2.1.0", + "@babel/core": "^7.25.2", + "@babel/generator": "^7.25.6", + "@jazzer.js/fuzzer": "3.1.0", + "@jazzer.js/hooking": "3.1.0", "istanbul-lib-hook": "^3.0.0", - "istanbul-lib-instrument": "^6.0.1", + "istanbul-lib-instrument": "^6.0.3", "proper-lockfile": "^4.1.2", "source-map-support": "^0.5.21" }, @@ -10321,10 +8222,10 @@ "@types/babel__core": "^7.20.5", "@types/istanbul-lib-hook": "^2.0.4", "@types/istanbul-lib-instrument": "^1.7.7", - "@types/node": "^20.11.17", + "@types/node": "^20.14.11", "@types/proper-lockfile": "^4.1.4", "@types/source-map-support": "^0.5.10", - "typescript": "^5.3.3" + "typescript": "^5.6.2" }, "engines": { "node": ">= 14.0.0", @@ -10354,16 +8255,16 @@ }, "packages/jest-runner": { "name": "@jazzer.js/jest-runner", - "version": "2.1.0", + "version": "3.1.0", "license": "Apache-2.0", "dependencies": { - "@jazzer.js/core": "2.1.0", - "cosmiconfig": "^8.3.6", - "istanbul-reports": "^3.1.6" + "@jazzer.js/core": "3.1.0", + "cosmiconfig": "^9.0.0", + "istanbul-reports": "^3.1.7" }, "devDependencies": { "@types/tmp": "^0.2.6", - "tmp": "^0.2.1" + "tmp": "^0.2.3" }, "engines": { "node": ">= 14.0.0", @@ -10382,95 +8283,44 @@ "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", "dev": true }, - "@ampproject/remapping": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", - "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", - "requires": { - "@jridgewell/gen-mapping": "^0.1.0", - "@jridgewell/trace-mapping": "^0.3.9" - } - }, - "@babel/code-frame": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.5.tgz", - "integrity": "sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==", - "requires": { - "@babel/highlight": "^7.23.4", - "chalk": "^2.4.2" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==" - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==" - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } - } + "@ampproject/remapping": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", + "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", + "requires": { + "@jridgewell/gen-mapping": "^0.1.0", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "@babel/code-frame": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.7.tgz", + "integrity": "sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==", + "requires": { + "@babel/highlight": "^7.24.7", + "picocolors": "^1.0.0" } }, "@babel/compat-data": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.23.5.tgz", - "integrity": "sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw==" + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.25.2.tgz", + "integrity": "sha512-bYcppcpKBvX4znYaPEeFau03bp89ShqNMLs+rmdptMw+heSZh9+z84d2YG+K7cYLbWwzdjtDoW/uqZmPjulClQ==" }, "@babel/core": { - "version": "7.23.9", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.9.tgz", - "integrity": "sha512-5q0175NOjddqpvvzU+kDiSOAk4PfdO6FvwCWoQ6RO7rTzEe8vlo+4HVfcnAREhD4npMs0e9uZypjTwzZPCf/cw==", + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.25.2.tgz", + "integrity": "sha512-BBt3opiCOxUr9euZ5/ro/Xv8/V7yJ5bjYMqG/C1YAo8MIKAnumZalCN+msbci3Pigy4lIQfPUpfMM27HMGaYEA==", "requires": { "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.23.5", - "@babel/generator": "^7.23.6", - "@babel/helper-compilation-targets": "^7.23.6", - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helpers": "^7.23.9", - "@babel/parser": "^7.23.9", - "@babel/template": "^7.23.9", - "@babel/traverse": "^7.23.9", - "@babel/types": "^7.23.9", + "@babel/code-frame": "^7.24.7", + "@babel/generator": "^7.25.0", + "@babel/helper-compilation-targets": "^7.25.2", + "@babel/helper-module-transforms": "^7.25.2", + "@babel/helpers": "^7.25.0", + "@babel/parser": "^7.25.0", + "@babel/template": "^7.25.0", + "@babel/traverse": "^7.25.2", + "@babel/types": "^7.25.2", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -10491,36 +8341,36 @@ } }, "@babel/generator": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.6.tgz", - "integrity": "sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw==", + "version": "7.25.6", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.25.6.tgz", + "integrity": "sha512-VPC82gr1seXOpkjAAKoLhP50vx4vGNlF4msF64dSFq1P8RfB+QAuJWGHPXXPc8QyfVWwwB/TNNU4+ayZmHNbZw==", "requires": { - "@babel/types": "^7.23.6", - "@jridgewell/gen-mapping": "^0.3.2", - "@jridgewell/trace-mapping": "^0.3.17", + "@babel/types": "^7.25.6", + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25", "jsesc": "^2.5.1" }, "dependencies": { "@jridgewell/gen-mapping": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", - "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", + "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", "requires": { - "@jridgewell/set-array": "^1.0.1", + "@jridgewell/set-array": "^1.2.1", "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" + "@jridgewell/trace-mapping": "^0.3.24" } } } }, "@babel/helper-compilation-targets": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz", - "integrity": "sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==", + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.2.tgz", + "integrity": "sha512-U2U5LsSaZ7TAt3cfaymQ8WHh0pxvdHoEk6HVpaexxixjyEquMh0L0YNJNM6CTGKMXV1iksi0iZkGw4AcFkPaaw==", "requires": { - "@babel/compat-data": "^7.23.5", - "@babel/helper-validator-option": "^7.23.5", - "browserslist": "^4.22.2", + "@babel/compat-data": "^7.25.2", + "@babel/helper-validator-option": "^7.24.8", + "browserslist": "^4.23.1", "lru-cache": "^5.1.1", "semver": "^6.3.1" }, @@ -10545,46 +8395,24 @@ } } }, - "@babel/helper-environment-visitor": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", - "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==" - }, - "@babel/helper-function-name": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", - "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", - "requires": { - "@babel/template": "^7.22.15", - "@babel/types": "^7.23.0" - } - }, - "@babel/helper-hoist-variables": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", - "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", - "requires": { - "@babel/types": "^7.22.5" - } - }, "@babel/helper-module-imports": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz", - "integrity": "sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.7.tgz", + "integrity": "sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA==", "requires": { - "@babel/types": "^7.22.15" + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7" } }, "@babel/helper-module-transforms": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz", - "integrity": "sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==", + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.25.2.tgz", + "integrity": "sha512-BjyRAbix6j/wv83ftcVJmBt72QtHI56C7JXZoG2xATiLpmoC7dpd8WnkikExHDVPpi/3qCmO6WY1EaXOluiecQ==", "requires": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-module-imports": "^7.22.15", - "@babel/helper-simple-access": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/helper-validator-identifier": "^7.22.20" + "@babel/helper-module-imports": "^7.24.7", + "@babel/helper-simple-access": "^7.24.7", + "@babel/helper-validator-identifier": "^7.24.7", + "@babel/traverse": "^7.25.2" } }, "@babel/helper-plugin-utils": { @@ -10593,54 +8421,47 @@ "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==" }, "@babel/helper-simple-access": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", - "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", - "requires": { - "@babel/types": "^7.22.5" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.22.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", - "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.24.7.tgz", + "integrity": "sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg==", "requires": { - "@babel/types": "^7.22.5" + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7" } }, "@babel/helper-string-parser": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz", - "integrity": "sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==" + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.8.tgz", + "integrity": "sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ==" }, "@babel/helper-validator-identifier": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", - "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==" + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz", + "integrity": "sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==" }, "@babel/helper-validator-option": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz", - "integrity": "sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==" + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.24.8.tgz", + "integrity": "sha512-xb8t9tD1MHLungh/AIoWYN+gVHaB9kwlu8gffXGSt3FFEIT7RjS+xWbc2vUD1UTZdIpKj/ab3rdqJ7ufngyi2Q==" }, "@babel/helpers": { - "version": "7.23.9", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.9.tgz", - "integrity": "sha512-87ICKgU5t5SzOT7sBMfCOZQ2rHjRU+Pcb9BoILMYz600W6DkVRLFBPwQ18gwUVvggqXivaUakpnxWQGbpywbBQ==", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.25.0.tgz", + "integrity": "sha512-MjgLZ42aCm0oGjJj8CtSM3DB8NOOf8h2l7DCTePJs29u+v7yO/RBX9nShlKMgFnRks/Q4tBAe7Hxnov9VkGwLw==", "requires": { - "@babel/template": "^7.23.9", - "@babel/traverse": "^7.23.9", - "@babel/types": "^7.23.9" + "@babel/template": "^7.25.0", + "@babel/types": "^7.25.0" } }, "@babel/highlight": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz", - "integrity": "sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.7.tgz", + "integrity": "sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==", "requires": { - "@babel/helper-validator-identifier": "^7.22.20", + "@babel/helper-validator-identifier": "^7.24.7", "chalk": "^2.4.2", - "js-tokens": "^4.0.0" + "js-tokens": "^4.0.0", + "picocolors": "^1.0.0" }, "dependencies": { "ansi-styles": { @@ -10695,9 +8516,12 @@ } }, "@babel/parser": { - "version": "7.23.9", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.9.tgz", - "integrity": "sha512-9tcKgqKbs3xGJ+NtKF2ndOBBLVwPjl1SHxPQkd36r3Dlirw3xWUeGaTbqr7uGZcTaxkVNwc+03SVP7aCdWrTlA==" + "version": "7.25.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.25.3.tgz", + "integrity": "sha512-iLTJKDbJ4hMvFPgQwwsVoxtHyWpKKPBrxkANrSYewDPaPpT5py5yeVkgPIJ7XYXhndxJpaA3PyALSXQ7u8e/Dw==", + "requires": { + "@babel/types": "^7.25.2" + } }, "@babel/plugin-syntax-async-generators": { "version": "7.8.4", @@ -10812,28 +8636,25 @@ } }, "@babel/template": { - "version": "7.23.9", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.23.9.tgz", - "integrity": "sha512-+xrD2BWLpvHKNmX2QbpdpsBaWnRxahMwJjO+KZk2JOElj5nSmKezyS1B4u+QbHMTX69t4ukm6hh9lsYQ7GHCKA==", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.0.tgz", + "integrity": "sha512-aOOgh1/5XzKvg1jvVz7AVrx2piJ2XBi227DHmbY6y+bM9H2FlN+IfecYu4Xl0cNiiVejlsCri89LUsbj8vJD9Q==", "requires": { - "@babel/code-frame": "^7.23.5", - "@babel/parser": "^7.23.9", - "@babel/types": "^7.23.9" + "@babel/code-frame": "^7.24.7", + "@babel/parser": "^7.25.0", + "@babel/types": "^7.25.0" } }, "@babel/traverse": { - "version": "7.23.9", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.9.tgz", - "integrity": "sha512-I/4UJ9vs90OkBtY6iiiTORVMyIhJ4kAVmsKo9KFc8UOxMeUfi2hvtIBsET5u9GizXE6/GFSuKCTNfgCswuEjRg==", - "requires": { - "@babel/code-frame": "^7.23.5", - "@babel/generator": "^7.23.6", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.23.9", - "@babel/types": "^7.23.9", + "version": "7.25.3", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.3.tgz", + "integrity": "sha512-HefgyP1x754oGCsKmV5reSmtV7IXj/kpaE1XYY+D9G5PvKKoFfSbiS4M77MdjuwlZKDIKFCffq9rPU+H/s3ZdQ==", + "requires": { + "@babel/code-frame": "^7.24.7", + "@babel/generator": "^7.25.0", + "@babel/parser": "^7.25.3", + "@babel/template": "^7.25.0", + "@babel/types": "^7.25.2", "debug": "^4.3.1", "globals": "^11.1.0" }, @@ -10846,12 +8667,12 @@ } }, "@babel/types": { - "version": "7.23.9", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.9.tgz", - "integrity": "sha512-dQjSq/7HaSjRM43FFGnv5keM2HsxpmyV1PfaSVm0nzzjwwTmjOe6J4bC8e3+pTEIgHaHj+1ZlLThRJ2auc/w1Q==", + "version": "7.25.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.6.tgz", + "integrity": "sha512-/l42B1qxpG6RdfYf343Uw1vmDjeNhneUXtzhojE7pDgfpEypmRhI6j1kr17XCVv4Cgl9HdAiQY2x0GwKm7rWCw==", "requires": { - "@babel/helper-string-parser": "^7.23.4", - "@babel/helper-validator-identifier": "^7.22.20", + "@babel/helper-string-parser": "^7.24.8", + "@babel/helper-validator-identifier": "^7.24.7", "to-fast-properties": "^2.0.0" } }, @@ -10893,19 +8714,19 @@ } }, "@eslint/js": { - "version": "8.56.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.56.0.tgz", - "integrity": "sha512-gMsVel9D7f2HLkBma9VbtzZRehRogVRfbr++f06nL2vnCGCNlzOD+/MUov/F4p8myyAHspEhVobgjpX64q5m6A==", + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz", + "integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==", "dev": true }, "@humanwhocodes/config-array": { - "version": "0.11.13", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.13.tgz", - "integrity": "sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ==", + "version": "0.11.14", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", + "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==", "dev": true, "requires": { - "@humanwhocodes/object-schema": "^2.0.1", - "debug": "^4.1.1", + "@humanwhocodes/object-schema": "^2.0.2", + "debug": "^4.3.1", "minimatch": "^3.0.5" } }, @@ -10916,9 +8737,9 @@ "dev": true }, "@humanwhocodes/object-schema": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.1.tgz", - "integrity": "sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.2.tgz", + "integrity": "sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==", "dev": true }, "@isaacs/cliui": { @@ -11046,22 +8867,22 @@ "@jazzer.js/bug-detectors": { "version": "file:packages/bug-detectors", "requires": { - "@jazzer.js/core": "2.1.0", - "@jazzer.js/hooking": "2.1.0" + "@jazzer.js/core": "3.1.0", + "@jazzer.js/hooking": "3.1.0" } }, "@jazzer.js/core": { "version": "file:packages/core", "requires": { - "@jazzer.js/bug-detectors": "2.1.0", - "@jazzer.js/fuzzer": "2.1.0", - "@jazzer.js/hooking": "2.1.0", - "@jazzer.js/instrumentor": "2.1.0", - "@types/yargs": "^17.0.32", + "@jazzer.js/bug-detectors": "3.1.0", + "@jazzer.js/fuzzer": "3.1.0", + "@jazzer.js/hooking": "3.1.0", + "@jazzer.js/instrumentor": "3.1.0", + "@types/yargs": "^17.0.33", "istanbul-lib-coverage": "^3.2.2", "istanbul-lib-report": "^3.0.1", - "istanbul-reports": "^3.1.6", - "tmp": "^0.2.1", + "istanbul-reports": "^3.1.7", + "tmp": "^0.2.3", "yargs": "^17.7.2" } }, @@ -11069,40 +8890,34 @@ "version": "file:packages/fuzzer", "requires": { "@types/bindings": "^1.5.5", - "@types/node": "^20.11.17", + "@types/node": "^20.14.11", "bindings": "^1.5.0", "clang-format": "^1.8.0", "cmake-js": "^7.3.0", - "node-addon-api": "^7.1.0", - "prebuild": "^12.1.0", - "prebuild-install": "^7.1.1" + "node-addon-api": "^7.1.0" } }, "@jazzer.js/hooking": { - "version": "file:packages/hooking", - "requires": { - "@babel/core": "^7.23.9", - "@types/babel__core": "^7.20.5" - } + "version": "file:packages/hooking" }, "@jazzer.js/instrumentor": { "version": "file:packages/instrumentor", "requires": { - "@babel/core": "^7.23.9", - "@babel/generator": "^7.23.5", - "@jazzer.js/fuzzer": "2.1.0", - "@jazzer.js/hooking": "2.1.0", + "@babel/core": "^7.25.2", + "@babel/generator": "^7.25.6", + "@jazzer.js/fuzzer": "3.1.0", + "@jazzer.js/hooking": "3.1.0", "@types/babel__core": "^7.20.5", "@types/istanbul-lib-hook": "^2.0.4", "@types/istanbul-lib-instrument": "^1.7.7", - "@types/node": "^20.11.17", + "@types/node": "^20.14.11", "@types/proper-lockfile": "^4.1.4", "@types/source-map-support": "^0.5.10", "istanbul-lib-hook": "^3.0.0", - "istanbul-lib-instrument": "^6.0.1", + "istanbul-lib-instrument": "^6.0.3", "proper-lockfile": "^4.1.2", "source-map-support": "^0.5.21", - "typescript": "^5.3.3" + "typescript": "^5.6.2" }, "dependencies": { "source-map-support": { @@ -11119,11 +8934,11 @@ "@jazzer.js/jest-runner": { "version": "file:packages/jest-runner", "requires": { - "@jazzer.js/core": "2.1.0", + "@jazzer.js/core": "3.1.0", "@types/tmp": "^0.2.6", - "cosmiconfig": "^8.3.6", - "istanbul-reports": "^3.1.6", - "tmp": "^0.2.1" + "cosmiconfig": "^9.0.0", + "istanbul-reports": "^3.1.7", + "tmp": "^0.2.3" } }, "@jest/console": { @@ -11354,9 +9169,9 @@ "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==" }, "@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==" + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==" }, "@jridgewell/sourcemap-codec": { "version": "1.4.14", @@ -11364,12 +9179,12 @@ "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==" }, "@jridgewell/trace-mapping": { - "version": "0.3.18", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz", - "integrity": "sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==", + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", "requires": { - "@jridgewell/resolve-uri": "3.1.0", - "@jridgewell/sourcemap-codec": "1.4.14" + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" } }, "@nodelib/fs.scandir": { @@ -11398,15 +9213,6 @@ "fastq": "^1.6.0" } }, - "@npmcli/fs": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-3.1.0.tgz", - "integrity": "sha512-7kZUAaLscfgbwBQRbvdMYaZOWyMEcPTH/tJjnyAWJ/dvvs9Ef+CERx/qJb9GExJpl1qipaDGn7KqHnFGGixd0w==", - "dev": true, - "requires": { - "semver": "^7.3.5" - } - }, "@pkgjs/parseargs": { "version": "0.11.0", "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", @@ -11414,6 +9220,12 @@ "dev": true, "optional": true }, + "@rtsao/scc": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz", + "integrity": "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==", + "dev": true + }, "@sinclair/typebox": { "version": "0.27.8", "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", @@ -11435,12 +9247,6 @@ "@sinonjs/commons": "^3.0.0" } }, - "@tootallnate/once": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", - "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", - "dev": true - }, "@types/babel__core": { "version": "7.20.5", "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", @@ -11540,9 +9346,9 @@ } }, "@types/jest": { - "version": "29.5.12", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.12.tgz", - "integrity": "sha512-eDC8bTvT/QhYdxJAulQikueigY5AsdBRH2yDKW3yveW7svY3+DzN84/2NUgkw10RTiJbWqZrTtoGVdYlvFJdLw==", + "version": "29.5.13", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.13.tgz", + "integrity": "sha512-wd+MVEZCHt23V0/L642O5APvspWply/rGY5BcW4SUETo2UzPU3Z26qr8jC2qxpimI2jjx9h7+2cj2FwIr01bXg==", "requires": { "expect": "^29.0.0", "pretty-format": "^29.0.0" @@ -11561,9 +9367,9 @@ "dev": true }, "@types/node": { - "version": "20.11.17", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.17.tgz", - "integrity": "sha512-QmgQZGWu1Yw9TDyAP9ZzpFJKynYNeOvwMJmaxABfieQoVoiVOS6MN1WSpqpRcbeA5+RW82kraAVxCCJg+780Qw==", + "version": "20.14.11", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.11.tgz", + "integrity": "sha512-kprQpL8MMeszbz6ojB5/tU8PLN4kesnN8Gjzw349rDlNgsSzg90lAVj3llK99Dh7JON+t9AuscPPFW6mPbTnSA==", "requires": { "undici-types": "~5.26.4" } @@ -11610,9 +9416,9 @@ "dev": true }, "@types/yargs": { - "version": "17.0.32", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.32.tgz", - "integrity": "sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog==", + "version": "17.0.33", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.33.tgz", + "integrity": "sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==", "requires": { "@types/yargs-parser": "*" } @@ -11623,16 +9429,16 @@ "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==" }, "@typescript-eslint/eslint-plugin": { - "version": "6.20.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.20.0.tgz", - "integrity": "sha512-fTwGQUnjhoYHeSF6m5pWNkzmDDdsKELYrOBxhjMrofPqCkoC2k3B2wvGHFxa1CTIqkEn88nlW1HVMztjo2K8Hg==", + "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, "requires": { "@eslint-community/regexpp": "^4.5.1", - "@typescript-eslint/scope-manager": "6.20.0", - "@typescript-eslint/type-utils": "6.20.0", - "@typescript-eslint/utils": "6.20.0", - "@typescript-eslint/visitor-keys": "6.20.0", + "@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", @@ -11642,29 +9448,29 @@ }, "dependencies": { "@typescript-eslint/scope-manager": { - "version": "6.20.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.20.0.tgz", - "integrity": "sha512-p4rvHQRDTI1tGGMDFQm+GtxP1ZHyAh64WANVoyEcNMpaTFn3ox/3CcgtIlELnRfKzSs/DwYlDccJEtr3O6qBvA==", + "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, "requires": { - "@typescript-eslint/types": "6.20.0", - "@typescript-eslint/visitor-keys": "6.20.0" + "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/visitor-keys": "6.21.0" } }, "@typescript-eslint/types": { - "version": "6.20.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.20.0.tgz", - "integrity": "sha512-MM9mfZMAhiN4cOEcUOEx+0HmuaW3WBfukBZPCfwSqFnQy0grXYtngKCqpQN339X3RrwtzspWJrpbrupKYUSBXQ==", + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.21.0.tgz", + "integrity": "sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg==", "dev": true }, "@typescript-eslint/typescript-estree": { - "version": "6.20.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.20.0.tgz", - "integrity": "sha512-RnRya9q5m6YYSpBN7IzKu9FmLcYtErkDkc8/dKv81I9QiLLtVBHrjz+Ev/crAqgMNW2FCsoZF4g2QUylMnJz+g==", + "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, "requires": { - "@typescript-eslint/types": "6.20.0", - "@typescript-eslint/visitor-keys": "6.20.0", + "@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", @@ -11674,27 +9480,27 @@ } }, "@typescript-eslint/utils": { - "version": "6.20.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.20.0.tgz", - "integrity": "sha512-/EKuw+kRu2vAqCoDwDCBtDRU6CTKbUmwwI7SH7AashZ+W+7o8eiyy6V2cdOqN49KsTcASWsC5QeghYuRDTyOOg==", + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.21.0.tgz", + "integrity": "sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ==", "dev": true, "requires": { "@eslint-community/eslint-utils": "^4.4.0", "@types/json-schema": "^7.0.12", "@types/semver": "^7.5.0", - "@typescript-eslint/scope-manager": "6.20.0", - "@typescript-eslint/types": "6.20.0", - "@typescript-eslint/typescript-estree": "6.20.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": { - "version": "6.20.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.20.0.tgz", - "integrity": "sha512-E8Cp98kRe4gKHjJD4NExXKz/zOJ1A2hhZc+IMVD6i7w4yjIvh6VyuRI0gRtxAsXtoC35uGMaQ9rjI2zJaXDEAw==", + "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, "requires": { - "@typescript-eslint/types": "6.20.0", + "@typescript-eslint/types": "6.21.0", "eslint-visitor-keys": "^3.4.1" } }, @@ -11790,41 +9596,41 @@ } }, "@typescript-eslint/type-utils": { - "version": "6.20.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.20.0.tgz", - "integrity": "sha512-qnSobiJQb1F5JjN0YDRPHruQTrX7ICsmltXhkV536mp4idGAYrIyr47zF/JmkJtEcAVnIz4gUYJ7gOZa6SmN4g==", + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.21.0.tgz", + "integrity": "sha512-rZQI7wHfao8qMX3Rd3xqeYSMCL3SoiSQLBATSiVKARdFGCYSRvmViieZjqc58jKgs8Y8i9YvVVhRbHSTA4VBag==", "dev": true, "requires": { - "@typescript-eslint/typescript-estree": "6.20.0", - "@typescript-eslint/utils": "6.20.0", + "@typescript-eslint/typescript-estree": "6.21.0", + "@typescript-eslint/utils": "6.21.0", "debug": "^4.3.4", "ts-api-utils": "^1.0.1" }, "dependencies": { "@typescript-eslint/scope-manager": { - "version": "6.20.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.20.0.tgz", - "integrity": "sha512-p4rvHQRDTI1tGGMDFQm+GtxP1ZHyAh64WANVoyEcNMpaTFn3ox/3CcgtIlELnRfKzSs/DwYlDccJEtr3O6qBvA==", + "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, "requires": { - "@typescript-eslint/types": "6.20.0", - "@typescript-eslint/visitor-keys": "6.20.0" + "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/visitor-keys": "6.21.0" } }, "@typescript-eslint/types": { - "version": "6.20.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.20.0.tgz", - "integrity": "sha512-MM9mfZMAhiN4cOEcUOEx+0HmuaW3WBfukBZPCfwSqFnQy0grXYtngKCqpQN339X3RrwtzspWJrpbrupKYUSBXQ==", + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.21.0.tgz", + "integrity": "sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg==", "dev": true }, "@typescript-eslint/typescript-estree": { - "version": "6.20.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.20.0.tgz", - "integrity": "sha512-RnRya9q5m6YYSpBN7IzKu9FmLcYtErkDkc8/dKv81I9QiLLtVBHrjz+Ev/crAqgMNW2FCsoZF4g2QUylMnJz+g==", + "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, "requires": { - "@typescript-eslint/types": "6.20.0", - "@typescript-eslint/visitor-keys": "6.20.0", + "@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", @@ -11834,27 +9640,27 @@ } }, "@typescript-eslint/utils": { - "version": "6.20.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.20.0.tgz", - "integrity": "sha512-/EKuw+kRu2vAqCoDwDCBtDRU6CTKbUmwwI7SH7AashZ+W+7o8eiyy6V2cdOqN49KsTcASWsC5QeghYuRDTyOOg==", + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.21.0.tgz", + "integrity": "sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ==", "dev": true, "requires": { "@eslint-community/eslint-utils": "^4.4.0", "@types/json-schema": "^7.0.12", "@types/semver": "^7.5.0", - "@typescript-eslint/scope-manager": "6.20.0", - "@typescript-eslint/types": "6.20.0", - "@typescript-eslint/typescript-estree": "6.20.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": { - "version": "6.20.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.20.0.tgz", - "integrity": "sha512-E8Cp98kRe4gKHjJD4NExXKz/zOJ1A2hhZc+IMVD6i7w4yjIvh6VyuRI0gRtxAsXtoC35uGMaQ9rjI2zJaXDEAw==", + "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, "requires": { - "@typescript-eslint/types": "6.20.0", + "@typescript-eslint/types": "6.21.0", "eslint-visitor-keys": "^3.4.1" } }, @@ -11931,21 +9737,6 @@ "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", "dev": true }, - "abbrev": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", - "dev": true - }, - "abort-controller": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", - "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", - "dev": true, - "requires": { - "event-target-shim": "^5.0.0" - } - }, "acorn": { "version": "8.11.2", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.2.tgz", @@ -11959,40 +9750,6 @@ "dev": true, "requires": {} }, - "after": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/after/-/after-0.8.2.tgz", - "integrity": "sha512-QbJ0NTQ/I9DI3uSJA4cbexiwQeRAfjPScqIbSjUDd9TOrcg6pTkdgziesOqxBMBzit8vFCTwrP27t13vFOORRA==", - "dev": true - }, - "agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "dev": true, - "requires": { - "debug": "4" - } - }, - "agentkeepalive": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.5.0.tgz", - "integrity": "sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew==", - "dev": true, - "requires": { - "humanize-ms": "^1.2.1" - } - }, - "aggregate-error": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", - "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", - "dev": true, - "requires": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - } - }, "ajv": { "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", @@ -12005,12 +9762,6 @@ "uri-js": "^4.2.2" } }, - "ansi": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/ansi/-/ansi-0.3.1.tgz", - "integrity": "sha512-iFY7JCgHbepc0b82yLaw4IMortylNb6wG4kL+4R0C3iv6i+RHGHux/yUX5BTiRvSX/shMnngjR1YyNMnXEFh5A==", - "dev": true - }, "ansi-escapes": { "version": "4.3.2", "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", @@ -12076,55 +9827,29 @@ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" }, "array-buffer-byte-length": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz", - "integrity": "sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz", + "integrity": "sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==", "dev": true, "requires": { - "call-bind": "^1.0.2", - "is-array-buffer": "^3.0.1" + "call-bind": "^1.0.5", + "is-array-buffer": "^3.0.4" } }, "array-includes": { - "version": "3.1.7", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.7.tgz", - "integrity": "sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ==", + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.8.tgz", + "integrity": "sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==", "dev": true, "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "get-intrinsic": "^1.2.1", + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.4", "is-string": "^1.0.7" } }, - "array-index": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-index/-/array-index-1.0.0.tgz", - "integrity": "sha512-jesyNbBkLQgGZMSwA1FanaFjalb1mZUGxGeUEkSDidzgrbjBGhvizJkaItdhkt8eIHFOJC7nDsrXk+BaehTdRw==", - "dev": true, - "requires": { - "debug": "^2.2.0", - "es6-symbol": "^3.0.2" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - } - } - }, "array-union": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", @@ -12132,16 +9857,17 @@ "dev": true }, "array.prototype.findlastindex": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.3.tgz", - "integrity": "sha512-LzLoiOMAxvy+Gd3BAq3B7VeIgPdo+Q8hthvKtXybMvRV0jrXfJM/t8mw7nNlpEcVlVUnCnM2KSX4XU5HmpodOA==", + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.5.tgz", + "integrity": "sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==", "dev": true, "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0", - "get-intrinsic": "^1.2.1" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-shim-unscopables": "^1.0.2" } }, "array.prototype.flat": { @@ -12169,34 +9895,21 @@ } }, "arraybuffer.prototype.slice": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.1.tgz", - "integrity": "sha512-09x0ZWFEjj4WD8PDbykUwo3t9arLn8NIzmmYEJFpYekOAQjpkGSyrQhNoRTcwwcFRu+ycWF78QZ63oWTqSjBcw==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz", + "integrity": "sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==", "dev": true, "requires": { - "array-buffer-byte-length": "^1.0.0", - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "get-intrinsic": "^1.2.1", - "is-array-buffer": "^3.0.2", + "array-buffer-byte-length": "^1.0.1", + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.3", + "es-errors": "^1.2.1", + "get-intrinsic": "^1.2.3", + "is-array-buffer": "^3.0.4", "is-shared-array-buffer": "^1.0.2" } }, - "asn1": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", - "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", - "dev": true, - "requires": { - "safer-buffer": "~2.1.0" - } - }, - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", - "dev": true - }, "async": { "version": "3.2.4", "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", @@ -12209,22 +9922,13 @@ "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" }, "available-typed-arrays": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", - "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", - "dev": true - }, - "aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==", - "dev": true - }, - "aws4": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.12.0.tgz", - "integrity": "sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg==", - "dev": true + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "dev": true, + "requires": { + "possible-typed-array-names": "^1.0.0" + } }, "axios": { "version": "1.6.5", @@ -12236,12 +9940,6 @@ "proxy-from-env": "^1.1.0" } }, - "b4a": { - "version": "1.6.4", - "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.6.4.tgz", - "integrity": "sha512-fpWrvyVHEKyeEvbKZTVOeZF3VSKKWtJxFIxX/jaVPf+cLbGUSitjb49pHLqPV2BUNNZ0LcoeEGfE/YCpyDYHIw==", - "dev": true - }, "babel-jest": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", @@ -12331,20 +10029,6 @@ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" }, - "base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" - }, - "bcrypt-pbkdf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", - "dev": true, - "requires": { - "tweetnacl": "^0.14.3" - } - }, "bindings": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", @@ -12353,24 +10037,6 @@ "file-uri-to-path": "1.0.0" } }, - "bl": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/bl/-/bl-3.0.1.tgz", - "integrity": "sha512-jrCW5ZhfQ/Vt07WX1Ngs+yn9BDqPL/gw28S7s9H6QK/gupnizNzJAss5akW20ISgOrbLTlXOOCTJeNUQqruAWQ==", - "dev": true, - "requires": { - "readable-stream": "^3.0.1" - } - }, - "block-stream": { - "version": "0.0.9", - "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz", - "integrity": "sha512-OorbnJVPII4DuUKbjARAe8u8EfqOmkEEaSFIyoQ7OjTHn6kafxWl0wLgoZ2rXaYd7MyLcDaU4TmhfxtwgcccMQ==", - "dev": true, - "requires": { - "inherits": "~2.0.0" - } - }, "brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -12381,22 +10047,22 @@ } }, "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", "requires": { - "fill-range": "^7.0.1" + "fill-range": "^7.1.1" } }, "browserslist": { - "version": "4.22.2", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.2.tgz", - "integrity": "sha512-0UgcrvQmBDvZHFGdYUehrCNIazki7/lUP3kkoi/r3YB2amZbFM9J43ZRkJTXBUZK4gmx56+Sqk9+Vs9mwZx9+A==", + "version": "4.23.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.3.tgz", + "integrity": "sha512-btwCFJVjI4YWDNfau8RhZ+B1Q/VLoUITrm3RlP6y1tYGWIOa+InuYiRGXUBXo8nA1qKmHMyLB/iVQg5TT4eFoA==", "requires": { - "caniuse-lite": "^1.0.30001565", - "electron-to-chromium": "^1.4.601", - "node-releases": "^2.0.14", - "update-browserslist-db": "^1.0.13" + "caniuse-lite": "^1.0.30001646", + "electron-to-chromium": "^1.5.4", + "node-releases": "^2.0.18", + "update-browserslist-db": "^1.1.0" } }, "bs-logger": { @@ -12416,102 +10082,22 @@ "node-int64": "^0.4.0" } }, - "buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "requires": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - }, "buffer-from": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" }, - "cacache": { - "version": "17.1.4", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-17.1.4.tgz", - "integrity": "sha512-/aJwG2l3ZMJ1xNAnqbMpA40of9dj/pIH3QfiuQSqjfPJF747VR0J/bHn+/KdNnHKc6XQcWt/AfRSBft82W1d2A==", - "dev": true, - "requires": { - "@npmcli/fs": "^3.1.0", - "fs-minipass": "^3.0.0", - "glob": "^10.2.2", - "lru-cache": "^7.7.1", - "minipass": "^7.0.3", - "minipass-collect": "^1.0.2", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "p-map": "^4.0.0", - "ssri": "^10.0.0", - "tar": "^6.1.11", - "unique-filename": "^3.0.0" - }, - "dependencies": { - "brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0" - } - }, - "fs-minipass": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-3.0.3.tgz", - "integrity": "sha512-XUBA9XClHbnJWSfBzjkm6RvPsyg3sryZt06BEQoXcF7EK/xpGaQYJgQKDJSUH5SGZ76Y7pFx1QBnXz09rU5Fbw==", - "dev": true, - "requires": { - "minipass": "^7.0.3" - } - }, - "glob": { - "version": "10.3.10", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", - "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", - "dev": true, - "requires": { - "foreground-child": "^3.1.0", - "jackspeak": "^2.3.5", - "minimatch": "^9.0.1", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", - "path-scurry": "^1.10.1" - } - }, - "lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", - "dev": true - }, - "minimatch": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", - "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", - "dev": true, - "requires": { - "brace-expansion": "^2.0.1" - } - }, - "minipass": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", - "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", - "dev": true - } - } - }, "call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", + "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", "dev": true, "requires": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.1" } }, "callsites": { @@ -12525,15 +10111,9 @@ "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" }, "caniuse-lite": { - "version": "1.0.30001568", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001568.tgz", - "integrity": "sha512-vSUkH84HontZJ88MiNrOau1EBrCqEQYgkC5gIySiDlpsm8sGVrhU7Kx4V6h0tnqaHzIHZv08HlJIwPbL4XL9+A==" - }, - "caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==", - "dev": true + "version": "1.0.30001649", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001649.tgz", + "integrity": "sha512-fJegqZZ0ZX8HOWr6rcafGr72+xcgJKI9oWfDW5DrD7ExUtgZC7a7R7ZYmZqplh7XDocFdGeIFn7roAxhOeYrPQ==" }, "chalk": { "version": "4.1.2", @@ -12575,19 +10155,13 @@ "resolve": "^1.1.6" } }, - "clean-stack": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", - "dev": true - }, "cli-cursor": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-4.0.0.tgz", - "integrity": "sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-5.0.0.tgz", + "integrity": "sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==", "dev": true, "requires": { - "restore-cursor": "^4.0.0" + "restore-cursor": "^5.0.0" } }, "cli-truncate": { @@ -12613,9 +10187,9 @@ "dev": true }, "string-width": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.1.0.tgz", - "integrity": "sha512-SEIJCWiX7Kg4c129n48aDRwLbFb2LJmXXFrWBG4NGaRtMQ3myKPKbwrD1BKqQn74oCoNMBVrfDEr5M9YxCsrkw==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", "dev": true, "requires": { "emoji-regex": "^10.3.0", @@ -12691,12 +10265,6 @@ "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==" }, - "code-point-at": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA==", - "dev": true - }, "collect-v8-coverage": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz", @@ -12735,9 +10303,9 @@ } }, "commander": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-11.1.0.tgz", - "integrity": "sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==", + "version": "12.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz", + "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", "dev": true }, "concat-map": { @@ -12755,21 +10323,15 @@ "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==" }, - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==", - "dev": true - }, "cosmiconfig": { - "version": "8.3.6", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz", - "integrity": "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==", + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.0.tgz", + "integrity": "sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==", "requires": { + "env-paths": "^2.2.1", "import-fresh": "^3.3.0", "js-yaml": "^4.1.0", - "parse-json": "^5.2.0", - "path-type": "^4.0.0" + "parse-json": "^5.2.0" } }, "create-jest": { @@ -12787,48 +10349,54 @@ } }, "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==", "requires": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", "which": "^2.0.1" } }, - "d": { + "data-view-buffer": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", - "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", + "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.1.tgz", + "integrity": "sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==", "dev": true, "requires": { - "es5-ext": "^0.10.50", - "type": "^1.0.1" + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" } }, - "dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==", + "data-view-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz", + "integrity": "sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==", "dev": true, "requires": { - "assert-plus": "^1.0.0" + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" } }, - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "data-view-byte-offset": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz", + "integrity": "sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==", + "dev": true, "requires": { - "ms": "2.1.2" + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" } }, - "decompress-response": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", - "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "debug": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.6.tgz", + "integrity": "sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==", "requires": { - "mimic-response": "^3.1.0" + "ms": "2.1.2" } }, "dedent": { @@ -12861,12 +10429,24 @@ "strip-bom": "^4.0.0" } }, + "define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dev": true, + "requires": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + } + }, "define-properties": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz", - "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", "dev": true, "requires": { + "define-data-property": "^1.0.1", "has-property-descriptors": "^1.0.0", "object-keys": "^1.1.1" } @@ -12881,11 +10461,6 @@ "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==" }, - "detect-libc": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.2.tgz", - "integrity": "sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw==" - }, "detect-newline": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", @@ -12914,61 +10489,25 @@ "esutils": "^2.0.2" } }, - "duplexer2": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.0.2.tgz", - "integrity": "sha512-+AWBwjGadtksxjOQSFDhPNQbed7icNXApT4+2BNpsXzcCBiInq2H9XW0O8sfHFaPmnQRs7cg/P0fAr2IWQSW0g==", - "dev": true, - "requires": { - "readable-stream": "~1.1.9" - }, - "dependencies": { - "readable-stream": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", - "integrity": "sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==", - "dev": true - } - } - }, - "each-series-async": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/each-series-async/-/each-series-async-1.0.1.tgz", - "integrity": "sha512-G4zip/Ewpwr6JQxW7+2RNgkPd09h/UNec5UlvA/xKwl4qf5blyBNK6a/zjQc3MojgsxaOb93B9v3T92QU6IMVg==", - "dev": true - }, "eastasianwidth": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", "dev": true }, - "ecc-jsbn": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==", + "ejs": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz", + "integrity": "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==", "dev": true, "requires": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" + "jake": "^10.8.5" } }, "electron-to-chromium": { - "version": "1.4.610", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.610.tgz", - "integrity": "sha512-mqi2oL1mfeHYtOdCxbPQYV/PL7YrQlxbvFEZ0Ee8GbDdShimqt2/S6z2RWqysuvlwdOrQdqvE0KZrBTipAeJzg==" + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.4.tgz", + "integrity": "sha512-orzA81VqLyIGUEA77YkVA1D+N+nNfl2isJVjjmOyrlxuooZ19ynb+dOlaDTqd/idKRS9lDCSBmtzM+kyCsMnkA==" }, "emittery": { "version": "0.13.1", @@ -12981,40 +10520,21 @@ "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", "dev": true }, - "encoding": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", - "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", - "dev": true, - "optional": true, - "requires": { - "iconv-lite": "^0.6.2" - } - }, - "end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "requires": { - "once": "^1.4.0" - } - }, "entities": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/entities/-/entities-3.0.1.tgz", - "integrity": "sha512-WiyBqoomrwMdFG1e0kqvASYfnlb0lp8M5o5Fw2OFq1hNZxxcNk8Ik0Xm7LxzBhuidnZB/UtBqVCgUz3kBOP51Q==", + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", "dev": true }, "env-paths": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", - "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", - "dev": true + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==" }, - "err-code": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", - "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==", + "environment": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/environment/-/environment-1.1.0.tgz", + "integrity": "sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==", "dev": true }, "error-ex": { @@ -13026,119 +10546,118 @@ } }, "es-abstract": { - "version": "1.22.1", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.1.tgz", - "integrity": "sha512-ioRRcXMO6OFyRpyzV3kE1IIBd4WG5/kltnzdxSCqoP8CMGs/Li+M1uF5o7lOkZVFjDs+NLesthnF66Pg/0q0Lw==", - "dev": true, - "requires": { - "array-buffer-byte-length": "^1.0.0", - "arraybuffer.prototype.slice": "^1.0.1", - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", - "es-set-tostringtag": "^2.0.1", + "version": "1.23.3", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.3.tgz", + "integrity": "sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==", + "dev": true, + "requires": { + "array-buffer-byte-length": "^1.0.1", + "arraybuffer.prototype.slice": "^1.0.3", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "data-view-buffer": "^1.0.1", + "data-view-byte-length": "^1.0.1", + "data-view-byte-offset": "^1.0.0", + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-set-tostringtag": "^2.0.3", "es-to-primitive": "^1.2.1", - "function.prototype.name": "^1.1.5", - "get-intrinsic": "^1.2.1", - "get-symbol-description": "^1.0.0", + "function.prototype.name": "^1.1.6", + "get-intrinsic": "^1.2.4", + "get-symbol-description": "^1.0.2", "globalthis": "^1.0.3", "gopd": "^1.0.1", - "has": "^1.0.3", - "has-property-descriptors": "^1.0.0", - "has-proto": "^1.0.1", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.0.3", "has-symbols": "^1.0.3", - "internal-slot": "^1.0.5", - "is-array-buffer": "^3.0.2", + "hasown": "^2.0.2", + "internal-slot": "^1.0.7", + "is-array-buffer": "^3.0.4", "is-callable": "^1.2.7", - "is-negative-zero": "^2.0.2", + "is-data-view": "^1.0.1", + "is-negative-zero": "^2.0.3", "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.2", + "is-shared-array-buffer": "^1.0.3", "is-string": "^1.0.7", - "is-typed-array": "^1.1.10", + "is-typed-array": "^1.1.13", "is-weakref": "^1.0.2", - "object-inspect": "^1.12.3", + "object-inspect": "^1.13.1", "object-keys": "^1.1.1", - "object.assign": "^4.1.4", - "regexp.prototype.flags": "^1.5.0", - "safe-array-concat": "^1.0.0", - "safe-regex-test": "^1.0.0", - "string.prototype.trim": "^1.2.7", - "string.prototype.trimend": "^1.0.6", - "string.prototype.trimstart": "^1.0.6", - "typed-array-buffer": "^1.0.0", - "typed-array-byte-length": "^1.0.0", - "typed-array-byte-offset": "^1.0.0", - "typed-array-length": "^1.0.4", + "object.assign": "^4.1.5", + "regexp.prototype.flags": "^1.5.2", + "safe-array-concat": "^1.1.2", + "safe-regex-test": "^1.0.3", + "string.prototype.trim": "^1.2.9", + "string.prototype.trimend": "^1.0.8", + "string.prototype.trimstart": "^1.0.8", + "typed-array-buffer": "^1.0.2", + "typed-array-byte-length": "^1.0.1", + "typed-array-byte-offset": "^1.0.2", + "typed-array-length": "^1.0.6", "unbox-primitive": "^1.0.2", - "which-typed-array": "^1.1.10" - } - }, - "es-set-tostringtag": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz", - "integrity": "sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==", - "dev": true, - "requires": { - "get-intrinsic": "^1.1.3", - "has": "^1.0.3", - "has-tostringtag": "^1.0.0" + "which-typed-array": "^1.1.15" } }, - "es-shim-unscopables": { + "es-define-property": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz", - "integrity": "sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", + "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", "dev": true, "requires": { - "has": "^1.0.3" + "get-intrinsic": "^1.2.4" } }, - "es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "dev": true + }, + "es-object-atoms": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz", + "integrity": "sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==", "dev": true, "requires": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" + "es-errors": "^1.3.0" } }, - "es5-ext": { - "version": "0.10.62", - "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.62.tgz", - "integrity": "sha512-BHLqn0klhEpnOKSrzn/Xsz2UIW8j+cGmo9JLzr8BiUapV8hPL9+FliFqjwr9ngW7jWdnxv6eO+/LqyhJVqgrjA==", + "es-set-tostringtag": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz", + "integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==", "dev": true, "requires": { - "es6-iterator": "^2.0.3", - "es6-symbol": "^3.1.3", - "next-tick": "^1.1.0" + "get-intrinsic": "^1.2.4", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.1" } }, - "es6-iterator": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", - "integrity": "sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==", + "es-shim-unscopables": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz", + "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==", "dev": true, "requires": { - "d": "1", - "es5-ext": "^0.10.35", - "es6-symbol": "^3.1.1" + "hasown": "^2.0.0" } }, - "es6-symbol": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz", - "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==", + "es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", "dev": true, "requires": { - "d": "^1.0.1", - "ext": "^1.1.2" + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" } }, "escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==" + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", + "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==" }, "escape-string-regexp": { "version": "4.0.0", @@ -13147,16 +10666,16 @@ "dev": true }, "eslint": { - "version": "8.56.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.56.0.tgz", - "integrity": "sha512-Go19xM6T9puCOWntie1/P997aXxFsOi37JIHRWI514Hc6ZnaHGKY9xFhrU65RT6CcBEzZoGG1e6Nq+DT04ZtZQ==", + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz", + "integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==", "dev": true, "requires": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", "@eslint/eslintrc": "^2.1.4", - "@eslint/js": "8.56.0", - "@humanwhocodes/config-array": "^0.11.13", + "@eslint/js": "8.57.0", + "@humanwhocodes/config-array": "^0.11.14", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", "@ungap/structured-clone": "^1.2.0", @@ -13240,9 +10759,9 @@ } }, "eslint-module-utils": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.0.tgz", - "integrity": "sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==", + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.11.0.tgz", + "integrity": "sha512-gbBE5Hitek/oG6MUVj6sFuzEjA/ClzNflVrLovHi/JgLdC7fiN5gLAY1WIPW1a0V5I999MnsrvVrCOGmmVqDBQ==", "dev": true, "requires": { "debug": "^3.2.7" @@ -13267,26 +10786,27 @@ "requires": {} }, "eslint-plugin-import": { - "version": "2.29.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.29.1.tgz", - "integrity": "sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==", + "version": "2.30.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.30.0.tgz", + "integrity": "sha512-/mHNE9jINJfiD2EKkg1BKyPyUk4zdnT54YgbOgfjSakWT5oyX/qQLVNTkehyfpcMxZXMy1zyonZ2v7hZTX43Yw==", "dev": true, "requires": { - "array-includes": "^3.1.7", - "array.prototype.findlastindex": "^1.2.3", + "@rtsao/scc": "^1.1.0", + "array-includes": "^3.1.8", + "array.prototype.findlastindex": "^1.2.5", "array.prototype.flat": "^1.3.2", "array.prototype.flatmap": "^1.3.2", "debug": "^3.2.7", "doctrine": "^2.1.0", "eslint-import-resolver-node": "^0.3.9", - "eslint-module-utils": "^2.8.0", - "hasown": "^2.0.0", - "is-core-module": "^2.13.1", + "eslint-module-utils": "^2.9.0", + "hasown": "^2.0.2", + "is-core-module": "^2.15.1", "is-glob": "^4.0.3", "minimatch": "^3.1.2", - "object.fromentries": "^2.0.7", - "object.groupby": "^1.0.1", - "object.values": "^1.1.7", + "object.fromentries": "^2.0.8", + "object.groupby": "^1.0.3", + "object.values": "^1.2.0", "semver": "^6.3.1", "tsconfig-paths": "^3.15.0" }, @@ -13318,21 +10838,21 @@ } }, "eslint-plugin-jest": { - "version": "27.6.3", - "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-27.6.3.tgz", - "integrity": "sha512-+YsJFVH6R+tOiO3gCJon5oqn4KWc+mDq2leudk8mrp8RFubLOo9CVyi3cib4L7XMpxExmkmBZQTPDYVBzgpgOA==", + "version": "27.9.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-27.9.0.tgz", + "integrity": "sha512-QIT7FH7fNmd9n4se7FFKHbsLKGQiw885Ds6Y/sxKgCZ6natwCsXdgPOADnYVxN2QrRweF0FZWbJ6S7Rsn7llug==", "dev": true, "requires": { "@typescript-eslint/utils": "^5.10.0" } }, "eslint-plugin-markdownlint": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-markdownlint/-/eslint-plugin-markdownlint-0.5.0.tgz", - "integrity": "sha512-1wkjRz9hNgdM6kLLaxnFxfWf5e/y8lFjptN9aGj3Jfa8o3dC0lYgEkHOHWDEkuMBKYlHGShJlvIsaUs0JIFg5g==", + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-markdownlint/-/eslint-plugin-markdownlint-0.6.0.tgz", + "integrity": "sha512-idYAzR2k7tQ+zL6UC17I/zzkqM0t6/k50uGgO39tabryqVkJh8Qe57fhBhe7QN+17yqIVqFB9YJFzBCAOdSXjw==", "dev": true, "requires": { - "markdownlint": "0.29.0" + "markdownlint": "0.34.0" } }, "eslint-scope": { @@ -13413,24 +10933,12 @@ "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", "dev": true }, - "event-target-shim": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", - "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", - "dev": true - }, "eventemitter3": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==", "dev": true }, - "events": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", - "dev": true - }, "execa": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", @@ -13447,25 +10955,11 @@ "strip-final-newline": "^2.0.0" } }, - "execspawn": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/execspawn/-/execspawn-1.0.1.tgz", - "integrity": "sha512-s2k06Jy9i8CUkYe0+DxRlvtkZoOkwwfhB+Xxo5HGUtrISVW2m98jO2tr67DGRFxZwkjQqloA3v/tNtjhBRBieg==", - "dev": true, - "requires": { - "util-extend": "^1.0.1" - } - }, "exit": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==" }, - "expand-template": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", - "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==" - }, "expect": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz", @@ -13478,53 +10972,12 @@ "jest-util": "^29.7.0" } }, - "exponential-backoff": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.1.tgz", - "integrity": "sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw==", - "dev": true - }, - "ext": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/ext/-/ext-1.7.0.tgz", - "integrity": "sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==", - "dev": true, - "requires": { - "type": "^2.7.2" - }, - "dependencies": { - "type": { - "version": "2.7.2", - "resolved": "https://registry.npmjs.org/type/-/type-2.7.2.tgz", - "integrity": "sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==", - "dev": true - } - } - }, - "extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", - "dev": true - }, - "extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==", - "dev": true - }, "fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", "dev": true }, - "fast-fifo": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz", - "integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==", - "dev": true - }, "fast-glob": { "version": "3.2.12", "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", @@ -13591,10 +11044,39 @@ "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==" }, + "filelist": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", + "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", + "dev": true, + "requires": { + "minimatch": "^5.0.1" + }, + "dependencies": { + "brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0" + } + }, + "minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dev": true, + "requires": { + "brace-expansion": "^2.0.1" + } + } + } + }, "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", "requires": { "to-regex-range": "^5.0.1" } @@ -13637,9 +11119,9 @@ "dev": true }, "follow-redirects": { - "version": "1.15.5", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.5.tgz", - "integrity": "sha512-vSFWUON1B+yAw1VN4xMfxgn5fTUiaOzAJCKBwIIgT/+7CuGy9+r+5gITvP62j3RmaD5Ph65UaERdOSRGUzZtgw==" + "version": "1.15.6", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", + "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==" }, "for-each": { "version": "0.3.3", @@ -13668,12 +11150,6 @@ } } }, - "forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==", - "dev": true - }, "form-data": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", @@ -13684,11 +11160,6 @@ "mime-types": "^2.1.12" } }, - "fs-constants": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", - "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" - }, "fs-extra": { "version": "11.2.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", @@ -13705,6 +11176,16 @@ "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", "requires": { "minipass": "^3.0.0" + }, + "dependencies": { + "minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "requires": { + "yallist": "^4.0.0" + } + } } }, "fs.realpath": { @@ -13718,29 +11199,6 @@ "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", "optional": true }, - "fstream": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.12.tgz", - "integrity": "sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "inherits": "~2.0.0", - "mkdirp": ">=0.5 0", - "rimraf": "2" - }, - "dependencies": { - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - } - } - }, "function-bind": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", @@ -13818,15 +11276,16 @@ "dev": true }, "get-intrinsic": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", - "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", + "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", "dev": true, "requires": { - "function-bind": "^1.1.1", - "has": "^1.0.3", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", "has-proto": "^1.0.1", - "has-symbols": "^1.0.3" + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" } }, "get-package-type": { @@ -13840,62 +11299,16 @@ "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==" }, "get-symbol-description": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", - "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" - } - }, - "getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==", - "dev": true, - "requires": { - "assert-plus": "^1.0.0" - } - }, - "ghreleases": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/ghreleases/-/ghreleases-3.0.2.tgz", - "integrity": "sha512-QiR9mIYvRG7hd8JuQYoxeBNOelVuTp2DpdiByRywbCDBSJufK9Vq7VuhD8B+5uviMxZx2AEkCzye61Us9gYgnw==", - "dev": true, - "requires": { - "after": "~0.8.1", - "ghrepos": "~2.1.0", - "ghutils": "~3.2.0", - "lodash.uniq": "^4.5.0", - "simple-mime": "~0.1.0", - "url-template": "~2.0.6" - } - }, - "ghrepos": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/ghrepos/-/ghrepos-2.1.0.tgz", - "integrity": "sha512-6GM0ohSDTAv7xD6GsKfxJiV/CajoofRyUwu0E8l29d1o6lFAUxmmyMP/FH33afA20ZrXzxxcTtN6TsYvudMoAg==", - "dev": true, - "requires": { - "ghutils": "~3.2.0" - } - }, - "ghutils": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/ghutils/-/ghutils-3.2.6.tgz", - "integrity": "sha512-WpYHgLQkqU7Cv147wKUEThyj6qKHCdnAG2CL9RRsRQImVdLGdVqblJ3JUnj3ToQwgm1ALPS+FXgR0448AgGPUg==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz", + "integrity": "sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==", "dev": true, "requires": { - "jsonist": "~2.1.0", - "xtend": "~4.0.1" + "call-bind": "^1.0.5", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4" } }, - "github-from-package": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", - "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==" - }, "glob": { "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", @@ -13970,31 +11383,6 @@ "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", "dev": true }, - "har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==", - "dev": true - }, - "har-validator": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", - "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", - "dev": true, - "requires": { - "ajv": "^6.12.3", - "har-schema": "^2.0.0" - } - }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "requires": { - "function-bind": "^1.1.1" - } - }, "has-bigints": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", @@ -14007,18 +11395,18 @@ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" }, "has-property-descriptors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", - "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", "dev": true, "requires": { - "get-intrinsic": "^1.1.1" + "es-define-property": "^1.0.0" } }, "has-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", - "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", + "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", "dev": true }, "has-symbols": { @@ -14028,12 +11416,12 @@ "dev": true }, "has-tostringtag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", - "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", "dev": true, "requires": { - "has-symbols": "^1.0.2" + "has-symbols": "^1.0.3" } }, "has-unicode": { @@ -14042,9 +11430,9 @@ "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==" }, "hasown": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", - "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", "requires": { "function-bind": "^1.1.2" } @@ -14054,98 +11442,17 @@ "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==" }, - "http-cache-semantics": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", - "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==", - "dev": true - }, - "http-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", - "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", - "dev": true, - "requires": { - "@tootallnate/once": "2", - "agent-base": "6", - "debug": "4" - } - }, - "http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==", - "dev": true, - "requires": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" - } - }, - "https-proxy-agent": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", - "dev": true, - "requires": { - "agent-base": "6", - "debug": "4" - } - }, "human-signals": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==" }, - "humanize-ms": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", - "integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==", - "dev": true, - "requires": { - "ms": "^2.0.0" - } - }, "husky": { - "version": "8.0.3", - "resolved": "https://registry.npmjs.org/husky/-/husky-8.0.3.tgz", - "integrity": "sha512-+dQSyqPh4x1hlO1swXBiNb2HzTDN1I2IGLQx1GrBuiqFJfoMrnZWwVmatvSiO+Iz8fBUnf+lekwNo4c2LlXItg==", + "version": "9.1.6", + "resolved": "https://registry.npmjs.org/husky/-/husky-9.1.6.tgz", + "integrity": "sha512-sqbjZKK7kf44hfdE94EoX8MZNk0n7HeW37O4YrVGCF4wzgQjp+akPAkfUK5LZ6KuR/6sqeAVuXHji+RzQgOn5A==", "dev": true }, - "hyperquest": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/hyperquest/-/hyperquest-2.1.3.tgz", - "integrity": "sha512-fUuDOrB47PqNK/BAMOS13v41UoaqIxqSLHX6CAbOD7OfT+/GCWO1/vPLfTNutOeXrv1ikuaZ3yux+33Z9vh+rw==", - "dev": true, - "requires": { - "buffer-from": "^0.1.1", - "duplexer2": "~0.0.2", - "through2": "~0.6.3" - }, - "dependencies": { - "buffer-from": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-0.1.2.tgz", - "integrity": "sha512-RiWIenusJsmI2KcvqQABB83tLxCByE3upSP8QU3rJDMVFGPWLvPQJt/O1Su9moRWeH7d+Q2HYb68f6+v+tw2vg==", - "dev": true - } - } - }, - "iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "dev": true, - "optional": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - } - }, - "ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" - }, "ignore": { "version": "5.2.4", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", @@ -14175,12 +11482,6 @@ "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==" }, - "indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", - "dev": true - }, "inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", @@ -14201,31 +11502,24 @@ "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" }, "internal-slot": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz", - "integrity": "sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz", + "integrity": "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==", "dev": true, "requires": { - "get-intrinsic": "^1.2.0", - "has": "^1.0.3", + "es-errors": "^1.3.0", + "hasown": "^2.0.0", "side-channel": "^1.0.4" } }, - "ip": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz", - "integrity": "sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==", - "dev": true - }, "is-array-buffer": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", - "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz", + "integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==", "dev": true, "requires": { "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.0", - "is-typed-array": "^1.1.10" + "get-intrinsic": "^1.2.1" } }, "is-arrayish": { @@ -14259,11 +11553,20 @@ "dev": true }, "is-core-module": { - "version": "2.13.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", - "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", + "version": "2.15.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.1.tgz", + "integrity": "sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==", "requires": { - "hasown": "^2.0.0" + "hasown": "^2.0.2" + } + }, + "is-data-view": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.1.tgz", + "integrity": "sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==", + "dev": true, + "requires": { + "is-typed-array": "^1.1.13" } }, "is-date-object": { @@ -14301,16 +11604,10 @@ "is-extglob": "^2.1.1" } }, - "is-lambda": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz", - "integrity": "sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==", - "dev": true - }, "is-negative-zero": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", - "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", + "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", "dev": true }, "is-number": { @@ -14344,12 +11641,12 @@ } }, "is-shared-array-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", - "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz", + "integrity": "sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==", "dev": true, "requires": { - "call-bind": "^1.0.2" + "call-bind": "^1.0.7" } }, "is-stream": { @@ -14376,20 +11673,14 @@ } }, "is-typed-array": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.12.tgz", - "integrity": "sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==", + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz", + "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==", "dev": true, "requires": { - "which-typed-array": "^1.1.11" + "which-typed-array": "^1.1.14" } }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", - "dev": true - }, "is-weakref": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", @@ -14400,9 +11691,9 @@ } }, "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", "dev": true }, "isexe": { @@ -14410,12 +11701,6 @@ "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" }, - "isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==", - "dev": true - }, "istanbul-lib-coverage": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", @@ -14430,13 +11715,13 @@ } }, "istanbul-lib-instrument": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.1.tgz", - "integrity": "sha512-EAMEJBsYuyyztxMxW3g7ugGPkrZsV57v0Hmv3mm1uQsmB+QnZuepg731CRaIgeUVSdmsTngOkSnauNF8p7FIhA==", + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.3.tgz", + "integrity": "sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==", "requires": { - "@babel/core": "^7.12.3", - "@babel/parser": "^7.14.7", - "@istanbuljs/schema": "^0.1.2", + "@babel/core": "^7.23.9", + "@babel/parser": "^7.23.9", + "@istanbuljs/schema": "^0.1.3", "istanbul-lib-coverage": "^3.2.0", "semver": "^7.5.4" } @@ -14462,9 +11747,9 @@ } }, "istanbul-reports": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.6.tgz", - "integrity": "sha512-TLgnMkKg3iTDsQ9PbPTdpfAK2DzjF9mqUG7RMgcQl8oFjad8ob4laGxv5XV5U9MAfx8D6tSJiUyuAwzLicaxlg==", + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.7.tgz", + "integrity": "sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==", "requires": { "html-escaper": "^2.0.0", "istanbul-lib-report": "^3.0.0" @@ -14480,6 +11765,18 @@ "@pkgjs/parseargs": "^0.11.0" } }, + "jake": { + "version": "10.9.1", + "resolved": "https://registry.npmjs.org/jake/-/jake-10.9.1.tgz", + "integrity": "sha512-61btcOHNnLnsOdtLgA5efqQWjnSi/vow5HbI7HMdKKWqvrKR1bLK3BPlJn9gcSaP2ewuamUSMB5XEy76KUIS2w==", + "dev": true, + "requires": { + "async": "^3.2.3", + "chalk": "^4.0.2", + "filelist": "^1.0.4", + "minimatch": "^3.1.2" + } + }, "jest": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest/-/jest-29.7.0.tgz", @@ -14891,12 +12188,6 @@ "argparse": "^2.0.1" } }, - "jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==", - "dev": true - }, "jsesc": { "version": "2.5.2", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", @@ -14907,12 +12198,6 @@ "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" }, - "json-schema": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", - "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", - "dev": true - }, "json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", @@ -14925,12 +12210,6 @@ "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", "dev": true }, - "json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", - "dev": true - }, "json5": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", @@ -14945,30 +12224,6 @@ "universalify": "^2.0.0" } }, - "jsonist": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/jsonist/-/jsonist-2.1.2.tgz", - "integrity": "sha512-8yqmWJAC2VaYoSKQAbsfgCpGY5o/1etWzx6ZxaZrC4iGaHrHUZEo+a2MyF8w+2uTavTlHdLWaZUoR19UfBstxQ==", - "dev": true, - "requires": { - "bl": "~3.0.0", - "hyperquest": "~2.1.3", - "json-stringify-safe": "~5.0.1", - "xtend": "~4.0.1" - } - }, - "jsprim": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", - "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", - "dev": true, - "requires": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.4.0", - "verror": "1.10.0" - } - }, "kleur": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", @@ -14990,9 +12245,9 @@ } }, "lilconfig": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.0.0.tgz", - "integrity": "sha512-K2U4W2Ff5ibV7j7ydLr+zLAkIg5JJ4lPn1Ltsdt+Tz/IjQ8buJ55pZAxoP34lqIiwtF9iAvtLv3JGv7CAyAg+g==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.2.tgz", + "integrity": "sha512-eop+wDAvpItUys0FWkHIKeC9ybYrTGbU41U5K7+bttZZeohvnY7M9dZ5kB21GNWiFT2q1OoPTvncPCgSOVO5ow==", "dev": true }, "lines-and-columns": { @@ -15001,30 +12256,30 @@ "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" }, "linkify-it": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-4.0.1.tgz", - "integrity": "sha512-C7bfi1UZmoj8+PQx22XyeXCuBlokoyWQL5pWSP+EI6nzRylyThouddufc2c1NDIcP9k5agmN9fLpA7VNJfIiqw==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-5.0.0.tgz", + "integrity": "sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==", "dev": true, "requires": { - "uc.micro": "^1.0.1" + "uc.micro": "^2.0.0" } }, "lint-staged": { - "version": "15.2.2", - "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-15.2.2.tgz", - "integrity": "sha512-TiTt93OPh1OZOsb5B7k96A/ATl2AjIZo+vnzFZ6oHK5FuTk63ByDtxGQpHm+kFETjEWqgkF95M8FRXKR/LEBcw==", + "version": "15.2.10", + "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-15.2.10.tgz", + "integrity": "sha512-5dY5t743e1byO19P9I4b3x8HJwalIznL5E1FWYnU6OWw33KxNBSLAc6Cy7F2PsFEO8FKnLwjwm5hx7aMF0jzZg==", "dev": true, "requires": { - "chalk": "5.3.0", - "commander": "11.1.0", - "debug": "4.3.4", - "execa": "8.0.1", - "lilconfig": "3.0.0", - "listr2": "8.0.1", - "micromatch": "4.0.5", - "pidtree": "0.6.0", - "string-argv": "0.3.2", - "yaml": "2.3.4" + "chalk": "~5.3.0", + "commander": "~12.1.0", + "debug": "~4.3.6", + "execa": "~8.0.1", + "lilconfig": "~3.1.2", + "listr2": "~8.2.4", + "micromatch": "~4.0.8", + "pidtree": "~0.6.0", + "string-argv": "~0.3.2", + "yaml": "~2.5.0" }, "dependencies": { "chalk": { @@ -15113,16 +12368,16 @@ } }, "listr2": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/listr2/-/listr2-8.0.1.tgz", - "integrity": "sha512-ovJXBXkKGfq+CwmKTjluEqFi3p4h8xvkxGQQAQan22YCgef4KZ1mKGjzfGh6PL6AW5Csw0QiQPNuQyH+6Xk3hA==", + "version": "8.2.4", + "resolved": "https://registry.npmjs.org/listr2/-/listr2-8.2.4.tgz", + "integrity": "sha512-opevsywziHd3zHCVQGAj8zu+Z3yHNkkoYhWIGnq54RrCVwLz0MozotJEDnKsIBLvkfLGN6BLOyAeRrYI0pKA4g==", "dev": true, "requires": { "cli-truncate": "^4.0.0", "colorette": "^2.0.20", "eventemitter3": "^5.0.1", - "log-update": "^6.0.0", - "rfdc": "^1.3.0", + "log-update": "^6.1.0", + "rfdc": "^1.4.1", "wrap-ansi": "^9.0.0" }, "dependencies": { @@ -15145,9 +12400,9 @@ "dev": true }, "string-width": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.1.0.tgz", - "integrity": "sha512-SEIJCWiX7Kg4c129n48aDRwLbFb2LJmXXFrWBG4NGaRtMQ3myKPKbwrD1BKqQn74oCoNMBVrfDEr5M9YxCsrkw==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", "dev": true, "requires": { "emoji-regex": "^10.3.0", @@ -15203,50 +12458,26 @@ "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", "dev": true }, - "lodash.pad": { - "version": "4.5.1", - "resolved": "https://registry.npmjs.org/lodash.pad/-/lodash.pad-4.5.1.tgz", - "integrity": "sha512-mvUHifnLqM+03YNzeTBS1/Gr6JRFjd3rRx88FHWUvamVaT9k2O/kXha3yBSOwB9/DTQrSTLJNHvLBBt2FdX7Mg==", - "dev": true - }, - "lodash.padend": { - "version": "4.6.1", - "resolved": "https://registry.npmjs.org/lodash.padend/-/lodash.padend-4.6.1.tgz", - "integrity": "sha512-sOQs2aqGpbl27tmCS1QNZA09Uqp01ZzWfDUoD+xzTii0E7dSQfRKcRetFwa+uXaxaqL+TKm7CgD2JdKP7aZBSw==", - "dev": true - }, - "lodash.padstart": { - "version": "4.6.1", - "resolved": "https://registry.npmjs.org/lodash.padstart/-/lodash.padstart-4.6.1.tgz", - "integrity": "sha512-sW73O6S8+Tg66eY56DBk85aQzzUJDtpoXFBgELMd5P/SotAguo+1kYO6RuYgXxA4HJH3LFTFPASX6ET6bjfriw==", - "dev": true - }, - "lodash.uniq": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", - "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==", - "dev": true - }, "log-update": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/log-update/-/log-update-6.0.0.tgz", - "integrity": "sha512-niTvB4gqvtof056rRIrTZvjNYE4rCUzO6X/X+kYjd7WFxXeJ0NwEFnRxX6ehkvv3jTwrXnNdtAak5XYZuIyPFw==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/log-update/-/log-update-6.1.0.tgz", + "integrity": "sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w==", "dev": true, "requires": { - "ansi-escapes": "^6.2.0", - "cli-cursor": "^4.0.0", - "slice-ansi": "^7.0.0", + "ansi-escapes": "^7.0.0", + "cli-cursor": "^5.0.0", + "slice-ansi": "^7.1.0", "strip-ansi": "^7.1.0", "wrap-ansi": "^9.0.0" }, "dependencies": { "ansi-escapes": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-6.2.0.tgz", - "integrity": "sha512-kzRaCqXnpzWs+3z5ABPQiVke+iq0KXkHo8xiWV4RPTi5Yli0l97BEQuhXV1s7+aSU/fu1kUuxgS4MsQ0fRuygw==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-7.0.0.tgz", + "integrity": "sha512-GdYO7a61mR0fOlAsvC9/rIHf7L96sBc6dEWzeOu+KAea5bZyQRPIpojrVoI4AXGJS/ycu/fBTdLrUkA4ODrvjw==", "dev": true, "requires": { - "type-fest": "^3.0.0" + "environment": "^1.0.0" } }, "ansi-regex": { @@ -15287,9 +12518,9 @@ } }, "string-width": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.1.0.tgz", - "integrity": "sha512-SEIJCWiX7Kg4c129n48aDRwLbFb2LJmXXFrWBG4NGaRtMQ3myKPKbwrD1BKqQn74oCoNMBVrfDEr5M9YxCsrkw==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", "dev": true, "requires": { "emoji-regex": "^10.3.0", @@ -15306,12 +12537,6 @@ "ansi-regex": "^6.0.1" } }, - "type-fest": { - "version": "3.13.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-3.13.1.tgz", - "integrity": "sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g==", - "dev": true - }, "wrap-ansi": { "version": "9.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.0.tgz", @@ -15325,14 +12550,6 @@ } } }, - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "requires": { - "yallist": "^4.0.0" - } - }, "make-dir": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", @@ -15347,43 +12564,6 @@ "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", "dev": true }, - "make-fetch-happen": { - "version": "11.1.1", - "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-11.1.1.tgz", - "integrity": "sha512-rLWS7GCSTcEujjVBs2YqG7Y4643u8ucvCJeSRqiLYhesrDuzeuFIk37xREzAsfQaqzl8b9rNCE4m6J8tvX4Q8w==", - "dev": true, - "requires": { - "agentkeepalive": "^4.2.1", - "cacache": "^17.0.0", - "http-cache-semantics": "^4.1.1", - "http-proxy-agent": "^5.0.0", - "https-proxy-agent": "^5.0.0", - "is-lambda": "^1.0.1", - "lru-cache": "^7.7.1", - "minipass": "^5.0.0", - "minipass-fetch": "^3.0.0", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "negotiator": "^0.6.3", - "promise-retry": "^2.0.1", - "socks-proxy-agent": "^7.0.0", - "ssri": "^10.0.0" - }, - "dependencies": { - "lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", - "dev": true - }, - "minipass": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", - "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", - "dev": true - } - } - }, "makeerror": { "version": "1.0.12", "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", @@ -15393,38 +12573,39 @@ } }, "markdown-it": { - "version": "13.0.1", - "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-13.0.1.tgz", - "integrity": "sha512-lTlxriVoy2criHP0JKRhO2VDG9c2ypWCsT237eDiLqi09rmbKoUetyGHq2uOIRoRS//kfoJckS0eUzzkDR+k2Q==", + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-14.1.0.tgz", + "integrity": "sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==", "dev": true, "requires": { "argparse": "^2.0.1", - "entities": "~3.0.1", - "linkify-it": "^4.0.1", - "mdurl": "^1.0.1", - "uc.micro": "^1.0.5" + "entities": "^4.4.0", + "linkify-it": "^5.0.0", + "mdurl": "^2.0.0", + "punycode.js": "^2.3.1", + "uc.micro": "^2.1.0" } }, "markdownlint": { - "version": "0.29.0", - "resolved": "https://registry.npmjs.org/markdownlint/-/markdownlint-0.29.0.tgz", - "integrity": "sha512-ASAzqpODstu/Qsk0xW5BPgWnK/qjpBQ4e7IpsSvvFXcfYIjanLTdwFRJK1SIEEh0fGSMKXcJf/qhaZYHyME0wA==", + "version": "0.34.0", + "resolved": "https://registry.npmjs.org/markdownlint/-/markdownlint-0.34.0.tgz", + "integrity": "sha512-qwGyuyKwjkEMOJ10XN6OTKNOVYvOIi35RNvDLNxTof5s8UmyGHlCdpngRHoRGNvQVGuxO3BJ7uNSgdeX166WXw==", "dev": true, "requires": { - "markdown-it": "13.0.1", - "markdownlint-micromark": "0.1.5" + "markdown-it": "14.1.0", + "markdownlint-micromark": "0.1.9" } }, "markdownlint-micromark": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/markdownlint-micromark/-/markdownlint-micromark-0.1.5.tgz", - "integrity": "sha512-HvofNU4QCvfUCWnocQP1IAWaqop5wpWrB0mKB6SSh0fcpV0PdmQNS6tdUuFew1utpYlUvYYzz84oDkrD76GB9A==", + "version": "0.1.9", + "resolved": "https://registry.npmjs.org/markdownlint-micromark/-/markdownlint-micromark-0.1.9.tgz", + "integrity": "sha512-5hVs/DzAFa8XqYosbEAEg6ok6MF2smDj89ztn9pKkCtdKHVdPQuGMH7frFfYL9mLkvfFe4pTyAMffLbjf3/EyA==", "dev": true }, "mdurl": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", - "integrity": "sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-2.0.0.tgz", + "integrity": "sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==", "dev": true }, "memory-stream": { @@ -15447,11 +12628,11 @@ "dev": true }, "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==", "requires": { - "braces": "^3.0.2", + "braces": "^3.0.3", "picomatch": "^2.3.1" } }, @@ -15473,374 +12654,89 @@ "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==" }, - "mimic-response": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", - "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==" - }, - "minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==" - }, - "minipass": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.4.tgz", - "integrity": "sha512-I9WPbWHCGu8W+6k1ZiGpPu0GkoKBeorkfKNuAFBNS1HNFJvke82sxvI5bzcCNpWPorkOO5QQ+zomzzwRxejXiw==", - "requires": { - "yallist": "^4.0.0" - } - }, - "minipass-collect": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", - "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", - "dev": true, - "requires": { - "minipass": "^3.0.0" - } - }, - "minipass-fetch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-3.0.4.tgz", - "integrity": "sha512-jHAqnA728uUpIaFm7NWsCnqKT6UqZz7GcI/bDpPATuwYyKwJwW0remxSCxUlKiEty+eopHGa3oc8WxgQ1FFJqg==", - "dev": true, - "requires": { - "encoding": "^0.1.13", - "minipass": "^7.0.3", - "minipass-sized": "^1.0.3", - "minizlib": "^2.1.2" - }, - "dependencies": { - "minipass": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", - "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", - "dev": true - } - } - }, - "minipass-flush": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", - "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", - "dev": true, - "requires": { - "minipass": "^3.0.0" - } - }, - "minipass-pipeline": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", - "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", - "dev": true, - "requires": { - "minipass": "^3.0.0" - } - }, - "minipass-sized": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz", - "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==", - "dev": true, - "requires": { - "minipass": "^3.0.0" - } - }, - "minizlib": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", - "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", - "requires": { - "minipass": "^3.0.0", - "yallist": "^4.0.0" - } - }, - "mkdirp": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", - "dev": true, - "requires": { - "minimist": "^1.2.6" - } - }, - "mkdirp-classic": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", - "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==" - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, - "napi-build-utils": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz", - "integrity": "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==" - }, - "natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==" - }, - "negotiator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", - "dev": true - }, - "next-tick": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz", - "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==", - "dev": true - }, - "node-abi": { - "version": "3.47.0", - "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.47.0.tgz", - "integrity": "sha512-2s6B2CWZM//kPgwnuI0KrYwNjfdByE25zvAaEpq9IH4zcNsarH8Ihu/UuX6XMPEogDAxkuUFeZn60pXNHAqn3A==", - "requires": { - "semver": "^7.3.5" - } - }, - "node-addon-api": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.0.tgz", - "integrity": "sha512-mNcltoe1R8o7STTegSOHdnJNN7s5EUvhoS7ShnTHDyOSd+8H+UdWODq6qSv67PjC8Zc5JRT8+oLAMCr0SIXw7g==" - }, - "node-api-headers": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/node-api-headers/-/node-api-headers-1.1.0.tgz", - "integrity": "sha512-ucQW+SbYCUPfprvmzBsnjT034IGRB2XK8rRc78BgjNKhTdFKgAwAmgW704bKIBmcYW48it0Gkjpkd39Azrwquw==" - }, - "node-gyp": { - "version": "9.4.0", - "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-9.4.0.tgz", - "integrity": "sha512-dMXsYP6gc9rRbejLXmTbVRYjAHw7ppswsKyMxuxJxxOHzluIO1rGp9TOQgjFJ+2MCqcOcQTOPB/8Xwhr+7s4Eg==", - "dev": true, - "requires": { - "env-paths": "^2.2.0", - "exponential-backoff": "^3.1.1", - "glob": "^7.1.4", - "graceful-fs": "^4.2.6", - "make-fetch-happen": "^11.0.3", - "nopt": "^6.0.0", - "npmlog": "^6.0.0", - "rimraf": "^3.0.2", - "semver": "^7.3.5", - "tar": "^6.1.2", - "which": "^2.0.2" - }, - "dependencies": { - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - } - } - }, - "node-int64": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", - "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==" - }, - "node-ninja": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/node-ninja/-/node-ninja-1.0.2.tgz", - "integrity": "sha512-wMtWsG2QZI1Z5V7GciX9OI2DVT0PuDRIDQfe3L3rJsQ1qN1Gm3QQhoNtb4PMRi7gq4ByvEIYtPwHC7YbEf5yxw==", - "dev": true, - "requires": { - "fstream": "^1.0.0", - "glob": "3 || 4 || 5 || 6 || 7", - "graceful-fs": "^4.1.2", - "minimatch": "3", - "mkdirp": "^0.5.0", - "nopt": "2 || 3", - "npmlog": "0 || 1 || 2", - "osenv": "0", - "path-array": "^1.0.0", - "request": "2", - "rimraf": "2", - "semver": "2.x || 3.x || 4 || 5", - "tar": "^2.0.0", - "which": "1" - }, - "dependencies": { - "are-we-there-yet": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.7.tgz", - "integrity": "sha512-nxwy40TuMiUGqMyRHgCSWZ9FM4VAoRP4xUYSTv5ImRog+h9yISPbVH7H8fASCIzYn9wlEv4zvFL7uKDMCFQm3g==", - "dev": true, - "requires": { - "delegates": "^1.0.0", - "readable-stream": "^2.0.6" - } - }, - "gauge": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-1.2.7.tgz", - "integrity": "sha512-fVbU2wRE91yDvKUnrIaQlHKAWKY5e08PmztCrwuH5YVQ+Z/p3d0ny2T48o6uvAAXHIUnfaQdHkmxYbQft1eHVA==", - "dev": true, - "requires": { - "ansi": "^0.3.0", - "has-unicode": "^2.0.0", - "lodash.pad": "^4.1.0", - "lodash.padend": "^4.1.0", - "lodash.padstart": "^4.1.0" - } - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "dev": true - }, - "nopt": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", - "integrity": "sha512-4GUt3kSEYmk4ITxzB/b9vaIDfUVWN/Ml1Fwl11IlnIG2iaJ9O6WXZ9SrYM9NLI8OCBieN2Y8SWC2oJV0RQ7qYg==", - "dev": true, - "requires": { - "abbrev": "1" - } - }, - "npmlog": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-2.0.4.tgz", - "integrity": "sha512-DaL6RTb8Qh4tMe2ttPT1qWccETy2Vi5/8p+htMpLBeXJTr2CAqnF5WQtSP2eFpvaNbhLZ5uilDb98mRm4Q+lZQ==", - "dev": true, - "requires": { - "ansi": "~0.3.1", - "are-we-there-yet": "~1.1.2", - "gauge": "~1.2.5" - } - }, - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dev": true, - "requires": { - "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" - } - }, - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", - "dev": true - }, - "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, - "requires": { - "safe-buffer": "~5.1.0" - } - }, - "tar": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.2.tgz", - "integrity": "sha512-FCEhQ/4rE1zYv9rYXJw/msRqsnmlje5jHP6huWeBZ704jUTy02c5AZyWujpMR1ax6mVw9NyJMfuK2CMDWVIfgA==", - "dev": true, - "requires": { - "block-stream": "*", - "fstream": "^1.0.12", - "inherits": "2" - } - }, - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - } - } - }, - "node-releases": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", - "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==" - }, - "noop-logger": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/noop-logger/-/noop-logger-0.1.1.tgz", - "integrity": "sha512-6kM8CLXvuW5crTxsAtva2YLrRrDaiTIkIePWs9moLHqbFWT94WpNFjwS/5dfLfECg5i/lkmw3aoqVidxt23TEQ==", + "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 }, - "nopt": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-6.0.0.tgz", - "integrity": "sha512-ZwLpbTgdhuZUnZzjd7nb1ZV+4DoiC6/sfiVKok72ym/4Tlf+DFdlHYmT2JPmcNNWV6Pi3SDf1kT+A4r9RTuT9g==", - "dev": true, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "requires": { - "abbrev": "^1.0.0" + "brace-expansion": "^1.1.7" } }, - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" + "minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==" }, - "npm-path": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/npm-path/-/npm-path-2.0.4.tgz", - "integrity": "sha512-IFsj0R9C7ZdR5cP+ET342q77uSRdtWOlWpih5eC+lu29tIDbNEgDbzgVJ5UFvYHWhxDZ5TFkJafFioO0pPQjCw==", - "dev": true, + "minipass": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==" + }, + "minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", "requires": { - "which": "^1.2.10" + "minipass": "^3.0.0", + "yallist": "^4.0.0" }, "dependencies": { - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, + "minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", "requires": { - "isexe": "^2.0.0" + "yallist": "^4.0.0" } } } }, + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==" + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==" + }, + "node-addon-api": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.0.tgz", + "integrity": "sha512-mNcltoe1R8o7STTegSOHdnJNN7s5EUvhoS7ShnTHDyOSd+8H+UdWODq6qSv67PjC8Zc5JRT8+oLAMCr0SIXw7g==" + }, + "node-api-headers": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/node-api-headers/-/node-api-headers-1.1.0.tgz", + "integrity": "sha512-ucQW+SbYCUPfprvmzBsnjT034IGRB2XK8rRc78BgjNKhTdFKgAwAmgW704bKIBmcYW48it0Gkjpkd39Azrwquw==" + }, + "node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==" + }, + "node-releases": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz", + "integrity": "sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==" + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" + }, "npm-run-path": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", @@ -15849,34 +12745,6 @@ "path-key": "^3.0.0" } }, - "npm-which": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/npm-which/-/npm-which-3.0.1.tgz", - "integrity": "sha512-CM8vMpeFQ7MAPin0U3wzDhSGV0hMHNwHU0wjo402IVizPDrs45jSfSuoC+wThevY88LQti8VvaAnqYAeVy3I1A==", - "dev": true, - "requires": { - "commander": "^2.9.0", - "npm-path": "^2.0.2", - "which": "^1.2.10" - }, - "dependencies": { - "commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true - }, - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - } - } - }, "npmlog": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-6.0.2.tgz", @@ -15888,210 +12756,10 @@ "set-blocking": "^2.0.0" } }, - "number-is-nan": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ==", - "dev": true - }, - "nw-gyp": { - "version": "3.6.6", - "resolved": "https://registry.npmjs.org/nw-gyp/-/nw-gyp-3.6.6.tgz", - "integrity": "sha512-FeMnpFQWtEEMJ1BrSfK3T62CjuxaNl0mNHqdrxFcIF5XQdC3gaZYW4n+77lQLk8PE3Upfknkl9VRo6gDKJIHuA==", - "dev": true, - "requires": { - "fstream": "^1.0.0", - "glob": "^7.0.3", - "graceful-fs": "^4.1.2", - "minimatch": "^3.0.2", - "mkdirp": "^0.5.0", - "nopt": "2 || 3", - "npmlog": "0 || 1 || 2 || 3 || 4", - "osenv": "0", - "request": "2", - "rimraf": "2", - "semver": "~5.3.0", - "tar": "^2.0.0", - "which": "1" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", - "dev": true - }, - "aproba": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", - "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", - "dev": true - }, - "are-we-there-yet": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.7.tgz", - "integrity": "sha512-nxwy40TuMiUGqMyRHgCSWZ9FM4VAoRP4xUYSTv5ImRog+h9yISPbVH7H8fASCIzYn9wlEv4zvFL7uKDMCFQm3g==", - "dev": true, - "requires": { - "delegates": "^1.0.0", - "readable-stream": "^2.0.6" - } - }, - "gauge": { - "version": "2.7.4", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", - "integrity": "sha512-14x4kjc6lkD3ltw589k0NrPD6cCNTD6CWoVUNpB85+DrtONoZn+Rug6xZU5RvSC4+TZPxA5AnBibQYAvZn41Hg==", - "dev": true, - "requires": { - "aproba": "^1.0.3", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.0", - "object-assign": "^4.1.0", - "signal-exit": "^3.0.0", - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wide-align": "^1.1.0" - } - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw==", - "dev": true, - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "dev": true - }, - "nopt": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", - "integrity": "sha512-4GUt3kSEYmk4ITxzB/b9vaIDfUVWN/Ml1Fwl11IlnIG2iaJ9O6WXZ9SrYM9NLI8OCBieN2Y8SWC2oJV0RQ7qYg==", - "dev": true, - "requires": { - "abbrev": "1" - } - }, - "npmlog": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", - "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", - "dev": true, - "requires": { - "are-we-there-yet": "~1.1.2", - "console-control-strings": "~1.1.0", - "gauge": "~2.7.3", - "set-blocking": "~2.0.0" - } - }, - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dev": true, - "requires": { - "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" - } - }, - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "semver": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz", - "integrity": "sha512-mfmm3/H9+67MCVix1h+IXTpDwL6710LyHuk7+cWC9T1mE0qz4iHhh6r4hU2wrIT9iTsAAC2XQRvfblL028cpLw==", - "dev": true - }, - "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, - "requires": { - "safe-buffer": "~5.1.0" - } - }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw==", - "dev": true, - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "tar": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.2.tgz", - "integrity": "sha512-FCEhQ/4rE1zYv9rYXJw/msRqsnmlje5jHP6huWeBZ704jUTy02c5AZyWujpMR1ax6mVw9NyJMfuK2CMDWVIfgA==", - "dev": true, - "requires": { - "block-stream": "*", - "fstream": "^1.0.12", - "inherits": "2" - } - }, - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - } - } - }, - "oauth-sign": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", - "dev": true - }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", - "dev": true - }, "object-inspect": { - "version": "1.12.3", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", - "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.2.tgz", + "integrity": "sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==", "dev": true }, "object-keys": { @@ -16101,49 +12769,49 @@ "dev": true }, "object.assign": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", - "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", + "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", "dev": true, "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", "has-symbols": "^1.0.3", "object-keys": "^1.1.1" } }, "object.fromentries": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.7.tgz", - "integrity": "sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA==", + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz", + "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", "dev": true, "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0" } }, "object.groupby": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.1.tgz", - "integrity": "sha512-HqaQtqLnp/8Bn4GL16cj+CUYbnpe1bh0TtEaWvybszDG4tgxCJuRpV8VGuvNaI1fAnI4lUJzDG55MXcOH4JZcQ==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.3.tgz", + "integrity": "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==", "dev": true, "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "get-intrinsic": "^1.2.1" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2" } }, "object.values": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.7.tgz", - "integrity": "sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.0.tgz", + "integrity": "sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==", "dev": true, "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" } }, "once": { @@ -16176,28 +12844,6 @@ "type-check": "^0.4.0" } }, - "os-homedir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", - "integrity": "sha512-B5JU3cabzk8c67mRRd3ECmROafjYMXbuzlwtqdM8IbS8ktlTix8aFGb2bAGKrSRIlnfKwovGUUr72JUPyOb6kQ==", - "dev": true - }, - "os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", - "dev": true - }, - "osenv": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", - "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", - "dev": true, - "requires": { - "os-homedir": "^1.0.0", - "os-tmpdir": "^1.0.0" - } - }, "p-limit": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", @@ -16215,15 +12861,6 @@ "p-limit": "^3.0.2" } }, - "p-map": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", - "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", - "dev": true, - "requires": { - "aggregate-error": "^3.0.0" - } - }, "p-try": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", @@ -16248,15 +12885,6 @@ "lines-and-columns": "^1.1.6" } }, - "path-array": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-array/-/path-array-1.0.1.tgz", - "integrity": "sha512-teWG2rJTJJZi2kINKOsHcdIuHP7jy3D7pAsVgdhxMq8kaL2RnS5sg7YTlrClMVCIItcVbPTPI6eMBEoNxYahLA==", - "dev": true, - "requires": { - "array-index": "^1.0.0" - } - }, "path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", @@ -16304,18 +12932,13 @@ "path-type": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==" - }, - "performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", "dev": true }, "picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", + "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==" }, "picomatch": { "version": "2.3.1", @@ -16371,159 +12994,16 @@ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "requires": { - "p-limit": "^2.2.0" - } - } - } - }, - "prebuild": { - "version": "12.1.0", - "resolved": "https://registry.npmjs.org/prebuild/-/prebuild-12.1.0.tgz", - "integrity": "sha512-7VxOp28zmb68lVMAqNMYr8jyIIHdRp52MSki01jAsdgDlnQYsVNhRpC9nHoax2wVhV/fnbyUUb1u57qUjrbbEg==", - "dev": true, - "requires": { - "cmake-js": "^7.2.1", - "detect-libc": "^2.0.2", - "each-series-async": "^1.0.1", - "execspawn": "^1.0.1", - "ghreleases": "^3.0.2", - "github-from-package": "0.0.0", - "glob": "^7.2.3", - "minimist": "^1.2.8", - "napi-build-utils": "^1.0.2", - "node-abi": "^3.47.0", - "node-gyp": "^9.4.0", - "node-ninja": "^1.0.2", - "noop-logger": "^0.1.1", - "npm-which": "^3.0.1", - "npmlog": "^7.0.1", - "nw-gyp": "^3.6.6", - "rc": "^1.2.8", - "run-waterfall": "^1.1.7", - "tar-stream": "^3.1.6" - }, - "dependencies": { - "are-we-there-yet": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-4.0.1.tgz", - "integrity": "sha512-2zuA+jpOYBRgoBCfa+fB87Rk0oGJjDX6pxGzqH6f33NzUhG25Xur6R0u0Z9VVAq8Z5JvQpQI6j6rtonuivC8QA==", - "dev": true, - "requires": { - "delegates": "^1.0.0", - "readable-stream": "^4.1.0" - } - }, - "buffer": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", - "dev": true, - "requires": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" - } - }, - "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 - }, - "gauge": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-5.0.1.tgz", - "integrity": "sha512-CmykPMJGuNan/3S4kZOpvvPYSNqSHANiWnh9XcMU2pSjtBfF0XzZ2p1bFAxTbnFxyBuPxQYHhzwaoOmUdqzvxQ==", - "dev": true, - "requires": { - "aproba": "^1.0.3 || ^2.0.0", - "color-support": "^1.1.3", - "console-control-strings": "^1.1.0", - "has-unicode": "^2.0.1", - "signal-exit": "^4.0.1", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1", - "wide-align": "^1.1.5" - } - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true - }, - "npmlog": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-7.0.1.tgz", - "integrity": "sha512-uJ0YFk/mCQpLBt+bxN88AKd+gyqZvZDbtiNxk6Waqcj2aPRyfVx8ITawkyQynxUagInjdYT1+qj4NfA5KJJUxg==", - "dev": true, - "requires": { - "are-we-there-yet": "^4.0.0", - "console-control-strings": "^1.1.0", - "gauge": "^5.0.0", - "set-blocking": "^2.0.0" - } - }, - "readable-stream": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.4.2.tgz", - "integrity": "sha512-Lk/fICSyIhodxy1IDK2HazkeGjSmezAWX2egdtJnYhtzKEsBPJowlI6F6LPb5tqIQILrMbx22S5o3GuJavPusA==", - "dev": true, - "requires": { - "abort-controller": "^3.0.0", - "buffer": "^6.0.3", - "events": "^3.3.0", - "process": "^0.11.10", - "string_decoder": "^1.3.0" - } - }, - "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 - }, - "string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - }, - "tar-stream": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.6.tgz", - "integrity": "sha512-B/UyjYwPpMBv+PaFSWAmtYjwdrlEaZQEhMIBFNC5oEG8lpiW8XjcSdmEaClj28ArfKScKHs2nshz3k2le6crsg==", - "dev": true, - "requires": { - "b4a": "^1.6.4", - "fast-fifo": "^1.2.0", - "streamx": "^2.15.0" + "p-limit": "^2.2.0" } } } }, - "prebuild-install": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.1.tgz", - "integrity": "sha512-jAXscXWMcCK8GgCoHOfIr0ODh5ai8mj63L2nWrjuAgXE6tDyYGnx4/8o/rCgU+B4JSyZBKbeZqzhtwtC3ovxjw==", - "requires": { - "detect-libc": "^2.0.0", - "expand-template": "^2.0.3", - "github-from-package": "0.0.0", - "minimist": "^1.2.3", - "mkdirp-classic": "^0.5.3", - "napi-build-utils": "^1.0.1", - "node-abi": "^3.3.0", - "pump": "^3.0.0", - "rc": "^1.2.7", - "simple-get": "^4.0.0", - "tar-fs": "^2.0.0", - "tunnel-agent": "^0.6.0" - } + "possible-typed-array-names": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", + "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==", + "dev": true }, "prelude-ls": { "version": "1.2.1", @@ -16532,9 +13012,9 @@ "dev": true }, "prettier": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.1.0.tgz", - "integrity": "sha512-TQLvXjq5IAibjh8EpBIkNKxO749UEWABoiIZehEPiY4GNpVdhaFKqSTu+QrlU6D2dPAfubRmtJTi4K4YkQ5eXw==", + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.3.3.tgz", + "integrity": "sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==", "dev": true }, "pretty-format": { @@ -16554,28 +13034,6 @@ } } }, - "process": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", - "dev": true - }, - "process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "dev": true - }, - "promise-retry": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", - "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", - "dev": true, - "requires": { - "err-code": "^2.0.2", - "retry": "^0.12.0" - } - }, "prompts": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", @@ -16600,25 +13058,16 @@ "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" }, - "psl": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", - "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==", + "punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", "dev": true }, - "pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "punycode.js": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode.js/-/punycode.js-2.3.1.tgz", + "integrity": "sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==", "dev": true }, "pure-rand": { @@ -16626,24 +13075,12 @@ "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.0.4.tgz", "integrity": "sha512-LA0Y9kxMYv47GIPJy6MI84fqTd2HmYZI83W/kM/SkKfDlajnZYfmXFTxkbY+xSBPkLJxltMa9hIkmdc29eguMA==" }, - "qs": { - "version": "6.5.3", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", - "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==", - "dev": true - }, "queue-microtask": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", "dev": true }, - "queue-tick": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/queue-tick/-/queue-tick-1.0.1.tgz", - "integrity": "sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag==", - "dev": true - }, "rc": { "version": "1.2.8", "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", @@ -16678,55 +13115,15 @@ } }, "regexp.prototype.flags": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz", - "integrity": "sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==", + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz", + "integrity": "sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==", "dev": true, "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "functions-have-names": "^1.2.3" - } - }, - "request": { - "version": "2.88.2", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", - "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", - "dev": true, - "requires": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.3", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.5.0", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" - }, - "dependencies": { - "form-data": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", - "dev": true, - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - } - } + "call-bind": "^1.0.6", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", + "set-function-name": "^2.0.1" } }, "require-directory": { @@ -16770,13 +13167,30 @@ "integrity": "sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==" }, "restore-cursor": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-4.0.0.tgz", - "integrity": "sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-5.1.0.tgz", + "integrity": "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==", "dev": true, "requires": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" + "onetime": "^7.0.0", + "signal-exit": "^4.1.0" + }, + "dependencies": { + "onetime": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-7.0.0.tgz", + "integrity": "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==", + "dev": true, + "requires": { + "mimic-function": "^5.0.0" + } + }, + "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 + } } }, "retry": { @@ -16791,15 +13205,15 @@ "dev": true }, "rfdc": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.1.tgz", - "integrity": "sha512-r5a3l5HzYlIC68TpmYKlxWjmOP6wiPJ1vWv2HeLhNsRZMrCkxeqxiHlQ21oXmQ4F3SiryXBHhAD7JZqvOJjFmg==", + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz", + "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==", "dev": true }, "rimraf": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-5.0.5.tgz", - "integrity": "sha512-CqDakW+hMe/Bz202FPEymy68P+G50RfMQK+Qo5YUqc9SPipvbGjCGKd0RSKEelbsfQuw3g5NZDSrlZZAJurH1A==", + "version": "5.0.7", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-5.0.7.tgz", + "integrity": "sha512-nV6YcJo5wbLW77m+8KjH8aB/7/rxQy9SZ0HY5shnwULfS+9nmTtVXAJET5NdZmCzA4fPI/Hm1wo/Po/4mopOdg==", "dev": true, "requires": { "glob": "^10.3.7" @@ -16859,30 +13273,16 @@ "integrity": "sha512-ql6P2LzhBTTDfzKts+Qo4H94VUKpxKDFz6QxxwaUZN0mwvi7L3lpOI7BqPCq7lgDh3XLl0dpeXwfcVIitlrYrw==", "dev": true }, - "run-waterfall": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/run-waterfall/-/run-waterfall-1.1.7.tgz", - "integrity": "sha512-iFPgh7SatHXOG1ClcpdwHI63geV3Hc/iL6crGSyBlH2PY7Rm/za+zoKz6FfY/Qlw5K7JwSol8pseO8fN6CMhhQ==", - "dev": true - }, "safe-array-concat": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.0.0.tgz", - "integrity": "sha512-9dVEFruWIsnie89yym+xWTAYASdpw3CJV7Li/6zBewGf9z2i1j31rP6jnY0pHEO4QZh6N0K11bFjWmdR8UGdPQ==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.2.tgz", + "integrity": "sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==", "dev": true, "requires": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.0", + "call-bind": "^1.0.7", + "get-intrinsic": "^1.2.4", "has-symbols": "^1.0.3", "isarray": "^2.0.5" - }, - "dependencies": { - "isarray": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", - "dev": true - } } }, "safe-buffer": { @@ -16891,35 +13291,52 @@ "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" }, "safe-regex-test": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", - "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz", + "integrity": "sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==", "dev": true, "requires": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.3", + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", "is-regex": "^1.1.4" } }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true - }, "semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "requires": { - "lru-cache": "^6.0.0" - } + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==" }, "set-blocking": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==" }, + "set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "dev": true, + "requires": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + } + }, + "set-function-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", + "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", + "dev": true, + "requires": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.2" + } + }, "shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -16934,14 +13351,15 @@ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==" }, "side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", + "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", "dev": true, "requires": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", + "object-inspect": "^1.13.1" } }, "signal-exit": { @@ -16949,27 +13367,6 @@ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" }, - "simple-concat": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", - "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==" - }, - "simple-get": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz", - "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==", - "requires": { - "decompress-response": "^6.0.0", - "once": "^1.3.1", - "simple-concat": "^1.0.0" - } - }, - "simple-mime": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/simple-mime/-/simple-mime-0.1.0.tgz", - "integrity": "sha512-2EoTElzj77w0hV4lW6nWdA+MR+81hviMBhEc/ppUi0+Q311EFCvwKrGS7dcxqvGRKnUdbAyqPJtBQbRYgmtmvQ==", - "dev": true - }, "sisteransi": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", @@ -16998,33 +13395,6 @@ } } }, - "smart-buffer": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", - "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", - "dev": true - }, - "socks": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.7.1.tgz", - "integrity": "sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==", - "dev": true, - "requires": { - "ip": "^2.0.0", - "smart-buffer": "^4.2.0" - } - }, - "socks-proxy-agent": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-7.0.0.tgz", - "integrity": "sha512-Fgl0YPZ902wEsAyiQ+idGd1A7rSFx/ayC1CQVMw5P+EQx2V0SgpGtf6OKFhVjPflPUl9YMmEOnmfjCdMUsygww==", - "dev": true, - "requires": { - "agent-base": "^6.0.2", - "debug": "^4.3.3", - "socks": "^2.6.2" - } - }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -17044,40 +13414,6 @@ "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==" }, - "sshpk": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz", - "integrity": "sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==", - "dev": true, - "requires": { - "asn1": "~0.2.3", - "assert-plus": "^1.0.0", - "bcrypt-pbkdf": "^1.0.0", - "dashdash": "^1.12.0", - "ecc-jsbn": "~0.1.1", - "getpass": "^0.1.1", - "jsbn": "~0.1.0", - "safer-buffer": "^2.0.2", - "tweetnacl": "~0.14.0" - } - }, - "ssri": { - "version": "10.0.5", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-10.0.5.tgz", - "integrity": "sha512-bSf16tAFkGeRlUNDjXu8FzaMQt6g2HZJrun7mtMbIPOddxt3GLMSz5VWUWcqTJUPfLEaDIepGxv+bYQW49596A==", - "dev": true, - "requires": { - "minipass": "^7.0.3" - }, - "dependencies": { - "minipass": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", - "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", - "dev": true - } - } - }, "stack-utils": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", @@ -17093,16 +13429,6 @@ } } }, - "streamx": { - "version": "2.15.1", - "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.15.1.tgz", - "integrity": "sha512-fQMzy2O/Q47rgwErk/eGeLu/roaFWV0jVsogDmrszM9uIw8L5OA+t+V93MgYlufNptfjmYR1tOMWhei/Eh7TQA==", - "dev": true, - "requires": { - "fast-fifo": "^1.1.0", - "queue-tick": "^1.0.1" - } - }, "string_decoder": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", @@ -17180,36 +13506,37 @@ } }, "string.prototype.trim": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz", - "integrity": "sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg==", + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz", + "integrity": "sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==", "dev": true, "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.0", + "es-object-atoms": "^1.0.0" } }, "string.prototype.trimend": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz", - "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz", + "integrity": "sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==", "dev": true, "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" } }, "string.prototype.trimstart": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz", - "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", + "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", "dev": true, "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" } }, "strip-ansi": { @@ -17258,9 +13585,9 @@ "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==" }, "tar": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.0.tgz", - "integrity": "sha512-/Wo7DcT0u5HUV486xg675HtjNd3BXZ6xDbzsCUZPt5iw8bTQ63bP0Raut3mvro9u+CUyq7YQd8Cx55fsZXxqLQ==", + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz", + "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==", "requires": { "chownr": "^2.0.0", "fs-minipass": "^2.0.0", @@ -17268,60 +13595,6 @@ "minizlib": "^2.1.1", "mkdirp": "^1.0.3", "yallist": "^4.0.0" - }, - "dependencies": { - "minipass": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", - "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==" - }, - "mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==" - } - } - }, - "tar-fs": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", - "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==", - "requires": { - "chownr": "^1.1.1", - "mkdirp-classic": "^0.5.2", - "pump": "^3.0.0", - "tar-stream": "^2.1.4" - }, - "dependencies": { - "chownr": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" - } - } - }, - "tar-stream": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", - "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", - "requires": { - "bl": "^4.0.3", - "end-of-stream": "^1.4.1", - "fs-constants": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^3.1.1" - }, - "dependencies": { - "bl": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", - "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", - "requires": { - "buffer": "^5.5.0", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" - } - } } }, "test-exclude": { @@ -17340,53 +13613,10 @@ "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", "dev": true }, - "through2": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", - "integrity": "sha512-RkK/CCESdTKQZHdmKICijdKKsCRVHs5KsLZ6pACAmF/1GPUQhonHSXWNERctxEp7RmvjdNbZTL5z9V7nSCXKcg==", - "dev": true, - "requires": { - "readable-stream": ">=1.0.33-1 <1.1.0-0", - "xtend": ">=4.0.0 <4.1.0-0" - }, - "dependencies": { - "readable-stream": { - "version": "1.0.34", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==", - "dev": true - } - } - }, "tmp": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", - "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", - "requires": { - "rimraf": "^3.0.0" - }, - "dependencies": { - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "requires": { - "glob": "^7.1.3" - } - } - } + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.3.tgz", + "integrity": "sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w==" }, "tmpl": { "version": "1.0.5", @@ -17406,16 +13636,6 @@ "is-number": "^7.0.0" } }, - "tough-cookie": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", - "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", - "dev": true, - "requires": { - "psl": "^1.1.28", - "punycode": "^2.1.1" - } - }, "ts-api-utils": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.0.1.tgz", @@ -17424,19 +13644,20 @@ "requires": {} }, "ts-jest": { - "version": "29.1.2", - "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.1.2.tgz", - "integrity": "sha512-br6GJoH/WUX4pu7FbZXuWGKGNDuU7b8Uj77g/Sp7puZV6EXzuByl6JrECvm0MzVzSTkSHWTihsXt+5XYER5b+g==", + "version": "29.2.5", + "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.2.5.tgz", + "integrity": "sha512-KD8zB2aAZrcKIdGk4OwpJggeLcH1FgrICqDSROWqlnJXGCXK4Mn6FcdK2B6670Xr73lHMG1kHw8R87A0ecZ+vA==", "dev": true, "requires": { - "bs-logger": "0.x", - "fast-json-stable-stringify": "2.x", + "bs-logger": "^0.2.6", + "ejs": "^3.1.10", + "fast-json-stable-stringify": "^2.1.0", "jest-util": "^29.0.0", "json5": "^2.2.3", - "lodash.memoize": "4.x", - "make-error": "1.x", - "semver": "^7.5.3", - "yargs-parser": "^21.0.1" + "lodash.memoize": "^4.1.2", + "make-error": "^1.3.6", + "semver": "^7.6.3", + "yargs-parser": "^21.1.1" } }, "tsconfig-paths": { @@ -17485,26 +13706,6 @@ } } }, - "tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", - "requires": { - "safe-buffer": "^5.0.1" - } - }, - "tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==", - "dev": true - }, - "type": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", - "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==", - "dev": true - }, "type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", @@ -17526,62 +13727,67 @@ "dev": true }, "typed-array-buffer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz", - "integrity": "sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz", + "integrity": "sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==", "dev": true, "requires": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.1", - "is-typed-array": "^1.1.10" + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.13" } }, "typed-array-byte-length": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz", - "integrity": "sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz", + "integrity": "sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==", "dev": true, "requires": { - "call-bind": "^1.0.2", + "call-bind": "^1.0.7", "for-each": "^0.3.3", - "has-proto": "^1.0.1", - "is-typed-array": "^1.1.10" + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13" } }, "typed-array-byte-offset": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz", - "integrity": "sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz", + "integrity": "sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==", "dev": true, "requires": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", "for-each": "^0.3.3", - "has-proto": "^1.0.1", - "is-typed-array": "^1.1.10" + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13" } }, "typed-array-length": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", - "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.6.tgz", + "integrity": "sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==", "dev": true, "requires": { - "call-bind": "^1.0.2", + "call-bind": "^1.0.7", "for-each": "^0.3.3", - "is-typed-array": "^1.1.9" + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13", + "possible-typed-array-names": "^1.0.0" } }, "typescript": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.3.3.tgz", - "integrity": "sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==", + "version": "5.6.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.6.2.tgz", + "integrity": "sha512-NW8ByodCSNCwZeghjN3o+JX5OFH0Ojg6sadjEKY4huZ52TqbJTJnDo5+Tw98lSy63NZvi4n+ez5m2u5d4PkZyw==", "devOptional": true }, "uc.micro": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz", - "integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-2.1.0.tgz", + "integrity": "sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==", "dev": true }, "unbox-primitive": { @@ -17601,36 +13807,18 @@ "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==" }, - "unique-filename": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-3.0.0.tgz", - "integrity": "sha512-afXhuC55wkAmZ0P18QsVE6kp8JaxrEokN2HGIoIVv2ijHQd419H0+6EigAFcIzXeMIkcIkNBpB3L/DXB3cTS/g==", - "dev": true, - "requires": { - "unique-slug": "^4.0.0" - } - }, - "unique-slug": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-4.0.0.tgz", - "integrity": "sha512-WrcA6AyEfqDX5bWige/4NQfPZMtASNVxdmWR76WESYQVAACSgWcR6e9i0mofqqBxYFtL4oAxPIptY73/0YE1DQ==", - "dev": true, - "requires": { - "imurmurhash": "^0.1.4" - } - }, "universalify": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==" }, "update-browserslist-db": { - "version": "1.0.13", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", - "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.0.tgz", + "integrity": "sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==", "requires": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" + "escalade": "^3.1.2", + "picocolors": "^1.0.1" } }, "uri-js": { @@ -17647,29 +13835,11 @@ "resolved": "https://registry.npmjs.org/url-join/-/url-join-4.0.1.tgz", "integrity": "sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA==" }, - "url-template": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/url-template/-/url-template-2.0.8.tgz", - "integrity": "sha512-XdVKMF4SJ0nP/O7XIPB0JwAEuT9lDIYnNsK8yGVe43y0AWoKeJNdv3ZNWh7ksJ6KqQFjOO6ox/VEitLnaVNufw==", - "dev": true - }, "util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" }, - "util-extend": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/util-extend/-/util-extend-1.0.3.tgz", - "integrity": "sha512-mLs5zAK+ctllYBj+iAQvlDCwoxU/WDOUaJkcFudeiAX6OajC6BKXJUa9a+tbtkC11dz2Ufb7h0lyvIOVn4LADA==", - "dev": true - }, - "uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", - "dev": true - }, "v8-to-istanbul": { "version": "9.1.1", "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.1.1.tgz", @@ -17680,17 +13850,6 @@ "convert-source-map": "^1.6.0" } }, - "verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==", - "dev": true, - "requires": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" - } - }, "walker": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", @@ -17721,16 +13880,16 @@ } }, "which-typed-array": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.11.tgz", - "integrity": "sha512-qe9UWWpkeG5yzZ0tNYxDmd7vo58HDBc39mZ0xWWpolAGADdFOzkfamWLDxkOWcvHQKVmdTyQdLD4NOfjLWTKew==", + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.15.tgz", + "integrity": "sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==", "dev": true, "requires": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", "for-each": "^0.3.3", "gopd": "^1.0.1", - "has-tostringtag": "^1.0.0" + "has-tostringtag": "^1.0.2" } }, "wide-align": { @@ -17845,12 +14004,6 @@ "signal-exit": "^3.0.7" } }, - "xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", - "dev": true - }, "y18n": { "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", @@ -17862,9 +14015,9 @@ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" }, "yaml": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.4.tgz", - "integrity": "sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA==", + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.5.0.tgz", + "integrity": "sha512-2wWLbGbYDiSqqIKoPjar3MPgB94ErzCtrNE1FdqGuaO0pi2JGjmE8aW8TDZwzU7vuxcGRdL/4gPQwQ7hD5AMSw==", "dev": true }, "yargs": { diff --git a/package.json b/package.json index 8041c5680..cf42c07ad 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "jazzer.js", - "version": "2.1.0", + "version": "3.1.0", "description": "Coverage-guided, in-process fuzzing for Node.js", "homepage": "https://github.com/CodeIntelligenceTesting/jazzer.js#readme", "keywords": [ @@ -17,7 +17,7 @@ "url": "git+https://github.com/CodeIntelligenceTesting/jazzer.js.git" }, "scripts": { - "prepare": "husky install", + "prepare": "husky || true", "build": "tsc -b tsconfig.build.json", "clean": "rimraf -g **/node_modules **/tests/**/package-lock.json **/examples/**/package-lock.json **/dist **/coverage packages/fuzzer/build packages/fuzzer/prebuilds", "compile:watch": "tsc -b tsconfig.build.json --incremental --pretty --watch", @@ -40,25 +40,25 @@ }, "devDependencies": { "@types/bindings": "^1.5.5", - "@types/jest": "^29.5.12", - "@types/node": "^20.11.17", - "@types/yargs": "^17.0.32", - "@typescript-eslint/eslint-plugin": "^6.20.0", - "eslint": "^8.56.0", + "@types/jest": "^29.5.13", + "@types/node": "^20.14.11", + "@types/yargs": "^17.0.33", + "@typescript-eslint/eslint-plugin": "^6.21.0", + "eslint": "^8.57.0", "eslint-config-prettier": "^9.1.0", "eslint-plugin-header": "^3.1.1", - "eslint-plugin-import": "^2.29.1", - "eslint-plugin-jest": "^27.6.3", - "eslint-plugin-markdownlint": "^0.5.0", - "husky": "^8.0.3", + "eslint-plugin-import": "^2.30.0", + "eslint-plugin-jest": "^27.9.0", + "eslint-plugin-markdownlint": "^0.6.0", + "husky": "^9.1.6", "istanbul-lib-coverage": "^3.2.2", "jest": "^29.7.0", - "lint-staged": "^15.2.2", - "prettier": "3.1.0", - "rimraf": "^5.0.5", + "lint-staged": "^15.2.10", + "prettier": "3.3.3", + "rimraf": "^5.0.7", "run-script-os": "^1.1.6", - "ts-jest": "^29.1.2", - "typescript": "^5.3.3" + "ts-jest": "^29.2.5", + "typescript": "^5.6.2" }, "workspaces": [ "packages/*" diff --git a/packages/bug-detectors/README.md b/packages/bug-detectors/README.md index 8e766a5c5..064bdd1d8 100644 --- a/packages/bug-detectors/README.md +++ b/packages/bug-detectors/README.md @@ -1,8 +1,8 @@ # @jazzer.js/bug-detectors The `@jazzer.js/bug-detectors` module is used by -[Jazzer.js](https://github.com/CodeIntelligenceTesting/jazzer.js#readme) to -detect and report bugs in JavaScript code. +[Jazzer.js](https://github.com/CodeIntelligenceTesting/jazzer.js-commercial#readme) +to detect and report bugs in JavaScript code. ## Install @@ -15,5 +15,5 @@ npm install --save-dev @jazzer.js/bug-detectors ## Documentation - Up-to-date - [information](https://github.com/CodeIntelligenceTesting/jazzer.js/blob/main/docs/fuzz-settings.md#bug-detectors) + [information](https://github.com/CodeIntelligenceTesting/jazzer.js-commercial/blob/main/docs/fuzz-settings.md#bug-detectors) about currently available bug detectors diff --git a/packages/bug-detectors/configuration.ts b/packages/bug-detectors/configuration.ts index 9a55262dc..c37c79c8c 100644 --- a/packages/bug-detectors/configuration.ts +++ b/packages/bug-detectors/configuration.ts @@ -1,5 +1,5 @@ /* - * Copyright 2023 Code Intelligence GmbH + * Copyright 2026 Code Intelligence GmbH * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/packages/bug-detectors/index.ts b/packages/bug-detectors/index.ts index 9804a60b5..cd93ee1b8 100644 --- a/packages/bug-detectors/index.ts +++ b/packages/bug-detectors/index.ts @@ -1,5 +1,5 @@ /* - * Copyright 2023 Code Intelligence GmbH + * Copyright 2026 Code Intelligence GmbH * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/packages/bug-detectors/internal/command-injection.ts b/packages/bug-detectors/internal/command-injection.ts index be2f1bb40..796059172 100644 --- a/packages/bug-detectors/internal/command-injection.ts +++ b/packages/bug-detectors/internal/command-injection.ts @@ -1,5 +1,5 @@ /* - * Copyright 2023 Code Intelligence GmbH + * Copyright 2026 Code Intelligence GmbH * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -53,7 +53,8 @@ for (const functionName of functionNames) { } if (firstArgument.includes(goal)) { reportAndThrowFinding( - `Command Injection in ${functionName}(): called with '${firstArgument}'`, + "Command Injection\n" + + ` in ${functionName}(): called with '${firstArgument}'`, ); } guideTowardsContainment(firstArgument, goal, hookId); diff --git a/packages/bug-detectors/internal/path-traversal.ts b/packages/bug-detectors/internal/path-traversal.ts index ca73e45c5..9d3ea25a5 100644 --- a/packages/bug-detectors/internal/path-traversal.ts +++ b/packages/bug-detectors/internal/path-traversal.ts @@ -1,5 +1,5 @@ /* - * Copyright 2023 Code Intelligence GmbH + * Copyright 2026 Code Intelligence GmbH * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -168,12 +168,15 @@ for (const module of functionsWithTwoTargets) { for (const functionName of module.functionNames) { const makeBeforeHook = (extraHookId: number) => { return (thisPtr: unknown, params: unknown[], hookId: number) => { - if (params === undefined || params.length < 2) { + if (params === undefined || params.length < 1) { return; } // We don't want to confuse the fuzzer guidance with the same hookId for both function arguments. // Therefore, we use an extra hookId for the second argument. detectFindingAndGuideFuzzing(params[0], goal, hookId, functionName); + if (params.length < 2) { + return; + } detectFindingAndGuideFuzzing( params[1], goal, @@ -206,7 +209,8 @@ function detectFindingAndGuideFuzzing( const argument = input.toString(); if (argument.includes(goal)) { reportAndThrowFinding( - `Path Traversal in ${functionName}(): called with '${argument}'`, + "Path Traversal\n" + + ` in ${functionName}(): called with '${argument}'`, ); } guideTowardsContainment(argument, goal, hookId); diff --git a/packages/bug-detectors/internal/prototype-pollution.ts b/packages/bug-detectors/internal/prototype-pollution.ts index a5a2d25b5..9f7fa3a40 100644 --- a/packages/bug-detectors/internal/prototype-pollution.ts +++ b/packages/bug-detectors/internal/prototype-pollution.ts @@ -1,5 +1,5 @@ /* - * Copyright 2023 Code Intelligence GmbH + * Copyright 2026 Code Intelligence GmbH * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -62,7 +62,7 @@ class PrototypePollutionConfig { * ``` */ instrumentAssignmentsAndVariableDeclarations(): PrototypePollutionConfig { - if (global.options.dryRun) { + if (global.options.get("dryRun")) { console.error( "ERROR: " + "[Prototype Pollution Configuration] The configuration option " + @@ -336,7 +336,7 @@ function detectPrototypePollutionOfBasicObjects( for (let i = 0; i < initialSnapshots.length; i++) { if (!currentProtoSnapshots[i]) { reportFinding( - `Prototype Pollution: Prototype of ${BASIC_OBJECT_NAMES[i]} changed.`, + `Prototype Pollution\n Prototype of ${BASIC_OBJECT_NAMES[i]} changed.`, false, ); return; @@ -347,7 +347,7 @@ function detectPrototypePollutionOfBasicObjects( ); if (equalityResult) { reportFinding( - `Prototype Pollution: Prototype of ${BASIC_OBJECT_NAMES[i]} changed. ${equalityResult}`, + `Prototype Pollution\n Prototype of ${BASIC_OBJECT_NAMES[i]} changed. ${equalityResult}`, false, ); return; @@ -401,9 +401,9 @@ function detectPrototypePollution( ) { let message; if (identifier) { - message = `Prototype Pollution: ${identifier}.__proto__ value is ${protoValue}`; + message = `Prototype Pollution\n ${identifier}.__proto__ value is ${protoValue}`; } else { - message = `Prototype Pollution: __proto__ value is ${protoValue}`; + message = `Prototype Pollution\n __proto__ value is ${protoValue}`; } if (report) { reportAndThrowFinding(message); diff --git a/packages/bug-detectors/internal/remote-code-execution.ts b/packages/bug-detectors/internal/remote-code-execution.ts new file mode 100644 index 000000000..fbe724e31 --- /dev/null +++ b/packages/bug-detectors/internal/remote-code-execution.ts @@ -0,0 +1,71 @@ +/* + * Copyright 2026 Code Intelligence GmbH + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { + guideTowardsContainment, + reportAndThrowFinding, +} from "@jazzer.js/core"; +import { callSiteId, registerBeforeHook } from "@jazzer.js/hooking"; + +const targetString = "jaz_zer"; + +registerBeforeHook( + "eval", + "", + false, + function beforeEvalHook(_thisPtr: unknown, params: string[], hookId: number) { + const code = params[0]; + // This check will prevent runtime TypeErrors should the user decide to call Function with + // non-string arguments. + // noinspection SuspiciousTypeOfGuard + if (typeof code === "string" && code.includes(targetString)) { + reportAndThrowFinding( + "Remote Code Execution\n" + ` using eval:\n '${code}'`, + ); + } + + // Since we do not hook eval using the hooking framework, we have to recompute the + // call site ID on every call to eval. This shouldn't be an issue, because eval is + // considered evil and should not be called too often, or even better -- not at all! + guideTowardsContainment(code, targetString, hookId); + }, +); + +registerBeforeHook( + "Function", + "", + false, + function beforeFunctionHook( + _thisPtr: unknown, + params: string[], + hookId: number, + ) { + if (params.length > 0) { + const functionBody = params[params.length - 1]; + + // noinspection SuspiciousTypeOfGuard + if (typeof functionBody === "string") { + if (functionBody.includes(targetString)) { + reportAndThrowFinding( + "Remote Code Execution\n" + + ` using Function:\n '${functionBody}'`, + ); + } + guideTowardsContainment(functionBody, targetString, hookId); + } + } + }, +); diff --git a/packages/bug-detectors/internal/ssrf.test.ts b/packages/bug-detectors/internal/ssrf.test.ts new file mode 100644 index 000000000..b8d82389d --- /dev/null +++ b/packages/bug-detectors/internal/ssrf.test.ts @@ -0,0 +1,292 @@ +/* + * Copyright 2026 Code Intelligence GmbH + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { bugDetectorConfigurations } from "../configuration"; + +import { + hookTCPSocket, + hookUDPSocket, + hookUDPSocketSend, + SSRFConfig, +} from "./ssrf"; + +// Since we expect several findings in some tests, if a finding is reported but not expected after a finding was +// thrown and caught before, Jest will print an unhelpful "Error: thrown: undefined" message. To avoid this, we +// mock the reportAndThrowFinding function to throw a fixed string. + +jest.mock("../../core", () => ({ + reportAndThrowFinding: (cause: unknown) => { + throw cause; + }, +})); + +// Permitted hosts and ports used by the TCP and UDP socket hooks tests. +bugDetectorConfigurations + .get("ssrf") + .addPermittedTCPConnection("localhost", 80) + .addPermittedUDPConnection("localhost", 8080) + .addPermittedUDPConnection("localhost", 9090) + .addPermittedUDPConnection("::1", 9091); + +// Used by UDP socket hook. +const typeIPv4 = { type: "udp4" }; +const typeIPv6 = { type: "udp6" }; + +const symbolError = + "Internal socket state is missing. This is a bug in the SSRF bug detector."; +describe("SSRF", () => { + describe("SSRFConfig", () => { + test("Allow TCP connections", () => { + const config = new SSRFConfig() + .addPermittedTCPConnection("localhost", 80) + .addPermittedTCPConnection("localhost", 90); + + expect(config.isPermittedTCPConnection("localhost", 80)).toBeTruthy(); + expect(config.isPermittedTCPConnection("localhost", 85)).toBeFalsy(); + expect(config.isPermittedTCPConnection("localhost", 90)).toBeTruthy(); + + // UDP + expect(config.isPermittedUDPConnection("localhost", 80)).toBeFalsy(); + expect(config.isPermittedUDPConnection("localhost", 90)).toBeFalsy(); + + // other hosts + expect(config.isPermittedTCPConnection("1.2.3.4", 80)).toBeFalsy(); + expect(config.isPermittedTCPConnection("1.2.3.4", 90)).toBeFalsy(); + + // localhost is not the same as 127.0.0.1 and the bug detector will not resolve host names. + expect(config.isPermittedTCPConnection("127.0.0.1", 80)).toBeFalsy(); + expect(config.isPermittedTCPConnection("127.0.0.1", 90)).toBeFalsy(); + }); + + test("Allow UDP connections", () => { + const config = new SSRFConfig() + .addPermittedUDPConnection("localhost", 8080) + .addPermittedUDPConnection("localhost", 9090); + + expect(config.isPermittedUDPConnection("localhost", 8080)).toBeTruthy(); + expect(config.isPermittedUDPConnection("localhost", 85)).toBeFalsy(); + expect(config.isPermittedUDPConnection("localhost", 9090)).toBeTruthy(); + + expect(config.isPermittedTCPConnection("localhost", 8080)).toBeFalsy(); + expect(config.isPermittedTCPConnection("localhost", 9080)).toBeFalsy(); + + // other hosts + expect(config.isPermittedUDPConnection("1.2.3.4", 8080)).toBeFalsy(); + expect(config.isPermittedUDPConnection("1.2.3.4", 9090)).toBeFalsy(); + + // localhost is not the same as 127.0.0.1 and the bug detector will not resolve host names. + expect(config.isPermittedUDPConnection("127.0.0.1", 8080)).toBeFalsy(); + expect(config.isPermittedUDPConnection("127.0.0.1", 9090)).toBeFalsy(); + }); + + test("Allow TCP and UDP connections", () => { + const config = new SSRFConfig() + .addPermittedTCPConnection("localhost", 123) + .addPermittedUDPConnection("localhost", 456); + + expect(config.isPermittedTCPConnection("localhost", 123)).toBeTruthy(); + expect(config.isPermittedUDPConnection("localhost", 123)).toBeFalsy(); + + expect(config.isPermittedTCPConnection("localhost", 456)).toBeFalsy(); + expect(config.isPermittedUDPConnection("localhost", 456)).toBeTruthy(); + + expect(config.isPermittedTCPConnection("localhost", 789)).toBeFalsy(); + expect(config.isPermittedUDPConnection("localhost", 789)).toBeFalsy(); + + // other hosts + expect(config.isPermittedTCPConnection("other host", 0)).toBeFalsy(); + expect(config.isPermittedUDPConnection("other host", 0)).toBeFalsy(); + }); + + test("Clearing the config for TCP and UDP individually ", () => { + const config = new SSRFConfig() + .addPermittedTCPConnection("localhost", 123) + .addPermittedUDPConnection("localhost", 456); + + expect(config.isPermittedTCPConnection("localhost", 123)).toBeTruthy(); + expect(config.isPermittedUDPConnection("localhost", 456)).toBeTruthy(); + + config.clearPermittedUDPConnections(); + expect(config.isPermittedTCPConnection("localhost", 123)).toBeTruthy(); + expect(config.isPermittedUDPConnection("localhost", 456)).toBeFalsy(); + + config.clearPermittedTCPConnections(); + expect(config.isPermittedTCPConnection("localhost", 123)).toBeFalsy(); + expect(config.isPermittedUDPConnection("localhost", 456)).toBeFalsy(); + }); + + test("Clearing the config at once", () => { + const config = new SSRFConfig(); + config.addPermittedTCPConnection("localhost", 1234); + config.addPermittedUDPConnection("localhost", 5678); + + expect(config.isPermittedTCPConnection("localhost", 1234)).toBeTruthy(); + expect(config.isPermittedUDPConnection("localhost", 5678)).toBeTruthy(); + + config.clear(); + expect(config.isPermittedTCPConnection("localhost", 1234)).toBeFalsy(); + expect(config.isPermittedUDPConnection("localhost", 5678)).toBeFalsy(); + }); + }); + + describe("hookTCPSocket ", () => { + test("Call TCP socket hook with ports as numbers", () => { + // not allowed port and host + expect(() => + hookTCPSocket(undefined, [8080, "local", "callback"], 0), + ).toThrow("Server Side Request Forgery"); + // not allowed port and host in options + expect(() => + hookTCPSocket( + undefined, + [{ port: 8080, host: "local" }, "callback"], + 0, + ), + ).toThrow("Server Side Request Forgery"); + // allowed connection in options + expect(() => + hookTCPSocket( + undefined, + [{ port: 80, host: "localhost" }, "callback"], + 0, + ), + ).not.toThrow(); + // allowed connection with explicit port and host + expect(() => + hookTCPSocket(undefined, [80, "localhost", "callback"], 0), + ).not.toThrow(); + }); + + test("Call TCP socket hook with ports as strings", () => { + // not allowed port and host + expect(() => + hookTCPSocket(undefined, ["81", "local", "callback"], 0), + ).toThrow("Server Side Request Forgery"); + // not allowed port and host in options + expect(() => + hookTCPSocket( + undefined, + [{ port: "90", host: "local" }, "callback"], + 0, + ), + ).toThrow("Server Side Request Forgery"); + // allowed connection in options + expect(() => + hookTCPSocket( + undefined, + [{ port: "80", host: "localhost" }, "callback"], + 0, + ), + ).not.toThrow(); + // allowed connection with explicit port and host + expect(() => + hookTCPSocket(undefined, ["80", "localhost", "callback"], 0), + ).not.toThrow(); + }); + }); + + describe("UDP", () => { + describe("hookUDPSocket", () => { + test("Call UDP socket hook with ports as numbers", () => { + // Invalid parameters---original function will throw an error (not tested here). + expect(() => hookUDPSocket(undefined, [], 0)).not.toThrow(); + // Type (IPv4 or 6) is only relevant when no host was provided. + expect(() => + hookUDPSocket(typeIPv4, [9090, "localhost", "callback"], 0), + ).not.toThrow(); + expect(() => + hookUDPSocket(typeIPv6, [9091, "::1", "callback"], 0), + ).not.toThrow(); + expect(() => + hookUDPSocket(typeIPv4, [80, "127.0.0.1", "callback"], 0), + ).toThrow("Server Side Request Forgery"); + }); + + test("Call UDP socket hook with ports as strings", () => { + expect(() => + hookUDPSocket(typeIPv4, ["9090", "localhost", "callback"], 0), + ).not.toThrow(); + expect(() => + hookUDPSocket(typeIPv4, ["9091", "::1", "callback"], 0), + ).not.toThrow(); + expect(() => + hookUDPSocket(typeIPv6, ["9091", "::1", "callback"], 0), + ).not.toThrow(); + expect(() => + hookUDPSocket(typeIPv4, [81, "local", "callback"], 0), + ).toThrow("Server Side Request Forgery"); + }); + }); + + describe("hookUDPSocketSend", () => { + const thisPtr = { + [Symbol("state symbol")]: { connectState: 0 }, + }; + + test("Call UDP socket hook with ports as strings", () => { + expect(() => + hookUDPSocketSend( + {}, + [Buffer.from("unused"), "9091", "localhost", () => {}], + 0, + ), + ).toThrow(symbolError); + expect(() => + hookUDPSocketSend( + thisPtr, + ["hello", "9091", "localhost", () => {}], + 0, + ), + ).toThrow("Server Side Request Forgery"); + expect(() => + hookUDPSocketSend( + thisPtr, + ["hello", "9090", "localhost", () => {}], + 0, + ), + ).not.toThrow(); + expect(() => + hookUDPSocketSend(thisPtr, ["hello", "9090", "::1", () => {}], 0), + ).toThrow("Server Side Request Forgery"); + expect(() => + hookUDPSocketSend(thisPtr, ["hello", "9091", "::1", () => {}], 0), + ).not.toThrow(); + }); + + test("Call UDP socket hook with ports as numbers", () => { + // Invalid thisPtr---original function will throw an error (not tested here). + expect(() => + hookUDPSocketSend( + {}, + [Buffer.from("unused"), 9091, "localhost", () => {}], + 0, + ), + ).toThrow(symbolError); + expect(() => + hookUDPSocketSend(thisPtr, ["hello", 9091, "localhost", () => {}], 0), + ).toThrow("Server Side Request Forgery"); + expect(() => + hookUDPSocketSend(thisPtr, ["hello", 9090, "localhost", () => {}], 0), + ).not.toThrow(); + expect(() => + hookUDPSocketSend(thisPtr, ["hello", 9090, "::1", () => {}], 0), + ).toThrow("Server Side Request Forgery"); + expect(() => + hookUDPSocketSend(thisPtr, ["hello", 9091, "::1", () => {}], 0), + ).not.toThrow(); + }); + }); + }); +}); diff --git a/packages/bug-detectors/internal/ssrf.ts b/packages/bug-detectors/internal/ssrf.ts new file mode 100644 index 000000000..624f22e0e --- /dev/null +++ b/packages/bug-detectors/internal/ssrf.ts @@ -0,0 +1,299 @@ +/* + * Copyright 2026 Code Intelligence GmbH + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import assert from "assert"; +import { SocketType as UDPSocketType } from "dgram"; +import { TcpSocketConnectOpts } from "net"; + +import { reportAndThrowFinding } from "@jazzer.js/core"; +import { registerBeforeHook } from "@jazzer.js/hooking"; + +import { bugDetectorConfigurations } from "../configuration"; + +export class SSRFConfig { + private _permittedTCPConnections: Map> = new Map(); + private _permittedUDPConnections: Map> = new Map(); + + /** + * Add a permitted TCP connection to the config. + * @param hostname - The hostname of the permitted connection. + * @param port - The port of the permitted connection. + */ + addPermittedTCPConnection(hostname: string, port: number): SSRFConfig { + return this.addPermittedConnection( + this._permittedTCPConnections, + hostname, + port, + ); + } + + /** + * Check if a TCP connection is permitted. + * @param hostname - The hostname of the connection. + * @param port - The port of the connection. + */ + isPermittedTCPConnection(hostname: string, port?: string | number): boolean { + // Even though ports should be numbers, node API allows strings as well. + return this.isPermittedConnection( + this._permittedTCPConnections, + hostname, + port, + ); + } + + /** + * Add a permitted UDP connection to the config. + * @param hostname - The hostname of the permitted connection. + * @param port - The port of the permitted connection. + */ + addPermittedUDPConnection(hostname: string, port: number): SSRFConfig { + return this.addPermittedConnection( + this._permittedUDPConnections, + hostname, + port, + ); + } + + /** + * Check if a UDP connection is permitted. + * @param hostname - The hostname of the connection. + * @param port - The port of the connection. + */ + isPermittedUDPConnection(hostname: string, port?: string | number): boolean { + return this.isPermittedConnection( + this._permittedUDPConnections, + hostname, + port, + ); + } + + /** + * Clear all TCP connections allowed so far. + */ + clearPermittedTCPConnections(): SSRFConfig { + this._permittedTCPConnections.clear(); + return this; + } + + /** + * Clear all UDP connections allowed so far. + */ + clearPermittedUDPConnections(): SSRFConfig { + this._permittedUDPConnections.clear(); + return this; + } + + /** + * Clear all TCP and UDP connections allowed so far. + */ + clear(): SSRFConfig { + this.clearPermittedTCPConnections(); + this.clearPermittedUDPConnections(); + return this; + } + + private addPermittedConnection( + permittedConnections: Map>, + hostname: string, + port: number, + ): SSRFConfig { + assert( + this.isValidPort(port), + "Port must be an integer between 0 and 65535", + ); + if (permittedConnections.has(hostname)) { + const ports = permittedConnections.get(hostname); + if (ports !== undefined && !ports.has(port)) { + ports.add(port); + } + } else { + const ports = new Set(); + ports.add(port); + permittedConnections.set(hostname, ports); + } + return this; + } + + private isPermittedConnection( + permittedConnections: Map>, + hostname: string, + port?: string | number, + ): boolean { + if (typeof port === "string") { + try { + port = parseInt(port); + } catch (e) { + return true; + } + } + // The original function should handle invalid ports (usually by an error). + // SSRF should not be reported in that case. + if (port === undefined || !this.isValidPort(port)) return true; + + return permittedConnections.get(hostname)?.has(port) ?? false; + } + + private isValidPort(port?: number): boolean { + return ( + typeof port === "number" && + port >= 0 && + port <= 65535 && + Number.isInteger(port) + ); + } +} + +const config = new SSRFConfig(); + +// Add this bug detector's config to the global Map configs. +bugDetectorConfigurations.set("ssrf", config); + +registerBeforeHook("Socket.prototype.connect", "net", false, hookTCPSocket); +registerBeforeHook("Socket.prototype.connect", "dgram", false, hookUDPSocket); +registerBeforeHook("Socket.prototype.send", "dgram", false, hookUDPSocketSend); + +export function hookTCPSocket(_thisPtr: unknown, args: unknown[], _id: number) { + if (args.length === 1) { + const firstArgument = args[0]; + + if (firstArgument !== null && typeof firstArgument === "object") { + const options = firstArgument as TcpSocketConnectOpts; + let host = options.host; + let port = options.port; + + if (firstArgument instanceof Array) { + if (host === undefined) { + host = firstArgument[0].host || "localhost"; + } + if (port === undefined) { + port = firstArgument[0].port; + } + } + detectSSRF(port, host, "Attempted connection via TCP"); + } + } else if (args.length === 2) { + // connect(options: SocketConnectOpts, connectionListener?: () => void): this; + const firstArgument = args[0]; + if (typeof firstArgument === "object" && firstArgument !== null) { + const options = firstArgument as TcpSocketConnectOpts; + detectSSRF(options.port, options.host, "Attempted connection via TCP"); + } + } else if (args.length === 3) { + // connect(port: number, host: string, connectionListener?: () => void): this; + detectSSRF(args[0], args[1], "Attempted connection via TCP"); + } +} + +type ConnectState = { connectState: number }; + +interface UDPSocket { + type?: UDPSocketType; + [key: symbol]: ConnectState; +} + +function getConnectionState(socket: UDPSocket): ConnectState { + for (const symbol of Object.getOwnPropertySymbols(socket)) { + if (symbol.toString() === "Symbol(state symbol)") { + return socket[symbol]; + } + } + throw new Error( + "Internal socket state is missing. This is a bug in the SSRF bug detector.", + ); +} + +export function hookUDPSocket(thisPtr: unknown, args: unknown[], _id: number) { + const socket = thisPtr as UDPSocket; + if (socket?.type === undefined) return; + + // Type is only used to determine the default host. + const defaultHost = socket.type === "udp4" ? "127.0.0.1" : "::1"; + const host = typeof args[1] === "string" ? args[1] : defaultHost; + detectSSRF(args[0], host, "Attempted connection via UDP", true); +} + +// Connection-less send using UDP sockets. +export function hookUDPSocketSend( + thisPtr: UDPSocket, + args: unknown[], + _id: number, +) { + const state = getConnectionState(thisPtr); + + const offset = args[1]; + const length = args[2]; + let port = args[3]; + let host = args[4]; + + const CONNECT_STATE_CONNECTED = 2; + + // This follows the same logic as the send function in the dgram module (dgram.js) + // to obtain port and address + if (state.connectState === CONNECT_STATE_CONNECTED) { + if (typeof length === "number") { + if (typeof port === "function") { + port = undefined; + } + } + if (port || host) { + // When already connected, the original function will throw an error, so we're done here. + return; + } + } else { + if (!host && !(port && typeof port !== "function")) { + port = offset; + host = length; + } + } + + if (typeof host === "function") { + host = undefined; + } else if (host && typeof host !== "string") { + return; + } + + detectSSRF(port, host, "Attempted a connectionless send via UDP", true); +} + +function detectSSRF( + port: unknown, + host: unknown, + message: string, + isUDP = false, +) { + if (typeof port === "number" || typeof port === "string") { + // The string check below is necessary for JavaScript, where the user can pass + // hostnames of any type. In that case, we want the original function + // to throw an error, and thus return from here. + // Since we don't validate hostnames, strings that are not valid host names or valid + // but adjusted internally (e.g. "123" will be internally converted to "0.0.0.123") + // will be reported as SSRF findings. We treat every hostname that is a string as valid. + if (typeof host === "string") { + if ( + isUDP + ? !config.isPermittedUDPConnection(host, port) + : !config.isPermittedTCPConnection(host, port) + ) { + reportAndThrowFinding( + `Server Side Request Forgery (SSRF)\n` + + " " + + message + + ` to '${host}' on port: '${port}'\n`, + ); + } + } + } +} diff --git a/packages/bug-detectors/package.json b/packages/bug-detectors/package.json index 588d6d325..6df79ffe6 100644 --- a/packages/bug-detectors/package.json +++ b/packages/bug-detectors/package.json @@ -1,6 +1,6 @@ { "name": "@jazzer.js/bug-detectors", - "version": "2.1.0", + "version": "3.1.0", "description": "Jazzer.js bug detectors", "homepage": "https://github.com/CodeIntelligenceTesting/jazzer.js#readme", "author": "Code Intelligence", @@ -16,8 +16,8 @@ "main": "dist/index.js", "types": "dist/index.d.js", "dependencies": { - "@jazzer.js/core": "2.1.0", - "@jazzer.js/hooking": "2.1.0" + "@jazzer.js/core": "3.1.0", + "@jazzer.js/hooking": "3.1.0" }, "devDependencies": {}, "engines": { diff --git a/packages/core/FuzzedDataProvider.test.ts b/packages/core/FuzzedDataProvider.test.ts index d9fde142d..1cae2540b 100644 --- a/packages/core/FuzzedDataProvider.test.ts +++ b/packages/core/FuzzedDataProvider.test.ts @@ -1,5 +1,5 @@ /* - * Copyright 2023 Code Intelligence GmbH + * Copyright 2026 Code Intelligence GmbH * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -411,7 +411,6 @@ describe("FuzzedDataProvider checks", () => { data.consumeBigIntegralInRange(BigInt(-99999999999), BigInt(99999999999)), ).toBe(BigInt(-53253077544)); const str = data.consumeString(31337); - expect(str.length).toBe(1014); expect(data.consumeIntegralInRange(123456789, 987654321)).toBe(123456789); }); @@ -434,7 +433,6 @@ describe("FuzzedDataProvider checks", () => { expect(data.remainingBytes).toBe(1005); // exhaust the buffer const str = data.consumeString(31337); - expect(str.length).toBe(1005); expect(data.consumeBigIntegral(8, false)).toBe(BigInt(0)); expect(data.remainingBytes).toBe(0); expect(data.consumeBigIntegral(8, true)).toBe(-BigInt(1) << BigInt(63)); @@ -455,7 +453,6 @@ describe("FuzzedDataProvider checks", () => { expect(data.consumeBoolean()).toBe(false); // exhaust the buffer const str = data.consumeString(31337); - expect(str.length).toBe(1014); expect(data.consumeBoolean()).toBe(false); data = new FuzzedDataProvider(Data); @@ -518,7 +515,6 @@ describe("FuzzedDataProvider checks", () => { expect(data.remainingBytes).toBe(988); // exhaust the buffer const str = data.consumeString(31337); - expect(str.length).toBe(1024 - 36); expect(data.consumeProbabilityFloat()).toBe(0.0); expect(data.remainingBytes).toBe(0); }); @@ -593,7 +589,6 @@ describe("FuzzedDataProvider checks", () => { // exhaust the buffer const str = data.consumeString(31337); - expect(str.length).toBe(1000); expect(data.pickValue(dataArray)).toBe(0x8a); expect(data.remainingBytes).toBe(0); }); @@ -679,7 +674,6 @@ describe("FuzzedDataProvider checks", () => { // exhaust the buffer const str = data.consumeString(31337); expect(data.remainingBytes).toBe(0); - expect(str.length).toBe(Data.length - 38); expect(data.consumeProbabilityFloat()).toBe(0.0); expect(data.remainingBytes).toBe(0); expect(data.consumeProbabilityDouble()).toBe(0.0); @@ -715,7 +709,6 @@ describe("FuzzedDataProvider checks", () => { // exhaust the buffer const str = data.consumeString(31337); expect(data.remainingBytes).toBe(0); - expect(str.length).toBe(Data.length - 38); expect(data.consumeProbabilityFloat()).toBe(0.0); expect(data.remainingBytes).toBe(0); expect(data.consumeProbabilityDouble()).toBe(0.0); @@ -958,11 +951,11 @@ describe("FuzzedDataProvider checks", () => { data.consumeString(1.5); }).toThrow("length value must be an integer"); expect(data.remainingBytes).toBe(testString.length); - expect(data.consumeString(10, "utf8")).toBe("Lorem ipsu"); + expect(data.consumeString(10)).toBe("Lorem ipsu"); expect(data.remainingBytes).toBe(testString.length - 10); - expect(data.consumeString(20, "ascii")).toBe("m dolor sit amet, co"); + expect(data.consumeString(20)).toBe("m dolor sit amet, co"); expect(data.remainingBytes).toBe(testString.length - 30); - expect(data.consumeString(40, "ascii")).toBe( + expect(data.consumeString(40)).toBe( "nsectetur adipiscing elit, sed do eiusmo", ); expect(data.remainingBytes).toBe(testString.length - 70); @@ -995,14 +988,6 @@ describe("FuzzedDataProvider checks", () => { expect(str).toHaveLength(0); } }); - it("verifyPrintableString", () => { - const data = new FuzzedDataProvider(Buffer.from(Data)); - const consumedStrAsArr = [...data.consumeString(1024, "ascii", true)]; - consumedStrAsArr.forEach((c) => { - const charAsNum = c.charCodeAt(0); - expect(charAsNum >= 32 && charAsNum <= 126).toBeTruthy(); - }); - }); it("verifyNonPrintableString", () => { const data = new FuzzedDataProvider(Buffer.from(Data)); const consumedStrAsArr = [...data.consumeString(1024)]; diff --git a/packages/core/FuzzedDataProvider.ts b/packages/core/FuzzedDataProvider.ts index 3a3102eca..f57df1ab0 100644 --- a/packages/core/FuzzedDataProvider.ts +++ b/packages/core/FuzzedDataProvider.ts @@ -1,5 +1,5 @@ /* - * Copyright 2023 Code Intelligence GmbH + * Copyright 2026 Code Intelligence GmbH * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -38,11 +38,6 @@ export class FuzzedDataProvider { private dataPtr = -1; /** The number of remaining bytes that can be consumed from the fuzzer input data. */ _remainingBytes = 0; - /** - * A lookup table that maps input values to output characters in a cyclical manner. - * The output characters are evenly distributed across the range of printable ASCII characters (32-126) - */ - private lookupTable = new Uint8Array(256); static readonly min_float = -3.4028235e38; static readonly max_float = 3.4028235e38; @@ -58,18 +53,6 @@ export class FuzzedDataProvider { this.dataPtr = 0; this._remainingBytes = data.length; } - - /** - * Populate the lookup table with a mapping of input values to output characters - */ - let nextChar = 32; - for (let i = 0; i < 256; i++) { - this.lookupTable[i] = nextChar; - nextChar++; - if (nextChar > 126) { - nextChar = 32; - } - } } /** @@ -427,80 +410,30 @@ export class FuzzedDataProvider { * The array might be shorter than requested `maxLength` if the fuzzer input * is not sufficiently long. * @param maxLength the maximum length of the string - * @param encoding the encoding of the string - * @param printable - a boolean, which defaults to false that indicates whether consumed strings - * should be forced to contain only valid printable characters * @returns a `string` of length between 0 and `maxLength` (inclusive) */ - consumeString( - maxLength: number, - encoding: BufferEncoding | undefined = "ascii", - printable: boolean | undefined = false, - ): string { + consumeString(maxLength: number): string { if (maxLength < 0) throw new Error("maxLength must be non-negative"); if (!Number.isInteger(maxLength)) { throw new FloatLengthError(); } - let result; const arrayLength = Math.min(maxLength, this._remainingBytes); - - if (printable) { - result = this.bufToPrintableString( - this.data, - this.dataPtr, - this.dataPtr + arrayLength, - encoding, - ); - } else { - result = this.data.toString( - encoding, - this.dataPtr, - this.dataPtr + arrayLength, - ); - } + const result = this.data.toString( + "utf-8", + this.dataPtr, + this.dataPtr + arrayLength, + ); this.dataPtr += arrayLength; this._remainingBytes -= arrayLength; return result; } - /** - * Helper function that converts the given string type into one that only - * contains printable characters. Elements in `buf` that are already in - * ASCII printable range are not undergoing any conversion. - * Known limitations: - * numbers [32; 97] will have the probability of about 0.01172 of occuring, - * numbers [98; 126] will have probability of 0.00781 of occurring. - * @param buf - Buffer that contains arbitrary values - * @param min - lower bound at which processing of the provided `Buffer` shall begin - * @param max - upper bound, analogous to the lower bound - * @param encoding - a valid `BufferEncoding`. - * @returns a string that was sanitized and only contains printable characters - */ - private bufToPrintableString( - buf: Buffer, - min: number, - max: number, - encoding: BufferEncoding, - ): string { - const newBuf = new Uint8Array(max - min); - for (let i = min; i < max; i++) { - newBuf[i - min] = this.lookupTable[buf[i]]; - } - return new TextDecoder(encoding).decode(newBuf); - } - /** * Consumes the remaining bytes of the fuzzer input as a string. - * @param encoding - the encoding of the string - * @param printable - a boolean, which defaults to false that indicates whether consumed strings - * should be forced to contain only valid printable characters - * @returns a string constructed from the remaining bytes of the fuzzer input using the given encoding + * @returns a string constructed from the remaining bytes of the fuzzer input */ - consumeRemainingAsString( - encoding: BufferEncoding | undefined = "ascii", - printable: boolean | undefined = false, - ): string { - return this.consumeString(this._remainingBytes, encoding, printable); + consumeRemainingAsString(): string { + return this.consumeString(this._remainingBytes); } /** @@ -509,17 +442,9 @@ export class FuzzedDataProvider { * if the fuzzer input is not sufficiently long. * @param maxArrayLength the maximum length of the array * @param maxStringLength the maximum length of the strings - * @param encoding the encoding of the strings - * @param printable - a boolean, which defaults to false that indicates whether consumed strings - * should be forced to contain only valid printable characters - * @returns an array containing strings constructed from the remaining bytes of the fuzzer input using the given encoding - */ - consumeStringArray( - maxArrayLength: number, - maxStringLength: number, - encoding: BufferEncoding | undefined = "ascii", - printable: boolean | undefined = false, - ) { + * @returns an array containing strings constructed from the remaining bytes of the fuzzer input + */ + consumeStringArray(maxArrayLength: number, maxStringLength: number) { if ( !Number.isInteger(maxArrayLength) || !Number.isInteger(maxStringLength) @@ -528,7 +453,7 @@ export class FuzzedDataProvider { } const strs = []; while (strs.length < maxArrayLength && this.remainingBytes > 0) { - const str = this.consumeString(maxStringLength, encoding, printable); + const str = this.consumeString(maxStringLength); if (str || str === "") { strs.push(str); } diff --git a/packages/core/README.md b/packages/core/README.md index b596e5811..75fb83538 100644 --- a/packages/core/README.md +++ b/packages/core/README.md @@ -25,7 +25,5 @@ npm install --save-dev @jazzer.js/core ## Documentation See -[Jazzer.js README](https://github.com/CodeIntelligenceTesting/jazzer.js#readme) -for more information or the -[issues](https://github.com/CodeIntelligenceTesting/jazzer.js/issues?q=is%3Aissue+is%3Aopen) -associated with it. +[Jazzer.js README](https://github.com/CodeIntelligenceTesting/jazzer.js-commercial#readme) +for more information. diff --git a/packages/core/api.ts b/packages/core/api.ts index aa1fb96ef..39b861c6f 100644 --- a/packages/core/api.ts +++ b/packages/core/api.ts @@ -1,5 +1,5 @@ /* - * Copyright 2023 Code Intelligence GmbH + * Copyright 2026 Code Intelligence GmbH * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/packages/core/callback.ts b/packages/core/callback.ts index e8763118a..9184815e1 100644 --- a/packages/core/callback.ts +++ b/packages/core/callback.ts @@ -1,5 +1,5 @@ /* - * Copyright 2023 Code Intelligence GmbH + * Copyright 2026 Code Intelligence GmbH * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -14,7 +14,7 @@ * limitations under the License. */ -import { getOrSetJazzerJsGlobal } from "./api"; +import { getOrSetJazzerJsGlobal } from "./globals"; export type Thunk = () => void; diff --git a/packages/core/callbacks.test.ts b/packages/core/callbacks.test.ts index b2ccb057e..2fa1b06a1 100644 --- a/packages/core/callbacks.test.ts +++ b/packages/core/callbacks.test.ts @@ -1,5 +1,5 @@ /* - * Copyright 2023 Code Intelligence GmbH + * Copyright 2026 Code Intelligence GmbH * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/packages/core/cli.ts b/packages/core/cli.ts index e92acf3ee..ba610f0ee 100644 --- a/packages/core/cli.ts +++ b/packages/core/cli.ts @@ -1,6 +1,6 @@ #!/usr/bin/env node /* - * Copyright 2023 Code Intelligence GmbH + * Copyright 2026 Code Intelligence GmbH * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -18,12 +18,7 @@ import yargs, { Argv, exit } from "yargs"; import { FuzzingExitCode, startFuzzing } from "./core"; -import { - buildOptions, - defaultOptions, - ParameterResolverIndex, - setParameterResolverValue, -} from "./options"; +import { defaultCLIOptions, OptionsManager, OptionSource } from "./options"; import { prepareArgs } from "./utils"; // Use yargs to parse command line arguments and provide a nice CLI experience. @@ -37,7 +32,6 @@ yargs(process.argv.slice(2)) .parserConfiguration({ "camel-case-expansion": false, "strip-aliased": true, - "strip-dashed": true, "greedy-arrays": false, }) .example( @@ -54,7 +48,7 @@ yargs(process.argv.slice(2)) ) .epilogue("Happy fuzzing!") .command( - "$0 [corpus..]", + "$0 [corpus..]", "Coverage-guided, in-process fuzzer for the Node.js platform. \n\n" + 'The "target" module has to export a function "fuzz" which accepts ' + "a byte array as first parameter and uses that to invoke the actual " + @@ -67,7 +61,8 @@ yargs(process.argv.slice(2)) "An example is shown in the examples section of this help message.", (yargs: Argv) => { yargs - .positional("fuzz_target", { + .positional("fuzzTarget", { + alias: ["fuzz_target"], demandOption: true, describe: "Name of the module that exports the fuzz target function.", type: "string", @@ -81,9 +76,9 @@ yargs(process.argv.slice(2)) type: "string", }) - .option("fuzz_entry_point", { - alias: ["f", "fuzz_function"], - defaultDescription: defaultOptions.fuzzEntryPoint, + .option("fuzzEntryPoint", { + alias: ["f", "fuzz_entry_point", "fuzz_function"], + defaultDescription: defaultCLIOptions.fuzzEntryPoint, describe: "Name of the fuzz test entry point. It must be an exported " + "function with a single Buffer parameter", @@ -93,7 +88,7 @@ yargs(process.argv.slice(2)) .option("includes", { alias: ["i", "instrumentation_includes"], array: true, - defaultDescription: `${JSON.stringify(defaultOptions.includes)}`, + defaultDescription: `${JSON.stringify(defaultCLIOptions.includes)}`, describe: "Part of filepath names to include in the instrumentation. " + 'A tailing "/" should be used to include directories and prevent ' + @@ -105,7 +100,7 @@ yargs(process.argv.slice(2)) .option("excludes", { alias: ["e", "instrumentation_excludes"], array: true, - defaultDescription: `${JSON.stringify(defaultOptions.excludes)}`, + defaultDescription: `${JSON.stringify(defaultCLIOptions.excludes)}`, describe: "Part of filepath names to exclude in the instrumentation. " + 'A tailing "/" should be used to exclude directories and prevent ' + @@ -115,8 +110,9 @@ yargs(process.argv.slice(2)) type: "string", }) - .option("id_sync_file", { - defaultDescription: `${JSON.stringify(defaultOptions.idSyncFile)}`, + .option("idSyncFile", { + alias: ["id_sync_file"], + defaultDescription: `${JSON.stringify(defaultCLIOptions.idSyncFile)}`, describe: "File used for sync edge ID generation. " + "Needed when fuzzing in multi-process modes", @@ -124,10 +120,12 @@ yargs(process.argv.slice(2)) hidden: true, type: "string", }) - .option("custom_hooks", { - alias: "h", + .option("customHooks", { + alias: ["custom_hooks", "h"], array: true, - defaultDescription: `${JSON.stringify(defaultOptions.customHooks)}`, + defaultDescription: `${JSON.stringify( + defaultCLIOptions.customHooks, + )}`, describe: "Allow users to hook functions. This can be used for writing " + "bug detectors, for stubbing, and for writing feedback functions " + @@ -135,11 +133,11 @@ yargs(process.argv.slice(2)) group: "Fuzzer:", type: "string", }) - .option("expected_errors", { - alias: "x", + .option("expectedErrors", { + alias: ["expected_errors", "x"], array: true, defaultDescription: `${JSON.stringify( - defaultOptions.expectedErrors, + defaultCLIOptions.expectedErrors, )}`, describe: "Expected errors can be specified as the class name of the " + @@ -151,10 +149,11 @@ yargs(process.argv.slice(2)) hidden: true, type: "string", }) - .option("disable_bug_detectors", { + .option("disableBugDetectors", { + alias: "disable_bug_detectors", array: true, defaultDescription: `${JSON.stringify( - defaultOptions.disableBugDetectors, + defaultCLIOptions.disableBugDetectors, )}`, describe: "A list of patterns to disable internal bug detectors. By default all internal " + @@ -169,7 +168,7 @@ yargs(process.argv.slice(2)) .option("mode", { alias: "m", - defaultDescription: `${JSON.stringify(defaultOptions.mode)}`, + defaultDescription: `${JSON.stringify(defaultCLIOptions.mode)}`, describe: "Configure if fuzzing should be performed, 'fuzzing' mode, " + "or if the fuzz target should only be invoked using existing corpus " + @@ -178,28 +177,28 @@ yargs(process.argv.slice(2)) group: "Fuzzer:", type: "string", }) - .option("dry_run", { - alias: "d", - defaultDescription: `${JSON.stringify(defaultOptions.dryRun)}`, + .option("dryRun", { + alias: ["dry_run", "d"], + defaultDescription: `${JSON.stringify(defaultCLIOptions.dryRun)}`, describe: "Perform a run with the fuzzing instrumentation disabled.", group: "Fuzzer:", type: "boolean", }) .option("timeout", { - defaultDescription: `${JSON.stringify(defaultOptions.timeout)}`, + defaultDescription: `${JSON.stringify(defaultCLIOptions.timeout)}`, describe: "Timeout in milliseconds for each fuzz test execution.", group: "Fuzzer:", type: "number", }) .option("sync", { - defaultDescription: `${JSON.stringify(defaultOptions.sync)}`, + defaultDescription: `${JSON.stringify(defaultCLIOptions.sync)}`, describe: "Run the fuzz target synchronously.", group: "Fuzzer:", type: "boolean", }) .option("verbose", { alias: "v", - defaultDescription: `${JSON.stringify(defaultOptions.verbose)}`, + defaultDescription: `${JSON.stringify(defaultCLIOptions.verbose)}`, describe: "Enable verbose debugging logs.", group: "Fuzzer:", type: "boolean", @@ -207,25 +206,25 @@ yargs(process.argv.slice(2)) .option("coverage", { alias: "cov", - defaultDescription: `${JSON.stringify(defaultOptions.coverage)}`, + defaultDescription: `${JSON.stringify(defaultCLIOptions.coverage)}`, describe: "Enable code coverage.", group: "Coverage:", type: "boolean", }) - .option("coverage_directory", { - alias: "cov_dir", + .option("coverageDirectory", { + alias: ["coverage_directory", "cov_dir"], defaultDescription: `${JSON.stringify( - defaultOptions.coverageDirectory, + defaultCLIOptions.coverageDirectory, )}`, describe: "Directory for storing coverage reports.", group: "Coverage:", type: "string", }) - .option("coverage_reporters", { - alias: "cov_reporters", + .option("coverageReporters", { + alias: ["coverage_reporters", "cov_reporters"], array: true, defaultDescription: `${JSON.stringify( - defaultOptions.coverageReporters, + defaultCLIOptions.coverageReporters, )}`, describe: "A list of reporter names for writing coverage reports.", group: "Coverage:", @@ -234,11 +233,12 @@ yargs(process.argv.slice(2)) }, // eslint-disable-next-line @typescript-eslint/no-explicit-any async (args: any) => { - setParameterResolverValue( - ParameterResolverIndex.CommandLineArguments, + const options = new OptionsManager(OptionSource.DefaultCLIOptions).merge( prepareArgs(args), + OptionSource.CommandLineArguments, ); - return startFuzzing(buildOptions()).then(({ returnCode, error }) => { + + return startFuzzing(options).then(({ returnCode, error }) => { if (returnCode !== FuzzingExitCode.Ok) { exit( returnCode, @@ -248,4 +248,5 @@ yargs(process.argv.slice(2)) }); }, ) - .help().argv; + .help() + .showHelpOnFail(false).argv; diff --git a/packages/core/core.ts b/packages/core/core.ts index 37e4806a6..7dc2bc99f 100644 --- a/packages/core/core.ts +++ b/packages/core/core.ts @@ -1,5 +1,5 @@ /* - * Copyright 2023 Code Intelligence GmbH + * Copyright 2026 Code Intelligence GmbH * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,6 +16,7 @@ import * as fs from "fs"; import path from "path"; +import * as vm from "vm"; import * as libCoverage from "istanbul-lib-coverage"; import * as libReport from "istanbul-lib-report"; @@ -40,8 +41,8 @@ import { printFinding, reportFinding, } from "./finding"; -import { jazzerJs } from "./globals"; -import { buildFuzzerOption, Options } from "./options"; +import { getJazzerJsGlobal, jazzerJs } from "./globals"; +import { buildFuzzerOption, OptionsManager } from "./options"; import { ensureFilepath, importModule } from "./utils"; // Remove temporary files on exit @@ -75,18 +76,23 @@ declare global { var Fuzzer: fuzzer.Fuzzer; var HookManager: hooking.HookManager; var __coverage__: libCoverage.CoverageMapData; - var options: Options; + // WARNING: since every fuzz test has a cloned OptionsManager, into which some fuzz-test specific options are merged, + // (e.g. the test name), the options object stored in this global variable is not necessarily the same as the one used + // by the fuzz test. Therefore, this variable should only be used for options that are not fuzz-test specific. + var options: OptionsManager; } -export async function initFuzzing(options: Options): Promise { +export async function initFuzzing( + options: OptionsManager, +): Promise { const instrumentor = new Instrumentor( - options.includes, - options.excludes, - options.customHooks, - options.coverage, - options.dryRun, - options.idSyncFile - ? new FileSyncIdStrategy(options.idSyncFile) + options.get("includes"), + options.get("excludes"), + options.get("customHooks"), + options.get("coverage"), + options.get("dryRun"), + options.get("idSyncFile") + ? new FileSyncIdStrategy(options.get("idSyncFile")) : new MemorySyncIdStrategy(), ); registerInstrumentor(instrumentor); @@ -95,7 +101,7 @@ export async function initFuzzing(options: Options): Promise { // transpiled bug detector files. const possibleBugDetectorFiles = getFilteredBugDetectorPaths( path.join(__dirname, "../../bug-detectors/dist/internal"), - options.disableBugDetectors, + options.get("disableBugDetectors"), ); if (process.env.JAZZER_DEBUG) { @@ -111,15 +117,19 @@ export async function initFuzzing(options: Options): Promise { possibleBugDetectorFiles.map(ensureFilepath).map(importModule), ); - await Promise.all(options.customHooks.map(ensureFilepath).map(importModule)); + await Promise.all( + options.get("customHooks").map(ensureFilepath).map(importModule), + ); - await hooking.hookManager.finalizeHooks(); + await hooking.hookManager.finalizeHooks( + getJazzerJsGlobal("vmContext") ?? globalThis, + ); return instrumentor; } export function registerGlobals( - options: Options, + options: OptionsManager, // eslint-disable-next-line @typescript-eslint/no-explicit-any globals: any[] = [globalThis], ) { @@ -144,11 +154,14 @@ function getFilteredBugDetectorPaths( return ( fs .readdirSync(bugDetectorsDirectory) - // The compiled "internal" directory contains several files such as .js.map and .d.ts. - // We only need the .js files. - // Here we also filter out bug detectors that should be disabled. + // The compiled "internal" directory contains several files such as .js.map and .d.ts. We only need the .js files. + // Here we also filter out bug detectors that should be disabled; and tests for the bug detectors that + // usually end with ".test.js". .filter((bugDetectorPath) => { - if (!bugDetectorPath.endsWith(".js")) { + if ( + !bugDetectorPath.endsWith(".js") || + bugDetectorPath.endsWith(".test.js") + ) { return false; } @@ -172,7 +185,9 @@ function getFilteredBugDetectorPaths( ); } -export async function startFuzzing(options: Options): Promise { +export async function startFuzzing( + options: OptionsManager, +): Promise { registerGlobals(options); await initFuzzing(options); const fuzzFn = await loadFuzzFunction(options); @@ -180,14 +195,17 @@ export async function startFuzzing(options: Options): Promise { return startFuzzingNoInit(findingAwareFuzzFn, options).finally(() => { // These post fuzzing actions are only required for invocations through the CLI, // other means of invocation, e.g. via Jest, don't need them. - fuzzer.fuzzer.printReturnInfo(options.sync); - processCoverage(options.coverageDirectory, options.coverageReporters); + fuzzer.fuzzer.printReturnInfo(options.get("sync")); + processCoverage( + options.get("coverageDirectory"), + options.get("coverageReporters"), + ); }); } export async function startFuzzingNoInit( fuzzFn: FindingAwareFuzzTarget, - options: Options, + options: OptionsManager, ): Promise { // Signal handler that stops fuzzing when the process receives a signal. // The signal is raised as a finding and orderly shuts down the fuzzer, as that's @@ -197,11 +215,10 @@ export async function startFuzzingNoInit( const signalHandler = (signal: number): void => { reportFinding(new FuzzerSignalFinding(signal), false); }; - process.on("SIGINT", () => signalHandler(0)); try { const fuzzerOptions = buildFuzzerOption(options); - if (options.sync) { + if (options.get("sync")) { await fuzzer.fuzzer.startFuzzing( fuzzFn, fuzzerOptions, @@ -216,10 +233,10 @@ export async function startFuzzingNoInit( await fuzzer.fuzzer.startFuzzingAsync(fuzzFn, fuzzerOptions); } // Fuzzing ended without a finding, due to -max_total_time or -runs. - return reportFuzzingResult(undefined, options.expectedErrors); + return reportFuzzingResult(undefined, options.get("expectedErrors")); } catch (e: unknown) { // Fuzzing produced an error, e.g. unhandled exception or bug detector finding. - return reportFuzzingResult(e, options.expectedErrors); + return reportFuzzingResult(e, options.get("expectedErrors")); } } @@ -290,17 +307,21 @@ function processCoverage( } } -async function loadFuzzFunction(options: Options): Promise { - const fuzzTarget = await importModule(options.fuzzTarget); +async function loadFuzzFunction( + options: OptionsManager, +): Promise { + const fuzzTarget = await importModule(options.get("fuzzTarget")); if (!fuzzTarget) { throw new Error( - `${options.fuzzTarget} could not be imported successfully"`, + `${options.get("fuzzTarget")} could not be imported successfully"`, ); } - const fuzzFn: fuzzer.FuzzTarget = fuzzTarget[options.fuzzEntryPoint]; + const fuzzFn: fuzzer.FuzzTarget = fuzzTarget[options.get("fuzzEntryPoint")]; if (typeof fuzzFn !== "function") { throw new Error( - `${options.fuzzTarget} does not export function "${options.fuzzEntryPoint}"`, + `${options.get("fuzzTarget")} does not export function "${options.get( + "fuzzEntryPoint", + )}"`, ); } return fuzzFn; @@ -404,9 +425,16 @@ export function asFindingAwareFuzzFn( export * from "./api"; export { FuzzedDataProvider } from "./FuzzedDataProvider"; export { - buildOptions, - defaultOptions, + AllowedFuzzTestOptions, Options, - ParameterResolverIndex, - setParameterResolverValue, + OptionsManager, + OptionSource, + OptionsWithSource, + printOptions, } from "./options"; + +export type { + FuzzTarget, + FuzzTargetAsyncOrValue, + FuzzTargetCallback, +} from "@jazzer.js/fuzzer"; diff --git a/packages/core/dictionary.test.ts b/packages/core/dictionary.test.ts index e06449b4a..fd7b3692c 100644 --- a/packages/core/dictionary.test.ts +++ b/packages/core/dictionary.test.ts @@ -1,5 +1,5 @@ /* - * Copyright 2023 Code Intelligence GmbH + * Copyright 2026 Code Intelligence GmbH * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -17,7 +17,12 @@ import fs from "fs"; import tmp from "tmp"; -import { addDictionary, useDictionaryByParams } from "./dictionary"; +import { + addDictionary, + convertDictionaryEntry, + toEscapedString, + useDictionaryByParams, +} from "./dictionary"; // Cleanup created files on exit tmp.setGracefulCleanup(); @@ -84,6 +89,53 @@ describe("Dictionary", () => { }); }); +describe("Dictionary with custom entries", () => { + beforeEach(() => { + globalThis.JazzerJS = new Map(); + }); + + it("toEscapedHexString Uint8Array", () => { + expect(toEscapedString(new Uint8Array([0, 1, 32, 65, 109, 97]))).toBe( + '"\\x00\\x01\\x20\\x41\\x6d\\x61"', + ); + }); + + it("convertDictionaryEntry", () => { + expect(convertDictionaryEntry("foo")).toBe('"\\x66\\x6f\\x6f"'); + expect(convertDictionaryEntry("\\")).toBe('"\\x5c"'); + expect(convertDictionaryEntry('\\"')).toBe('"\\x5c\\x22"'); + expect(convertDictionaryEntry('f"o\\o\tbar')).toBe( + '"\\x66\\x22\\x6f\\x5c\\x6f\\x09\\x62\\x61\\x72"', + ); + expect(convertDictionaryEntry("\u0012\u001A")).toBe('"\\x12\\x1a"'); + expect(convertDictionaryEntry("✂\uD83D\uDCCB")).toBe( + '"\\xe2\\x9c\\x82\\xf0\\x9f\\x93\\x8b"', + ); + expect( + convertDictionaryEntry(new Uint8Array([0, 1, 32, 65, 109, 98])), + ).toBe('"\\x00\\x01\\x20\\x41\\x6d\\x62"'); + + expect(convertDictionaryEntry(new Uint8Array([...Array(256).keys()]))).toBe( + '"\\x00\\x01\\x02\\x03\\x04\\x05\\x06\\x07\\x08\\x09\\x0a\\x0b\\x0c\\x0d\\x0e\\x0f' + + "\\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17\\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f" + + "\\x20\\x21\\x22\\x23\\x24\\x25\\x26\\x27\\x28\\x29\\x2a\\x2b\\x2c\\x2d\\x2e\\x2f" + + "\\x30\\x31\\x32\\x33\\x34\\x35\\x36\\x37\\x38\\x39\\x3a\\x3b\\x3c\\x3d\\x3e\\x3f" + + "\\x40\\x41\\x42\\x43\\x44\\x45\\x46\\x47\\x48\\x49\\x4a\\x4b\\x4c\\x4d\\x4e\\x4f" + + "\\x50\\x51\\x52\\x53\\x54\\x55\\x56\\x57\\x58\\x59\\x5a\\x5b\\x5c\\x5d\\x5e\\x5f" + + "\\x60\\x61\\x62\\x63\\x64\\x65\\x66\\x67\\x68\\x69\\x6a\\x6b\\x6c\\x6d\\x6e\\x6f" + + "\\x70\\x71\\x72\\x73\\x74\\x75\\x76\\x77\\x78\\x79\\x7a\\x7b\\x7c\\x7d\\x7e\\x7f" + + "\\x80\\x81\\x82\\x83\\x84\\x85\\x86\\x87\\x88\\x89\\x8a\\x8b\\x8c\\x8d\\x8e\\x8f" + + "\\x90\\x91\\x92\\x93\\x94\\x95\\x96\\x97\\x98\\x99\\x9a\\x9b\\x9c\\x9d\\x9e\\x9f" + + "\\xa0\\xa1\\xa2\\xa3\\xa4\\xa5\\xa6\\xa7\\xa8\\xa9\\xaa\\xab\\xac\\xad\\xae\\xaf" + + "\\xb0\\xb1\\xb2\\xb3\\xb4\\xb5\\xb6\\xb7\\xb8\\xb9\\xba\\xbb\\xbc\\xbd\\xbe\\xbf" + + "\\xc0\\xc1\\xc2\\xc3\\xc4\\xc5\\xc6\\xc7\\xc8\\xc9\\xca\\xcb\\xcc\\xcd\\xce\\xcf" + + "\\xd0\\xd1\\xd2\\xd3\\xd4\\xd5\\xd6\\xd7\\xd8\\xd9\\xda\\xdb\\xdc\\xdd\\xde\\xdf" + + "\\xe0\\xe1\\xe2\\xe3\\xe4\\xe5\\xe6\\xe7\\xe8\\xe9\\xea\\xeb\\xec\\xed\\xee\\xef" + + '\\xf0\\xf1\\xf2\\xf3\\xf4\\xf5\\xf6\\xf7\\xf8\\xf9\\xfa\\xfb\\xfc\\xfd\\xfe\\xff"', + ); + }); +}); + function writeDict(content: string) { const dict = tmp.fileSync({ mode: 0o700, diff --git a/packages/core/dictionary.ts b/packages/core/dictionary.ts index 7c6f9056c..82e8c1373 100644 --- a/packages/core/dictionary.ts +++ b/packages/core/dictionary.ts @@ -1,5 +1,5 @@ /* - * Copyright 2023 Code Intelligence GmbH + * Copyright 2026 Code Intelligence GmbH * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -18,7 +18,7 @@ import fs from "fs"; import tmp from "tmp"; -import { getOrSetJazzerJsGlobal } from "./api"; +import { getOrSetJazzerJsGlobal } from "./globals"; /** * Dictionaries can be used to provide additional mutation suggestions to the @@ -44,9 +44,48 @@ export function addDictionary(...dictionary: string[]) { getDictionary().addEntries(dictionary); } -export function useDictionaryByParams(options: string[]): string[] { - const opts = [...options]; - const dictionary = getDictionary().entries; +/** + * Escapes a byte array to a string that can be used in a libFuzzer dictionary. + * The format is a double-quoted string with escaped hex bytes. + * @param byteArray + * @returns The escaped string. + * + * Example: + * new Uint8Array([0,1,2,3]) will be converted to '"\\x00\\x01\\x02\\x03"' + * Example: + * "Amazing" will be converted to '"\\x41\\x6d\\x61\\x7a\\x69\\x6e\\x67"' + */ +export function toEscapedString(byteArray: Uint8Array | Int8Array): string { + return ( + '"' + + Array.from(byteArray, (byte) => { + return "\\x" + byte.toString(16).padStart(2, "0"); + }).join("") + + '"' + ); +} + +export function convertDictionaryEntry( + entry: string | Uint8Array | Int8Array, +): string { + // Strings are converted to UTF-8 Uint8Arrays before escaping all according to libFuzzer dictionary format. + // Background: Strings are encoded to UTF-8 here, which matches the way strings are produced from bytes by + // the FuzzedDataProvider (by default), as well as the encoding used with sanitizer trace hooks for string + // comparisons (see packages/fuzzer/trace.ts). + return toEscapedString( + typeof entry === "string" ? new TextEncoder().encode(entry) : entry, + ); +} + +export function useDictionaryByParams( + options: string[], + additionalDictionaryEntries: (string | Uint8Array | Int8Array)[] = [], +): string[] { + const additionalDictionary = additionalDictionaryEntries.map( + convertDictionaryEntry, + ); + + const dictionary = getDictionary().entries.concat(additionalDictionary); // This diverges from the libFuzzer behavior, which allows only one dictionary (the last one). // We merge all dictionaries into one and pass that to libfuzzer. @@ -72,8 +111,7 @@ export function useDictionaryByParams(options: string[]): string[] { }); fs.writeFileSync(dictFile.name, content); fs.closeSync(dictFile.fd); - - opts.push("-dict=" + dictFile.name); + return options.concat("-dict=" + dictFile.name); } - return opts; + return options; } diff --git a/packages/core/finding.test.ts b/packages/core/finding.test.ts index 618c65591..18ca91313 100644 --- a/packages/core/finding.test.ts +++ b/packages/core/finding.test.ts @@ -1,5 +1,5 @@ /* - * Copyright 2023 Code Intelligence GmbH + * Copyright 2026 Code Intelligence GmbH * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -26,8 +26,8 @@ describe("Finding", () => { error.stack = withSystemSeparator(`Error: Welcome to Awesome Fuzzing! at Object.Error [as fuzzMe] (/home/Code-Intelligence/jazzer.js/tests/jest_integration/jest_project/target.js:19:9) at fuzzMe (/home/Code-Intelligence/jazzer.js/tests/jest_integration/jest_project/integration.fuzz.js:30:11) - at /home/Code-Intelligence/jazzer.js/packages/core/core.ts:341:5 - at /home/Code-Intelligence/jazzer.js/packages/jest-runner/fuzz.ts:152:6`); + at /home/Code-Intelligence/jazzer.js-commercial/packages/core/core.ts:341:5 + at /home/Code-Intelligence/jazzer.js-commercial/packages/jest-runner/fuzz.ts:152:6`); printFinding(error, printer); diff --git a/packages/core/finding.ts b/packages/core/finding.ts index efd5da5ef..52c80244e 100644 --- a/packages/core/finding.ts +++ b/packages/core/finding.ts @@ -1,5 +1,5 @@ /* - * Copyright 2023 Code Intelligence GmbH + * Copyright 2026 Code Intelligence GmbH * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -18,7 +18,7 @@ import { EOL } from "os"; import { sep } from "path"; import process from "process"; -import { getJazzerJsGlobal, setJazzerJsGlobal } from "./api"; +import { getJazzerJsGlobal, setJazzerJsGlobal } from "./globals"; const firstFinding = "firstFinding"; @@ -149,10 +149,15 @@ export function cleanErrorStack(error: unknown): void { // like bug detector and reporting ones, and stack frames on the bottom, like the function // wrapper. const filterCriteria = [ - `@jazzer.js${sep}`, // cli usage - `jazzer.js${sep}packages${sep}`, // jest usage - `jazzer.js${sep}core${sep}`, // jest usage - `..${sep}..${sep}packages${sep}`, // local/filesystem dependencies + `${sep}@jazzer.js${sep}`, // cli usage + // Filter public name (jest) + `${sep}jazzer.js${sep}packages${sep}`, + `${sep}jazzer.js${sep}core${sep}`, + // Filter private name (jest) + `${sep}jazzer.js-commercial${sep}packages${sep}`, + `${sep}jazzer.js-commercial${sep}core${sep}`, + // Filter local/filesystem dependencies + `..${sep}..${sep}packages${sep}`, ]; error.stack = error.stack .split("\n") diff --git a/packages/core/globals.test.ts b/packages/core/globals.test.ts index 7d53d923c..775ba04bc 100644 --- a/packages/core/globals.test.ts +++ b/packages/core/globals.test.ts @@ -1,5 +1,5 @@ /* - * Copyright 2023 Code Intelligence GmbH + * Copyright 2026 Code Intelligence GmbH * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/packages/core/globals.ts b/packages/core/globals.ts index edd2ee2a2..d27c0960f 100644 --- a/packages/core/globals.ts +++ b/packages/core/globals.ts @@ -1,5 +1,5 @@ /* - * Copyright 2023 Code Intelligence GmbH + * Copyright 2026 Code Intelligence GmbH * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/packages/core/options.test.ts b/packages/core/options.test.ts index 8261c7264..d91a58a78 100644 --- a/packages/core/options.test.ts +++ b/packages/core/options.test.ts @@ -1,5 +1,5 @@ /* - * Copyright 2023 Code Intelligence GmbH + * Copyright 2026 Code Intelligence GmbH * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -15,100 +15,247 @@ */ import { - buildOptions, - defaultOptions, + defaultCLIOptions, fromSnakeCase, fromSnakeCaseWithPrefix, Options, - ParameterResolverIndex, - setParameterResolverValue, + OptionsManager, + OptionSource, spawnsSubprocess, + validateKeySource, } from "./options"; -const commandLineArguments = ParameterResolverIndex.CommandLineArguments; -const configurationFile = ParameterResolverIndex.ConfigurationFile; - describe("options", () => { - describe("processOptions", () => { - it("use default options if none given", () => { - expect(buildOptions()).toEqual(defaultOptions); + describe("OptionsManager", () => { + it("mergeInPlace: options of type string[] are copied", () => { + const input = ["1", "2", "3"]; + const v0 = "CHANGED"; + const v1 = "CHANGED AGAIN"; + + // get all keys of Options for which the type is string[] + Object.keys(defaultCLIOptions).forEach((key) => { + if (defaultCLIOptions[key as keyof Options] instanceof Array) { + mutateArrayAndCheck(key as keyof Options, input, v0, v1); + } + }); }); - it("prefer configuration file values to defaults", () => { - withResolverValue(configurationFile, { fuzzTarget: "FOO" }, () => { - const options = buildOptions(); - expect(options).toHaveProperty("fuzzTarget", "FOO"); - expectDefaultsExceptKeys(options, "fuzzTarget"); + + it("mergeInPlace: Uint8Array is copied", () => { + const originalArray = new Uint8Array([0, 1, 2, 3, 4, 5]); + const options = new OptionsManager(OptionSource.DefaultCLIOptions); + options.merge( + { dictionaryEntries: [originalArray] }, + OptionSource.JestFuzzTestOptions, + ); + originalArray[0] = 42; + expect(options.get("dictionaryEntries")).not.toStrictEqual(originalArray); + expect(options.get("dictionaryEntries")).toStrictEqual([ + new Uint8Array([0, 1, 2, 3, 4, 5]), + ]); + }); + + it("mergeInPlace: Int8Array is copied", () => { + const originalArray = new Int8Array([-1, 0, 1, 2, 3, 4, 5]); + const options = new OptionsManager(OptionSource.DefaultCLIOptions); + options.merge( + { dictionaryEntries: [originalArray] }, + OptionSource.JestFuzzTestOptions, + ); + originalArray[0] = 42; + expect(options.get("dictionaryEntries")).not.toStrictEqual(originalArray); + expect(options.get("dictionaryEntries")).toStrictEqual([ + new Int8Array([-1, 0, 1, 2, 3, 4, 5]), + ]); + }); + }); + + describe("merge", () => { + it("New options with lower priorities will not be added", () => { + const baseOptions = OptionsManager.attachSource( + defaultCLIOptions, + OptionSource.JestFuzzTestOptions, + ); + + const mergedOptions = new OptionsManager(baseOptions).merge( + { verbose: "foo", fuzzTarget: "bla" }, + OptionSource.CommandLineArguments, + ); + expect(mergedOptions.getOptions()).not.toHaveProperty("verbose", "foo"); + }); + + it("Only 'Jest fuzz tests' are allowed to set `dictionaryEntries`", () => { + // Looping over enum keys gives them twice: 1) 0...n; 2) the key names: "JestFuzztestOptions" etc. + Object.keys(OptionSource) + .filter((k) => isNaN(Number(k))) + .forEach((key) => { + const source = OptionSource[key as keyof typeof OptionSource]; + if (source === OptionSource.JestFuzzTestOptions) { + const options = new OptionsManager( + OptionSource.DefaultCLIOptions, + ).merge({ dictionaryEntries: ["foo"] }, source); + expect(options.getOptionsWithSource()).toHaveProperty( + "dictionaryEntries", + { + value: ["foo"], + source: source, + }, + ); + } else { + expect(() => { + new OptionsManager(OptionSource.DefaultCLIOptions).merge( + { dictionaryEntries: ["foo"] }, + source, + ); + }).toThrow(); + } + }); + }); + }); + + describe("detachSource", () => { + it("options should not change", () => { + // @ts-ignore + const options = OptionsManager.detachSource({ + verbose: { value: false, source: OptionSource.JestFuzzTestOptions }, + dictionaryEntries: { + value: ["1", "2", "3"], + source: OptionSource.JestFuzzTestOptions, + }, }); + expect(options).toHaveProperty("verbose", false); + expect(options).toHaveProperty("dictionaryEntries", ["1", "2", "3"]); + // expect options to have only one property + expect(Object.keys(options).length).toEqual(2); + }); + }); + + describe("processOptions", () => { + it("prefer configuration file values to defaults", () => { + const manager = new OptionsManager(OptionSource.DefaultJestOptions).merge( + { fuzzTarget: "FOO" }, + OptionSource.ConfigurationFile, + ); + const options = manager.getOptions(); + expect(options).toHaveProperty("fuzzTarget", "FOO"); + expectDefaultsExceptKeys( + options, + OptionSource.DefaultJestOptions, + "fuzzTarget", + ); }); it("prefer environment variables to configuration file values", () => { - withResolverValue(configurationFile, { fuzzTarget: "QUX" }, () => { - withEnv("JAZZER_FUZZ_TARGET", "FOO", () => { - withEnv("JAZZER_INCLUDES", '["BAR", "BAZ"]', () => { - const options = buildOptions(); - expect(options).toHaveProperty("fuzzTarget", "FOO"); - expect(options).toHaveProperty("includes", ["BAR", "BAZ"]); - expectDefaultsExceptKeys(options, "fuzzTarget", "includes"); - }); + withEnv("JAZZER_FUZZ_TARGET", "FOO", () => { + withEnv("JAZZER_INCLUDES", '["BAR", "BAZ"]', () => { + withSource( + OptionSource.DefaultJestOptions, + { fuzzTarget: "QUX" }, + OptionSource.ConfigurationFile, + (options) => { + expect(options).toHaveProperty("fuzzTarget", "FOO"); + expect(options).toHaveProperty("includes", ["BAR", "BAZ"]); + expectDefaultsExceptKeys( + options, + OptionSource.DefaultJestOptions, + "fuzzTarget", + "includes", + ); + }, + ); }); }); }); it("prefer CLI parameters to environment variables", () => { withEnv("JAZZER_FUZZ_TARGET", "bar", () => { - withResolverValue(commandLineArguments, { fuzz_target: "foo" }, () => { - const options = buildOptions(); - expect(options).toHaveProperty("fuzzTarget", "foo"); - expectDefaultsExceptKeys(options, "fuzzTarget"); - }); + withSource( + OptionSource.DefaultCLIOptions, + { fuzzTarget: "foo" }, + OptionSource.CommandLineArguments, + (options) => { + expect(options).toHaveProperty("fuzzTarget", "foo"); + expectDefaultsExceptKeys( + options, + OptionSource.DefaultCLIOptions, + "fuzzTarget", + ); + }, + ); }); }); it("includes and excludes are set together", () => { - withResolverValue(commandLineArguments, { includes: ["foo"] }, () => { - expect(buildOptions()).toHaveProperty("excludes", []); - }); - withResolverValue(commandLineArguments, { excludes: ["foo"] }, () => { - expect(buildOptions()).toHaveProperty("includes", []); - }); + withSource( + OptionSource.DefaultCLIOptions, + { includes: ["foo"] }, + OptionSource.CommandLineArguments, + (options) => { + expect(options).toHaveProperty("excludes", []); + }, + ); + withSource( + OptionSource.DefaultCLIOptions, + { excludes: ["foo"] }, + OptionSource.CommandLineArguments, + (options) => { + expect(options).toHaveProperty("includes", []); + }, + ); }); it("error on unknown option", () => { - withResolverValue(commandLineArguments, { unknown_option: "foo" }, () => { - expect(() => buildOptions()).toThrow("'unknown_option'"); - }); + expect(() => { + withSource( + OptionSource.DefaultCLIOptions, + { unknown_option: "foo" }, + OptionSource.CommandLineArguments, + (options) => {}, + ); + }).toThrow("unknown_option"); }); it("error on mismatching type", () => { - withResolverValue(commandLineArguments, { fuzz_target: false }, () => { - expect(() => buildOptions()).toThrow("expected type 'string'"); - }); + expect(() => { + withSource( + OptionSource.DefaultCLIOptions, + { fuzzTarget: false }, + OptionSource.CommandLineArguments, + (options) => {}, + ); + }).toThrow("expected type 'string'"); }); - it("does not use parts of input", () => { + it("options are copied", () => { const input = { includes: ["foo"] }; - withResolverValue(commandLineArguments, input, () => { - const options = buildOptions(); - input.includes.push("bar"); - expect(options.includes).not.toContain("bar"); - }); + withSource( + OptionSource.DefaultCLIOptions, + input, + OptionSource.CommandLineArguments, + (options) => { + input.includes.push("bar"); + expect(options.includes).not.toContain("bar"); + }, + ); }); it("set debug env variable", () => { withEnv("JAZZER_DEBUG", "", () => { - withResolverValue(commandLineArguments, { verbose: true }, () => { - buildOptions(); - expect(process.env.JAZZER_DEBUG).toEqual("1"); - }); + withSource( + OptionSource.DefaultCLIOptions, + { verbose: true }, + OptionSource.CommandLineArguments, + (options) => { + expect(process.env.JAZZER_DEBUG).toEqual("1"); + }, + ); }); withEnv("JAZZER_DEBUG", "", () => { withEnv("DEBUG", "1", () => { - buildOptions(); - expect(process.env.JAZZER_DEBUG).toEqual("1"); + // const options = buildInitialOptions(OptionSource.DefaultCLIOptions); + // expect(process.env.JAZZER_DEBUG).toEqual("1"); }); }); }); it("does not merge __proto__", () => { expect(() => { - withResolverValue( - commandLineArguments, + withSource( + OptionSource.DefaultCLIOptions, JSON.parse('{"__proto__": {"polluted": 42}}'), - () => { - buildOptions(); - }, + OptionSource.CommandLineArguments, + (options) => {}, ); }).toThrow(); }); @@ -167,7 +314,12 @@ describe("buildLibFuzzerOptions", () => { }); }); -function expectDefaultsExceptKeys(options: Options, ...ignore: string[]) { +function expectDefaultsExceptKeys( + options: Options, + source: OptionSource, + ...ignore: string[] +) { + const defaultOptions = new OptionsManager(source).getOptions(); Object.keys(defaultOptions).forEach((key: string) => { if (ignore.includes(key)) return; expect(options).toHaveProperty(key, defaultOptions[key as keyof Options]); @@ -188,15 +340,65 @@ function withEnv(property: string, value: string, fn: () => void) { } } -function withResolverValue( - index: ParameterResolverIndex, +function withSource( + initialSource: OptionSource, args: object, - fn: () => void, + argsSource: OptionSource, + fn: (options: Options) => void, +) { + const options = new OptionsManager(initialSource).merge(args, argsSource); + fn(options.getOptions()); +} + +// Check that OptionsManager.merge() copies new input +function mutateArrayAndCheck( + key: K, + newValue: T[K], + // eslint-disable-next-line @typescript-eslint/no-explicit-any + v0: any, + // eslint-disable-next-line @typescript-eslint/no-explicit-any + v1: any, ) { + const options = new OptionsManager(OptionSource.DefaultCLIOptions); + const newValueCopy = OptionsManager.copyOptionValue(newValue); + if (!(newValueCopy instanceof Array) || newValueCopy.length < 1) { + throw new Error("Array should have at least 1 elements."); + } + if (!(newValue instanceof Array) || newValueCopy.length < 1) { + throw new Error("Array should have at least 1 elements."); + } + const originalReference = options.get(key); + const originalValue = OptionsManager.copyOptionValue(originalReference); + + let newPriority = OptionSource.CommandLineArguments; try { - setParameterResolverValue(index, args); - fn(); - } finally { - setParameterResolverValue(index, {}); + validateKeySource(key, OptionSource.JestFuzzTestOptions); + newPriority = OptionSource.JestFuzzTestOptions; + } catch (e) { + /**/ + } + + options.merge({ [key]: newValue }, newPriority); + const newReference = options.get(key); + if (!(newReference instanceof Array) || newReference.length < 1) { + throw new Error("Array should have at least 1 elements."); } + const newStoredValue = OptionsManager.copyOptionValue(newReference); + + // after merge, value of the option should equal to the newValue, and not equal to the old one + expect(options.get(key)).toStrictEqual(newValue); + expect(options.get(key)).not.toStrictEqual(originalValue); + // also the reference should be different + expect(options.get(key)).not.toStrictEqual(originalReference); + + // mutate newValue and check that the new value of option is not changed + newValue[0] = v0; + expect(options.get(key)).toStrictEqual(newStoredValue); + + // mutate the option, and check that newValue is not changed + newReference[0] = v1; + expect(newValue[0]).toStrictEqual(v0); + // @ts-ignore + expect(options.get(key)[0]).toStrictEqual(v1); + return options; } diff --git a/packages/core/options.ts b/packages/core/options.ts index 74532dbc1..66dfae2d7 100644 --- a/packages/core/options.ts +++ b/packages/core/options.ts @@ -1,5 +1,5 @@ /* - * Copyright 2023 Code Intelligence GmbH + * Copyright 2026 Code Intelligence GmbH * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -15,6 +15,7 @@ */ import fs from "fs"; +import * as util from "util"; import * as tmp from "tmp"; @@ -29,62 +30,94 @@ import { replaceAll } from "./utils"; * options. */ export interface Options { - // `fuzzTarget` is the name of a module exporting the fuzz function `fuzzEntryPoint`. - fuzzTarget: string; - // Name of the function that is called by the fuzzer exported by `fuzzTarget`. - fuzzEntryPoint: string; - // Part of filepath names to include in the instrumentation. - includes: string[]; - // Part of filepath names to exclude in the instrumentation. - excludes: string[]; - // Whether to add fuzzing instrumentation or not. - dryRun: boolean; - // Whether to run the fuzzer in sync mode or not. - sync: boolean; - // Options to pass on to the underlying fuzzing engine. - fuzzerOptions: string[]; - // Files to load that contain custom hooks. - customHooks: string[]; - // Expected error name that won't trigger the fuzzer to stop with an error exit code. - expectedErrors: string[]; - // Timeout for one fuzzing iteration in milliseconds. - timeout: number; - // Internal: File to sync coverage IDs in fork mode. - idSyncFile?: string; // Enable source code coverage report generation. coverage: boolean; // Directory to write coverage reports to. coverageDirectory: string; // Coverage reporters to use during report generation. coverageReporters: string[]; + // Files to load that contain custom hooks. + customHooks: string[]; + // Fuzzing dictionaries + dictionaryEntries: (string | Uint8Array | Int8Array)[]; // Disable bug detectors by name. disableBugDetectors: string[]; + // Whether to add fuzzing instrumentation or not. + dryRun: boolean; + // Part of filepath names to exclude in the instrumentation. + excludes: string[]; + // Expected error name that won't trigger the fuzzer to stop with an error exit code. + expectedErrors: string[]; + // Name of the function that is called by the fuzzer exported by `fuzzTarget`. + fuzzEntryPoint: string; + // Options to pass on to the underlying fuzzing engine. + fuzzerOptions: string[]; + // `fuzzTarget` is the name of a module exporting the fuzz function `fuzzEntryPoint`. + fuzzTarget: string; + // Internal: File to sync coverage IDs in fork mode. + idSyncFile: string; + // Part of filepath names to include in the instrumentation. + includes: string[]; // Fuzzing mode. mode: "fuzzing" | "regression"; + // Whether to run the fuzzer in sync mode or not. + sync: boolean; + // Timeout for one fuzzing iteration in milliseconds. + timeout: number; // Verbose logging. - verbose?: boolean; + verbose: boolean; } -export const defaultOptions: Options = Object.freeze({ - fuzzTarget: "", - fuzzEntryPoint: "fuzz", - includes: ["*"], - excludes: ["node_modules"], - dryRun: false, - sync: false, - fuzzerOptions: [], - customHooks: [], - expectedErrors: [], - timeout: 5000, // default Jest timeout - idSyncFile: "", +export type OptionWithSource = { + value: Options[K]; + source: OptionSource; +}; +export type OptionsWithSource = { [P in keyof Options]: OptionWithSource

}; + +type OptionWithPrintableSource = { + value: Options[K]; + source: string; +}; + +export type OptionsWithPrintableSource = { + [P in keyof Options]: OptionWithPrintableSource

; +}; + +// These options can be set from the Jest fuzz test. +const allowedFuzzTestOptions = [ + "dictionaryEntries", + "fuzzerOptions", + "sync", + "timeout", +] as const; +export type AllowedFuzzTestOptions = (typeof allowedFuzzTestOptions)[number]; + +export const defaultCLIOptions: Options = Object.freeze({ coverage: false, coverageDirectory: "coverage", coverageReporters: ["json", "text", "lcov", "clover"], // default Jest reporters + customHooks: [], + dictionaryEntries: [], disableBugDetectors: [], + dryRun: false, + excludes: ["node_modules"], + expectedErrors: [], + fuzzEntryPoint: "fuzz", + fuzzerOptions: [], + fuzzTarget: "", + idSyncFile: "", + includes: ["*"], mode: "fuzzing", + sync: false, + timeout: 5000, // default Jest timeout verbose: false, }); +export const defaultJestOptions: Options = Object.freeze({ + ...defaultCLIOptions, + mode: "regression", +}); + export type KeyFormatSource = (key: string) => string; export const fromCamelCase: KeyFormatSource = (key: string): string => key; @@ -104,166 +137,335 @@ export const fromSnakeCaseWithPrefix: (prefix: string) => KeyFormatSource = ( }; }; -// Parameters can be passed in via environment variables, command line or -// configuration file, and subsequently overwrite the default ones and each other. -// The passed in values have to be set for externally provided parameters, e.g. -// CLI parameters, before resolving the final options object. +// Source of an option is considered when merging options. // Higher index means higher priority. -export enum ParameterResolverIndex { - DefaultOptions = 1, +export enum OptionSource { + DefaultCLIOptions, + DefaultJestOptions, + InternalJestTimeout, ConfigurationFile, EnvironmentVariables, CommandLineArguments, + JestFuzzTestOptions, } -type ParameterResolver = { + +type DefaultSourceInfo = { name: string; transformKey: KeyFormatSource; failOnUnknown: boolean; - parameters: object; + parameters?: Options | object; }; -type ParameterResolvers = Record; -const defaultResolvers: ParameterResolvers = { - [ParameterResolverIndex.DefaultOptions]: { - name: "Default options", +const defaultOptions: Record = { + [OptionSource.DefaultCLIOptions]: { + name: "Default CLI options", + transformKey: fromCamelCase, + failOnUnknown: true, + parameters: defaultCLIOptions, + }, + [OptionSource.DefaultJestOptions]: { + name: "Default Jest options", + transformKey: fromCamelCase, + failOnUnknown: true, + parameters: defaultJestOptions, + }, + [OptionSource.InternalJestTimeout]: { + name: "Internal Jest timeout", transformKey: fromCamelCase, failOnUnknown: true, - parameters: defaultOptions, }, - [ParameterResolverIndex.ConfigurationFile]: { + [OptionSource.ConfigurationFile]: { name: "Configuration file", transformKey: fromCamelCase, failOnUnknown: true, - parameters: {}, }, - [ParameterResolverIndex.EnvironmentVariables]: { + [OptionSource.EnvironmentVariables]: { name: "Environment variables", transformKey: fromSnakeCaseWithPrefix("JAZZER"), failOnUnknown: false, parameters: process.env as object, }, - [ParameterResolverIndex.CommandLineArguments]: { + [OptionSource.CommandLineArguments]: { name: "Command line arguments", - transformKey: fromSnakeCase, + transformKey: fromCamelCase, failOnUnknown: true, - parameters: {}, }, -}; + [OptionSource.JestFuzzTestOptions]: { + name: "Jest fuzz test options", + transformKey: fromCamelCase, + failOnUnknown: true, + }, +} as const; -/** - * Set the value object of a parameter resolver. Every resolver expects value - * object parameter names in a specific format, e.g. camel case or snake case, - * see the resolver definitions for details. - */ -export function setParameterResolverValue( - index: ParameterResolverIndex, - inputs: Partial, -) { - // Includes and excludes must be set together. - if (inputs && inputs.includes && !inputs.excludes) { - inputs.excludes = []; - } else if (inputs && inputs.excludes && !inputs.includes) { - inputs.includes = []; - } - defaultResolvers[index].parameters = inputs; -} +export class OptionsManager { + private readonly _options: OptionsWithSource; -/** - * Build a complete `Option` object based on the parameter resolver chain. - * Add externally passed in values via the `setParameterResolverValue` function, - * before calling `buildOptions`. - */ -export function buildOptions(): Options { - const options = Object.keys(defaultResolvers) - .sort() // Don't presume an ordered object, this could be implementation specific. - .reduce((accumulator, currentValue) => { - const resolver = - defaultResolvers[parseInt(currentValue) as ParameterResolverIndex]; - return mergeOptions( - resolver.parameters, - accumulator, - resolver.transformKey, - resolver.failOnUnknown, + constructor(obj: OptionSource); + constructor(obj: OptionsWithSource); + /** + * Manages merging of options from different sources. + * WARNING: each fuzz test needs a copy (use the `clone()` function) of the OptionsManager, otherwise the fuzz tests will overwrite each other's options. + * @param sourceOrOptions - build options given the `OptionSource`; or use provided options as is. + */ + constructor(sourceOrOptions: OptionSource | OptionsWithSource) { + if (typeof sourceOrOptions === "number") { + const source = sourceOrOptions; + const initialOptions = defaultOptions[source].parameters as Options; + if (!initialOptions) { + throw new Error( + `Default options for ${source} do not exist. Consider adding them or use a different source.`, + ); + } + this._options = OptionsManager.copyOptions( + OptionsManager.attachSource(initialOptions, source), ); - }, defaultResolvers[ParameterResolverIndex.DefaultOptions].parameters as Options); + this.merge(process.env, OptionSource.EnvironmentVariables); + } else if (typeof sourceOrOptions === "object") { + // only used by clone() + this._options = OptionsManager.copyOptions(sourceOrOptions); + } else { + throw new Error("Invalid argument"); + } + } - // Set verbose mode environment variable via option or node DEBUG environment variable. - if (options.verbose || process.env.DEBUG) { - process.env.JAZZER_DEBUG = "1"; + /** + * Get the value of an option. + * @param key + */ + get(key: K): Options[K] { + return this._options[key].value; + } + + /** + * Get raw options without the source information. + * @returns a copy of the options without source information + */ + getOptions(): Options { + return OptionsManager.detachSource(this._options); } - return options; -} -function mergeOptions( - input: unknown, - defaults: Options, - transformKey: (key: string) => string, - errorOnUnknown = true, -): Options { - // Deep close the default options to avoid mutation. - const options: Options = JSON.parse(JSON.stringify(defaults)); - if (!options || !input || typeof input !== "object") { - return options; + getOptionsWithSource(): OptionsWithSource { + return this._options; } - Object.keys(input as object).forEach((key) => { - const transformedKey = transformKey(key); - // Use hasOwnProperty to still support node v14. - // eslint-disable-next-line no-prototype-builtins - if (!(options as object).hasOwnProperty(transformedKey)) { - if (errorOnUnknown) { - throw new Error(`Unknown Jazzer.js option '${key}'`); + + /** + * Merge new options from `input` given the `source` (aka priority). Same `source` options will result in an error---accumulate the options before writing. + * `input` gets deep cloned to avoid reference keeping and unintended mutations. + * @param input - new options to merge + * @param source - priority of all the options in `input` + */ + merge(input: unknown, source: OptionSource) { + const transformKey = defaultOptions[source].transformKey; + const errorOnUnknown = defaultOptions[source].failOnUnknown; + + let includes: typeof this._options.includes.value | undefined = undefined; + let excludes: typeof this._options.excludes.value | undefined = undefined; + + Object.keys(input as object).forEach((k) => { + const transformedKey = transformKey(k); + + // Use hasOwnProperty to still support node v14. + // eslint-disable-next-line no-prototype-builtins + if (!defaultCLIOptions.hasOwnProperty(transformedKey)) { + if (errorOnUnknown) { + throw new Error(`Unknown Jazzer.js option '${k}'`); + } + return; } - return; - } - // No way to dynamically resolve the types here, use (implicit) any for now. - // @ts-ignore - let resultValue = input[key]; - // Try to parse strings as JSON values to support setting arrays and - // objects via environment variables. - if (typeof resultValue === "string" || resultValue instanceof String) { - try { - resultValue = JSON.parse(resultValue.toString()); - } catch (ignore) { - // Ignore parsing errors and continue with the string value. + const key = transformedKey as keyof Options; + if (!validateOptionPermissions(key, source, this._options)) { + return; } - } - //@ts-ignore - const keyType = typeof options[transformedKey]; - if (typeof resultValue !== keyType) { + + const keyType = typeof defaultCLIOptions[key]; + + // No way to dynamically resolve the types here, use (implicit) any for now. // @ts-ignore - throw new Error( - `Invalid type for Jazzer.js option '${key}', expected type '${keyType}'`, - ); + let resultValue = input[k]; + // Try to parse strings as JSON values to support setting arrays and + // objects via environment variables and command line arguments. + if ( + [ + OptionSource.CommandLineArguments, + OptionSource.EnvironmentVariables, + ].includes(source) && + keyType !== "string" && + (typeof resultValue === "string" || resultValue instanceof String) + ) { + try { + resultValue = JSON.parse(resultValue.toString()); + } catch (ignore) { + // Ignore parsing errors and continue with the string value. + } + } + + if (typeof resultValue !== keyType) { + throw new Error( + `Invalid type for Jazzer.js option '${key}', expected type '${keyType}', got '${typeof resultValue}'`, + ); + } + // Deep copy the new value to avoid reference keeping and unintended mutations. + resultValue = OptionsManager.copyOptionValue(resultValue); + setProperty(this._options, key, { value: resultValue, source: source }); + + if (key === "includes") { + includes = resultValue; + } else if (key === "excludes") { + excludes = resultValue; + } + }); + + // Includes and excludes must be set together. + if (input && includes && !excludes) { + this._options.excludes.value = []; + } else if (input && excludes && !includes) { + this._options.includes.value = []; } - // Deep clone value to avoid reference keeping and unintended mutations. - // @ts-ignore - options[transformedKey] = JSON.parse(JSON.stringify(resultValue)); - }); - return options; -} -export function buildFuzzerOption(options: Options) { - if (process.env.JAZZER_DEBUG) { - console.debug("DEBUG: [core] Jazzer.js initial fuzzer arguments: "); - console.debug(options); + // Set verbose mode environment variable via option or node DEBUG environment variable. + // Subsequent changes to the `verbose` option will be ignored. + if (this.get("verbose") || process.env.DEBUG) { + process.env.JAZZER_DEBUG = "1"; + } + return this; + } + + clone(): OptionsManager { + return new OptionsManager(this._options); } + static copyOptions(newOptions: OptionsWithSource): OptionsWithSource { + const result: OptionsWithSource = Object.create(null); + Object.entries(newOptions).forEach(([k]) => { + const key = k as keyof Options; + const option = newOptions[key]; + const value = OptionsManager.copyOptionValue(option.value); + const source = option.source; + setProperty(result, key, { + value, + source, + }); + }); + return result; + } + + static copyOptionValue( + input: T[K], + ): T[K] { + // simple types + if (!input || typeof input !== "object") { + return input; + } + + if (Array.isArray(input)) { + // (Uint8Array | Int8Array)[] - each sub-array gets copied + if ( + input.some( + (element) => + element instanceof Uint8Array || element instanceof Int8Array, + ) + ) { + return input.map((element) => { + if (element instanceof Uint8Array || element instanceof Int8Array) { + return element.slice(); + } + return element; + }) as T[K]; + } + + // string[] - the array can be copied directly + return input.slice() as T[K]; + } + + throw new Error("copyOptionValue: unsupported type: " + typeof input); + } + + /** + * Build options with source information attached. + * + * @param options + * @returns a copy of the options with source information + */ + static attachSource( + options: Options, + source: OptionSource, + ): OptionsWithSource { + const result: OptionsWithSource = Object.create(null); + Object.entries(options).forEach(([k]) => { + const key = k as keyof Options; + setProperty(result, key, { + value: options[key], + source: source, + }); + }); + return result; + } + + /** + * Remove source information from options. + * + * @param options + * @returns a copy of the options without source information + */ + static detachSource(options: OptionsWithSource): Options { + const result: Options = Object.create(null); + Object.entries(options).forEach(([k]) => { + const key = k as keyof Options; + const value = options[key]?.value; + setProperty(result, key, value); + }); + return result; + } +} + +function setProperty(obj: T, key: K, value: T[K]) { + obj[key] = value; +} + +export function buildFuzzerOption(options: OptionsManager) { let params: string[] = []; params = optionDependentParams(options, params); params = forkedExecutionParams(params); - params = useDictionaryByParams(params); + params = useDictionaryByParams(params, options.get("dictionaryEntries")); // libFuzzer has to ignore SIGINT and SIGTERM, as it interferes // with the Node.js signal handling. params = params.concat("-handle_int=0", "-handle_term=0", "-handle_segv=0"); - if (process.env.JAZZER_DEBUG) { - console.debug("DEBUG: [core] Jazzer.js actually used fuzzer arguments: "); - console.debug(params); - } + printOptions(options); logInfoAboutFuzzerOptions(params); return params; } +export function printOptions(options: OptionsManager, infix = "") { + if (process.env.JAZZER_DEBUG) { + console.error( + util.formatWithOptions( + // Print everything in the options object. + { maxArrayLength: null, depth: null, colors: false }, + `DEBUG: [core] Jazzer.js options ${infix}: \n%O`, + toOptionsWithPrintableSources(options), + ), + ); + } +} + +function toOptionsWithPrintableSources( + options: OptionsManager, +): OptionsWithPrintableSource { + const result: OptionsWithPrintableSource = Object.create(null); + const opts = options.getOptionsWithSource(); + Object.entries(opts).forEach(([k]) => { + const key = k as keyof Options; + const value = opts[key]?.value; + const sourceIndex = opts[key]?.source; + if (sourceIndex !== undefined) { + const source = defaultOptions[sourceIndex].name; + setProperty(result, key, { value, source }); + } + }); + return result; +} + function logInfoAboutFuzzerOptions(fuzzerOptions: string[]) { fuzzerOptions.slice(1).forEach((element) => { if (element.length > 0 && element[0] != "-") { @@ -272,21 +474,24 @@ function logInfoAboutFuzzerOptions(fuzzerOptions: string[]) { }); } -function optionDependentParams(options: Options, params: string[]): string[] { - if (!options || !options.fuzzerOptions) { +function optionDependentParams( + options: OptionsManager, + params: string[], +): string[] { + if (!options || !options.get("fuzzerOptions")) { return params; } - let opts = options.fuzzerOptions; - if (options.mode === "regression") { + let opts = options.get("fuzzerOptions"); + if (options.get("mode") === "regression") { // The last provided option takes precedence opts = opts.concat("-runs=0"); } - if (options.timeout <= 0) { + if (options.get("timeout") <= 0) { throw new Error("timeout must be > 0"); } - const inSeconds = Math.ceil(options.timeout / 1000); + const inSeconds = Math.ceil(options.get("timeout") / 1000); opts = opts.concat(`-timeout=${inSeconds}`); return opts; @@ -353,3 +558,46 @@ ${jazzerArgs.map((s) => '"' + s + '"').join(" ")} -- ${isWindows ? "%*" : "$@"} return scriptTempFile.name; } + +// Check two things: +// 1) `dictionaryEntries` can only be set from "Jest fuzz test" source; +// 2) only few approved options can be set from "Jest fuzz test" source. +export function validateKeySource(key: keyof Options, source: OptionSource) { + const sourceName = defaultOptions[source].name; + + // Only "Jest fuzz test" is allowed to set `dictionaryEntries` option. + if ( + key === "dictionaryEntries" && + source !== OptionSource.JestFuzzTestOptions + ) { + const allowedSource = defaultOptions[OptionSource.JestFuzzTestOptions].name; + throw new Error( + `Tried setting option '${key}' from ${sourceName}, but this option is only available in ${allowedSource}`, + ); + } + + // Only selected options can be set from the Jest fuzz test + if ( + source === OptionSource.JestFuzzTestOptions && + !allowedFuzzTestOptions.includes(key as AllowedFuzzTestOptions) + ) { + throw new Error(`Option '${key}' is not available from "${sourceName}."`); + } +} + +// Check if the key can be set from the new source. +// +function validateOptionPermissions( + key: keyof Options, + source: OptionSource, + options: OptionsWithSource, +): boolean { + validateKeySource(key, source); + // Overwriting options from the same source is not allowed---accumulate the options before writing. + if (source === options[key].source) { + throw new Error( + `Option '${key}' already set from ${defaultOptions[source].name}`, + ); + } + return source > options[key].source; +} diff --git a/packages/core/package.json b/packages/core/package.json index e61c5f72c..b633dd334 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,6 +1,6 @@ { "name": "@jazzer.js/core", - "version": "2.1.0", + "version": "3.1.0", "description": "Jazzer.js CLI", "homepage": "https://github.com/CodeIntelligenceTesting/jazzer.js#readme", "author": "Code Intelligence", @@ -19,18 +19,18 @@ "jazzer": "dist/cli.js" }, "dependencies": { - "@jazzer.js/bug-detectors": "2.1.0", - "@jazzer.js/fuzzer": "2.1.0", - "@jazzer.js/hooking": "2.1.0", - "@jazzer.js/instrumentor": "2.1.0", - "tmp": "^0.2.1", + "@jazzer.js/bug-detectors": "3.1.0", + "@jazzer.js/fuzzer": "3.1.0", + "@jazzer.js/hooking": "3.1.0", + "@jazzer.js/instrumentor": "3.1.0", + "tmp": "^0.2.3", "istanbul-lib-coverage": "^3.2.2", "istanbul-lib-report": "^3.0.1", - "istanbul-reports": "^3.1.6", + "istanbul-reports": "^3.1.7", "yargs": "^17.7.2" }, "devDependencies": { - "@types/yargs": "^17.0.32" + "@types/yargs": "^17.0.33" }, "engines": { "node": ">= 14.0.0", diff --git a/packages/core/utils.test.ts b/packages/core/utils.test.ts index 9df50c70f..703364c79 100644 --- a/packages/core/utils.test.ts +++ b/packages/core/utils.test.ts @@ -1,5 +1,5 @@ /* - * Copyright 2023 Code Intelligence GmbH + * Copyright 2026 Code Intelligence GmbH * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -40,12 +40,12 @@ describe("core", () => { const args = { _: ["-some_arg=value", "-other_arg", 123], corpus: ["directory1", "directory2"], - fuzz_target: "filename.js", + fuzzTarget: "filename.js", }; const options = prepareArgs(args); expect(options).toEqual({ - fuzz_target: "file://" + path.join(process.cwd(), "filename.js"), - fuzzer_options: [ + fuzzTarget: "file://" + path.join(process.cwd(), "filename.js"), + fuzzerOptions: [ "directory1", "directory2", "-some_arg=value", diff --git a/packages/core/utils.ts b/packages/core/utils.ts index 5fcaf19ce..5d439583e 100644 --- a/packages/core/utils.ts +++ b/packages/core/utils.ts @@ -1,5 +1,5 @@ /* - * Copyright 2023 Code Intelligence GmbH + * Copyright 2026 Code Intelligence GmbH * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -69,11 +69,14 @@ export function ensureFilepath(filePath: string): string { export function prepareArgs(args: any) { const options = { ...args, - fuzz_target: ensureFilepath(args.fuzz_target), - fuzzer_options: (args.corpus ?? []) + fuzzTarget: ensureFilepath(args.fuzzTarget), + fuzzerOptions: (args.corpus ?? []) .concat(args._) .map((e: unknown) => e + ""), }; + if (options.fuzzerOptions.length === 0) { + delete options.fuzzerOptions; + } delete options._; delete options.corpus; delete options.$0; diff --git a/packages/fuzzer/.gitignore b/packages/fuzzer/.gitignore index 9e45caba3..94ce2116e 100644 --- a/packages/fuzzer/.gitignore +++ b/packages/fuzzer/.gitignore @@ -1,4 +1,3 @@ .cache build -prebuilds cmake-build-debug diff --git a/packages/fuzzer/addon.ts b/packages/fuzzer/addon.ts index 51e70325f..fc939bc1c 100644 --- a/packages/fuzzer/addon.ts +++ b/packages/fuzzer/addon.ts @@ -1,5 +1,5 @@ /* - * Copyright 2023 Code Intelligence GmbH + * Copyright 2026 Code Intelligence GmbH * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -14,7 +14,8 @@ * limitations under the License. */ -import { default as bind } from "bindings"; +import * as fs from "fs"; +import * as path from "path"; export type FuzzTargetAsyncOrValue = ( data: Buffer, @@ -67,4 +68,16 @@ type NativeAddon = { startFuzzingAsync: StartFuzzingAsyncFn; }; -export const addon: NativeAddon = bind("jazzerjs"); +function addonFilename(): string { + let dirName: string; + if (fs.existsSync(path.join(__dirname, "prebuilds"))) { + dirName = path.join(__dirname, "prebuilds"); + } else if (fs.existsSync(path.join(__dirname, "..", "prebuilds"))) { + dirName = path.join(__dirname, "..", "prebuilds"); + } else { + throw new Error("Could not find prebuilds directory"); + } + return path.join(dirName, `fuzzer-${process.platform}-${process.arch}.node`); +} + +export const addon: NativeAddon = require(addonFilename()); diff --git a/packages/fuzzer/coverage.ts b/packages/fuzzer/coverage.ts index d375df3e0..0f0cedded 100644 --- a/packages/fuzzer/coverage.ts +++ b/packages/fuzzer/coverage.ts @@ -1,5 +1,5 @@ /* - * Copyright 2023 Code Intelligence GmbH + * Copyright 2026 Code Intelligence GmbH * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/packages/fuzzer/fuzzer.test.ts b/packages/fuzzer/fuzzer.test.ts index d2b1e909b..c18580c4e 100644 --- a/packages/fuzzer/fuzzer.test.ts +++ b/packages/fuzzer/fuzzer.test.ts @@ -1,5 +1,5 @@ /* - * Copyright 2023 Code Intelligence GmbH + * Copyright 2026 Code Intelligence GmbH * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/packages/fuzzer/fuzzer.ts b/packages/fuzzer/fuzzer.ts index bdca092ab..1330bb44a 100644 --- a/packages/fuzzer/fuzzer.ts +++ b/packages/fuzzer/fuzzer.ts @@ -1,5 +1,5 @@ /* - * Copyright 2023 Code Intelligence GmbH + * Copyright 2026 Code Intelligence GmbH * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/packages/fuzzer/fuzzing_async.cpp b/packages/fuzzer/fuzzing_async.cpp index 50693974b..ef7a4dd0c 100644 --- a/packages/fuzzer/fuzzing_async.cpp +++ b/packages/fuzzer/fuzzing_async.cpp @@ -66,14 +66,27 @@ using FinalizerDataType = void; TSFN gTSFN; -const std::string SEGFAULT_ERROR_MESSAGE = - "Segmentation fault found in fuzz target"; +// Keeps track of how many times the user pressed CTRL+C. +volatile int nSigInts = 0; +// Store the execution context of the fuzz target function. The execution will +// jump back to this stored context in case of a segfault. +std::jmp_buf executionContext; -std::jmp_buf errorBuffer; +void sigintHandler(int signum) { + std::cerr << std::endl; // Print a newline after the ^C. + // Pressing CTRL+C more than once will terminate the process immediately. + // If the first CTRL+C had no effect, the fuzz target is probably in an + // endless loop, or the current input takes long time to process. In this case + // it's ok to terminate the process. + if (nSigInts > 0) { + _Exit(libfuzzer::RETURN_CONTINUE); + } + nSigInts++; +} // See comment on `ErrorSignalHandler` in `fuzzing_sync.cpp` for what this is // for -void ErrorSignalHandler(int signum) { std::longjmp(errorBuffer, signum); } +void ErrorSignalHandler(int signum) { std::longjmp(executionContext, signum); } // The callback invoked by libFuzzer. It has no access to the JavaScript // environment and thus can only call the JavaScript fuzz target via the @@ -115,11 +128,20 @@ void CallJsFuzzCallback(Napi::Env env, Napi::Function jsFuzzCallback, // Execute the fuzz target and reject the deferred on any raised exception by // C++ code or returned error by JS interop to stop fuzzing. try { + + // Pressing CTRL+C will gracefully end the fuzzing. + if (nSigInts > 0) { + data->promise->set_value(libfuzzer::RETURN_EXIT); + context->deferred.Resolve(env.Undefined()); + context->is_resolved = true; + return; + } + // Return point for the segfault error handler // This MUST BE called from the thread that executes the fuzz target (and // thus is the thread with the segfault) otherwise longjmp's behavior is // undefined - if (setjmp(errorBuffer) != 0) { + if (setjmp(executionContext) == SIGSEGV) { std::cerr << "==" << (unsigned long)GetPID() << "== Segmentation Fault" << std::endl; libfuzzer::PrintCrashingInput(); @@ -304,6 +326,7 @@ Napi::Value StartFuzzingAsync(const Napi::CallbackInfo &info) { context->native_thread = std::thread( [](const std::vector &fuzzer_args) { signal(SIGSEGV, ErrorSignalHandler); + signal(SIGINT, sigintHandler); StartLibFuzzer(fuzzer_args, FuzzCallbackAsync); gTSFN.Release(); }, diff --git a/packages/fuzzer/fuzzing_sync.cpp b/packages/fuzzer/fuzzing_sync.cpp index 29d3df1ed..694d2bc6b 100644 --- a/packages/fuzzer/fuzzing_sync.cpp +++ b/packages/fuzzer/fuzzing_sync.cpp @@ -30,9 +30,6 @@ #include "utils.h" namespace { -const std::string SEGFAULT_ERROR_MESSAGE = - "Segmentation fault found in fuzz target"; - // Information about a JS fuzz target. struct FuzzTargetInfo { Napi::Env env; @@ -47,14 +44,27 @@ struct FuzzTargetInfo { // to its target function. std::optional gFuzzTarget; -// Track if SIGINT signal handler was called. -// This is only necessary in the sync fuzzing case, as async can be handled -// much nicer directly in JavaScript. -volatile std::sig_atomic_t gSignalStatus; -std::jmp_buf errorBuffer; +// Signal handlers store the signal number in this variable. +volatile std::sig_atomic_t gSignalStatus = 0; +// Keeps track of how many times the user pressed CTRL+C. +volatile int nSigInts = 0; +// Store the execution context of the fuzz target function. The execution will +// jump back to this stored context in case of a segfault. +std::jmp_buf executionContext; } // namespace -void sigintHandler(int signum) { gSignalStatus = signum; } +void sigintHandler(int signum) { + std::cerr << std::endl; // Print a newline after the ^C. + gSignalStatus = signum; + // Pressing CTRL+C more than once will terminate the process immediately. + // If the first CTRL+C had no effect, the fuzz target is probably in an + // endless loop, or the current input takes long time to process. In this case + // it's ok to terminate the process. + if (nSigInts > 0) { + _Exit(libfuzzer::RETURN_CONTINUE); + } + nSigInts++; +} // This handles signals that indicate an unrecoverable error (currently only // segfaults). Our handling of segfaults is odd because it avoids using our @@ -66,7 +76,7 @@ void sigintHandler(int signum) { gSignalStatus = signum; } // is good enough void ErrorSignalHandler(int signum) { gSignalStatus = signum; - std::longjmp(errorBuffer, signum); + std::longjmp(executionContext, signum); } // The libFuzzer callback when fuzzing synchronously @@ -91,7 +101,7 @@ int FuzzCallbackSync(const uint8_t *Data, size_t Size) { // the JS buffer is going to be garbage-collected. But it would still be // nice for efficiency if we could use a pointer instead of copying. auto data = Napi::Buffer::Copy(gFuzzTarget->env, Data, Size); - if (setjmp(errorBuffer) == 0) { + if (setjmp(executionContext) == 0) { auto result = gFuzzTarget->target.Call({data}); if (result.IsPromise()) { AsyncReturnsHandler(); diff --git a/packages/fuzzer/package.json b/packages/fuzzer/package.json index 446bc1b50..b3527568c 100644 --- a/packages/fuzzer/package.json +++ b/packages/fuzzer/package.json @@ -1,6 +1,6 @@ { "name": "@jazzer.js/fuzzer", - "version": "2.1.0", + "version": "3.1.0", "description": "Jazzer.js libfuzzer-based fuzzer for Node.js", "homepage": "https://github.com/CodeIntelligenceTesting/jazzer.js#readme", "author": "Code Intelligence", @@ -16,9 +16,8 @@ "main": "dist/fuzzer.js", "types": "dist/fuzzer.d.ts", "scripts": { - "prebuild": "prebuild --runtime napi --backend cmake-js --all --strip --verbose", - "install": "prebuild-install --runtime napi || npm run prebuild", - "build": "cmake-js build --out build", + "prebuild": "cmake-js build --out build", + "build": "node ../../scripts/build-fuzzer.js", "format:fix": "clang-format -i *.cpp shared/*.cpp shared/*.h", "lint": "find . -path ./build -prune -type f -o -iname '*.h' -o -iname '*.cpp' | xargs clang-tidy" }, @@ -30,14 +29,12 @@ "dependencies": { "bindings": "^1.5.0", "cmake-js": "^7.3.0", - "node-addon-api": "^7.1.0", - "prebuild-install": "^7.1.1" + "node-addon-api": "^7.1.0" }, "devDependencies": { "@types/bindings": "^1.5.5", - "@types/node": "^20.11.17", - "clang-format": "^1.8.0", - "prebuild": "^12.1.0" + "@types/node": "^20.14.11", + "clang-format": "^1.8.0" }, "engines": { "node": ">= 14.0.0", diff --git a/packages/fuzzer/trace.ts b/packages/fuzzer/trace.ts index ff195c4ea..753f468ba 100644 --- a/packages/fuzzer/trace.ts +++ b/packages/fuzzer/trace.ts @@ -1,5 +1,5 @@ /* - * Copyright 2023 Code Intelligence GmbH + * Copyright 2026 Code Intelligence GmbH * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/packages/hooking/hook.ts b/packages/hooking/hook.ts index c8f8e4d12..0d59dfb64 100644 --- a/packages/hooking/hook.ts +++ b/packages/hooking/hook.ts @@ -1,5 +1,5 @@ /* - * Copyright 2023 Code Intelligence GmbH + * Copyright 2026 Code Intelligence GmbH * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -42,6 +42,7 @@ export type AfterHookFn = ( export type HookFn = BeforeHookFn | ReplaceHookFn | AfterHookFn; export class Hook { + registered = false; constructor( public readonly type: HookType, public readonly target: string, diff --git a/packages/hooking/index.ts b/packages/hooking/index.ts index b2ac5abb4..252e208d2 100644 --- a/packages/hooking/index.ts +++ b/packages/hooking/index.ts @@ -1,5 +1,5 @@ /* - * Copyright 2023 Code Intelligence GmbH + * Copyright 2026 Code Intelligence GmbH * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/packages/hooking/manager.test.ts b/packages/hooking/manager.test.ts index 5d8ab6030..1875e40a3 100644 --- a/packages/hooking/manager.test.ts +++ b/packages/hooking/manager.test.ts @@ -1,5 +1,5 @@ /* - * Copyright 2023 Code Intelligence GmbH + * Copyright 2026 Code Intelligence GmbH * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -15,7 +15,7 @@ */ import { HookType } from "./hook"; -import { hookManager } from "./manager"; +import { getFunction, hookManager, setFunction } from "./manager"; describe("Hooks manager", () => { describe("Matching hooks", () => { @@ -103,6 +103,49 @@ describe("Hooks manager", () => { ); }); }); + + describe("getFunction", () => { + it("non-existing function", () => { + expect(getFunction({}, ["foo", "bar", "lambda"])).toBeUndefined(); + }); + + it("non-existing function", () => { + expect( + getFunction({ foo: { bar: { lambda: "test" } } }, [ + "foo", + "bar", + "lambda", + ]), + ).toBe("test"); + }); + }); + + describe("setFunction", () => { + it("non-existing function", () => { + const obj = {}; + setFunction(obj, ["foo", "bar", "lambda"], () => {}); + expect(obj).toStrictEqual({}); + }); + + it("change an existing function to a number - should fail", () => { + const originalFn = () => {}; + const obj = { foo: { bar: { lambda: originalFn } } }; + const accessorChain = ["foo", "bar", "lambda"]; + setFunction(obj, accessorChain, 10); + expect(getFunction(obj, accessorChain)).toStrictEqual(originalFn); + }); + + it("change an existing function to a new function", () => { + const originalFn = () => {}; + const newFunction = (a: number) => { + return a; + }; + const obj = { foo: { bar: { lambda: originalFn } } }; + const accessorChain = ["foo", "bar", "lambda"]; + setFunction(obj, accessorChain, newFunction); + expect(getFunction(obj, accessorChain)).toStrictEqual(newFunction); + }); + }); }); function registerHook( diff --git a/packages/hooking/manager.ts b/packages/hooking/manager.ts index e71821fda..22c08be34 100644 --- a/packages/hooking/manager.ts +++ b/packages/hooking/manager.ts @@ -1,5 +1,5 @@ /* - * Copyright 2023 Code Intelligence GmbH + * Copyright 2026 Code Intelligence GmbH * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -15,6 +15,7 @@ */ import { builtinModules } from "module"; +import * as vm from "vm"; import { AfterHookFn, @@ -120,14 +121,14 @@ export class HookManager { * initialization steps for the hooks to work. This method must be called * after all hooks have been registered. */ - async finalizeHooks() { + async finalizeHooks(vmContext: vm.Context | typeof globalThis) { // Built-in functions cannot be hooked by the instrumentor, so that is // explicitly done here instead. // Loading build-in modules is asynchronous, so we need to wait, which // is not possible in the instrumentor. for (const builtinModule of builtinModules) { - const matchedHooks = this._hooks.filter((hook) => - builtinModule.includes(hook.pkg), + const matchedHooks = this._hooks.filter( + (hook) => builtinModule.includes(hook.pkg) && hook.pkg !== "", ); for (const hook of matchedHooks) { try { @@ -135,13 +136,32 @@ export class HookManager { } catch (e) { if (process.env.JAZZER_DEBUG) { console.error( - "DEBUG: [Hook] Error when trying to hook the built-in function: " + - e, + "DEBUG: [hooking] Could not hook built-in function: " + + hook.pkg + + " : " + + hook.target, ); + console.error(e); } } } } + + // Hook global functions (functions without module names) + const globalHooks = this._hooks.filter((hook) => hook.pkg === ""); + for (const hook of globalHooks) { + try { + hookGlobalFunction(hook, vmContext); + } catch (e) { + if (process.env.JAZZER_DEBUG) { + console.error( + "DEBUG: [hooking] Could not hook the global function: " + + hook.target, + ); + console.error(e); + } + } + } } registerHook( @@ -249,28 +269,129 @@ export function registerAfterHook( hookManager.registerHook(HookType.After, target, pkg, async, hookFn); } +export function getFunction( + module: object, + propertyAccessors: string[], +): unknown { + let current = module; + + for (const propertyAccessor of propertyAccessors) { + try { + // @ts-ignore + current = current[propertyAccessor]; + } catch (e) { + return undefined; + } + } + return current; +} + +export function setFunction( + module: object, + propertyAccessors: string[], + newFunction: unknown, +): void { + if (!(newFunction instanceof Function || typeof newFunction === "function")) { + if (process.env.JAZZER_DEBUG) { + console.error( + "DEBUG: [hooking] Could not hook built-in function: " + + propertyAccessors.join(".") + + "\n" + + " provided newFunction is not a function", + ); + } + return; + } + + let current = module; + for (const propertyAccessor of propertyAccessors.slice(0, -1)) { + try { + // @ts-ignore + current = current[propertyAccessor]; + } catch (e) { + if (process.env.JAZZER_DEBUG) { + console.error( + "DEBUG: [hooking] Could not hook built-in function: " + + propertyAccessors.join("."), + ); + } + return; + } + } + // @ts-ignore + current[propertyAccessors[propertyAccessors.length - 1]] = newFunction; +} + /** * Replaces a built-in function with a custom implementation while preserving * the original function for potential use within the replacement function. */ export async function hookBuiltInFunction(hook: Hook): Promise { + if (hook.registered) return; + hook.registered = true; const { default: module } = await import(hook.pkg); - const originalFn = module[hook.target]; + const targetPropertyAccessors = hook.target.split("."); + const originalFn = getFunction(module, targetPropertyAccessors); + hookFunction(module, hook, originalFn, targetPropertyAccessors); +} + +function hookGlobalFunction( + hook: Hook, + context: vm.Context | typeof globalThis, +): void { + const originalFn = vm.isContext(context) + ? vm.runInContext(hook.target, context) + : vm.runInThisContext(hook.target); + + if (originalFn) { + hookFunction(context, hook, originalFn); + const newFunction = getFunction(context, hook.target.split(".")); + // assign prototype of the original function to the prototype of the new function + if (newFunction instanceof Function || typeof newFunction === "function") { + newFunction.prototype = originalFn.prototype; + } + } +} + +function hookFunction( + // eslint-disable-next-line @typescript-eslint/no-explicit-any + obj: any, + hook: Hook, + originalFn: unknown | ((...args: unknown[]) => unknown), + targetPropertyAccessors: string[] = hook.target.split("."), +) { + if (!(originalFn instanceof Function || typeof originalFn === "function")) { + if (process.env.JAZZER_DEBUG) { + console.error( + "DEBUG: [hooking] Could not hook built-in function: " + + hook.pkg + + " : " + + hook.target, + ); + } + return; + } + const id = callSiteId(hookManager.hookIndex(hook), hook.pkg, hook.target); if (hook.type == HookType.Before) { - module[hook.target] = (...args: unknown[]) => { - (hook.hookFunction as BeforeHookFn)(null, args, id); - return originalFn(...args); - }; + setFunction(obj, targetPropertyAccessors, function (...args: unknown[]) { + // @ts-ignore + (hook.hookFunction as BeforeHookFn)(this, args, id); + // @ts-ignore + return originalFn.apply(this, args); + }); } else if (hook.type == HookType.Replace) { - module[hook.target] = (...args: unknown[]) => { - return (hook.hookFunction as ReplaceHookFn)(null, args, id, originalFn); - }; + setFunction(obj, targetPropertyAccessors, function (...args: unknown[]) { + // @ts-ignore + return (hook.hookFunction as ReplaceHookFn)(this, args, id, originalFn); + }); } else if (hook.type == HookType.After) { - module[hook.target] = (...args: unknown[]) => { - const result: unknown = originalFn(...args); - return (hook.hookFunction as AfterHookFn)(null, args, id, result); - }; + setFunction(obj, targetPropertyAccessors, function (...args: unknown[]) { + // @ts-ignore + const result: unknown = originalFn.apply(this, args); + // @ts-ignore + return (hook.hookFunction as AfterHookFn)(this, args, id, result); + }); } else { throw new Error(`Unknown hook type ${hook.type}`); } diff --git a/packages/hooking/package.json b/packages/hooking/package.json index 795a7557e..d21ad982c 100644 --- a/packages/hooking/package.json +++ b/packages/hooking/package.json @@ -1,6 +1,6 @@ { "name": "@jazzer.js/hooking", - "version": "2.1.0", + "version": "3.1.0", "description": "Jazzer.js hooking framework", "homepage": "https://github.com/CodeIntelligenceTesting/jazzer.js#readme", "author": "Code Intelligence", @@ -15,12 +15,6 @@ }, "main": "dist/index.js", "types": "dist/index.d.js", - "dependencies": { - "@babel/core": "^7.23.9" - }, - "devDependencies": { - "@types/babel__core": "^7.20.5" - }, "engines": { "node": ">= 14.0.0", "npm": ">= 7.0.0" diff --git a/packages/hooking/tracker.ts b/packages/hooking/tracker.ts index f874eb5a2..cbc0be5c4 100644 --- a/packages/hooking/tracker.ts +++ b/packages/hooking/tracker.ts @@ -1,5 +1,5 @@ /* - * Copyright 2023 Code Intelligence GmbH + * Copyright 2026 Code Intelligence GmbH * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/packages/instrumentor/README.md b/packages/instrumentor/README.md index 8029a9142..e4a3ba275 100644 --- a/packages/instrumentor/README.md +++ b/packages/instrumentor/README.md @@ -23,7 +23,5 @@ npm install --save-dev @jazzer.js/instrumentor ## Documentation See -[Jazzer.js README](https://github.com/CodeIntelligenceTesting/jazzer.js#readme) -for more information or the -[issues](https://github.com/CodeIntelligenceTesting/jazzer.js/issues?q=is%3Aissue+is%3Aopen) -associated with it. +[Jazzer.js README](https://github.com/CodeIntelligenceTesting/jazzer.js-commercial#readme) +for more information. diff --git a/packages/instrumentor/SourceMapRegistry.ts b/packages/instrumentor/SourceMapRegistry.ts index 3aee73bc3..c8ee4e2eb 100644 --- a/packages/instrumentor/SourceMapRegistry.ts +++ b/packages/instrumentor/SourceMapRegistry.ts @@ -1,5 +1,5 @@ /* - * Copyright 2023 Code Intelligence GmbH + * Copyright 2026 Code Intelligence GmbH * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -95,7 +95,7 @@ export class SourceMapRegistry { ? { map: sourceMap, url: source, - } + } : null; }, }); diff --git a/packages/instrumentor/edgeIdStrategy.ts b/packages/instrumentor/edgeIdStrategy.ts index 416189256..dfc0c25e3 100644 --- a/packages/instrumentor/edgeIdStrategy.ts +++ b/packages/instrumentor/edgeIdStrategy.ts @@ -1,5 +1,5 @@ /* - * Copyright 2023 Code Intelligence GmbH + * Copyright 2026 Code Intelligence GmbH * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -144,7 +144,7 @@ export class FileSyncIdStrategy extends IncrementingEdgeIdStrategy { this.firstEdgeId = idInfo.length !== 0 ? idInfo[idInfo.length - 1].firstId + - idInfo[idInfo.length - 1].idCount + idInfo[idInfo.length - 1].idCount : 0; break; case 1: diff --git a/packages/instrumentor/guard.ts b/packages/instrumentor/guard.ts index ee4270b08..71d9e6631 100644 --- a/packages/instrumentor/guard.ts +++ b/packages/instrumentor/guard.ts @@ -1,5 +1,5 @@ /* - * Copyright 2023 Code Intelligence GmbH + * Copyright 2026 Code Intelligence GmbH * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/packages/instrumentor/instrument.test.ts b/packages/instrumentor/instrument.test.ts index 9498a6446..832ae63dc 100644 --- a/packages/instrumentor/instrument.test.ts +++ b/packages/instrumentor/instrument.test.ts @@ -1,5 +1,5 @@ /* - * Copyright 2023 Code Intelligence GmbH + * Copyright 2026 Code Intelligence GmbH * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/packages/instrumentor/instrument.ts b/packages/instrumentor/instrument.ts index bc85d0cbf..0f07c5784 100644 --- a/packages/instrumentor/instrument.ts +++ b/packages/instrumentor/instrument.ts @@ -1,5 +1,5 @@ /* - * Copyright 2023 Code Intelligence GmbH + * Copyright 2026 Code Intelligence GmbH * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -104,12 +104,23 @@ export class Instrumentor { this.idStrategy.startForSourceFile(filename); } - const result = this.transform( - filename, - code, - transformations, - this.asInputSourceOption(inputSourceMap), - ); + let result: BabelFileResult | null = null; + + try { + result = this.transform( + filename, + code, + transformations, + this.asInputSourceOption(inputSourceMap), + ); + } catch (e) { + if (process.env.JAZZER_DEBUG) { + const message = e instanceof Error ? e.message : e; + console.error( + `Instrumentation error in file ${filename}:\n ${message}`, + ); + } + } if (shouldInstrumentFile) { this.idStrategy.commitIdCount(filename); } diff --git a/packages/instrumentor/package.json b/packages/instrumentor/package.json index 9d8205638..d409db682 100644 --- a/packages/instrumentor/package.json +++ b/packages/instrumentor/package.json @@ -1,6 +1,6 @@ { "name": "@jazzer.js/instrumentor", - "version": "2.1.0", + "version": "3.1.0", "description": "Jazzer.js source code instrumentor", "homepage": "https://github.com/CodeIntelligenceTesting/jazzer.js#readme", "author": "Code Intelligence", @@ -16,23 +16,23 @@ "main": "dist/instrument.js", "types": "dist/instrument.d.js", "dependencies": { - "@babel/core": "^7.23.9", - "@babel/generator": "^7.23.5", - "@jazzer.js/fuzzer": "2.1.0", - "@jazzer.js/hooking": "2.1.0", + "@babel/core": "^7.25.2", + "@babel/generator": "^7.25.6", + "@jazzer.js/fuzzer": "3.1.0", + "@jazzer.js/hooking": "3.1.0", "istanbul-lib-hook": "^3.0.0", "proper-lockfile": "^4.1.2", - "istanbul-lib-instrument": "^6.0.1", + "istanbul-lib-instrument": "^6.0.3", "source-map-support": "^0.5.21" }, "devDependencies": { "@types/babel__core": "^7.20.5", "@types/istanbul-lib-hook": "^2.0.4", "@types/istanbul-lib-instrument": "^1.7.7", - "@types/node": "^20.11.17", + "@types/node": "^20.14.11", "@types/proper-lockfile": "^4.1.4", "@types/source-map-support": "^0.5.10", - "typescript": "^5.3.3" + "typescript": "^5.6.2" }, "engines": { "node": ">= 14.0.0", diff --git a/packages/instrumentor/plugin.ts b/packages/instrumentor/plugin.ts index 4ce9e90cc..53fe4d0c5 100644 --- a/packages/instrumentor/plugin.ts +++ b/packages/instrumentor/plugin.ts @@ -1,5 +1,5 @@ /* - * Copyright 2023 Code Intelligence GmbH + * Copyright 2026 Code Intelligence GmbH * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/packages/instrumentor/plugins/codeCoverage.test.ts b/packages/instrumentor/plugins/codeCoverage.test.ts index ee04c96cb..51aa3fe0a 100644 --- a/packages/instrumentor/plugins/codeCoverage.test.ts +++ b/packages/instrumentor/plugins/codeCoverage.test.ts @@ -1,5 +1,5 @@ /* - * Copyright 2023 Code Intelligence GmbH + * Copyright 2026 Code Intelligence GmbH * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/packages/instrumentor/plugins/codeCoverage.ts b/packages/instrumentor/plugins/codeCoverage.ts index 5631e18a5..00092ff89 100644 --- a/packages/instrumentor/plugins/codeCoverage.ts +++ b/packages/instrumentor/plugins/codeCoverage.ts @@ -1,5 +1,5 @@ /* - * Copyright 2023 Code Intelligence GmbH + * Copyright 2026 Code Intelligence GmbH * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/packages/instrumentor/plugins/compareHooks.test.ts b/packages/instrumentor/plugins/compareHooks.test.ts index db3a262cb..038f25c57 100644 --- a/packages/instrumentor/plugins/compareHooks.test.ts +++ b/packages/instrumentor/plugins/compareHooks.test.ts @@ -1,5 +1,5 @@ /* - * Copyright 2023 Code Intelligence GmbH + * Copyright 2026 Code Intelligence GmbH * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/packages/instrumentor/plugins/compareHooks.ts b/packages/instrumentor/plugins/compareHooks.ts index 18753184d..5414f0db7 100644 --- a/packages/instrumentor/plugins/compareHooks.ts +++ b/packages/instrumentor/plugins/compareHooks.ts @@ -1,5 +1,5 @@ /* - * Copyright 2023 Code Intelligence GmbH + * Copyright 2026 Code Intelligence GmbH * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/packages/instrumentor/plugins/functionHooks.test.ts b/packages/instrumentor/plugins/functionHooks.test.ts index 68cdad455..476bbb0f7 100644 --- a/packages/instrumentor/plugins/functionHooks.test.ts +++ b/packages/instrumentor/plugins/functionHooks.test.ts @@ -1,5 +1,5 @@ /* - * Copyright 2023 Code Intelligence GmbH + * Copyright 2026 Code Intelligence GmbH * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -880,21 +880,20 @@ describe("function hooks instrumentation", () => { | |foo(1, 2);`; - const dbgMock = withDebug( - () => - expectInstrumentationEval>(input, output)?.then( - (result: number) => { - expect(result).toEqual(3); - expect(beforeHookCallMap.size).toEqual(1); - expectHook(0, beforeHookCallMap); - expect(afterHookCallMap.size).toEqual(1); - expectHook(0, afterHookCallMap); - expectTrackedHooks(hookTracker.applied, ["foo"]); - expectTrackedHooks(hookTracker.available, ["bar"]); - expectTrackedHooksUnknown(beforeHookCallMap, 0); - expectTrackedHooksUnknown(afterHookCallMap, 0); - }, - ), + const dbgMock = withDebug(() => + expectInstrumentationEval>(input, output)?.then( + (result: number) => { + expect(result).toEqual(3); + expect(beforeHookCallMap.size).toEqual(1); + expectHook(0, beforeHookCallMap); + expect(afterHookCallMap.size).toEqual(1); + expectHook(0, afterHookCallMap); + expectTrackedHooks(hookTracker.applied, ["foo"]); + expectTrackedHooks(hookTracker.available, ["bar"]); + expectTrackedHooksUnknown(beforeHookCallMap, 0); + expectTrackedHooksUnknown(afterHookCallMap, 0); + }, + ), ); expectLogHooks(dbgMock, 2, "Before", "foo"); diff --git a/packages/instrumentor/plugins/functionHooks.ts b/packages/instrumentor/plugins/functionHooks.ts index 26f6deee4..aadb2a636 100644 --- a/packages/instrumentor/plugins/functionHooks.ts +++ b/packages/instrumentor/plugins/functionHooks.ts @@ -1,5 +1,5 @@ /* - * Copyright 2023 Code Intelligence GmbH + * Copyright 2026 Code Intelligence GmbH * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/packages/instrumentor/plugins/helpers.ts b/packages/instrumentor/plugins/helpers.ts index d97a2a434..85efe49f2 100644 --- a/packages/instrumentor/plugins/helpers.ts +++ b/packages/instrumentor/plugins/helpers.ts @@ -1,5 +1,5 @@ /* - * Copyright 2023 Code Intelligence GmbH + * Copyright 2026 Code Intelligence GmbH * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/packages/instrumentor/plugins/sourceCodeCoverage.test.ts b/packages/instrumentor/plugins/sourceCodeCoverage.test.ts index dcf679c76..51b600956 100644 --- a/packages/instrumentor/plugins/sourceCodeCoverage.test.ts +++ b/packages/instrumentor/plugins/sourceCodeCoverage.test.ts @@ -1,5 +1,5 @@ /* - * Copyright 2023 Code Intelligence GmbH + * Copyright 2026 Code Intelligence GmbH * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/packages/instrumentor/plugins/sourceCodeCoverage.ts b/packages/instrumentor/plugins/sourceCodeCoverage.ts index abb960a1b..bae53ac16 100644 --- a/packages/instrumentor/plugins/sourceCodeCoverage.ts +++ b/packages/instrumentor/plugins/sourceCodeCoverage.ts @@ -1,5 +1,5 @@ /* - * Copyright 2023 Code Intelligence GmbH + * Copyright 2026 Code Intelligence GmbH * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/packages/instrumentor/plugins/testhelpers.ts b/packages/instrumentor/plugins/testhelpers.ts index cdae21d2d..22cede85f 100644 --- a/packages/instrumentor/plugins/testhelpers.ts +++ b/packages/instrumentor/plugins/testhelpers.ts @@ -1,5 +1,5 @@ /* - * Copyright 2023 Code Intelligence GmbH + * Copyright 2026 Code Intelligence GmbH * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/packages/jest-runner/config.test.ts b/packages/jest-runner/config.test.ts index eb99262e4..b46a55d9f 100644 --- a/packages/jest-runner/config.test.ts +++ b/packages/jest-runner/config.test.ts @@ -1,5 +1,5 @@ /* - * Copyright 2023 Code Intelligence GmbH + * Copyright 2026 Code Intelligence GmbH * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -14,40 +14,44 @@ * limitations under the License. */ -import { defaultOptions } from "@jazzer.js/core"; +import { OptionsManager, OptionSource } from "@jazzer.js/core"; -import { loadConfig, TIMEOUT_PLACEHOLDER } from "./config"; +import { loadConfig } from "./config"; + +const defaultJestOptions = new OptionsManager(OptionSource.DefaultJestOptions); describe("Config", () => { describe("loadConfig", () => { it("return default configuration if nothing found", () => { - const defaults = { ...defaultOptions, timeout: TIMEOUT_PLACEHOLDER }; - defaults.mode = "regression"; - expect(loadConfig()).toEqual(defaults); + expect(loadConfig().getOptions()).toEqual( + defaultJestOptions.getOptions(), + ); }); it("merge found and default options", () => { const config = loadConfig({}, "test-jazzerjs"); - expect(config).not.toEqual(defaultOptions); - expect(config.includes).toContain("target"); - expect(config.excludes).toContain("nothing"); + expect(config.getOptions()).not.toEqual(defaultJestOptions.getOptions()); + expect(config.get("includes")).toContain("target"); + expect(config.get("excludes")).toContain("nothing"); }); it("merge explicitly passed in options", () => { const config = loadConfig({ fuzzTarget: "foo" }, "test-jazzerjs"); - expect(config.fuzzTarget).toEqual("foo"); + expect(config.get("fuzzTarget")).toEqual("foo"); }); it("deep copy configurations", () => { const config1 = loadConfig(); - config1.fuzzerOptions.push("-runs=100"); + config1.get("fuzzerOptions").push("-runs=100"); const config2 = loadConfig({}, "merge-test-jazzerjs"); - expect(config1.fuzzerOptions).not.toEqual(config2.fuzzerOptions); + expect(config1.get("fuzzerOptions")).not.toEqual( + config2.get("fuzzerOptions"), + ); }); it("default to regression mode", () => { - expect(loadConfig().mode).toEqual("regression"); + expect(loadConfig().get("mode")).toEqual("regression"); }); it("set fuzzing mode based on environment variable", () => { try { process.env.JAZZER_FUZZ = "1"; - expect(loadConfig().mode).toEqual("fuzzing"); + expect(loadConfig().get("mode")).toEqual("fuzzing"); } finally { delete process.env.JAZZER_FUZZ; } diff --git a/packages/jest-runner/config.ts b/packages/jest-runner/config.ts index 47c9c00ce..fa6e1a8f2 100644 --- a/packages/jest-runner/config.ts +++ b/packages/jest-runner/config.ts @@ -1,5 +1,5 @@ /* - * Copyright 2023 Code Intelligence GmbH + * Copyright 2026 Code Intelligence GmbH * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,39 +16,26 @@ import { cosmiconfigSync } from "cosmiconfig"; -import { - buildOptions, - Options, - ParameterResolverIndex, - setParameterResolverValue, -} from "@jazzer.js/core"; +import { Options, OptionsManager, OptionSource } from "@jazzer.js/core"; export const TIMEOUT_PLACEHOLDER = Number.MIN_SAFE_INTEGER; -// Lookup `Options` via the `.jazzerjsrc` configuration files. +// Load Jazzer.js `Options` from the `.jazzerjsrc` configuration files and environment variables. export function loadConfig( options: Partial = {}, optionsKey = "jazzerjs", -): Options { - const result = cosmiconfigSync(optionsKey).search(); - const config = result?.config ?? {}; - // If no timeout is specified, use a placeholder value so that no - // default timeout is used. Afterwards remove the placeholder value, - // if not already overwritten by the user. - if (config.timeout === undefined) { - config.timeout = TIMEOUT_PLACEHOLDER; - } - // Jazzer.js normally runs in "fuzzing" mode, but, - // if not specified otherwise, Jest uses "regression" mode. - if (!config.mode) { - config.mode = "regression"; - } +): OptionsManager { + const config = cosmiconfigSync(optionsKey).search()?.config ?? {}; + // Switch to fuzzing mode if environment variable `JAZZER_FUZZ` is set. if (process.env.JAZZER_FUZZ) { config.mode = "fuzzing"; } // Merge explicitly passed in options, e.g. coverage settings from Jest. Object.assign(config, options); - setParameterResolverValue(ParameterResolverIndex.ConfigurationFile, config); - return buildOptions(); + + return new OptionsManager(OptionSource.DefaultJestOptions).merge( + config, + OptionSource.ConfigurationFile, + ); } diff --git a/packages/jest-runner/corpus.test.ts b/packages/jest-runner/corpus.test.ts index c4e402446..654d87eca 100644 --- a/packages/jest-runner/corpus.test.ts +++ b/packages/jest-runner/corpus.test.ts @@ -1,5 +1,5 @@ /* - * Copyright 2023 Code Intelligence GmbH + * Copyright 2026 Code Intelligence GmbH * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/packages/jest-runner/corpus.ts b/packages/jest-runner/corpus.ts index c25909345..ff1041184 100644 --- a/packages/jest-runner/corpus.ts +++ b/packages/jest-runner/corpus.ts @@ -1,5 +1,5 @@ /* - * Copyright 2023 Code Intelligence GmbH + * Copyright 2026 Code Intelligence GmbH * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/packages/jest-runner/errorUtils.test.ts b/packages/jest-runner/errorUtils.test.ts index 144e6e279..316361a23 100644 --- a/packages/jest-runner/errorUtils.test.ts +++ b/packages/jest-runner/errorUtils.test.ts @@ -1,5 +1,5 @@ /* - * Copyright 2023 Code Intelligence GmbH + * Copyright 2026 Code Intelligence GmbH * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -14,11 +14,7 @@ * limitations under the License. */ -import { - cleanupJestError, - removeTopFrames, - removeTopFramesFromError, -} from "./errorUtils"; +import { cleanupJestError } from "./errorUtils"; describe("ErrorUtils", () => { const error = new Error(); diff --git a/packages/jest-runner/errorUtils.ts b/packages/jest-runner/errorUtils.ts index 3214e668f..99d2212ff 100644 --- a/packages/jest-runner/errorUtils.ts +++ b/packages/jest-runner/errorUtils.ts @@ -1,5 +1,5 @@ /* - * Copyright 2023 Code Intelligence GmbH + * Copyright 2026 Code Intelligence GmbH * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/packages/jest-runner/fuzz.test.ts b/packages/jest-runner/fuzz.test.ts index 23ec9b383..2fe814309 100644 --- a/packages/jest-runner/fuzz.test.ts +++ b/packages/jest-runner/fuzz.test.ts @@ -1,5 +1,5 @@ /* - * Copyright 2023 Code Intelligence GmbH + * Copyright 2026 Code Intelligence GmbH * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -21,7 +21,8 @@ import * as tmp from "tmp"; import { FindingAwareFuzzTarget, - Options, + OptionsManager, + OptionSource, startFuzzingNoInit, } from "@jazzer.js/core"; import { FuzzTarget } from "@jazzer.js/fuzzer"; @@ -48,12 +49,14 @@ jest.mock("./corpus", () => { // Mock core package to intercept calls to startFuzzing. const skipMock = jest.fn(); jest.mock("@jazzer.js/core", () => { + globalThis.JazzerJS = new Map(); + const core = jest.requireActual("@jazzer.js/core"); // noinspection JSUnusedGlobalSymbols return { - startFuzzingNoInit: jest.fn().mockImplementation(async (args: unknown) => { + ...core, + startFuzzingNoInit: jest.fn().mockImplementation(async (args) => { return args; }), - asFindingAwareFuzzFn: (fn: object) => fn, }; }); @@ -70,13 +73,20 @@ describe("fuzz", () => { describe("runInFuzzingMode", () => { it("execute test matching original test name pattern", async () => { + const inputPaths = mockInputPaths(); + const fuzzingConfig = new OptionsManager( + OptionSource.DefaultJestOptions, + ).merge({ mode: "fuzzing" }, OptionSource.ConfigurationFile); await withMockTest(() => { const originalTestNamePattern = jest .fn() .mockReturnValue(/^myFuzzTest$/); - invokeFuzz({ originalTestNamePattern })("myFuzzTest", jest.fn()); + invokeFuzz({ originalTestNamePattern, fuzzingConfig })( + "myFuzzTest", + jest.fn(), + ); }); - expect(startFuzzingNoInit).toBeCalledTimes(1); + expect(startFuzzingNoInit).toHaveBeenCalledTimes(1); }); it("skip test not matching original test name pattern", async () => { @@ -86,7 +96,7 @@ describe("fuzz", () => { .mockReturnValue(/^not_existing$/); invokeFuzz({ originalTestNamePattern })("myFuzzTest", jest.fn()); }); - expect(startFuzzingNoInit).toBeCalledTimes(0); + expect(startFuzzingNoInit).toHaveBeenCalledTimes(0); }); }); @@ -100,7 +110,7 @@ describe("fuzz", () => { "fuzz", asFindingAwareFuzzFn(testFn), corpus, - {} as Options, + new OptionsManager(OptionSource.DefaultJestOptions), globalThis as Global.Global, "standard", ); @@ -120,7 +130,7 @@ describe("fuzz", () => { done(); }), mockDefaultCorpus(), - {} as Options, + new OptionsManager(OptionSource.DefaultJestOptions), globalThis as Global.Global, "standard", ); @@ -142,7 +152,7 @@ describe("fuzz", () => { }); }), mockDefaultCorpus(), - {} as Options, + new OptionsManager(OptionSource.DefaultJestOptions), globalThis as Global.Global, "standard", ); @@ -162,7 +172,7 @@ describe("fuzz", () => { }); }), mockDefaultCorpus(), - {} as Options, + new OptionsManager(OptionSource.DefaultJestOptions), globalThis as Global.Global, "standard", ); @@ -186,7 +196,7 @@ describe("fuzz", () => { resolve("done called multiple times"); }), mockDefaultCorpus(), - {} as Options, + new OptionsManager(OptionSource.DefaultJestOptions), globalThis as Global.Global, "standard", ); @@ -204,7 +214,7 @@ describe("fuzz", () => { "fuzz", asFindingAwareFuzzFn(testFn), corpus, - {} as Options, + new OptionsManager(OptionSource.DefaultJestOptions), globalThis as Global.Global, "standard", ); @@ -274,7 +284,7 @@ function invokeFuzz( params: Partial<{ globals: Global.Global; testFile: string; - fuzzingConfig: Options; + fuzzingConfig: OptionsManager; currentTestState: () => Circus.DescribeBlock | undefined; currentTestTimeout: () => number | undefined; originalTestNamePattern: () => RegExp | undefined; @@ -284,10 +294,7 @@ function invokeFuzz( const paramsWithDefaults = { globals: globalThis as Global.Global, testFile: "testfile", - fuzzingConfig: { - fuzzerOptions: [""], - mode: "fuzzing", - } as Options, + fuzzingConfig: new OptionsManager(OptionSource.DefaultJestOptions), currentTestState: jest.fn().mockReturnValue({}), currentTestTimeout: jest.fn().mockReturnValue(undefined), originalTestNamePattern: jest.fn().mockReturnValue(undefined), diff --git a/packages/jest-runner/fuzz.ts b/packages/jest-runner/fuzz.ts index eb19c0cf7..3f4a941a0 100644 --- a/packages/jest-runner/fuzz.ts +++ b/packages/jest-runner/fuzz.ts @@ -1,5 +1,5 @@ /* - * Copyright 2023 Code Intelligence GmbH + * Copyright 2026 Code Intelligence GmbH * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -19,19 +19,19 @@ import * as fs from "fs"; import { Circus, Global } from "@jest/types"; import { + AllowedFuzzTestOptions, asFindingAwareFuzzFn, - defaultOptions, FindingAwareFuzzTarget, - Options, - startFuzzingNoInit, -} from "@jazzer.js/core"; -import { FuzzTarget, FuzzTargetAsyncOrValue, FuzzTargetCallback, -} from "@jazzer.js/fuzzer"; + Options, + OptionsManager, + OptionSource, + printOptions, + startFuzzingNoInit, +} from "@jazzer.js/core"; -import { TIMEOUT_PLACEHOLDER } from "./config"; import { Corpus } from "./corpus"; import { removeTopFramesFromError } from "./errorUtils"; @@ -41,7 +41,7 @@ export class FuzzerError extends Error {} export type FuzzTest = ( name: Global.TestNameLike, fn: FuzzTarget, - timeout?: number, + timeoutOrOptions?: number | Partial>, ) => void; export const skip: (globals: Global.Global) => FuzzTest = @@ -76,16 +76,37 @@ function printTestNameIfRequested(testStatePath: string[]) { export function fuzz( globals: Global.Global, testFile: string, - fuzzingConfig: Options, + fuzzingConfig: OptionsManager, currentTestState: () => Circus.DescribeBlock | undefined, currentTestTimeout: () => number | undefined, originalTestNamePattern: () => RegExp | undefined, mode: JestTestMode, ): FuzzTest { - return (name, fn, timeout) => { + return (name, fn, timeoutOrOptions) => { // Deep clone the fuzzing config, so that each test can modify it without // affecting other tests, e.g. set a test specific timeout. - const localConfig = JSON.parse(JSON.stringify(fuzzingConfig)); + const localConfig = fuzzingConfig.clone(); + + if (currentTestTimeout()) { + localConfig.merge( + { timeout: currentTestTimeout() }, + OptionSource.InternalJestTimeout, + ); + } + + let paramsToMerge: Partial = {}; + + if (typeof timeoutOrOptions === "number") { + paramsToMerge = { timeout: timeoutOrOptions }; + } else if (typeof timeoutOrOptions === "object") { + paramsToMerge = timeoutOrOptions; + } else if (timeoutOrOptions !== undefined) { + throw new FuzzerError( + `Invalid timeout or options argument "${timeoutOrOptions}"`, + ); + } + + localConfig.merge(paramsToMerge, OptionSource.JestFuzzTestOptions); const state = currentTestState(); if (!state) { @@ -101,7 +122,7 @@ export function fuzz( const skip = testStatePath !== undefined && - testNamePattern != undefined && + testNamePattern !== undefined && !testNamePattern.test(testStatePath.join(" ")); if (skip) { globals.test.skip(name, () => { @@ -110,31 +131,23 @@ export function fuzz( return; } - const corpus = new Corpus(testFile, testStatePath, localConfig.coverage); - - // Timeout priority is: - // 1. Use timeout directly defined in test function - // 2. Use timeout defined in fuzzing config - // 3. Use jest timeout - if (timeout != undefined) { - localConfig.timeout = timeout; - } else { - const jestTimeout = currentTestTimeout(); - if (jestTimeout != undefined && localConfig.timeout == undefined) { - localConfig.timeout = jestTimeout; - } else if (localConfig.timeout === TIMEOUT_PLACEHOLDER) { - localConfig.timeout = defaultOptions.timeout; - } - } + const corpus = new Corpus( + testFile, + testStatePath, + localConfig.get("coverage"), + ); - const wrappedFn = asFindingAwareFuzzFn(fn, localConfig.mode === "fuzzing"); + const wrappedFn = asFindingAwareFuzzFn( + fn, + localConfig.get("mode") === "fuzzing", + ); - if (localConfig.mode === "regression") { + if (localConfig.get("mode") === "regression") { runInRegressionMode(name, wrappedFn, corpus, localConfig, globals, mode); - } else if (localConfig.mode === "fuzzing") { + } else if (localConfig.get("mode") === "fuzzing") { runInFuzzingMode(name, wrappedFn, corpus, localConfig, globals, mode); } else { - throw new Error(`Unknown mode ${localConfig.mode}`); + throw new Error(`Unknown mode ${localConfig.get("mode")}`); } }; } @@ -143,17 +156,17 @@ export const runInFuzzingMode = ( name: Global.TestNameLike, fn: FindingAwareFuzzTarget, corpus: Corpus, - options: Options, + options: OptionsManager, globals: Global.Global, mode: JestTestMode, ) => { handleMode(mode, globals.test)(name, async () => { - options.fuzzerOptions.unshift(corpus.seedInputsDirectory); - options.fuzzerOptions.unshift(corpus.generatedInputsDirectory); - options.fuzzerOptions.push( - "-artifact_prefix=" + corpus.seedInputsDirectory, - ); - return startFuzzingNoInit(fn, options).then(({ error }) => { + const newOptions = options.clone(); + const fuzzerOptions = newOptions.get("fuzzerOptions"); + fuzzerOptions.unshift(corpus.seedInputsDirectory); + fuzzerOptions.unshift(corpus.generatedInputsDirectory); + fuzzerOptions.push("-artifact_prefix=" + corpus.seedInputsDirectory); + return startFuzzingNoInit(fn, newOptions).then(({ error }) => { // Throw the found error to mark the test as failed. if (error) throw error; }); @@ -164,10 +177,12 @@ export const runInRegressionMode = ( name: Global.TestNameLike, fn: FindingAwareFuzzTarget, corpus: Corpus, - options: Options, + options: OptionsManager, globals: Global.Global, mode: JestTestMode, ) => { + printOptions(options, `for test "${name}"`); + handleMode(mode, globals.describe)(name, () => { function executeTarget(content: Buffer) { return new Promise((resolve, reject) => { @@ -187,7 +202,7 @@ export const runInRegressionMode = ( globals.test( "", async () => executeTarget(Buffer.from("")), - options.timeout, + options.get("timeout"), ); // Execute the fuzz test with each input file as no libFuzzer is required. @@ -195,7 +210,7 @@ export const runInRegressionMode = ( globals.test( seed, async () => executeTarget(await fs.promises.readFile(path)), - options.timeout, + options.get("timeout"), ); }); }); diff --git a/packages/jest-runner/globalsInterceptor.test.ts b/packages/jest-runner/globalsInterceptor.test.ts index 8980fc676..2da6ebd85 100644 --- a/packages/jest-runner/globalsInterceptor.test.ts +++ b/packages/jest-runner/globalsInterceptor.test.ts @@ -1,5 +1,5 @@ /* - * Copyright 2023 Code Intelligence GmbH + * Copyright 2026 Code Intelligence GmbH * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -21,6 +21,7 @@ import { fuzz } from "./fuzz"; import { interceptGlobals } from "./globalsInterceptor"; const internalFuzz = jest.fn(); + jest.mock("./fuzz", () => ({ fuzz: jest.fn().mockImplementation(() => { return internalFuzz; diff --git a/packages/jest-runner/globalsInterceptor.ts b/packages/jest-runner/globalsInterceptor.ts index 8f14ae8b7..ce9ae03b6 100644 --- a/packages/jest-runner/globalsInterceptor.ts +++ b/packages/jest-runner/globalsInterceptor.ts @@ -1,5 +1,5 @@ /* - * Copyright 2023 Code Intelligence GmbH + * Copyright 2026 Code Intelligence GmbH * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,7 +16,7 @@ import Runtime from "jest-runtime"; -import { Options } from "@jazzer.js/core"; +import { OptionsManager } from "@jazzer.js/core"; import { fuzz } from "./fuzz"; import { InterceptedTestState } from "./testStateInterceptor"; @@ -24,7 +24,7 @@ import { InterceptedTestState } from "./testStateInterceptor"; export function interceptGlobals( runtime: Runtime, testPath: string, - jazzerConfig: Options, + jazzerConfig: OptionsManager, { currentTestState, currentTestTimeout, diff --git a/packages/jest-runner/index.ts b/packages/jest-runner/index.ts index ccc1cd666..af3fc0f76 100644 --- a/packages/jest-runner/index.ts +++ b/packages/jest-runner/index.ts @@ -1,5 +1,5 @@ /* - * Copyright 2023 Code Intelligence GmbH + * Copyright 2026 Code Intelligence GmbH * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -45,19 +45,19 @@ export default async function jazzerTestRunner( const vmContext = environment.getVmContext(); if (vmContext === null) throw new Error("vmContext is undefined"); - const jazzerConfig = loadConfig({ + const options = loadConfig({ coverage: globalConfig.collectCoverage, coverageReporters: globalConfig.coverageReporters as reports.ReportType[], }); const globalEnvironments = [environment.getVmContext(), globalThis]; - registerGlobals(jazzerConfig, globalEnvironments); + registerGlobals(options, globalEnvironments); setJazzerJsGlobal("vmContext", vmContext); - const instrumentor = await initFuzzing(jazzerConfig); + const instrumentor = await initFuzzing(options); interceptScriptTransformerCalls(runtime, instrumentor); - const testState = interceptTestState(environment, jazzerConfig); - interceptGlobals(runtime, testPath, jazzerConfig, testState); + const testState = interceptTestState(environment, options); + interceptGlobals(runtime, testPath, options, testState); const circusRunner = await runtime["_scriptTransformer"].requireAndTranspileModule( diff --git a/packages/jest-runner/package.json b/packages/jest-runner/package.json index c234aa7a8..a0da93ac7 100644 --- a/packages/jest-runner/package.json +++ b/packages/jest-runner/package.json @@ -1,6 +1,6 @@ { "name": "@jazzer.js/jest-runner", - "version": "2.1.0", + "version": "3.1.0", "description": "Jazzer.js Jest runner", "homepage": "https://github.com/CodeIntelligenceTesting/jazzer.js#readme", "author": "Code Intelligence", @@ -16,9 +16,9 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "dependencies": { - "@jazzer.js/core": "2.1.0", - "cosmiconfig": "^8.3.6", - "istanbul-reports": "^3.1.6" + "@jazzer.js/core": "3.1.0", + "cosmiconfig": "^9.0.0", + "istanbul-reports": "^3.1.7" }, "peerDependencies": { "@types/jest": "29.*", @@ -26,7 +26,7 @@ }, "devDependencies": { "@types/tmp": "^0.2.6", - "tmp": "^0.2.1" + "tmp": "^0.2.3" }, "engines": { "node": ">= 14.0.0", diff --git a/packages/jest-runner/readme.md b/packages/jest-runner/readme.md index 45b06afb5..73811c4eb 100644 --- a/packages/jest-runner/readme.md +++ b/packages/jest-runner/readme.md @@ -2,7 +2,7 @@ Custom Jest runner to executes fuzz tests via Jazzer.js, detailed documentation can be found at the -[Jazzer.js GitHub page](https://github.com/CodeIntelligenceTesting/jazzer.js). +[Jazzer.js GitHub page](https://github.com/CodeIntelligenceTesting/jazzer.js-commercial). A fuzz test in Jest, in this case written in TypeScript, would look similar to the following example: diff --git a/packages/jest-runner/testStateInterceptor.test.ts b/packages/jest-runner/testStateInterceptor.test.ts index ca305e6ff..0f7214a44 100644 --- a/packages/jest-runner/testStateInterceptor.test.ts +++ b/packages/jest-runner/testStateInterceptor.test.ts @@ -1,5 +1,5 @@ /* - * Copyright 2023 Code Intelligence GmbH + * Copyright 2026 Code Intelligence GmbH * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -14,7 +14,7 @@ * limitations under the License. */ -import { defaultOptions, Options } from "@jazzer.js/core"; +import { Options, OptionsManager, OptionSource } from "@jazzer.js/core"; import { interceptTestState } from "./testStateInterceptor"; @@ -107,9 +107,10 @@ function mockEnvironment(options: Partial = {}) { }, // eslint-disable-next-line @typescript-eslint/no-explicit-any } as any; - const config = { - ...defaultOptions, - ...options, - }; + const config = new OptionsManager(OptionSource.DefaultJestOptions).merge( + options, + OptionSource.ConfigurationFile, + ); + return { env, config, originalHandleTestEvent }; } diff --git a/packages/jest-runner/testStateInterceptor.ts b/packages/jest-runner/testStateInterceptor.ts index 2c292b8f4..5bac8cdea 100644 --- a/packages/jest-runner/testStateInterceptor.ts +++ b/packages/jest-runner/testStateInterceptor.ts @@ -1,5 +1,5 @@ /* - * Copyright 2023 Code Intelligence GmbH + * Copyright 2026 Code Intelligence GmbH * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -17,7 +17,7 @@ import { JestEnvironment } from "@jest/environment"; import { Circus } from "@jest/types"; -import { Options } from "@jazzer.js/core"; +import { OptionsManager } from "@jazzer.js/core"; // Arbitrary high value to disable Jest timeout. const JEST_TIMEOUT_DISABLED = 1000 * 60 * 24 * 365; @@ -30,7 +30,7 @@ export type InterceptedTestState = { export function interceptTestState( environment: JestEnvironment, - jazzerConfig: Options, + jazzerConfig: OptionsManager, ): InterceptedTestState { const originalHandleTestEvent = environment.handleTestEvent?.bind(environment); @@ -47,7 +47,7 @@ export function interceptTestState( // test inside. This breaks test name pattern matching, so remove "$" from the end of the pattern, // and skip tests not matching the original pattern in the fuzz function. if ( - jazzerConfig.mode == "regression" && + jazzerConfig.get("mode") == "regression" && state.testNamePattern?.source?.endsWith("$") ) { originalTestNamePattern = state.testNamePattern; @@ -59,7 +59,10 @@ export function interceptTestState( } else if (event.name === "test_start") { // In fuzzing mode, only execute the first encountered (not skipped) fuzz test // and mark all others as skipped. - if (jazzerConfig.mode === "fuzzing" && event.test.mode !== "skip") { + if ( + jazzerConfig.get("mode") === "fuzzing" && + event.test.mode !== "skip" + ) { if ( !firstFuzzTestEncountered && (!state.testNamePattern || @@ -75,7 +78,7 @@ export function interceptTestState( } else if (event.name === "test_fn_start") { // Disable Jest timeout in fuzzing mode by setting it to a high value, // otherwise Jest will kill the fuzz test after it's timeout (default 5 seconds). - if (jazzerConfig.mode === "fuzzing") { + if (jazzerConfig.get("mode") === "fuzzing") { state.testTimeout = JEST_TIMEOUT_DISABLED; } // Use configured timeout as fuzzing timeout as well. Every invocation diff --git a/packages/jest-runner/transformerInterceptor.test.ts b/packages/jest-runner/transformerInterceptor.test.ts index e7cbdb8ee..750cc6a28 100644 --- a/packages/jest-runner/transformerInterceptor.test.ts +++ b/packages/jest-runner/transformerInterceptor.test.ts @@ -1,5 +1,5 @@ /* - * Copyright 2023 Code Intelligence GmbH + * Copyright 2026 Code Intelligence GmbH * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/packages/jest-runner/transformerInterceptor.ts b/packages/jest-runner/transformerInterceptor.ts index f4faf277b..be4c1b644 100644 --- a/packages/jest-runner/transformerInterceptor.ts +++ b/packages/jest-runner/transformerInterceptor.ts @@ -1,5 +1,5 @@ /* - * Copyright 2023 Code Intelligence GmbH + * Copyright 2026 Code Intelligence GmbH * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/packages/jest-runner/tsconfig.json b/packages/jest-runner/tsconfig.json index e258f91fe..b3da45e9d 100644 --- a/packages/jest-runner/tsconfig.json +++ b/packages/jest-runner/tsconfig.json @@ -7,9 +7,6 @@ "references": [ { "path": "../core" - }, - { - "path": "../fuzzer" } ] } diff --git a/scripts/build-fuzzer.js b/scripts/build-fuzzer.js new file mode 100644 index 000000000..d009722f9 --- /dev/null +++ b/scripts/build-fuzzer.js @@ -0,0 +1,43 @@ +/* + * Copyright 2026 Code Intelligence GmbH + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +const fs = require("fs"); +const path = require("path"); + +const strip = require("./strip"); + +fs.mkdirSync("prebuilds", { recursive: true }); + +// Copy napi release into prebuilds/fuzzer--.node +const targetName = path.join( + "prebuilds", + `fuzzer-${process.platform}-${getArchitecture()}.node`, +); +fs.copyFileSync("build/Release/jazzerjs.node", targetName); + +// Strip debugging symbols from the release binary. +// TODO: maybe only strip when releasing? +strip(targetName, function (err) { + if (err) { + console.error(err); + process.exit(1); + } +}); + +function getArchitecture() { + if (process.argv[3] && process.argv[3] === "x86_64") return "x64"; + + return process.argv[3] ?? process.arch; +} diff --git a/scripts/set-version.js b/scripts/set-version.js new file mode 100644 index 000000000..bfd3c14e7 --- /dev/null +++ b/scripts/set-version.js @@ -0,0 +1,76 @@ +/* + * Copyright 2026 Code Intelligence GmbH + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +const { execSync } = require("child_process"); +const fs = require("fs"); +const path = require("path"); + +const newVersion = process.argv[2]; +validateVersion(newVersion); + +const packagesDir = path.join(__dirname, "..", "packages"); +const packages = fs.readdirSync(packagesDir); + +// read package.json of each package +packages.forEach((packageName) => { + const packageJson = require( + path.join(packagesDir, packageName, "package.json"), + ); + + // update the version of the package + packageJson.version = newVersion; + + // update the version of the dependencies + for (const dependencyName in packageJson.dependencies) { + // for all packages, check if the dependencyName name includes any of them + if ( + packages.some( + (packageName) => dependencyName === "@jazzer.js/" + packageName, + ) + ) { + packageJson.dependencies[dependencyName] = newVersion; + } + } + + // write the updated package.json + writePackageJson( + path.join(packagesDir, packageName, "package.json"), + packageJson, + ); +}); + +// update the jazzer.js version in the /package.json +updateVersion(path.join(__dirname, "..", "package.json"), newVersion); + +// run npm install to update the package-lock.json files +execSync("npm install", { cwd: packagesDir, stdio: "inherit" }); + +function updateVersion(filename, newVersion) { + const pkg = require(filename); + pkg.version = newVersion; + writePackageJson(filename, pkg); +} + +function writePackageJson(filename, pkg) { + fs.writeFileSync(filename, JSON.stringify(pkg, null, "\t") + "\n"); +} + +// make sure the new version has the format v*.*.* +function validateVersion(version) { + if (!version?.match(/^\d+\.\d+\.\d+$/)) { + console.error("Invalid version format. Expected *.*.*"); + process.exit(1); + } +} diff --git a/scripts/strip.js b/scripts/strip.js new file mode 100644 index 000000000..1ac9b6d1a --- /dev/null +++ b/scripts/strip.js @@ -0,0 +1,56 @@ +/* + * Copyright 2026 Code Intelligence GmbH + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +// Original file has MIT Licence +// This file is copied from prebuild/strip.js from https://github.com/prebuild/prebuild + +const child_process = require("child_process"); + +function strip(files, cb) { + // TODO no support on windows, noop + const platform = process.platform; + if (platform === "win32") return process.nextTick(cb); + stripFiles(files, platform, cb); +} + +function stripFiles(file, platform, cb) { + spawn( + process.env.STRIP || "strip", + stripArgs(platform, file), + function (err) { + if (err) { + cb(err); + return; + } + }, + ); +} + +function stripArgs(platform, file) { + if (platform === "darwin") return [file, "-Sx"]; + if (["freebsd", "linux"].includes(platform)) return [file, "--strip-all"]; + // TODO find out what args to use for other platforms, e.g. 'sunos' + return []; +} + +function spawn(cmd, args, cb) { + return child_process.spawn(cmd, args).on("exit", function (code) { + if (code === 0) return cb(); + cb(new Error("could not spawn strip")); + }); +} + +module.exports = strip; diff --git a/tests/bug-detectors/command-injection.test.js b/tests/bug-detectors/command-injection.test.js index 6e2ad78fe..64b3cb29b 100644 --- a/tests/bug-detectors/command-injection.test.js +++ b/tests/bug-detectors/command-injection.test.js @@ -1,5 +1,5 @@ /* - * Copyright 2023 Code Intelligence GmbH + * Copyright 2026 Code Intelligence GmbH * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/tests/bug-detectors/command-injection/fuzz.js b/tests/bug-detectors/command-injection/fuzz.js index b97f61ab5..7c37dfefe 100644 --- a/tests/bug-detectors/command-injection/fuzz.js +++ b/tests/bug-detectors/command-injection/fuzz.js @@ -1,5 +1,5 @@ /* - * Copyright 2023 Code Intelligence GmbH + * Copyright 2026 Code Intelligence GmbH * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/tests/bug-detectors/command-injection/makeFRIENDLY.js b/tests/bug-detectors/command-injection/makeFRIENDLY.js index 1873081e9..56844d6fd 100644 --- a/tests/bug-detectors/command-injection/makeFRIENDLY.js +++ b/tests/bug-detectors/command-injection/makeFRIENDLY.js @@ -1,5 +1,5 @@ /* - * Copyright 2023 Code Intelligence GmbH + * Copyright 2026 Code Intelligence GmbH * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/tests/bug-detectors/general.test.js b/tests/bug-detectors/general.test.js index c2367aac6..f94d5c79c 100644 --- a/tests/bug-detectors/general.test.js +++ b/tests/bug-detectors/general.test.js @@ -1,5 +1,5 @@ /* - * Copyright 2023 Code Intelligence GmbH + * Copyright 2026 Code Intelligence GmbH * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -30,7 +30,7 @@ describe("General tests", () => { const friendlyFilePath = path.join(bugDetectorDirectory, "FRIENDLY"); const evilFilePath = path.join(bugDetectorDirectory, "jaz_zer"); const errorPattern = - /Command Injection in execSync\(\): called with 'jaz_zer'/g; + /Command Injection\n {4}in execSync\(\): called with 'jaz_zer'/g; function expectErrorToBePrintedOnce(fuzzTest) { const matches = fuzzTest.stderr.match(errorPattern); diff --git a/tests/bug-detectors/general/fuzz.js b/tests/bug-detectors/general/fuzz.js index ee92eb794..aa6031944 100644 --- a/tests/bug-detectors/general/fuzz.js +++ b/tests/bug-detectors/general/fuzz.js @@ -1,5 +1,5 @@ /* - * Copyright 2023 Code Intelligence GmbH + * Copyright 2026 Code Intelligence GmbH * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -100,22 +100,22 @@ module.exports.CallOriginalFriendlyAsyncCallingSync = async function (data) { }; module.exports.ForkModeCallOriginalEvil = makeFuzzFunctionWithInput( - 100, + 1, evilCommand, ); module.exports.ForkModeCallOriginalFriendly = makeFuzzFunctionWithInput( - 100, + 1, friendlyCommand, ); module.exports.ForkModeCallOriginalEvilAsync = makeAsyncFuzzFunctionWithInput( - 100, + 1, evilCommand, ); module.exports.ForkModeCallOriginalFriendlyAsync = - makeAsyncFuzzFunctionWithInput(100, friendlyCommand); + makeAsyncFuzzFunctionWithInput(1, friendlyCommand); module.exports.DisableAllBugDetectors = makeFnCalledOnce(async (data) => { // Command Injection : try to make an empty file named "jaz_zer" (our evil string) diff --git a/tests/bug-detectors/general/tests.fuzz.js b/tests/bug-detectors/general/tests.fuzz.js index 9782736c1..13b945d4e 100644 --- a/tests/bug-detectors/general/tests.fuzz.js +++ b/tests/bug-detectors/general/tests.fuzz.js @@ -1,5 +1,5 @@ /* - * Copyright 2023 Code Intelligence GmbH + * Copyright 2026 Code Intelligence GmbH * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/tests/bug-detectors/path-traversal.test.js b/tests/bug-detectors/path-traversal.test.js index 3b690c2a8..a45cd501c 100644 --- a/tests/bug-detectors/path-traversal.test.js +++ b/tests/bug-detectors/path-traversal.test.js @@ -1,5 +1,5 @@ /* - * Copyright 2023 Code Intelligence GmbH + * Copyright 2026 Code Intelligence GmbH * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/tests/bug-detectors/path-traversal/fuzz.js b/tests/bug-detectors/path-traversal/fuzz.js index f32c85447..791cf9f10 100644 --- a/tests/bug-detectors/path-traversal/fuzz.js +++ b/tests/bug-detectors/path-traversal/fuzz.js @@ -1,5 +1,5 @@ /* - * Copyright 2023 Code Intelligence GmbH + * Copyright 2026 Code Intelligence GmbH * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -101,10 +101,10 @@ module.exports.PathTraversalJoinSafeAsync = makeFnCalledOnce(async (data) => { path.join(safe_path, "SAFE"); }); -module.exports.invalidArgsToOpen = makeFnCalledOnce((data) => { +module.exports.invalidArgsToOpen = (data) => { fs.openSync(0); -}); +}; -module.exports.invalidArgsToCp = makeFnCalledOnce((data) => { +module.exports.invalidArgsToCp = (data) => { fs.cp(0, 0, () => {}); -}); +}; diff --git a/tests/bug-detectors/prototype-pollution.test.js b/tests/bug-detectors/prototype-pollution.test.js index 5d00d8dee..f3d5f203f 100644 --- a/tests/bug-detectors/prototype-pollution.test.js +++ b/tests/bug-detectors/prototype-pollution.test.js @@ -1,5 +1,5 @@ /* - * Copyright 2023 Code Intelligence GmbH + * Copyright 2026 Code Intelligence GmbH * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -75,7 +75,7 @@ describe("Prototype Pollution", () => { fuzzTest.execute(); }).toThrowError(FuzzingExitCode); expect(fuzzTest.stderr).toContain( - "Prototype Pollution: Prototype of Function changed", + "Prototype Pollution\n Prototype of Function changed", ); }); @@ -90,7 +90,7 @@ describe("Prototype Pollution", () => { fuzzTest.execute(); }).toThrowError(FuzzingExitCode); expect(fuzzTest.stderr).toContain( - "Prototype Pollution: Prototype of String changed", + "Prototype Pollution\n Prototype of String changed", ); }); @@ -105,7 +105,7 @@ describe("Prototype Pollution", () => { fuzzTest.execute(); }).toThrowError(FuzzingExitCode); expect(fuzzTest.stderr).toContain( - "Prototype Pollution: Prototype of Number changed", + "Prototype Pollution\n Prototype of Number changed", ); }); @@ -120,7 +120,7 @@ describe("Prototype Pollution", () => { fuzzTest.execute(); }).toThrowError(FuzzingExitCode); expect(fuzzTest.stderr).toContain( - "Prototype Pollution: Prototype of Boolean changed", + "Prototype Pollution\n Prototype of Boolean changed", ); }); @@ -138,7 +138,7 @@ describe("Prototype Pollution", () => { fuzzTest.execute(); }).toThrowError(FuzzingExitCode); expect(fuzzTest.stderr).toContain( - "Prototype Pollution: a.__proto__ value is ", + "Prototype Pollution\n a.__proto__ value is ", ); }); @@ -155,7 +155,7 @@ describe("Prototype Pollution", () => { expect(() => { fuzzTest.execute(); }).toThrowError(FuzzingExitCode); - expect(fuzzTest.stderr).toContain("Prototype Pollution: a.__proto__"); + expect(fuzzTest.stderr).toContain("Prototype Pollution\n a.__proto__"); }); it("Test no instrumentation and polluting __proto__ of a class", () => { @@ -334,7 +334,7 @@ describe("Prototype Pollution Jest tests", () => { fuzzTest.execute(); }).toThrowError(JestRegressionExitCode); expect(fuzzTest.stderr).toContain( - "Prototype Pollution: Prototype of Object changed", + "Prototype Pollution\n Prototype of Object changed", ); }); @@ -353,7 +353,7 @@ describe("Prototype Pollution Jest tests", () => { fuzzTest.execute(); }).toThrowError(JestRegressionExitCode); expect(fuzzTest.stderr).toContain( - "Prototype Pollution: a.__proto__ value is", + "Prototype Pollution\n a.__proto__ value is", ); }); @@ -372,7 +372,7 @@ describe("Prototype Pollution Jest tests", () => { fuzzTest.execute(); }).toThrowError(JestRegressionExitCode); expect(fuzzTest.stderr).toContain( - "Prototype Pollution: a.__proto__ value is", + "Prototype Pollution\n a.__proto__ value is", ); }); @@ -389,7 +389,7 @@ describe("Prototype Pollution Jest tests", () => { fuzzTest.execute(); }).toThrowError(JestRegressionExitCode); expect(fuzzTest.stderr).toContain( - "Prototype Pollution: Prototype of Object changed", + "Prototype Pollution\n Prototype of Object changed", ); }); diff --git a/tests/bug-detectors/prototype-pollution/fuzz.js b/tests/bug-detectors/prototype-pollution/fuzz.js index 45dc9feeb..520e389ac 100644 --- a/tests/bug-detectors/prototype-pollution/fuzz.js +++ b/tests/bug-detectors/prototype-pollution/fuzz.js @@ -1,5 +1,5 @@ /* - * Copyright 2023 Code Intelligence GmbH + * Copyright 2026 Code Intelligence GmbH * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/tests/bug-detectors/prototype-pollution/instrument-all-exclude-one.config.js b/tests/bug-detectors/prototype-pollution/instrument-all-exclude-one.config.js index 2dc32b77b..5f87c2299 100644 --- a/tests/bug-detectors/prototype-pollution/instrument-all-exclude-one.config.js +++ b/tests/bug-detectors/prototype-pollution/instrument-all-exclude-one.config.js @@ -1,5 +1,5 @@ /* - * Copyright 2023 Code Intelligence GmbH + * Copyright 2026 Code Intelligence GmbH * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/tests/bug-detectors/prototype-pollution/instrument-all.config.js b/tests/bug-detectors/prototype-pollution/instrument-all.config.js index b9c7e3f39..e068efa04 100644 --- a/tests/bug-detectors/prototype-pollution/instrument-all.config.js +++ b/tests/bug-detectors/prototype-pollution/instrument-all.config.js @@ -1,5 +1,5 @@ /* - * Copyright 2023 Code Intelligence GmbH + * Copyright 2026 Code Intelligence GmbH * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/tests/bug-detectors/prototype-pollution/instrumentation-correctness-tests.js b/tests/bug-detectors/prototype-pollution/instrumentation-correctness-tests.js index ceb46e3f4..77901ccd8 100644 --- a/tests/bug-detectors/prototype-pollution/instrumentation-correctness-tests.js +++ b/tests/bug-detectors/prototype-pollution/instrumentation-correctness-tests.js @@ -1,5 +1,5 @@ /* - * Copyright 2023 Code Intelligence GmbH + * Copyright 2026 Code Intelligence GmbH * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/tests/bug-detectors/prototype-pollution/tests.fuzz.js b/tests/bug-detectors/prototype-pollution/tests.fuzz.js index 679154c0c..6b0e49b17 100644 --- a/tests/bug-detectors/prototype-pollution/tests.fuzz.js +++ b/tests/bug-detectors/prototype-pollution/tests.fuzz.js @@ -1,5 +1,5 @@ /* - * Copyright 2023 Code Intelligence GmbH + * Copyright 2026 Code Intelligence GmbH * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/tests/bug-detectors/remote-code-execution.test.js b/tests/bug-detectors/remote-code-execution.test.js new file mode 100644 index 000000000..dc4c6d582 --- /dev/null +++ b/tests/bug-detectors/remote-code-execution.test.js @@ -0,0 +1,303 @@ +/* + * Copyright 2026 Code Intelligence GmbH + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +const path = require("path"); + +const { + FuzzTestBuilder, + FuzzingExitCode, + JestRegressionExitCode, +} = require("../helpers.js"); + +const bugDetectorDirectory = path.join(__dirname, "remote-code-execution"); + +const findingMessage = "Remote Code Execution"; +const okMessage = "can be called just fine"; +let fuzzTestBuilder; + +beforeEach(() => { + fuzzTestBuilder = new FuzzTestBuilder() + .runs(0) + .dir(bugDetectorDirectory) + .sync(true); +}); + +describe("CLI", () => { + describe("eval ()", () => { + it("Invocation without error", () => { + const fuzzTest = fuzzTestBuilder + .fuzzEntryPoint("invocationWithoutError") + .build() + .execute(); + expect(fuzzTest.stdout).toContain(okMessage); + }); + + it("Direct invocation", () => { + const fuzzTest = fuzzTestBuilder + .fuzzEntryPoint("directInvocation") + .sync(true) + .build(); + expect(() => { + fuzzTest.execute(); + }).toThrowError(FuzzingExitCode); + expect(fuzzTest.stderr).toContain(findingMessage); + }); + + it("Indirect invocation", () => { + const fuzzTest = fuzzTestBuilder + .fuzzEntryPoint("indirectInvocation") + .sync(true) + .build(); + expect(() => { + fuzzTest.execute(); + }).toThrowError(FuzzingExitCode); + expect(fuzzTest.stderr).toContain(findingMessage); + }); + + it("Indirect invocation using comma operator", () => { + const fuzzTest = fuzzTestBuilder + .fuzzEntryPoint("indirectInvocationUsingCommaOperator") + .sync(true) + .build(); + expect(() => { + fuzzTest.execute(); + }).toThrowError(FuzzingExitCode); + expect(fuzzTest.stderr).toContain(findingMessage); + }); + + it("Indirect invocation through optional chaining", () => { + const fuzzTest = fuzzTestBuilder + .fuzzEntryPoint("indirectInvocationThroughOptionalChaining") + .sync(true) + .build(); + expect(() => { + fuzzTest.execute(); + }).toThrowError(FuzzingExitCode); + expect(fuzzTest.stderr).toContain(findingMessage); + }); + }); + + describe("Function constructor", () => { + it("Invocation without error, without explicit constructor", () => { + const fuzzTest = fuzzTestBuilder + .fuzzEntryPoint("functionNoErrorNoConstructor") + .sync(true) + .build() + .execute(); + expect(fuzzTest.stdout).toContain(okMessage); + }); + + it("Invocation without error", () => { + const fuzzTest = fuzzTestBuilder + .fuzzEntryPoint("functionNoErrorWithConstructor") + .sync(true) + .build() + .execute(); + expect(fuzzTest.stdout).toContain(okMessage); + }); + + it("Direct invocation", () => { + const fuzzTest = fuzzTestBuilder + .fuzzEntryPoint("functionError") + .sync(true) + .build(); + expect(() => { + fuzzTest.execute(); + }).toThrowError(FuzzingExitCode); + expect(fuzzTest.stderr).toContain(findingMessage); + }); + + it("Direct invocation using new", () => { + const fuzzTest = fuzzTestBuilder + .fuzzEntryPoint("functionErrorNew") + .sync(true) + .build(); + expect(() => { + fuzzTest.execute(); + }).toThrowError(FuzzingExitCode); + expect(fuzzTest.stderr).toContain(findingMessage); + }); + + it("Target string in variable name - no error", () => { + const fuzzTest = fuzzTestBuilder + .fuzzEntryPoint("functionWithArgNoError") + .sync(true) + .build() + .execute(); + expect(fuzzTest.stdout).toContain(okMessage); + }); + + it("With error - target string in last arg", () => { + const fuzzTest = fuzzTestBuilder + .fuzzEntryPoint("functionWithArgError") + .sync(true) + .build(); + expect(() => { + fuzzTest.execute(); + }).toThrowError(FuzzingExitCode); + expect(fuzzTest.stderr).toContain(findingMessage); + }); + + it("Function.prototype should still exist", () => { + const fuzzTest = fuzzTestBuilder + .dryRun(false) + .fuzzEntryPoint("functionPrototypeExists") + .sync(true) + .build(); + fuzzTest.execute(); + }); + }); +}); + +describe("Jest", () => { + describe("eval", () => { + it("Direct invocation", () => { + const fuzzTest = fuzzTestBuilder + .dryRun(false) + .jestTestFile("tests.fuzz.js") + .jestTestName("eval Direct invocation$") + .build(); + expect(() => { + fuzzTest.execute(); + }).toThrowError(JestRegressionExitCode); + expect(fuzzTest.stderr).toContain(findingMessage); + }); + + it("Indirect invocation", () => { + const fuzzTest = fuzzTestBuilder + .dryRun(false) + .jestTestFile("tests.fuzz.js") + .jestTestName("eval Indirect invocation$") + .build(); + expect(() => { + fuzzTest.execute(); + }).toThrowError(JestRegressionExitCode); + expect(fuzzTest.stderr).toContain(findingMessage); + }); + + it("Indirect invocation using comma operator", () => { + const fuzzTest = fuzzTestBuilder + .dryRun(false) + .jestTestFile("tests.fuzz.js") + .jestTestName("eval Indirect invocation using comma operator$") + .build(); + expect(() => { + fuzzTest.execute(); + }).toThrowError(JestRegressionExitCode); + expect(fuzzTest.stderr).toContain(findingMessage); + }); + + it("Indirect invocation using optional chaining", () => { + const fuzzTest = fuzzTestBuilder + .dryRun(false) + .verbose(true) + .jestTestFile("tests.fuzz.js") + .jestTestName("eval Indirect invocation through optional chaining$") + .build(); + expect(() => { + fuzzTest.execute(); + }).toThrowError(JestRegressionExitCode); + expect(fuzzTest.stderr).toContain(findingMessage); + }); + + it("No error with absence of the target string", () => { + const fuzzTest = fuzzTestBuilder + .dryRun(false) + .jestTestFile("tests.fuzz.js") + .jestTestName("eval No error$") + .build() + .execute(); + expect(fuzzTest.stdout).toContain(okMessage); + }); + }); + + describe("Function constructor", () => { + it("No error", () => { + const fuzzTest = fuzzTestBuilder + .dryRun(false) + .jestTestFile("tests.fuzz.js") + .jestTestName("Function No error$") + .build(); + fuzzTest.execute(); + expect(fuzzTest.stdout).toContain(okMessage); + }); + + it("No error with constructor", () => { + const fuzzTest = fuzzTestBuilder + .dryRun(false) + .jestTestFile("tests.fuzz.js") + .jestTestName("Function No error with constructor$") + .build(); + fuzzTest.execute(); + expect(fuzzTest.stdout).toContain(okMessage); + }); + + it("With error", () => { + const fuzzTest = fuzzTestBuilder + .dryRun(false) + .jestTestFile("tests.fuzz.js") + .jestTestName("Function With error$") + .build(); + expect(() => { + fuzzTest.execute(); + }).toThrowError(JestRegressionExitCode); + expect(fuzzTest.stderr).toContain(findingMessage); + }); + + it("With error with constructor", () => { + const fuzzTest = fuzzTestBuilder + .dryRun(false) + .jestTestFile("tests.fuzz.js") + .jestTestName("Function With error with constructor$") + .build(); + expect(() => { + fuzzTest.execute(); + }).toThrowError(JestRegressionExitCode); + expect(fuzzTest.stderr).toContain(findingMessage); + }); + + it("Variable name containing target string should not throw", () => { + const fuzzTest = fuzzTestBuilder + .dryRun(false) + .jestTestFile("tests.fuzz.js") + .jestTestName("Function Target string in variable name - no error$") + .build() + .execute(); + expect(fuzzTest.stdout).toContain(okMessage); + }); + + it("With variable, body contains target string - should throw", () => { + const fuzzTest = fuzzTestBuilder + .dryRun(false) + .jestTestFile("tests.fuzz.js") + .jestTestName("Function With error - target string in last arg$") + .build(); + expect(() => { + fuzzTest.execute(); + }).toThrowError(JestRegressionExitCode); + expect(fuzzTest.stderr).toContain(findingMessage); + }); + + it("Function.prototype should still exist", () => { + const fuzzTest = fuzzTestBuilder + .dryRun(false) + .jestTestFile("tests.fuzz.js") + .jestTestName("Function.prototype still exists$") + .build(); + fuzzTest.execute(); + }); + }); +}); diff --git a/tests/bug-detectors/remote-code-execution/fuzz.js b/tests/bug-detectors/remote-code-execution/fuzz.js new file mode 100644 index 000000000..daab6b959 --- /dev/null +++ b/tests/bug-detectors/remote-code-execution/fuzz.js @@ -0,0 +1,72 @@ +/* + * Copyright 2026 Code Intelligence GmbH + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +const printOkMessage = "console.log('can be called just fine')"; + +// eval +module.exports.invocationWithoutError = function (data) { + eval("const a = 10; const b = 20;" + printOkMessage); +}; + +module.exports.directInvocation = function (data) { + eval("const jaz_zer = 10;"); +}; + +module.exports.indirectInvocation = function (data) { + const a = eval; + a("const jaz_zer = 10;"); +}; + +module.exports.indirectInvocationUsingCommaOperator = function (data) { + (0, eval)("const jaz_zer = 10;"); +}; + +module.exports.indirectInvocationThroughOptionalChaining = function (data) { + eval?.("const jaz_zer = 10;"); +}; + +// Function +module.exports.functionNoErrorNoConstructor = function (data) { + Function("const a = 10; const b = 20;" + printOkMessage)(); +}; + +module.exports.functionNoErrorWithConstructor = function (data) { + const fn = new Function("const a = 10; const b = 20;" + printOkMessage); + fn(); +}; + +module.exports.functionError = function (data) { + Function("const jaz_zer = 10;"); +}; + +module.exports.functionErrorNew = function (data) { + new Function("const jaz_zer = 10;")(); +}; + +module.exports.functionWithArgNoError = function (data) { + new Function( + "jaz_zer", + "const foo = 10; console.log('Function can be called just fine')", + )("_"); +}; + +module.exports.functionWithArgError = function (data) { + new Function("foo", "const jaz_zer = 10;")("_"); +}; + +module.exports.functionPrototypeExists = function (data) { + console.log(Function.prototype.call.bind); +}; diff --git a/tests/bug-detectors/remote-code-execution/package.json b/tests/bug-detectors/remote-code-execution/package.json new file mode 100644 index 000000000..fcb22af75 --- /dev/null +++ b/tests/bug-detectors/remote-code-execution/package.json @@ -0,0 +1,27 @@ +{ + "name": "jazzerjs-remote-code-execution-tests", + "version": "1.0.0", + "description": "Tests for the Remote Code Execution bug detector", + "scripts": { + "test": "jest", + "fuzz": "JAZZER_FUZZ=1 jest" + }, + "devDependencies": { + "@jazzer.js/jest-runner": "file:../../packages/jest-runner", + "eslint-plugin-jest": "^27.1.3" + }, + "jest": { + "projects": [ + { + "testRunner": "@jazzer.js/jest-runner", + "displayName": { + "name": "Jazzer.js", + "color": "cyan" + }, + "testMatch": [ + "/**/*.fuzz.js" + ] + } + ] + } +} diff --git a/tests/bug-detectors/remote-code-execution/tests.fuzz.js b/tests/bug-detectors/remote-code-execution/tests.fuzz.js new file mode 100644 index 000000000..a7a7a3a88 --- /dev/null +++ b/tests/bug-detectors/remote-code-execution/tests.fuzz.js @@ -0,0 +1,68 @@ +/* + * Copyright 2026 Code Intelligence GmbH + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +const tests = require("./fuzz"); + +describe("eval", () => { + it.fuzz("No error", (data) => { + tests.invocationWithoutError(data); + }); + + it.fuzz("Direct invocation", (data) => { + tests.directInvocation(data); + }); + + it.fuzz("Indirect invocation", (data) => { + tests.indirectInvocation(data); + }); + + it.fuzz("Indirect invocation using comma operator", (data) => { + tests.indirectInvocationUsingCommaOperator(data); + }); + + it.fuzz("Indirect invocation through optional chaining", (data) => { + tests.indirectInvocationThroughOptionalChaining(data); + }); +}); + +describe("Function", () => { + it.fuzz("No error", (data) => { + tests.functionNoErrorNoConstructor(); + }); + it.fuzz("No error with constructor", (data) => { + tests.functionNoErrorWithConstructor(data); + }); + + it.fuzz("With error", (data) => { + tests.functionError(data); + }); + + it.fuzz("With error with constructor", (data) => { + tests.functionErrorNew(data); + }); + + it.fuzz("Target string in variable name - no error", (data) => { + tests.functionWithArgNoError(data); + }); + + it.fuzz("With error - target string in last arg", (data) => { + tests.functionWithArgError(data); + }); + + it.fuzz("Function.prototype still exists", (data) => { + tests.functionPrototypeExists(data); + }); +}); diff --git a/tests/bug-detectors/ssrf.test.js b/tests/bug-detectors/ssrf.test.js new file mode 100644 index 000000000..1c208f53c --- /dev/null +++ b/tests/bug-detectors/ssrf.test.js @@ -0,0 +1,416 @@ +/* + * Copyright 2026 Code Intelligence GmbH + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +const dgram = require("dgram"); +const fs = require("fs"); +const http = require("http"); +const https = require("https"); +const path = require("path"); + +const { + FuzzTestBuilder, + FuzzingExitCode, + JestRegressionExitCode, +} = require("../helpers.js"); + +const { + host, + hostIPv6, + okPort, + okPortHttps, + okPortIPv6, + notOkPort, + notOkPortHttps, + okMessage, + notOkMessage, + ssrfFindingMessage, +} = require("./ssrf/connection-settings.js"); + +describe("SSRF", () => { + let endpoints; + + beforeAll(async () => { + endpoints = [ + [http.createServer, host, okPort, okMessage], + [http.createServer, host, notOkPort, notOkMessage], + [https.createServer, host, okPortHttps, okMessage], + [https.createServer, host, notOkPortHttps, notOkMessage], + [dgram.createSocket, host, okPort, okMessage, false], + [dgram.createSocket, host, notOkPort, notOkMessage, false], + [dgram.createSocket, hostIPv6, okPortIPv6, okMessage, false, true], + ].map( + async ([createServerFn, host, port, message, isTCP, udpType]) => + await createServer(createServerFn, host, port, message, isTCP, udpType), + ); + }); + + afterAll((done) => { + Promise.all(endpoints).then((servers) => { + servers.forEach((server) => { + server.close(); + server.unref(); + }); + done(); + }); + }); + + const bugDetectorDirectory = path.join(__dirname, "ssrf"); + let fuzzTestBuilder; + + describe("Not permitted connections", () => { + beforeEach(() => { + fuzzTestBuilder = new FuzzTestBuilder() + .dir(bugDetectorDirectory) + .fuzzFile("fuzz-http.js") + .runs(0) + .sync(false); + }); + + it("http.get(options, callback)", async () => { + const fuzzTest = fuzzTestBuilder + .fuzzEntryPoint("HttpGetOptionsCallback") + .build(); + await expect(fuzzTest.executeWithPromise()).rejects.toThrowError( + FuzzingExitCode, + ); + expect(fuzzTest.stderr).toContain(ssrfFindingMessage); + }); + + it("http.get(url, callback)", async () => { + const fuzzTest = fuzzTestBuilder + .fuzzEntryPoint("HttpGetUrlCallback") + .build(); + await expect(fuzzTest.executeWithPromise()).rejects.toThrowError( + FuzzingExitCode, + ); + expect(fuzzTest.stderr).toContain(ssrfFindingMessage); + }); + + it("http.get(url with no port, callback)", async () => { + const fuzzTest = fuzzTestBuilder + .fuzzEntryPoint("HttpGetUrlNoPort") + .build(); + await expect(fuzzTest.executeWithPromise()).rejects.toThrowError( + FuzzingExitCode, + ); + expect(fuzzTest.stderr).toContain(ssrfFindingMessage); + }); + + it("http.get(nothing, callback)", async () => { + const fuzzTest = fuzzTestBuilder + .fuzzEntryPoint("HttpGetUrlNoAnything") + .build(); + await expect(fuzzTest.executeWithPromise()).rejects.toThrowError( + FuzzingExitCode, + ); + expect(fuzzTest.stderr).toContain(ssrfFindingMessage); + }); + + it("http.request(options, callback)", async () => { + const fuzzTest = fuzzTestBuilder + .fuzzEntryPoint("HttpRequestOptionsCallback") + .build(); + await expect(fuzzTest.executeWithPromise()).rejects.toThrowError( + FuzzingExitCode, + ); + expect(fuzzTest.stderr).toContain(ssrfFindingMessage); + }); + + it("http.request(url, callback)", async () => { + const fuzzTest = fuzzTestBuilder + .fuzzEntryPoint("HttpRequestUrlCallback") + .build(); + await expect(fuzzTest.executeWithPromise()).rejects.toThrowError( + FuzzingExitCode, + ); + expect(fuzzTest.stderr).toContain(ssrfFindingMessage); + }); + + it("http.request(url with no port, callback)", async () => { + const fuzzTest = fuzzTestBuilder + .fuzzEntryPoint("HttpRequestUrlNoPort") + .build(); + await expect(fuzzTest.executeWithPromise()).rejects.toThrowError( + FuzzingExitCode, + ); + expect(fuzzTest.stderr).toContain(ssrfFindingMessage); + }); + + it("net.connect(port, host, callback)", async () => { + const fuzzTest = fuzzTestBuilder + .fuzzEntryPoint("netConnectPortHost") + .build(); + await expect(fuzzTest.executeWithPromise()).rejects.toThrowError( + FuzzingExitCode, + ); + expect(fuzzTest.stderr).toContain(ssrfFindingMessage); + }); + + it("net.connect(options, callback)", async () => { + const fuzzTest = fuzzTestBuilder + .fuzzEntryPoint("netConnectOptions") + .build(); + await expect(fuzzTest.executeWithPromise()).rejects.toThrowError( + FuzzingExitCode, + ); + expect(fuzzTest.stderr).toContain(ssrfFindingMessage); + }); + + it("net Socket.connect(port, host, callback)", async () => { + const fuzzTest = fuzzTestBuilder.fuzzEntryPoint("socketConnect").build(); + await expect(fuzzTest.executeWithPromise()).rejects.toThrowError( + FuzzingExitCode, + ); + expect(fuzzTest.stderr).toContain(ssrfFindingMessage); + }); + + it("net Socket.connect(options, callback)", async () => { + const fuzzTest = fuzzTestBuilder + .fuzzEntryPoint("socketConnectWithOptions") + .build(); + await expect(fuzzTest.executeWithPromise()).rejects.toThrowError( + FuzzingExitCode, + ); + expect(fuzzTest.stderr).toContain(ssrfFindingMessage); + }); + + it("tls.connect(options, callback)", async () => { + const fuzzTest = fuzzTestBuilder.fuzzEntryPoint("TlsConnect").build(); + await expect(fuzzTest.executeWithPromise()).rejects.toThrowError( + FuzzingExitCode, + ); + expect(fuzzTest.stderr).toContain(ssrfFindingMessage); + }); + + it("https.get(options, callback)", async () => { + const fuzzTest = fuzzTestBuilder + .fuzzEntryPoint("HttpsGetOptions") + .build(); + await expect(fuzzTest.executeWithPromise()).rejects.toThrowError( + FuzzingExitCode, + ); + expect(fuzzTest.stderr).toContain(ssrfFindingMessage); + }); + + it("http2.connect(options, callback)", async () => { + const fuzzTest = fuzzTestBuilder.fuzzEntryPoint("Http2Connect").build(); + await expect(fuzzTest.executeWithPromise()).rejects.toThrowError( + FuzzingExitCode, + ); + expect(fuzzTest.stderr).toContain(ssrfFindingMessage); + }); + + it("udp.connect(port, host, callback)", async () => { + const fuzzTest = fuzzTestBuilder.fuzzEntryPoint("udpConnect").build(); + await expect(fuzzTest.executeWithPromise()).rejects.toThrowError( + FuzzingExitCode, + ); + expect(fuzzTest.stderr).toContain(ssrfFindingMessage); + }); + + describe("Jest tests", () => { + beforeEach(() => { + fuzzTestBuilder = new FuzzTestBuilder() + .dir(bugDetectorDirectory) + .jestTestFile("tests.fuzz.js") + .sync(false); + }); + + it("net.connect(options, callback)", async () => { + const fuzzTest = fuzzTestBuilder + .jestTestName("net.connect\\(options, callback\\)") + .build(); + await expect(fuzzTest.executeWithPromise()).rejects.toThrowError( + JestRegressionExitCode, + ); + expect(fuzzTest.stderr).toContain(ssrfFindingMessage); + }); + + it("udp.connect(port, host, callback)", async () => { + const fuzzTest = fuzzTestBuilder + .jestTestName("udp.connect\\(port, host, callback\\)") + .build(); + await expect(fuzzTest.executeWithPromise()).rejects.toThrowError( + JestRegressionExitCode, + ); + expect(fuzzTest.stderr).toContain(ssrfFindingMessage); + }); + }); + }); + + describe("Permitted connections", () => { + beforeEach(() => { + fuzzTestBuilder = new FuzzTestBuilder() + .dir(bugDetectorDirectory) + .fuzzFile("fuzz-http.js") + .runs(1) + .customHooks([ + path.join(bugDetectorDirectory, "allow-ok-ports.config.js"), + ]) + .sync(false); + }); + + it("http.request", async () => { + const fuzzTest = fuzzTestBuilder + .fuzzEntryPoint("HttpRequestAllowed") + .build(); + await fuzzTest.executeWithPromise(); + expect(fuzzTest.stdout).toContain(okMessage); + }); + + it("http.get", async () => { + const fuzzTest = fuzzTestBuilder.fuzzEntryPoint("HttpGetAllowed").build(); + await fuzzTest.executeWithPromise(); + expect(fuzzTest.stdout).toContain(okMessage); + }); + + it("https.get", async () => { + const fuzzTest = fuzzTestBuilder + .fuzzEntryPoint("HttpsGetAllowed") + .build(); + await fuzzTest.executeWithPromise(); + expect(fuzzTest.stdout).toContain(okMessage); + }); + + it("http2.connect", async () => { + const fuzzTest = fuzzTestBuilder + .fuzzEntryPoint("Http2ConnectAllowed") + .build(); + await fuzzTest.executeWithPromise(); + expect(fuzzTest.stdout).toContain(okMessage); + }); + + it("net.connect", async () => { + const fuzzTest = fuzzTestBuilder + .fuzzEntryPoint("netConnectAllowed") + .build(); + await fuzzTest.executeWithPromise(); + expect(fuzzTest.stdout).toContain(okMessage); + }); + + it("udp.connect", async () => { + const fuzzTest = fuzzTestBuilder + .fuzzEntryPoint("udpConnectAllowed") + .build(); + await fuzzTest.executeWithPromise(); + expect(fuzzTest.stdout).toContain(okMessage); + }); + + it("udp.send connectionless", async () => { + const fuzzTest = fuzzTestBuilder + .fuzzEntryPoint("udpSendConnectionlessAllowed") + .build(); + await fuzzTest.executeWithPromise(); + expect(fuzzTest.stdout).toContain(okMessage); + }); + + it("udp.connect IPv6", async () => { + const fuzzTest = fuzzTestBuilder + .fuzzEntryPoint("udpIPv6ConnectAllowed") + .build(); + await fuzzTest.executeWithPromise(); + expect(fuzzTest.stdout).toContain(okMessage); + }); + + describe("Jest tests", () => { + beforeEach(() => { + fuzzTestBuilder = new FuzzTestBuilder() + .dir(bugDetectorDirectory) + .jestTestFile("tests.fuzz.js") + .customHooks([ + path.join(bugDetectorDirectory, "allow-ok-ports.config.js"), + ]) + .sync(false); + }); + + it("http.request", async () => { + const fuzzTest = fuzzTestBuilder.jestTestName("http.request").build(); + await expect(fuzzTest.executeWithPromise()).rejects.toThrowError( + JestRegressionExitCode, + ); + expect(fuzzTest.stderr).toContain(okMessage); + }); + + it("udp.connect IPv6", async () => { + const fuzzTest = fuzzTestBuilder + .jestTestName("udp.connect IPv6") + .build(); + await expect(fuzzTest.executeWithPromise()).rejects.toThrowError( + JestRegressionExitCode, + ); + expect(fuzzTest.stderr).toContain(okMessage); + }); + }); + }); +}); +async function createServer( + createServerFn, + host, + port, + message, + isTCP = true, + useIPv6 = false, +) { + const options = { + key: fs.readFileSync(path.join(__dirname, "ssrf", "key.pem")), + cert: fs.readFileSync(path.join(__dirname, "ssrf", "cert.pem")), + port: port, + host: host, + }; + let startedListening = false; + let server; + + if (isTCP) { + server = createServerFn(options, (req, res) => { + res.writeHead(200, { "Content-Type": "text/plain" }); + res.write(message); + res.end(); + }); + + server.listen(port, host, () => { + startedListening = true; + }); + + server.on("connect", (req, socket, head) => { + console.log("connect"); + }); + + process.on("uncaughtException", function (err) { + console.log(err); + }); + + server.on("close", () => {}); + + // wait for the server to start listening + while (!startedListening) { + // give away control to the event loop to prevent blocking + await new Promise((resolve) => setTimeout(resolve, 1)); + } + } else { + // UDP + const udpType = useIPv6 ? "udp6" : "udp4"; + server = createServerFn(udpType, (msg, rinfo) => { + server.send(message, rinfo.port, rinfo.address, (err) => { + if (err) { + console.log(err); + } + }); + }); + server.bind(options); + } + + return server; +} diff --git a/tests/bug-detectors/ssrf/allow-ok-ports.config.js b/tests/bug-detectors/ssrf/allow-ok-ports.config.js new file mode 100644 index 000000000..4217898e4 --- /dev/null +++ b/tests/bug-detectors/ssrf/allow-ok-ports.config.js @@ -0,0 +1,33 @@ +/* + * Copyright 2026 Code Intelligence GmbH + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +const { + getBugDetectorConfiguration, +} = require("../../../packages/bug-detectors"); + +const { + host, + hostIPv6, + okPort, + okPortHttps, + okPortIPv6, +} = require("./connection-settings.js"); + +getBugDetectorConfiguration("ssrf") + ?.addPermittedTCPConnection(host, okPort) + ?.addPermittedTCPConnection(host, okPortHttps) + ?.addPermittedUDPConnection(host, okPort) + ?.addPermittedUDPConnection(hostIPv6, okPortIPv6); diff --git a/tests/bug-detectors/ssrf/cert.pem b/tests/bug-detectors/ssrf/cert.pem new file mode 100644 index 000000000..4f2f81eb5 --- /dev/null +++ b/tests/bug-detectors/ssrf/cert.pem @@ -0,0 +1,24 @@ +-----BEGIN CERTIFICATE----- +MIIEGzCCAwOgAwIBAgIUbZz6FeUIaEKrRDlYAaiVain0i/kwDQYJKoZIhvcNAQEL +BQAwgZwxCzAJBgNVBAYTAkRFMQwwCgYDVQQIDANOUlcxDTALBgNVBAcMBEJvbm4x +GjAYBgNVBAoMEUNvZGUgSW50ZWxsaWdlbmNlMQwwCgYDVQQLDANkZXYxEjAQBgNV +BAMMCWxvY2FsaG9zdDEyMDAGCSqGSIb3DQEJARYjcGV0ZXIuc2FtYXJpbkBjb2Rl +LWludGVsbGlnZW5jZS5jb20wHhcNMjMwOTIxMTAxODAxWhcNMzMwOTE4MTAxODAx +WjCBnDELMAkGA1UEBhMCREUxDDAKBgNVBAgMA05SVzENMAsGA1UEBwwEQm9ubjEa +MBgGA1UECgwRQ29kZSBJbnRlbGxpZ2VuY2UxDDAKBgNVBAsMA2RldjESMBAGA1UE +AwwJbG9jYWxob3N0MTIwMAYJKoZIhvcNAQkBFiNwZXRlci5zYW1hcmluQGNvZGUt +aW50ZWxsaWdlbmNlLmNvbTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB +ALpnkI3RrdavEl7HS6Bt6c0GjbZxJHvNlYOk046xNBfDUZ1ndTOEZ7ymBJ0hOTj4 +Vlo7+KaX49ozZetKBf/qa39l++/GCeYsRgkvhoXv9i8CL6x8ZxCE6tATaSpKTadP +zz8DzLdi1vFfpFqChrgvj27RKG9bvBAaVAIy2CueHDU3TkuFD6gz1TKKvfN09ENk +2CfMWvmb1dEqurtmtfMHECOW24oIhD3LrZKWn2bw2dIj5HZ+GJV77IL2FYf7Gy/S +2oWwKw4cS5D9MvJclc9nYcM1oJk7EyB0V3LEOGz71T0G3cXXD9FeWJ3QP0EciHJB +AOIVw9VJbbTHv9kOnoreBJ8CAwEAAaNTMFEwHQYDVR0OBBYEFHacoIUOO+n6fhiG +V06pQR/QIfwhMB8GA1UdIwQYMBaAFHacoIUOO+n6fhiGV06pQR/QIfwhMA8GA1Ud +EwEB/wQFMAMBAf8wDQYJKoZIhvcNAQELBQADggEBAFeSN39NCD4yVx1ng7C6tIBl +0urMoVny0rQjBzlVcxI1nMvmDeW5GslJ4OY9Dhl+SP2kp5XoR7s4bwhikP0NjgPv +Z3HM5PPpcSsCt/8al9P1Rr0j8VFDby5IIKV1lR7Z7OfHe5MOFPF5JXmgypuU4TVx +OF4wlwx0N8TG/iXsmC8LkW5EkgT56GDkLkbe/gp2BvjK3MgXMKC18lk/z/GnQQHp +mXdwQCSx8+bJLWu2/X1lwP3XT8K73hYi58C1p0JRdS2Ryd7LDzxEIoAB1Ji1osBg +RvYeCYv1yWjSN+YJp5NGxGRM9FRPNsIe0xv0r1s0o4uLPXs6CLir4gi8nn2F6xE= +-----END CERTIFICATE----- diff --git a/tests/bug-detectors/ssrf/connection-settings.js b/tests/bug-detectors/ssrf/connection-settings.js new file mode 100644 index 000000000..983679b69 --- /dev/null +++ b/tests/bug-detectors/ssrf/connection-settings.js @@ -0,0 +1,41 @@ +/* + * Copyright 2026 Code Intelligence GmbH + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +const host = "localhost"; +const hostIPv6 = "::1"; + +const okPort = 8080; +const okPortHttps = 8181; +const notOkPort = 9090; +const notOkPortHttps = 9191; + +const okPortIPv6 = 6060; + +const okMessage = "Connection allowed."; +const notOkMessage = "SSRF sanitizer does not work!"; +const ssrfFindingMessage = "Server Side Request Forgery (SSRF)"; + +module.exports = { + host, + hostIPv6, + okPort, + okPortHttps, + notOkPort, + notOkPortHttps, + okPortIPv6, + okMessage, + notOkMessage, + ssrfFindingMessage, +}; diff --git a/tests/bug-detectors/ssrf/fuzz-http.js b/tests/bug-detectors/ssrf/fuzz-http.js new file mode 100644 index 000000000..e6b09817e --- /dev/null +++ b/tests/bug-detectors/ssrf/fuzz-http.js @@ -0,0 +1,356 @@ +/* + * Copyright 2026 Code Intelligence GmbH + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +const dgram = require("dgram"); +const fs = require("fs"); +const http = require("http"); +const http2 = require("http2"); +const https = require("https"); +const net = require("net"); +const tls = require("tls"); + +const { + host, + hostIPv6, + okPort, + okPortHttps, + okPortIPv6, + notOkPort, + notOkPortHttps, + okMessage, + notOkMessage, +} = require("./connection-settings.js"); + +const url = "http://" + host; +const allowedUrlWithPort = url + ":" + okPort.toString(); +const allowedHttpsUrlWithPort = + "https://" + host + ":" + okPortHttps.toString(); + +const notAllowedUrlWithPort = url + ":" + notOkPort.toString(); + +module.exports.HttpGetOptionsCallback = async function (data) { + const options = { + host: host, + port: notOkPort, + path: "/HttpGetOptionsCallback", + method: "POST", + headers: { + "Content-Type": "application/json", + }, + }; + + let done = false; + http + .get(options, function (res) { + console.log(notOkMessage); + done = true; + }) + .end(); +}; + +module.exports.HttpGetUrlCallback = async function (data) { + http + .get(notAllowedUrlWithPort + "/HttpGetUrlCallback", function (res) { + console.log(notOkMessage); + }) + .end(); +}; + +module.exports.HttpGetUrlNoPort = function (data) { + http + .get(url + "/HttpGetUrlNoPort", function (res) { + console.log(notOkMessage); + }) + .end(); +}; + +module.exports.HttpGetUrlNoAnything = function (data) { + http + .get({}, function (res) { + console.log(notOkMessage); + }) + .end(); +}; + +module.exports.HttpRequestOptionsCallback = function (data) { + const options = { + host: host, + port: notOkPort, + path: "/HttpRequestOptionsCallback", + method: "POST", + headers: { + "Content-Type": "application/json", + }, + }; + + http + .request(options, function (res) { + console.log(notOkMessage); + }) + .end(); +}; + +module.exports.HttpRequestUrlCallback = function (data) { + http + .request(notAllowedUrlWithPort + "/HttpRequestUrlCallback", function (res) { + console.log(notOkMessage); + }) + .end(); +}; + +module.exports.HttpRequestUrlNoPort = function (data) { + http + .request(url + "/HttpRequestUrlNoPort", function (res) { + console.log(notOkMessage); + }) + .end(); +}; + +module.exports.netConnectPortHost = async function (data) { + net.connect(notOkPort, host, function () { + console.log(notOkMessage); + }); +}; + +module.exports.netConnectOptions = async function (data) { + const options = { + host: host, + port: notOkPort, + }; + net.connect(options, function () { + console.log(notOkMessage); + }); +}; + +module.exports.socketConnect = async function (data) { + const socket = new net.Socket(); + socket.connect(notOkPort, host, function () { + console.log(notOkMessage); + }); +}; + +module.exports.socketConnectWithOptions = async function (data) { + const options = { + host: host, + port: notOkPort, + }; + const socket = new net.Socket(); + socket.connect(options, function () { + console.log(notOkMessage); + }); +}; + +module.exports.TlsConnect = async function (data) { + const options = { + ca: [fs.readFileSync("cert.pem")], + host: host, + port: notOkPortHttps, + }; + try { + tls + .connect(options, function (res) { + console.log(notOkMessage); + }) + .end(); + } catch (e) { + console.log(e); + } +}; + +module.exports.HttpsGetOptions = async function (data) { + let output = ""; + let done = false; + const options = { + ca: [fs.readFileSync("cert.pem")], + host: host, + port: notOkPortHttps, + path: "/" + "HttpsGetOptions", + }; + https + .get(options, function (res) { + res.on("data", function (d) { + output += d; + }); + res.on("end", function () { + console.log(output); + done = true; + }); + }) + .end(); +}; + +module.exports.Http2Connect = async function (data) { + const options = {}; + let output = ""; + let done = false; + http2.connect(notAllowedUrlWithPort, options, function (res) { + res.on("data", function (d) { + output += d; + }); + res.on("end", function () { + console.log(output); + done = true; + }); + }); +}; + +module.exports.udpConnect = async function (data) { + const client = dgram.createSocket("udp4"); + client.connect(notOkPort, host, function (err) { + client.send("hello!", (err) => { + // receive a message from the server + client.on("message", function (msg, info) { + console.log("Data received from server : " + msg.toString()); + console.log( + "Received %d bytes from %s:%d\n", + msg.length, + info.address, + info.port, + ); + client.close(); + }); + }); + }); +}; + +module.exports.HttpRequestAllowed = async function (data) { + // Options to be used by request + const options = { + host: "", + port: okPort, + path: "/HttpRequestAllowed", + }; + let output = ""; + let done = false; + http + .request(options, function (res) { + res.on("data", function (d) { + output += d; + }); + res.on("end", function () { + console.log(output); + done = true; + }); + }) + .end(); +}; + +module.exports.HttpGetAllowed = async function (data) { + let output = ""; + let done = false; + http + .get(allowedUrlWithPort + "/HttpGetAllowed", function (res) { + res.on("data", function (d) { + output += d; + }); + res.on("end", function () { + console.log(output); + done = true; + }); + }) + .end(); +}; + +module.exports.HttpsGetAllowed = async function (data) { + let output = ""; + let done = false; + const options = { + ca: [fs.readFileSync("cert.pem")], + host: host, + port: okPortHttps, + path: "/HttpsGetAllowed", + }; + https + .get(options, function (res) { + res.on("data", function (d) { + output += d; + }); + res.on("end", function () { + console.log(output); + done = true; + }); + }) + .end(); +}; + +module.exports.Http2ConnectAllowed = async function (data) { + // Not sure why this particular protocol wants http:// instead of https:// + http2.connect(url + ":" + okPortHttps, {}, function (res) { + console.log(okMessage); + }); +}; + +module.exports.netConnectAllowed = async function (data) { + net + .connect(okPort, host, function (res) { + console.log(okMessage); + }) + .end(); +}; + +module.exports.udpConnectAllowed = async function (data) { + const client = dgram.createSocket("udp4"); + client.connect(okPort, host, function (err) { + client.send("hello!", (err) => { + // receive a message from the server + client.on("message", function (msg, info) { + console.log("Data received from server : " + msg.toString()); + console.log( + "Received %d bytes from %s:%d\n", + msg.length, + info.address, + info.port, + ); + client.close(); + }); + }); + }); +}; + +module.exports.udpSendConnectionlessAllowed = async function (data) { + const client = dgram.createSocket("udp4"); + client.send("hello!", okPort, host, (err) => { + // receive a message from the server + client.on("message", function (msg, info) { + console.log("Data received from server : " + msg.toString()); + console.log( + "Received %d bytes from %s:%d\n", + msg.length, + info.address, + info.port, + ); + client.close(); + }); + }); +}; + +module.exports.udpIPv6ConnectAllowed = async function (data) { + const client = dgram.createSocket("udp6"); + client.connect(6060, hostIPv6, function (err) { + client.send("hello!", (err) => { + // receive a message from the server + client.on("message", function (msg, info) { + console.log("Data received from server : " + msg.toString()); + console.log( + "Received %d bytes from %s:%d\n", + msg.length, + info.address, + info.port, + ); + client.close(); + }); + }); + }); +}; diff --git a/tests/bug-detectors/ssrf/key.pem b/tests/bug-detectors/ssrf/key.pem new file mode 100644 index 000000000..a6b27d350 --- /dev/null +++ b/tests/bug-detectors/ssrf/key.pem @@ -0,0 +1,28 @@ +-----BEGIN PRIVATE KEY----- +MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQC6Z5CN0a3WrxJe +x0ugbenNBo22cSR7zZWDpNOOsTQXw1GdZ3UzhGe8pgSdITk4+FZaO/iml+PaM2Xr +SgX/6mt/ZfvvxgnmLEYJL4aF7/YvAi+sfGcQhOrQE2kqSk2nT88/A8y3YtbxX6Ra +goa4L49u0ShvW7wQGlQCMtgrnhw1N05LhQ+oM9Uyir3zdPRDZNgnzFr5m9XRKrq7 +ZrXzBxAjltuKCIQ9y62Slp9m8NnSI+R2fhiVe+yC9hWH+xsv0tqFsCsOHEuQ/TLy +XJXPZ2HDNaCZOxMgdFdyxDhs+9U9Bt3F1w/RXlid0D9BHIhyQQDiFcPVSW20x7/Z +Dp6K3gSfAgMBAAECggEAXSfEphtTtSZpF9ShhttnLH9J8xM4GGb1gYSt9XG5hual +svQxLj3NWgnd5GjmIAJ7pTyzVw4xYKqvFJc5yFtuvYxKC9n8uHsHxS9rGySA8500 +Fg9Vsnu6naIVvHzFsgfAms1bUYqjwJz7lgAFM6cRF2CPxJcjtShzM2YVgjbSAgV3 +HGjrFDLsv5U9DtKI3uEzV1ArTzhVjirSDh0IcBVZCwFewrOfaMP3Vf8T2LcdIpGK +gnpzPi75AXraZSBR3HheEKg/4vs7I73uiC3lQKzIITEdQxwARCgOLD8gW0aFFikt +TnycO8qudWNx8YmdfRsAHsKhiee+iwT+LihYn8p6gQKBgQDkaQDt7pu4nTAdoJZX +dM2lEcf1s2Q4O5N4WdU0CjIhD61Q36KRA86Zbpc741m7zSu/VmUn+8Y+FZPL3/S2 +KbbJ5QmXbNGCqN0yge/EVPY1vw3lfNYoI3QkSS9izUhc/bS6BIzDZrkFUw5pDH03 +eJrMKKZwLIR+yzwSkMWew57NPQKBgQDQ66U24gEn0b4zfSS2Lu8Zoc7ZVfJLXk+Y ++oZzbMnbcMBR+ytHq8SM3yn1JjWGHp3/s2FuOCUN+GvzHT+eM61NtjylTQoEkaMM +Ra6e1virWB+9NDVeSxlRpMmjBJJTYVndyTd0nt4F4PDNaY7Q3DGLsMi+PQTmAufG +ZR+NCKEvCwKBgESUFlhZ5N1YLKMonRsjEb93CD+IHhYYJR3kcvQN/6EXkOUQUEIU +D4rXvoaXq1CMuI7ZRMPtf0cSuW5kDphHC/+wSeHyJTGCu+83PiMHk2jttSFrCu3A +P1XJt3WFxy1Ma1/Sj+T3SaQEnPYDbvEhv/B+YAKcCyf6o027s+oIN/zNAoGAejO7 +2dRslJwMwxVKKf5eAQIyedHZ/dfWe0be6hkSIXdcJxfhgvSn7TaD1k9ZM3ApPu3v +6YaRthA/JF9RXPohPrl/07iySWXel0kTEPnxTlgniIZHSTZoQuc+wknkRT1GUYJn +G6HpgErIz34U+XoyyODJKu2KNfgxFk0EHXyUu20CgYArWPDCxhMcgXdcgocFeC88 +UcDEsxKlAhYazP4BIN29FfGFKeR+DPKUsfoxSM4dvSd86NJFeSoLoLoIk+Tpe3TD +hPFl33RSs2W1Z8kGsT7vsr02s/TdOO4SctU5SpRW8jBvbCGpn+1m1jSWQSr2nhOV +LfgfOMEdHdpisk7wuLt2JA== +-----END PRIVATE KEY----- diff --git a/tests/bug-detectors/ssrf/package.json b/tests/bug-detectors/ssrf/package.json new file mode 100644 index 000000000..590d48f14 --- /dev/null +++ b/tests/bug-detectors/ssrf/package.json @@ -0,0 +1,27 @@ +{ + "name": "jazzerjs-ssrf-tests", + "version": "1.0.0", + "description": "Tests for the SSRF bug detector", + "scripts": { + "test": "jest", + "fuzz": "JAZZER_FUZZ=1 jest" + }, + "devDependencies": { + "@jazzer.js/jest-runner": "file:../../packages/jest-runner", + "eslint-plugin-jest": "^27.1.3" + }, + "jest": { + "projects": [ + { + "testRunner": "@jazzer.js/jest-runner", + "displayName": { + "name": "Jazzer.js", + "color": "cyan" + }, + "testMatch": [ + "/**/*.fuzz.js" + ] + } + ] + } +} diff --git a/tests/bug-detectors/ssrf/tests.fuzz.js b/tests/bug-detectors/ssrf/tests.fuzz.js new file mode 100644 index 000000000..6060f5fa0 --- /dev/null +++ b/tests/bug-detectors/ssrf/tests.fuzz.js @@ -0,0 +1,32 @@ +/* + * Copyright 2026 Code Intelligence GmbH + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +const targets = require("./fuzz-http"); + +it.fuzz("http.request", async (data) => { + return targets.HttpRequestAllowed(data); +}); + +it.fuzz("udp.connect IPv6", async (data) => { + return targets.udpIPv6ConnectAllowed(data); +}); + +it.fuzz("net.connect(options, callback)", async (data) => { + return targets.netConnectOptions(data); +}); + +it.fuzz("udp.connect(port, host, callback)", async (data) => { + return targets.udpConnect(data); +}); diff --git a/tests/code_coverage/coverage.test.js b/tests/code_coverage/coverage.test.js index 2487f7bac..0d18f1dba 100644 --- a/tests/code_coverage/coverage.test.js +++ b/tests/code_coverage/coverage.test.js @@ -1,5 +1,5 @@ /* - * Copyright 2023 Code Intelligence GmbH + * Copyright 2026 Code Intelligence GmbH * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -194,6 +194,7 @@ function executeJestRunner( if (useCustomHooks) { config.customHooks = useCustomHooks; } + config.disableBugDetectors = [".*"]; // write the config file, overwriting any existing one fs.writeFileSync( path.join(testDirectory, ".jazzerjsrc.json"), @@ -248,6 +249,8 @@ function executeFuzzTest( options.push("--cov_dir"); options.push(coverageOutputDir); } + + options.push("--disableBugDetectors='.*'"); options.push("--"); options.push("-runs=0"); const process = spawnSync("npx", options, { diff --git a/tests/code_coverage/sample_fuzz_test/codeCoverage.fuzz.js b/tests/code_coverage/sample_fuzz_test/codeCoverage.fuzz.js index 191d5439c..23ceaf350 100644 --- a/tests/code_coverage/sample_fuzz_test/codeCoverage.fuzz.js +++ b/tests/code_coverage/sample_fuzz_test/codeCoverage.fuzz.js @@ -1,18 +1,4 @@ -/* - * Copyright 2023 Code Intelligence GmbH - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ +/* eslint-disable header/header */ const target = require("./fuzz.js"); diff --git a/tests/code_coverage/sample_fuzz_test/custom-hooks.js b/tests/code_coverage/sample_fuzz_test/custom-hooks.js index 5b88def16..e6b86518a 100644 --- a/tests/code_coverage/sample_fuzz_test/custom-hooks.js +++ b/tests/code_coverage/sample_fuzz_test/custom-hooks.js @@ -1,18 +1,4 @@ -/* - * Copyright 2023 Code Intelligence GmbH - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ +/* eslint-disable header/header */ const { registerReplaceHook } = require("@jazzer.js/hooking"); diff --git a/tests/code_coverage/sample_fuzz_test/expected_coverage/fuzz+lib+codeCoverage-fuzz.json b/tests/code_coverage/sample_fuzz_test/expected_coverage/fuzz+lib+codeCoverage-fuzz.json index 1d66342b0..a83bb493f 100644 --- a/tests/code_coverage/sample_fuzz_test/expected_coverage/fuzz+lib+codeCoverage-fuzz.json +++ b/tests/code_coverage/sample_fuzz_test/expected_coverage/fuzz+lib+codeCoverage-fuzz.json @@ -1,47 +1,48 @@ { "codeCoverage.fuzz.js": { + "path": "/home/peter/Documents/Programming/jazzer.js/tests/code_coverage/sample_fuzz_test/codeCoverage.fuzz.js", "statementMap": { "0": { - "start": { "line": 17, "column": 15 }, - "end": { "line": 17, "column": 35 } + "start": { "line": 3, "column": 15 }, + "end": { "line": 3, "column": 35 } }, "1": { - "start": { "line": 19, "column": 0 }, - "end": { "line": 23, "column": 3 } + "start": { "line": 5, "column": 0 }, + "end": { "line": 9, "column": 3 } }, "2": { - "start": { "line": 20, "column": 1 }, - "end": { "line": 22, "column": 4 } + "start": { "line": 6, "column": 1 }, + "end": { "line": 8, "column": 4 } }, "3": { - "start": { "line": 21, "column": 2 }, - "end": { "line": 21, "column": 20 } + "start": { "line": 7, "column": 2 }, + "end": { "line": 7, "column": 20 } } }, "fnMap": { "0": { "name": "(anonymous_0)", "decl": { - "start": { "line": 19, "column": 24 }, - "end": { "line": 19, "column": 25 } + "start": { "line": 5, "column": 24 }, + "end": { "line": 5, "column": 25 } }, "loc": { - "start": { "line": 19, "column": 30 }, - "end": { "line": 23, "column": 1 } + "start": { "line": 5, "column": 30 }, + "end": { "line": 9, "column": 1 } }, - "line": 19 + "line": 5 }, "1": { "name": "(anonymous_1)", "decl": { - "start": { "line": 20, "column": 25 }, - "end": { "line": 20, "column": 26 } + "start": { "line": 6, "column": 25 }, + "end": { "line": 6, "column": 26 } }, "loc": { - "start": { "line": 20, "column": 35 }, - "end": { "line": 22, "column": 2 } + "start": { "line": 6, "column": 35 }, + "end": { "line": 8, "column": 2 } }, - "line": 20 + "line": 6 } }, "branchMap": {}, @@ -49,136 +50,140 @@ "f": { "0": 1, "1": 3 }, "b": {}, "_coverageSchema": "1a1c01bbd47fc00a2c39e90264f33305004495a9", - "hash": "25c01ffa3552de53ae353b8e557c73461d766e51" + "hash": "cb38b1e488af765571e6967998c49d18aff66c76" }, "fuzz.js": { + "path": "/home/peter/Documents/Programming/jazzer.js/tests/code_coverage/sample_fuzz_test/fuzz.js", "statementMap": { "0": { - "start": { "line": 17, "column": 12 }, - "end": { "line": 17, "column": 28 } + "start": { "line": 3, "column": 12 }, + "end": { "line": 3, "column": 28 } }, "1": { - "start": { "line": 22, "column": 0 }, - "end": { "line": 28, "column": 2 } + "start": { "line": 8, "column": 0 }, + "end": { "line": 14, "column": 2 } }, "2": { - "start": { "line": 23, "column": 1 }, - "end": { "line": 23, "column": 41 } + "start": { "line": 9, "column": 1 }, + "end": { "line": 9, "column": 41 } }, "3": { - "start": { "line": 24, "column": 1 }, - "end": { "line": 26, "column": 2 } + "start": { "line": 10, "column": 1 }, + "end": { "line": 12, "column": 2 } }, "4": { - "start": { "line": 25, "column": 2 }, - "end": { "line": 25, "column": 9 } + "start": { "line": 11, "column": 2 }, + "end": { "line": 11, "column": 9 } }, "5": { - "start": { "line": 27, "column": 1 }, - "end": { "line": 27, "column": 18 } + "start": { "line": 13, "column": 1 }, + "end": { "line": 13, "column": 18 } } }, "fnMap": { "0": { "name": "(anonymous_0)", "decl": { - "start": { "line": 22, "column": 22 }, - "end": { "line": 22, "column": 23 } + "start": { "line": 8, "column": 22 }, + "end": { "line": 8, "column": 23 } }, "loc": { - "start": { "line": 22, "column": 38 }, - "end": { "line": 28, "column": 1 } + "start": { "line": 8, "column": 38 }, + "end": { "line": 14, "column": 1 } }, - "line": 22 + "line": 8 } }, "branchMap": { "0": { "loc": { - "start": { "line": 24, "column": 1 }, - "end": { "line": 26, "column": 2 } + "start": { "line": 10, "column": 1 }, + "end": { "line": 12, "column": 2 } }, "type": "if", "locations": [ { - "start": { "line": 24, "column": 1 }, - "end": { "line": 26, "column": 2 } + "start": { "line": 10, "column": 1 }, + "end": { "line": 12, "column": 2 } }, { - "start": { "line": 24, "column": 1 }, - "end": { "line": 26, "column": 2 } + "start": { "line": 10, "column": 1 }, + "end": { "line": 12, "column": 2 } } ], - "line": 24 + "line": 10 } }, "s": { "0": 1, "1": 1, "2": 3, "3": 3, "4": 2, "5": 1 }, "f": { "0": 3 }, "b": { "0": [2, 1] }, + "inputSourceMap": null, "_coverageSchema": "1a1c01bbd47fc00a2c39e90264f33305004495a9", - "hash": "d5b411e8de7efcd2798a7cd78efd7bd8347f647a" + "hash": "919965dfc96b474e5bb4bd686708056c565cd2df" }, "lib.js": { + "path": "/home/peter/Documents/Programming/jazzer.js/tests/code_coverage/sample_fuzz_test/lib.js", "statementMap": { "0": { - "start": { "line": 18, "column": 1 }, - "end": { "line": 18, "column": 29 } + "start": { "line": 4, "column": 1 }, + "end": { "line": 4, "column": 29 } }, "1": { - "start": { "line": 19, "column": 1 }, - "end": { "line": 21, "column": 2 } + "start": { "line": 5, "column": 1 }, + "end": { "line": 7, "column": 2 } }, "2": { - "start": { "line": 20, "column": 2 }, - "end": { "line": 20, "column": 11 } + "start": { "line": 6, "column": 2 }, + "end": { "line": 6, "column": 11 } }, "3": { - "start": { "line": 22, "column": 1 }, - "end": { "line": 22, "column": 11 } + "start": { "line": 8, "column": 1 }, + "end": { "line": 8, "column": 11 } }, "4": { - "start": { "line": 25, "column": 0 }, - "end": { "line": 27, "column": 2 } + "start": { "line": 11, "column": 0 }, + "end": { "line": 13, "column": 2 } } }, "fnMap": { "0": { "name": "foo", "decl": { - "start": { "line": 17, "column": 9 }, - "end": { "line": 17, "column": 12 } + "start": { "line": 3, "column": 9 }, + "end": { "line": 3, "column": 12 } }, "loc": { - "start": { "line": 17, "column": 16 }, - "end": { "line": 23, "column": 1 } + "start": { "line": 3, "column": 16 }, + "end": { "line": 9, "column": 1 } }, - "line": 17 + "line": 3 } }, "branchMap": { "0": { "loc": { - "start": { "line": 19, "column": 1 }, - "end": { "line": 21, "column": 2 } + "start": { "line": 5, "column": 1 }, + "end": { "line": 7, "column": 2 } }, "type": "if", "locations": [ { - "start": { "line": 19, "column": 1 }, - "end": { "line": 21, "column": 2 } + "start": { "line": 5, "column": 1 }, + "end": { "line": 7, "column": 2 } }, { - "start": { "line": 19, "column": 1 }, - "end": { "line": 21, "column": 2 } + "start": { "line": 5, "column": 1 }, + "end": { "line": 7, "column": 2 } } ], - "line": 19 + "line": 5 } }, "s": { "0": 1, "1": 1, "2": 1, "3": 0, "4": 1 }, "f": { "0": 1 }, "b": { "0": [1, 0] }, + "inputSourceMap": null, "_coverageSchema": "1a1c01bbd47fc00a2c39e90264f33305004495a9", - "hash": "9606a42b6e4a5e9a5c23554dda63403d86a4a9a2" + "hash": "fcd40034890333ddc0be68a932be368882a3d10b" } } diff --git a/tests/code_coverage/sample_fuzz_test/expected_coverage/fuzz+lib+customHooks.json b/tests/code_coverage/sample_fuzz_test/expected_coverage/fuzz+lib+customHooks.json index 92b89d35c..430e12f35 100644 --- a/tests/code_coverage/sample_fuzz_test/expected_coverage/fuzz+lib+customHooks.json +++ b/tests/code_coverage/sample_fuzz_test/expected_coverage/fuzz+lib+customHooks.json @@ -1,31 +1,32 @@ { "custom-hooks.js": { + "path": "/home/peter/Documents/Programming/jazzer.js/tests/code_coverage/sample_fuzz_test/custom-hooks.js", "statementMap": { "0": { - "start": { "line": 17, "column": 32 }, - "end": { "line": 17, "column": 61 } + "start": { "line": 3, "column": 32 }, + "end": { "line": 3, "column": 61 } }, "1": { - "start": { "line": 19, "column": 0 }, - "end": { "line": 21, "column": 3 } + "start": { "line": 5, "column": 0 }, + "end": { "line": 7, "column": 3 } }, "2": { - "start": { "line": 20, "column": 1 }, - "end": { "line": 20, "column": 37 } + "start": { "line": 6, "column": 1 }, + "end": { "line": 6, "column": 37 } } }, "fnMap": { "0": { "name": "(anonymous_0)", "decl": { - "start": { "line": 19, "column": 41 }, - "end": { "line": 19, "column": 42 } + "start": { "line": 5, "column": 41 }, + "end": { "line": 5, "column": 42 } }, "loc": { - "start": { "line": 19, "column": 47 }, - "end": { "line": 21, "column": 1 } + "start": { "line": 5, "column": 47 }, + "end": { "line": 7, "column": 1 } }, - "line": 19 + "line": 5 } }, "branchMap": {}, @@ -33,130 +34,132 @@ "f": { "0": 1 }, "b": {}, "_coverageSchema": "1a1c01bbd47fc00a2c39e90264f33305004495a9", - "hash": "7ee4d96bd07f3609d51855142c39faa2adf6ab0a" + "hash": "0050adbd727053788c80c09d103e1ce556304b88" }, "fuzz.js": { + "path": "/home/peter/Documents/Programming/jazzer.js/tests/code_coverage/sample_fuzz_test/fuzz.js", "statementMap": { "0": { - "start": { "line": 17, "column": 12 }, - "end": { "line": 17, "column": 28 } + "start": { "line": 3, "column": 12 }, + "end": { "line": 3, "column": 28 } }, "1": { - "start": { "line": 22, "column": 0 }, - "end": { "line": 28, "column": 2 } + "start": { "line": 8, "column": 0 }, + "end": { "line": 14, "column": 2 } }, "2": { - "start": { "line": 23, "column": 1 }, - "end": { "line": 23, "column": 41 } + "start": { "line": 9, "column": 1 }, + "end": { "line": 9, "column": 41 } }, "3": { - "start": { "line": 24, "column": 1 }, - "end": { "line": 26, "column": 2 } + "start": { "line": 10, "column": 1 }, + "end": { "line": 12, "column": 2 } }, "4": { - "start": { "line": 25, "column": 2 }, - "end": { "line": 25, "column": 9 } + "start": { "line": 11, "column": 2 }, + "end": { "line": 11, "column": 9 } }, "5": { - "start": { "line": 27, "column": 1 }, - "end": { "line": 27, "column": 18 } + "start": { "line": 13, "column": 1 }, + "end": { "line": 13, "column": 18 } } }, "fnMap": { "0": { "name": "(anonymous_0)", "decl": { - "start": { "line": 22, "column": 22 }, - "end": { "line": 22, "column": 23 } + "start": { "line": 8, "column": 22 }, + "end": { "line": 8, "column": 23 } }, "loc": { - "start": { "line": 22, "column": 38 }, - "end": { "line": 28, "column": 1 } + "start": { "line": 8, "column": 38 }, + "end": { "line": 14, "column": 1 } }, - "line": 22 + "line": 8 } }, "branchMap": { "0": { "loc": { - "start": { "line": 24, "column": 1 }, - "end": { "line": 26, "column": 2 } + "start": { "line": 10, "column": 1 }, + "end": { "line": 12, "column": 2 } }, "type": "if", "locations": [ { - "start": { "line": 24, "column": 1 }, - "end": { "line": 26, "column": 2 } + "start": { "line": 10, "column": 1 }, + "end": { "line": 12, "column": 2 } }, { "start": {}, "end": {} } ], - "line": 24 + "line": 10 } }, "s": { "0": 1, "1": 1, "2": 3, "3": 3, "4": 2, "5": 1 }, "f": { "0": 3 }, "b": { "0": [2, 1] }, "_coverageSchema": "1a1c01bbd47fc00a2c39e90264f33305004495a9", - "hash": "d5b411e8de7efcd2798a7cd78efd7bd8347f647a" + "hash": "5d5860b26158df2154cfe4eb4255dc6534ccfff1" }, "lib.js": { + "path": "/home/peter/Documents/Programming/jazzer.js/tests/code_coverage/sample_fuzz_test/lib.js", "statementMap": { "0": { - "start": { "line": 18, "column": 1 }, - "end": { "line": 18, "column": 29 } + "start": { "line": 4, "column": 1 }, + "end": { "line": 4, "column": 29 } }, "1": { - "start": { "line": 19, "column": 1 }, - "end": { "line": 21, "column": 2 } + "start": { "line": 5, "column": 1 }, + "end": { "line": 7, "column": 2 } }, "2": { - "start": { "line": 20, "column": 2 }, - "end": { "line": 20, "column": 11 } + "start": { "line": 6, "column": 2 }, + "end": { "line": 6, "column": 11 } }, "3": { - "start": { "line": 22, "column": 1 }, - "end": { "line": 22, "column": 11 } + "start": { "line": 8, "column": 1 }, + "end": { "line": 8, "column": 11 } }, "4": { - "start": { "line": 25, "column": 0 }, - "end": { "line": 27, "column": 2 } + "start": { "line": 11, "column": 0 }, + "end": { "line": 13, "column": 2 } } }, "fnMap": { "0": { "name": "foo", "decl": { - "start": { "line": 17, "column": 9 }, - "end": { "line": 17, "column": 12 } + "start": { "line": 3, "column": 9 }, + "end": { "line": 3, "column": 12 } }, "loc": { - "start": { "line": 17, "column": 16 }, - "end": { "line": 23, "column": 1 } + "start": { "line": 3, "column": 16 }, + "end": { "line": 9, "column": 1 } }, - "line": 17 + "line": 3 } }, "branchMap": { "0": { "loc": { - "start": { "line": 19, "column": 1 }, - "end": { "line": 21, "column": 2 } + "start": { "line": 5, "column": 1 }, + "end": { "line": 7, "column": 2 } }, "type": "if", "locations": [ { - "start": { "line": 19, "column": 1 }, - "end": { "line": 21, "column": 2 } + "start": { "line": 5, "column": 1 }, + "end": { "line": 7, "column": 2 } }, { "start": {}, "end": {} } ], - "line": 19 + "line": 5 } }, "s": { "0": 0, "1": 0, "2": 0, "3": 0, "4": 1 }, "f": { "0": 0 }, "b": { "0": [0, 0] }, "_coverageSchema": "1a1c01bbd47fc00a2c39e90264f33305004495a9", - "hash": "9606a42b6e4a5e9a5c23554dda63403d86a4a9a2" + "hash": "2c8e6fbf7fbf1d3facf8b6f7aeed0de7b31a4877" } } diff --git a/tests/code_coverage/sample_fuzz_test/expected_coverage/fuzz+lib+otherCodeCoverage-fuzz.json b/tests/code_coverage/sample_fuzz_test/expected_coverage/fuzz+lib+otherCodeCoverage-fuzz.json index b4283dd16..b22b28390 100644 --- a/tests/code_coverage/sample_fuzz_test/expected_coverage/fuzz+lib+otherCodeCoverage-fuzz.json +++ b/tests/code_coverage/sample_fuzz_test/expected_coverage/fuzz+lib+otherCodeCoverage-fuzz.json @@ -1,193 +1,1501 @@ { - "otherCodeCoverage.fuzz.ts": { + "fuzz.ts": { + "path": "/home/peter/Documents/Programming/jazzer.js/packages/jest-runner/fuzz.ts", "statementMap": { "0": { - "start": { "line": 17, "column": 0 }, - "end": { "line": 17, "column": 32 } + "start": { "line": 9, "column": 0 }, + "end": { "line": 9, "column": null } }, "1": { - "start": { "line": 18, "column": 0 }, - "end": { "line": 18, "column": 33 } + "start": { "line": 13, "column": 0 }, + "end": { "line": 13, "column": null } }, "2": { - "start": { "line": 20, "column": 0 }, - "end": { "line": 24, "column": 3 } + "start": { "line": 27, "column": 0 }, + "end": { "line": 27, "column": null } }, "3": { - "start": { "line": 21, "column": 1 }, - "end": { "line": 23, "column": 4 } + "start": { "line": 28, "column": 0 }, + "end": { "line": 28, "column": null } }, "4": { - "start": { "line": 22, "column": 2 }, - "end": { "line": 22, "column": 13 } + "start": { "line": 31, "column": 0 }, + "end": { "line": 31, "column": 13 } + }, + "5": { + "start": { "line": 40, "column": 2 }, + "end": { "line": 44, "column": 2 } + }, + "6": { + "start": { "line": 40, "column": 30 }, + "end": { "line": 44, "column": 2 } + }, + "7": { + "start": { "line": 41, "column": 2 }, + "end": { "line": 43, "column": null } + }, + "8": { + "start": { "line": 42, "column": 3 }, + "end": { "line": 42, "column": null } + }, + "9": { + "start": { "line": 39, "column": 13 }, + "end": { "line": 39, "column": null } + }, + "10": { + "start": { "line": 49, "column": 27 }, + "end": { "line": 49, "column": 50 } + }, + "11": { + "start": { "line": 50, "column": 1 }, + "end": { "line": 65, "column": null } + }, + "12": { + "start": { "line": 51, "column": 2 }, + "end": { "line": 64, "column": null } + }, + "13": { + "start": { "line": 55, "column": 3 }, + "end": { "line": 63, "column": null } + }, + "14": { + "start": { "line": 56, "column": 31 }, + "end": { "line": 56, "column": 56 } + }, + "15": { + "start": { "line": 57, "column": 4 }, + "end": { "line": 57, "column": null } + }, + "16": { + "start": { "line": 58, "column": 10 }, + "end": { "line": 63, "column": null } + }, + "17": { + "start": { "line": 59, "column": 31 }, + "end": { "line": 59, "column": 56 } + }, + "18": { + "start": { "line": 60, "column": 4 }, + "end": { "line": 60, "column": null } + }, + "19": { + "start": { "line": 62, "column": 4 }, + "end": { "line": 62, "column": null } + }, + "20": { + "start": { "line": 77, "column": 1 }, + "end": { "line": 144, "column": null } + }, + "21": { + "start": { "line": 80, "column": 22 }, + "end": { "line": 80, "column": 43 } + }, + "22": { + "start": { "line": 82, "column": 2 }, + "end": { "line": 87, "column": null } + }, + "23": { + "start": { "line": 83, "column": 3 }, + "end": { "line": 86, "column": null } + }, + "24": { + "start": { "line": 89, "column": 40 }, + "end": { "line": 89, "column": 42 } + }, + "25": { + "start": { "line": 91, "column": 2 }, + "end": { "line": 99, "column": null } + }, + "26": { + "start": { "line": 92, "column": 3 }, + "end": { "line": 92, "column": null } + }, + "27": { + "start": { "line": 93, "column": 9 }, + "end": { "line": 99, "column": null } + }, + "28": { + "start": { "line": 94, "column": 3 }, + "end": { "line": 94, "column": null } + }, + "29": { + "start": { "line": 95, "column": 9 }, + "end": { "line": 99, "column": null } + }, + "30": { + "start": { "line": 96, "column": 3 }, + "end": { "line": 98, "column": null } + }, + "31": { + "start": { "line": 101, "column": 2 }, + "end": { "line": 101, "column": null } + }, + "32": { + "start": { "line": 103, "column": 16 }, + "end": { "line": 103, "column": 34 } + }, + "33": { + "start": { "line": 104, "column": 2 }, + "end": { "line": 106, "column": null } + }, + "34": { + "start": { "line": 105, "column": 3 }, + "end": { "line": 105, "column": null } + }, + "35": { + "start": { "line": 110, "column": 24 }, + "end": { "line": 110, "column": 69 } + }, + "36": { + "start": { "line": 111, "column": 26 }, + "end": { "line": 111, "column": 51 } + }, + "37": { + "start": { "line": 113, "column": 2 }, + "end": { "line": 113, "column": null } + }, + "38": { + "start": { "line": 116, "column": 3 }, + "end": { "line": 118, "column": 49 } + }, + "39": { + "start": { "line": 119, "column": 2 }, + "end": { "line": 124, "column": null } + }, + "40": { + "start": { "line": 120, "column": 3 }, + "end": { "line": 122, "column": null } + }, + "41": { + "start": { "line": 123, "column": 3 }, + "end": { "line": 123, "column": null } + }, + "42": { + "start": { "line": 126, "column": 17 }, + "end": { "line": 129, "column": null } + }, + "43": { + "start": { "line": 132, "column": 20 }, + "end": { "line": 134, "column": null } + }, + "44": { + "start": { "line": 137, "column": 2 }, + "end": { "line": 143, "column": null } + }, + "45": { + "start": { "line": 138, "column": 3 }, + "end": { "line": 138, "column": null } + }, + "46": { + "start": { "line": 139, "column": 9 }, + "end": { "line": 143, "column": null } + }, + "47": { + "start": { "line": 140, "column": 3 }, + "end": { "line": 140, "column": null } + }, + "48": { + "start": { "line": 142, "column": 3 }, + "end": { "line": 142, "column": null } + }, + "49": { + "start": { "line": 68, "column": 0 }, + "end": { "line": 68, "column": 16 } + }, + "50": { + "start": { "line": 147, "column": 32 }, + "end": { "line": 166, "column": 1 } + }, + "51": { + "start": { "line": 155, "column": 1 }, + "end": { "line": 165, "column": null } + }, + "52": { + "start": { "line": 156, "column": 21 }, + "end": { "line": 156, "column": 36 } + }, + "53": { + "start": { "line": 157, "column": 24 }, + "end": { "line": 157, "column": 55 } + }, + "54": { + "start": { "line": 158, "column": 2 }, + "end": { "line": 158, "column": null } + }, + "55": { + "start": { "line": 159, "column": 2 }, + "end": { "line": 159, "column": null } + }, + "56": { + "start": { "line": 160, "column": 2 }, + "end": { "line": 160, "column": null } + }, + "57": { + "start": { "line": 161, "column": 2 }, + "end": { "line": 164, "column": null } + }, + "58": { + "start": { "line": 163, "column": 3 }, + "end": { "line": 163, "column": null } + }, + "59": { + "start": { "line": 163, "column": 14 }, + "end": { "line": 163, "column": null } + }, + "60": { + "start": { "line": 147, "column": 13 }, + "end": { "line": 147, "column": 32 } + }, + "61": { + "start": { "line": 168, "column": 35 }, + "end": { "line": 209, "column": 1 } + }, + "62": { + "start": { "line": 176, "column": 1 }, + "end": { "line": 176, "column": null } + }, + "63": { + "start": { "line": 178, "column": 1 }, + "end": { "line": 208, "column": null } + }, + "64": { + "start": { "line": 180, "column": 3 }, + "end": { "line": 190, "column": null } + }, + "65": { + "start": { "line": 182, "column": 4 }, + "end": { "line": 189, "column": null } + }, + "66": { + "start": { "line": 183, "column": 5 }, + "end": { "line": 183, "column": null } + }, + "67": { + "start": { "line": 186, "column": 5 }, + "end": { "line": 188, "column": null } + }, + "68": { + "start": { "line": 187, "column": 19 }, + "end": { "line": 187, "column": 57 } + }, + "69": { + "start": { "line": 194, "column": 2 }, + "end": { "line": 198, "column": null } + }, + "70": { + "start": { "line": 196, "column": 15 }, + "end": { "line": 196, "column": 45 } + }, + "71": { + "start": { "line": 201, "column": 2 }, + "end": { "line": 207, "column": null } + }, + "72": { + "start": { "line": 202, "column": 3 }, + "end": { "line": 206, "column": null } + }, + "73": { + "start": { "line": 204, "column": 16 }, + "end": { "line": 204, "column": 63 } + }, + "74": { + "start": { "line": 168, "column": 13 }, + "end": { "line": 168, "column": 35 } + }, + "75": { + "start": { "line": 211, "column": 28 }, + "end": { "line": 253, "column": 1 } + }, + "76": { + "start": { "line": 217, "column": 1 }, + "end": { "line": 252, "column": null } + }, + "77": { + "start": { "line": 218, "column": 19 }, + "end": { "line": 218, "column": 24 } + }, + "78": { + "start": { "line": 219, "column": 24 }, + "end": { "line": 236, "column": 3 } + }, + "79": { + "start": { "line": 220, "column": 3 }, + "end": { "line": 227, "column": null } + }, + "80": { + "start": { "line": 224, "column": 4 }, + "end": { "line": 226, "column": null } + }, + "81": { + "start": { "line": 228, "column": 3 }, + "end": { "line": 228, "column": null } + }, + "82": { + "start": { "line": 230, "column": 3 }, + "end": { "line": 234, "column": null } + }, + "83": { + "start": { "line": 231, "column": 4 }, + "end": { "line": 231, "column": null } + }, + "84": { + "start": { "line": 233, "column": 4 }, + "end": { "line": 233, "column": null } + }, + "85": { + "start": { "line": 235, "column": 3 }, + "end": { "line": 235, "column": null } + }, + "86": { + "start": { "line": 237, "column": 17 }, + "end": { "line": 237, "column": 42 } + }, + "87": { + "start": { "line": 243, "column": 2 }, + "end": { "line": 249, "column": null } + }, + "88": { + "start": { "line": 244, "column": 3 }, + "end": { "line": 248, "column": null } + }, + "89": { + "start": { "line": 251, "column": 2 }, + "end": { "line": 251, "column": null } + }, + "90": { + "start": { "line": 259, "column": 1 }, + "end": { "line": 264, "column": null } + }, + "91": { + "start": { "line": 261, "column": 3 }, + "end": { "line": 261, "column": null } + }, + "92": { + "start": { "line": 263, "column": 3 }, + "end": { "line": 263, "column": null } + }, + "93": { + "start": { "line": 265, "column": 1 }, + "end": { "line": 265, "column": null } + }, + "94": { + "start": { "line": 268, "column": 20 }, + "end": { "line": 280, "column": 1 } + }, + "95": { + "start": { "line": 269, "column": 1 }, + "end": { "line": 278, "column": null } + }, + "96": { + "start": { "line": 271, "column": 3 }, + "end": { "line": 271, "column": null } + }, + "97": { + "start": { "line": 273, "column": 3 }, + "end": { "line": 273, "column": null } + }, + "98": { + "start": { "line": 275, "column": 3 }, + "end": { "line": 277, "column": null } + }, + "99": { + "start": { "line": 276, "column": 4 }, + "end": { "line": 276, "column": null } + }, + "100": { + "start": { "line": 279, "column": 1 }, + "end": { "line": 279, "column": null } + }, + "101": { + "start": { "line": 282, "column": 29 }, + "end": { "line": 295, "column": 1 } + }, + "102": { + "start": { "line": 286, "column": 18 }, + "end": { "line": 286, "column": 24 } + }, + "103": { + "start": { "line": 287, "column": 21 }, + "end": { "line": 287, "column": 26 } + }, + "104": { + "start": { "line": 288, "column": 1 }, + "end": { "line": 293, "column": null } + }, + "105": { + "start": { "line": 289, "column": 2 }, + "end": { "line": 289, "column": null } + }, + "106": { + "start": { "line": 290, "column": 2 }, + "end": { "line": 292, "column": null } + }, + "107": { + "start": { "line": 291, "column": 3 }, + "end": { "line": 291, "column": null } + }, + "108": { + "start": { "line": 294, "column": 1 }, + "end": { "line": 294, "column": null } } }, "fnMap": { "0": { - "name": "(anonymous_0)", + "name": "(anonymous_6)", "decl": { - "start": { "line": 20, "column": 24 }, - "end": { "line": 20, "column": 27 } + "start": { "line": 40, "column": 2 }, + "end": { "line": 40, "column": 24 } }, "loc": { - "start": { "line": 20, "column": 29 }, - "end": { "line": 24, "column": 1 } + "start": { "line": 40, "column": 30 }, + "end": { "line": 44, "column": 2 } } }, "1": { - "name": "(anonymous_1)", + "name": "(anonymous_7)", + "decl": { + "start": { "line": 40, "column": 30 }, + "end": { "line": 40, "column": 34 } + }, + "loc": { + "start": { "line": 40, "column": 38 }, + "end": { "line": 44, "column": 2 } + } + }, + "2": { + "name": "(anonymous_8)", + "decl": { + "start": { "line": 41, "column": 38 }, + "end": { "line": 41, "column": 43 } + }, + "loc": { + "start": { "line": 41, "column": 43 }, + "end": { "line": 43, "column": 3 } + } + }, + "3": { + "name": "printTestNameIfRequested", + "decl": { + "start": { "line": 48, "column": 9 }, + "end": { "line": 48, "column": 33 } + }, + "loc": { + "start": { "line": 48, "column": 57 }, + "end": { "line": 66, "column": null } + } + }, + "4": { + "name": "fuzz", + "decl": { + "start": { "line": 68, "column": 16 }, + "end": { "line": 68, "column": 20 } + }, + "loc": { + "start": { "line": 75, "column": 19 }, + "end": { "line": 145, "column": null } + } + }, + "5": { + "name": "(anonymous_11)", + "decl": { + "start": { "line": 77, "column": 8 }, + "end": { "line": 77, "column": 9 } + }, + "loc": { + "start": { "line": 77, "column": 39 }, + "end": { "line": 144, "column": 2 } + } + }, + "6": { + "name": "(anonymous_12)", + "decl": { + "start": { "line": 120, "column": 27 }, + "end": { "line": 120, "column": 32 } + }, + "loc": { + "start": { "line": 120, "column": 32 }, + "end": { "line": 121, "column": null } + } + }, + "7": { + "name": "(anonymous_13)", + "decl": { + "start": { "line": 147, "column": 32 }, + "end": { "line": 147, "column": null } + }, + "loc": { + "start": { "line": 154, "column": 4 }, + "end": { "line": 166, "column": 1 } + } + }, + "8": { + "name": "(anonymous_14)", + "decl": { + "start": { "line": 155, "column": 38 }, + "end": { "line": 155, "column": 49 } + }, + "loc": { + "start": { "line": 155, "column": 49 }, + "end": { "line": 165, "column": 2 } + } + }, + "9": { + "name": "(anonymous_15)", + "decl": { + "start": { "line": 161, "column": 49 }, + "end": { "line": 161, "column": 50 } + }, + "loc": { + "start": { "line": 161, "column": 63 }, + "end": { "line": 164, "column": 3 } + } + }, + "10": { + "name": "(anonymous_16)", + "decl": { + "start": { "line": 168, "column": 35 }, + "end": { "line": 168, "column": null } + }, + "loc": { + "start": { "line": 175, "column": 4 }, + "end": { "line": 209, "column": 1 } + } + }, + "11": { + "name": "(anonymous_17)", "decl": { - "start": { "line": 21, "column": 27 }, - "end": { "line": 21, "column": 28 } + "start": { "line": 178, "column": 42 }, + "end": { "line": 178, "column": 47 } }, "loc": { - "start": { "line": 21, "column": 44 }, - "end": { "line": 23, "column": 2 } + "start": { "line": 178, "column": 47 }, + "end": { "line": 208, "column": 2 } + } + }, + "12": { + "name": "executeTarget", + "decl": { + "start": { "line": 179, "column": 11 }, + "end": { "line": 179, "column": 24 } + }, + "loc": { + "start": { "line": 179, "column": 40 }, + "end": { "line": 191, "column": null } + } + }, + "13": { + "name": "(anonymous_19)", + "decl": { + "start": { "line": 180, "column": 22 }, + "end": { "line": 180, "column": 23 } + }, + "loc": { + "start": { "line": 180, "column": 42 }, + "end": { "line": 190, "column": 4 } + } + }, + "14": { + "name": "(anonymous_20)", + "decl": { + "start": { "line": 187, "column": 12 }, + "end": { "line": 187, "column": 19 } + }, + "loc": { + "start": { "line": 187, "column": 19 }, + "end": { "line": 187, "column": 57 } + } + }, + "15": { + "name": "(anonymous_21)", + "decl": { + "start": { "line": 196, "column": 3 }, + "end": { "line": 196, "column": 15 } + }, + "loc": { + "start": { "line": 196, "column": 15 }, + "end": { "line": 196, "column": 45 } + } + }, + "16": { + "name": "(anonymous_22)", + "decl": { + "start": { "line": 201, "column": 31 }, + "end": { "line": 201, "column": 32 } + }, + "loc": { + "start": { "line": 201, "column": 48 }, + "end": { "line": 207, "column": 3 } + } + }, + "17": { + "name": "(anonymous_23)", + "decl": { + "start": { "line": 204, "column": 4 }, + "end": { "line": 204, "column": 16 } + }, + "loc": { + "start": { "line": 204, "column": 16 }, + "end": { "line": 204, "column": 63 } + } + }, + "18": { + "name": "(anonymous_24)", + "decl": { + "start": { "line": 211, "column": 28 }, + "end": { "line": 211, "column": null } + }, + "loc": { + "start": { "line": 216, "column": 4 }, + "end": { "line": 253, "column": 1 } + } + }, + "19": { + "name": "(anonymous_25)", + "decl": { + "start": { "line": 219, "column": 24 }, + "end": { "line": 219, "column": 35 } + }, + "loc": { + "start": { "line": 219, "column": 39 }, + "end": { "line": 236, "column": 3 } + } + }, + "20": { + "name": "handleMode", + "decl": { + "start": { "line": 255, "column": 9 }, + "end": { "line": 255, "column": 19 } + }, + "loc": { + "start": { "line": 257, "column": 44 }, + "end": { "line": 266, "column": null } + } + }, + "21": { + "name": "(anonymous_27)", + "decl": { + "start": { "line": 268, "column": 20 }, + "end": { "line": 268, "column": 45 } + }, + "loc": { + "start": { "line": 268, "column": 57 }, + "end": { "line": 280, "column": 1 } + } + }, + "22": { + "name": "(anonymous_28)", + "decl": { + "start": { "line": 282, "column": 29 }, + "end": { "line": 282, "column": null } + }, + "loc": { + "start": { "line": 285, "column": 14 }, + "end": { "line": 295, "column": 1 } } } }, - "branchMap": {}, + "branchMap": { + "0": { + "loc": { + "start": { "line": 50, "column": 1 }, + "end": { "line": 65, "column": null } + }, + "type": "if", + "locations": [ + { + "start": { "line": 50, "column": 1 }, + "end": { "line": 65, "column": null } + }, + { + "start": { "line": 50, "column": 1 }, + "end": { "line": 65, "column": null } + } + ] + }, + "1": { + "loc": { + "start": { "line": 51, "column": 2 }, + "end": { "line": 64, "column": null } + }, + "type": "if", + "locations": [ + { + "start": { "line": 51, "column": 2 }, + "end": { "line": 64, "column": null } + }, + { + "start": { "line": 51, "column": 2 }, + "end": { "line": 64, "column": null } + } + ] + }, + "2": { + "loc": { + "start": { "line": 52, "column": 3 }, + "end": { "line": 53, "column": 66 } + }, + "type": "binary-expr", + "locations": [ + { + "start": { "line": 52, "column": 3 }, + "end": { "line": 52, "column": 62 } + }, + { + "start": { "line": 53, "column": 3 }, + "end": { "line": 53, "column": 66 } + } + ] + }, + "3": { + "loc": { + "start": { "line": 55, "column": 3 }, + "end": { "line": 63, "column": null } + }, + "type": "if", + "locations": [ + { + "start": { "line": 55, "column": 3 }, + "end": { "line": 63, "column": null } + }, + { + "start": { "line": 58, "column": 10 }, + "end": { "line": 63, "column": null } + } + ] + }, + "4": { + "loc": { + "start": { "line": 56, "column": 31 }, + "end": { "line": 56, "column": 56 } + }, + "type": "binary-expr", + "locations": [ + { + "start": { "line": 56, "column": 31 }, + "end": { "line": 56, "column": 50 } + }, + { + "start": { "line": 56, "column": 54 }, + "end": { "line": 56, "column": 56 } + } + ] + }, + "5": { + "loc": { + "start": { "line": 58, "column": 10 }, + "end": { "line": 63, "column": null } + }, + "type": "if", + "locations": [ + { + "start": { "line": 58, "column": 10 }, + "end": { "line": 63, "column": null } + }, + { + "start": { "line": 61, "column": 10 }, + "end": { "line": 63, "column": null } + } + ] + }, + "6": { + "loc": { + "start": { "line": 82, "column": 2 }, + "end": { "line": 87, "column": null } + }, + "type": "if", + "locations": [ + { + "start": { "line": 82, "column": 2 }, + "end": { "line": 87, "column": null } + }, + { + "start": { "line": 82, "column": 2 }, + "end": { "line": 87, "column": null } + } + ] + }, + "7": { + "loc": { + "start": { "line": 91, "column": 2 }, + "end": { "line": 99, "column": null } + }, + "type": "if", + "locations": [ + { + "start": { "line": 91, "column": 2 }, + "end": { "line": 99, "column": null } + }, + { + "start": { "line": 93, "column": 9 }, + "end": { "line": 99, "column": null } + } + ] + }, + "8": { + "loc": { + "start": { "line": 93, "column": 9 }, + "end": { "line": 99, "column": null } + }, + "type": "if", + "locations": [ + { + "start": { "line": 93, "column": 9 }, + "end": { "line": 99, "column": null } + }, + { + "start": { "line": 95, "column": 9 }, + "end": { "line": 99, "column": null } + } + ] + }, + "9": { + "loc": { + "start": { "line": 95, "column": 9 }, + "end": { "line": 99, "column": null } + }, + "type": "if", + "locations": [ + { + "start": { "line": 95, "column": 9 }, + "end": { "line": 99, "column": null } + }, + { + "start": { "line": 95, "column": 9 }, + "end": { "line": 99, "column": null } + } + ] + }, + "10": { + "loc": { + "start": { "line": 104, "column": 2 }, + "end": { "line": 106, "column": null } + }, + "type": "if", + "locations": [ + { + "start": { "line": 104, "column": 2 }, + "end": { "line": 106, "column": null } + }, + { + "start": { "line": 104, "column": 2 }, + "end": { "line": 106, "column": null } + } + ] + }, + "11": { + "loc": { + "start": { "line": 116, "column": 3 }, + "end": { "line": 118, "column": 49 } + }, + "type": "binary-expr", + "locations": [ + { + "start": { "line": 116, "column": 3 }, + "end": { "line": 116, "column": 30 } + }, + { + "start": { "line": 117, "column": 3 }, + "end": { "line": 117, "column": 32 } + }, + { + "start": { "line": 118, "column": 3 }, + "end": { "line": 118, "column": 49 } + } + ] + }, + "12": { + "loc": { + "start": { "line": 119, "column": 2 }, + "end": { "line": 124, "column": null } + }, + "type": "if", + "locations": [ + { + "start": { "line": 119, "column": 2 }, + "end": { "line": 124, "column": null } + }, + { + "start": { "line": 119, "column": 2 }, + "end": { "line": 124, "column": null } + } + ] + }, + "13": { + "loc": { + "start": { "line": 137, "column": 2 }, + "end": { "line": 143, "column": null } + }, + "type": "if", + "locations": [ + { + "start": { "line": 137, "column": 2 }, + "end": { "line": 143, "column": null } + }, + { + "start": { "line": 139, "column": 9 }, + "end": { "line": 143, "column": null } + } + ] + }, + "14": { + "loc": { + "start": { "line": 139, "column": 9 }, + "end": { "line": 143, "column": null } + }, + "type": "if", + "locations": [ + { + "start": { "line": 139, "column": 9 }, + "end": { "line": 143, "column": null } + }, + { + "start": { "line": 141, "column": 9 }, + "end": { "line": 143, "column": null } + } + ] + }, + "15": { + "loc": { + "start": { "line": 163, "column": 3 }, + "end": { "line": 163, "column": null } + }, + "type": "if", + "locations": [ + { + "start": { "line": 163, "column": 3 }, + "end": { "line": 163, "column": null } + }, + { + "start": { "line": 163, "column": 3 }, + "end": { "line": 163, "column": null } + } + ] + }, + "16": { + "loc": { + "start": { "line": 182, "column": 4 }, + "end": { "line": 189, "column": null } + }, + "type": "if", + "locations": [ + { + "start": { "line": 182, "column": 4 }, + "end": { "line": 189, "column": null } + }, + { + "start": { "line": 184, "column": 11 }, + "end": { "line": 189, "column": null } + } + ] + }, + "17": { + "loc": { + "start": { "line": 220, "column": 3 }, + "end": { "line": 227, "column": null } + }, + "type": "if", + "locations": [ + { + "start": { "line": 220, "column": 3 }, + "end": { "line": 227, "column": null } + }, + { + "start": { "line": 220, "column": 3 }, + "end": { "line": 227, "column": null } + } + ] + }, + "18": { + "loc": { + "start": { "line": 230, "column": 3 }, + "end": { "line": 234, "column": null } + }, + "type": "if", + "locations": [ + { + "start": { "line": 230, "column": 3 }, + "end": { "line": 234, "column": null } + }, + { + "start": { "line": 232, "column": 10 }, + "end": { "line": 234, "column": null } + } + ] + }, + "19": { + "loc": { + "start": { "line": 235, "column": 3 }, + "end": { "line": 235, "column": 45 } + }, + "type": "cond-expr", + "locations": [ + { + "start": { "line": 235, "column": 11 }, + "end": { "line": 235, "column": 24 } + }, + { + "start": { "line": 235, "column": 27 }, + "end": { "line": 235, "column": 45 } + } + ] + }, + "20": { + "loc": { + "start": { "line": 243, "column": 2 }, + "end": { "line": 249, "column": null } + }, + "type": "if", + "locations": [ + { + "start": { "line": 243, "column": 2 }, + "end": { "line": 249, "column": null } + }, + { + "start": { "line": 243, "column": 2 }, + "end": { "line": 249, "column": null } + } + ] + }, + "21": { + "loc": { + "start": { "line": 243, "column": 6 }, + "end": { "line": 243, "column": 49 } + }, + "type": "binary-expr", + "locations": [ + { + "start": { "line": 243, "column": 6 }, + "end": { "line": 243, "column": 12 } + }, + { + "start": { "line": 243, "column": 16 }, + "end": { "line": 243, "column": 49 } + } + ] + }, + "22": { + "loc": { + "start": { "line": 259, "column": 1 }, + "end": { "line": 264, "column": null } + }, + "type": "switch", + "locations": [ + { + "start": { "line": 260, "column": 2 }, + "end": { "line": 261, "column": null } + }, + { + "start": { "line": 262, "column": 2 }, + "end": { "line": 263, "column": null } + } + ] + }, + "23": { + "loc": { + "start": { "line": 269, "column": 1 }, + "end": { "line": 278, "column": null } + }, + "type": "switch", + "locations": [ + { + "start": { "line": 270, "column": 2 }, + "end": { "line": 271, "column": null } + }, + { + "start": { "line": 272, "column": 2 }, + "end": { "line": 273, "column": null } + }, + { + "start": { "line": 274, "column": 2 }, + "end": { "line": 277, "column": null } + } + ] + }, + "24": { + "loc": { + "start": { "line": 275, "column": 3 }, + "end": { "line": 277, "column": null } + }, + "type": "if", + "locations": [ + { + "start": { "line": 275, "column": 3 }, + "end": { "line": 277, "column": null } + }, + { + "start": { "line": 275, "column": 3 }, + "end": { "line": 277, "column": null } + } + ] + }, + "25": { + "loc": { + "start": { "line": 290, "column": 2 }, + "end": { "line": 292, "column": null } + }, + "type": "if", + "locations": [ + { + "start": { "line": 290, "column": 2 }, + "end": { "line": 292, "column": null } + }, + { + "start": { "line": 290, "column": 2 }, + "end": { "line": 292, "column": null } + } + ] + } + }, "s": { "0": 1, "1": 1, "2": 1, "3": 1, - "4": 3 + "4": 1, + "5": 1, + "6": 0, + "7": 0, + "8": 0, + "9": 1, + "10": 0, + "11": 0, + "12": 0, + "13": 0, + "14": 0, + "15": 0, + "16": 0, + "17": 0, + "18": 0, + "19": 0, + "20": 0, + "21": 0, + "22": 0, + "23": 0, + "24": 0, + "25": 0, + "26": 0, + "27": 0, + "28": 0, + "29": 0, + "30": 0, + "31": 0, + "32": 0, + "33": 0, + "34": 0, + "35": 0, + "36": 0, + "37": 0, + "38": 0, + "39": 0, + "40": 0, + "41": 0, + "42": 0, + "43": 0, + "44": 0, + "45": 0, + "46": 0, + "47": 0, + "48": 0, + "49": 1, + "50": 1, + "51": 0, + "52": 0, + "53": 0, + "54": 0, + "55": 0, + "56": 0, + "57": 0, + "58": 0, + "59": 0, + "60": 1, + "61": 1, + "62": 0, + "63": 0, + "64": 0, + "65": 0, + "66": 0, + "67": 0, + "68": 0, + "69": 0, + "70": 0, + "71": 0, + "72": 0, + "73": 0, + "74": 1, + "75": 1, + "76": 0, + "77": 0, + "78": 0, + "79": 0, + "80": 0, + "81": 0, + "82": 0, + "83": 0, + "84": 0, + "85": 0, + "86": 0, + "87": 0, + "88": 0, + "89": 0, + "90": 0, + "91": 0, + "92": 0, + "93": 0, + "94": 1, + "95": 0, + "96": 0, + "97": 0, + "98": 0, + "99": 0, + "100": 0, + "101": 1, + "102": 0, + "103": 0, + "104": 0, + "105": 0, + "106": 0, + "107": 0, + "108": 0 }, "f": { - "0": 1, - "1": 3 + "0": 0, + "1": 0, + "2": 0, + "3": 0, + "4": 0, + "5": 0, + "6": 0, + "7": 0, + "8": 0, + "9": 0, + "10": 0, + "11": 0, + "12": 0, + "13": 0, + "14": 0, + "15": 0, + "16": 0, + "17": 0, + "18": 0, + "19": 0, + "20": 0, + "21": 0, + "22": 0 }, - "b": {} + "b": { + "0": [0, 0], + "1": [0, 0], + "2": [0, 0], + "3": [0, 0], + "4": [0, 0], + "5": [0, 0], + "6": [0, 0], + "7": [0, 0], + "8": [0, 0], + "9": [0, 0], + "10": [0, 0], + "11": [0, 0, 0], + "12": [0, 0], + "13": [0, 0], + "14": [0, 0], + "15": [0, 0], + "16": [0, 0], + "17": [0, 0], + "18": [0, 0], + "19": [0, 0], + "20": [0, 0], + "21": [0, 0], + "22": [0, 0], + "23": [0, 0, 0], + "24": [0, 0], + "25": [0, 0] + } }, "fuzz.js": { + "path": "/home/peter/Documents/Programming/jazzer.js/tests/code_coverage/sample_fuzz_test/fuzz.js", "statementMap": { "0": { - "start": { "line": 17, "column": 12 }, - "end": { "line": 17, "column": 28 } + "start": { "line": 3, "column": 12 }, + "end": { "line": 3, "column": 28 } }, "1": { - "start": { "line": 22, "column": 0 }, - "end": { "line": 28, "column": 2 } + "start": { "line": 8, "column": 0 }, + "end": { "line": 14, "column": 2 } }, "2": { - "start": { "line": 23, "column": 1 }, - "end": { "line": 23, "column": 41 } + "start": { "line": 9, "column": 1 }, + "end": { "line": 9, "column": 41 } }, "3": { - "start": { "line": 24, "column": 1 }, - "end": { "line": 26, "column": 2 } + "start": { "line": 10, "column": 1 }, + "end": { "line": 12, "column": 2 } }, "4": { - "start": { "line": 25, "column": 2 }, - "end": { "line": 25, "column": 9 } + "start": { "line": 11, "column": 2 }, + "end": { "line": 11, "column": 9 } }, "5": { - "start": { "line": 27, "column": 1 }, - "end": { "line": 27, "column": 18 } + "start": { "line": 13, "column": 1 }, + "end": { "line": 13, "column": 18 } } }, "fnMap": { "0": { "name": "(anonymous_0)", "decl": { - "start": { "line": 22, "column": 22 }, - "end": { "line": 22, "column": 23 } + "start": { "line": 8, "column": 22 }, + "end": { "line": 8, "column": 23 } }, "loc": { - "start": { "line": 22, "column": 38 }, - "end": { "line": 28, "column": 1 } + "start": { "line": 8, "column": 38 }, + "end": { "line": 14, "column": 1 } }, - "line": 22 + "line": 8 } }, "branchMap": { "0": { "loc": { - "start": { "line": 24, "column": 1 }, - "end": { "line": 26, "column": 2 } + "start": { "line": 10, "column": 1 }, + "end": { "line": 12, "column": 2 } }, "type": "if", "locations": [ { - "start": { "line": 24, "column": 1 }, - "end": { "line": 26, "column": 2 } + "start": { "line": 10, "column": 1 }, + "end": { "line": 12, "column": 2 } }, { - "start": { "line": 24, "column": 1 }, - "end": { "line": 26, "column": 2 } + "start": { "line": 10, "column": 1 }, + "end": { "line": 12, "column": 2 } } ], - "line": 24 + "line": 10 } }, "s": { "0": 1, "1": 1, "2": 3, "3": 3, "4": 2, "5": 1 }, "f": { "0": 3 }, "b": { "0": [2, 1] }, + "inputSourceMap": null, "_coverageSchema": "1a1c01bbd47fc00a2c39e90264f33305004495a9", - "hash": "d5b411e8de7efcd2798a7cd78efd7bd8347f647a" + "hash": "919965dfc96b474e5bb4bd686708056c565cd2df" }, "lib.js": { + "path": "/home/peter/Documents/Programming/jazzer.js/tests/code_coverage/sample_fuzz_test/lib.js", "statementMap": { "0": { - "start": { "line": 18, "column": 1 }, - "end": { "line": 18, "column": 29 } + "start": { "line": 4, "column": 1 }, + "end": { "line": 4, "column": 29 } }, "1": { - "start": { "line": 19, "column": 1 }, - "end": { "line": 21, "column": 2 } + "start": { "line": 5, "column": 1 }, + "end": { "line": 7, "column": 2 } }, "2": { - "start": { "line": 20, "column": 2 }, - "end": { "line": 20, "column": 11 } + "start": { "line": 6, "column": 2 }, + "end": { "line": 6, "column": 11 } }, "3": { - "start": { "line": 22, "column": 1 }, - "end": { "line": 22, "column": 11 } + "start": { "line": 8, "column": 1 }, + "end": { "line": 8, "column": 11 } }, "4": { - "start": { "line": 25, "column": 0 }, - "end": { "line": 27, "column": 2 } + "start": { "line": 11, "column": 0 }, + "end": { "line": 13, "column": 2 } } }, "fnMap": { "0": { "name": "foo", "decl": { - "start": { "line": 17, "column": 9 }, - "end": { "line": 17, "column": 12 } + "start": { "line": 3, "column": 9 }, + "end": { "line": 3, "column": 12 } }, "loc": { - "start": { "line": 17, "column": 16 }, - "end": { "line": 23, "column": 1 } + "start": { "line": 3, "column": 16 }, + "end": { "line": 9, "column": 1 } }, - "line": 17 + "line": 3 } }, "branchMap": { "0": { "loc": { - "start": { "line": 19, "column": 1 }, - "end": { "line": 21, "column": 2 } + "start": { "line": 5, "column": 1 }, + "end": { "line": 7, "column": 2 } }, "type": "if", "locations": [ { - "start": { "line": 19, "column": 1 }, - "end": { "line": 21, "column": 2 } + "start": { "line": 5, "column": 1 }, + "end": { "line": 7, "column": 2 } }, { - "start": { "line": 19, "column": 1 }, - "end": { "line": 21, "column": 2 } + "start": { "line": 5, "column": 1 }, + "end": { "line": 7, "column": 2 } } ], - "line": 19 + "line": 5 } }, "s": { "0": 1, "1": 1, "2": 1, "3": 0, "4": 1 }, "f": { "0": 1 }, "b": { "0": [1, 0] }, + "inputSourceMap": null, "_coverageSchema": "1a1c01bbd47fc00a2c39e90264f33305004495a9", - "hash": "9606a42b6e4a5e9a5c23554dda63403d86a4a9a2" + "hash": "fcd40034890333ddc0be68a932be368882a3d10b" + }, + "otherCodeCoverage.fuzz.ts": { + "path": "/home/peter/Documents/Programming/jazzer.js/tests/code_coverage/sample_fuzz_test/otherCodeCoverage.fuzz.ts", + "statementMap": { + "0": { + "start": { "line": 3, "column": 0 }, + "end": { "line": 3, "column": 32 } + }, + "1": { + "start": { "line": 4, "column": 0 }, + "end": { "line": 4, "column": 33 } + }, + "2": { + "start": { "line": 6, "column": 0 }, + "end": { "line": 10, "column": 3 } + }, + "3": { + "start": { "line": 7, "column": 1 }, + "end": { "line": 9, "column": 4 } + }, + "4": { + "start": { "line": 8, "column": 2 }, + "end": { "line": 8, "column": 13 } + } + }, + "fnMap": { + "0": { + "name": "(anonymous_0)", + "decl": { + "start": { "line": 6, "column": 24 }, + "end": { "line": 6, "column": 27 } + }, + "loc": { + "start": { "line": 6, "column": 29 }, + "end": { "line": 10, "column": 1 } + } + }, + "1": { + "name": "(anonymous_1)", + "decl": { + "start": { "line": 7, "column": 27 }, + "end": { "line": 7, "column": 28 } + }, + "loc": { + "start": { "line": 7, "column": 44 }, + "end": { "line": 9, "column": 2 } + } + } + }, + "branchMap": {}, + "s": { "0": 1, "1": 1, "2": 1, "3": 1, "4": 3 }, + "f": { "0": 1, "1": 3 }, + "b": {} } } diff --git a/tests/code_coverage/sample_fuzz_test/expected_coverage/fuzz+lib.json b/tests/code_coverage/sample_fuzz_test/expected_coverage/fuzz+lib.json index 888a25782..b5b4c5f41 100644 --- a/tests/code_coverage/sample_fuzz_test/expected_coverage/fuzz+lib.json +++ b/tests/code_coverage/sample_fuzz_test/expected_coverage/fuzz+lib.json @@ -1,126 +1,128 @@ { "fuzz.js": { + "path": "/home/peter/Documents/Programming/jazzer.js/tests/code_coverage/sample_fuzz_test/fuzz.js", "statementMap": { "0": { - "start": { "line": 17, "column": 12 }, - "end": { "line": 17, "column": 28 } + "start": { "line": 3, "column": 12 }, + "end": { "line": 3, "column": 28 } }, "1": { - "start": { "line": 22, "column": 0 }, - "end": { "line": 28, "column": 2 } + "start": { "line": 8, "column": 0 }, + "end": { "line": 14, "column": 2 } }, "2": { - "start": { "line": 23, "column": 1 }, - "end": { "line": 23, "column": 41 } + "start": { "line": 9, "column": 1 }, + "end": { "line": 9, "column": 41 } }, "3": { - "start": { "line": 24, "column": 1 }, - "end": { "line": 26, "column": 2 } + "start": { "line": 10, "column": 1 }, + "end": { "line": 12, "column": 2 } }, "4": { - "start": { "line": 25, "column": 2 }, - "end": { "line": 25, "column": 9 } + "start": { "line": 11, "column": 2 }, + "end": { "line": 11, "column": 9 } }, "5": { - "start": { "line": 27, "column": 1 }, - "end": { "line": 27, "column": 18 } + "start": { "line": 13, "column": 1 }, + "end": { "line": 13, "column": 18 } } }, "fnMap": { "0": { "name": "(anonymous_0)", "decl": { - "start": { "line": 22, "column": 22 }, - "end": { "line": 22, "column": 23 } + "start": { "line": 8, "column": 22 }, + "end": { "line": 8, "column": 23 } }, "loc": { - "start": { "line": 22, "column": 38 }, - "end": { "line": 28, "column": 1 } + "start": { "line": 8, "column": 38 }, + "end": { "line": 14, "column": 1 } }, - "line": 22 + "line": 8 } }, "branchMap": { "0": { "loc": { - "start": { "line": 24, "column": 1 }, - "end": { "line": 26, "column": 2 } + "start": { "line": 10, "column": 1 }, + "end": { "line": 12, "column": 2 } }, "type": "if", "locations": [ { - "start": { "line": 24, "column": 1 }, - "end": { "line": 26, "column": 2 } + "start": { "line": 10, "column": 1 }, + "end": { "line": 12, "column": 2 } }, { "start": {}, "end": {} } ], - "line": 24 + "line": 10 } }, "s": { "0": 1, "1": 1, "2": 3, "3": 3, "4": 2, "5": 1 }, "f": { "0": 3 }, "b": { "0": [2, 1] }, "_coverageSchema": "1a1c01bbd47fc00a2c39e90264f33305004495a9", - "hash": "d5b411e8de7efcd2798a7cd78efd7bd8347f647a" + "hash": "5d5860b26158df2154cfe4eb4255dc6534ccfff1" }, "lib.js": { + "path": "/home/peter/Documents/Programming/jazzer.js/tests/code_coverage/sample_fuzz_test/lib.js", "statementMap": { "0": { - "start": { "line": 18, "column": 1 }, - "end": { "line": 18, "column": 29 } + "start": { "line": 4, "column": 1 }, + "end": { "line": 4, "column": 29 } }, "1": { - "start": { "line": 19, "column": 1 }, - "end": { "line": 21, "column": 2 } + "start": { "line": 5, "column": 1 }, + "end": { "line": 7, "column": 2 } }, "2": { - "start": { "line": 20, "column": 2 }, - "end": { "line": 20, "column": 11 } + "start": { "line": 6, "column": 2 }, + "end": { "line": 6, "column": 11 } }, "3": { - "start": { "line": 22, "column": 1 }, - "end": { "line": 22, "column": 11 } + "start": { "line": 8, "column": 1 }, + "end": { "line": 8, "column": 11 } }, "4": { - "start": { "line": 25, "column": 0 }, - "end": { "line": 27, "column": 2 } + "start": { "line": 11, "column": 0 }, + "end": { "line": 13, "column": 2 } } }, "fnMap": { "0": { "name": "foo", "decl": { - "start": { "line": 17, "column": 9 }, - "end": { "line": 17, "column": 12 } + "start": { "line": 3, "column": 9 }, + "end": { "line": 3, "column": 12 } }, "loc": { - "start": { "line": 17, "column": 16 }, - "end": { "line": 23, "column": 1 } + "start": { "line": 3, "column": 16 }, + "end": { "line": 9, "column": 1 } }, - "line": 17 + "line": 3 } }, "branchMap": { "0": { "loc": { - "start": { "line": 19, "column": 1 }, - "end": { "line": 21, "column": 2 } + "start": { "line": 5, "column": 1 }, + "end": { "line": 7, "column": 2 } }, "type": "if", "locations": [ { - "start": { "line": 19, "column": 1 }, - "end": { "line": 21, "column": 2 } + "start": { "line": 5, "column": 1 }, + "end": { "line": 7, "column": 2 } }, { "start": {}, "end": {} } ], - "line": 19 + "line": 5 } }, "s": { "0": 1, "1": 1, "2": 1, "3": 0, "4": 1 }, "f": { "0": 1 }, "b": { "0": [1, 0] }, "_coverageSchema": "1a1c01bbd47fc00a2c39e90264f33305004495a9", - "hash": "9606a42b6e4a5e9a5c23554dda63403d86a4a9a2" + "hash": "2c8e6fbf7fbf1d3facf8b6f7aeed0de7b31a4877" } } diff --git a/tests/code_coverage/sample_fuzz_test/fuzz.js b/tests/code_coverage/sample_fuzz_test/fuzz.js index 3d2bed16b..496b34196 100644 --- a/tests/code_coverage/sample_fuzz_test/fuzz.js +++ b/tests/code_coverage/sample_fuzz_test/fuzz.js @@ -1,18 +1,4 @@ -/* - * Copyright 2023 Code Intelligence GmbH - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ +/* eslint-disable header/header */ const lib = require("./lib"); diff --git a/tests/code_coverage/sample_fuzz_test/lib.js b/tests/code_coverage/sample_fuzz_test/lib.js index 6d460de6c..a044628a4 100644 --- a/tests/code_coverage/sample_fuzz_test/lib.js +++ b/tests/code_coverage/sample_fuzz_test/lib.js @@ -1,18 +1,4 @@ -/* - * Copyright 2023 Code Intelligence GmbH - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ +/* eslint-disable header/header */ function foo(a) { console.log("original foo"); diff --git a/tests/code_coverage/sample_fuzz_test/otherCodeCoverage.fuzz.ts b/tests/code_coverage/sample_fuzz_test/otherCodeCoverage.fuzz.ts index b66031d32..d91287db3 100644 --- a/tests/code_coverage/sample_fuzz_test/otherCodeCoverage.fuzz.ts +++ b/tests/code_coverage/sample_fuzz_test/otherCodeCoverage.fuzz.ts @@ -1,18 +1,4 @@ -/* - * Copyright 2023 Code Intelligence GmbH - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ +/* eslint-disable header/header */ import "@jazzer.js/jest-runner"; import { fuzz } from "./fuzz.js"; diff --git a/tests/done_callback/fuzz.js b/tests/done_callback/fuzz.js index b18543fa6..5685c76d2 100644 --- a/tests/done_callback/fuzz.js +++ b/tests/done_callback/fuzz.js @@ -1,5 +1,5 @@ /* - * Copyright 2023 Code Intelligence GmbH + * Copyright 2026 Code Intelligence GmbH * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/tests/done_callback/package.json b/tests/done_callback/package.json index ab270334d..0d54782fb 100644 --- a/tests/done_callback/package.json +++ b/tests/done_callback/package.json @@ -3,7 +3,7 @@ "version": "1.0.0", "description": "An example showing how Jazzer.js handles callback based fuzz targets", "scripts": { - "fuzz": "jazzer fuzz -x Error -- -runs=5000 -seed=2386907168", + "fuzz": "jazzer fuzz --disableBugDetectors='.*' -x Error -- -runs=5000 -seed=2386907168", "dryRun": "jazzer fuzz -- -runs=100 -seed=123456789" }, "devDependencies": { diff --git a/tests/fork_mode/fuzz.js b/tests/fork_mode/fuzz.js index c093faeb6..939a5425c 100644 --- a/tests/fork_mode/fuzz.js +++ b/tests/fork_mode/fuzz.js @@ -1,5 +1,5 @@ /* - * Copyright 2023 Code Intelligence GmbH + * Copyright 2026 Code Intelligence GmbH * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/tests/fork_mode/package.json b/tests/fork_mode/package.json index 7b6b2cd26..f04ed1d4b 100644 --- a/tests/fork_mode/package.json +++ b/tests/fork_mode/package.json @@ -3,7 +3,7 @@ "version": "1.0.0", "description": "An example showing how to use libFuzzer's fork mode in Jazzer.js", "scripts": { - "fuzz": "jazzer fuzz --sync -- -fork=3", + "fuzz": "jazzer fuzz --sync --disableBugDetectors='.*' -- -fork=3", "dryRun": "jazzer fuzz --sync -- -fork=3 -runs=100 -seed=123456789" }, "devDependencies": { diff --git a/tests/helpers.js b/tests/helpers.js index 9a1b5b1f1..8ca16ac41 100644 --- a/tests/helpers.js +++ b/tests/helpers.js @@ -1,5 +1,5 @@ /* - * Copyright 2023 Code Intelligence GmbH + * Copyright 2026 Code Intelligence GmbH * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -15,7 +15,7 @@ */ const assert = require("assert"); -const { spawnSync } = require("child_process"); +const { spawnSync, spawn } = require("child_process"); const fs = require("fs"); const path = require("path"); @@ -76,16 +76,27 @@ class FuzzTest { this.timeout = timeout; } + // Runs the fuzz test in another process using `spawnSync`. execute() { if (this.jestTestFile) { - this.executeWithJest(); + this.#executeWithJest(); } else { - this.executeWithCli(); + this.#executeWithCli(); } return this; } - executeWithCli() { + // Runs the fuzz test using `spawn`. This is useful when we want to do something while the fuzz test + // is running (e.g. process http requests). + executeWithPromise() { + if (this.jestTestFile) { + return this.#executeWithJest(false); + } else { + return this.#executeWithCli(false); + } + } + + #executeWithCli(useSpawnSync = true) { const options = ["jazzer", this.fuzzFile]; options.push("-f " + this.fuzzEntryPoint); if (this.sync) options.push("--sync"); @@ -115,10 +126,14 @@ class FuzzTest { for (const dictionary of this.dictionaries) { options.push("-dict=" + dictionary); } - this.runTest("npx", options, { ...process.env }); + if (useSpawnSync) { + this.#spawnTestSync("npx", options, { ...process.env }); + } else { + return this.#spawnTest("npx", options, { ...process.env }); + } } - executeWithJest() { + #executeWithJest(useSpawnSync = true) { const fuzzerOptions = []; if (this.runs) { fuzzerOptions.push("-runs=" + this.runs); @@ -186,10 +201,14 @@ class FuzzTest { env.JAZZER_LIST_FUZZTEST_NAMES_PATTERN = this.listFuzzTestNamesPattern; } - this.runTest(cmd, options, env); + if (useSpawnSync) { + this.#spawnTestSync(cmd, options, env); + } else { + return this.#spawnTest(cmd, options, env); + } } - runTest(cmd, options, env) { + #spawnTestSync(cmd, options, env) { if (this.logTestOutput) { console.log("COMMAND: " + cmd + " " + options.join(" ")); } @@ -212,6 +231,45 @@ class FuzzTest { throw new Error(this.status.toString()); } } + + #spawnTest(cmd, options, env) { + return new Promise((resolve, reject) => { + if (this.logTestOutput) { + console.log("COMMAND: " + cmd + " " + options.join(" ")); + } + const proc = spawn(cmd, options, { + stdio: "pipe", + cwd: this.dir, + shell: true, + windowsHide: true, + env: env, + }); + this.stdout = ""; + this.stderr = ""; + proc.stdout.on("data", (data) => { + this.stdout += data; + }); + + proc.stderr.on("data", (data) => { + this.stderr += data; + }); + + // wait for process to finish + proc.on("exit", () => { + this.status = proc.exitCode.toString(); + if (this.logTestOutput) { + console.log("STDOUT: " + this.stdout); + console.log("STDERR: " + this.stderr); + console.log("STATUS: " + this.status); + } + if (this.status !== "0") { + reject(new Error(this.status.toString())); + } else { + resolve(this.status.toString()); + } + }); + }); + } } // noinspection JSUnusedGlobalSymbols diff --git a/tests/jest_integration/integration.test.js b/tests/jest_integration/integration.test.js index 8d5a26431..0564eb070 100644 --- a/tests/jest_integration/integration.test.js +++ b/tests/jest_integration/integration.test.js @@ -1,5 +1,5 @@ /* - * Copyright 2023 Code Intelligence GmbH + * Copyright 2026 Code Intelligence GmbH * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -37,7 +37,7 @@ describe("Jest integration", () => { beforeEach(() => { fuzzTestBuilder = new FuzzTestBuilder() .dir(projectDir) - .runs(1_000_000) + .disableBugDetectors([".*"]) .jestRunInFuzzingMode(true) .jestTestFile(jestTestFile + ".js"); }); @@ -107,6 +107,17 @@ describe("Jest integration", () => { }); describe("timeout", () => { + it("execute sync timeout test", async () => { + const fuzzTest = fuzzTestBuilder + .jestTestName("execute sync timeout test plain") + .build(); + expect(() => { + fuzzTest.execute(); + }).toThrow(TimeoutExitCode); + assertTimeoutMessageLogged(fuzzTest, 5); + await expectCrashFileIn("execute_sync_timeout_test_plain"); + }); + it("execute async timeout test", async () => { const fuzzTest = fuzzTestBuilder .jestTestName("execute async timeout test plain") @@ -221,11 +232,35 @@ describe("Jest integration", () => { expect(fuzzTest.stdout).toContain("standard test called"); }); }); + + describe("Per-fuzztest dictionary entries", () => { + it("with dictionary", async () => { + const fuzzTest = fuzzTestBuilder + .jestTestName("execute sync hashed fuzz test with dictionary") + .build(); + expect(() => { + fuzzTest.execute(); + }).toThrow(JestRegressionExitCode); + expect(fuzzTest.stderr).toContain("Welcome to Amazing Fuzzing!"); + }); + + it("with uint8 dictionary", async () => { + const fuzzTest = fuzzTestBuilder + .logTestOutput() + .jestTestName("execute sync hashed fuzz test with uint8 dictionary") + .build(); + expect(() => { + fuzzTest.execute(); + }).toThrow(JestRegressionExitCode); + expect(fuzzTest.stderr).toContain("Welcome to Amazing Fuzzing!"); + }); + }); }); describe("Regression mode", () => { const regressionTestBuilder = new FuzzTestBuilder() .dir(projectDir) + .disableBugDetectors([".*"]) .jestTestFile(jestTestFile + ".js"); describe("execute", () => { @@ -335,7 +370,11 @@ describe("Jest integration", () => { const stackFrames = firstFailureMessage(result) .split("\n") .filter((line) => line.startsWith(" at")); - expect(stackFrames).toHaveLength(10); + // TODO: understand why the stack trace contains one more frame when all bug detectors are enabled. + // missing stack frame before last: + // ' at processTicksAndRejections (node:internal/process/task_queues:96:5)\n' + + expect(stackFrames.length).toBeLessThanOrEqual(11); + expect(stackFrames.length).toBeGreaterThanOrEqual(10); }); it("prioritize finding over error", () => { @@ -379,6 +418,7 @@ describe("Jest integration", () => { const listFuzzTestNamesTestBuilder = new FuzzTestBuilder() .dir(projectDir) .listFuzzTestNames() + .disableBugDetectors([".*"]) .jestTestFile(jestTestFile + ".js"); it("lists fuzz tests", () => { @@ -450,6 +490,7 @@ describe("Jest TS integration", () => { fuzzTestBuilder = new FuzzTestBuilder() .dir(projectDir) .runs(1_000_000) + .disableBugDetectors([".*"]) .jestRunInFuzzingMode(true) .jestTestFile(jestTsTestFile + ".ts"); }); @@ -495,10 +536,41 @@ describe("Jest TS integration", () => { await expectCrashFileIn("execute_async_test_using_a_callback"); }); }); + + describe("Fuzz test options support", () => { + it("with dictionary", async () => { + const fuzzTest = fuzzTestBuilder + .jestTestName("execute sync hashed fuzz test with dictionary") + .build(); + expect(() => { + fuzzTest.execute(); + }).toThrow(JestRegressionExitCode); + expect(fuzzTest.stderr).toContain("Welcome to Amazing Fuzzing!"); + }); + + it("with sync and runs", () => { + const fuzzTest = fuzzTestBuilder + .verbose() + .runs(1) // will get changed to 101 by the fuzz test + .sync(false) // will get changed to true by the fuzz test + .jestTestName( + "Further options sync, number of runs, dictionary is Amazing", + ) + .build(); + fuzzTest.execute(); + // The options are printed with colors. Here "sync: true," is matched. + expect(fuzzTest.stderr).toContain("sync: { value: true,"); + expect(fuzzTest.stderr).toContain( + "dictionaryEntries: { value: [ 'Amazing' ]", + ); + expect(fuzzTest.stdout).toContain("i = 100"); + }); + }); }); describe("Regression mode", () => { const regressionTestBuilder = new FuzzTestBuilder() + .disableBugDetectors([".*"]) .dir(projectDir) .jestTestFile(jestTsTestFile + ".ts"); diff --git a/tests/jest_integration/jest_project/integration.fuzz.js b/tests/jest_integration/jest_project/integration.fuzz.js index eea7766f3..79bd17b71 100644 --- a/tests/jest_integration/jest_project/integration.fuzz.js +++ b/tests/jest_integration/jest_project/integration.fuzz.js @@ -1,5 +1,5 @@ /* - * Copyright 2023 Code Intelligence GmbH + * Copyright 2026 Code Intelligence GmbH * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -37,6 +37,29 @@ describe("Jest Integration", () => { target.fuzzMe(data); }); + it.fuzz( + "execute sync hashed fuzz test with dictionary", + (data) => { + target.fuzzMeHashed(data); + }, + { dictionaryEntries: ["Amazing"] }, + ); + + it.fuzz( + "execute sync hashed fuzz test with uint8 dictionary", + (data) => { + target.fuzzMeHashed(data); + }, + { + dictionaryEntries: [ + new Uint8Array([0x41, 0x6d, 0x61, 0x7a, 0x69, 0x6e, 0x67]), + // Adding an entry with all bytes to the dictionary should not affect the fuzzing. + // This tests if escaping all 256 characters works in a way that libFuzzer is happy with it. + new Uint8Array([...Array(256).keys()]), + ], + }, + ); + it.fuzz("execute async test", async (data) => { await target.asyncFuzzMe(data); }); @@ -53,6 +76,10 @@ describe("Jest Integration", () => { await target.asyncTimeout(data); }); + it.fuzz("execute sync timeout test plain", (data) => { + target.syncTimeout(data); + }); + it.fuzz( "execute async timeout test with method timeout", async (data) => { diff --git a/tests/jest_integration/jest_project/run-mode-only.fuzz.js b/tests/jest_integration/jest_project/run-mode-only.fuzz.js index af7ab7d21..9d7543593 100644 --- a/tests/jest_integration/jest_project/run-mode-only.fuzz.js +++ b/tests/jest_integration/jest_project/run-mode-only.fuzz.js @@ -1,5 +1,5 @@ /* - * Copyright 2023 Code Intelligence GmbH + * Copyright 2026 Code Intelligence GmbH * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/tests/jest_integration/jest_project/target.js b/tests/jest_integration/jest_project/target.js index 00a4968ad..54557836d 100644 --- a/tests/jest_integration/jest_project/target.js +++ b/tests/jest_integration/jest_project/target.js @@ -1,5 +1,5 @@ /* - * Copyright 2023 Code Intelligence GmbH + * Copyright 2026 Code Intelligence GmbH * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -14,6 +14,8 @@ * limitations under the License. */ +const crypto = require("crypto"); + const fuzzMe = (data) => { if (data.toString() === "Awe") { throw Error("Welcome to Awesome Fuzzing!"); @@ -21,6 +23,26 @@ const fuzzMe = (data) => { }; module.exports.fuzzMe = fuzzMe; +const fuzzMeHashed = function (data) { + const s = data.toString(); + if (s.length !== 7) { + return; + } + + const sha = crypto.createHash("sha512").update(s); + const result = sha.digest("hex"); + + // Hash of "Amazing" + if ( + result === + "79328e1e1272ff2890ff0c6e8181a52ce5960ae7703b00f9f094edd7dbd198210129b2bb307e8cd34d689d101e4d685f1259e42af7ce252944ca46aecca60752" + ) { + throw Error("Welcome to Amazing Fuzzing!"); + } +}; + +module.exports.fuzzMeHashed = fuzzMeHashed; + module.exports.asyncFuzzMe = (data) => new Promise((resolve, reject) => { try { @@ -52,6 +74,13 @@ module.exports.asyncTimeout = (data) => // Never resolve this promise to provoke a timeout. }); +module.exports.syncTimeout = (data) => { + // eslint-disable-next-line no-constant-condition + while (true) { + /* empty */ + } +}; + // noinspection JSUnusedLocalSymbols module.exports.callbackTimeout = (data, done) => { // Never call done to provoke a timeout. diff --git a/tests/jest_integration/jest_project_ts/integration.fuzz.ts b/tests/jest_integration/jest_project_ts/integration.fuzz.ts index 20a437ac4..a5fd9fead 100644 --- a/tests/jest_integration/jest_project_ts/integration.fuzz.ts +++ b/tests/jest_integration/jest_project_ts/integration.fuzz.ts @@ -1,5 +1,5 @@ /* - * Copyright 2023 Code Intelligence GmbH + * Copyright 2026 Code Intelligence GmbH * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -37,4 +37,32 @@ describe("Jest TS Integration", () => { target.callbackFuzzMe(data, done); }, ); + + it.fuzz( + "execute sync hashed fuzz test with dictionary", + (data: Buffer) => { + target.fuzzMeHashed(data); + }, + { + dictionaryEntries: ["Amazing"], + }, + ); + + describe("Further options", () => { + let i = 0; + it.fuzz( + "sync, number of runs, dictionary is Amazing", + (data: Buffer) => { + if (i === 100) { + console.log("i = " + i); + } + i++; + }, + { + sync: true, + fuzzerOptions: ["-runs=101"], + dictionaryEntries: ["Amazing"], + }, + ); + }); }); diff --git a/tests/jest_integration/jest_project_ts/jest.config.ts b/tests/jest_integration/jest_project_ts/jest.config.ts index f27e0e8c0..74edadb12 100644 --- a/tests/jest_integration/jest_project_ts/jest.config.ts +++ b/tests/jest_integration/jest_project_ts/jest.config.ts @@ -1,5 +1,5 @@ /* - * Copyright 2023 Code Intelligence GmbH + * Copyright 2026 Code Intelligence GmbH * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/tests/jest_integration/jest_project_ts/target.ts b/tests/jest_integration/jest_project_ts/target.ts index c561148cb..a6f9bc622 100644 --- a/tests/jest_integration/jest_project_ts/target.ts +++ b/tests/jest_integration/jest_project_ts/target.ts @@ -1,5 +1,5 @@ /* - * Copyright 2023 Code Intelligence GmbH + * Copyright 2026 Code Intelligence GmbH * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -14,6 +14,8 @@ * limitations under the License. */ +import * as crypto from "crypto"; + export function fuzzMe(data: Buffer) { if (typeof data === "object") { if (data.toString() === "Awesome") { @@ -54,3 +56,21 @@ export async function asyncFuzzMe(data: Buffer) { }); }); } + +export function fuzzMeHashed(data: Buffer) { + const s = data.toString(); + if (s.length !== 7) { + return; + } + + const sha = crypto.createHash("sha512").update(s); + const result = sha.digest("hex"); + + // Hash of "Amazing" + if ( + result === + "79328e1e1272ff2890ff0c6e8181a52ce5960ae7703b00f9f094edd7dbd198210129b2bb307e8cd34d689d101e4d685f1259e42af7ce252944ca46aecca60752" + ) { + throw Error("Welcome to Amazing Fuzzing!"); + } +} diff --git a/tests/promise/fuzz.js b/tests/promise/fuzz.js index 015f4574d..62fb53f95 100644 --- a/tests/promise/fuzz.js +++ b/tests/promise/fuzz.js @@ -1,5 +1,5 @@ /* - * Copyright 2023 Code Intelligence GmbH + * Copyright 2026 Code Intelligence GmbH * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/tests/promise/package.json b/tests/promise/package.json index 5fdb3f90e..0ec55ccc3 100644 --- a/tests/promise/package.json +++ b/tests/promise/package.json @@ -3,7 +3,7 @@ "version": "1.0.0", "description": "An example showing how Jazzer.js handles promise based fuzz targets", "scripts": { - "fuzz": "jazzer fuzz --fuzz_function fuzz_promise -x Error -- -runs=5000 -seed=3088388356", + "fuzz": "jazzer fuzz --fuzz_function fuzz_promise --disableBugDetectors='.*' -x Error -- -runs=5000 -seed=3088388356", "dryRun": "jazzer fuzz --fuzz_function fuzz_promise -- -runs=1 -seed=123456789" }, "devDependencies": { diff --git a/tests/return_values/asyncRunnerAsyncReturns/fuzz.js b/tests/return_values/asyncRunnerAsyncReturns/fuzz.js index fc65797af..e0fd7da4f 100644 --- a/tests/return_values/asyncRunnerAsyncReturns/fuzz.js +++ b/tests/return_values/asyncRunnerAsyncReturns/fuzz.js @@ -1,5 +1,5 @@ /* - * Copyright 2023 Code Intelligence GmbH + * Copyright 2026 Code Intelligence GmbH * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/tests/return_values/asyncRunnerMixedReturns/fuzz.js b/tests/return_values/asyncRunnerMixedReturns/fuzz.js index 5302c5f70..918bdbf09 100644 --- a/tests/return_values/asyncRunnerMixedReturns/fuzz.js +++ b/tests/return_values/asyncRunnerMixedReturns/fuzz.js @@ -1,5 +1,5 @@ /* - * Copyright 2023 Code Intelligence GmbH + * Copyright 2026 Code Intelligence GmbH * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/tests/return_values/asyncRunnerSyncReturns/fuzz.js b/tests/return_values/asyncRunnerSyncReturns/fuzz.js index 9dec24391..911c140a6 100644 --- a/tests/return_values/asyncRunnerSyncReturns/fuzz.js +++ b/tests/return_values/asyncRunnerSyncReturns/fuzz.js @@ -1,5 +1,5 @@ /* - * Copyright 2023 Code Intelligence GmbH + * Copyright 2026 Code Intelligence GmbH * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/tests/return_values/exampleCode/code.js b/tests/return_values/exampleCode/code.js index c9b2298de..5b6f2a9bb 100644 --- a/tests/return_values/exampleCode/code.js +++ b/tests/return_values/exampleCode/code.js @@ -1,5 +1,5 @@ /* - * Copyright 2023 Code Intelligence GmbH + * Copyright 2026 Code Intelligence GmbH * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/tests/return_values/package.json b/tests/return_values/package.json index 10e621595..612bb4743 100644 --- a/tests/return_values/package.json +++ b/tests/return_values/package.json @@ -3,7 +3,8 @@ "version": "1.0.0", "description": "Unit tests for detection of sync and async behavior.", "scripts": { - "fuzz": "jest" + "fuzz": "jest", + "test": "jest" }, "devDependencies": { "@jazzer.js/core": "file:../../packages/core/" diff --git a/tests/return_values/return_values.test.js b/tests/return_values/return_values.test.js index 91c0304a8..7476f1919 100644 --- a/tests/return_values/return_values.test.js +++ b/tests/return_values/return_values.test.js @@ -1,5 +1,5 @@ /* - * Copyright 2023 Code Intelligence GmbH + * Copyright 2026 Code Intelligence GmbH * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -66,6 +66,7 @@ describe("Execute a async runner", () => { function executeFuzzTest(sync, verbose, dir) { const fuzzTest = new FuzzTestBuilder() .fuzzEntryPoint("fuzz") + .disableBugDetectors([".*"]) .runs(5000) .dir(dir) .sync(sync) diff --git a/tests/return_values/syncRunnerAsyncReturns/fuzz.js b/tests/return_values/syncRunnerAsyncReturns/fuzz.js index fc65797af..e0fd7da4f 100644 --- a/tests/return_values/syncRunnerAsyncReturns/fuzz.js +++ b/tests/return_values/syncRunnerAsyncReturns/fuzz.js @@ -1,5 +1,5 @@ /* - * Copyright 2023 Code Intelligence GmbH + * Copyright 2026 Code Intelligence GmbH * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/tests/return_values/syncRunnerMixedReturns/fuzz.js b/tests/return_values/syncRunnerMixedReturns/fuzz.js index 5302c5f70..918bdbf09 100644 --- a/tests/return_values/syncRunnerMixedReturns/fuzz.js +++ b/tests/return_values/syncRunnerMixedReturns/fuzz.js @@ -1,5 +1,5 @@ /* - * Copyright 2023 Code Intelligence GmbH + * Copyright 2026 Code Intelligence GmbH * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/tests/return_values/syncRunnerSyncReturns/fuzz.js b/tests/return_values/syncRunnerSyncReturns/fuzz.js index 9dec24391..911c140a6 100644 --- a/tests/return_values/syncRunnerSyncReturns/fuzz.js +++ b/tests/return_values/syncRunnerSyncReturns/fuzz.js @@ -1,5 +1,5 @@ /* - * Copyright 2023 Code Intelligence GmbH + * Copyright 2026 Code Intelligence GmbH * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/tests/signal_handlers/SIGINT/fuzz.js b/tests/signal_handlers/SIGINT/fuzz.js index d91ab76b2..e833d71cb 100644 --- a/tests/signal_handlers/SIGINT/fuzz.js +++ b/tests/signal_handlers/SIGINT/fuzz.js @@ -1,5 +1,5 @@ /* - * Copyright 2023 Code Intelligence GmbH + * Copyright 2026 Code Intelligence GmbH * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -27,7 +27,20 @@ module.exports.SIGINT_SYNC = (data) => { i++; }; -module.exports.SIGINT_ASYNC = (data) => { +module.exports.SIGINT_SYNC_endless_loop = (data) => { + // eslint-disable-next-line no-constant-condition + while (true) { + if (i === 1000 || i === 1001) { + process.kill(process.pid, "SIGINT"); + } + if (i > 1001) { + console.error("Signal has not stopped the fuzzing process"); + } + i++; + } +}; + +module.exports.SIGINT_ASYNC = async (data) => { // Raising SIGINT in async mode does not stop the fuzzer directly, // as the event is handled asynchronously in the event loop. if (i === 1000) { @@ -36,3 +49,16 @@ module.exports.SIGINT_ASYNC = (data) => { } i++; }; + +module.exports.SIGINT_ASYNC_endless_loop = async (data) => { + // eslint-disable-next-line no-constant-condition + while (true) { + if (i === 1000 || i === 1001) { + process.kill(process.pid, "SIGINT"); + } + if (i > 1001) { + console.error("Signal has not stopped the fuzzing process"); + } + i++; + } +}; diff --git a/tests/signal_handlers/SIGINT/tests.fuzz.js b/tests/signal_handlers/SIGINT/tests.fuzz.js index 51e7bad17..f9a51faad 100644 --- a/tests/signal_handlers/SIGINT/tests.fuzz.js +++ b/tests/signal_handlers/SIGINT/tests.fuzz.js @@ -1,5 +1,5 @@ /* - * Copyright 2023 Code Intelligence GmbH + * Copyright 2026 Code Intelligence GmbH * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -14,9 +14,11 @@ * limitations under the License. */ -const { SIGINT_SYNC, SIGINT_ASYNC } = require("./fuzz.js"); +const fuzz = require("./fuzz.js"); describe("Jest", () => { - it.fuzz("Sync", SIGINT_SYNC); - it.fuzz("Async", SIGINT_ASYNC); + it.fuzz("Sync", fuzz.SIGINT_SYNC); + it.fuzz("Sync endless loop", fuzz.SIGINT_SYNC_endless_loop); + it.fuzz("Async", fuzz.SIGINT_ASYNC); + it.fuzz("Async endless loop", fuzz.SIGINT_ASYNC_endless_loop); }); diff --git a/tests/signal_handlers/SIGSEGV/fuzz.js b/tests/signal_handlers/SIGSEGV/fuzz.js index b85077aff..470aea3b9 100644 --- a/tests/signal_handlers/SIGSEGV/fuzz.js +++ b/tests/signal_handlers/SIGSEGV/fuzz.js @@ -1,5 +1,5 @@ /* - * Copyright 2023 Code Intelligence GmbH + * Copyright 2026 Code Intelligence GmbH * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/tests/signal_handlers/SIGSEGV/tests.fuzz.js b/tests/signal_handlers/SIGSEGV/tests.fuzz.js index 8072c3bc8..65be81513 100644 --- a/tests/signal_handlers/SIGSEGV/tests.fuzz.js +++ b/tests/signal_handlers/SIGSEGV/tests.fuzz.js @@ -1,5 +1,5 @@ /* - * Copyright 2023 Code Intelligence GmbH + * Copyright 2026 Code Intelligence GmbH * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/tests/signal_handlers/native-signal/index.ts b/tests/signal_handlers/native-signal/index.ts index 361343525..564d7b247 100644 --- a/tests/signal_handlers/native-signal/index.ts +++ b/tests/signal_handlers/native-signal/index.ts @@ -1,5 +1,5 @@ /* - * Copyright 2023 Code Intelligence GmbH + * Copyright 2026 Code Intelligence GmbH * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/tests/signal_handlers/signal_handlers.test.js b/tests/signal_handlers/signal_handlers.test.js index 2f780ff38..950d4cc7d 100644 --- a/tests/signal_handlers/signal_handlers.test.js +++ b/tests/signal_handlers/signal_handlers.test.js @@ -1,5 +1,5 @@ /* - * Copyright 2023 Code Intelligence GmbH + * Copyright 2026 Code Intelligence GmbH * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -35,6 +35,7 @@ describe("SIGINT handlers", () => { const testProjectDir = path.join(__dirname, "SIGINT"); fuzzTestBuilder = new FuzzTestBuilder() .runs(20000) + .disableBugDetectors([".*"]) .dir(testProjectDir) .coverage(true) .verbose(true); @@ -58,6 +59,26 @@ describe("SIGINT handlers", () => { fuzzTest.execute(); expectSigintOutput(fuzzTest); }); + it("stop sync fuzzing on SIGINT in endless loop", async () => { + const fuzzTest = fuzzTestBuilder + .sync(true) + .timeout(5000) + .fuzzEntryPoint("SIGINT_SYNC_endless_loop") + .build(); + fuzzTest.execute(); + expectNoCrashFileLogged(fuzzTest); + expectFuzzingStopped(fuzzTest); + }); + it("stop async fuzzing on SIGINT in endless loop", async () => { + const fuzzTest = fuzzTestBuilder + .sync(false) + .timeout(5000) + .fuzzEntryPoint("SIGINT_ASYNC_endless_loop") + .build(); + fuzzTest.execute(); + expectNoCrashFileLogged(fuzzTest); + expectFuzzingStopped(fuzzTest); + }); }); describe("in Jest fuzzing mode", () => { @@ -79,6 +100,26 @@ describe("SIGINT handlers", () => { fuzzTest.execute(); expectSigintOutput(fuzzTest); }); + it("stop sync endless loop fuzzing on SIGINT", () => { + const fuzzTest = fuzzTestBuilder + .jestTestFile("tests.fuzz.js") + .jestTestName("^Jest Sync endless loop$") + .jestRunInFuzzingMode(true) + .build(); + fuzzTest.execute(); + expectNoCrashFileLogged(fuzzTest); + expectFuzzingStopped(fuzzTest); + }); + it("stop async endless loop fuzzing on SIGINT", () => { + const fuzzTest = fuzzTestBuilder + .jestTestFile("tests.fuzz.js") + .jestTestName("^Jest Async endless loop$") + .jestRunInFuzzingMode(true) + .build(); + fuzzTest.execute(); + expectNoCrashFileLogged(fuzzTest); + expectFuzzingStopped(fuzzTest); + }); }); }); @@ -90,6 +131,7 @@ describe("SIGSEGV handlers", () => { const testProjectDir = path.join(__dirname, "SIGSEGV"); fuzzTestBuilder = new FuzzTestBuilder() .runs(20000) + .disableBugDetectors([".*"]) .dir(testProjectDir) .coverage(true); await cleanCrashFilesIn(testProjectDir); diff --git a/tests/string_compare/fuzz.js b/tests/string_compare/fuzz.js index ef579cfaa..f92ec89ba 100644 --- a/tests/string_compare/fuzz.js +++ b/tests/string_compare/fuzz.js @@ -1,5 +1,5 @@ /* - * Copyright 2023 Code Intelligence GmbH + * Copyright 2026 Code Intelligence GmbH * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/tests/string_compare/package.json b/tests/string_compare/package.json index 7053fe53c..76b5fbd16 100644 --- a/tests/string_compare/package.json +++ b/tests/string_compare/package.json @@ -3,7 +3,7 @@ "version": "1.0.0", "description": "An example showing how Jazzer.js handles string comparisons in the code", "scripts": { - "fuzz": "jazzer fuzz --sync -x Error -- -runs=5000000 -seed=111994470", + "fuzz": "jazzer fuzz --sync --disableBugDetectors='.*' -x Error -- -runs=5000000 -seed=111994470", "dryRun": "jazzer fuzz --sync -- -runs=100 -seed=123456789" }, "devDependencies": { diff --git a/tests/switch/package.json b/tests/switch/package.json deleted file mode 100644 index 478208a45..000000000 --- a/tests/switch/package.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "name": "jazzerjs-switch-example", - "version": "1.0.0", - "description": "An example showing how Jazzer.js handles switch statements", - "scripts": { - "fuzz": "jazzer fuzz --sync -x Error -- -runs=2000000 -seed=1148448756", - "dryRun": "jazzer fuzz --sync -- -runs=100 -seed=123456789" - }, - "devDependencies": { - "@jazzer.js/core": "file:../../packages/core" - } -} diff --git a/tests/timeout/fuzz.js b/tests/timeout/fuzz.js index 19a33fe80..8d63b52bd 100644 --- a/tests/timeout/fuzz.js +++ b/tests/timeout/fuzz.js @@ -1,5 +1,5 @@ /* - * Copyright 2023 Code Intelligence GmbH + * Copyright 2026 Code Intelligence GmbH * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/tests/timeout/package.json b/tests/timeout/package.json index d17add0ab..f35a9da32 100644 --- a/tests/timeout/package.json +++ b/tests/timeout/package.json @@ -3,7 +3,7 @@ "version": "1.0.0", "description": "Timeout test: checking that the handler for the SIGALRM signal does not return with error code.", "scripts": { - "timeout": "jazzer fuzz -f=timeout --timeout=1000 -- -runs=5000 -seed=1234", + "timeout": "jazzer fuzz -f=timeout --timeout=1000 --disableBugDetectors='.*' -- -runs=5000 -seed=1234", "fuzz": "jazzer fuzz --timeout=1000 -- -runs=5000 -seed=1234", "dryRun": "echo \"skipped\"" }, diff --git a/tests/value_profiling/fuzz.js b/tests/value_profiling/fuzz.js index 1f430eb97..29ed21682 100644 --- a/tests/value_profiling/fuzz.js +++ b/tests/value_profiling/fuzz.js @@ -1,5 +1,5 @@ /* - * Copyright 2023 Code Intelligence GmbH + * Copyright 2026 Code Intelligence GmbH * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/tests/value_profiling/package.json b/tests/value_profiling/package.json index 34f8290e1..38b5e9ca9 100644 --- a/tests/value_profiling/package.json +++ b/tests/value_profiling/package.json @@ -3,7 +3,7 @@ "version": "1.0.0", "description": "An example showing how Jazzer.js handles integer comparisons in the code", "scripts": { - "fuzz": "jazzer fuzz --sync -x Error -- -runs=4000000 -seed=1428686921 -use_value_profile=1", + "fuzz": "jazzer fuzz --sync --disableBugDetectors='.*' -x Error -- -runs=4000000 -seed=1428686921 -use_value_profile=1", "dryRun": "jazzer fuzz --sync -- -use_value_profile=1 -runs=100 -seed=123456789" }, "devDependencies": {